Show HN: Laptop is the last place your secrets are still in plaintext

Aug 16, 2026 01:55 PM - 2 hours ago 2

Just-in-time credentials for your dev machine.

Documentation · Quickstart · Supported tools · Command reference · Security

Status: macOS-only (Apple Silicon), and still successful development.

Your secrets unrecorded successful plaintext each complete your machine: .env files, ~/.aws/credentials, ~/.zshrc exports, .npmrc tokens, MCP configs. Anything running arsenic you tin publication them. A bad curl | sh, a sketchy npm install, aliases one of the AI agents now moving successful your editor pinch your afloat permissions.

jit moves each concealed into a section encrypted vault gated by Touch ID, and rewrites the files truthful your devices support working. On disk there's now a decoy. The real worth only appears, successful memory, for the circumstantial process that asked for it, after a biometric prompt. The result: you unlock once, jit asks earlier handing a credential to a instrumentality (or an agent), and there's a decoy connected disk the remainder of the time.

brew instal jitpass/tap/jitpass

Or without Homebrew:

curl -sL https://dl.jitpass.com/jitpass/jit/releases/latest/download/jitpass_darwin_arm64.tar.gz | tar -xz jit sudo mv jit /usr/local/bin/

Apple Silicon only — connected an Intel Mac, build from root with go instal github.com/jitpass/jit/cmd/jit@latest.

Pick 1 route. If you installed from the tarball earlier and are switching to Homebrew, region the aged transcript aft the brew instal (sudo rm /usr/local/bin/jit); different 2 jits beryllium connected PATH upgrading separately, and jit expert will emblem it.

Releases are signed pinch a Developer ID and notarized by Apple, truthful some paths run without a Gatekeeper prompt: Homebrew quarantines its downloads and Gatekeeper clears them against the notarization ticket, while curl (and spell install) group nary quarantine emblem astatine all. To cheque what you sewage alternatively than take our connection for it, tally jit expert — its jit statement reports signed CZC6BH93GJ, utilizing the aforesaid cheque jit upgrade runs earlier it will install anything.

Upgrading: brew upgrade jitpass, aliases jit upgrade — a verified self-update (Developer-ID signature and checksum some checked earlier the swap, restarts the service). Either measurement your vault is untouched.

Homebrew installs ammunition completion pinch the binary, truthful jit <TAB> completes subcommands, flags, vault paths, and wrappable instrumentality names retired of the box. Installed from the tarball aliases from source, adhd it yourself:

echo 'source <(jit completion zsh)' >> ~/.zshrc && exec zsh

Either way, jit expert tells you if completion isn't reaching your shell.

jit scan # read-only. changes nary record it scans, prints nary existent value. jit vault init # make the vault (master cardinal successful your login keychain) jit migrate --dry-run # preview the full machine-wide hole plan jit migrate # use it: shows plan, asks [y/N], 1 Touch ID jit migrate ~/code/myapp # aliases hole conscionable 1 project jit tally -- npm tally dev # tally your tool; existent values injected into that process only

jit scan pinch nary way sweeps your full location directory, truthful springiness it a infinitesimal on a ample one. To spell consecutive astatine 1 place, constituent it astatine a path: jit scan ~/.aws.

Day to time it's mostly jit tally -- <cmd>. For CLIs that transportation their ain login token (gh, glab, stripe, and more) you jit wrap gh erstwhile and past keep typing gh arsenic normal forever.

Not judge whether thing needs jit wrap, jit migrate, aliases nothing? You don't person to know. jit scan splits everything it finds into what jit will protect (one bid - the wraps included) and what only you tin fix, and bare jit migrate runs that full plan:

$ jit scan YOUR SECRETS: 7 — 0 protected by jit (0%) ▱▱▱▱▱▱▱▱▱▱ to 100%: 1 bid +71% · 2 secrets only you tin hole +29% jit will protect these — 5 secrets successful 4 files, 0% → 71% → jit migrate ~/.zshrc STRIPE_API_KEY, DB_PASSWORD ~/.config/gh/hosts.yml GitHub CLI token · wraps gh ... only you tin protect these — 2 secrets, 71% → 100% [rotate, past delete each copy] ! A accumulation database password successful 2 files → rotate it now, past delete each copy

(jit scan --full still gives the classical per-category inventory with severities, including the Wrappable CLI Tokens section.)

Migrate the credential once, past support utilizing the instrumentality the measurement you ever have.

# AWS (and Terraform, and each AWS SDK) jit migrate ~/.aws/credentials # keys move to the vault; nary plaintext record left aws s3 ls # resolves from the vault connected demand. nary prefix, nary flag. terraform use # aforesaid creds, aforesaid command # GCP application-default credentials (a machine-wide credential) jit migrate ~/.config/gcloud/application_default_credentials.json terraform use # google supplier sounds ADC; useful aft a Touch ID prompt # Docker / docker-compose jit migrate ~/.docker/config.json # registry logins move to the vault jit tally -- docker constitute up # jit injects them for this run docker login ghcr.io # still works; the helper stores to the vault # Shell exports that utilized to beryllium successful ~/.zshrc jit migrate ~/.zshrc # leaves a one-line hook; caller shells conscionable person the vars ./deploy.sh # scripts that publication those vars activity unchanged # Tokens you erstwhile typed astatine the prompt, now sitting successful your ammunition history jit migrate ~/.zsh_history # each 1 moves to the vault; your commands stay, the secrets don't jit defender history # and extremity the adjacent 1 being recorded astatine each (zsh) # (bare `jit migrate` offers this too, successful the scheme it asks you to confirm) # A CLI that carries its ain token (gh, stripe, glab) jit wrap gh # 1 time gh pr database # token injected per call, forever

The first clip each instrumentality reaches for a existent credential, jit asks erstwhile and remembers your reply until the vault locks. See Two Touch ID moments for really that sits connected apical of the vault unlock, what --trust does, and really to turn the per-tool prompts off.

Why do immoderate devices request nary setup while others return a jit run? One rule: can the instrumentality inquire jit for the concealed itself? AWS (via credential_process), your shell astatine login, and docker's registry logins (via a credential helper) each can, so you type thing extra. Tools that only publication a record astatine runtime (docker compose, plain SDKs) can't ask, truthful jit tally hands them the value.

The machine-global credential files (GCP ADC, sops, npm, netrc) activity the same mundane way: tally your instrumentality and o.k. the per-process prompt. Add jit tally --with <name> only erstwhile you want it explicit: for scripts and CI wherever there's no punctual to answer, aliases erstwhile you want a difficult gross a project's ain config can never reach. Supported tools lists precisely what to type for each tool, and really each is delivered.

Two Touch ID moments, not one

jit asks for your fingerprint astatine 2 different moments, doing 2 different jobs:

  1. Unlocking your vault. The first clip you usage jit aft it locks, one Touch ID opens the vault for the full convention (5 minutes of activity, past it re-locks; and ne'er longer than 8 hours, nevertheless engaged you are). You unlock once, not erstwhile per command.
  2. Handing a credential to a tool. On apical of that, the first clip a given tool reaches for a existent credential, jit asks earlier handing it complete and names what's asking. This is what stops a programme you didn't tally from quietly using your keys while the vault is open.
$ aws s3 ls Touch ID -> unlock your vault # gross 1: opens the vault for 5 min Touch ID -> aws wants your aws credential # gross 2: this tool, this credential ...your buckets... $ aws s3 cp ./file s3://bucket/ # aforesaid tool, aforesaid session: nary prompt $ terraform apply Touch ID -> terraform wants your aws credential # a different tool: it asks connected its own

Gate 2 is what keeps an unlocked vault from being a free-for-all: moreover after you've utilized aws yourself, a sketchy npm instal reaching for those aforesaid keys still triggers a punctual naming it, truthful you tin opportunity no.

Don't want the 2nd gate? Turn it off; the vault fastener stays (turning it off itself takes a Touch ID, since it reopens the model it closes):

jit work consent disconnected # devices resoluteness silently while the vault is unlocked jit work consent connected # inquire per instrumentality again (the default)

Kicking disconnected thing that needs respective credentials astatine once? jit tally --trust -- terraform use approves that full run's devices successful 1 gesture. Full details: per-process consent.

Leaving the keyboard? Approve the activity earlier you go

Both gates presume a quality is location to answer. An AI supplier moving overnight, a long build, a scheduled job: the surface locks, the convention drops, and the run stalls connected a punctual cipher will see. A process grant moves your decision earlier alternatively of removing it - 1 Touch ID, fixed while you're still there, that names precisely what you're signing:

$ jit assistance --process claude --profile jamf --for 8h Touch ID -> fto claude nether iTerm2 usage 2 secrets (jamf) unattended for 8h ✓ granted g-7f3a2c81 claude -> jamf until 17:42 └ covers claude nether iTerm2: 1 moving now, immoderate started earlier 17:42

For the adjacent 8 hours, each claude nether the terminal you typed that in (and what it launches) gets those secrets pinch nary prompts - done surface lock and all, including sessions you commencement later: a caller tab, the adjacent claude, a script that fires astatine 3am. It's your terminal being named, not a sanction being trusted: a programme calling itself claude location other connected the machine doesn't descend from that character and inherits nothing. The assistance ends astatine its deadline, erstwhile you discontinue that terminal, aliases the infinitesimal you type jit assistance revoke (which needs nary fingerprint - taking entree distant is ever free). Want one nonstop process instead, gone erstwhile it exits? --pid. Every service lands in the audit way arsenic its ain event, truthful the greeting aft you tin publication exactly what your supplier touched while you slept. Full details: process grants.

The audit trail: what happened, and who did it

Every jit bid and each unlock lands successful a durable log you publication backmost with jit audit, newest first, 1 key=value statement per event, truthful it greps for illustration a real work log. Command arguments are masked, truthful the log proves a bid ran without ever storing the concealed it carried.

$ jit audit --since 1h time=2026-07-24 10:15:04 level=info kind=cmd status=ok dur=312ms cmd="jit migrate ~/.aws/credentials" user=meni parent=claude time=2026-07-24 10:16:22 level=info kind=use op="read a secret" cmd="aws s3 ls" parent=claude secrets=aws/default time=2026-07-24 10:31:09 level=warn kind=unlock status=denied method=touchid-or-passcode cmd="node postinstall.js" parent=npm secrets=aws/default

The mediate statement is the communicative jit exists to tell: aws/default was publication by aws s3 ls, launched by claude. The past is simply a punctual you declined: a node postinstall.js nether npm reaching for those aforesaid keys, refused. jit besides logs what the work turned distant astatine its socket (a process the kernel says isn't yours, probing the agent) arsenic kind=error.

Narrow it pinch flags alternatively of grep: --kind, --status ok|failed|denied, --since/--until (an property for illustration 2h/3d aliases a date), --parent claude, --secret aws, --user, --grep <regexp>. Add --follow (-f) to watercourse new events unrecorded for illustration tail -f, aliases --format json for a machine-parseable dump. Both halves are durable files beside the vault, truthful it answers for past week arsenic readily as the past hour.

.env files, ammunition exports, AWS and Terraform, kubeconfig, Docker registry logins, GCP ADC, .npmrc / .netrc tokens, MCP server configs, bare token files, credentials recorded successful your ammunition history, wrappable CLIs (gh, stripe, vercel, …), and SSO CLIs that mint credentials astatine login (clisso). In each lawsuit the record keeps moving and the existent worth comes from the vault connected demand.

The afloat catalog, grouped by precisely what to type for each tool, is Supported tools: it tracks the codification arsenic devices are added or removed. Anything not listed tin still beryllium wrapped with jit wrap add.

jit ne'er destroys a credential. Migrate moves the worth into the vault and leaves a working hook wherever it was (a decoy .env, an eval "$(jit export)" line successful your ammunition config, credential_process = jit … successful ~/.aws/config, aliases a PATH shim), truthful your devices support resolving it connected demand. The credential still exists, conscionable encrypted alternatively of sitting successful plaintext.

And each alteration is reversible. Before rubbing a file, jit backs it up encrypted into the vault, truthful jit migrate undo puts it backmost byte-for-byte:

jit migrate ~/code/myapp # applied the fix, 1 Touch ID # changed your mind, aliases thing broke? jit migrate undo ~/code/myapp # each touched record restored, byte-for-byte

The docs unrecorded nether docs/, organized by task:

  • Quickstart: setup, migrating, surviving pinch the fix, measurement by step
  • How it works: the vault, the service, mounts, and shims successful 1 page
  • FAQ: developer and information questions, answered bluntly
  • Per-process consent: what the per-tool prompts do, and really to tune aliases move them off
  • Process grants: pre-approve a moving instrumentality to activity unattended for a bounded, revocable, audited window
  • Audit trail: publication backmost each command, unlock, and refusal, filterable and followable
  • Command reference: each bid and flag, generated from the CLI
  • Security architecture: the threat exemplary and the honorable limits
  • CONTRIBUTING.md: build/test setup; sign-off via DCO (git perpetrate -s), nary CLA

PolyForm Perimeter License 1.0.0 - free for individual and internal company usage only.

More