2025-10-22 - 2026-10-22

Overview

97 Active Pull Requests
99 Active Issues
Excluding merges, 4 authors have pushed 10 commits to main and 111 commits to all branches. On main, 91 files have changed and there have been 10229 additions and 5718 deletions.

4 Releases published by 1 user

Published v1.0.0-rc4 2026-10-15 19:33:28 +02:00

Published v1.0.0-rc3 2026-10-15 11:04:09 +02:00

Published v1.0.0-rc2 2026-10-13 01:16:53 +02:00

Published v1.0.0-rc1 2026-10-13 00:02:02 +02:00

96 Pull requests merged by 2 users

Merged #196 Point the commandWait comment at the Dockerfile's test limit (closes #195) 2026-10-15 20:25:09 +02:00

Merged #193 Keep Go's build cache in check builds: re-vendor sneak/prompts e3f79c4 (closes #129) 2026-10-15 19:58:39 +02:00

Merged #194 Set the time zone in main and run Entry in its own test process (closes #192) 2026-10-15 19:25:11 +02:00

Merged #191 Log the audit fixes in TODO.md 2026-10-15 17:58:58 +02:00

Merged #190 A secret mv between vaults unlocks both vaults before taking the lock 2026-10-15 10:49:07 +02:00

Merged #188 Ask for the mnemonic and passphrase before taking the state directory lock 2026-10-15 09:02:14 +02:00

Merged #185 A cross-vault secret mv that cannot remove the source fails (closes #159) 2026-10-15 07:31:55 +02:00

Merged #162 Hold the encrypt and decrypt result in memory until it is written (closes #143) 2026-10-15 07:31:47 +02:00

Merged #182 Commands fail when currentvault names no vault (closes #156) 2026-10-15 07:14:44 +02:00

Merged #187 Print every time in UTC, whatever the time zone 2026-10-15 06:48:52 +02:00

Merged #186 Unknown subcommands of vault, unlocker, version and generate fail 2026-10-15 06:02:46 +02:00

Merged #175 Ask for the new passphrase in unlocker add when the variable is set (closes #154) 2026-10-15 06:02:32 +02:00

Merged #172 Stop vault creation when a vault's metadata cannot be read 2026-10-15 06:02:23 +02:00

Merged #184 README says secret add drops one trailing newline and import keeps it 2026-10-15 05:31:58 +02:00

Merged #179 Include gpg's stderr in the error when gpg fails 2026-10-15 05:31:51 +02:00

Merged #181 secret version list no longer shows a version without NOT_AFTER as expired (closes #150) 2026-10-15 04:48:54 +02:00

Merged #178 Print an empty unlocker or vault list as [] in JSON 2026-10-15 04:48:47 +02:00

Merged #170 A secret too large for the locked-memory limit fails with an error, not a panic 2026-10-15 04:02:15 +02:00

Merged #176 Count every file of each version in secret info's Total Size 2026-10-15 03:15:06 +02:00

Merged #174 Remove secret vault import 2026-10-15 03:14:56 +02:00

Merged #180 version promote --help says the current file is rewritten (closes #153) 2026-10-15 02:31:47 +02:00

Merged #177 Refuse an existing vault before asking for the mnemonic 2026-10-15 01:32:24 +02:00

Merged #166 secret get fails when it cannot write the value 2026-10-15 01:32:15 +02:00

Merged #168 secret list gives each secret's own creation and last-update times (closes #142) 2026-10-15 00:32:06 +02:00

Merged #167 Use gpg.conf's default-key when unlocker add pgp has no --keyid 2026-10-15 00:31:54 +02:00

Merged #171 A wrong passphrase gives an error that says so 2026-10-14 23:48:51 +02:00

Merged #165 Ask for the passphrase on the controlling terminal, not stdin 2026-10-14 23:02:26 +02:00

Merged #164 Print the mnemonic and the vault and unlocker listings to stdout 2026-10-14 22:31:48 +02:00

Merged #163 Make another unlocker current when the current one is removed 2026-10-14 22:02:18 +02:00

Merged #161 A failed secret add --force leaves the secret unchanged 2026-10-14 20:48:49 +02:00

Merged #160 Derive the vault key from the mnemonic's words however they are spaced (closes #135) 2026-10-13 01:09:37 +02:00

Merged #134 Remove the keychain and Secure Enclave unlockers (closes #132) 2026-10-13 00:39:36 +02:00

Merged #130 Copy go-bip39 into internal/bip39 (closes #122) 2026-10-07 12:56:11 +02:00

Merged #128 Re-vendor the canonical files from sneak/prompts at dd4027b (closes #121) 2026-10-07 05:43:00 +02:00

Merged #53 Make script/test fail on flaky failures and enable -race (closes #32) 2026-10-07 03:22:35 +02:00

Merged #125 Keep Go's build cache between builds (closes #124) 2026-10-07 01:02:38 +02:00

Merged #127 Stop the terminal tests reading a pty nobody opened (closes #126) 2026-10-07 00:02:42 +02:00

Merged #123 Make the tests fast under the race detector (closes #120) 2026-10-06 07:02:37 +02:00

Merged #119 Test only small secrets in the size tests (closes #52) 2026-10-06 02:22:38 +02:00

Merged #118 Rename the Go module to sneak.berlin/go/secret (closes #43) 2026-10-05 02:45:38 +02:00

Merged #117 Format and check markdown with prettier in make fmt and fmt-check (closes #110) 2026-10-05 02:07:55 +02:00

Merged #116 Name only the mnemonic when it cannot be read (closes #115) 2026-10-05 01:43:00 +02:00

Merged #114 Give each failure one error value (closes #113) 2026-10-05 01:08:02 +02:00

Merged #112 Check errors by identity, not by message text, in tests (closes #49) 2026-10-04 23:25:07 +02:00

Merged #111 Say the mnemonic still opens a vault its unlocker cannot (closes #47) 2026-10-04 21:59:03 +02:00

Merged #109 Make an unlocker's ID the name of its directory (closes #98) 2026-10-04 21:25:00 +02:00

Merged #107 Make the README's storage and file format text match the code (closes #102) 2026-10-04 20:58:43 +02:00

Merged #108 Create a vault whole in a temporary directory, then select it (closes #105) 2026-10-04 20:42:04 +02:00

Merged #106 Delete the keychain item or Secure Enclave key of a failed unlocker add (closes #89) 2026-10-04 20:08:00 +02:00

Merged #101 Delete .tmp- leftovers of a killed command when the lock is next taken (closes #75) 2026-10-04 19:25:26 +02:00

Merged #103 Add the README's required sections and clear stale TODO.md items (closes #46) 2026-10-04 19:25:08 +02:00

Merged #104 Put age identity keys into locked buffers through one function (closes #38) 2026-10-04 18:42:01 +02:00

Merged #96 Type-check and lint the macOS build from Linux (closes #50) 2026-10-04 18:07:56 +02:00

Merged #100 Ask before removing a secret, version, vault or unlocker (closes #39) 2026-10-04 17:41:49 +02:00

Merged #99 Give every new unlocker a directory of its own (closes #71) 2026-10-04 16:58:46 +02:00

Merged #94 Read secret environment variables once per command, then unset them (closes #60) 2026-10-04 16:07:58 +02:00

Merged #97 Use the canonical golangci-lint config (closes #66) 2026-10-04 15:32:23 +02:00

Merged #95 Make secret unlocker add pgp work on Linux (closes #88) 2026-10-04 14:42:03 +02:00

Merged #93 Check vault names in every command that takes one (closes #68) 2026-10-04 13:58:47 +02:00

Merged #92 Run the checks again on every script/cibuild (closes #54) 2026-10-04 13:25:25 +02:00

Merged #90 Leave no partial unlocker directory when adding an unlocker fails (closes #48) 2026-10-04 12:58:52 +02:00

Merged #91 Skip corrupt unlocker metadata in unlocker select and remove (closes #72) 2026-10-04 12:42:02 +02:00

Merged #86 Print usage only for a command called wrongly (closes #41) 2026-10-04 12:08:07 +02:00

Merged #87 Keep secret get values in locked memory (closes #37) 2026-10-04 11:16:25 +02:00

Merged #84 Build with the local docker daemon; add script/build (closes #44) 2026-10-04 10:42:10 +02:00

Merged #64 Stop vault safety checks from reading unreadable state as empty (closes #51) 2026-10-04 10:15:21 +02:00

Merged #85 Ignore secrets and editor files in .gitignore (closes #40) 2026-10-04 09:25:01 +02:00

Merged #82 Refuse to create a vault that already exists (closes #74) 2026-10-04 08:25:41 +02:00

Merged #83 Speed up the internal/cli lock and two-vault tests (closes #80) 2026-10-04 08:08:05 +02:00

Merged #81 Reject secret mv onto the same secret under another name (closes #78) 2026-10-04 07:42:12 +02:00

Merged #79 Run golangci-lint only in docker, on every run (closes #55) 2026-10-04 07:07:53 +02:00

Merged #61 Keep unlocker list working when unlocker metadata is corrupt (closes #42) 2026-10-04 06:42:16 +02:00

Merged #76 Stop secret mv deleting a secret moved onto itself (closes #73) 2026-10-04 05:08:07 +02:00

Merged #69 Lock the state directory and write vault files atomically (closes #34) 2026-10-04 04:57:59 +02:00

Merged #77 Accept a version argument only if the secret has that version (closes #67) 2026-10-04 03:25:01 +02:00

Merged #62 Wipe memguard buffers on every exit and restore echo (closes #35) 2026-10-04 02:07:59 +02:00

Merged #65 Reject invalid secret names before any command builds a path (closes #33) 2026-10-04 01:29:29 +02:00

Merged #63 Keep the keychain unlocker passphrase in locked memory (closes #36) 2026-10-03 17:07:57 +02:00

Merged #58 Let a plain docker build pass and stamp the git version (closes #57) 2026-10-02 14:16:02 +02:00

Merged #29 Update golangci-lint to v2.12.2 with canonical config 2026-08-10 15:23:33 +02:00

Merged #28 Add .editorconfig (closes #27) 2026-08-07 17:46:27 +02:00

Merged #26 scripts-to-rule-them-all 2026-07-07 02:13:45 +02:00

Merged #25 TODO 2026-07-06 21:20:29 +02:00

Merged #21 ci: add Gitea Actions workflow for make check 2026-03-30 21:34:49 +02:00

Merged #24 secure-enclave-unlocker 2026-03-14 07:36:28 +01:00

Merged #22 chore: remove stale .cursorrules and coverage.out 2026-02-28 19:29:52 +01:00

Merged #20 Add secret.Warn() calls for all silent anomalous conditions 2026-02-20 09:22:29 +01:00

Merged #17 Skip unlocker directories with missing metadata instead of failing (closes #1) 2026-02-20 08:59:04 +01:00

Merged #8 Fix getLongTermPrivateKey derivation index hardcoded to 0 (closes #3) 2026-02-20 08:58:21 +01:00

Merged #16 Allow uppercase letters in secret names (closes #2) 2026-02-20 08:57:20 +01:00

Merged #15 Validate secret name in GetSecretVersion to prevent path traversal (closes #13) 2026-02-20 08:56:51 +01:00

Merged #18 Return error from GetDefaultStateDir when home directory unavailable (closes #14) 2026-02-20 08:54:22 +01:00

Merged #11 Remove redundant longterm.age encryption in Init command (closes #6) 2026-02-09 02:39:55 +01:00

Merged #9 Fix NumSecrets() always returning 0 (closes #4) 2026-02-09 02:39:30 +01:00

Merged #12 Non-darwin KeychainUnlocker stub returns errors instead of panicking (closes #7) 2026-02-09 02:20:14 +01:00

Merged #10 Zero plaintext after copying to memguard in DecryptWithIdentity (closes #5) 2026-02-09 02:18:06 +01:00

1 Pull request proposed by 1 user

97 Issues closed from 2 users

Closed #195 The commandWait comment names a 30-second test limit that no longer exists 2026-10-15 20:25:09 +02:00

Closed #192 make test sometimes fails with a data race on time.Local in cli.Entry 2026-10-15 19:25:11 +02:00

Closed #173 Log the audit fixes in TODO.md in one change 2026-10-15 17:58:59 +02:00

Closed #189 A secret mv between vaults asks for the passphrase while holding the state directory lock 2026-10-15 10:49:07 +02:00

Closed #152 Commands that prompt for a mnemonic or passphrase hold the state directory lock while waiting, so other changing commands wait silently 2026-10-15 09:02:15 +02:00

Closed #159 A cross-vault secret mv whose source could not be removed reports "Moved" and exits 0, leaving the secret in both vaults 2026-10-15 07:31:55 +02:00

Closed #143 secret decrypt and secret encrypt truncate the --output file before they can fail, and --input equal to --output destroys the input 2026-10-15 07:31:48 +02:00

Closed #156 A currentvault file naming a vault that does not exist makes secret list report an empty vault with exit 0 2026-10-15 07:14:45 +02:00

Closed #169 Listed times are in the local time zone, not UTC as AGENTS.md requires 2026-10-15 06:48:53 +02:00

Closed #183 An unknown subcommand of vault, unlocker, version or generate prints help and exits 0 2026-10-15 06:02:53 +02:00

Closed #154 With SB_UNLOCK_PASSPHRASE set, secret unlocker add passphrase gives the new unlocker the old passphrase without asking 2026-10-15 06:02:33 +02:00

Closed #140 A vault with corrupt or unreadable metadata is skipped when choosing the next derivation index, so the next vault gets its key 2026-10-15 06:02:24 +02:00

Closed #158 README does not say that secret add drops one trailing newline from the value while secret import keeps it 2026-10-15 05:32:04 +02:00

Closed #146 A gpg failure is reported as only its exit status; gpg's reason on stderr is dropped 2026-10-15 05:31:51 +02:00

Closed #150 secret version list shows STATUS expired for every version that is not current, including ones with no NOT_AFTER 2026-10-15 04:48:54 +02:00

Closed #148 secret unlocker list --json prints "unlockers": null when the vault has no unlockers 2026-10-15 04:48:47 +02:00

Closed #145 A secret larger than about half the locked-memory limit crashes secret add, import and generate secret with a panic 2026-10-15 04:02:15 +02:00

Closed #147 secret info counts only metadata.age, so Total Size leaves out every secret value 2026-10-15 03:15:12 +02:00

Closed #139 secret vault import cannot succeed on any vault the tool creates, and the mnemonic help points at secret import 2026-10-15 03:15:02 +02:00

Closed #153 secret version promote --help says it updates the current symlink; current is a plain file 2026-10-15 02:31:47 +02:00

Closed #151 secret init and secret vault create ask for the mnemonic and passphrase before refusing a vault that already exists 2026-10-15 01:32:24 +02:00

Closed #155 secret get ignores a failed write of the value to stdout and exits 0 2026-10-15 01:32:16 +02:00

Closed #142 secret list reports the time of the listing as every secret's creation and last-update time 2026-10-15 00:32:07 +02:00

Closed #141 secret unlocker add pgp without --keyid fails when gpg.conf sets a default-key, because gpgconf prefixes the value with a quote 2026-10-15 00:31:54 +02:00

Closed #157 A wrong passphrase is reported as "no identity matched any of the recipients" with advice to make a new unlocker from the mnemonic 2026-10-14 23:48:51 +02:00

Closed #144 The passphrase prompt reads stdin, so secret add --force with a piped value and secret encrypt/decrypt from stdin cannot ask for the passphrase 2026-10-14 23:02:28 +02:00

Closed #138 secret generate mnemonic, secret vault list and secret unlocker list print their output to stderr, so it cannot be piped or captured 2026-10-14 22:32:01 +02:00

Closed #137 Removing the current unlocker leaves the vault unable to open through its remaining unlocker 2026-10-14 22:02:18 +02:00

Closed #136 A secret add --force that fails to unlock the vault still leaves a new version behind 2026-10-14 20:48:49 +02:00

Closed #135 A mnemonic typed with extra whitespace derives a different long-term key, so the vault cannot be recovered with the same words 2026-10-13 01:09:38 +02:00

Closed #132 Take the keychain and Secure Enclave unlockers out of the build and the release 2026-10-13 00:39:38 +02:00

Closed #149 A secret add --force that fails to unlock the vault still stores the new value as a stray version 2026-10-13 00:31:26 +02:00

Closed #133 Keep the macOS research code out of the build and the release 2026-10-13 00:08:30 +02:00

Closed #122 go-bip39 no longer exists upstream: copy it into the repo, as keyfunc does? 2026-10-07 12:56:11 +02:00

Closed #121 Re-vendor the canonical files from sneak/prompts at dd4027b 2026-10-07 05:43:01 +02:00

Closed #32 script/test silently passes on flaky failures, and runs without -race or -timeout 2026-10-07 03:22:35 +02:00

Closed #124 Compile once, outside the timed test step, so make test with -race fits the 60-second cap 2026-10-07 01:02:39 +02:00

Closed #126 TestRemoveIgnoresTerminalOnStdout can hang until Go's 10-minute test timeout 2026-10-07 00:02:42 +02:00

Closed #120 make test with -race takes about 214 s; it must fit the 60-second cap 2026-10-06 07:02:38 +02:00

Closed #52 Test suite cannot meet the 20s policy budget once -race is enabled: internal/cli 100MB boundary tests 2026-10-06 02:22:38 +02:00

Closed #43 Go module path is git.eeqj.de/sneak/secret, policy requires sneak.berlin/go/secret 2026-10-05 02:45:38 +02:00

Closed #110 make fmt and make fmt-check ignore markdown 2026-10-05 02:07:55 +02:00

Closed #115 Reading the mnemonic without a terminal says "failed to read passphrase" 2026-10-05 01:43:01 +02:00

Closed #113 One error value per failure: internal/cli duplicates vault errors, some failures have none, two bip85 errors are unreachable 2026-10-05 01:08:02 +02:00

Closed #49 Tests assert on error message fragments, never on sentinel identity — error-handling regressions pass silently 2026-10-04 23:25:07 +02:00

Closed #47 Error messages leak internals and offer no recovery path for corrupted key files 2026-10-04 21:59:03 +02:00

Closed #98 Two keychain or Secure Enclave unlockers added in the same minute share an ID 2026-10-04 21:25:00 +02:00

Closed #102 README calls the current-version and current-vault files symlinks and version metadata unencrypted 2026-10-04 20:58:43 +02:00

Closed #105 init or vault create killed mid-way leaves a vault with no unlocker that cannot be created again 2026-10-04 20:42:04 +02:00

Closed #89 A failed keychain or Secure Enclave unlocker add leaves its keychain item or Secure Enclave key behind 2026-10-04 20:08:00 +02:00

Closed #70 vault create on an existing vault re-keys it, making every secret in it undecryptable 2026-10-04 19:58:55 +02:00

Closed #75 Interrupted commands leave debris: .tmp- leftovers, a vault with no unlocker, an unremovable partial unlocker 2026-10-04 19:25:26 +02:00

Closed #46 README missing four required sections; TODO.md is stale and describes completed work as pending 2026-10-04 19:25:08 +02:00

Closed #38 age identity .String() creates unprotected copies of private keys at six call sites 2026-10-04 18:42:01 +02:00

Closed #50 Darwin-only code is never compiled, linted, or tested by CI, including both hardware-backed unlockers 2026-10-04 18:07:56 +02:00

Closed #39 No confirmation prompt on any destructive operation 2026-10-04 17:41:49 +02:00

Closed #71 Replacing an unlocker is not atomic: a crash part-way leaves it unable to open the vault 2026-10-04 16:58:47 +02:00

Closed #60 Pass the mnemonic in memory instead of the environment, and unset secret environment variables after reading 2026-10-04 16:07:58 +02:00

Closed #66 golangci-lint warns that the gomodguard linter is deprecated 2026-10-04 15:32:23 +02:00

Closed #88 secret unlocker add pgp always fails on Linux: it gets the long-term key from the keychain stub 2026-10-04 14:42:04 +02:00

Closed #68 Vault names accept . and ..; vault import and the vault part of a cross-vault move skip the vault name check 2026-10-04 13:58:47 +02:00

Closed #54 script/cibuild can report a cached green: docker build serves RUN make check layers from cache 2026-10-04 13:25:25 +02:00

Closed #48 CreatePGPUnlocker leaves a partial unlocker directory on disk when fingerprint resolution fails 2026-10-04 12:58:53 +02:00

Closed #72 secret unlocker select and unlocker remove fail when another unlocker's metadata is corrupt 2026-10-04 12:42:02 +02:00

Closed #41 Cobra prints full usage on internal failures, burying the actual error 2026-10-04 12:08:07 +02:00

Closed #37 GetSecretVersion copies decrypted secrets out of locked memory into plain []byte 2026-10-04 11:16:25 +02:00

Closed #44 Makefile hardcodes a personal remote DOCKER_HOST, breaking make docker for everyone else 2026-10-04 10:42:10 +02:00

Closed #51 checkUnlockerExists fails open: an unenumerable unlockers.d reports "no duplicate" and permits a duplicate unlocker 2026-10-04 10:15:21 +02:00

Closed #40 .gitignore does not exclude secrets, and .dockerignore does not exclude .git 2026-10-04 09:25:01 +02:00

Closed #74 Running secret init again over an existing vault makes its secrets undecryptable 2026-10-04 08:25:42 +02:00

Closed #80 internal/cli tests roughly doubled in run time with the locking change 2026-10-04 08:08:05 +02:00

Closed #78 On a case-insensitive filesystem, secret mv --force Foo foo deletes the secret 2026-10-04 07:42:12 +02:00

Closed #55 Run all linting in Docker via Dockerfile.lint + script/lint 2026-10-04 07:07:53 +02:00

Closed #42 PGPUnlocker.GetID panics on corrupt metadata, and setMnemonicEnv re-exports the mnemonic 2026-10-04 06:42:17 +02:00

Closed #73 secret mv --force onto the same secret deletes it 2026-10-04 05:08:07 +02:00

Closed #34 No file locking and no atomic writes: concurrent or interrupted operations corrupt the vault 2026-10-04 04:57:59 +02:00

Closed #67 secret version rm x ../../.. deletes the vault and beyond: the version argument goes into a path unchecked 2026-10-04 03:25:01 +02:00

Closed #35 memguard lifecycle is not wired up: Ctrl-C and error exits leave key material in locked memory unwiped 2026-10-04 02:07:59 +02:00

Closed #33 Critical: secret rm .. deletes the entire vault; rm/mv/import skip name validation 2026-10-04 01:29:29 +02:00

Closed #36 KeychainData holds the age key passphrase as a plain string through JSON marshalling 2026-10-03 17:07:57 +02:00

Closed #57 docker build . fails at make test (10 MB secret exceeds the build container's locked-memory limit) 2026-10-02 14:16:02 +02:00

Closed #56 Run every build, test and lint step in the Dockerfiles at nice -n 19 2026-09-29 13:12:20 +02:00

Closed #45 script/bootstrap installs golangci-lint unpinned, so local lint diverges from CI 2026-08-10 16:15:02 +02:00

Closed #30 Adopt canonical .golangci.yml and golangci-lint v2.12.2 2026-08-10 16:12:50 +02:00

Closed #31 Decision needed: three commits on main carry vendor advertising trailers 2026-08-09 16:05:48 +02:00

Closed #27 Add .editorconfig 2026-08-07 17:46:27 +02:00

Closed #23 Add branch protection to main branch 2026-03-11 02:24:39 +01:00

Closed #19 Audit: missing user warnings for anomalous conditions 2026-02-20 09:22:30 +01:00

Closed #1 missing metadata file for single unlocker breaks 'list' command 2026-02-20 08:59:04 +01:00

Closed #3 Bug: getLongTermPrivateKey hardcodes derivation index 0 for mnemonic path 2026-02-20 08:58:22 +01:00

Closed #2 secret name validation is wrong 2026-02-20 08:57:20 +01:00

Closed #13 Bug: GetSecret/GetSecretVersion missing name validation allows path traversal 2026-02-20 08:56:51 +01:00

Closed #14 Bug: GetDefaultStateDir ignores UserHomeDir error, may use empty path 2026-02-20 08:54:22 +01:00

Closed #6 Bug: Init command writes longterm.age twice, second write overwrites correct encryption 2026-02-09 02:39:55 +01:00

Closed #4 Bug: NumSecrets() always returns 0 due to incorrect directory traversal 2026-02-09 02:39:30 +01:00

Closed #7 Bug: Non-darwin KeychainUnlocker stub panics instead of returning errors 2026-02-09 02:20:14 +01:00

Closed #5 Security: DecryptWithIdentity leaks plaintext in unprotected memory 2026-02-09 02:18:06 +01:00

99 Issues created by 1 user

Opened #1 missing metadata file for single unlocker breaks 'list' command 2025-11-21 01:51:51 +01:00

Opened #2 secret name validation is wrong 2025-11-21 01:54:00 +01:00

Opened #3 Bug: getLongTermPrivateKey hardcodes derivation index 0 for mnemonic path 2026-02-08 21:01:39 +01:00

Opened #4 Bug: NumSecrets() always returns 0 due to incorrect directory traversal 2026-02-08 21:01:50 +01:00

Opened #5 Security: DecryptWithIdentity leaks plaintext in unprotected memory 2026-02-08 21:02:00 +01:00

Opened #6 Bug: Init command writes longterm.age twice, second write overwrites correct encryption 2026-02-08 21:02:11 +01:00

Opened #7 Bug: Non-darwin KeychainUnlocker stub panics instead of returning errors 2026-02-08 21:02:23 +01:00

Opened #13 Bug: GetSecret/GetSecretVersion missing name validation allows path traversal 2026-02-15 23:01:48 +01:00

Opened #14 Bug: GetDefaultStateDir ignores UserHomeDir error, may use empty path 2026-02-15 23:01:48 +01:00

Opened #19 Audit: missing user warnings for anomalous conditions 2026-02-20 09:01:46 +01:00

Opened #23 Add branch protection to main branch 2026-02-20 11:59:58 +01:00

Opened #27 Add .editorconfig 2026-07-26 20:47:12 +02:00

Opened #30 Adopt canonical .golangci.yml and golangci-lint v2.12.2 2026-08-09 03:33:49 +02:00

Opened #31 Decision needed: three commits on main carry vendor advertising trailers 2026-08-09 03:35:36 +02:00

Opened #32 script/test silently passes on flaky failures, and runs without -race or -timeout 2026-08-09 03:37:31 +02:00

Opened #33 Critical: secret rm .. deletes the entire vault; rm/mv/import skip name validation 2026-08-09 03:38:13 +02:00

Opened #34 No file locking and no atomic writes: concurrent or interrupted operations corrupt the vault 2026-08-09 03:38:51 +02:00

Opened #35 memguard lifecycle is not wired up: Ctrl-C and error exits leave key material in locked memory unwiped 2026-08-09 03:39:22 +02:00

Opened #36 KeychainData holds the age key passphrase as a plain string through JSON marshalling 2026-08-09 03:39:45 +02:00

Opened #37 GetSecretVersion copies decrypted secrets out of locked memory into plain []byte 2026-08-09 03:40:04 +02:00

Opened #38 age identity .String() creates unprotected copies of private keys at six call sites 2026-08-09 03:40:29 +02:00

Opened #39 No confirmation prompt on any destructive operation 2026-08-09 03:40:49 +02:00

Opened #40 .gitignore does not exclude secrets, and .dockerignore does not exclude .git 2026-08-09 03:41:08 +02:00

Opened #41 Cobra prints full usage on internal failures, burying the actual error 2026-08-09 03:41:34 +02:00

Opened #42 PGPUnlocker.GetID panics on corrupt metadata, and setMnemonicEnv re-exports the mnemonic 2026-08-09 03:41:58 +02:00

Opened #43 Go module path is git.eeqj.de/sneak/secret, policy requires sneak.berlin/go/secret 2026-08-09 03:42:14 +02:00

Opened #44 Makefile hardcodes a personal remote DOCKER_HOST, breaking make docker for everyone else 2026-08-09 03:42:32 +02:00

Opened #45 script/bootstrap installs golangci-lint unpinned, so local lint diverges from CI 2026-08-09 03:42:51 +02:00

Opened #46 README missing four required sections; TODO.md is stale and describes completed work as pending 2026-08-09 03:43:16 +02:00

Opened #47 Error messages leak internals and offer no recovery path for corrupted key files 2026-08-09 03:43:37 +02:00

Opened #48 CreatePGPUnlocker leaves a partial unlocker directory on disk when fingerprint resolution fails 2026-08-09 03:44:00 +02:00

Opened #49 Tests assert on error message fragments, never on sentinel identity — error-handling regressions pass silently 2026-08-09 03:46:20 +02:00

Opened #50 Darwin-only code is never compiled, linted, or tested by CI, including both hardware-backed unlockers 2026-08-09 03:46:49 +02:00

Opened #51 checkUnlockerExists fails open: an unenumerable unlockers.d reports "no duplicate" and permits a duplicate unlocker 2026-08-09 04:25:11 +02:00

Opened #52 Test suite cannot meet the 20s policy budget once -race is enabled: internal/cli 100MB boundary tests 2026-08-09 07:03:09 +02:00

Opened #54 script/cibuild can report a cached green: docker build serves RUN make check layers from cache 2026-08-09 07:38:10 +02:00

Opened #55 Run all linting in Docker via Dockerfile.lint + script/lint 2026-08-10 13:14:53 +02:00

Opened #56 Run every build, test and lint step in the Dockerfiles at nice -n 19 2026-09-29 13:02:24 +02:00

Opened #57 docker build . fails at make test (10 MB secret exceeds the build container's locked-memory limit) 2026-10-02 12:13:09 +02:00

Opened #60 Pass the mnemonic in memory instead of the environment, and unset secret environment variables after reading 2026-10-03 14:17:00 +02:00

Opened #66 golangci-lint warns that the gomodguard linter is deprecated 2026-10-03 14:34:43 +02:00

Opened #67 secret version rm x ../../.. deletes the vault and beyond: the version argument goes into a path unchecked 2026-10-03 14:42:10 +02:00

Opened #68 Vault names accept . and ..; vault import and the vault part of a cross-vault move skip the vault name check 2026-10-03 14:42:10 +02:00

Opened #70 vault create on an existing vault re-keys it, making every secret in it undecryptable 2026-10-03 15:02:35 +02:00

Opened #71 Replacing an unlocker is not atomic: a crash part-way leaves it unable to open the vault 2026-10-03 15:02:43 +02:00

Opened #72 secret unlocker select and unlocker remove fail when another unlocker's metadata is corrupt 2026-10-03 16:58:50 +02:00

Opened #73 secret mv --force onto the same secret deletes it 2026-10-03 17:37:18 +02:00

Opened #74 Running secret init again over an existing vault makes its secrets undecryptable 2026-10-03 17:52:28 +02:00

Opened #75 Interrupted commands leave debris: .tmp- leftovers, a vault with no unlocker, an unremovable partial unlocker 2026-10-03 17:52:46 +02:00

Opened #78 On a case-insensitive filesystem, secret mv --force Foo foo deletes the secret 2026-10-04 02:58:57 +02:00

Opened #80 internal/cli tests roughly doubled in run time with the locking change 2026-10-04 05:01:18 +02:00

Opened #88 secret unlocker add pgp always fails on Linux: it gets the long-term key from the keychain stub 2026-10-04 10:32:12 +02:00

Opened #89 A failed keychain or Secure Enclave unlocker add leaves its keychain item or Secure Enclave key behind 2026-10-04 10:32:12 +02:00

Opened #98 Two keychain or Secure Enclave unlockers added in the same minute share an ID 2026-10-04 15:15:39 +02:00

Opened #102 README calls the current-version and current-vault files symlinks and version metadata unencrypted 2026-10-04 17:51:54 +02:00

Opened #105 init or vault create killed mid-way leaves a vault with no unlocker that cannot be created again 2026-10-04 19:08:08 +02:00

Opened #110 make fmt and make fmt-check ignore markdown 2026-10-04 20:59:29 +02:00

Opened #113 One error value per failure: internal/cli duplicates vault errors, some failures have none, two bip85 errors are unreachable 2026-10-04 22:08:12 +02:00

Opened #115 Reading the mnemonic without a terminal says "failed to read passphrase" 2026-10-05 01:08:18 +02:00

Opened #120 make test with -race takes about 214 s; it must fit the 60-second cap 2026-10-06 01:22:57 +02:00

Opened #121 Re-vendor the canonical files from sneak/prompts at dd4027b 2026-10-06 01:30:31 +02:00

Opened #122 go-bip39 no longer exists upstream: copy it into the repo, as keyfunc does? 2026-10-06 02:28:04 +02:00

Opened #124 Compile once, outside the timed test step, so make test with -race fits the 60-second cap 2026-10-06 03:46:30 +02:00

Opened #126 TestRemoveIgnoresTerminalOnStdout can hang until Go's 10-minute test timeout 2026-10-06 20:05:24 +02:00

Opened #129 make test takes over 20 seconds: every run compiles everything with -race 2026-10-07 04:25:36 +02:00

Opened #131 Finish 1.0 and tag it; after that, bugfixes only 2026-10-12 11:11:06 +02:00

Opened #132 Take the keychain and Secure Enclave unlockers out of the build and the release 2026-10-13 00:04:37 +02:00

Opened #133 Keep the macOS research code out of the build and the release 2026-10-13 00:07:17 +02:00

Opened #135 A mnemonic typed with extra whitespace derives a different long-term key, so the vault cannot be recovered with the same words 2026-10-13 00:29:17 +02:00

Opened #136 A secret add --force that fails to unlock the vault still leaves a new version behind 2026-10-13 00:29:40 +02:00

Opened #137 Removing the current unlocker leaves the vault unable to open through its remaining unlocker 2026-10-13 00:29:59 +02:00

Opened #138 secret generate mnemonic, secret vault list and secret unlocker list print their output to stderr, so it cannot be piped or captured 2026-10-13 00:30:12 +02:00

Opened #139 secret vault import cannot succeed on any vault the tool creates, and the mnemonic help points at secret import 2026-10-13 00:30:14 +02:00

Opened #140 A vault with corrupt or unreadable metadata is skipped when choosing the next derivation index, so the next vault gets its key 2026-10-13 00:30:16 +02:00

Opened #141 secret unlocker add pgp without --keyid fails when gpg.conf sets a default-key, because gpgconf prefixes the value with a quote 2026-10-13 00:30:19 +02:00

Opened #142 secret list reports the time of the listing as every secret's creation and last-update time 2026-10-13 00:30:22 +02:00

Opened #143 secret decrypt and secret encrypt truncate the --output file before they can fail, and --input equal to --output destroys the input 2026-10-13 00:30:25 +02:00

Opened #144 The passphrase prompt reads stdin, so secret add --force with a piped value and secret encrypt/decrypt from stdin cannot ask for the passphrase 2026-10-13 00:30:28 +02:00

Opened #145 A secret larger than about half the locked-memory limit crashes secret add, import and generate secret with a panic 2026-10-13 00:30:29 +02:00

Opened #146 A gpg failure is reported as only its exit status; gpg's reason on stderr is dropped 2026-10-13 00:30:39 +02:00

Opened #147 secret info counts only metadata.age, so Total Size leaves out every secret value 2026-10-13 00:30:52 +02:00

Opened #148 secret unlocker list --json prints "unlockers": null when the vault has no unlockers 2026-10-13 00:30:54 +02:00

Opened #149 A secret add --force that fails to unlock the vault still stores the new value as a stray version 2026-10-13 00:30:56 +02:00

Opened #150 secret version list shows STATUS expired for every version that is not current, including ones with no NOT_AFTER 2026-10-13 00:30:57 +02:00

Opened #151 secret init and secret vault create ask for the mnemonic and passphrase before refusing a vault that already exists 2026-10-13 00:31:00 +02:00

Opened #152 Commands that prompt for a mnemonic or passphrase hold the state directory lock while waiting, so other changing commands wait silently 2026-10-13 00:31:01 +02:00

Opened #153 secret version promote --help says it updates the current symlink; current is a plain file 2026-10-13 00:31:03 +02:00

Opened #154 With SB_UNLOCK_PASSPHRASE set, secret unlocker add passphrase gives the new unlocker the old passphrase without asking 2026-10-13 00:31:09 +02:00

Opened #155 secret get ignores a failed write of the value to stdout and exits 0 2026-10-13 00:38:38 +02:00

Opened #156 A currentvault file naming a vault that does not exist makes secret list report an empty vault with exit 0 2026-10-13 00:38:58 +02:00

Opened #157 A wrong passphrase is reported as "no identity matched any of the recipients" with advice to make a new unlocker from the mnemonic 2026-10-13 00:39:00 +02:00

Opened #158 README does not say that secret add drops one trailing newline from the value while secret import keeps it 2026-10-13 00:39:03 +02:00

Opened #159 A cross-vault secret mv whose source could not be removed reports "Moved" and exits 0, leaving the secret in both vaults 2026-10-13 00:39:06 +02:00

Opened #169 Listed times are in the local time zone, not UTC as AGENTS.md requires 2026-10-14 21:32:32 +02:00

Opened #173 Log the audit fixes in TODO.md in one change 2026-10-14 23:15:20 +02:00

Opened #183 An unknown subcommand of vault, unlocker, version or generate prints help and exits 0 2026-10-15 03:15:22 +02:00

Opened #189 A secret mv between vaults asks for the passphrase while holding the state directory lock 2026-10-15 07:32:21 +02:00

Opened #192 make test sometimes fails with a data race on time.Local in cli.Entry 2026-10-15 17:07:34 +02:00

Opened #195 The commandWait comment names a 30-second test limit that no longer exists 2026-10-15 18:43:10 +02:00