From d0b09ad8115c29d67bcbbc4c7b5aab0a41f16fa2 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Thu, 5 Nov 2026 10:56:52 +0100 Subject: content: write HardenedPass reference and landing pages Every setting, the security model, troubleshooting and the landing page, in both languages. Also adds the Firefox save prompt tip and full menu paths on the sync and autofill pages. Still drafts. Co-Authored-By: Claude Opus 5.5 --- content/en/hardenedpass/reference/_index.md | 8 +-- .../en/hardenedpass/reference/security/index.md | 59 +++++++++++++++-- .../en/hardenedpass/reference/settings/index.md | 65 ++++++++++++++++-- .../reference/troubleshooting/index.md | 76 ++++++++++++++++++++-- 4 files changed, 190 insertions(+), 18 deletions(-) (limited to 'content/en/hardenedpass/reference') diff --git a/content/en/hardenedpass/reference/_index.md b/content/en/hardenedpass/reference/_index.md index 9a07df6..7b14a54 100644 --- a/content/en/hardenedpass/reference/_index.md +++ b/content/en/hardenedpass/reference/_index.md @@ -1,13 +1,9 @@ +++ title = "Reference" date = 2026-11-05T00:00:00Z -description = "" +description = "Reference pages for HardenedPass: every setting, the security model and fixes for common errors." weight = 30 draft = true +++ -Placeholder. - -## First heading - -Text. +Look things up here when you need them. There is no need to read these pages in order. diff --git a/content/en/hardenedpass/reference/security/index.md b/content/en/hardenedpass/reference/security/index.md index 0c1ba30..c865c1d 100644 --- a/content/en/hardenedpass/reference/security/index.md +++ b/content/en/hardenedpass/reference/security/index.md @@ -1,13 +1,64 @@ +++ title = "Security" date = 2026-11-05T00:00:00Z -description = "" +description = "What HardenedPass protects, where each secret lives, what it sends over the network and which threats it does not cover." weight = 100 draft = true +++ -Placeholder. +This page says what the app does for you and, just as important, what it does not do. -## First heading +## Where your secrets live + +| Secret | Where it is | How it is protected | +|---|---|---| +| Entries | Files in the app's private storage, and on your git server | OpenPGP, the same as `pass` on a computer | +| OpenPGP private key | The app's private storage | Its own passphrase | +| Key passphrase | Nowhere, unless you enable caching | If cached: AES-GCM under an Android Keystore key | +| Git and proxy passwords | The app's private storage, if you tell it to remember them | AES-GCM under an Android Keystore key | +| SSH key made on the phone | Android Keystore | The system, plus your screen lock if you ask for it | +| SSH key you imported | The app's private storage | Its own passphrase, if it has one | + +Android Keystore keys are held by the system and cannot be copied out of the phone, even +by the app that uses them. + +## What the app does + +- **No telemetry.** No analytics, no crash reports, no Google Play Services. The app + only connects to the git server you configured, and to your proxy if you set one. +- **Blocks screenshots of secrets.** Entries, the editor, the generator, passphrase + dialogs and autofill windows cannot be captured by screenshots, and do not appear in + the recent apps view. +- **Clears the clipboard.** A copied password is removed after a timeout. +- **Checks the SSH server.** The server's host key is saved on first connection and + checked after that. The first connection is trusted without asking, so make it on a + network you trust. +- **Trusts known browsers only.** Autofill works only in browsers whose signing + certificate the app recognizes, and warns you if an app's publisher changes. See + [Autofill]({{< relref "/hardenedpass/using/autofill" >}}). +- **Refuses outside files.** Other apps can open the app, but it only opens paths that + really are inside your store. + +## What the app does not protect you from + +- **A compromised phone.** Malware that controls an unlocked phone can see what you + see. Keep the system up to date. +- **Your keyboard.** A keyboard app sees everything you type, the passphrase included. + Use one you trust, with network access off if your system allows that. +- **Other apps reading the clipboard** before the timeout runs out. Autofill avoids the + clipboard altogether. +- **A weak passphrase.** If someone gets your key file, the passphrase is all that is + left. +- **Your git server seeing names.** Entry and folder names are file names, and they are + not encrypted, so the server can read them, along with the dates of your commits. +- **Biometric lock as encryption.** **Enable biometric authentication** is a gate at app + start. It keeps out someone holding your unlocked phone for a moment, and it does not + encrypt anything. +- **Losing your key.** No one can recover a store without its private key and passphrase. + +## Passphrase caching + +Caching is convenient, but while the passphrase is cached, anyone who gets into the +unlocked app can open every entry. It is experimental. If you use it, turn on +**Automatically clear passphrase cache** as well. -Text. diff --git a/content/en/hardenedpass/reference/settings/index.md b/content/en/hardenedpass/reference/settings/index.md index 81a68ad..d856f93 100644 --- a/content/en/hardenedpass/reference/settings/index.md +++ b/content/en/hardenedpass/reference/settings/index.md @@ -1,13 +1,70 @@ +++ title = "Settings" date = 2026-11-05T00:00:00Z -description = "" +description = "Every HardenedPass setting and what it does, section by section: general, autofill, passwords, repository, misc and PGP." weight = 90 draft = true +++ -Placeholder. +Open **Settings** from the three dots in the list's search bar, or from the welcome +screen. Settings are grouped in six sections. -## First heading +## General -Text. +| Setting | What it does | +|---|---| +| **App theme** | Light, dark or following the battery saver. | +| **Password file organization** | How autofill names the files it saves, for example `work/example.org.gpg` or `work/example.org/alice@example.org.gpg`. | +| **Password sort order** | Folders first, or recently used first. | +| **Disable pull to sync action** | Stops the pull down gesture on the list from starting a sync. | +| **Recursive filtering** | Search also looks inside the folders below the current one. | +| **Open search on start** | Opens the search bar when the app starts. | +| **Show all files and folders** | Lists files that are not passwords as well. | +| **Enable biometric authentication** | Asks for your fingerprint when the app starts. See [Security]({{< relref "/hardenedpass/reference/security" >}}) for what this does and does not protect. | + +## Autofill + +| Setting | What it does | +|---|---| +| **Enable Autofill** | Makes HardenedPass the autofill service. See [Autofill]({{< relref "/hardenedpass/using/autofill" >}}). | +| **Default username** | Used when autofill cannot find a username in the entry or its path. | +| **Custom domains** | Domains whose subdomains autofill treats as separate sites. | + +## Passwords + +| Setting | What it does | +|---|---| +| **Password generator type** | The generator that opens first: Classic (the Random tab) or Diceware. | +| **Password copy timeout** | Seconds a copied password stays in the clipboard, 45 by default. 0 means forever. | +| **Show the password** | Whether a decrypted password is visible right away. Copying still works when it is hidden. | +| **Automatically copy password** | Copies the password as soon as an entry is decrypted. | + +## Repository + +| Setting | What it does | +|---|---| +| **Rebase on pull** | On, your local commits go on top of the server's. Off, a merge commit is made instead. On by default. | +| **Edit Git server settings** | Changes the repository URL and how you log in. | +| **HTTP(S) proxy settings** | Sets a proxy. Shown for HTTPS remotes only. | +| **Local Git config & utilities** | Commit name and email, commit log, and the recovery tools described in [Sync]({{< relref "/hardenedpass/using/sync" >}}). | +| **Import SSH key** | Reads a private SSH key from a file. | +| **Generate SSH key pair** | Makes a new SSH key on the phone. | +| **View generated public SSH key** | Shows the public half, to add to your server. | +| **Delete repository** | Deletes the local copy of the store. The server's copy is not touched, and neither are local commits you did not sync: those are gone. | + +## Misc + +| Setting | What it does | +|---|---| +| **Export passwords** | Copies the store, still encrypted, to a folder you choose. | +| **Workaround clipboard history feature** | On phones with a clipboard history, fills it with numbers to push passwords out. | +| **Debug logging** | Turns on debug logs, after an app restart. Release builds only. | + +## PGP settings + +| Setting | What it does | +|---|---| +| **Key manager** | Lists imported keys, imports new ones and deletes old ones. | +| **Encrypt in ASCII armor mode** | Writes entries as text instead of binary. Leave it off unless you know you need it. | +| **Enable passphrase caching** | Remembers the key's passphrase, so that entries open without asking. Experimental, and needs an active screen lock. | +| **Automatically clear passphrase cache** | Forgets the passphrase when the screen turns off. | diff --git a/content/en/hardenedpass/reference/troubleshooting/index.md b/content/en/hardenedpass/reference/troubleshooting/index.md index 4221c83..3dfce92 100644 --- a/content/en/hardenedpass/reference/troubleshooting/index.md +++ b/content/en/hardenedpass/reference/troubleshooting/index.md @@ -1,13 +1,81 @@ +++ title = "Troubleshooting" date = 2026-11-05T00:00:00Z -description = "" +description = "Common HardenedPass errors, what they mean and how to fix them: passphrase, keys, SSH, push rejected, detached head, autofill." weight = 110 draft = true +++ -Placeholder. +## Keys and passphrases -## First heading +**The app asks for the passphrase again and says it is wrong.** The passphrase does not +match the private key. If you changed the key's passphrase on a computer, the app +needs the new one. If caching is on, it asks again and replaces the old value. -Text. +**`Failed to import PGP key`.** The file is not a key the app can use. Keys without an +encryption subkey are rejected, because they could not decrypt anything. Check that you +exported the **private** key, with `gpg --armor --export-secret-keys`. + +**An entry will not open and no key matches.** The store is encrypted for a key that is +not imported. Compare **Store recipients** on the import screen, or the `.gpg-id` file, +with the keys in **Key manager**. A public key alone cannot decrypt: import the private +one. + +**The key is on a smartcard.** GnuPG exports a stub for such a key, with no secret +material in it. The app cannot decrypt with that. It needs the real private key. + +**`Found .gpg-id, but it contains an invalid key ID, fingerprint or user ID`.** The +`.gpg-id` file has something the app does not understand. Check it on a computer: one +key ID, fingerprint or address per line. + +## Connecting + +**`The provided repository URL is not valid`.** See the address forms in +[Connect the app]({{< relref "/hardenedpass/getting-started/connect" >}}). + +**`Wrong password` or `Wrong passphrase`.** For a repository password or an SSH key's +passphrase. Many hosting services want an access token rather than the account password. + +**`Selected file does not appear to be an SSH private key`.** You picked the public key, +or a file in another format. Choose the file without `.pub`. + +**The sync fails after the server was reinstalled or moved.** Its host key changed. If +you are sure why, use **Clear saved host key** on the repository screen, under **Edit +Git server settings**. If you are not, treat it as an attack until you know better. + +**SSH login is refused.** Check that the public key is on the server, for the right +account. **View generated public SSH key** shows it for a key made on the phone. + +## Syncing + +**`Push was rejected by remote, run pull before pushing again`.** The server has commits +you do not have. Use **Synchronize repository**, which pulls and then pushes. + +**`Pull has failed, you're in a detached head`.** A conflict stopped the rebase. +[Sync]({{< relref "/hardenedpass/using/sync" >}}) has the steps. + +**`Merge has failed, you're in a conflicting state`.** The same conflict, with **Rebase +on pull** off. The way out is the hard reset in +[Sync]({{< relref "/hardenedpass/using/sync" >}}), after saving anything you need. + +**`The repository must be cloned before syncing changes`.** The store on the phone has no +remote. Set one under **Edit Git server settings** and clone it. + +## Autofill + +**No suggestions appear.** Check that HardenedPass is the selected autofill service in +Android's settings, and that the browser is on the list in +[Autofill]({{< relref "/hardenedpass/using/autofill" >}}). + +**Only the password gets filled.** That is the browser's support level, as with Vanadium. + +**`This app is currently not supported`.** The app cannot save from there. You can still +add the entry by hand. + +**Nothing happens after tapping Save.** Android 14 and later hold back background +windows, and the app has a workaround: update to the latest version. + +## Still stuck? + +Open an issue on the [tracker](https://github.com/danixland/HardenedPass/issues). Say +which version you run and what you did. Never paste passwords, keys or real entry names. -- cgit v1.2.3