addis / harar
harar's client: Harar\vault(). Where each secret may go, and the secret itself for one host only.
Fund package maintenance!
Requires
- php: >=8.1
- ext-json: *
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-11-09 03:23:00 UTC
README
A free, open-source secrets vault for developers and their agents.
- No tokens on disk.
.envfiles and config holdharar://references; the values live in an encrypted vault and are filled in when a command runs. - Real tokens never enter an agent's sandbox. Agents get short-lived credentials, or a broker outside the sandbox adds the real one on the way out.
- OIDC between services. harar issues short-lived identity tokens so services trust each other without shared secrets.
It runs on macOS (Apple silicon and Intel Macs with a T2 chip, where the master key is sealed to the Secure Enclave) and Linux. It works without an account.
Status: early and not yet audited. Don't keep anything in it you can't rotate.
Install
curl -fsSL https://harar-releases.addis.gg/install.sh | sh
It installs harar into ~/.harar/bin, checked against the SHA-256 in the
release's manifest, with no sudo. Builds: macOS (Apple silicon and Intel) and
Linux x86_64. sh -s -- --canary installs the newest build of main.
From your code
The harar binary is the server. Programs talk to it through a client on its
local socket; the clients hold no secrets.
- Rust: the
hararcrate,harar = "0.3". - JavaScript and TypeScript: the
hararnpm package. - Python: the
hararPyPI package,pip install harar. - Ruby: the
harargem,gem install harar. - PHP: the
addis/hararComposer package,composer require addis/harar. - Go: the
github.com/addiscorp/harar/gomodule,go get github.com/addiscorp/harar/go.
Each one resolves harar:// references, the way 1Password's SDKs resolve
op:// ones, from the agent on your machine with no account or token:
import { vault } from 'harar' const key = await vault().secrets.resolve('harar://prod/shop/STRIPE_KEY')
All of them publish from a stable release, at its version.
An edge, for services off your network
harar edge puts an always-on harar API in your own Cloudflare, Vercel or
Supabase account, so a service on Railway or Vercel can resolve harar://
references with a narrow service token. Every request is logged to a sink
you choose, best in another account. See docs/edge.md.
harar edge init --cloudflare # writes ./harar-edge; deploy it with wrangler harar edge pair https://harar-edge.<you>.workers.dev --dir harar-edge harar edge put prod/shop/STRIPE_KEY harar edge token create railway-shop --read 'prod/shop/*'
Build
cargo build --release --locked
server/ is the binary (package harar-server); client/ is the harar crate.
Run a primary
A primary holds one org's vault and policy and issues its tokens. The OS user
named by --owner-user speaks as the owner; everyone else is refused until
the owner maps them.
The Postgres connection string lives in a file only the primary's user can
read (0600), so a password never shows in ps.
sudo harar serve --org gg.addis --machine bugsy \ --owner gg.addis.human.sami --owner-user sami \ --postgres-file /var/lib/harar/postgres \ --master-key-file /etc/harar/master.key harar policy show harar policy role set gg.addis.role.site --read 'prod/site/*' \ --token 'https://api.simien.dev deploy:site' harar policy bind gg.addis.service.site --role gg.addis.role.site --zone gg.addis.zone.bugsy harar policy user map site gg.addis.service.site harar policy test --actor gg.addis.service.site --read prod/site/DATABASE_URL harar token --aud https://api.simien.dev --scope deploy:site
See docs/architecture.md for the model.