IronStorage

IronStorage is a native client for pass and pass-otp.

pass stores entries as GPG-encrypted .gpg files in an ordinary directory tree (normally ~/.password-store), selects one or more recipients through .gpg-id files, and can track changes in Git. IronStorage keeps that format and the first-party pass command behavior. pass-otp compatibility adds otpauth:// secrets, OTP generation, and QR import/export.

The compatibility target includes init, list/show, find/grep, insert/edit, generate, remove, move/copy, and Git-backed commit and synchronization flows. Remote endpoints are typed in the storage crate as credential-free HTTPS or feature-gated SSH. HTTPS synchronization uses server/application credentials kept in the operating system's secure store; SSH transport dependencies and runtime are compiled only with the optional ssh Cargo feature. The standard CLI, TUI, and desktop applications enable it; the Apple bridge keeps it disabled unless an Apple target explicitly opts in.

The central ironstorage Rust crate owns repository access, Git, GPG-compatible encryption and key handling, entries, OTP, synchronization, and platform-secure credential orchestration. Applications are presentation and interaction adapters only. Runtime subprocesses—including pass, git, and gpg—are forbidden; compatibility is implemented in Rust.

IronStorage is MIT licensed. Dependency licenses and the completed packaging review are tracked in DEPENDENCIES.md.

The shared TOML schema, path rules, editor precedence, and Git remote formats are documented in docs/configuration.md. Embedded Git, HTTPS synchronization, merge behavior, and commit signing are documented in docs/git-synchronization.md. The complete SSH lifecycle, failure, algorithm, dependency, target, and release matrix is documented in docs/ssh-transport-audit.md. Native credential storage, opaque secret references, user-presence policy, and bounded caching are documented in docs/secure-secret-storage.md. Shared authentication generations, explicit user activity, inactivity expiry, and relock cleanup are documented in docs/authentication-leases.md. Clipboard cleanup/race behavior and platform-neutral QR rendering are documented in docs/presentation.md. Pass-OTP URI compatibility, RFC code generation, and atomic HOTP counters are documented in docs/otp.md. The complete command matrix, shell completion interface, deliberate no-process differences, and executable security audit are documented in docs/cli-parity.md. The Mutt-inspired terminal interaction model, default keys, and complete TUI operation matrix are documented in apps/tui/COMMANDS.md. Desktop parity, native platform smoke checks, accessibility limitations, and the executable security audit are documented in docs/desktop-audit.md. Lossless structured entry fields, semantic/sensitivity metadata, conflict tokens, and atomic frontend saves are documented in docs/entry-documents.md. The capability-scoped password-store layout and atomic mutation guarantees are documented in docs/repository-core.md. The embedded OpenPGP backend, exported-key model, secret-provider boundary, and GnuPG compatibility evidence are documented in docs/cryptography.md. Hierarchical .gpg-id resolution, signed policies, selective reencryption, and the rollback/commit contract are documented in docs/recipient-policies.md. Typed list/show/find/decrypted-grep models and secret presentation selection are documented in docs/read-domains.md. Insert modes, concurrency-safe edit sessions, and the secure CLI editor-file boundary are documented in docs/write-domains.md. Unbiased password generation, character-set validation, in-place replacement, and presentation actions are documented in docs/password-generation.md. Rollback-safe remove, move, and copy transactions, destination rules, and selective subtree reencryption are documented in docs/tree-mutations.md.

Project layout

crates/storage  password-store domain and storage library
crates/apple    UniFFI boundary for Apple presentation code
apps/cli        pass-compatible command-line frontend
apps/tui        Ratatui frontend
apps/desktop    Iced desktop frontend for macOS, Windows, and Linux
apple/          iPhone, AutoFill, and watchOS presentation targets

The Apple project is generated with XcodeGen:

cd apple
xcodegen generate

Apple App Store metadata, archive verification, submission, and paired iPhone and Watch release checks are documented in apple/AppStore/DISTRIBUTION.md.

Building

Install a stable Rust toolchain satisfying the workspace manifest (Rust 1.92 or newer) before building. Commands below run from the repository root unless they explicitly change directory. Cargo places debug artifacts in target/debug/ and optimized artifacts in target/release/.

Build every Rust crate and application in debug or release mode:

cargo build --workspace
cargo build --workspace --release

Build one frontend at a time:

# pass-compatible CLI: target/{debug,release}/ironstorage
cargo build --package ironstorage-cli
cargo build --package ironstorage-cli --release

# Ratatui terminal UI: target/{debug,release}/ironstorage-tui
cargo build --package ironstorage-tui
cargo build --package ironstorage-tui --release

# Iced desktop UI: target/{debug,release}/ironstorage-desktop
cargo build --package ironstorage-desktop
cargo build --package ironstorage-desktop --release

On macOS, install cargo-packager once, then build an application bundle or install the release bundle directly into ~/Applications:

cargo install cargo-packager --locked
cargo bundle-macos
cargo bundle-macos --out-dir "$HOME/Applications"

The first bundle command writes target/release/IronStorage.app. The install form replaces ~/Applications/IronStorage.app with the freshly built bundle. The bundle contains the matching ironstorage CLI and ironstorage-tui binaries; Settings can install links to them in ~/.local/bin. All three bundled applications support configured HTTPS, ssh://, and scp-like SSH remotes through the same storage-owned transport selection.

Build only the shared storage library or the Rust Apple bridge:

cargo build --package ironstorage --lib
cargo build --package ironstorage --lib --release
cargo build --package ironstorage-apple --lib
cargo build --package ironstorage-apple --lib --release

The iPhone application, AutoFill extension, and watchOS companion require macOS, Xcode, XcodeGen, and the Rust Apple targets used by apple/build_rust_core.bash. Generate the Xcode project after cloning or after changing apple/project.yml, then build the simulator configuration. The Xcode pre-build phase selects the matching Rust debug or release profile.

cd apple
xcodegen generate

# Debug simulator build
xcodebuild -project IronStorage.xcodeproj -scheme IronStorage \
  -configuration Debug -sdk iphonesimulator build CODE_SIGNING_ALLOWED=NO

# Release simulator build
xcodebuild -project IronStorage.xcodeproj -scheme IronStorage \
  -configuration Release -sdk iphonesimulator build CODE_SIGNING_ALLOWED=NO

For a signed device or archive build, select the desired application target in Xcode and configure the development team and signing identities there.

Description
a rust implementation of the pass password storage format (git repol with gpg encrypted files).
Readme MIT 16 MiB
Languages
Rust 78.7%
Swift 17.7%
C 3.1%
HTML 0.3%
Python 0.2%