Do Yeong Kim

Duck, my personal SuperAgent, built in Amp

November 2026 · Prompted by DeepSeek Harness's "Exploring Super-agent Design"

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's site in use (a public copy, with private items removed)
1.6 sfrom me stopping to a filler (median)
0.18 sfirst audio from the fine-tuned voice
12 minvoice fine-tune on one RTX 4070 Super
17.4%mixed Korean–English errors, down from 43.5%
158tickets in about 3 days
132CI deploys, 1 real rollback

1 · What I made

The whole thing on one page

iPhoneSIP call over Tailscale
audio
home · Ryzen 5 5600X · RTX 2080 8 GB
AsteriskDocker; raw 16 kHz audio out
WebSocket
voice.pyPipecat: hearing, turn-taking, fillers, barge-in
Ears + voiceQwen3-ASR + Qwen3-TTS fine-tunes, GPU
HTTP, streamed
relay.pyone warm amp -x process
stream JSON
DuckAmp thread, Claude Code mode, local tools
tickets, threads, memory
Linearqueue
Owners + CIbuild + deploy
Memory treedream agent
duck.doyeong.kiminbox, goals, brain

The 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

A hand-in's last mile: CI checks it, deploys, and the ticket moves to In Review. (Illustration.)
Every part of the system posts to its own channel
Every part of the system posts to its own channel
CI: merges, deploys, failed checks, the queue
CI: merges, deploys, failed checks, the queue
Say it on a call
Duck files a Linear ticketmy exact words
I add factory
Owner agentbuild, prove on the real thing, hand in
CIVerified: gate, benches, fake phone call
Reviewer, in parallelfresh context; must prove findings
merge → deploy → health check → rollback
Owner woken with result

I 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

An owner needs me: the push lands and the question tops Needs you. (Illustration.)
Home: goals, what needs me, what's in progress
Home: goals, what needs me, what's in progress
A ticket opens in place, ready for me to try
A ticket opens in place, ready for me to try
On a call: Duck's core shows listening, thinking, speaking
On a call: Duck's core shows listening, thinking, speaking

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

On a callinbox lines
after the call + daily
Dreamthe only writer; backs up first
Root≤ 9,000 chars, in every thread
one-line summaries
people/
life/
coding/
leaves link to threads + tickets
Recallroot → branch → ≤ 2 leaves
Brain viewfact = star

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.

The Brain: each star is a fact (fact text hidden here)
#memory: what dream filed, and when it runs next
#memory: what dream filed, and when it runs next

2 · Why

Talking to Amp

One turn on a call: the filler at 1.6 s, the tool row, then the answer. (Illustration.)

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

Model thinking 52%Tools 17%Amp start 9.5%End-of-turn 9.4%ASR, TTS, relay, line 12%

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

Silero VADspeech? (CPU)
TitaNet speaker checkis it Do? every 0.25 s, ~50 ms
Smart Turn v3.2finished? last 8 s, 60–120 ms
ASR already started at the pause
Qwen3-ASR fine-tune4-bit
DuckBrainfiller, echo filter, talk-over, hang-up
to relay / back
Qwen3-TTS fine-tune80 ms frames, ~4 GB

The most annoying part was the latency and feeling of lag, for sure. Specifically:

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

0 sI stop
1.2 sturn ends (1.85 s if I sound unfinished)
1.6 sfiller: "One sec." / "오케이 잠깐만."
thentool rows read out: "Ran 1 command, reading 1 file"
8.4 sfirst reply, no tools (median)
13.6 sfirst reply, with tools (median)

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 doneCut-offsAvg wait
1.2 / 1.85 s (live)1421.30 s
1.3 / 2.0 s1181.40 s
1.4 / 2.2 s971.52 s
1.5 / 2.5 s761.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 heardYeah, Hangul my Aradro, Do you understand this?
Error rateStockFine-tune (live)
HiKE code-switching25.5%8.2%
My mixed speech43.5%17.4%
My English9.7%9.7%
Time per turn1.18 s0.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 SuperAgentDuck's VersionBuilt
Router layer, one long-lived sessionDuck: one thread fed by the phone, site chat, Amp app, MacBook, gaming PC30 Oct
Workers, isolated, report to routerfactory owners, one per ticket30 Oct
Subscription pass-throughCI wakes the owner directly, not via Duck31 Oct
Full duplexbarge-in, fillers, tool rows read out30–31 Oct
Session DB, compute ≠ statememory tree, dream, thread rotation + handoff30 Oct
Separate environmentsrunners + self-hosted orbs30 Oct
Acting ahead (speculation)ASR starts at every pause; reused in 1,116 of 1,119 turns30 Oct
Two-stage event filternot yet—
Watchdog sessionnot yetin 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.