Duck, my personal SuperAgent, built in Amp
On Nov 1, I saw a very fascinating article about the DeepSeek superagent, and realised I had converged on much of the implementation independently. Here's what I've built.
Duck is my superagent built on Amp. It has access to my machines as runners, and to self-hosted orbs for sandboxing.
I press the action button on my iPhone, talk to Duck in English or Korean, and it does the work on my own machines.
It costs nothing beyond my Claude subscription. It's self-hosted, and I can tune it and adjust the behaviour myself.
Duck mapped onto DeepSeek's super-agent diagram. Tap a box to jump to its section. Dashed boxes are gaps.
1 · What I made
The whole thing on one page
amp -x processThe call path runs on one box with one 8 GB GPU.
First, I call Duck using the action button on my iPhone. It was important to me that the friction to use Duck is as low as possible.
Asterisk: an open-source phone exchange in Docker on my home server. My phone calls it over Tailscale, so there's no phone network involved.
voice.py: the phone line. One pipeline per call that hears me, decides when I've finished, plays a filler, and speaks Duck's reply.
Ears and voice: open-source Qwen3 models on my GPU. They were selected for a balance of performance, speed, GPU limitations, and ability to handle English and Korean.
Relay: passes my exact words to Duck's Amp thread and streams the reply back to be spoken.
Duck: the "router" in DeepSeek super-agent terms.
And the rest of the primitives, plus the site and mobile app (updated a lot since then), which is a specialised surface to monitor, inspect, and interact with my Duck superagent.
The software factory


factoryI check what I can use. I merge often and fix often. Every one has to pass the benches and a Verified: run before it deploys, and unhealthy ones roll back.
duck.doyeong.kim



Swipe for more. A public copy with private items removed.
It's just nice to be able to see what it's doing, from the phase it's at during a call, to the workers it has going, to what's blocked and needs me. Mostly it's to solve the problem of human attention: to direct me to what needs me easily, without having to ask.
The real goal is to give me a reason to use duck.doyeong.kim over Amp when I'm away from home.
Its tactile, holographic look is based on JARVIS from Iron Man. A bit cringe, but it makes me smile every time.
Memory that doesn't run out
This has been hit or miss, to be honest. I have to prompt you to search it sometimes. Possibly due to reasoning effort or poor steering. But if you've seen it in any thread, you can find it.

2 · Why
Talking to Amp
Because it has access to all of my systems, suddenly I can do almost anything from my phone. It actually made me realise that the specific input to the superagent doesn't matter, just that you are able to interact with it at all.
Where the time goes
Over half of every wait is the model thinking, and I'm fine with that. I do not want to interact with anything less than Opus 5.5 medium. Anything less cannot be trusted to handle its own work. And why would I want to work with a superintelligence that's not, well, intelligent?
3 · What I learnt
The phone line
The most annoying part was the latency and feeling of lag, for sure. Specifically:
- Smart Turn was cutting me off while thinking. Out of the box, it was 96–98% sure I'd finished when I'd only paused to think.
- Not being aware when the agent first heard me and received the message: solved with filler phrases. Mostly solved: a filler plays 1.6 s after I stop, and about two thirds of them fit.
- Duck's voice was robotic: solved with a bigger voice model on the GPU. Solved: the fine-tuned voice starts speaking in 0.18 s.
- It needed to recognise my voice print so it can operate in noisy conditions. In a noisy café, it went from catching the end of 1 of my 12 turns to all 12. Solved for noise, and for my car playing Duck's own voice back at it. Still working on telling me apart from other people in the room.
What still hurts is the wait itself: the first real reply takes 11 s (median). Over half of that is the model thinking, and that's a choice.
Fillers
It makes it feel more alive! Yeah, some of the filler phrases were out of context. Fix: MiniLM + TF-IDF + a picker model trained on my real turns and my keypad ratings, running on CPU. It now picks a fitting line about two thirds of the time on my real calls, and 58 of the lines have Korean in them.
Knowing when you've finished
I need it to wait until I'm done, but I don't want to say a phrase. So Smart Turn scores how finished I sound at each pause. If I sound unfinished, like after an "um", it waits 1.85 s instead of 1.2 s. The waits are fitted to my own pauses and re-checked every week.
| Wait if done / not done | Cut-offs | Avg wait |
|---|---|---|
| 1.2 / 1.85 s (live) | 142 | 1.30 s |
| 1.3 / 2.0 s | 118 | 1.40 s |
| 1.4 / 2.2 s | 97 | 1.52 s |
| 1.5 / 2.5 s | 76 | 1.64 s |
A voice that switches languages
I want to be able to talk to my family in Korean confidently. At first it was pronouncing the romanised version of Korean in an Australian accent, which was quite frankly racist. Fixing it took a 12-minute fine-tune on one RTX 4070 Super, and Korean errors halved, from 11.3% to 5.8%.
Before: "배고파, let's get 치킨."
After: "배고파, let's get 치킨."
Fine-tuned: "매일 조금씩 해요: a bit of Korean on every call, and I'll push you a little further each time."
Fine-tuned: "Your tram leaves Melbourne Central at 6:12, 그러니까 지금 나가면 딱 맞아."
Ears that hear both
One model hears both languages and works out which one I'm speaking, the same idea as Whisper. I fine-tuned it on mixed Korean–English speech, and errors on my mixed sentences dropped from 43.5% to 17.4%.
Before the fine-tune, I asked Duck "한국말 알아들어? Do you understand this?" (do you understand Korean?). It heard "Yeah, Hangul my Aradro, Do you understand this?"
| What I said | 한국말 알아들어? Do you understand this? |
|---|---|
| What it heard | Yeah, Hangul my Aradro, Do you understand this? |
| Error rate | Stock | Fine-tune (live) |
|---|---|---|
| HiKE code-switching | 25.5% | 8.2% |
| My mixed speech | 43.5% | 17.4% |
| My English | 9.7% | 9.7% |
| Time per turn | 1.18 s | 0.87 s |
4 · How it maps to the frontier
Converging with DeepSeek's "Super-agent"
It makes me really reassured that I am on the right path, and that we have the same theory of mind, or we see it the same way. This is not the first time. I independently implemented subagent patterns like fan-out and fan-in before they were formalised by Anthropic. For research tasks, I searched the web first, had a sub-agent (or a few) find the authoritative sources, fanned back in, then had independent agents deep-dive each source. I knew that a single agent was often more effective and cost-effective than multi-agent teams, because that's the way I work at work, before the Anthropic article came out. I've been skills-pilled for ages (MCPs lowkey made a comeback though, especially with code mode).
| DSH SuperAgent | Duck's Version | Built |
|---|---|---|
| Router layer, one long-lived session | Duck: one thread fed by the phone, site chat, Amp app, MacBook, gaming PC | 30 Oct |
| Workers, isolated, report to router | factory owners, one per ticket | 30 Oct |
| Subscription pass-through | CI wakes the owner directly, not via Duck | 31 Oct |
| Full duplex | barge-in, fillers, tool rows read out | 30–31 Oct |
| Session DB, compute ≠ state | memory tree, dream, thread rotation + handoff | 30 Oct |
| Separate environments | runners + self-hosted orbs | 30 Oct |
| Acting ahead (speculation) | ASR starts at every pause; reused in 1,116 of 1,119 turns | 30 Oct |
| Two-stage event filter | not yet | — |
| Watchdog session | not yet | in progress |
DeepSeek Harness, "Exploring Super-agent Design", posted 1 Nov 2026.
What I learnt
My brother and I are pushing the frontier. I'm an AI-native platform engineer delivering the first production AI agents at NAB. My brother is leading the design and implementation of an agentic support agent at AWS. I resonate strongly with Amp's vision of AI and the future of software engineering, and using their tool has been a pleasure.