-
v0.3.0 Stable
released this
2026-08-07 21:07:03 +00:00 | 0 commits to main since this releaseMulti-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 profileOutput is prefixed with the active profile:
(work) [✓] credential saved successfullyOn first run
~/.kosh/kosh.dbmoves to~/.kosh/profiles/default.db. Nothing is re-encrypted — it's a rename, not a rewrite.Search
- 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 > fuzzyholds structurally. - Typos cost less. Damerau-Levenshtein counts a transposition as one edit, so
kosh cratfindscart. - Abbreviations work.
kosh gpatfindsgit_personal_access_token. - Empty or whitespace-only queries now match nothing instead of everything.
Added
KOSH_DEBUG=1for debug output — no rebuild needed, thelogger.BuildModeldflag is gone.- Real auto-sized tables in
kosh listandkosh profile list. - Relative timestamps —
02d 04h ago,just now,never. - Confirmation prompts before anything that destroys an unrecoverable secret.
- Full
--helpfor every command, with examples.
Fixed
Ctrl+Cat a password prompt no longer leaves your terminal with echo disabled.Ctrl+Cduringkosh profile createno 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.
similarityScorereturnedNaNfor two empty strings.kosh generate --lowerwas 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
[]byteend 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 Waylandwl-copyspecial case is gone.getandsearchnow 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/crypto0.54.0,x/term0.45.0,x/text0.40.0,modernc.org/sqlite1.54.0,cobra1.10.2. Still a single static binary, still no CGO. docs/architecture.mddocuments the cryptographic design. Kosh is now MIT licensed.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- 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: