• v0.3.0 ceedac7d63

    v0.3.0 Stable

    kashish released this 2026-08-07 21:07:03 +00:00 | 0 commits to main since this release

    Multi-profile vaults and a rebuilt search ranker.

    Upgrading from v0.2.3 needs no action — your vault migrates itself on first run and your master password is unchanged.

    Profiles

    Kosh had exactly one vault. It now supports separate encrypted vaults, each with its own master password and credentials. Unlocking one grants no access to any other.

    kosh profile create work     # create a profile and set its master password
    kosh use personal            # switch profiles (no args = interactive picker)
    kosh profile list            # see them all, and which one is active
    kosh profile delete old      # delete a profile and everything in it
    kosh copy <id> work          # copy a credential into another profile
    

    Output is prefixed with the active profile: (work) [✓] credential saved successfully

    On first run ~/.kosh/kosh.db moves to ~/.kosh/profiles/default.db. Nothing is re-encrypted — it's a rename, not a rewrite.

    • Frequently-used credentials no longer outrank closer matches. Scores were additive, letting usage stats compete with match quality on the same scale. Behaviour is now a multiplier: (label + user) × (1 + recency + frequency).
    • Prefix matches can no longer beat exact ones. Boosts are asymptotic — each closes a fraction of the gap to the ceiling instead of adding a constant, so exact > prefix > substring > subsequence > fuzzy holds structurally.
    • Typos cost less. Damerau-Levenshtein counts a transposition as one edit, so kosh crat finds cart.
    • Abbreviations work. kosh gpat finds git_personal_access_token.
    • Empty or whitespace-only queries now match nothing instead of everything.

    Added

    • KOSH_DEBUG=1 for debug output — no rebuild needed, the logger.BuildMode ldflag is gone.
    • Real auto-sized tables in kosh list and kosh profile list.
    • Relative timestamps — 02d 04h ago, just now, never.
    • Confirmation prompts before anything that destroys an unrecoverable secret.
    • Full --help for every command, with examples.

    Fixed

    • Ctrl+C at a password prompt no longer leaves your terminal with echo disabled.
    • Ctrl+C during kosh profile create no longer leaves a half-created profile behind.
    • Secure delete wrote nothing — the file was opened read-only, so every overwrite silently went nowhere.
    • Runtime errors (e.g. a wrong master password) print one line instead of the full flag documentation.
    • similarityScore returned NaN for two empty strings.
    • kosh generate --lower was documented as "include uppercase letters".

    Security

    • Every profile has its own Curve25519 keypair, Argon2id salt, and master password.
    • Master-password and secret confirmations use constant-time comparison.
    • Decrypted secrets are handled as []byte end to end, never copied into immutable strings.
    • Debug logs redact secrets, nonces and ephemeral keys.
    • Profile deletion refuses any name that isn't a plain entry of the profiles directory.
    • Deleted vaults are overwritten before unlinking. This is defence in depth, not a guarantee — on SSDs, wear levelling puts the original bytes out of reach from userspace. What protects a deleted vault is that its contents were encrypted at rest.

    Other

    • One clipboard path on every platform (golang.design/x/clipboard); the Wayland wl-copy special case is gone. get and search now copy before updating access stats, so failed bookkeeping can't cost you the secret.
    • Commands build through a shared application context instead of package globals; vault and profile layers sit behind interfaces. Test suite went from one file to six.
    • Dependencies refreshed: x/crypto 0.54.0, x/term 0.45.0, x/text 0.40.0, modernc.org/sqlite 1.54.0, cobra 1.10.2. Still a single static binary, still no CGO.
    • docs/architecture.md documents the cryptographic design. Kosh is now MIT licensed.

    Downloads