Private messaging without an account.
Sotto is an end-to-end encrypted messenger for Android. No phone number, no email, no account, no ads. Your identity is generated on the device and never leaves it.
Android 7.0+ (minSdk 24) arm64-v8a · 40.1 MB v1.0.0
Current release: Android only. iOS and desktop builds are not published. There is no public Google Play listing yet; an internal test track exists only for invited testers.
CHANGE_ME in the release config block
at the top of this file. Every GitHub link on this page is dead until it is set.
Verify the file before you install it
SHA-256 of app-arm64-v8a-release.apk:
Signing certificate:
Every build we publish is signed with the same certificate, so this value does not change between versions. A repackaged APK cannot carry it.
Download and install
Three ways to get the app. They all end at the same signed package; they differ only in how much setup they ask of you. You only need one.
A. GitHub Releases no account needed
-
Open the releases page on the phone.
Tap the download button above, or type
github.com/…/releases.
Download
app-arm64-v8a-release.apk(nearly every phone made since 2017). If the install fails with “not compatible”, your phone is 32-bit: useapp-armeabi-v7a-release.apkinstead. Thex86_64build is only for Android emulators. -
Allow this one app to install packages.
Android blocks installs from browsers and file managers by default. Find
the switch for the app you downloaded with:
Phone Where the switch is Stock Android 12+
Pixel, Motorola, NokiaSettings → Apps → Special app access → Install unknown apps → choose your browser or Files app → Allow from this source. Samsung
One UI 6 / 7Settings → Security and privacy → turn Auto Blocker off. If the install is still blocked: Settings → Apps → Special access → Install unknown apps → your browser → allow. Xiaomi
HyperOS / MIUISettings → Privacy protection → Special permissions → Install unknown apps → your browser → allow. Also turn off Pure Mode (Settings → Privacy protection → Pure mode) and approve the installer’s own “risk scan” prompt if it appears. Huawei
EMUI 12 / 13Settings → Security → More settings → Install apps from external sources → your browser → allow. Honor
MagicOSSettings → Security → More security settings → Install unknown apps → your browser → allow. OPPO / realme
ColorOSSettings → Apps → Special app access → Install unknown apps → your browser → allow. A separate “Security scan” prompt may appear at install time; it is the system scanner, not Sotto. OnePlus
OxygenOSSettings → Apps → Special app access → Install unknown apps → your browser → allow. vivo / iQOO
OriginOS / FuntouchSettings → More settings → Permission manager → Install unknown apps → your browser → allow. HarmonyOS NEXT
(5.x and later)Not possible: HarmonyOS NEXT does not run Android APKs. Only the Android-based EMUI builds can install Sotto. Menu names move between ROM versions. If a path does not match, search Settings for “install unknown”. After installing, you can turn the switch back off; it is not needed for updates either, as long as you install the next APK from the same app.
- Tap the downloaded file, then Install → Open. If the phone warns that the file came from an unknown source, that is the switch you just enabled. If it warns about a “harmful app”, check the signature as described in path C before deciding.
- Create your identity on first launch. Write the 12-word recovery phrase on paper and keep it offline. There is no password reset and no account recovery; losing the phrase means losing access to that identity.
B. Google Play internal test invitation only
The Play listing is not public. This path only works if the maintainer has added your Google account to the test list. It is the simplest path for people who do not want to enable sideloading.
- Send the maintainer the Google account email you use on the phone. Not your recovery address — the exact account signed in to the Play Store app.
- Check that the phone is signed in to that account. Play Store → tap your profile picture → confirm the email. A different account is the single most common reason the test link says “app not available”.
- Open the opt-in link on the phone. It looks like play.google.com/apps/internaltest/…. Tap Become a tester, then Download it on Google Play.
- Install, then open the app from the Play Store or app drawer. Future updates arrive through Play like any other app while you stay on the test track.
Google limits an internal test track to a set number of testers, and the maintainer can remove you at any time. Being on the track means Google knows that this account installed Sotto; it does not give Sotto your identity, because the app still creates its keys on the device. The Play build and the APK are signed with the same certificate, so you can move between them without uninstalling.
The test track is not open yet: playOptInUrl is empty in the
release config. Until it is filled in, only path A works.
C. Check the file after downloading any path
A published hash only helps if you compare it. Two independent things are worth checking: the file hash (this exact build) and the signing certificate (this publisher, across all builds).
On a computer, before copying the file to the phone
# macOS / Linux
shasum -a 256 app-arm64-v8a-release.apk
# Windows PowerShell
Get-FileHash .\app-arm64-v8a-release.apk -Algorithm SHA256
Compare the 64 characters with the hash printed at the top of this page. Case does not matter. One wrong character means the file is not the one we built: delete it and download again, preferably on a different network.
The signature, from a computer
# Android SDK build-tools (apksigner), any OS
apksigner verify --print-certs app-arm64-v8a-release.apk
# The line "Signer #1 certificate SHA-256 digest" must equal:
# DD:72:BC:31:36:83:62:86:04:DF:68:A9:68:6C:29:F1:9B:E7:E3:0C:F1:BC:49:60:5A:6E:22:47:7F:FC:70:8D
Without a computer
Install an APK inspector from the Play Store (any app that shows “APK
signature” or “certificate fingerprint”), open the downloaded file with it,
and compare the SHA-256 certificate digest with the value above. Names differ
between apps; what matters is that the app shows a certificate digest
beginning with DD:72:BC:31. Do not compare the APK’s own SHA-256
with the certificate digest — they are different values and will never match.
What this check cannot do: if someone replaced both this page and the file,
the page’s own hash would match the replacement. The certificate fingerprint
is the stronger value because it is also published in the repository’s
README.md and in every release note; if two independent places
disagree, stop and ask.
Updating later: install the new APK over the old one. You do not need to uninstall, and your local history stays. Uninstalling first deletes the encrypted database on the device.
What Sotto does not do
- It is not audited. The protocol implementation is independent and has not had a third-party security audit. Tests passing is not an audit.
- iOS and desktop are not released. There is no App Store build.
- There is no push service. With the app killed, a notification can take up to about 15 minutes. Messages are not guaranteed to arrive.
- Message history does not sync across devices. Restoring the same recovery phrase on a new device does not bring old messages with it.
- The relay sees metadata: which account posted, when, and roughly how large the ciphertext is. It does not see message content, group names, or member lists.
- This is not anonymity. It removes the phone number and the account, not network-level observation.
- No post-quantum protection yet. PQXDH is not implemented.
- Group trust is TOFU (trust on first use). A member’s keys are trusted the first time they are seen.
- Large-group fan-out is model-tested, not load-tested. The 200,000-member figure comes from the fan-out model, not a live concurrency test.
- Attachments are limited. Chunked file storage and self-sync slots have no automatic TTL on the relay side; the privacy policy states this plainly.
If any of the above is a blocker for your group, do not migrate yet. The install and migration guide says when not to switch.
不需要账号的私密通信。
Sotto 是一款面向 Android 的端到端加密通信应用。不需要手机号、邮箱或账号,没有广告。 身份在本机生成,永不离开设备。
Android 7.0+(minSdk 24) arm64-v8a · 40.1 MB v1.0.0
当前仅发布 Android 版本。iOS 与桌面端未发布。Google Play 还没有公开商店页面, 只有面向受邀测试者的内部测试轨道。
CHANGE_ME。
在改成真实账号之前,页面上所有 GitHub 链接都是断的。
安装前先校验文件
app-arm64-v8a-release.apk 的 SHA-256:
签名证书:
我们发布的每个版本都由同一张证书签名,所以这个值不会随版本变化。 重新打包的 APK 带不上这个指纹。
下载与安装
三条路,终点是同一个签名包,差别只在于需要你动手多少。任选一条即可。
A. GitHub Releases 不需要账号
-
在手机上打开 Releases 页面。
点上面的下载按钮,或手动输入
github.com/…/releases。
下载
app-arm64-v8a-release.apk(2017 年以后绝大多数手机都适用)。 如果安装时提示“不兼容”,说明你的手机是 32 位,改用app-armeabi-v7a-release.apk。x86_64那个包只给 安卓模拟器用。 -
允许你用来下载的那个应用安装软件。
Android 默认禁止浏览器和文件管理器装包,开关位置随厂商不同:
机型 / 系统 开关在哪里 原生 Android 12+
Pixel、摩托罗拉、诺基亚设置 → 应用 → 特殊应用权限 → 安装未知应用 → 选择你的浏览器或「文件」 → 允许来自此来源。 三星
One UI 6 / 7设置 → 安全与隐私 → 关闭 自动拦截器(Auto Blocker)。 若仍被拦截:设置 → 应用 → 特殊访问权限 → 安装未知应用 → 你的浏览器 → 允许。 小米
HyperOS / MIUI设置 → 隐私保护 → 特殊权限设置 → 安装未知应用 → 你的浏览器 → 允许。 还要关闭纯净模式(设置 → 隐私保护 → 纯净模式),并在安装器弹出 “风险扫描”提示时确认继续。 华为
EMUI 12 / 13设置 → 安全 → 更多安全设置 → 外部来源应用下载 → 你的浏览器 → 允许。 荣耀
MagicOS设置 → 安全 → 更多安全设置 → 安装未知应用 → 你的浏览器 → 允许。 OPPO / realme
ColorOS设置 → 应用 → 特殊应用权限 → 安装未知应用 → 你的浏览器 → 允许。 安装时可能另有一次「安全扫描」提示,那是系统扫描器,不是 Sotto。 一加
OxygenOS设置 → 应用 → 特殊应用权限 → 安装未知应用 → 你的浏览器 → 允许。 vivo / iQOO
OriginOS / Funtouch设置 → 更多设置 → 权限管理 → 安装未知应用 → 你的浏览器 → 允许。 HarmonyOS NEXT
(5.x 及以后)装不了:HarmonyOS NEXT 不运行 Android APK。只有基于 Android 的 EMUI 版本能安装 Sotto。 各家 ROM 的菜单叫法会随版本改。找不到就在「设置」里搜“安装未知”。 装完之后可以把开关关回去;以后从同一个应用安装新版 APK 也不需要它常开。
- 点开下载好的文件,安装 → 打开。 如果系统提示“来源未知”,那就是你刚开的开关。如果提示“有害应用”,先按下面 C 路径核对签名再决定。
- 首次启动时创建身份。 把 12 个助记词抄在纸上,离线保管。没有密码找回,也没有账号恢复; 助记词丢了就等于这个身份丢了。
B. Google Play 内部测试 仅限受邀
Play 商店页面还没公开。这条路只有维护者把你的 Google 账号加进测试名单后才有效, 但它是给不想开「未知来源」的人最省事的一条。
- 把你手机上登录的那个 Google 账号邮箱发给维护者。 不是备用邮箱,是 Play 商店里实际登录的账号。
- 确认手机登录的就是这个账号。 Play 商店 → 点头像 → 核对邮箱。测试链接显示“应用不可用”最常见的原因, 就是手机上换成了另一个账号。
- 在手机上打开测试邀请链接。 形如 play.google.com/apps/internaltest/…。 点成为测试人员,再点在 Google Play 上下载。
- 安装,然后从 Play 商店或桌面图标打开。 只要你还在测试轨道里,后续更新会像普通应用一样由 Play 推送。
内部测试轨道有测试人数上限,维护者也随时可以把你移出。加入轨道意味着 Google 知道这个账号装了 Sotto;但 Sotto 拿不到你的身份,因为密钥仍然只在设备上生成。 Play 包和 APK 由同一张证书签名,两边可以互相覆盖升级,不需要卸载。
测试轨道还没开:发布配置里的 playOptInUrl 是空的。
在填上之前,只有 A 路径可用。
C. 下载后核对文件 任何一条路都适用
公布的哈希只有在你真的比对时才有用。值得核对的有两件事:文件哈希(对应这一次构建) 和签名证书(对应这个发布者,跨所有版本)。
有电脑:传到手机之前先算
# macOS / Linux
shasum -a 256 app-arm64-v8a-release.apk
# Windows PowerShell
Get-FileHash .\app-arm64-v8a-release.apk -Algorithm SHA256
把 64 个字符与页面顶部那个哈希逐字比对,大小写不影响结果。错一个字符就说明这不是 我们构建的那个文件:删掉,换个网络重新下载。
有电脑:核对签名
# 需要 Android SDK build-tools(apksigner),各系统通用
apksigner verify --print-certs app-arm64-v8a-release.apk
# 输出里的 "Signer #1 certificate SHA-256 digest" 必须等于:
# DD:72:BC:31:36:83:62:86:04:DF:68:A9:68:6C:29:F1:9B:E7:E3:0C:F1:BC:49:60:5A:6E:22:47:7F:FC:70:8D
没有电脑
在 Play 商店装一个 APK 检查工具(凡是能显示“签名”或“证书指纹”的都行),用它打开
下载好的文件,比对 SHA-256 证书指纹。各工具用词不同,你要看的是证书指纹,
它以 DD:72:BC:31 开头。不要把 APK 文件自身的 SHA-256 与证书指纹比较,
这是两个不同的值,永远不会相等。
这一步做不到什么:如果有人把本页和文件一起换掉,页面上的哈希也会跟着对上。
证书指纹是更强的凭据,因为仓库的 README.md 和每个版本的 release notes
里也公布了它;两个独立来源对不上时,停下来问,不要装。
以后升级:直接用新 APK 覆盖安装,不需要卸载,本机聊天记录会保留。 先卸载再装会把设备上的加密数据库一起删掉。
Sotto 做不到什么
- 未经过第三方审计。协议是独立实现,测试全绿不等于安全审计。
- iOS 与桌面端未发布。没有 App Store 版本。
- 没有推送服务。进程被杀后,通知最坏约 15 分钟。消息不保证必达。
- 消息历史不跨设备同步。在新设备用同一助记词恢复,不会带过来旧消息。
- 中继能看到元数据:哪个账号在什么时候发了一条大约多大的密文。 看不到正文、群名与成员名单。
- 这不是匿名。去掉了手机号和账号,不等于抵御网络层观察。
- 尚无抗量子保护。PQXDH 未实现。
- 群组信任是 TOFU(首次见到即信任)。
- 大群扇出只是模型验证,不是并发压测。20 万成员是扇出模型数字。
- 附件能力有限。分块文件存储与自同步槽在中继侧没有自动 TTL, 隐私政策已如实写明。
如果上面任何一条对你的群是硬阻塞,先不要迁移。安装与迁移说明里专门写了「什么时候不该搬」。