···1212- Remove bearer token authentication fallback from AppView (#109)
13131414### Added
1515+- Update docs for security hardening and opake-derive crate (#131)
1516- Add inbox CLI command for discovering shared grants via appview (#128)
1617- Add inbox CLI command for discovering shared grants via appview (#128)
1718- Audit workspace dependencies for consolidation and upgrades (#110)
+5
CONTRIBUTING.md
···3838 - SQLite storage (WAL mode)
3939 - Axum API with DID-scoped Ed25519 auth
4040 - rate limiting via tower_governor
4141+4242+opake-derive proc-macro crate
4343+ - #[derive(RedactedDebug)] with #[redact] field attribute
4444+ - generates Debug impls showing byte length instead of content
4545+ - used by opake-core (ContentKey, Session) and opake-cli (Identity)
4146```
42474348`opake-core` must never depend on filesystem, stdin, or any platform-specific API. All I/O happens in the binary crates.
+2-1
README.md
···96969797## Architecture
98989999-Three crates:
9999+Four crates:
100100101101- **`opake-core`** — platform-agnostic library (compiles to WASM). Encryption, records, XRPC client, document operations.
102102- **`opake-cli`** — thin CLI wrapper. Config, session, identity persistence.
103103- **`opake-appview`** — Axum-based indexer and REST API. Jetstream firehose consumer, SQLite storage, DID-scoped Ed25519 auth.
104104+- **`opake-derive`** — Proc-macro crate. `RedactedDebug` derive macro for secret-safe Debug output.
104105105106See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the encryption model, crate structure, and design decisions. See [docs/FLOWS.md](docs/FLOWS.md) for sequence diagrams of every operation.
106107
+12-1
docs/ARCHITECTURE.md
···151151 index.rs Indexer only
152152 serve.rs API only
153153 status.rs Print cursor + stats
154154+155155+ opake-derive/ Proc-macro crate (RedactedDebug derive)
156156+ src/
157157+ lib.rs #[derive(RedactedDebug)] + #[redact] attribute
154158```
155159156160The boundary is strict: `opake-core` never touches the filesystem, stdin, or any platform-specific API. All I/O happens in the binary crates. This keeps `opake-core` compilable to WASM for the future web UI.
···267271 accounts/
268272 <did>/
269273 session.json JWT tokens
270270- identity.json X25519 + Ed25519 keypairs (plaintext for MVP)
274274+ identity.json X25519 + Ed25519 keypairs (0600, checked on load)
271275 keyrings/
272276 <rkey>.json Group keys for each keyring (per-rotation)
273277```
···275279Group keys are stored locally because they never appear in plaintext on the PDS — only wrapped copies exist in the keyring record. Each keyring file holds an array of `{ rotation, group_key }` entries so that keys from previous rotations remain available for decrypting older documents. Legacy files (single `group_key` without rotation) are auto-migrated to rotation 0 on read.
276280277281The `--as <handle-or-did>` flag overrides the default account for any command. Future improvement: seed phrase derivation for the keypair instead of storing it in plaintext.
282282+283283+## File Permissions
284284+285285+All sensitive files (identity, session, config, keyring keys) are written with
286286+0600 permissions. Directories are created with 0700. Loading `identity.json`
287287+checks permissions and bails with a `chmod 600` hint if the file is
288288+group- or world-readable, matching SSH's `StrictModes` behavior.