ITADN
ojhermann-org/stevedore
README.md

stevedore

A stevedore moves cargo between vessels; stevedore moves secrets between stores. It's a Rust workspace with three crates: a library, a CLI, and an MCP server.

Stores

🟢 working · 🟡 in progress · 🔵 planned · 🔴 not planned

StoreReadWrite
Dashlane🟢🔴
Proton Pass🔵🟢

Moving secrets

Both stores' own CLIs must already be installed and logged in — stevedore never authenticates. See docs/dcli/ and docs/pass-cli/.

# what would change — writes nothing:
stevedore move --to-vault "My Vault"

# carry it out:
stevedore move --to-vault "My Vault" --apply

A move creates items; it never updates or deletes one. It passes over anything already in the vault under the same title and kind, so a move that is repeated, or resumed after an interruption, does not leave duplicates.

Two things it reports rather than decides: logins whose Dashlane note text has nowhere to go in Proton Pass, and items it found in the vault but could not read the state of. Both are listed by title so you can settle them yourself.

What it is (and isn't)

  • A mover. stevedore migrates secret values from a source store to a sink store.
  • Not a resolver. Runtime secret resolution — an app fetching its own key at start-up — is what secretspec does.
  • Safe by default. Secret values redact themselves in logs by construction — passwords, note contents, 2FA seeds and attachment keys alike — and nothing is ever exported to disk. See Keeping secrets safe for how that guarantee is enforced.

Layout

CrateWhat it is
crates/stevedore-secretsThe core library.
crates/stevedore-secrets-cliThe command-line binary.
crates/stevedore-secrets-mcpThe MCP server.

Develop

The dev environment is a Nix flake; direnv loads it on entry.

# one-time, per clone:
cp .envrc.example .envrc && direnv allow   # loads the flake dev shell
git config core.hooksPath .githooks        # arm the git hooks (pre-commit secret scan + pre-push fmt/clippy)

# or without direnv:
nix develop

# then, the usual loop:
cargo test
cargo clippy --all-targets -- -D warnings
cargo run -p stevedore-secrets-cli -- stores

CI runs fmt, clippy, test, and cargo deny check through the same flake.

A note on secrets

stevedore's inputs are your other stores' credentials. They are supplied deliberately for a single run — never committed, never loaded ambiently into every shell. The .gitignore and the .githooks/pre-commit guard exist to keep it that way.

License

Licensed under either of Apache-2.0 or MIT at your option.