Skip to main content
This generates the archive’s AES-256 encryption key, walks you through choosing a storage backend, and writes config.toml. It’s idempotent, so re-running it detects an existing config and key and reuses them unless you pass --force.

Flags

Plus the global --config <FILE>.

What it asks (interactively)

  1. Storage bucket / namespace: default obsidianlog.
  2. Storage backend: local (no Sia node needed) or sia.
  3. If local: local storage directory, default ./obsidianlog-data. If sia: an indexer URL, defaulting to https://sia.storage (the hosted, zero-setup option), then a recovery phrase prompt (type seed to generate a new one) to complete onboarding inline, no separate command needed. See Choosing a Backend for what this actually connects to and when to use a different URL instead.
  4. Ingest server bind address: default 127.0.0.1:7080.
  5. Chunk time window (seconds): default 3600.

Where credentials live

The encryption key and, if you chose Sia, the indexd app key are stored together as one bundled credential (Keychain on macOS, Credential Manager on Windows, Secret Service on Linux), falling back to a 0600 secrets file (~/.obsidianlog/) if the keychain isn’t reachable. It is never transmitted or committed anywhere. A fresh setup means at most one keychain authorization prompt, whether you choose the local or the Sia backend (macOS may skip it entirely once it already trusts the binary). On macOS this uses a direct, “create only” keychain write rather than the usual check-then-write pattern most tools use. See ADR-0015 for why that matters. A config file from before this bundled format (obsidianlog 0.1.x) isn’t migrated automatically: init fails with a clear message telling you to either stay on obsidianlog v0.1.1 to keep reading archives created under it, or pass --force to knowingly start fresh (this rotates the encryption key).

Example

Non-interactive, for scripting: