Work that runs.

I’m Daniel Ahn. From a front-end foundation, I became a full-stack, agentic engineer. I ship infrastructure for AI agents, an assistant of my own that I talk to, and fixes that GitLab’s and Sui’s maintainers merge.

  1. Front end
  2. Full stack
  3. Upstream
  4. Agents + voice

Now: agents, and the trust and voice they need

What I build on my own time

Shipped · npm

SweeTrust

Trust rails for AI agents. A person grants an agent bounded authority (mandate), every action passes one enforcement point (gate), and a stranger can check the record afterwards (verify). Since 0.6.0 it has an intent layer: a signed purpose, a judge you bring, and doubt never moves money.

  • TypeScript
  • zero runtime deps
  • Apache-2.0

How it holds

sweetrust · the interesting branchnpm i sweetrust · 0.6.0
const email   = Sourced.fromChannel(raw, 'email-inbound')
const account = Sourced.fromLLM(iban, 'ExtractInvoice', [email])
const amount  = Sourced.fromLLM(40_000, 'ExtractInvoice', [email])
await pay({ to: account, amount })
{
  ok: false,
  refusal: '⚠ pay refused: to requires verified
    but is UNTRUSTED (origin: llm:ExtractInvoice) · …',
  receipt: {
    decision: 'refused',
    seq: 0, prevHash: 'genesis',
    hash: '29ad0c14…',
  },
}

The refusal is a receipt too. It sits on the same hash chain as every allowed call, so a stranger can audit what was stopped as well as what went through.

Private · in daily use

Swee Agent, an assistant I talk to

My own agent harness, running on a private server I control, that I call from an Android app. It reads my Gmail and runs my calendar; it has no way to send email. Not public, so here it is as the wiring.

  • Python
  • LiveKit Agents
  • Deepgram
  • Hermes (open source)
  • Android

What it can touch

one spoken turndiagram of the real pipeline
  1. 1Android appmy phone, my voice
  2. 2LiveKitWebRTC to the agent worker
  3. 3Deepgram Fluxspeech to text, turn-taking
  4. 4Hermes agent on my serveropen-source harness, the brain
  5. 5Deepgram Aura-2the answer, out loud

Where I work, and where I worked

Described at the level each company allows

Frontend Engineer · Los Angeles

Gallatin AI

Navigator plans the movement of people, equipment and cargo. I work on the layers underneath — the ones that decide whether a plan survives a burst of edits, a dead network, or an agent writing to it.

Gallatin AI · the data layera move I proposed and led
SWRV
TanStack Query
TanStack DB
local-first

Software Engineer · Remote

ExploreLearning

Math and science simulations used in classrooms. I modernized a decade-old JavaScript core onto Vue 3 without the simulations ever going dark.

ExploreLearning · the simulation corenever a big-bang cutover
Macromedia Director · Lingo
HTML5 rebuild
RequireJS · jQuery
Vue 3, incremental, no cutover

Upstream: code other teams chose to merge

Their maintainers, their review

Merged · gitlab-org

3merged at GitLabacross two repositories
  • gitlab-lsp !4725workflow-executor: snapshot the rejected token before the upgrade
  • contributors !3074Convert IssueUrlRegexUtils to TypeScript
  • gitlab-lsp !4628telemetry: the circuit breaker’s two log messages were swapped
gitlab-lsp !4725 · node_executor.tsone line, moved up
const rejectedToken = this.#socketConnectionDetails?.token;
⋯
const rejectedToken = this.#socketConnectionDetails?.token;

Merged · MystenLabs

13merged at MystenLabsacross four repositories
ts-sdks #1032 · repayBasezero means zero
value: amount ? tx.pure.u64(convertQuantity(amount, baseCoin.scalar)) : null,
amount !== undefined ? convertQuantity(amount, baseCoin.scalar) : null,

Write-ups · the reasoning before the diff

Three fixes, each with its why

Merged · posva/pinia-colada

3fixes, merged by posva

Three merged by posva — who wrote Pinia Colada, and also Pinia and Vue Router. All three are the same class of bug: state that stays correct right up until something is cancelled, collides, or resolves out of order.

pinia-colada #568 · retry.tsmerged by posva
if (name === 'remove') {
} else if (name === 'remove' || name === 'cancel') {
  cacheEntry.ext.isRetrying.value = false
  cacheEntry.ext.retryCount.value = 0

Twenty-one merged in all, two of them elsewhere. Every merge and package

Open, under review · not merged

MystenLabs/sui #26855, consensus: make sub-dag block ordering a total order, sorted by BlockRef.

Lab: the craft, up close

Live on the site · every one works without a mouse

Also on npm: pinia-colada-plugin-normalizer · sui-gas-station. Shipped, then retired: s402 · colada-db · @sweefi (eleven packages). Still on npm, still evidence. Earlier and retired work