A digital scan of a four color silk screen self portrait of myself done on paper.

About

Hello, my name is Keith Duke.

I’m a full-stack engineer building modern web and AI/agent systems, with 13+ years of experience shipping production software at scale. Lately that means running LLMs on-device, designing agent frameworks around them, and seeing out how far you can go.

For a decade I was as a full-stack engineer at CBS Interactive/Paramount as both a Lead and Senior on brands including Metacritic and Tv.com, serving millions of daily visitors. Since 2022 I've focused independently on AI and agent systems. What is possible in the frontier, building T.O.M., a local-first agentic framework, and Dunil's Hold, a roguelike that pairs deterministic game logic with on-device LLM narration. I have worked with most delivery stacks, such as...

I completed my Bachelor of Arts in Web Design & New Media at the Academy of Art University in San Francisco. I previously completed coursework in Computer Science at Middle Tennessee State University. I have a background and love for craft and restoration, having worked professionally in wood and glass restoration. I fancy myself a writer, coding is an act of writing to two audiences.

Read more of my writing at Here Lately.

Projects:

AI & Agent Systems: TOM agent framework.

A local-first agentic framework running Qwen 4B models entirely on-device via Apple's MLX, nothing leaves the host machine. Written in Python. I'm currently building v5 in private: a fifth rearchitecture with fewer third-party dependencies and a multi-agent design — Qwen 3.5-4B as the primary reasoning agent, with Apple's on-device Foundation Models API running as a verifier sub-agent. It's my ongoing test of how far a small, fully local model stack can go at real coding tasks.

Web/Game Development: Dunil's Hold.

An hybrid text-based roguelike for iOS. A deterministic, Swift-native game engine handles all combat and world state; a local LLM (Liquid AI LFM2, via MLX) supplies atmospheric narration on top. The model never invents game state, it only describes what already happened. Fully offline, zero data collection.

Thanks for stopping by!