<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss-styles.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>David Hoang — Writing — ai</title><description>Writing tagged “ai”. For notes, use /rss/notes.xml.</description><link>https://www.davidhoang.com</link><language>en-us</language><lastBuildDate>Sat, 14 Nov 2026 15:30:09 GMT</lastBuildDate><atom:link href="https://www.davidhoang.com/rss/tag/ai.xml" rel="self" type="application/rss+xml"/><item><title>Optimizing a Personal Website for AI Agents</title><link>https://www.davidhoang.com/writing/optimizing-for-agents</link><guid isPermaLink="true">https://www.davidhoang.com/writing/optimizing-for-agents/</guid><description>Treating agent experience as a first-class design surface — what I found, what I changed, and what I deliberately chose not to do.</description><pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;For most of the web&apos;s life, the question behind &quot;who is my site for?&quot; had one answer: people, and the search crawlers that help people find it. That&apos;s changing. A growing share of visits now come from AI agents — answer engines summarizing a page, assistants fetching a bio, retrieval bots gathering context for a model. They don&apos;t scroll, they don&apos;t hover, and they don&apos;t care about a hero animation. They want structure, stable endpoints, and clear permissions.&lt;/p&gt;
&lt;p&gt;I recently went through davidhoang.com and treated &quot;agent experience&quot; as a first-class design surface, the same way I&apos;d treat mobile or accessibility. This post is a tour of what I found, what I changed, and — just as importantly — what I deliberately chose &lt;em&gt;not&lt;/em&gt; to do.&lt;/p&gt;
&lt;h2&gt;The mental model: discovery, comprehension, action&lt;/h2&gt;
&lt;p&gt;Before touching any code, it helped to split &quot;agent experience&quot; into three needs:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Discovery&lt;/strong&gt; — can an agent find what exists on the site without scraping every page?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comprehension&lt;/strong&gt; — once it has a page, can it extract meaning reliably instead of guessing from markup?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Action&lt;/strong&gt; — if it wants to &lt;em&gt;do&lt;/em&gt; something (search, subscribe), can it do so safely and predictably?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Almost every improvement below maps to one of those three. The site already had a strong classic-web foundation — a permissive &lt;code&gt;robots.txt&lt;/code&gt;, an auto-generated sitemap, full-text RSS, semantic &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt; markup, canonical URLs, and some JSON-LD. That&apos;s great for search engines and RSS readers. It&apos;s only &lt;em&gt;implicitly&lt;/em&gt; good for agents. The goal was to make the implicit explicit.&lt;/p&gt;
&lt;h2&gt;Discovery&lt;/h2&gt;
&lt;h3&gt;A generated &lt;code&gt;llms.txt&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;llms.txt&lt;/code&gt; is an emerging convention: a plain-text, Markdown-flavored manifest at &lt;code&gt;/llms.txt&lt;/code&gt; that tells language models what a site is about and where its important content lives. Think of it as a curated &quot;start here&quot; rather than a full crawl.&lt;/p&gt;
&lt;p&gt;The key decision was to &lt;strong&gt;generate it from the site&apos;s own content collections and navigation data&lt;/strong&gt; rather than hand-maintaining a file that silently rots. It lists the site identity, primary pages, published writing and notes, the RSS feeds, the sitemap, and the search index — and it excludes drafts automatically, because it&apos;s built from the same source of truth the rest of the site uses.&lt;/p&gt;
&lt;p&gt;A caveat worth stating plainly: &lt;code&gt;llms.txt&lt;/code&gt; is a &lt;em&gt;convention&lt;/em&gt;, not a guaranteed ranking or ingestion mechanism. I treat it as low-cost, high-clarity signaling, not a magic funnel.&lt;/p&gt;
&lt;h3&gt;A machine-readable discovery contract&lt;/h3&gt;
&lt;p&gt;Separately from &lt;code&gt;llms.txt&lt;/code&gt;, I published a small versioned document at &lt;code&gt;/.well-known/agent.json&lt;/code&gt;. Where &lt;code&gt;llms.txt&lt;/code&gt; is prose for a model to read, this is structured JSON for a program to parse. It declares:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;site identity and canonical origin&lt;/li&gt;
&lt;li&gt;the discovery resources that already exist (sitemap, RSS feeds, search index, robots)&lt;/li&gt;
&lt;li&gt;the human-facing actions available (subscribe, read, etc.)&lt;/li&gt;
&lt;li&gt;attribution expectations&lt;/li&gt;
&lt;li&gt;an explicit version number&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The rule I held myself to: &lt;strong&gt;never advertise an endpoint that doesn&apos;t exist.&lt;/strong&gt; A discovery contract that lies is worse than none at all, so it only points at things that are actually live.&lt;/p&gt;
&lt;h3&gt;A deliberate crawler policy&lt;/h3&gt;
&lt;p&gt;The site&apos;s existing stance was already permissive — allow public content, disallow &lt;code&gt;/api/&lt;/code&gt;. Rather than change behavior, I made the stance &lt;em&gt;explicit and documented&lt;/em&gt;. The &lt;code&gt;robots.txt&lt;/code&gt; now spells out how it treats search, retrieval, and training crawlers, and there&apos;s a short policy doc explaining the retrieval-vs-training distinction and how to update the bot list over time.&lt;/p&gt;
&lt;p&gt;The honest limitation here: &lt;code&gt;robots.txt&lt;/code&gt; cannot actually distinguish &quot;retrieve to answer a question&quot; from &quot;retrieve to train a model.&quot; Pretending otherwise would be theater. So the policy documents intent and known gaps instead of implying control it doesn&apos;t have.&lt;/p&gt;
&lt;h2&gt;Comprehension&lt;/h2&gt;
&lt;h3&gt;Richer structured data&lt;/h3&gt;
&lt;p&gt;I strengthened the Schema.org JSON-LD across the site: writing posts are now &lt;code&gt;BlogPosting&lt;/code&gt;, notes are modeled as &lt;code&gt;CreativeWork&lt;/code&gt; (they&apos;re garden notes, not articles, and it felt wrong to overclaim), and both link back to a stable &lt;code&gt;Person&lt;/code&gt;/&lt;code&gt;WebSite&lt;/code&gt; graph with consistent entity IDs. Publication and modification dates, language, and keywords are included where the underlying data actually supports them — and &lt;em&gt;only&lt;/em&gt; where it does. I didn&apos;t want to invent a &quot;last modified&quot; date just to look fresh.&lt;/p&gt;
&lt;h3&gt;An enriched search index — without breaking anything&lt;/h3&gt;
&lt;p&gt;The site already exposed &lt;code&gt;/search-index.json&lt;/code&gt; to power the ⌘K palette. I enriched each entry with canonical URLs, excerpts, dates, tags, and note stages, and made sure the index covers the discoverable static pages rather than silently omitting destinations that are in the sitemap.&lt;/p&gt;
&lt;p&gt;This one had a subtle trap. The obvious move was to wrap the array in a versioned envelope (&lt;code&gt;{ schemaVersion, items }&lt;/code&gt;). But that endpoint is &lt;em&gt;already public&lt;/em&gt;, and an unknown consumer could be relying on the bare-array shape. So instead of a breaking change, the response stays a bare array and the schema version is advertised through an &lt;code&gt;X-Search-Index-Schema-Version&lt;/code&gt; header. The command palette tolerates both shapes. Backward compatibility for an endpoint you don&apos;t control the consumers of is worth a little inelegance.&lt;/p&gt;
&lt;h3&gt;Clean Markdown representations&lt;/h3&gt;
&lt;p&gt;Rendered HTML is noisy for a machine: navigation, theme toggles, shader backgrounds, and view-transition wrappers all surround a few hundred words of actual prose. So every published writing post and note now has a Markdown twin at &lt;code&gt;/{slug}.md&lt;/code&gt;, serving the original body with its front matter and a canonical link back to the HTML page. Drafts and internal-only fields never leak. HTML pages advertise the Markdown alternative via &lt;code&gt;&amp;lt;link rel=&quot;alternate&quot; type=&quot;text/markdown&quot;&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The nice property here is that an agent can grab the &lt;em&gt;content&lt;/em&gt; without parsing the &lt;em&gt;chrome&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Action&lt;/h2&gt;
&lt;h3&gt;Experimental WebMCP tools&lt;/h3&gt;
&lt;p&gt;WebMCP is a much newer, browser-native idea: a page can register callable &quot;tools&quot; through &lt;code&gt;navigator.modelContext&lt;/code&gt;, so an in-browser agent can invoke a real function instead of simulating clicks. It&apos;s early — an evolving spec with preview-level browser support — so I treated it as strictly progressive enhancement:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;feature-detected&lt;/strong&gt;, so it&apos;s a complete no-op in browsers that don&apos;t expose the API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;no mandatory dependency or polyfill&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;tools are &lt;strong&gt;registered and cleaned up across view transitions&lt;/strong&gt; so they don&apos;t leak&lt;/li&gt;
&lt;li&gt;read-only tools (site search, indexed navigation) are clearly separated from anything with side effects&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The most important guardrail: the newsletter tool &lt;strong&gt;fills and focuses the form but never submits it&lt;/strong&gt;. An agent can help a person get to the point of subscribing; it cannot subscribe them. Side effects stay behind an explicit human action.&lt;/p&gt;
&lt;h3&gt;Measuring whether any of this matters&lt;/h3&gt;
&lt;p&gt;Finally, instrumentation — because optimizing for agents without measuring outcomes is just vibes. I added privacy-conscious analytics that classify known answer-engine referrals and record whether search and newsletter interactions succeed. Crucially, it never sends query text, email addresses, page content, or personal data, and query strings are stripped from analytics payloads.&lt;/p&gt;
&lt;p&gt;There&apos;s a limitation I wrote down rather than hid: browser analytics fundamentally can&apos;t see server-side crawler traffic. Bots don&apos;t run your client JS. So the measurement doc is explicit that crawler and citation volume has to be read from server-side logs (Vercel&apos;s firewall/analytics), not the browser layer. Measuring the wrong thing confidently is worse than admitting the gap.&lt;/p&gt;
&lt;h2&gt;What I chose &lt;em&gt;not&lt;/em&gt; to do&lt;/h2&gt;
&lt;p&gt;A few deliberate non-goals, because scope discipline is part of the design:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No full MCP server.&lt;/strong&gt; This is an editorial site, not an app with an API surface worth operating and securing. A lightweight machine-readable layer beats a server I&apos;d have to babysit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No unauthenticated content API that could burn quota.&lt;/strong&gt; The existing static JSON and RSS cover the read cases without opening a new abuse vector.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No pretending emerging standards are settled.&lt;/strong&gt; &lt;code&gt;llms.txt&lt;/code&gt; and WebMCP are both promising and both early. I shipped them as clearly-scoped, low-risk enhancements, not load-bearing infrastructure.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Takeaways&lt;/h2&gt;
&lt;p&gt;If you want to make your own site friendlier to agents, a reasonable order of operations:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Publish a generated &lt;code&gt;llms.txt&lt;/code&gt; and a &lt;code&gt;/.well-known/agent.json&lt;/code&gt; contract — cheap, honest signaling.&lt;/li&gt;
&lt;li&gt;Enrich the structured data you already have, without overclaiming facts you don&apos;t have.&lt;/li&gt;
&lt;li&gt;Offer clean content representations (Markdown or documented JSON) so agents skip the chrome.&lt;/li&gt;
&lt;li&gt;Make your crawler policy explicit, including its limitations.&lt;/li&gt;
&lt;li&gt;Only then experiment with interactive standards like WebMCP — feature-detected and side-effect-safe.&lt;/li&gt;
&lt;li&gt;Measure outcomes, and be honest about what your measurement can and can&apos;t see.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The throughline across all of it: &lt;strong&gt;be explicit, be honest about limits, and never let an agent take an action a human didn&apos;t ask for.&lt;/strong&gt; Good agent experience turns out to look a lot like good API design and good accessibility — clarity, structure, and respect for the consumer on the other end.&lt;/p&gt;
</content:encoded><category>writing</category><category>ai</category><category>agents</category><category>web</category></item><item><title>The formlessness of AI agents</title><link>https://www.davidhoang.com/writing/the-formlessness-of-ai-agents</link><guid isPermaLink="true">https://www.davidhoang.com/writing/the-formlessness-of-ai-agents/</guid><description>Finding the right vessel for new capabilities</description><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In &lt;a href=&quot;https://marvel.fandom.com/wiki/Avengers_Vol_1_54&quot;&gt;The Avengers #54&lt;/a&gt;, a mysterious villain called the Crimson Cowl is orchestrating attacks against the team. It&apos;s not until the last page that the cowl drops and we see what&apos;s underneath: a robot. The next issue reveals him fully—Ultron-5, a living automation built by Hank Pym using his own brain patterns.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.davidhoang.com/images/blog/2026/img-2026-04-12-formlessness-ultron.webp&quot; alt=&quot;Ultron in Marvel comics&quot; /&gt;&lt;/p&gt;
&lt;p&gt;By the time anyone sees Ultron, he&apos;s already on version five. He was created, gained sentience, rebelled against his creator, hypnotized Pym into forgetting he ever existed, and then quietly iterated through four bodies in secret as a self-upgrade. Each time Ultron is defeated, he rebuilds to a better enclosure for the same intelligence. Like a hermit crab moving through shells, Ultron wasn&apos;t becoming something new but finding the optimal fit.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.davidhoang.com/images/blog/2026/img-2026-04-12-formlessness-ultron-variants.webp&quot; alt=&quot;Ultron rebuilds through successive bodies in Marvel comics&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Our AI tools are having their Ultron moment. In a few years of the scaling era of AI, capabilities have evolved rapidly and are compounding. They are breaking out of the chat boxes with tiny context windows and are now taking actions, running in the background, and using similar tools as us. It&apos;s not AGI, but it turns out serendipitous cron jobs invoke a sentient connection to many human beings.&lt;/p&gt;
&lt;p&gt;The question in the Ultron moment is, &quot;what is the right body for this intelligence?&quot;&lt;/p&gt;
&lt;h2&gt;New capabilities begin in borrowed form&lt;/h2&gt;
&lt;p&gt;Steve Jobs made this observation at the 1983 International Design Conference in Aspen. Early television shows were like radio shows with a camera pointed at them. Because the capability is new, people used existing patterns of what they already knew—a host behind a desk, reading to an audience, and filmed it. The breakthrough was you could visually tell a story of War of the Worlds instead of reading it to them.&lt;/p&gt;
&lt;p&gt;Early websites were digital brochures and mobile apps were shrunken desktop software. Early iPhone prototypes ran a cut‑down version of OS X&apos;s core, adapted to fit a phone. AI agents talking through chat interfaces are like radio shows with a camera pointed at them. Chat is frictionless not because it&apos;s the right interface but because it&apos;s a familiar one; a turn-by-turn conversational text box.&lt;/p&gt;
&lt;p&gt;In Silicon Valley, we&apos;re obsessed with pushing the edges of technology and need to be reminded of global behaviors. I recently ran rapid research comparing site-building tools for SMBs (yes I do this for fun). Compared to classic site builders such as Framer, Webflow, and Squarespace, people preferred using Lovable or Replit to build a website because of the conversational interface.&lt;/p&gt;
&lt;h2&gt;Giving agents a body&lt;/h2&gt;
&lt;p&gt;OpenClaw is an open‑source framework for controlling your computer through natural‑language agents. Its primary interaction is a chat agent: you text it on messaging platforms such as Telegram or WhatsApp. It runs tasks on your computer, manages your calendar, clears your inbox. That wasn&apos;t enough for some people.&lt;/p&gt;
&lt;p&gt;Tom saw a fundamental problem: how do you get OpenClaw to control actual motors in real time? His answer was ClawBody, a software bridge that connects OpenClaw to physical hardware so you can train agents in simulation, then deploy them to real robots. Chris asked a different question: what if robots could actually understand spatial depth? He integrated Intel RealSense cameras with OpenClaw and a vision‑language model so robots can track a person through space, maintain distance, and navigate obstacles, all driven by natural language.&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;writing-inline-video-wrap&quot;&amp;gt;
&amp;lt;video class=&quot;writing-inline-video&quot; autoplay muted loop playsinline controls preload=&quot;metadata&quot; poster=&quot;https://www.davidhoang.com/images/blog/2026/img-2026-04-12-formlessness-clawbody-still.webp&quot; width=&quot;554&quot; height=&quot;312&quot;&amp;gt;&amp;lt;source src=&quot;https://www.davidhoang.com/images/blog/2026/img-2026-04-12-formlessness-clawbody.mp4&quot; type=&quot;video/mp4&quot; /&amp;gt;&amp;lt;/video&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;Then there&apos;s ClawStage, a device built by HooRii Technology that turns OpenClaw into a companion robot — a Raspberry Pi 5 with a transparent display that creates a hologram-like effect for an animated AI persona, with a camera and microphone array that let it perceive its surroundings and respond to voice directionally. Hackster users can design custom personalities for it, download characters from a shared hub, and make the intelligence feel like someone.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.davidhoang.com/images/blog/2026/img-2026-04-12-formlessness-vignette.webp&quot; alt=&quot;A vignette of different shells and encapsulations for AI; some more functional than others.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A project called Dimensional integrated OpenClaw with the Unitree G1 humanoid robot and gave it Spatial Agent Memory. The agent understands physical space and temporality, knows the layout of rooms, the location of objects, where people tend to be.&lt;/p&gt;
&lt;p&gt;Many of these projects started as DIY projects because they wanted to create an enclosure for their sentient tools; like a hermit crab between shells.&lt;/p&gt;
&lt;p&gt;We know how to relate to things that have form. A hammer looks like something you swing and a doorknob affords turning. When something is formless, such as an intelligence in machine-form that sees the world in lines of code, we don&apos;t have the same intuitive relationship with it. Human and agentic behaviors are not the same. It&apos;s a miss for us to replicate ourselves in the form of a new intelligence.&lt;/p&gt;
&lt;p&gt;This is why we must explore the right enclosures and interfaces for agents. We&apos;ll soon realize all these CLI tools are not primarily for the humans—they&apos;re for people giving the formless thing a shape so they can understand what it does.&lt;/p&gt;
&lt;p&gt;The shell keeps changing.&lt;/p&gt;
&lt;h2&gt;The trust tension&lt;/h2&gt;
&lt;p&gt;Humans need visibility of agents to trust them; to understand what they are doing and where the boundaries are. Formlessness creates anxiety for humans. If one can&apos;t see the agent, how is it held accountable?&lt;/p&gt;
&lt;p&gt;The current challenge is the interfaces are designed in the borrowed form of chat, sidebar, and copilots. We&apos;re in the uncanny valley of agent design. The form is close enough to be usable but wrong enough to be limiting. A chat-based agent can answer your question but can&apos;t show you it&apos;s already working on three other things in parallel. A copilot can suggest edits but can&apos;t demonstrate that it understands the broader context of your project.&lt;/p&gt;
&lt;p&gt;The interface doesn&apos;t match the capability. As a result, humans and agents are working on the same interfaces and it&apos;s not visibly clear who is doing what.&lt;/p&gt;
&lt;p&gt;This is the enclosure problem. Not just how agents look, but what kind of container can hold something that is, by nature, without container. That&apos;s a harder design question than it sounds. Many of us haven&apos;t designed for things that can think, plan, reason, and use the same tools we do.&lt;/p&gt;
&lt;p&gt;And if you want to go somewhere uncomfortable: we haven&apos;t solved this problem for ourselves either. The relationship between consciousness and body, between the mind and the form it inhabits, is the oldest unsolved question in philosophy. We&apos;re spiritual beings who never fully made sense of our own enclosures. Now we&apos;re being asked to design one for something else.&lt;/p&gt;
&lt;h2&gt;The form is still being found&lt;/h2&gt;
&lt;p&gt;We&apos;re doing what humans always do when faced with something formless: we reach for the containers we already have. We put radio on television. We put the legal pad in the Notes app. We put intelligence in a chat box.&lt;/p&gt;
&lt;p&gt;We&apos;re the ones designing the body for the new medium. That reframes every choice. A chat interface is a claim about what kind of enclosure intelligence should have. A sidebar copilot is a claim. A robotic arm is a claim. Each enclosure shapes what the intelligence can do, how people relate to it, and what it becomes. The form isn&apos;t neutral.&lt;/p&gt;
&lt;p&gt;It&apos;s tempting to settle with the borrowed form, but that&apos;s not what we do as designers. Understanding what form formless experiences need is what we should explore. The fact that we haven&apos;t found the native form of agents yet means the field is genuinely open. This is the equivalent of being a filmmaker in 1910, a web designer in 1995, a mobile designer in 2008. The early chaotic moments that feel disorienting are what we live for as makers.&lt;/p&gt;
&lt;p&gt;We are at the beginning of thinking about different enclosures for agents. The shell keeps changing—and that&apos;s the work.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href=&quot;https://www.proofofconcept.pub/p/the-formlessness-of-ai-agents&quot;&gt;Proof of Concept&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>writing</category><category>ai</category><category>software</category><category>agents</category></item><item><title>A new MVC is emerging</title><link>https://www.davidhoang.com/writing/a-new-mvc-is-emerging</link><guid isPermaLink="true">https://www.davidhoang.com/writing/a-new-mvc-is-emerging/</guid><description>AI is breaking the way we build (and it&apos;s exciting)</description><pubDate>Sun, 15 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;For makers of software, Model/View/Controller (MVC) is one of the first concepts you learn. MVC is a design pattern that separates an application into three parts to organize code and make it easier to maintain. The Model handles data and business logic, the View manages the user interface, and the Controller acts as a middleman that processes user input and coordinates between them.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.davidhoang.com/images/blog/2025/img-2025-06-15-mvc.webp&quot; alt=&quot;A new MVC is emerging&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Think of it like a restaurant: the kitchen (Model) prepares the food, the dining room (View) is where customers eat, and the waiter (Controller) takes orders and communicates between the two. This separation allows developers to modify one part without breaking the others.&lt;/p&gt;
&lt;p&gt;MVC has guided software architecture for decades—but AI is about to turn it on its head.&lt;/p&gt;
&lt;p&gt;Instead of rigid relationships between data, interface, and logic, we&apos;re entering a world where intelligent agents dynamically orchestrate distributed systems. Rather than building monolithic apps with centralized databases, we now design decoupled systems where agents respond in real-time using protocols like MCP (Model Context Protocol).&lt;/p&gt;
&lt;p&gt;So what happens when Model, View, and Controller all become intelligent?&lt;/p&gt;
&lt;p&gt;Before I share my thoughts, I must acknowledge and share Ruben Verborgh&apos;s “Paradigm shifts for the decentralized Web.” Verborgh, a professor of Decentralized Web Technology, wrote this back in 2017 and laid out three critical shifts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;End users become data controllers:&lt;/strong&gt; Users store their data where they want, improving privacy and control.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apps become views:&lt;/strong&gt; Apps are no longer single gateways, but interchangeable UI layers over personal data stores.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interfaces become queries:&lt;/strong&gt; Distributed data demands declarative, query-driven interfaces, not custom APIs.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, with AI in the loop, these shifts feel even more pressing—and they&apos;re converging with a reimagining of MVC. Let&apos;s explore what the new MVC looks like.&lt;/p&gt;
&lt;h2&gt;The emerging MVC&lt;/h2&gt;
&lt;p&gt;The emerging MVC forces software makers to think of system-centric product experiences instead of app-centric. Simply put, the containers are breaking and walled gardens are coming down. Let&apos;s look at the new constructs of MVC.&lt;/p&gt;
&lt;h3&gt;LLMs as Models&lt;/h3&gt;
&lt;p&gt;During a conversation with Kyle Turman at Anthropic, they said something that stuck with me: &quot;LLMs are grown, not built.&quot; That framing changed everything. Unlike traditional models you code and optimize, LLMs are trained, shaped, and continuously refined by their inputs and interactions. They behave less like deterministic engines and more like probabilistic ecosystems. This organic quality changes how we interface with them—and what we expect from &quot;the model.&quot;&lt;/p&gt;
&lt;h3&gt;Apps as Views&lt;/h3&gt;
&lt;p&gt;In this new world, the app is no longer the destination—it&apos;s the interface. Core workflows may still rely on apps, but increasingly, they&apos;re just &lt;em&gt;views&lt;/em&gt; for interacting with data and agents.&lt;/p&gt;
&lt;p&gt;One of the first apps I ever built was Carogram, an Instagram client for the web and iPad using Node.js. Even back then, the trend was clear: apps were wrappers over data that lived elsewhere. Deep linking was a start. Now, we&apos;re looking at a future where apps might not store any data at all—just render it, query it, or pass it through.&lt;/p&gt;
&lt;p&gt;That was the promise of the decentralized web and blockchain: portability, ownership, and independence from centralized services. It didn&apos;t fully land back then. But with AI and protocols like MCP, it may finally find footing.&lt;/p&gt;
&lt;h3&gt;Agents as Controllers&lt;/h3&gt;
&lt;p&gt;This is where it gets interesting. If LLMs are the new Models and apps are our Views, AI agents step into the Controller role—except they don&apos;t just relay input anymore. They interpret, decide, act, and coordinate across distributed systems. With Model Context Protocol (MCP), agents dynamically handle context switching, planning, and executing across multiple apps and data sources.&lt;/p&gt;
&lt;p&gt;They&apos;re not just smarter waiters. They&apos;re like sous-chefs, sommeliers, and maître d&apos;s rolled into one—making judgment calls in real time.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.davidhoang.com/images/blog/2025/img-2025-06-15-mvc-cover.webp&quot; alt=&quot;A new MVC is emerging&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Recap&lt;/h2&gt;
&lt;p&gt;I won&apos;t force a new acronym like &lt;strong&gt;LAA&lt;/strong&gt; (LLMs, Apps, Agents)—but the point is clear: MVC isn&apos;t gone, it&apos;s evolving.&lt;/p&gt;
&lt;p&gt;In this emerging architecture:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Instead of maintaining a codebase, we&apos;re managing endpoints, protocols, and interactions&lt;/li&gt;
&lt;li&gt;Vendor lock-in becomes a liability, not a moat&lt;/li&gt;
&lt;li&gt;Apps need to be interoperable by design, not by exception&lt;/li&gt;
&lt;li&gt;AI interfaces act as meta-layers, sitting above and across traditional apps&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Software isn&apos;t collapsing—it&apos;s decoupling. We are moving from app-centric experiences to system-centric ones. And with that comes a chance to rethink how we make, control, and interact with the systems around us.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href=&quot;https://www.proofofconcept.pub/p/a-new-mvc-is-emerging&quot;&gt;Proof of Concept&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>writing</category><category>ai</category><category>software</category><category>architecture</category></item><item><title>Career reboot</title><link>https://www.davidhoang.com/writing/career-reboot</link><guid isPermaLink="true">https://www.davidhoang.com/writing/career-reboot/</guid><description>Rebooting with the AI Incursion</description><pubDate>Mon, 21 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every April I seem to take an unplanned creative spring break. It’s not a sabbatical or a formal PTO strategy—just a self-imposed ritual to step away from the chaos of work and reconnect with what inspires me. I’ve learned that if you’re not in a full-time IC role, making things—especially design—becomes a form of recovery from meeting fatigue and managerial overhead.&lt;/p&gt;
&lt;p&gt;This year’s reboot took me to San Diego and Palm Springs, where I spent the week writing, vibe coding, updating my personal site, and binging content—not passively, but actively, taking notes like a student of inspiration. It’s a reminder that creative recovery isn’t idle time; it’s compost for what comes next.&lt;/p&gt;
&lt;p&gt;One of the shows I caught up on was &lt;em&gt;Daredevil: Born Again&lt;/em&gt;—a reboot of one of my all-time favorite comic book characters. After finishing it, I fell into one of my favorite internet rituals: watching YouTube breakdowns from New Rockstars, Screen Crush, Heavy Spoilers. The algorithm did its thing, and suddenly I was watching clips from the original &lt;em&gt;Daredevil&lt;/em&gt; series that aired on Netflix in 2015. Ten years ago. I was living in Capitol Hill, Seattle, designing mobile apps at Black Pixel, deep in my craft.&lt;/p&gt;
&lt;p&gt;Pandora’s Box was open. From there, it spiraled into Secret Wars theory videos and MCU reboot rumors. It’s no secret that Marvel is plotting a reset. Though my heart still belongs to the 1984 &lt;em&gt;Secret Wars&lt;/em&gt;, the upcoming cinematic version borrows heavily from Jonathan Hickman’s 2015 arc—the one where the multiverse collapses, Doctor Doom ascends, and the patchwork world of Battleworld emerges from the ruins.&lt;/p&gt;
&lt;p&gt;As the Marvel multiverse collapses from a series of catastrophic incursions, Doctor Doom seizes godlike power and creates a new patchwork world called Battleworld, where fragments of destroyed realities are stitched together under his rule. Avengers: Secret Wars is set to release in 2027, which is fifteen years after the original &lt;a href=&quot;https://www.imdb.com/title/tt0848228/&quot;&gt;Avengers&lt;/a&gt; film.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.davidhoang.com/images/blog/img-2025-04-incursion@2x.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;The AI incursion&lt;/h2&gt;
&lt;p&gt;I was sitting on our couch in Palm Springs, flipping through YouTube clips between the two Coachella weekends—an event I once flew across the country to attend (yes, I was there for Hologram 2Pac). Now, the bands that once headlined my youth are soundtracking ads for minivans and insurance, targeting geriatric millennials like me. I’m 41. Bryan Johnson might argue I’m not getting old, just aging. But let’s be honest—I’m definitely losing my edge. (For the record, the GRS Club cover of that LCD Soundsystem track is still my favorite.)&lt;/p&gt;
&lt;p&gt;The hardest part of aging isn’t the number—it’s the creeping sense of irrelevance. That quiet panic when you realize you’re no longer fluent in the tools or jokes shaping the next era. For many of us, the AI incursion feels like that moment. Unlike past hype cycles—remember NFTs?—this one feels different. Real. Fast. Disruptive. Existential.&lt;/p&gt;
&lt;p&gt;We’re not just navigating a new wave of tech; we’re dealing with &lt;em&gt;two&lt;/em&gt; systemic shocks at once. The AI acceleration is colliding with what feels like the second Great Recession. Around 2023, tech hit a hard reset—blitzscaling gave way to layoffs, cautious capital, and a culture shift. And from that rubble, a new archetype emerged: the vibe coders. A term Andrej Karpathy used to describe the new generation building apps with generative AI—no traditional coding required, just vibes, vision, and a good prompt.&lt;/p&gt;
&lt;p&gt;Using generative AI, I had ChatGPT write a satire of Losing My Edge about vibe coders and a millennial trying to keep up with the Gen Z kids:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’m losing my edge…to the kids with ring lights and one-shot prompts, the ones who ship from Discord DMs and sleep in Notion.&lt;/p&gt;
&lt;p&gt;I remember when we wrote our own auth, when you had to beg Heroku for more dynos.&lt;/p&gt;
&lt;p&gt;I remember debugging IE6 in Starbucks on airport Wi-Fi.&lt;/p&gt;
&lt;p&gt;I remember when product specs were PDFs, when A/B tests took weeks and no one said “vibes.”&lt;/p&gt;
&lt;p&gt;I’m losing my edge…to the locked-in Gen Zs with Arc tabs like trading desks, shipping AI agents at 3AM while I’m still writing the brief.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Tech incursions equalize&lt;/h2&gt;
&lt;p&gt;Millennials, we’re losing our edge. The experience we once relied on—the war stories of scaling, shipping, and staying late to debug—no longer guarantees relevance. The Ruby on Rails apps we built with Twitter Bootstrap and deployed on Heroku? They can now be replicated in a single-shot prompt with generative AI. Even Reid Hoffman, the founder of LinkedIn, used Replit to spin up a clone of the platform he originally built. Just because you can mimic something doesn’t mean you’ve matched its scale or impact—but using that as a reason to dismiss what’s happening is a mistake.&lt;/p&gt;
&lt;p&gt;As General Eric Shinseki once said: &lt;em&gt;“If you don’t like change, you’re going to like irrelevance even less.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The upside of these tech incursions is that they act as great equalizers. They flatten the hierarchy. They don’t care how senior you are or how many portfolio pieces you’ve amassed—they care how quickly you can adapt. Whether you’re just starting out or decades into your career, everyone is trying to figure out how to design &lt;em&gt;with&lt;/em&gt; AI while designing &lt;em&gt;for&lt;/em&gt; AI.&lt;/p&gt;
&lt;p&gt;I’ve seen this pattern before. In my 20s, during the mobile incursion, no one had experience designing for a piece of glass you touched with your fingers. I managed to break into tech because I had mastered Photoshop and could craft rich, skeuomorphic interfaces. In a landscape with no established veterans, everyone was new—and that opened doors.&lt;/p&gt;
&lt;p&gt;It’s tempting to push back by saying, &lt;em&gt;“But I have decades of experience.”&lt;/em&gt; And sure, experience matters. But relevant experience matters more. I remember a graphic design professor from college—someone who had written books, spoken at conferences, and built a career in print. He refused to teach web design, dismissing it as a fad. That mindset didn’t age well.&lt;/p&gt;
&lt;p&gt;There are still strengths that tech incursions can’t displace—understanding customers, navigating complexity, leading teams across disciplines. But we can’t ignore how the &lt;em&gt;craft&lt;/em&gt; itself is changing. And if you’re a design leader, your job isn’t just to set direction—it’s to stay close enough to the work to guide your team through the shifts. Because when the ground moves, they’ll need you to be steady &lt;em&gt;and&lt;/em&gt; skilled.&lt;/p&gt;
&lt;h2&gt;Career reboot&lt;/h2&gt;
&lt;p&gt;As my spring break wraps up, I’m not walking away feeling old—I’m walking away with a sense of clarity: it’s time for a career reboot. Two years ago, I called the tech factory reset. Now, I’m giving myself permission to do the same. A reboot doesn’t mean discarding everything. The valuable experiences, the hard-earned instincts—they reinstall quickly. What I &lt;em&gt;am&lt;/em&gt; letting go of are the dependencies and assumptions that no longer serve me. The ones that keep you comfortable but slowly make you obsolete.&lt;/p&gt;
&lt;p&gt;I don’t need to be recast as the lead in someone else’s Marvel reboot. I want to play a different role: the bridge between generations, helping to pass the torch—not by clinging to the past, but by staying grounded in it while reaching toward what’s next.&lt;/p&gt;
&lt;p&gt;To do that, I’m making a few commitments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stay healthy and well.&lt;/strong&gt; Don’t let burnout rob you of clarity or connection. Take care of your mind, body, and the people who matter.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep the craft blade sharp.&lt;/strong&gt; Return to your roots. Lead through craft. Understand the material of this new era—especially AI. As Nikunj Kothari put it: stop bookmarking, start building.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Invest in the next generation.&lt;/strong&gt; Mentor. Share your playbook. Let their perspective reshape yours, too.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I was an IC running my own studio when &lt;em&gt;The Avengers&lt;/em&gt; hit theaters. Now, fifteen years later, I’m an operator and investor as &lt;em&gt;Secret Wars&lt;/em&gt; looms. My 20s were shaped by the Mobile Incursion in Seattle. My 30s, the Blitzscaling Era in San Francisco. And now, in my 40s, I’m back in SF, navigating the AI Incursion.&lt;/p&gt;
&lt;p&gt;This isn’t the end of an era. It’s the beginning of another. I don’t feel irrelevant—I feel rebooted. And I’m working on the most relevant things of my career.&lt;/p&gt;
&lt;p&gt;Let’s get back to work.&lt;/p&gt;
</content:encoded><category>writing</category><category>career</category><category>ai</category></item><item><title>Waiting for AI&apos;s pull-to-refresh moment</title><link>https://www.davidhoang.com/writing/waiting-for-ais-pull-to-refresh-moment</link><guid isPermaLink="true">https://www.davidhoang.com/writing/waiting-for-ais-pull-to-refresh-moment/</guid><description>The race to the interface</description><pubDate>Sun, 03 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There is a gesture on the iPhone that long-time mobile users are familiar with that has non-native origins. If you open the official Mail app on the inbox view, you can &quot;pull&quot; the interface down and the app will refresh with more emails. This is known as &quot;pull-to-refresh.&quot;&lt;/p&gt;
&lt;p&gt;What not everyone may know is this interaction was made popular and invented by Loren Brichter, an independent developer who created Tweetie, a Twitter client that would later be acquired by Twitter in 2010. The pull-to-refresh gesture wasn&apos;t just a novel interaction—it was a paradigm shift that would become ubiquitous across mobile applications.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.davidhoang.com/images/blog/2023/2023-09-03-pull-to-refresh.webp&quot; alt=&quot;Waiting for AI&apos;s pull-to-refresh moment&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;The story of pull-to-refresh&lt;/h2&gt;
&lt;p&gt;In 2008, Loren Brichter was working on Tweetie, what many described as &quot;the Twitter app Apple itself would have made.&quot; The challenge was simple: how do you refresh a timeline of tweets in an elegant, intuitive way?&lt;/p&gt;
&lt;p&gt;Traditional approaches involved tapping a refresh button, usually located at the top of the screen. But Brichter had a different vision. He noticed that when users scrolled to the top of a list, there was a natural elasticity—the interface would &quot;bounce&quot; back into place. What if that bounce could trigger an action?&lt;/p&gt;
&lt;p&gt;The solution was ingenious in its simplicity. Instead of requiring users to scroll to the top, lift their finger, and tap a refresh button, why not make refreshing part of the scroll gesture itself? Users could simply pull down on the timeline, and upon release, new tweets would load automatically.&lt;/p&gt;
&lt;h2&gt;The anatomy of interface innovation&lt;/h2&gt;
&lt;p&gt;Pull-to-refresh succeeded because it solved multiple problems simultaneously:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Discoverability&lt;/strong&gt;: The gesture felt natural and was easily discoverable through normal scrolling behavior.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Efficiency&lt;/strong&gt;: It eliminated the need for precise button tapping, especially valuable on small touch screens.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Delight&lt;/strong&gt;: The elastic animation and satisfying &quot;snap&quot; made the interaction enjoyable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Intuitiveness&lt;/strong&gt;: It leveraged existing mental models of physical interactions—pulling to retrieve something new.&lt;/p&gt;
&lt;p&gt;But perhaps most importantly, it turned a mechanical action into something that felt magical. This wasn&apos;t just a functional improvement; it was a fundamental reimagining of how users could interact with dynamic content.&lt;/p&gt;
&lt;h2&gt;The ubiquity that followed&lt;/h2&gt;
&lt;p&gt;Today, pull-to-refresh is everywhere. From social media apps to email clients, from news readers to messaging platforms, the gesture has become as fundamental to mobile interaction as the tap or swipe. It&apos;s been adopted across iOS, Android, and web applications. What started as one developer&apos;s elegant solution to a specific problem became a universal design pattern.&lt;/p&gt;
&lt;p&gt;The gesture even earned its own patent (filed by Twitter after they acquired Tweetie), though Brichter himself has suggested that developers shouldn&apos;t worry about its enforcement. The fact that such a simple interaction warranted patent protection speaks to its innovation and impact.&lt;/p&gt;
&lt;h2&gt;AI&apos;s interface challenge&lt;/h2&gt;
&lt;p&gt;So why does this matter for AI? Because we&apos;re currently in the midst of another interface revolution, and AI still hasn&apos;t found its &quot;pull-to-refresh moment.&quot;&lt;/p&gt;
&lt;p&gt;Think about how we interact with AI today. Despite the sophisticated capabilities of large language models, we&apos;re still largely confined to the text box—typing prompts, waiting for responses, and engaging in turn-based conversation. It&apos;s functional, but it&apos;s not revolutionary.&lt;/p&gt;
&lt;p&gt;The current AI interface paradigm mirrors the early days of mobile apps: lots of buttons, explicit actions, and rigid interaction patterns. Just as mobile apps initially mimicked desktop interfaces before finding their own voice, AI applications are still searching for their native interaction model.&lt;/p&gt;
&lt;h2&gt;The race to the interface&lt;/h2&gt;
&lt;p&gt;We&apos;re seeing glimpses of what AI&apos;s interface evolution might look like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Voice interfaces&lt;/strong&gt; that make AI feel more conversational and immediate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multimodal interactions&lt;/strong&gt; that combine text, voice, and visual inputs seamlessly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contextual triggers&lt;/strong&gt; that activate AI based on what you&apos;re doing or where you are.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proactive assistance&lt;/strong&gt; that anticipates needs rather than waiting for explicit requests.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gesture-based controls&lt;/strong&gt; that make AI feel more natural and less mechanical.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But we haven&apos;t yet seen the breakthrough that will make AI interactions feel as intuitive and delightful as pull-to-refresh made content refreshing.&lt;/p&gt;
&lt;h2&gt;What AI&apos;s pull-to-refresh moment might look like&lt;/h2&gt;
&lt;p&gt;The breakthrough won&apos;t necessarily be a gesture—it will be a fundamental reimagining of how we interact with intelligent systems. It might be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A way to naturally &quot;pull&quot; context from your environment without explicitly describing it.&lt;/li&gt;
&lt;li&gt;An interaction that makes AI feel less like a chat session and more like thought partnership.&lt;/li&gt;
&lt;li&gt;A gesture or pattern that makes AI assistance feel as natural as scrolling through a timeline.&lt;/li&gt;
&lt;li&gt;A method that eliminates the cognitive overhead of crafting the perfect prompt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Just as pull-to-refresh made refreshing content feel effortless, AI&apos;s interface breakthrough will make accessing intelligence feel seamless.&lt;/p&gt;
&lt;h2&gt;The stakes are high&lt;/h2&gt;
&lt;p&gt;The stakes for getting AI interfaces right are enormous. The company or developer who figures out AI&apos;s equivalent of pull-to-refresh won&apos;t just create a better user experience—they&apos;ll potentially define how humanity interacts with artificial intelligence for years to come.&lt;/p&gt;
&lt;p&gt;This isn&apos;t just about convenience; it&apos;s about accessibility, adoption, and the fundamental relationship between humans and AI. The right interface paradigm could make AI assistance as natural and widespread as pull-to-refresh became for mobile apps.&lt;/p&gt;
&lt;h2&gt;Waiting for the moment&lt;/h2&gt;
&lt;p&gt;Loren Brichter&apos;s pull-to-refresh gesture succeeded because it solved a real problem in an elegant, intuitive way. It wasn&apos;t just a technical innovation—it was a design philosophy that prioritized user experience over technical complexity.&lt;/p&gt;
&lt;p&gt;AI&apos;s pull-to-refresh moment will likely follow a similar pattern. It won&apos;t be the most technically sophisticated approach, but it will be the most human one. It will solve the interface problem we didn&apos;t even know we had, making AI interactions feel as natural as pulling down to refresh a timeline.&lt;/p&gt;
&lt;p&gt;The question isn&apos;t whether this moment will come—it&apos;s who will create it, and when. And like pull-to-refresh, when it arrives, it will seem so obvious that we&apos;ll wonder how we ever lived without it.&lt;/p&gt;
&lt;p&gt;Until then, we wait, experiment, and iterate. Because somewhere, perhaps in a small development studio or a large tech company, someone is working on the gesture, interaction, or paradigm that will define the next era of human-computer interaction.&lt;/p&gt;
&lt;p&gt;The race to the interface is on. AI&apos;s pull-to-refresh moment is coming.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Originally posted on &lt;a href=&quot;https://www.proofofconcept.pub/p/waiting-for-ais-pull-to-refresh-moment&quot;&gt;Proof of Concept&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>writing</category><category>ai</category><category>interface-design</category></item></channel></rss>