Show HN: Current – Change control for AI agents (Elixir) A developer released Current, an open-source Elixir tool that gives AI coding agents change control by restricting them to producing proposals rather than acting directly, with nothing applied until a human approves. Current confines agent reads to files permitted by its read policy, limits proposals to nine typed intents, runs only allowlisted commands, and records every step in a hash-chained log that can be rebuilt on another machine. The project is described as early-stage, single-node and limited to local projects, and its author states it is not a sandbox or an authentication system, since approved commands run with the runtime's privileges. Change control for AI agents Agents propose changes. Current validates them, waits for your approval, applies them, and records every step in a tamper-evident log. The Elevator Pitch the-elevator-pitch · See it in action see-it-in-action · Quickstart quickstart · How it works how-it-works · Provenance provenance-from-a-change-back-to-the-request · Reproducibility reproducibility-replay-the-record-anywhere · Verifiability verifiability-a-hash-chained-history · Architecture architecture · Intents intents · CLI cli-reference · HTTP API http-api · MCP mcp · Configuration configuration · Security security · Status what-exists-today · Roadmap roadmap Why not just use Claude Code or Codex? You can. But there, the agent acts and you approve step by step as it goes. In Current, the agent can’t act at all. It hands over a complete proposal, and nothing happens until that proposal is approved and applied. - Safety : The agent is limited to doing just one thing -- producing proposals . It sees only the files it asks for that Current's read policy permits, and can only propose changes from nine typed intents. Nothing touches your project until you approve it, and only allowlisted commands can run. - Verification : You don’t take the agent’s word for it. You review the exact proposal, or have other agents review it, before anything happens, and Current checks the agent’s claims against what actually ran. - Provenance : As agents write more of the code, someone will ask why was this changed, and who approved it? Current answers from a commit log: the oldest, best-tested idea in systems. That log is hash-chained, so changes to past history are detectable, and the full state can be rebuilt from it on another machine. Status: early. Single node, local projects. Current is not a sandbox or an authentication system: approved commands run with the runtime's privileges. See Security security and the threat model https://github.com/santosh79/current/blob/main/docs/threat model.md . Ask Current to add CSRF protection to the included Next.js example: current run "add CSRF protection to this app" \ --dir examples/nextjs-auth \ --model openai:gpt-5.6-sol The model never gets the repository. It sees the layout and asks for what it needs, and Current fetches each file: … round 1: the model asked to see 8 things ✓ read file app/api/login/route.ts 769 B ✓ read file lib/auth.ts 626 B ✓ read file lib/rate-limit.ts 2.4 KB ✓ read file tests/login.test.ts 847 B ✓ read file tests/rate-limit.test.ts 2.3 KB ✓ read file package.json 343 B ✓ read file tsconfig.json 221 B ✓ read file .gitignore 83 B Reads are confined to the project. Dependencies, build output, .git and .env files are never shown to the model, and every read is recorded. Then it returns a proposal: Agent produced proposal proposal sha256:672c4973787b… The login route already invokes a missing CSRF validator before parsing credentials. Implement that validator with fail-closed same-origin Origin checking and add focused coverage for accepted and rejected origins. PROPOSED 1 WriteFile lib/csrf.ts 2 WriteFile tests/csrf.test.ts 3 RunCommand npm test 4 Report Add fail-closed same-origin CSRF validation for the login route and unit tests covering valid, absent, malformed, and cross-origin headers. ✓ Proposal decoded ✓ Proposal validated Waiting for approval. Nothing has been applied. The agent has proposed a change. Your project is untouched. Review the exact files and commands, or pass the machine-readable version --json to another agent for a second opinion: current review sha256:672c4973787b Then decide. Send it back with feedback, and the model reads more and returns a new proposal: current revise sha256:672c4973787b -m "add a test for a missing Origin header" Or approve it. Approval is recorded, but nothing runs yet: current approve sha256:672c4973787b -m "LGTM" ✓ Approved sha256:672c4973787b message LGTM Nothing has been applied. Apply it with: current apply sha256:672c4973787b Applying is its own step. Current, not the agent, writes the files and runs the command: current apply sha256:672c4973787b ✓ Proposal approved ✓ Workflow completed MODE: APPLY 4 effects executed. Inspect current events sha256:1429719b7546 current proposal sha256:672c4973787b current artifact sha256:fb30687f1722 raw model output Every step above, from the request and each file the model read to its raw reply, the approval and each effect's output, is now part of the workflow's record. current events prints it. - Elixir 1.19 on Erlang/OTP mise.toml pins OTP 28.5 and Elixir 1.19.5; run mise install if you use mise https://mise.jdx.dev/ - git , make , and bash - An OpenAI or Anthropic API key git clone https://github.com/santosh79/current.git cd current mix deps.get mix compile make client In one terminal, export a key and start the server. It listens on 127.0.0.1:4000 and prints every request and commit as it happens. export ANTHROPIC API KEY="..." or OPENAI API KEY export CURRENT ALLOWED COMMANDS=npm commands are denied unless allowlisted bin/current-server In another terminal, from the repository root: export PATH="$PWD:$PATH" puts the local current CLI on PATH current models the models your keys give you MODEL="openai:gpt-5.6" replace with a model listed above current run "add CSRF protection to this app" \ --dir examples/nextjs-auth \ --model $MODEL run stops when the proposal is waiting for review. Output varies between models and runs. Use plan instead of run for a proposal that can be reviewed but never applied. current review