Most portfolio apps want an account, an email, often even an exchange login. They pull your prices from the network, store your holdings in the cloud, and end up knowing more about your wealth than you would like. The Sachwert-Tresor ("tangible-asset vault") does the opposite: a single, local vault for your Bitcoin, gold and silver — fully offline, no account, no KYC, no cloud. Your data never leaves your device in plaintext.
As an app, not a website
For Android / GrapheneOS as a signed APK, for the Linux desktop as a Flatpak — both without network, both with the same vault format.
→ How to get itWhat it does
- Bitcoin, gold & silver — record buys, sells and withdrawals. Metals by count × denomination (coin/bar, fineness, dealer).
- Net holdings & value — what you actually hold, plus invested cost. You enter current prices yourself (deliberately no network lookup) or, since v3.9, paste the price line from Mission Control → value and profit/loss from that.
- EUR, USD or CHF — record each entry in its own currency (since v2.1). Totals stay separate per currency, nothing is converted — the app never fetches exchange rates. Optionally add the EUR equivalent from the transaction date so the tax-tool export stays complete.
- KYC separation — broker buys (KYC) and private/P2P (noKYC) stay cleanly separated.
- Tax-tool export — exports
manual_buys.csv/manual_sales.csvstraight into the format of the BTC tax tool. - Wealth over time (since v2.12) — every price you enter in the overview is remembered with its date (one snapshot per day). The history tab draws the value of your holdings next to your dashed cost basis, with period switches (YTD/1Y/3Y/5Y/MAX) and a tooltip naming value, cost basis and difference for any day. Still no price lookups: only your own snapshots are used — and before the first one there is deliberately no value line rather than invented numbers.
- Estate appendix (since v2.6) — one sheet with your net holdings for the heir package, laid out like the Estate Planner: version, date, destruction note, notes in plain language for the heir. Quantities with denominations only, no prices, dealers or locations. The vault knows the amounts, the planner knows the places — the appendix brings both together without either tool reading the other's data.
- Encrypted backup & sync — the
.vaultfile is fully encrypted and can be synced between devices via Syncthing, without any cloud. Since v3.11, restoring a backup also updates the prices in the overview if the backup has prices from a newer day than the device (filled-in ones only); an older backup never changes them. - Bilingual — German and English, switchable in the app.
Why offline?
A holdings tracker is a map of your wealth. That does not belong on someone else's server. The Sachwert-Tresor makes not a single network request — no price APIs, no trackers, no external scripts. You enter Bitcoin and metal prices manually. That is less convenient than a live ticker, but it is the price for nobody listening in. Since v3.9 it is quicker: in Mission Control you copy one line with current prices (Bitcoin in euros, gold and silver already converted to euros per ounce) and paste it into the vault. The vault shows you the values before applying them and itself stays without network access – the prices only reach it through the clipboard.
Security — and verifiable
- Encryption with AES-256-GCM through the native WebCrypto of the browser engine (Android WebView or Electron). Since v3.0 the key is derived from your passphrase with Argon2id (64 MiB of memory, 3 passes): every guess costs memory, which makes brute-forcing on GPUs and specialised chips far more expensive than with the former PBKDF2. Argon2id comes from the open-source library hash-wasm (MIT), bundled and checked against a pinned SHA-256 at build time.
- Old vaults and backups keep opening. A vault from an older version is switched over automatically on the first unlock — it is only written after the new file has been test-decrypted.
- Optional 2FA second factor (Aegis / TOTP, RFC 6238) on unlock.
- Failed-attempt brake (since v3.0) — after 3 wrong attempts a growing wait of up to 30 seconds kicks in. A bolt against guessing on the device, not cryptographic protection.
- No reset, no backdoor. Forget the passphrase and the data is gone — but nobody else can get in either.
- Open source. The full client code is public — you don't have to trust, you can check that nothing phones home.
How to get it
As an app (Android / GrapheneOS): deliberately not on the Google Play Store, but via signed releases from our own download address api.alien-investor.org/downloads/sachwert-tresor/. Easiest through Obtainium, which notifies you of every update automatically (setup in the sheet below), or from the Zapstore, the app store on Nostr. Without either: download the latest APK from the download page and install it. Every release is also mirrored on GitHub.
Set up Obtainium (values to copy)
On a phone with Obtainium installed it takes one tap; all settings are prefilled and Obtainium asks before adding:
Open in Obtainium
Or by hand, in Obtainium :
-
https://api.alien-investor.org/downloads/sachwert-tresor/ - Under :
sachwert-tresor-([0-9]+(\.[0-9]+)+)\.apk$ -
$1 -
66:0F:21:0C:7A:28:9F:38:8B:B4:81:2C:23:82:5A:77:F1:FC:84:E6:A7:EE:58:D6:42:81:B6:BF:5C:D8:79:88 - Tap the to add. Obtainium downloads the APK once to recognise the app. If Sachwert-Tresor is already installed, it stays as it is.
Why the RegEx? On a download page Obtainium reads the version number from the file name only with it. Without it, Obtainium only has a substitute identifier and cannot compare against the installed version. The certificate hash is a hard lock: Obtainium will not install an APK signed with a different key.
Already set up via GitHub? Then you don't need to change anything. GitHub keeps receiving every release as a mirror, your updates arrive as before.
Still on a Codeberg address? No new releases appear there. Once: make a .vault backup first, remove the “Sachwert-Tresor” entry and in the dialog
keep only “Remove from Obtainium” switched on (“Uninstall from device” off, it deletes the app and its data), then add it again as above.
Obtainium detects the installed app; signing key and package ID stay the same.
As a Linux desktop app (Flatpak, since v3.3): see below.
Signature fingerprint (SHA-256) to verify authenticity with AppVerifier, identical across all versions:
66:0F:21:0C:7A:28:9F:38:8B:B4:81:2C:23:82:5A:77:F1:FC:84:E6:A7:EE:58:D6:42:81:B6:BF:5C:D8:79:88
apksigner: 660f210c7a289f388bb4812c23825a77f1fc84e6a7ee58d64281b6bf5cd87988
Why the Android app protects more than a website
The vault is deliberately not a website: the native app (since v2.0) is locked down at the operating-system level, which a page in the browser simply cannot do:
- No INTERNET permission. The app's network right is stripped from the Android manifest entirely — it cannot open a connection at all. "No telemetry" is verifiable, not just promised. Since v3.0 its only system permission is
USE_BIOMETRICfor the optional fingerprint unlock, plusUSE_FINGERPRINT, brought in by androidx.biometric and limited by the app to Android 8.1 and below. The also-listed…DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSIONis an app-internal AndroidX signature permission with no system access. The build aborts as soon as the finished APK requests any other permission. - FLAG_SECURE. No screenshots, no screen recording, no holdings preview in the app switcher. Since v3.6.1 the app also keeps its fields out of the Android autofill framework: another password manager set up as the autofill service does not see the passphrase fields and cannot offer to save them.
- Keyboard request (since v3.11). Every input field asks the keyboard app not to learn from it (Gboard then shows its incognito icon). This is only a request: not every keyboard honours it, and the keyboard still sees what you type.
- Confirmations in an in-app dialog (since v3.5). Deleting, possible duplicates, disabling 2FA/fingerprint and "Delete local data" ask in a dialog inside the app, not through the Android system dialog — which does not inherit FLAG_SECURE, so a screenshot taken during an open confirmation would have shown the dialog text (found internally during the device test of the sister app Alien Notes).
- Import after unlocking (since v3.6). If auto-lock expires while the file picker is open, the app still locks – no key stays in memory. The chosen file (
.vaultor CSV) is not lost: the app keeps only a reference, reads nothing while it is locked, and after unlocking the import continues with exactly this file (found internally during the device test of the sister app Alien Pass). - No cloud/ADB backup, no transfer when switching phones. Your vault data lands in no automatic backup and is not copied along to a new device (since v3.0) — you make backups yourself, via the encrypted
.vaultfile. - Fingerprint (optional, since v3.0). A random key held by the Android Keystore unlocks the data key, released only after strong biometrics. Honestly: convenient, but it can be forced, and it is no extra factor. The passphrase stays mandatory after every restart (optional since v3.2: "also after a restart" box when enabling, off by default — the choice lives in the fingerprint slot and is authenticated there), after a passphrase change (fingerprint unlock is then off and must be re-enabled), after "Lock now" and as soon as a new fingerprint is enrolled in Android — the app then switches fingerprint unlock off and warns you. The restart rule is program code, not a cryptographic guarantee.
So on the phone the APK — on the Linux desktop the Flatpak, whose hardening is described in the next section.
For the Linux desktop (since v3.3)
The same code as on the phone, packaged as a Flatpak (x86_64). The vault format is identical: import a backup from
the phone on the desktop and vice versa, for example via Syncthing. The file is in the
GitHub release, together with
SHA256SUMS and the signature SHA256SUMS.asc. The same three files are also on our own download address
at api.alien-investor.org/downloads/sachwert-tresor/ (file names in the README). Not on Flathub, no automatic updates.
Step-by-step install and update instructions: Flatpak guide (for all desktop apps) or the
README (German).
GPG release key for the desktop packages (the same as for Alien Pass): alien-investor-release-key.asc — fingerprint:
100F 9E25 BFAE A807 DBC3 57D7 50C0 D785 83BF CB81
The desktop version, honestly assessed
- No network, enforced by the system. The Flatpak has no network permission and no access to your files. Backup, import, CSV export and the estate sheet go through the system file dialog, which only grants the chosen file. Verifiable with
flatpak info --show-permissions org.alieninvestor.tresor. - Estate sheet as PDF. There is no printer inside the sandbox — the desktop version saves the sheet as a PDF via the save dialog. Like CSV exports this is plain text: delete it after use. Since v3.11 the sheet, like CSV and
.txt, only goes to the shell after your choice in the save dialog: if the app locks while the dialog is open, nothing is saved. - Clipboard. What the app copies (2FA key, Ctrl+C and Ctrl+X) is marked as a password for KDE, so Klipper keeps it out of its history (tested under Plasma; other clipboard managers may ignore the mark). The app clears its own copy after 30 seconds, on lock and on quit. Since v3.7 the same applies to text you select in the app – under X11 it lands in the middle-click selection right away, even from a masked password field, for example after tabbing into the filled-in passphrase. Klipper can mirror every copy into this middle-click selection as well (setting “Keep the selection and clipboard the same”) – the app clears it there too. Only what still comes from the app is cleared. Selected text does not carry the KDE mark: if Klipper is set to keep the selection in its history, switch that off. Since v3.10 Ctrl+A only selects the content of a filled-in text or number field instead of the whole page, and the app also clears selections spanning buttons, fields and the chart as well as selected amounts and quantities. Exceptions: a selection that reaches across the date field in the entry form stays until the next selection, and so does the text of a number field if you click its arrows while it holds something other than the plain number. Since v3.11 the app also clears text that Ctrl+Z or Ctrl+Y bring back only after the 30 seconds have passed, and the 2FA key when you drag it with the mouse during setup.
- Its own browser engine. The desktop app ships Electron itself. Security updates for it only arrive with a new app version, not through the system.
- Limits: no protection against screenshots (Linux has no counterpart to FLAG_SECURE). Under X11 every running program can read keyboard and clipboard; Wayland separates programs better. On screen lock and suspend the app does not lock by itself: use the system lock (especially for suspend) plus a short inactivity lock; Ctrl+L locks immediately. On the desktop "background" means minimised or hidden — switching windows does not lock, but it clears typed passphrases. No fingerprint.
- Origin: shell and hardening are the port from Alien Pass (three internal audits there); the vault's shell is checked with tests in the real shell, v3.7 added an internal security audit of the changes, v3.10 was preceded by a targeted internal audit in four rounds, and v3.11 by an internal release audit of the changes in two rounds with a follow-up check; v3.11 also adopts findings from the internal audits of the sister apps Alien Pass and Alien Notes.
Open source on GitHub
The client code is open source (MIT license) and free. Build, signing and server internals stay private; the verifiable part — the app itself — is open. No accounts, no server dependency.
The Sachwert-Tresor is free. If it helps you, the mothership appreciates some fuel — see below. And if you want to file your Bitcoin buys cleanly for tax, the BTC tax tool is the next step: the vault exports straight into its format.