Say it once. Hear back when it's done.
Ducter is a personal AI you run yourself. You talk to one partner. It hands the real work to Claude Code and Codex on your own computers, on the plans you already pay for, and comes to you only when a decision is truly yours.
The Mac app download is coming soon. The source builds today.
Open source under Apache 2.0. Runs on your Mac or a server you own, with Claude Code or Codex, in English or 中文.



~/dev/hawdb, then tell me.checkpoint_recovery flakes, and fix it on its own branch.CI is fixed. checkpoint_recovery slept a fixed 50 ms for the flush, too short on a busy machine. It now waits for wal.wait_durable(seq).
Silence means it's going fine.
Tasks run in the background. You hear back when one is done, or when a decision is truly yours, and every decision arrives with a default, so not answering is an answer too.
- Go, Hold, or Reply. Press Go, ask it to wait, or answer in your own words.
- Or let the default happen. It only applies on its own when it can be undone.
- Done comes with proof: what changed, and how it checked.



OAR 0.96 changed the steer API; 3 calls in the runner need to follow. Change them now?
If you don't answer, I'll change them in 30 min. It can be undone.




Your computers. Your plans.
Ducter lives on your Mac, or on a server you own. Every task runs there in its own git worktree and branch, on the Claude Code or Codex sign-in you already have. There's no Ducter cloud in the middle.











You can also add



Browse the web
Lets this Mac get things done on the web in Ducter's own browser: look things up, read pages, gather what it finds. Signing in, submitting and paying are always left to you.
One thumb is enough.
Only decisions earn a push, and they wait out your quiet hours. Each one carries a default, so you can answer from the lock screen, or let the default happen and read about it over coffee.
Quiet hours run 23:00 to 08:00 unless you change them. Two decisions waiting? Go on all defaults answers both. A phone connects once, with a one-time code.

The rerun passes, but the branch is 23 commits behind main. Rebase before merging? Default: rebase, in 30 min.
It asks before anything leaves.
No pop-up for every command. Each task holds only what it needs, everything that goes out is written down in plain words, and a few things are never its call.
- It never signs in as you.You sign in on its screen; it picks up from there.
- It never pays.Not once, and no rule can change that.
- It never reaches other people without asking.Emails, posts, PR comments and pushes to shared branches wait for your Go.
git push -u origin ducter/fix-ciRan: its own branchgh pr create --draft "Fix flaky checkpoint_recovery"Asked you; you said Gogit push origin mainWaits for you, alwaysemail: load-test numbers → a HawDB contributorAsks first, 30 s to undosign in to github.comYours to dopay: renew a domainNever Ducter's call
Open anything. Any time.
Most days you never leave the conversation. When you want the wheel, On hand shows every task at a glance, and any task opens into one page: what came of it and how it knows, what it did step by step, the changed files with each diff a tap away, and a box to talk to it directly.

The flaky checkpoint test is fixed.
Rebased; all 412 tests pass and CI is green. The cause was a fixed 50 ms sleep in the test, now a wait for durability.
What it did
- What Ducter asked forFind out why HawDB #1592's CI fails, and fix it.
- › Ran 3 commands
- All three failures are in
checkpoint_recovery: it sleeps a fixed 50 ms for the flush. - › Edited 1 file
- Progress saved · Confirmed flaky; wait for durability
- Told Ducter · needs you to decideThe rerun passes. But the branch is 23 commits behind main: rebase before merging?
- › Ran 3 commands
Changes 1 file +3 −3
let wal = Wal::open(&dir, WalOptions::fsync_each())?; let seq = wal.append(b"hello")?;- std::thread::sleep(Duration::from_millis(50));+ // wait for the flusher instead of a fixed sleep+ wal.wait_durable(seq)?; crash_and_reopen(&dir)?; assert_eq!(recovered.last_seq(), seq);
It remembers you.
With Nowledge Mem, your partner starts with the identity and context you already keep there, shared with the other AIs you use. Switch models whenever you like; it's still the same partner.
Yours, all the way down.

Open source
Apache 2.0. Read every prompt, every adapter, every line that touches your work.

Self-hosted
Your Mac, or a Linux server you own. The record of everything lives in one SQLite file on it.


No lock-in
Your Claude Code and Codex subscriptions, through their own official apps. Bring whichever you have.
Get Ducter
You need Claude Code or Codex installed and signed in. Ducter checks the rest and tells you the one thing to fix, if anything.
The repository opens to the public soon. Until then, these are the exact steps it will take.
The signed, notarized download is coming soon. Until then, build it in one step:
$ git clone https://github.com/wey-gu/ducter && cd ducter # builds dist/Ducter.app and a .dmg $ scripts/make-app.sh
Open Ducter.app. It checks your Mac, then opens the conversation. Closing the window doesn't stop it.
# puts `ducter` in ~/.local/bin $ scripts/install.sh # every missing piece comes with its fix $ ducter doctor # starts your partner $ ducter up
ducter status shows tasks and open decisions right in your terminal.
# on your Mac $ scripts/install.sh --linux ducter-linux # on the server $ sh ducter/install.sh --service # a one-time code for your Mac or phone $ ducter pair
Keeps your partner awake while your Mac sleeps. It listens on 127.0.0.1 only; reach it through your own domain or an SSH tunnel.


Say it once.
Then get on with your day. Ducter will be here when it's done.