download solstone for android
this is the signed app, from us, on our own server. it is not in the Play Store, so android treats it as an app from a source it does not recognize, and there are two things you have to allow, then an ordinary install confirm. all three are below. if you would rather check the file yourself before you run it, that takes a computer and it is further down this page.
version 2.1.0 · 23.00 MB · for android 8.0 and later
in beta. solstone for android is early. it does what is on this page and not more, and it changes between versions. it does not update itself: what you install stays at that version until you come back here and install a newer one.
what you will be asked
the quoted words below are android's own, taken off a samsung galaxy running android 16. phone makers change this wording, so yours may say it a little differently. the two things you allow are the same on every android since 8.0.
-
your browser will warn you about the file. Chrome says:
File might be harmfulDo you want to download "solstone-android-2.1.0.apk" (23.00 MB) from updates.solstone.app anyway?
this is what a browser says about any app file it did not get from a store. check the address it names is
updates.solstone.app, then choose to download anyway. - android will ask whether the app you opened the file from may install apps. open the downloaded file and you get: Permission requiredFor your security, your phone currently isn't allowed to install unknown apps from this source. You can change this in Settings. the dialog names whatever you opened the file from, which is why this permission is worth understanding: it is granted to one app at a time. downloaded on the phone, that is your browser. copied across from a computer, it is your file manager instead, and the screen says so. tap settings, then turn on allow permission on the install unknown apps screen, then come back and open the file again. allowing one app allows that app and nothing else, and you can turn it off again afterwards.
- then the installer asks once more, and that is the last question. Install this app?solstone it installs. the app itself then asks for nothing until you turn something on. the one thing that can still appear is Play Protect, next.
Play Protect
if your phone has Google Play services, Play Protect scans the file while it installs. on the phone we tested, it scanned and the install went through with nothing more to answer. if it does stop to ask whether to send the app for scanning, or warns you about an app from an unknown developer, that is Play Protect not recognizing us yet rather than a finding about the file.
phones without Google Play services
on a de-googled phone there is no Play Protect step, because there is nothing there to run it. the install unknown apps permission in step 2 is android's own and still applies: it is part of android, not part of Google Play. we have not tested this on grapheneos, so we are not going to describe screens we have not seen. if you run one and something on this page is wrong for it, tell us and we will fix the page.
check the file is ours
you do not have to take our word for what you downloaded. there are two things to check, and they check different things: the digest says you got the bytes we published, and the signing certificate says we are the ones who built them.
this takes a computer — download the file there, check it, then copy it to the phone and install it from your file manager. and it is worth doing before the first install rather than after: from then on, android will only accept updates signed by the same key as the copy you already have. that is a real protection and it is the reason to look closely at the first one, because it is the copy every later one gets measured against.
the digest
fetch the checksum we publish beside the file, and let your machine do the comparing rather than your eyes:
curl -fLO https://updates.solstone.app/solstone-android/release/2.1.0/SHA256SUMS
sha256sum -c SHA256SUMS
on a mac, shasum -a 256 -c SHA256SUMS. either of those prints OK and exits zero, or says plainly that it did not match and exits non-zero. on windows, Get-FileHash solstone-android-2.1.0.apk -Algorithm SHA256 in PowerShell prints the digest as uppercase hex and leaves the comparing to you, against the value below.
e1a8dc023a85c099e051fdee1c2cf0d291fb75c540191f4c7d96a3c985e06fcd
we publish it beside the file, at updates.solstone.app/solstone-android/release/2.1.0/SHA256SUMS.
the signing certificate
every release we publish is signed by one key. its certificate fingerprint is:
12:DF:E3:2F:91:F7:18:25:90:09:27:37:91:7E:D7:19:33:7F:8F:9B:11:63:24:5B:3B:DC:34:79:A6:BE:26:60
if you have the android build tools, read it off the file before you install it:
apksigner verify --print-certs solstone-android-2.1.0.apk
that prints several digests per signer. the one to compare is the line reading Signer #1 certificate SHA-256 digest, not the SHA-1 or MD5 lines under it: those are different values and will not match.
and once it is installed, off the phone itself. this one needs usb debugging turned on in developer options, and a unix shell:
adb shell dumpsys package app.solstone.observer.phone | grep -F "Signatures: ["
turn usb debugging back off when you are done. the two commands print the same value in different shapes, and both are the fingerprint above: apksigner gives it lowercase with no colons, the phone gives it uppercase with them.
what the app asks you for
nothing, when you open it. the app starts with every source off and none of the four below granted, and each source asks for its own permission at the moment you turn that source on. the audio screen asks about the microphone and nothing else.
there are four of these, and android asks you about them one at a time:
| android asks | what it is for |
|---|---|
| microphoneRECORD_AUDIO | the audio source takes in what you share with it, and all of it goes into your journal. asked the first time you turn audio on. |
| cameraCAMERA | two things use it: the camera source, and the scanner that reads the pairing code from your journal. asked when you reach either one. |
| approximate locationACCESS_COARSE_LOCATION | so a place can sit alongside what the app takes in, in your journal. android's dialog offers you approximate and no precise option, because the app never asks for precise. |
| notificationsPOST_NOTIFICATIONS | so you can see the ongoing notice while a source is on, and hear about it when one stops. say no and the sources keep running; you lose the notices, and you can turn them on later in settings. |
the ones android grants at install, without asking
android grants these when the app installs. it does not ask about them, because none of them reaches anything private on its own.
| permission | what it is for |
|---|---|
| internet, network stateINTERNET · ACCESS_NETWORK_STATE | to reach the journal you paired with, and to tell a network that's gone from a journal that's gone. |
| ongoing workFOREGROUND_SERVICE · _MICROPHONE · _LOCATION · _CAMERA | android makes an app declare what kind of work it keeps doing while you are in another app. these four are that declaration, and they grant nothing. the four permissions above are still the gate. |
| keep the notice visiblePOST_PROMOTED_NOTIFICATIONS | so the notice saying a source is on stays where you can see it rather than collapsing out of the way. |
| start again after a restartRECEIVE_BOOT_COMPLETED | so a source you left on is on again after you restart your phone, instead of quietly not running. |
| keep the phone awakeWAKE_LOCK | to finish a piece of work rather than leave it half done when the screen goes off. this one comes from androidx's background-work library, not from our code. |
| a permission only this app can holdapp.solstone.observer.phone.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION | so the app's own internal messages cannot be read by other apps on your phone. the app defines it for itself, by way of an androidx library, and nothing else can ever hold it. |
that list is read out of the file you are about to download, not out of our source code. android merges in permissions from the libraries an app is built on, and the last two above arrive that way. read it yourself, if you have the android build tools:
aapt2 dump permissions solstone-android-2.1.0.apk
there is no analytics or tracking code in this app. the source is linked below, and the build refuses the analytics and crash-reporting dependencies it names. what the app takes in goes to the journal you paired it with, on a computer you keep. reaching that journal from off your own network goes over the private network, and if that is the relay sol pbc runs rather than a network you run yourself, it passes encrypted bytes it cannot read. your journal is always private, only yours.