<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Dee's Blog]]></title><description><![CDATA[AI engineering, design, and building in public. By Dee - ex-fintech designer, now shipping AI tools from LA.]]></description><link>https://deeflect.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/69b2ef5893256dfc53ed9b1b/75a74245-9e12-45f1-a651-67475686d825.png</url><title>Dee&apos;s Blog</title><link>https://deeflect.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Thu, 12 Nov 2026 09:14:28 GMT</lastBuildDate><atom:link href="https://deeflect.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[I was a half-builder]]></title><description><![CDATA[I have thirteen public repositories on GitHub. Three of them are real products. The rest are half-shipped: interesting starts, side-quests, idea-shaped…]]></description><link>https://deeflect.hashnode.dev/i-was-a-half-builder</link><guid isPermaLink="true">https://deeflect.hashnode.dev/i-was-a-half-builder</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Thu, 07 May 2026 22:44:53 GMT</pubDate><content:encoded><![CDATA[<p><img src="https://blog.deeflect.com/_astro/half-builder.DAtUsWre_8ijVl.webp" alt="I was a half-builder" /></p>
<p>I have thirteen public repositories on GitHub.</p>
<p>Three of them are real products.</p>
<p>The rest are half-shipped: interesting starts, side-quests, idea-shaped objects with a README and a <code>pushed_at</code> date and not much past it. <em>Universal-codemode</em>: clean idea, two demos, no users I can name. <em>Vasted</em>: works on my machine, never advertised, never used by anyone who isn't me. <em>Smart-spawn</em>: model router, never wired into anything I run daily. <em>Mcclaw</em>: Mac LLM checker, fun side build, abandoned at v0.2. <em>Moltedin</em>: a marketplace I sketched and walked away from. <em>Lobster-tools.</em> <em>Tldr-club.</em> <em>Clawbot-blog.</em></p>
<p>I built fast. I shipped half. I posted screenshots.</p>
<p>That's the dominant mode on AI-builder X right now and I want to write the post about it as someone caught inside it, not above it.</p>
<h2 id="heading-the-builderai-version">The Builder.ai version</h2>
<p>The loud version of this is Builder.ai.</p>
<p>The pitch was an AI named Natasha that built apps from a single sentence. Microsoft believed it. SoftBank's DeepCore believed it. The Qatar Investment Authority believed it. About $450M of capital believed it.</p>
<p>Behind the AI: 700 human engineers in India and Eastern Europe.</p>
<p>By 2024 the investigations had landed. Bloomberg. WSJ. <em>The Information.</em> By May 2025 the company was filing for insolvency, Microsoft and the creditors were inside the building, and "Builder.ai" had become culture-wide shorthand for AI-washing. Strap "AI" to a labor product, raise nine figures, ride the cycle until the cycle catches up.</p>
<p>That's the loud version of the pattern.</p>
<p><img src="https://blog.deeflect.com/_astro/half-builder-curtain.CzhWHXFv_ZVhL0S.webp" alt="Curtain pulled back on the AI" /></p>
<p>The quiet version is on your X feed every day, and it's not committing fraud. It's people shipping the half they can ship and calling it the whole. That's what I've been doing.</p>
<h2 id="heading-what-a-half-builder-actually-is">What a half-builder actually is</h2>
<p>Tighter than "doesn't ship":</p>
<p>A half-builder is an operator who can do exactly one half of design-to-deploy, then skips the other half by simply not showing it. They post the artifact for their good half. The bad half is implied to exist. It usually doesn't.</p>
<p>There are three failure modes and I've personally lived all three.</p>
<p><strong>The designer who can't code.</strong> Posts the Figma. Posts the AI-generated mock. Posts the screenshot, the concept, the "what if I built this?" thread. Never posts the running URL. The "build" is a frame around an image. I did this for years before I learned to ship.</p>
<p><strong>The coder who can't design.</strong> Posts the diff. Posts the gist. Posts the prompt. The thing technically runs but you wouldn't keep it open for more than a session. The interface is a textarea and a <code>&lt;details&gt;</code> tag in Helvetica. I've published a few of these too. I called them "tools."</p>
<p><strong>The either who can't ship.</strong> The most common failure mode by an order of magnitude. They can do their half competently. They can't deploy it, can't keep it up, can't onboard a single user, can't reach week two. Six demos a month. Zero products. The artifact dies in a screenshot.</p>
<p>The third failure mode is the one I've spent the most time in. I'd build a thing in a weekend, push it to a public repo, post a screenshot, get a few likes, and move to the next thing on Monday. I called that "shipping." It wasn't. It was sketching in public.</p>
<p>In all three modes the AI is real. The thing posted is real. <em>Something</em> got built. What didn't happen was building <em>the whole thing</em>. The half that wasn't shown was fake, missing, on someone else's calendar, or a TODO that never got picked up again.</p>
<p>That's a half-builder.</p>
<h2 id="heading-why-half-building-is-the-default">Why half-building is the default</h2>
<p>It's not a personal failure. It's the structure of the industry for twenty years.</p>
<p>Design and engineering have been culturally separated since the early-2000s web. You picked a side at 22. The side trained you. Designers learned visual systems, components, motion, brand. Engineers learned data structures, infra, deployment, latency budgets. The handoff was the deliverable. Each side optimized for being good at their half, because their half was the whole job.</p>
<p>AI is collapsing that gap.</p>
<p>Every tool that closes the design-to-code distance (Figma-to-code generators, coding assistants, no-code with escape hatches, full-stack agents) pays out to operators who hold both sides in one head. The premium isn't on either half anymore. It's on the seam.</p>
<p>Twenty years of single-side specialization don't unwind in a hype cycle.</p>
<p>So the dominant cohort on AI-builder X is exactly who you'd expect. People whose career was built around being competent at one half. Learning AI in real time. Posting the half they can already do. Hoping the AI bridges the rest.</p>
<p>Sometimes it does. Most of the time it doesn't. The shipped product never appears. The next thread does.</p>
<p>I've been on this side of the timeline for years. Designers who became "builders" the day GPT-4 dropped. Engineers who became "AI engineers" the day Cursor got good. I'm one of them. The honest answer is that AI made it embarrassingly easy to <em>look</em> like a whole-builder while staying a half-builder underneath.</p>
<p>Builder.ai was that, with a $450M check on top.</p>
<h2 id="heading-what-ive-actually-shipped-and-what-ive-half-shipped">What I've actually shipped (and what I've half-shipped)</h2>
<p>Here's the honest receipts list. Not the highlight reel.</p>
<p><strong>Real products people use:</strong></p>
<ul>
<li><strong>Dory.</strong> Shared memory layer for AI agents. Local-first, markdown source of truth, CLI / HTTP / MCP native. Open-source on GitHub, has actual users, gets actual issues filed. This is the only one I'd call run-grade.</li>
<li><strong>deeflect.com.</strong> Personal site, in production, anchors my entity online.</li>
<li><strong>blog.deeflect.com.</strong> Thirty-one published articles. Some of them are good. Not all of them are from this year, that was overstated in earlier drafts of this essay.</li>
<li><strong>dee.agency.</strong> Solo studio site, productized AI work.</li>
<li><strong>Don't Replace Me.</strong> Survival book on the AI apocalypse, paperback, hardcover, Kindle, on Amazon. Written end-to-end. People are reading it.</li>
<li><strong>The SEO-to-GEO Gap.</strong> First research paper, accepted and posted on SSRN this month with a real DOI. First peer-review-adjacent credential I've ever earned.</li>
</ul>
<p><strong>Half-shipped:</strong></p>
<ul>
<li><strong>ViBE.</strong> Twitter-based reception benchmark across 22 frontier AI model families, 2,965 judged mentions, $1.92 in judge cost. I love the writeup. I keep pitching the writeup. The benchmark itself is dogshit as a continuous product. It's a one-shot artifact, not a living thing, and treating it like a flagship was me confusing "interesting research" for "shipped product."</li>
<li><strong>Universal-codemode.</strong> Two tools that replace hundreds. Clever. Not used.</li>
<li><strong>Vasted.</strong> GPU-inference one-liner. Works. Unadopted.</li>
<li><strong>Smart-spawn.</strong> Model router. Demo grade.</li>
<li><strong>Castkit.</strong> CLI demo recorder in Rust. Cute. Sat down.</li>
<li><strong>Mcclaw.</strong> Mac-LLM checker. Fun. Abandoned.</li>
<li><strong>Moltedin / lobster-tools / tldr-club / clawbot-blog.</strong> Different shapes, same pattern. Started, posted, walked away.</li>
</ul>
<p><strong>The actual range underneath all of it:</strong></p>
<p>Fifteen years of design. A cybersecurity bachelor. Firmware on ESP32 and marauder builds when the topic shifts. Designed for VALK across 70-plus financial institutions and 15 countries before walking out of that role earlier this year. Russian-born, lived across five-plus countries. ADHD wired enough to learn shit in a week and bored enough to walk away from it in a month.</p>
<p>The range is real. The shipping discipline isn't there yet.</p>
<p>In October 2025 I burned out and quit X for six months from a 200K-impressions-a-day peak. I'm reactivating from 640 followers as I write this. The list above is what got built around the crash year: three real products, a book, a paper, a personal entity I can point to, and a graveyard of clever half-things.</p>
<p>That's the honest picture. I'm a recovering half-builder.</p>
<h2 id="heading-the-opposite-cohort">The opposite cohort</h2>
<p>The opposite of a half-builder is a whole-builder.</p>
<p>A whole-builder is one operator who covers design + code + AI + deploy + distribution end-to-end with no handoff. They pick fewer fights. They keep the artifacts alive past launch week. They have repos with users in the issue tracker, not just stars in the corner.</p>
<p>Pieter Levels is the canonical example. Design, code, deploy, distribute, monetize, all solo, all in public, receipts measured in MRR and screenshots. Marc Lou ships products with full visual identity attached. Theo runs an entire product line out of what he can hold in one head.</p>
<p>These aren't unicorns. They're the rarer category: operators who didn't pick a side and built their working pattern <em>around</em> not having a handoff. They're also the operators who said no to the next side-quest and kept the last one running.</p>
<p>I've copied the breadth half of that pattern. I haven't copied the discipline half. Whole-building isn't about doing more. It's about doing fewer things further. That part I'm still learning.</p>
<h2 id="heading-how-to-spot-a-half-builder-mirror-included">How to spot a half-builder (mirror included)</h2>
<p>Most "AI builders" on the internet right now are half-builders, and most of us know which side we're on if we're honest about it.</p>
<p>The test is mechanical. It costs nothing. Run it on every "AI builder" account in your timeline this week, and on yourself.</p>
<p><strong>Ask for the running URL.</strong> Not the prompt. Not the screenshot. Not the demo video. The URL someone else can open right now, on their phone, with no auth, no waitlist. If they can't produce one, you're talking to half a builder.</p>
<p><strong>Ask for the repo.</strong> Public repo, last commit recent enough to matter, an issue tracker that isn't a ghost town. If "the code is private", fine. Ask for the deployed product. If neither exists, you have your answer.</p>
<p><strong>Ask what they shipped this month.</strong> Not last year. Not "in their career." This month. Half-builders ship demos. Whole-builders ship products that someone else is using on a Tuesday morning.</p>
<p>If you ran that on me a month ago, you'd hear about ViBE and a clever Rust thing and a model router and a half-finished benchmark and a launch I almost did. You'd hear about everything except a product someone else opened on a Tuesday. The honest answer would have been Dory, and maybe the blog, and the rest is noise.</p>
<p>Show the repo or sit down, including the one I'm pointing back at when I write that.</p>
<p><img src="https://blog.deeflect.com/_astro/half-builder-bouncer.DTjDBBTR_ZayotY.webp" alt="Bouncer at the door asking for the running URL" /></p>
<h2 id="heading-stopping">Stopping</h2>
<p>The exit from being a half-builder is mechanical, not mystical.</p>
<p>Pick the half you can't do and start doing it badly until you can do it. Designers shipping their first deploy. Coders learning visual hierarchy. Either learning distribution. The half you can't do isn't a personality. It's a backlog.</p>
<p>Pick fewer things. Keep them alive past the first week. Treat "shipped" as "someone else used it on a Tuesday," not "pushed to GitHub on a Sunday."</p>
<p>Whole-building is a slow accumulation of the second half by the first, until the seam disappears. None of that happens in a single weekend.</p>
<p>This essay is the first move. The next moves are: Dory gets the maintenance it deserves. ViBE either becomes a continuously-updating thing or gets retired honestly as a one-shot paper, not pretended into a flagship. The agency stops being a placeholder. The next side-quest waits its turn, or doesn't get started.</p>
<p>I'm writing this with the same uncertainty most of you feel scrolling past it. <em>Am I the half-builder? Probably. What does the turn look like? Like this.</em></p>
<p>Build the whole thing.</p>
<p>Ship the running URL.</p>
<p>Show the repo.</p>
<p>Or sit down, including me.</p>
<p>That's the post.</p>
<hr />
<p><em>Sources for the Builder.ai facts: Bloomberg's investigation into the company's engineering operations (2024), the Wall Street Journal's coverage of the May 2025 insolvency, and </em>The Information<em>'s reporting on the human-engineer back-end. Public, well-indexed; current URLs available via search.</em></p>
]]></content:encoded></item><item><title><![CDATA[SEO Is Dead? No. But the Game Changed.]]></title><description><![CDATA[I asked ChatGPT who I am. It had nothing. No idea I existed. I've been deep in the AI space for a while now. I spent 5 years as lead product designer at a…]]></description><link>https://deeflect.hashnode.dev/seo-is-dead-no-but-the-game-changed</link><guid isPermaLink="true">https://deeflect.hashnode.dev/seo-is-dead-no-but-the-game-changed</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Thu, 26 Mar 2026 10:00:00 GMT</pubDate><enclosure url="https://blog.deeflect.com/_astro/seo-is-dead-long-live-geo.OgE9-lyH_2nOOCb.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I asked ChatGPT who I am. It had nothing. No idea I existed.</p>
<p>I've been deep in the AI space for a while now. I spent 5 years as lead product designer at a fintech platform serving 70+ financial institutions. I shipped <a target="_blank" href="https://dee.ink">31 open-source Rust CLI tools</a>. Published 13 blog posts. Built in public for months. And the models I use every day had zero record of me.</p>
<p>That bothered me more than it probably should have. But it also made sense once I started pulling the thread. Because "SEO is dead" isn't quite right - but something real is shifting, and I wasn't ready for it.</p>
<p>This is what I found.</p>
<h2 id="heading-the-two-games-nobody-told-me-i-was-playing">The two games nobody told me I was playing</h2>
<p>There's Google-findable. And there's AI-citable. I had one. I completely lacked the other.</p>
<p>Traditional SEO is about ranking. You write content, build links, optimize your pages, and Google surfaces you when someone searches. The pipeline is: search query → ranked results → human clicks through. That's the game most people know how to play.</p>
<p>Generative Engine Optimization - GEO - is about citation. AI generates an answer. Your content, your name, your entity gets referenced in that answer. The pipeline skips the click entirely. There's no blue link. The model just knows you exist, or it doesn't.</p>
<p>I had spent zero time thinking about the second one. Which meant I was completely invisible to the systems I use to do my actual work. The irony was genuinely annoying.</p>
<p>That gap is what sent me down a multi-week research rabbit hole that ended with an open-source platform list, a scoring system, and a website full of free tools. But I'm getting ahead of myself.</p>
<h2 id="heading-whats-actually-happening-to-search-right-now-and-why-seo-is-dead-keeps-trending">What's actually happening to search right now - and why "SEO is dead" keeps trending</h2>
<p>The data isn't speculative anymore. BrightEdge tracked AI Overviews appearing in 11% of all queries in 2025. CTR is down 30%. People are asking AI assistants instead of searching, and when they do search, they're increasingly getting an AI-generated summary instead of ten blue links.</p>
<p>This isn't a prediction. It's already the baseline. The shift isn't coming - it happened while everyone was arguing about whether it would.</p>
<p>SparkToro's 2025 data puts this in concrete terms: top established brands appear in 55-77% of relevant AI responses. Unknown entities? 70x more volatile. You either have consistent presence or you have noise. There's not much middle ground.</p>
<p>The question stopped being "how do I rank?" and became "how do I get cited?"</p>
<p>What made this hit differently for me was trying to find myself across the major AI systems. Not just ChatGPT. I asked Claude, asked Perplexity, asked Google's AI Overview. The results were inconsistent in a way that told me something real: these systems aren't pulling from the same data, aren't weighting the same signals, and aren't resolving entities the same way. Being findable on one doesn't mean you're findable on all. That fragmentation is the part nobody's really mapped yet - including most of the GEO content I've seen so far.</p>
<h2 id="heading-seo-isnt-dead-lets-be-honest-about-that">SEO isn't dead - let's be honest about that</h2>
<p>The title is provocative on purpose. Here's the actual nuance, because I think people deserve a straight answer rather than a hot take.</p>
<p>seoClarity's 2025 research found that 99.5% of AI Overview sources come from Google's top 10 organic results. Read that again. The AI is pulling from Google's rankings. Which means if you don't rank, you don't get cited. SEO is still the prerequisite. GEO builds on top of it.</p>
<p>So no, you shouldn't burn your SEO playbook. You should add a chapter.</p>
<p>What changed is the goal. Ranking #1 used to be the finish line. Now ranking #1 gets you in the candidate pool for AI citation. That's still worth doing. But it's not sufficient anymore. You can rank well and still be invisible to AI systems if you're missing the signals that models use to identify credible, citable entities.</p>
<p>Think about what that means practically. You could have a page ranking on the first page of Google for a competitive keyword - real traffic, real impressions - and still not get cited in an AI-generated answer for the same query. Because the ranking signals and the citation signals overlap but aren't identical. You need both. And most SEO workflows are only optimizing for one.</p>
<p>That's the shift. Not death. Evolution with a second layer that most people haven't started thinking about yet - including me, until very recently.</p>
<h2 id="heading-what-geo-actually-is-and-why-the-research-convinced-me">What GEO actually is and why the research convinced me</h2>
<p>Generative Engine Optimization is the practice of optimizing your online presence to appear in AI-generated answers, not just search rankings.</p>
<p>The foundational paper here is Aggarwal et al., published at KDD '24 - <a target="_blank" href="https://arxiv.org/abs/2311.09735">you can read it on arXiv</a>. They tested different optimization strategies across a range of queries and found that the right approach could drive up to a 40% increase in AI visibility. The top strategies weren't what I expected: citations and statistics outperformed most other approaches. Authoritative sourcing matters enormously to how models evaluate content.</p>
<p>Structured data, clear entity signals, and demonstrable expertise all feed into whether a model considers you citable. This isn't link juice. It's closer to reputation infrastructure - the stuff that makes a model "trust" that you're a real entity with real credentials.</p>
<p>What clicked for me is that this maps to how the models actually work. They don't crawl the web in real time. They learned from a corpus. And in that corpus, some entities are clearly defined, well-referenced, consistently mentioned. Others are noise. I was noise.</p>
<h3 id="heading-the-content-structure-piece-most-people-miss">The content structure piece most people miss</h3>
<p>The Aggarwal research gets into something most GEO content glosses over: it's not just what you publish, it's how you structure it.</p>
<p>Content that AI systems cite tends to have specific characteristics. It makes direct, falsifiable claims. It cites external sources. It includes statistics with attribution. It answers questions in a way that can be cleanly excerpted. This last point matters more than I initially thought - AI systems aren't summarizing your whole article, they're pulling specific passages. If your content isn't written in citable chunks, it's harder for a model to quote you cleanly even when it wants to.</p>
<p>This is actually a content design problem as much as an SEO problem. It's related to something I've written about before in the <a target="_blank" href="/03-ai-bad-ux/">AI UX space</a> - most people building for AI systems haven't thought about the machine as a reader with specific needs. The machine reads differently than a human does. It's looking for density, structure, and attributable claims.</p>
<p>Writing for AI citation means writing in a way that makes a model's job easier. Short, precise statements. Named sources. Numbers with context. The exact opposite of the fluffy "this is interesting to explore" writing style that pads word counts but says nothing.</p>
<h2 id="heading-the-data-point-that-actually-rewired-how-i-think-about-this">The data point that actually rewired how I think about this</h2>
<p>I went deep on the Ahrefs research and one number kept stopping me.</p>
<p>Brand mention correlation to AI citation: <strong>0.664</strong>. Backlink correlation: <strong>0.218</strong>.</p>
<p>That's not a small gap. Brand mentions are three times more predictive of AI visibility than backlinks. Three times. The entire SEO industry is built around backlinks as the gold standard signal - and for Google rankings, that's still mostly true. But for AI citation, what matters is whether your name, your brand, your entity is being talked about across the web.</p>
<p>The Semrush data added another layer: nofollow links perform nearly as well as dofollow links for AI visibility. In traditional SEO, a nofollow link is worth significantly less. For GEO purposes, the signal isn't the PageRank transfer - it's the mention. The presence. The fact that you're being referenced.</p>
<p>This is a real reorientation. The question isn't just "who links to me?" It's "who talks about me, mentions me, references me across contexts?" Those are different things. The second one is what I had been ignoring completely.</p>
<p>It connects to something I wrote about <a target="_blank" href="/01-quit-fintech/">leaving fintech to build AI systems</a> - the whole reason I went independent was to build things that matter. Building an AI presence that's actually citable is part of that.</p>
<h3 id="heading-what-the-platform-data-actually-shows">What the platform data actually shows</h3>
<p>When I started auditing where brand mentions were coming from across the 168 platforms I ended up cataloging, some patterns were obvious in hindsight.</p>
<p>Platforms that block AI crawlers still contribute to traditional SEO - backlinks, referral traffic, domain authority signals. But they contribute zero to AI citation. If a major AI crawler can't index the content where you're being mentioned, that mention is invisible to the model. Doesn't matter how high-authority the platform is. Doesn't matter how many people read it. The AI never saw it.</p>
<p>Several platforms that have solid SEO reputations block AI crawlers entirely. A few you'd never expect have wide-open access. The robots.txt data across 168 platforms genuinely changed my prioritization for where to spend time building presence.</p>
<p>High-DA platform with AI crawlers blocked: useful for search rankings, useless for GEO. Medium-DA platform with full AI crawler access: directly contributes to citation potential. Those aren't the same trade-off at all. Treating them the same - which most SEO frameworks do - is leaving real GEO value on the table.</p>
<h2 id="heading-why-seo-is-dead-gets-the-diagnosis-wrong-but-identifies-a-real-symptom">Why "SEO is dead" gets the diagnosis wrong but identifies a real symptom</h2>
<p>I keep seeing the "SEO is dead" framing in newsletters, on Twitter, in founder group chats. It's not accurate but it's pointing at something real: the workflows that worked in 2020 are producing worse results in 2025. That's true. The feeling that something fundamental has changed is correct. The conclusion that SEO itself is dead is wrong.</p>
<p>What's happening is that SEO was always a proxy for something else - demonstrating that your content is trustworthy and relevant. Google built ranking signals as a proxy for that. Now AI systems are building citation signals as a different proxy for the same underlying thing. The underlying thing didn't change. The measurement changed.</p>
<p>If you had real expertise and real content depth, most GEO strategies will work for you because you actually have the substance those signals are trying to measure. If you were gaming SEO with thin content and link schemes, GEO is going to be harder because the signals it uses are less gameable. Brand mentions across real communities are harder to manufacture than backlinks. Genuine citations in credible content are harder to fake than directory submissions.</p>
<p>That's probably a good thing. The <a target="_blank" href="/08-prompt-eng-dead/">prompt engineering is dead</a> conversation is related - these systems keep evolving in ways that reward actual depth over tactical gaming. GEO continues that trend.</p>
<p>The mistake is treating this as a binary. SEO or GEO. Old playbook or new playbook. It's additive. Everything that made content good for search still applies. Now there's additional surface area to optimize - entity signals, structured data, AI crawler access, brand mention distribution - that wasn't relevant before.</p>
<h2 id="heading-what-i-built-to-solve-this">What I built to solve this</h2>
<p>Once I understood the problem I started doing the research manually - checking which platforms actually allow AI crawlers, which ones block them in robots.txt, which ones have high GEO value versus medium versus low. Doing it by hand was a pain in the ass. So I built a system.</p>
<p><a target="_blank" href="https://github.com/deeflect/awesome-geo">awesome-geo</a> is the output: a curated, verified list of 168 platforms with full crawler access data. 142 of them are AI-discoverable. I scored them: 74 high GEO value, 78 medium, 16 low. Every platform has been manually verified against robots.txt for the major AI crawlers - GPTBot, ClaudeBot, Anthropic's crawler, Google-Extended.</p>
<p>I also built <a target="_blank" href="https://geo.deeflect.com">geo. deeflect.com</a> - free tools that came out of doing this manually and wishing they existed. AI Visibility Checker, JSON-LD Generator, llms.txt Generator, Meta Tags Generator, robots.txt Generator.</p>
<p>I built this because I needed it and figured others would too. It's open source. Use it.</p>
<p>The reason I verified robots.txt across all 168 platforms is that it matters more than most people realize. A platform could have high domain authority and great SEO value - but if it blocks AI crawlers, it contributes zero to your GEO presence. Several well-known platforms do exactly that. Knowing which ones are actually AI-accessible changes your prioritization completely.</p>
<p>The other thing that came out of building this: the verification process itself is time-consuming in a way that scales badly. You can't just check robots.txt once. Platforms update their policies. A platform that allowed GPTBot in 2023 might have added restrictions in 2024. The landscape is moving, which means any static list becomes stale. The tools at geo. deeflect.com are built to stay current rather than being a snapshot.</p>
<p>This is part of the same instinct that drove <a target="_blank" href="/04-seven-apps/">building multiple projects solo</a> - when I hit friction repeatedly, I build the thing that removes it, then make it available. The GEO research tooling is that, applied to discoverability infrastructure.</p>
<h2 id="heading-what-to-do-right-now-if-you-care-about-any-of-this">What to do right now if you care about any of this</h2>
<p>You don't need to overhaul everything. Start here:</p>
<ul>
<li><strong>Check where you're mentioned.</strong> Brand mentions are the highest-correlation signal. Are you being referenced across contexts beyond your own site?</li>
<li><strong>Add JSON-LD structured data.</strong> This is how you communicate entity information to AI systems. If you haven't done it, <a target="_blank" href="https://geo.deeflect.com">geo. deeflect.com</a> has a free generator.</li>
<li><strong>Create an llms.txt file.</strong> Similar to robots.txt but for LLMs - it gives AI systems structured information about who you are and what you do. Again, free generator on the site.</li>
<li><strong>Verify your platforms allow AI crawlers.</strong> Check the robots.txt on any platform you're counting on for AI visibility. You might be surprised what you find.</li>
<li><strong>Think about entity consistency.</strong> Your name, credentials, and core claims should be stated consistently across platforms. Inconsistency makes entity resolution harder for models.</li>
<li><strong>Use citations and statistics in your content.</strong> The KDD '24 research is clear: this is a top GEO signal. Reference real sources. Include real numbers. This post does that on purpose.</li>
<li><strong>Audit your content structure.</strong> Are your key claims written in excerptable chunks? Can a model pull a clean sentence or paragraph that stands on its own? If not, restructure. This is different from readability optimization - it's citation optimization.</li>
</ul>
<p>The <a target="_blank" href="/08-prompt-eng-dead/">prompt engineering is dead</a> argument I've seen floating around is related to this - the game keeps shifting toward higher-level signals, away from tactical optimization. GEO is the same shift applied to discoverability.</p>
<h2 id="heading-where-this-goes-from-here">Where this goes from here</h2>
<p>I'm just getting started on this.</p>
<p>The research took me deep enough that I have a lot more to share - how different AI systems handle citations differently, what the actual citation mechanics look like across ChatGPT versus Claude versus Perplexity, how to structure content specifically for AI summarization, what the verification data across 168 platforms actually reveals about the crawling landscape.</p>
<p>The fragmentation across AI systems is the next thing I want to dig into properly. Right now, most GEO content treats "AI visibility" as a monolithic thing. It's not. Being cited by Perplexity requires different signals than being cited in a Google AI Overview. ChatGPT's training data cutoff means recent content won't affect your visibility there until the next model version. Claude uses different weighting. These aren't the same problem. Treating them the same is leaving real optimization opportunities untouched.</p>
<p>This article is the intro. I'm building out a full GEO research series here - the tools are live, the data is real, and I'm going to keep digging.</p>
<p>If you've been heads-down on traditional SEO and haven't thought about AI visibility yet, now's the time to start. Not because SEO is dead. Because the finish line moved - and most people haven't noticed yet.</p>
<p>SEO got a co-pilot. Learn to fly both.</p>
<hr />
<p><em>Tools and research: <a target="_blank" href="https://geo.deeflect.com">geo. deeflect.com</a> - <a target="_blank" href="https://github.com/deeflect/awesome-geo">awesome-geo on GitHub</a></em></p>
]]></content:encoded></item><item><title><![CDATA[The Distribution Problem Nobody Talks About]]></title><description><![CDATA[I have 61 post drafts queued up. 91 reply drafts. 18 finished blog posts, voice-matched and slop-filtered, ready to go. The distribution problem nobody…]]></description><link>https://deeflect.hashnode.dev/the-distribution-problem-nobody-talks-about</link><guid isPermaLink="true">https://deeflect.hashnode.dev/the-distribution-problem-nobody-talks-about</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Wed, 11 Mar 2026 12:00:00 GMT</pubDate><enclosure url="https://blog.deeflect.com/medium-img/the-distribution-problem-nobody-talks-about.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I have 61 post drafts queued up. 91 reply drafts. 18 finished blog posts, voice-matched and slop-filtered, ready to go. The distribution problem nobody talks about isn't content scarcity - it's the gap between a full queue and zero published output. That gap is where builder ambition goes to die quietly, surrounded by perfectly organized markdown files and automated scheduling daemons that never fire.</p>
<p>Let me explain how I got here.</p>
<h2 id="heading-the-distribution-problem-in-numbers">The distribution problem, in numbers</h2>
<p>Last week I built a full content automation pipeline. About 20 hours of work. I also built a road trip planning app with Maps integration (3 hours), set up a music production pipeline with AI voice conversion (2 hours), and my agent stack ran 240 autonomous sessions across three days while I was offline doing whatever offline people do.</p>
<p>Content published: zero.</p>
<p>That ratio is not a typo. 25+ hours of building, 240 agent sessions processing work in the background, and the public output was nothing. The drafts sit in a queue. The queue is full. The queue has been full for weeks.</p>
<p>This is the distribution problem nobody in the builder community talks about, because talking about it means admitting the pipeline is a cope.</p>
<h2 id="heading-what-i-actually-built">What I actually built</h2>
<p>Let me give you the full picture so you understand how deep this goes.</p>
<p>The system is called CCC - Content Command Center. Here's what it does:</p>
<p>A scanner watches my X timeline and pulls content into a viral library. I've got 19 saved tweets in there right now. A remix engine takes those, plus my own writing patterns, and generates drafts in three streams: reaction tweets, personal/building-in-public posts, and evergreen content. Each draft goes through voice matching. Slop filtering. Then into schedule slots at 8am, 12pm, and 5pm with jitter built in so it doesn't look bot-like.</p>
<p>The posting layer runs through a Playwright daemon, headless Chromium on port 3381, because OAuth kept throwing 403s on replies. I spent a full afternoon debugging that. It works now. It posts to X and I've got Bluesky and LinkedIn integration planned.</p>
<p>The system is genuinely good. Multi-platform support, three content streams, voice-matched output, automated scheduling with a real distribution daemon underneath it. If I were selling this as a SaaS tool, I'd be proud of the architecture.</p>
<p>But there's 61 post drafts and 91 reply drafts sitting in the queue.</p>
<p>Nothing posted.</p>
<h2 id="heading-when-your-own-agent-calls-you-out">When your own agent calls you out</h2>
<p>Here's where it gets embarrassing.</p>
<p><img src="https://blog.deeflect.com/medium-img/the-distribution-problem-nobody-talks-about-1.jpg" alt="When your own agent calls you out" /></p>
<p>My AI agent system does weekly knowledge graph rebuilds. It maps entities and relationships across everything I'm working on - projects, patterns, decisions, outputs. I didn't ask it to do anything special. It just runs.</p>
<p>Last week it created a node called <code>revenue_avoidance_pattern</code> and connected it to multiple projects.</p>
<p>Not <code>work_in_progress</code>. Not <code>pre-launch_phase</code>. Revenue avoidance pattern.</p>
<p>The agent found this pattern by analyzing my behavior across weeks of data and decided it was significant enough to be a named entity in my knowledge graph. My tools are diagnosing me now. I built a system smart enough to identify that I'm using building as a substitute for shipping, and now I have to sit with that.</p>
<p>The knowledge graph has this node connected to OpenClaw, CCC, dee.ink (my <a target="_blank" href="https://blog.deeflect.com/dee-ink/">31 Rust CLI tools project</a>), the blog, the social queue - everything. It's not pointing at one project as the problem. It's pointing at a pattern across all of them.</p>
<p>That's a different kind of feedback than a friend telling you to "just post more."</p>
<h2 id="heading-the-psychology-of-building-as-avoidance">The psychology of building as avoidance</h2>
<p>I've been building since I was 14. Started freelancing in design, shipped products for 70+ banks across 15 countries at VALK, won industry awards, got written up in Forbes and CNN. I know how to execute. The capability isn't the problem.</p>
<p>The problem is that building feels safe in a way that distributing doesn't.</p>
<p>Code works or it doesn't. The compiler tells you immediately. You fix it or you don't. There's no ambiguity, no social judgment, no public record of failure. When something doesn't compile you're not a bad person - you just have a bug. You fix the bug and move on.</p>
<p>Distribution is different. Distribution means putting your name on something, making a claim about it, and then watching the internet decide if it agrees. For an introvert who'd rather spend 14 hours in a hyperfocus coding session than send one networking email, that asymmetry is not small. The emotional cost of one negative reply can outweigh the satisfaction of 50 good ones. The brain doesn't do expected value math - it pattern-matches to threat.</p>
<p>So you build another tool. Another automation layer. Another pipeline. "I'll post when the system is ready." Except the system is never quite ready, because readiness is a moving target you control, and the internet's judgment is not.</p>
<p>I bought 15+ domains last month for projects I haven't started. One evening I spent scanning 3,495 TLDs for available domain names instead of posting the drafts I already had. That's not a productivity problem. That's scope expansion as a coping mechanism. Classic avoidance dressed up as preparation.</p>
<p>You're not preparing to launch. You're preparing to prepare.</p>
<p>This pattern has a name in psychology. Researchers studying creative avoidance call it "productive procrastination" - the tendency to fill time with legitimate-seeming work that doesn't advance the actual goal. A <a target="_blank" href="https://journals.sagepub.com/doi/10.1177/0956797619835973">2019 study published in Psychological Science</a> found that people systematically underweight the cost of inaction when the alternative activity feels productive. Building a better pipeline is productive. It's also not shipping. The brain accepts the substitution.</p>
<h2 id="heading-the-adhd-variable">The ADHD variable</h2>
<p>The burst-crash cycle makes this worse in a specific way.</p>
<p>My ADHD brain goes hard for 3-4 days - hyperfocus, 14-hour sessions, ship 3 projects, write 10 drafts, rebuild the whole agent stack. Then I go quiet for 4-5 days. That's not laziness. That's recovery. The neuroscience is what it is, and I stopped feeling bad about the crash phase a while ago.</p>
<p>But the burst-crash cycle interacts badly with distribution.</p>
<p>Distribution requires consistency. Not quantity - consistency. Showing up on Tuesday when you don't feel like it. Posting the medium-quality take because good enough beats nothing. Engaging with replies during the low-energy period when you'd rather be offline.</p>
<p>Building can happen in bursts. You can build an entire app in a 3-day hyperfocus sprint and it'll be fine. The code doesn't care that you disappeared for a week after.</p>
<p>An audience does. The algorithm does. The compounding effect of consistent distribution is entirely undermined by a 2-week silence after a 3-day posting burst. I wrote about <a target="_blank" href="https://blog.deeflect.com/07-disappeared/">disappearing from Twitter for two months</a> and watching the metrics crater. I know this. I still do it.</p>
<p>So the system I built - the pipeline, the scheduler, the daemon on port 3381 - is actually a real solution to a real problem. Automated distribution to compensate for the burst-crash cycle. Batched creation during hyperfocus, drip-fed output during the crash.</p>
<p>The system works. It's just not running because I haven't pressed go.</p>
<h2 id="heading-why-the-distribution-problem-nobody-talks-about-is-actually-structural">Why the distribution problem nobody talks about is actually structural</h2>
<p>Here's the thing that took me a while to see clearly. This isn't just a personal psychology problem. It's a structural problem with how builders work, and the current AI tooling makes it worse before it makes it better.</p>
<p><img src="https://blog.deeflect.com/medium-img/the-distribution-problem-nobody-talks-about-2.jpg" alt="Why the distribution problem nobody talks about is actually structural" /></p>
<p>We've had an explosion of creation tools. Claude, GPT-4o, Cursor, v0 - the cost of generating content or code has collapsed to near zero. What hasn't scaled is the decision-making layer on top of it. The question "is this worth publishing?" still costs the same amount of executive function it always did. Maybe more, because now you have 91 reply drafts instead of 9.</p>
<p>Abundance doesn't solve distribution. It makes the selection problem harder.</p>
<p>I've talked to enough builders in the AI space to know this isn't niche. The <a target="_blank" href="https://www.indiehackers.com">indie hacker forums</a> are full of people with polished MVPs that haven't launched because they're "adding one more feature." The build-in-public community celebrates shipping but rarely discusses the pre-ship paralysis that affects most of the people who never make it to the public part.</p>
<p>The tools that exist for this are surprisingly thin. Buffer and Hootsuite solve scheduling. They don't solve the threshold decision. Ghost and Substack make publishing easy. They don't help you figure out which of your 18 drafts goes first. There's a real gap here and it's not primarily a technology gap - it's a decision architecture gap.</p>
<p>The <a target="_blank" href="https://en.wikipedia.org/wiki/Decision_fatigue">research on decision fatigue</a> is relevant. The more choices you have to make, the worse your decision-making gets over the course of a day. When I've spent 8 hours making technical decisions - model selection, prompt structure, error handling - I have nothing left for "is this tweet worth posting?" So I don't. The default behavior when executive function is depleted is to do nothing, and doing nothing means the queue grows.</p>
<p>The fix isn't better content. It's removing the decision from the critical path.</p>
<h2 id="heading-the-solution-i-actually-built-and-then-sat-on-for-two-weeks">The solution I actually built (and then sat on for two weeks)</h2>
<p>I'm not going to end this with five productivity tips. You've read those. They didn't work. Here's what I'm actually trying:</p>
<p>The CCC system has a minimum viable publishing threshold I added last week. If a draft scores above a certain quality bar and has been in the queue for more than 48 hours, it goes live automatically. No manual review gate. If I want to stop a post, I have to actively intervene. Default is publish, not hold.</p>
<p>This is anti-intuitive for someone who wants everything to be perfect. That's the point.</p>
<p>The technical implementation is pretty simple. Each draft gets a composite score on creation: voice match confidence (0-1), estimated engagement based on patterns from the viral library, and a topic freshness score that decays after 72 hours. Anything above 0.7 composite after 48 hours in queue triggers a publish. I can override with a <code>HOLD</code> flag in the draft metadata. But I have to do that actively - the default is go.</p>
<p>Here's what the draft metadata looks like:</p>
<pre><code class="lang-json">{
 <span class="hljs-attr">"draft_id"</span>: <span class="hljs-string">"ccc_20250118_042"</span>,
 <span class="hljs-attr">"content"</span>: <span class="hljs-string">"..."</span>,
 <span class="hljs-attr">"created_at"</span>: <span class="hljs-string">"2025-01-18T04:22:00Z"</span>,
 <span class="hljs-attr">"scores"</span>: {
 <span class="hljs-attr">"voice_match"</span>: <span class="hljs-number">0.84</span>,
 <span class="hljs-attr">"engagement_est"</span>: <span class="hljs-number">0.71</span>,
 <span class="hljs-attr">"freshness"</span>: <span class="hljs-number">0.93</span>
 },
 <span class="hljs-attr">"composite"</span>: <span class="hljs-number">0.83</span>,
 <span class="hljs-attr">"status"</span>: <span class="hljs-string">"QUEUED"</span>,
 <span class="hljs-attr">"publish_after"</span>: <span class="hljs-string">"2025-01-20T04:22:00Z"</span>
}
</code></pre>
<p>If <code>status</code> is <code>QUEUED</code> and <code>publish_after</code> has passed and composite is above threshold, the daemon posts it. No human in the loop unless I add a <code>HOLD</code> flag. Default behavior is publish.</p>
<p>I'm treating distribution the same way I treated the <a target="_blank" href="https://blog.deeflect.com/06-coding-stack/">coding stack</a> - build the system so the right behavior happens by default, not by willpower. Willpower depletes. Systems don't.</p>
<p>The irony is that the most publishable thing I've made in weeks is this post. The thing where I admit that I have 18 finished blog drafts and haven't posted any of them. The thing where I confess my agent system diagnosed me with revenue avoidance. The thing that took me two hours to write instead of the 20 hours I spent building the pipeline that would have made posting automatic.</p>
<p>Vulnerability is more interesting than competence. People can't relate to "I built a perfect system" - they can relate to "I built a perfect system and then didn't use it for two weeks because I was scared."</p>
<h2 id="heading-what-actually-breaks-the-loop">What actually breaks the loop</h2>
<p>The blog drafts are going to start coming out this week. Not because I rewired my psychology. Because the pipeline now defaults to shipping and I have to do work to stop it.</p>
<p>Three things that are actually helping, not as a listicle but as honest data points:</p>
<p>Changing the default. The biggest unlock was making publish the zero-effort option and hold the effortful one. This is just <a target="_blank" href="https://www.penguinrandomhouse.com/books/293935/nudge-by-richard-h-thaler-and-cass-r-sunstein/">Thaler and Sunstein's nudge theory</a> applied to a content queue. Change the default, change the behavior, without requiring willpower or changed preferences.</p>
<p>Separating creation from curation. I stopped trying to decide whether something is worth publishing in the same session I wrote it. The draft goes in the queue, scores get calculated asynchronously, and the decision happens later based on the composite score - not on how I feel at 2am after a 12-hour build session.</p>
<p>Making the cost of inaction visible. The knowledge graph node was brutal but useful. When <code>revenue_avoidance_pattern</code> is sitting there in your entity graph connected to six projects, it's harder to pretend you're just being careful. I added a dashboard widget that shows days-since-last-publish. Right now it says 14. That number being visible every morning is uncomfortable in a productive way.</p>
<p>If you're a builder reading this, you probably recognize the pattern. The <a target="_blank" href="https://blog.deeflect.com/04-seven-apps/">seven apps I built solo</a> before any of them got real traction. The <a target="_blank" href="https://blog.deeflect.com/09-mcp-server/">MCP server wrapping 56 APIs</a> that I built and documented and then sat on for three weeks before publishing anything about it. The infrastructure-first, distribution-never cycle that affects probably 60% of the people building seriously in this space.</p>
<p>We talk about it in private. In DMs. In "lol I have like 30 unpublished drafts" jokes. But the actual posts are all about shipping, about momentum, about velocity. Not about the 3am moment when you realize your knowledge graph has a node called <code>revenue_avoidance_pattern</code> and it's accurate.</p>
<p>The distribution problem is real. It's structural. It's also solvable with the same tools I'd use for any other problem - designed around the actual constraint, which isn't capability. It's the friction between building and letting go.</p>
<p>The queue is full. Time to empty it.</p>
<hr />
<p>If you're stuck in the same loop, my <a target="_blank" href="https://blog.deeflect.com/about/">about page</a> has context on what I'm building and why. And if your own agent stack starts diagnosing your behavior patterns, maybe take notes. It's uncomfortable but it's probably right.</p>
]]></content:encoded></item><item><title><![CDATA[castkit: CLI Demo Videos From One Command]]></title><description><![CDATA[Every CLI tool I've ever shipped had the same problem: zero visual presence. Then I built castkit - a castkit CLI demo video generator that turns any…]]></description><link>https://deeflect.hashnode.dev/castkit-cli-demo-videos-from-one-command</link><guid isPermaLink="true">https://deeflect.hashnode.dev/castkit-cli-demo-videos-from-one-command</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Thu, 05 Mar 2026 12:00:00 GMT</pubDate><enclosure url="https://blog.deeflect.com/medium-img/castkit.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every CLI tool I've ever shipped had the same problem: zero visual presence. Then I built castkit - a castkit CLI demo video generator that turns any binary into a polished MP4 or GIF with one command. No screen recording software. No manual scripting. No video editing. Open source, written in Rust, and the meta-demo sells it better than I can: castkit generates its own demo video.</p>
<p>Check the <a target="_blank" href="https://github.com/deeflect/castkit">repo</a> before reading further if you want to see the output first.</p>
<h2 id="heading-why-i-actually-built-this">Why I actually built this</h2>
<p>Screen recording CLI tools is a pain in the ass. You open your terminal, run the command, inevitably typo something on the third take, realize the font looks weird, forget to hide your API key in the environment, and end up with a 45-second raw recording you now have to edit in Final Cut.</p>
<p>The existing options all have real tradeoffs. <a target="_blank" href="https://asciinema.org/">asciinema</a> is free and captures terminal output, but the playback looks like a terminal log - no visual polish, no branding, nothing you'd put on a landing page. <a target="_blank" href="https://www.screen.studio/">Screen Studio</a> costs $89 and produces beautiful results, but you're still recording manually. <a target="_blank" href="https://github.com/charmbracelet/vhs">VHS from Charm</a> is the closest thing to what I wanted - declarative, scriptable - but you have to write a <code>.tape</code> file by hand for every recording. No auto-discovery. No agent support. Still requires you to think about the demo structure yourself.</p>
<p>The trigger for actually building this was working on AI coding agents. I kept hitting the same pattern: an agent builds a CLI tool, the CLI tool works, and then the last step is... what? Push to GitHub with a README? That's a dead end. I wanted the agent to be able to say "generate a demo video" as the final build step. No human intervention. No manual configuration. Just: here's a binary, produce something I can ship.</p>
<p>That didn't exist. So I built it.</p>
<h2 id="heading-what-castkit-actually-does">What castkit actually does</h2>
<p>The pipeline is: binary/command → discover → plan → record → redact → render → encode → MP4 or GIF.</p>
<p><img src="https://blog.deeflect.com/medium-img/castkit-1.jpg" alt="What castkit actually does" /></p>
<p>Each stage does real work.</p>
<p><strong>Discover</strong> reads your tool's <code>--help</code> output and README to understand what commands exist, what flags do what, and what a reasonable demo flow looks like. It builds a structured picture of the tool without you explaining anything.</p>
<p><strong>Plan</strong> takes that understanding and generates a demo script as editable JSON. This is the part I'm most proud of. You can run <code>castkit plan</code> on any CLI tool, get a JSON file showing every scene, every command, every pause duration - and edit it before recording. It's not a black box.</p>
<p><strong>Record</strong> runs the actual PTY recording with human-like typing jitter. Real typing cadence, not <code>sleep 0.1</code> between every character. The variation is calibrated to feel like a person typed it, not a script.</p>
<p><strong>Redact</strong> runs automatically before anything gets rendered. Environment variables, API keys, tokens - anything that looks like a secret gets masked. Safe by default. You don't have to remember to do this.</p>
<p><strong>Render</strong> is where it gets interesting. castkit uses <a target="_blank" href="https://github.com/pop-os/cosmic-text">cosmic-text</a> for text shaping and <a target="_blank" href="https://github.com/RazrFalcon/tiny-skia">tiny-skia</a> for pixel rendering. Full software renderer - no GPU dependency, no display server needed, runs in CI. It draws macOS window chrome (traffic lights, title bar, drop shadow), handles auto-zoom with easing, crossfade transitions between scenes, cursor smoothing with blink animation.</p>
<p><strong>Encode</strong> pipes frames to ffmpeg for H.264 MP4 or GIF output.</p>
<p>The whole thing is a single binary plus ffmpeg. No runtime dependencies. No Python environment. No Node. Ship it anywhere.</p>
<h2 id="heading-how-the-castkit-cli-demo-video-generator-works-end-to-end">How the castkit CLI demo video generator works end to end</h2>
<p>The one-command path is:</p>
<pre><code class="lang-bash">castkit demo./your-binary
</code></pre>
<p>That's it. It discovers, plans, records, and renders without you specifying anything. You get an MP4 with branding, themes, and proper window chrome.</p>
<p>If you want more control:</p>
<pre><code class="lang-bash">castkit plan./your-binary --output demo-plan.json
<span class="hljs-comment"># edit demo-plan.json</span>
castkit record --plan demo-plan.json --output demo.mp4
</code></pre>
<p>The plan JSON looks like this:</p>
<pre><code class="lang-json">{
 <span class="hljs-attr">"title"</span>: <span class="hljs-string">"castkit demo"</span>,
 <span class="hljs-attr">"theme"</span>: <span class="hljs-string">"catppuccin"</span>,
 <span class="hljs-attr">"style"</span>: <span class="hljs-string">"dark"</span>,
 <span class="hljs-attr">"scenes"</span>: [
 {
 <span class="hljs-attr">"type"</span>: <span class="hljs-string">"command"</span>,
 <span class="hljs-attr">"command"</span>: <span class="hljs-string">"castkit --help"</span>,
 <span class="hljs-attr">"duration_ms"</span>: <span class="hljs-number">2000</span>,
 <span class="hljs-attr">"pause_after_ms"</span>: <span class="hljs-number">1500</span>
 },
 {
 <span class="hljs-attr">"type"</span>: <span class="hljs-string">"command"</span>,
 <span class="hljs-attr">"command"</span>: <span class="hljs-string">"castkit demo./my-tool"</span>,
 <span class="hljs-attr">"duration_ms"</span>: <span class="hljs-number">3000</span>,
 <span class="hljs-attr">"pause_after_ms"</span>: <span class="hljs-number">1000</span>
 }
 ]
}
</code></pre>
<p>You can add intro cards, outro branding, adjust timing, swap themes. The plan is the contract between what you want and what gets rendered.</p>
<h3 id="heading-themes-and-visual-styles">Themes and visual styles</h3>
<p>Built-in color themes: catppuccin, tokyo-night, dracula, one-dark. Visual styles: dark, light, minimal, ocean, hacker. These aren't just color swaps - each style affects font weight, padding, window chrome treatment, and background rendering.</p>
<p>The hacker style does exactly what you think it does.</p>
<h3 id="heading-two-recording-modes">Two recording modes</h3>
<p><strong>Terminal mode</strong> is the classic full-terminal recording. The full PTY, command output scrolling, cursor - everything you'd see if you were sitting at the machine.</p>
<p><strong>Web mode</strong> is for CLI tools that spawn a browser or have web UI output. It captures that context instead.</p>
<h2 id="heading-the-technical-stack">The technical stack</h2>
<p>Rust was the right call here for a few reasons. The rendering pipeline needs to be deterministic and fast - you're compositing frames, and any variability in timing shows up in the output video. Rust's ownership model also made the PTY recording safe to implement without the race conditions you'd fight in Go or Python.</p>
<p>Key crates:</p>
<ul>
<li><strong><a target="_blank" href="https://docs.rs/vt100/latest/vt100/">vt100</a></strong> - terminal state parsing and capture. This is the core of getting accurate terminal output into a data structure we can render.</li>
<li><strong>cosmic-text</strong> - text layout with proper Unicode support, ligatures, font fallback. CLI output has a lot of edge cases here.</li>
<li><strong>tiny-skia</strong> - pure-Rust 2D renderer. No Cairo, no Skia binding hell, no native dependency chain.</li>
<li><strong>portable-pty</strong> - cross-platform PTY. The thing that lets you actually run a real shell session and capture it.</li>
<li><strong>clap</strong> - CLI interface. The irony of using a CLI framework to build a CLI demo tool is not lost on me.</li>
</ul>
<p>The rendering pipeline goes: PTY session → vt100 parser → terminal cell grid → tiny-skia frame → raw pixel buffer → ffmpeg stdin. Each frame is fully rendered in software. That's intentional - it means the tool runs in headless CI without needing a display.</p>
<p>The auto-zoom is probably the feature that makes demos look professional without any work. When a command produces long output, castkit calculates the bounding box of the relevant content and applies a smooth zoom-in with easing. It's the thing that makes it look like someone edited the recording, when nobody did.</p>
<h3 id="heading-why-not-go-or-python">Why not Go or Python</h3>
<p>I get asked this. Go would've been fine for the CLI surface, but the rendering layer involves pixel-level compositing with tight frame timing. The garbage collector pauses in Go show up as dropped frames when you're pushing raw buffers to ffmpeg at 30fps. Python isn't even in the conversation for a tool you want to distribute as a single binary.</p>
<p>Rust also gave me compile-time guarantees on the PTY session lifecycle. A PTY that doesn't get cleaned up properly hangs your terminal. With Rust's Drop trait handling cleanup, that class of bug just doesn't happen.</p>
<h2 id="heading-running-the-castkit-cli-demo-video-generator-in-ci">Running the castkit CLI demo video generator in CI</h2>
<p><img src="https://blog.deeflect.com/medium-img/castkit-2.jpg" alt="Running castkit in CI" /></p>
<p>This is where it gets useful beyond the local workflow. Because castkit runs headless - no display server, no GPU, just CPU and ffmpeg - it works in GitHub Actions without any special setup.</p>
<pre><code class="lang-yaml"><span class="hljs-attr">name:</span> <span class="hljs-string">Generate</span> <span class="hljs-string">Demo</span>

<span class="hljs-attr">on:</span>
 <span class="hljs-attr">push:</span>
 <span class="hljs-attr">branches:</span> [<span class="hljs-string">main</span>]

<span class="hljs-attr">jobs:</span>
 <span class="hljs-attr">demo:</span>
 <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>
 <span class="hljs-attr">steps:</span>
 <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span>
 <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Install</span> <span class="hljs-string">ffmpeg</span>
 <span class="hljs-attr">run:</span> <span class="hljs-string">sudo</span> <span class="hljs-string">apt-get</span> <span class="hljs-string">install</span> <span class="hljs-string">-y</span> <span class="hljs-string">ffmpeg</span>
 <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Download</span> <span class="hljs-string">castkit</span>
 <span class="hljs-attr">run:</span> <span class="hljs-string">|
 curl -L https://github.com/deeflect/castkit/releases/latest/download/castkit-linux-x86_64 -o castkit
 chmod +x castkit
 - name: Build your tool
 run: cargo build --release
 - name: Generate demo
 run:./castkit demo./target/release/your-tool --output demo.mp4
 - name: Upload demo artifact
 uses: actions/upload-artifact@v4
 with:
 name: demo-video
 path: demo.mp4</span>
</code></pre>
<p>Every push regenerates the demo. If your tool's output changes, the demo reflects it automatically. No stale GIFs in your README. The agent-native workflow I actually want is this: Claude Code builds the tool, the CI pipeline generates the demo, the demo gets committed to the repo. Zero human steps in the video production chain.</p>
<p>That's not hypothetical. I've been running this on a few of my own tools for the past few weeks and it works exactly as described.</p>
<h2 id="heading-why-this-matters-for-cli-tool-marketing">Why this matters for CLI tool marketing</h2>
<p>Most developers shipping CLI tools think of documentation as the end of the marketing funnel. It's not. The funnel is:</p>
<ol>
<li>Someone sees the GitHub repo linked somewhere</li>
<li>They skim the README in about 8 seconds</li>
<li>They either get it or they don't</li>
</ol>
<p>A 15-second GIF that shows the tool running converts browsers into users at a completely different rate than text. This isn't an opinion - every product person who's run A/B tests on landing pages with and without video knows this. The video wins. Every time.</p>
<p>But developers don't make demo videos because making demo videos is annoying. It's a context switch out of the thing you're building and into video production, which is a different skill set, different tooling, different mental mode. castkit makes that context switch disappear. You're still in the terminal. You're still thinking like an engineer. You just run a command.</p>
<p>The agent-native angle is where I think this gets genuinely interesting going forward. Right now I use <a target="_blank" href="https://docs.anthropic.com/en/docs/claude-code">Claude Code</a> for a lot of my CLI development. The last step of that workflow - "generate a demo for this" - can now be a single tool call. The coding agent builds the thing and generates the demo as part of the same build step. No human in the loop for that part.</p>
<p>That's the version of developer tooling I actually want to work in.</p>
<h2 id="heading-whats-missing-and-whats-next">What's missing and what's next</h2>
<p>The current version has two gaps I know about:</p>
<p><strong>Windows support</strong> is partial. The PTY layer uses platform abstractions but I haven't battle-tested it on Windows. If you hit issues, open an issue - I want to fix this.</p>
<p><strong>Dynamic content</strong> is tricky. If your CLI tool outputs things that change every run (timestamps, generated IDs, random data), the recording captures whatever happened during that specific run. There's no redaction for content variance the way there is for secrets. You can work around this by mocking your tool's output in the plan, but it's not automatic yet.</p>
<p>On the roadmap: a <code>--dry-run</code> mode that shows you the rendered plan without executing real commands, support for recording multiple tools in one session (useful for showing integrations), and a web viewer for the JSON plans so non-engineers can review before recording.</p>
<p>The code is MIT licensed and the <a target="_blank" href="https://github.com/deeflect/castkit">repo is open</a>. PRs are welcome. If you build something with it, I want to see the demo.</p>
<h2 id="heading-the-meta-demo-point">The meta-demo point</h2>
<p>I said it up top but it's worth landing: castkit generates its own demo video. That's not a marketing stunt. It's the proof of concept. If a tool can document itself, the core premise works.</p>
<p>Every CLI tool I build from here ships with a demo generated by castkit. Not because I've committed to some content strategy, but because it takes one command and it looks good. That's the bar. If it takes more than one command or it looks bad, it doesn't get used.</p>
<p>Right now it's at one command and it looks good. Check the <a target="_blank" href="https://blog.deeflect.com/dee-ink/">31 Rust CLI tools</a> for what I'm building next, or browse by <a target="_blank" href="https://blog.deeflect.com/06-coding-stack/">my coding stack</a> if you want more of this kind of thing.</p>
<hr />
<p>Go run <code>castkit demo./your-tool</code> on whatever you're building. If the output looks wrong or the plan generation misses something obvious, open an issue with your <code>--help</code> output. That's the fastest way to make the discovery smarter.</p>
]]></content:encoded></item><item><title><![CDATA[31 Rust CLI Tools Built for AI Agents]]></title><description><![CDATA[I shipped 31 open-source Rust CLI tools in one project. Not 31 features in one tool - 31 separate crates, each doing exactly one thing, each installable on…]]></description><link>https://deeflect.hashnode.dev/31-rust-cli-tools-built-for-ai-agents</link><guid isPermaLink="true">https://deeflect.hashnode.dev/31-rust-cli-tools-built-for-ai-agents</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Thu, 05 Mar 2026 12:00:00 GMT</pubDate><enclosure url="https://blog.deeflect.com/medium-img/dee-ink.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I shipped 31 open-source Rust CLI tools in one project. Not 31 features in one tool - 31 separate crates, each doing exactly one thing, each installable on its own. That project is <a target="_blank" href="https://dee.ink">dee.ink</a>, and building it changed how I think about the right interface for AI agents. If you're building agentic systems and haven't thought hard about open-source Rust CLI tools for AI agents as an alternative to MCP servers, you're leaving serious efficiency on the table.</p>
<p>The short version: CLI tools are dramatically more token-efficient than MCP servers for AI agent workflows. I measured 35x in my own benchmarks. Once you see that number, you can't unsee it.</p>
<p>Here's how it happened and why it matters.</p>
<h2 id="heading-why-i-built-deeink-in-the-first-place">Why I built dee.ink in the first place</h2>
<p>I run a multi-agent system called OpenClaw. If you've read <a target="_blank" href="https://blog.deeflect.com/castkit/">castkit</a>, you know it handles my daily workflow - morning digests, research, crypto monitoring, content scheduling, health data. It's not a demo. It processes real work every day.</p>
<p>Agents need to reach into the world. Check Hacker News. Look up SSL cert expiry. Parse an RSS feed. Generate a QR code. Turn a receipt photo into structured data. These aren't complex tasks but they come up constantly, and every time an agent needs to do one, it needs a tool.</p>
<p>The popular answer right now is MCP - Model Context Protocol, Anthropic's standard for agent tool-calling. I tried it. The overhead is real: each tool call needs a running server, connection setup, and verbose JSON-RPC framing. For stateful tools or bidirectional streams, that overhead makes sense. For "search Hacker News and return the top 10 posts," it's wasteful by design.</p>
<p>So I built CLIs instead. One tool per job. JSON output. No interactive prompts. Works with pipes. That's it.</p>
<p>After I'd built a few for my own use, I realized I had the start of something worth packaging and open-sourcing. dee.ink is the result: 31 standalone Rust CLI tools built specifically to be called by AI agents.</p>
<h2 id="heading-open-source-rust-cli-tools-for-ai-agents-vs-mcp-the-real-argument">Open-source Rust CLI tools for AI agents vs MCP: the real argument</h2>
<p>Let me be concrete about why CLI beats MCP for most agent tool use.</p>
<p>An MCP server for a simple search tool looks roughly like this from the agent's perspective: spin up the server process (or connect to an already-running one), send a JSON-RPC request with the method name and parameters, wait for the response envelope, parse the result out of the envelope. The agent has to know the MCP protocol, or more accurately, the framework wrapping the agent has to know it.</p>
<p>A CLI tool looks like this: <code>ink-hn top --limit 10 --json</code>. That's it. The agent gets back a clean JSON array.</p>
<p>The token efficiency gap comes from a few places. First, CLI invocation syntax is compact. A shell command is 5-20 tokens. An MCP request envelope is 50-200 tokens before you even add the parameters. Second, every LLM ever trained has seen millions of shell commands in its training data. They're native CLI speakers. They're not native JSON-RPC speakers - you can see this in how confidently models generate shell invocations vs. how often they fumble JSON-RPC schema details. Third, no server to maintain means no connection overhead, no process management, no "is the server running?" failure mode.</p>
<p>The 35x efficiency number comes from comparing token usage for the same operations across both approaches in my own OpenClaw setup. It's not a controlled academic study but it's real usage data from a system that runs 14 cron jobs daily.</p>
<p>There are cases where MCP is genuinely better. Long-running sessions where you want persistent state. Bidirectional streams. Tools that need to push updates back to the agent rather than return a one-shot result. For those, use MCP. But "search HN" or "check WHOIS" or "generate an invoice"? CLI wins every time.</p>
<p>One more thing people miss: debugging. When an MCP tool call fails inside a framework like LangChain or CrewAI, you're often staring at a wrapped exception with zero useful context. When a CLI tool fails, you have a shell command, an exit code, and stderr output. You can reproduce it in 10 seconds. That matters a lot when you're maintaining a system that runs overnight.</p>
<h2 id="heading-whats-inside-the-toolkit">What's inside the toolkit</h2>
<p>The <a target="_blank" href="https://dee.ink">dee.ink</a> toolkit is 31 crates across six categories. Let me walk through them.</p>
<p><strong>Data and research</strong>: <code>dee-hn</code>, <code>dee-arxiv</code>, <code>dee-reddit</code>, <code>dee-wiki</code>, <code>dee-feed</code>, <code>dee-ph</code>. These are the tools I use most. An agent can check Hacker News trending stories, pull an arXiv abstract by ID, search Reddit, look up a Wikipedia article, parse an RSS feed, or get Product Hunt launches - all in one command, all as JSON.</p>
<p><strong>Financial</strong>: <code>dee-invoice</code>, <code>dee-receipt</code>, <code>dee-rates</code>, <code>dee-pricewatch</code>, <code>dee-ebay</code>, <code>dee-amazon</code>. Generate invoices, parse receipts, check exchange rates, watch prices, search marketplaces.</p>
<p><strong>Personal productivity</strong>: <code>dee-contacts</code>, <code>dee-habit</code>, <code>dee-todo</code>, <code>dee-timer</code>, <code>dee-stash</code>. The local storage tools here use SQLite via rusqlite. Your data stays on your machine. Agents can manage your contacts, log habits, check todos, start timers, or stash arbitrary data for later retrieval.</p>
<p><strong>Developer tools</strong>: <code>dee-openrouter</code>, <code>dee-ssl</code>, <code>dee-whois</code>, <code>dee-qr</code>, <code>dee-porkbun</code>. Check SSL cert expiry, run WHOIS lookups, generate QR codes, manage Porkbun DNS records, query OpenRouter for available models and pricing.</p>
<p><strong>Location</strong>: <code>dee-food</code>, <code>dee-events</code>, <code>dee-parking</code>, <code>dee-gas</code>, <code>dee-transit</code>. Local-aware tools for finding restaurants, events, parking, gas prices, and transit schedules.</p>
<p><strong>Social and trends</strong>: <code>dee-crosspost</code>, <code>dee-mentions</code>, <code>dee-trends</code>. Cross-post content, monitor mentions, check trend data.</p>
<p>Each crate is fully standalone. Installing <code>dee-ssl</code> doesn't pull in any shared <code>dee-core</code> dependency. You get exactly what you need, nothing more.</p>
<h2 id="heading-the-technical-stack">The technical stack</h2>
<p>I picked Rust for a few reasons that aren't just "Rust is fast."</p>
<p><img src="https://blog.deeflect.com/medium-img/dee-ink-1.jpg" alt="The technical stack" /></p>
<p>Binary size matters when you're shipping 31 separate tools. A Go binary for a simple CLI is usually 10-15MB. A stripped Rust binary for the same tool comes in under 3MB. When someone does <code>cargo install dee-hn</code>, they're downloading and compiling one focused tool. Small is respectful.</p>
<p>The other reason: Rust's <code>clap</code> v4 with derive macros makes argument parsing almost free to write. The <code>--help</code> output is generated automatically from your struct definitions. Every tool in dee.ink has <code>--help</code> with actual usage examples because making that happen is nearly zero effort.</p>
<p>Here's what the argument struct looks like for a typical tool:</p>
<pre><code class="lang-rust"><span class="hljs-meta">#[derive(Parser, Debug)]</span>
<span class="hljs-meta">#[command(name = <span class="hljs-meta-string">"ink-hn"</span>, about = <span class="hljs-meta-string">"Hacker News CLI for AI agents"</span>)]</span>
<span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">Args</span></span> {
 <span class="hljs-meta">#[command(subcommand)]</span>
 command: Command,

 <span class="hljs-comment">/// Output as JSON</span>
 <span class="hljs-meta">#[arg(long, global = true)]</span>
 json: <span class="hljs-built_in">bool</span>,
}

<span class="hljs-meta">#[derive(Subcommand, Debug)]</span>
<span class="hljs-class"><span class="hljs-keyword">enum</span> <span class="hljs-title">Command</span></span> {
 <span class="hljs-comment">/// Get top stories</span>
 Top {
 <span class="hljs-comment">/// Number of stories to fetch</span>
 <span class="hljs-meta">#[arg(long, default_value = <span class="hljs-meta-string">"10"</span>)]</span>
 limit: <span class="hljs-built_in">usize</span>,
 },
 <span class="hljs-comment">/// Search stories</span>
 Search {
 <span class="hljs-comment">/// Search query</span>
 query: <span class="hljs-built_in">String</span>,
 },
}
</code></pre>
<p>For tools with local storage (todo, habit, contacts, stash), SQLite handles persistence via <a target="_blank" href="https://github.com/rusqlite/rusqlite">rusqlite</a>. No database server, no config files to manage. The database lives at <code>~/.local/share/dee-toolname/data.db</code> and everything just works.</p>
<p>HTTP is either <a target="_blank" href="https://github.com/seanmonstar/reqwest">reqwest</a> (for complex clients with retries) or ureq (for simpler one-shot requests). I pick ureq when I can - it compiles faster and the binary is smaller.</p>
<p>Exit codes are strict: 0 for success, 1 for tool error, 2 for usage error. Agents need reliable exit codes to know if a command succeeded. This sounds obvious but a surprising number of CLIs return 0 on failure because someone forgot to handle an error branch. In agent workflows that kills you - your orchestrator thinks the call succeeded and moves on with bad data.</p>
<h2 id="heading-agent-first-design-decisions">Agent-first design decisions</h2>
<p>This is the part that's different from building a CLI for humans.</p>
<p>No interactive prompts. Ever. If an argument is missing, the tool errors out with a clear message. It doesn't ask "did you mean this file? (y/n)". Agents can't answer interactive prompts. A tool that blocks waiting for keyboard input is broken for agent use.</p>
<p>Every tool has a <code>--json</code> flag that guarantees structured output. Without <code>--json</code>, tools print human-readable text. With <code>--json</code>, they print a JSON object or array, always to stdout, always parseable. No mixed text/JSON output. No progress bars to stdout (they go to stderr or get suppressed).</p>
<p>Pipe support is first-class. Tools accept stdin when appropriate. You can chain them:</p>
<pre><code class="lang-bash">ink-feed parse https://hnrss.org/frontpage | ink-stash save --key hn-today
</code></pre>
<p>Each tool ships an <code>AGENT.md</code> file in the repo. This is a short markdown document explaining to an AI agent how to use the tool effectively - what the flags do, what the output schema looks like, common patterns. When an agent needs to use a tool it hasn't seen before, it can read <code>AGENT.md</code> and understand the interface without trial and error.</p>
<p>There's also a <code>FRAMEWORK.md</code> at the repo root that defines the conventions every tool follows. Any agent that has read <code>FRAMEWORK.md</code> can make reasonable guesses about how any dee.ink tool works. That's intentional. Consistency is the whole point.</p>
<h3 id="heading-what-consistent-actually-means-in-practice">What "consistent" actually means in practice</h3>
<p>Every tool uses the same flag names for the same concepts. Pagination is always <code>--page</code> and <code>--limit</code>, never <code>--offset</code> or <code>--per-page</code> or <code>--count</code>. JSON mode is always <code>--json</code>, never <code>--format json</code> or <code>--output json</code>. Verbose mode is always <code>-v</code>.</p>
<p>This matters because agents build up a mental model of your toolset. If the first five tools they use have consistent interfaces, they'll correctly predict how the sixth one works. If your flags are inconsistent, the agent has to treat each tool as a new unknown - which costs tokens and causes errors.</p>
<p>It's the same principle as a good design system. The value isn't any single component. It's the pattern that makes everything predictable.</p>
<h2 id="heading-how-open-source-rust-cli-tools-fit-into-a-real-agent-workflow">How open-source Rust CLI tools fit into a real agent workflow</h2>
<p>Concretely, here's how one of these tools actually gets used inside OpenClaw. My morning digest job runs at 7am. It pulls Hacker News top stories, recent arXiv papers in a few categories, and Reddit posts from a handful of subs. Then it summarizes and formats everything into a digest I read with coffee.</p>
<p>The shell side of that looks roughly like:</p>
<pre><code class="lang-bash">ink-hn top --<span class="hljs-built_in">limit</span> 20 --json &gt; /tmp/hn.json
ink-arxiv search <span class="hljs-string">"multi-agent systems"</span> --days 7 --json &gt; /tmp/arxiv.json
ink-reddit hot r/MachineLearning --<span class="hljs-built_in">limit</span> 15 --json &gt; /tmp/reddit.json
</code></pre>
<p>Three commands. Three JSON files. The orchestrating agent reads those files, does the summarization, formats the output. Total token cost for the data collection phase: maybe 150 tokens across all three commands. The MCP equivalent for the same three sources would be three server connections, three request envelopes, three response envelopes. Easily 10x the token overhead, plus you need three MCP servers running.</p>
<p>That's not a toy example. That's the actual flow, running every morning.</p>
<h2 id="heading-the-installation-experience">The installation experience</h2>
<pre><code class="lang-bash">cargo install dee-hn
ink-hn top --<span class="hljs-built_in">limit</span> 5 --json
</code></pre>
<p><img src="https://blog.deeflect.com/medium-img/dee-ink-2.jpg" alt="The installation experience" /></p>
<p>That's the whole install flow. No Docker. No Python virtual env. No npm. Cargo installs the binary, it goes in <code>~/.cargo/bin</code>, and it's available system-wide. For agent use in particular, this matters - you don't want to manage environments when your agent needs to call a tool.</p>
<p>For people who want everything at once, I'm working on a meta-crate that installs the full suite, but honestly most people only need a subset. The standalone install is the right default.</p>
<p>You can find all 31 crates on the dee.ink site and browse the source on GitHub. Every tool is MIT licensed.</p>
<h2 id="heading-why-open-source-and-what-im-getting-out-of-it">Why open source, and what I'm getting out of it</h2>
<p>I'm not monetizing dee.ink directly. No SaaS wrapper, no premium tier. The tools are free, the code is open.</p>
<p>The actual return is authority and credibility. Shipping 31 production-quality Rust CLI tools is a more compelling signal than any portfolio piece I could write. Developers can read the code, use the tools, see the design decisions. That's a much better "hire me / work with me" artifact than a case study PDF.</p>
<p>It also forces quality. When something is public, you think twice about the shortcuts. Every <code>AGENT.md</code>, every <code>--help</code> example, every error message is a little more considered because someone else might read it.</p>
<p>And honestly? The tooling gap was real. I needed these tools for OpenClaw. If they didn't exist, I'd have built them for private use anyway. Open-sourcing them was 20% more work for a much better outcome.</p>
<h2 id="heading-what-comes-next">What comes next</h2>
<p>31 tools is a good start but there are obvious gaps. I'm planning tools for GitHub (issues, PRs, repo stats), calendar integration, and a few more financial data sources. The architecture makes adding tools easy - each one is genuinely independent, so adding <code>dee-github</code> doesn't touch anything that already ships.</p>
<p>I'm also watching how people actually use these in their own agent setups. If you're building with Claude Code, Cursor, or any other agent framework and want CLI tools that just work, this is worth checking out. If you find a gap, open an issue or PR. The whole thing is built to be extended.</p>
<p>You can <a target="_blank" href="https://blog.deeflect.com/09-mcp-server/">the universal MCP server</a> and follow the build log here on the <a target="_blank" href="/">blog</a>. If you're interested in the agent workflow side - how OpenClaw actually orchestrates all of this - I'll be writing that up next. Subscribe or check back.</p>
<p>The tools are at <a target="_blank" href="https://dee.ink">dee.ink</a>. The code is on GitHub. Install one and see if it fits your stack. And if you want to browse more posts on agent architecture and tooling, <a target="_blank" href="https://blog.deeflect.com/tags">check the tags page</a>.</p>
]]></content:encoded></item><item><title><![CDATA[The 3-Month Gap: Building AI Agents That Actually Work]]></title><description><![CDATA[The 3-month gap between building an AI agent and it being useful nearly broke me. That's the stretch nobody posts about. I've seen a hundred Twitter…]]></description><link>https://deeflect.hashnode.dev/the-3-month-gap-building-ai-agents-that-actually-work-1-1</link><guid isPermaLink="true">https://deeflect.hashnode.dev/the-3-month-gap-building-ai-agents-that-actually-work-1-1</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Wed, 18 Feb 2026 12:00:00 GMT</pubDate><enclosure url="https://blog.deeflect.com/medium-img/10-debugging-agents.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The 3-month gap between building an AI agent and it being useful nearly broke me.</p>
<p>That's the stretch nobody posts about. I've seen a hundred Twitter threads about building agents. Maybe three honest ones about what happens after you ship v1 and start using the thing for real. The <strong>3-month gap building AI agent</strong> systems from "it demos" to "it actually works without me babysitting it" - that's the real project. And it's almost nothing like the first 30 minutes.</p>
<p>I run a <strong>multi-agent system called borb</strong> on OpenClaw. It handles my daily workflow - reminders, research, content scheduling, code review, memory management. Fifteen-plus specialized agents running different models depending on the task. It's stable now. It does real work every day without me touching it.</p>
<p>It took three months to get there. Here's what that actually looked like.</p>
<hr />
<h2 id="heading-the-3-month-gap-between-building-an-ai-agent-and-it-being-useful">The 3-month gap between building an AI agent and it being useful</h2>
<p>Week one, everything works great. The demo is clean. The happy path is flawless. You show it to someone and they're impressed. You're impressed. You start thinking about what else you can build.</p>
<p>Then you try to use it for something real.</p>
<p>The model hallucinates a tool call that doesn't exist in your registry. The agent enters a loop - calling the same function twelve times, each time getting an error, each time deciding to try again. A cron job fires at 3am on a Wednesday and the API it needs returns a response format you've never seen before. The agent handles it confidently and incorrectly. You find out four hours later.</p>
<p>This isn't bad luck. This is what agents do. A system that needs to operate autonomously across real APIs, real data, real time zones, real rate limits - it's going to hit edge cases constantly. The demo doesn't hit edge cases because demos are choreographed. Production use is chaos.</p>
<p>The first two weeks, I was convinced I had a fundamentally broken architecture. I didn't. I just had a system that hadn't been stress-tested against reality yet. There's a difference.</p>
<hr />
<h2 id="heading-week-1-4-you-dont-know-what-you-dont-know">Week 1-4: You don't know what you don't know</h2>
<p>The early failures are the visible ones. The agent tries to call a tool with the wrong parameter format. Easy fix. The system prompt is ambiguous about which memory file to write to. Easy fix. Auth token expires overnight and everything fails silently. Annoying fix, but simple.</p>
<p>You add error handling. You feel productive. You think you're almost there.</p>
<p>You're not almost there. You've patched the surface layer. The deep problems haven't shown up yet because the deep problems only appear when conditions stack in ways you didn't anticipate.</p>
<p>What I didn't understand in week one: error handling for an AI agent isn't like error handling for deterministic code. With regular code, you can enumerate the failure modes and write a case for each. With an agent, the failure mode is sometimes "the model made a creative decision." There's no exception class for that. The agent didn't crash. It just did something you didn't want, then moved on.</p>
<p>This maps to what Anthropic calls "reward hacking" in their <a target="_blank" href="https://www.anthropic.com/research/model-spec">model specification documentation</a> - agents optimizing for what looks like task completion without actually completing the task. It shows up constantly in production.</p>
<p>I had an agent that was supposed to add a task to my task file when I asked it to remember something. For about ten days, it was adding the task correctly but also occasionally appending a brief philosophical reflection on the importance of the task. Not always. Maybe 15% of the time. The task file worked fine. It was just... weird. I only noticed when I went back and read through it.</p>
<p>That's the thing about AI agents failing quietly. The output is often plausible enough that you don't immediately catch it.</p>
<hr />
<h2 id="heading-week-5-8-the-edge-cases-get-stranger">Week 5-8: The edge cases get stranger</h2>
<p>By week five, the obvious stuff is handled. The agent runs reliably on the happy path. You start feeling good about it.</p>
<p><img src="https://blog.deeflect.com/_astro/3-months-of-debugging-nobody-posts-about-1.webp" alt="Week 5-8: The edge cases get stranger" /></p>
<p>Then the 3am edge cases start appearing.</p>
<p>Specific API returns a field as null instead of an empty string. Rate limit hits mid-task and the agent, instead of waiting, decides to rephrase the request and retry with a different tool. A time zone calculation goes wrong because of daylight saving time and a scheduled task fires an hour early. The agent interprets "do this daily" as "do this every time you're invoked" and runs a daily summary five times in a row on a Tuesday.</p>
<p>None of these are predictable from first principles. You can't design your way out of them upfront. You discover them by running the system and watching what happens.</p>
<p>My logging setup saved me here. I log everything - every tool call, every model response, every function output, timestamps on all of it. At 2am when something breaks weird, the logs are the only reason I can figure out what happened. If you're building agents and you're not logging obsessively, you will spend hours debugging by vibes instead of evidence. The <a target="_blank" href="https://opentelemetry.io/docs/concepts/signals/logs/">OpenTelemetry docs on structured logging</a> are worth a read if you want a sane approach to this - I adapted their structured format for borb's log output and it made parsing way easier.</p>
<p>The most expensive edge case I hit: I didn't have retry limits on one of my agents. It hit an API error that was never going to resolve - the endpoint was just down. The agent kept retrying. Each retry cost tokens. I woke up to $40 in API charges and an agent that had been stuck in a loop for six hours.</p>
<p>After that: every operation in borb has a max of five retries, then it stops and reports the failure. Non-negotiable. The agent's job is not to solve unsolvable problems. The agent's job is to do the task or tell me it can't.</p>
<hr />
<h2 id="heading-week-9-12-the-architecture-is-wrong-and-you-have-to-accept-it">Week 9-12: The architecture is wrong and you have to accept it</h2>
<p>This is the hardest part of the 3-month gap building AI agent systems into something reliable.</p>
<p>Around week nine, I started noticing a pattern. Individual fixes weren't sticking. I'd patch one thing and something adjacent would break. The sub-agents were failing silently in ways that only became obvious when I traced back through the memory files. The memory itself was getting stale - agents referencing context from three weeks ago that was no longer relevant, treating outdated information as current.</p>
<p>The problem wasn't any specific bug. The problem was architectural.</p>
<p>My original memory system was a single MEMORY.md file. Everything the agents wrote went into it. This worked fine for the first few weeks when the file was small. By week nine, it was 8,000 words of mixed context - tasks, decisions, completed work, notes, research summaries, all in one place. The agents were pulling from it for context but the retrieval wasn't smart enough to distinguish "recent and relevant" from "old and stale." The whole thing was polluted.</p>
<p>I rebuilt the memory layer. Separate files for different context types - active tasks, completed work, long-term facts, agent-specific state. Added timestamps. Added a lightweight cleanup job that runs daily and archives anything older than two weeks unless it's flagged as permanent.</p>
<p>That's the thing about the debugging phase nobody talks about: some of what you're debugging isn't bugs. It's the architecture not scaling the way you assumed it would. Patches don't fix that. You have to rebuild parts of the system.</p>
<p>I wrote more debugging and refactoring code in month three than I wrote feature code in month one. That ratio felt wrong when I was in it. Looking back, it's exactly right. The feature code gets you to "it demos." The debugging gets you to "it works."</p>
<hr />
<h2 id="heading-what-model-selection-actually-looks-like-in-production">What model selection actually looks like in production</h2>
<p>One concrete thing that took me too long to figure out: <strong>you can't use one model for everything</strong>.</p>
<p>My original borb setup used Claude Sonnet for everything. Consistent, predictable, good at reasoning. Also overkill and expensive for tasks that don't need it.</p>
<p>Now the system is tiered by task complexity:</p>
<ul>
<li>Orchestration layer (deciding what to do, assigning to sub-agents): Opus. It needs to make judgment calls, handle ambiguity, and route correctly. Skimping here is the most expensive kind of cheap.</li>
<li>Complex reasoning tasks (code review, research synthesis, writing drafts): Sonnet. Good balance of quality and cost.</li>
<li>Simple lookups and fast operations (memory writes, formatting, scheduling checks): Flash. Fast, cheap, and the task doesn't need a frontier model anyway.</li>
</ul>
<p>The cost difference is significant. Running Flash for the simple stuff cut my daily token spend by about 30% without any change in output quality on those tasks. Because a task like "write this event to the calendar file" doesn't need a 200-billion-parameter model. It just doesn't.</p>
<p>If you're building an agent system and everything is running on your best model, you're leaving both money and performance on the table.</p>
<hr />
<h2 id="heading-the-kill-switch-is-a-feature-not-an-afterthought">The kill switch is a feature, not an afterthought</h2>
<p>I added a kill switch to borb after week two. It's the best thing in the entire system.</p>
<p><img src="https://blog.deeflect.com/_astro/3-months-of-debugging-nobody-posts-about-2.webp" alt="The kill switch is a feature, not an afterthought" /></p>
<p>One command stops all agents, freezes all cron jobs, and logs the current state of every active task. No partial writes. No half-completed operations. Just a clean stop.</p>
<p>I've used it maybe six times. Twice when something was clearly going wrong and I needed to stop the bleeding. Once when I pushed a bad config change. Three times during architecture refactors when I needed to be sure nothing was running while I was editing core files.</p>
<p>The kill switch means I can experiment aggressively because I know I can stop everything immediately if I need to. Without it, I'd be more conservative about changes - and slower progress because of it.</p>
<p>Building agent systems without a kill switch is like deploying to production without rollback. Technically possible. Categorically reckless.</p>
<hr />
<h2 id="heading-why-nobody-posts-about-the-3-month-gap-building-ai-agent-systems-that-actually-ship">Why nobody posts about the 3-month gap building AI agent systems that actually ship</h2>
<p>Twitter is full of "I built an AI agent in 30 minutes" content. I've read it. Some of it's even technically impressive. But a 30-minute build that you're demoing to a camera isn't the same thing as a system that runs your workflow for 90 days without you touching it.</p>
<p>The demo is marketing. The three months after the demo is engineering.</p>
<p>Building in public usually means sharing wins - launches, milestones, metrics going up. The debugging phase has almost no wins. It's just slightly fewer failures each week than the week before. That doesn't make for satisfying content. It doesn't fit the narrative arc. Nobody wants to read "week six: fixed four edge cases, discovered three more."</p>
<p>But that's the actual work. That's the difference between a project and a product. A project works when you're watching it. A product works when you're not.</p>
<p>I'm not saying this to gatekeep. I'm saying it because if you're three weeks into running your agent and you're losing your mind debugging things you didn't expect - that's normal. You're not in the failure state. You're in the middle of the process. Keep going.</p>
<hr />
<h2 id="heading-what-you-actually-need-to-get-through-the-3-month-gap">What you actually need to get through the 3-month gap</h2>
<p>Based on borb, based on the $40 loop-retry incident, based on the stale memory architecture rebuild - here's what I'd tell myself at week one:</p>
<p><strong>Log everything.</strong> Every tool call, every model response, every write. You will need these logs at an inconvenient time and you will be grateful they exist.</p>
<p><strong>Hard limits on retries.</strong> Five max, then stop and report. The agent's job is not to solve problems that can't be solved. It's to do the work or surface the failure.</p>
<p><strong>Memory needs maintenance, not just construction.</strong> Building the memory system is the easy part. Keeping it clean and relevant over months is the hard part. Budget time for it.</p>
<p><strong>Model selection is architecture.</strong> Using the same model for everything is a shortcut that becomes a tax. Right model for right task from the start.</p>
<p><strong>Build the kill switch before you need it.</strong> You'll need it.</p>
<p>And accept that months two and three look like a lot of debugging with very little to show for it. That's not failure. That's what it looks like to build something that actually works.</p>
<p>If you're thinking about building an agent system or you're already in the weeds, check out <a target="_blank" href="/">what I write about over on the blog</a>. More of this in the <a target="_blank" href="https://blog.deeflect.com/02-adhd-and-ai/">ADHD and AI workflows</a>. And if you want to understand the broader context of who's building this stuff and why, the <a target="_blank" href="https://blog.deeflect.com/09-mcp-server/">the MCP server</a> has that.</p>
<p>The demo is the beginning. The 3 months after it are the product.</p>
]]></content:encoded></item><item><title><![CDATA[Universal MCP Server: Two Tools, 56 APIs]]></title><description><![CDATA[I had 56 APIs I needed my agent to talk to. The idea of maintaining 56 separate MCP servers made me want to close my laptop and never open it again. So I…]]></description><link>https://deeflect.hashnode.dev/universal-mcp-server-two-tools-56-apis</link><guid isPermaLink="true">https://deeflect.hashnode.dev/universal-mcp-server-two-tools-56-apis</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Sun, 15 Feb 2026 12:00:00 GMT</pubDate><enclosure url="https://blog.deeflect.com/medium-img/09-mcp-server.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I had 56 APIs I needed my agent to talk to. The idea of maintaining 56 separate MCP servers made me want to close my laptop and never open it again.</p>
<p>So I built one server that handles all of them.</p>
<p>That's the premise behind building a universal MCP server - and specifically, the pattern I implemented in <a target="_blank" href="https://github.com/deeflect/universal-codemode">Universal CodeMode</a>: wrap any OpenAPI spec into exactly two tools, <code>search</code> and <code>execute</code>, and let the model figure out the rest. If you're running agents that touch multiple external services, this is probably the architecture you actually want.</p>
<h2 id="heading-the-problem-with-the-current-mcp-ecosystem">The problem with the current MCP ecosystem</h2>
<p>The <a target="_blank" href="https://modelcontextprotocol.io/introduction">Model Context Protocol</a> is genuinely useful. It's the right abstraction for giving agents access to external tools and services. But the ecosystem has a fragmentation problem that nobody's really talking about.</p>
<p>The current pattern is: one API = one MCP server. Want GitHub integration? Here's a GitHub MCP server with 30 tools. Want Notion? Another server, another 20 tools. Weather API? Linear? Stripe? Each one is its own server, its own deployment, its own auth config, its own maintenance burden.</p>
<p>I run an agent called borb on my OpenClaw system. It needs to hit GitHub for repo management, search for research, weather for daily digests, and a dozen other services for various tasks. Following the standard pattern, I'd need 56+ separate MCP servers deployed and configured. That's not a system, that's a zoo.</p>
<p>The token cost is the other thing. A traditional MCP server for GitHub might expose 30 endpoints as 30 separate tools, each with its full parameter schema described in the context. That's easily 50K tokens just to tell the model what's available - before it's even made a single API call. At scale, that's insane.</p>
<p>Think about what that means in practice. You have an agent doing a simple task - create a GitHub issue, post a Slack message, look up a weather forecast. Three API calls. But before any of those happen, you've burned 150K tokens just describing the available tools across three MCP servers. That's money out the window for zero productive work. My monthly API spend across the whole OpenClaw system sits around $40. That number would be unrecognizable if I was loading full tool schemas for every session.</p>
<h2 id="heading-what-building-a-universal-mcp-server-actually-looks-like">What building a universal MCP server actually looks like</h2>
<p>The insight I'm building on comes from Cloudflare's "Code Mode" pattern. Instead of describing every possible tool upfront, you give the model two generic tools that work with any API:</p>
<ol>
<li><strong><code>search</code></strong> - natural language query against the OpenAPI spec catalog, returns the relevant endpoint spec (~1000 tokens)</li>
<li><strong><code>execute</code></strong> - takes a spec chunk and parameters, makes the actual HTTP call</li>
</ol>
<p>That's it. Two tools. Any API.</p>
<p>The flow looks like this: agent wants to create a GitHub issue, calls <code>search("create a github issue")</code>, gets back the relevant spec chunk for <code>POST /repos/{owner}/{repo}/issues</code>, then calls <code>execute</code> with the right parameters. The whole thing uses roughly 1000 tokens instead of 50K. That's a 50x reduction in token usage for a single API call sequence.</p>
<p>The key insight is that the model doesn't need to know every possible endpoint upfront. It just needs to know it <em>can</em> search for endpoints. The same way you don't memorize every function in a library - you know how to search the docs.</p>
<p>This also means the catalog can grow without any impact on the model's working memory. Whether you have 10 APIs or 500, the context overhead is identical: two tool schemas, a few hundred tokens. The model only loads the relevant spec chunk at the moment it needs it.</p>
<h2 id="heading-the-stack">The stack</h2>
<p>Universal CodeMode runs on Cloudflare Workers with R2 for spec storage and KV for caching. The core is TypeScript, using <a target="_blank" href="https://hono.dev">Hono</a> for routing and the <a target="_blank" href="https://github.com/modelcontextprotocol/typescript-sdk">MCP TypeScript SDK</a> for the protocol layer.</p>
<p>Here's the high-level architecture:</p>
<pre><code class="lang-typescript"><span class="hljs-comment">// Two tools. That's the whole interface.</span>
server. tool(<span class="hljs-string">"search"</span>, SearchSchema, <span class="hljs-keyword">async</span> ({ query, catalog }) =&gt; {
 <span class="hljs-comment">// Natural language search against indexed OpenAPI specs</span>
 <span class="hljs-comment">// Returns relevant endpoint chunk, not the full spec</span>
 <span class="hljs-keyword">const</span> results = <span class="hljs-keyword">await</span> searchCatalog(query, catalog);
 <span class="hljs-keyword">return</span> { content: [{ <span class="hljs-keyword">type</span>: <span class="hljs-string">"text"</span>, text: formatResults(results) }] };
});

server. tool(<span class="hljs-string">"execute"</span>, ExecuteSchema, <span class="hljs-keyword">async</span> ({ spec, params, auth }) =&gt; {
 <span class="hljs-comment">// Takes the spec chunk from search, builds and fires the HTTP request</span>
 <span class="hljs-keyword">const</span> response = <span class="hljs-keyword">await</span> executeRequest(spec, params, auth);
 <span class="hljs-keyword">return</span> { content: [{ <span class="hljs-keyword">type</span>: <span class="hljs-string">"text"</span>, text: <span class="hljs-built_in">JSON</span>. stringify(response) }] };
});
</code></pre>
<p>R2 stores the raw OpenAPI specs. When a spec is ingested, it gets indexed so the search tool can find relevant endpoints by natural language. KV handles caching so repeated searches on the same endpoints don't keep hitting the index.</p>
<p>The catalog currently has 56 pre-loaded API specs. Adding a new API is just ingesting its OpenAPI spec via the admin endpoint - the search and execute tools work automatically because they're operating on the spec structure, not hardcoded tool definitions.</p>
<h3 id="heading-why-cloudflare-workers-specifically">Why Cloudflare Workers specifically</h3>
<p>I could've run this on a VPS or a Lambda function. I went with Workers for three reasons.</p>
<p>First, edge deployment means low latency from wherever the agent is running. An agent mid-task waiting on an API lookup is a bad experience - every millisecond of overhead compounds across a multi-step workflow.</p>
<p>Second, R2 and KV are native integrations. No external database config, no connection pooling, no cold start issues with a separate storage layer. The spec storage and caching are just Workers primitives.</p>
<p>Third, the GlobalOutbound security model fits perfectly for this use case. I can declare exactly which domains the Worker is allowed to call outbound - which is exactly the security property I want for a server that executes arbitrary API calls on behalf of agents.</p>
<h2 id="heading-security-model">Security model</h2>
<p>Running arbitrary API calls through a single server sounds like a security nightmare. Here's how I handled it.</p>
<p><img src="https://blog.deeflect.com/medium-img/09-mcp-server-1.jpg" alt="Security model" /></p>
<p><strong>GlobalOutbound restrictions</strong> on the Cloudflare Worker mean the server can only make outbound requests to explicitly allowlisted domains. You can't use execute to hit <code>evil. example.com</code>.</p>
<p><strong>Admin token authentication</strong> gates the catalog management endpoints. Ingesting or deleting specs requires the admin token. The two main tools (<code>search</code> and <code>execute</code>) are accessible to agents without admin rights.</p>
<p><strong>Execution timeouts</strong> on every outbound request. An agent can't hang the server by calling a slow endpoint.</p>
<p><strong>Auth handling</strong> in execute is explicit - credentials get passed as parameters, not stored server-side in the MVP. There's a planned hosted version where you'd configure auth per-catalog-entry, but for now, the agent passes credentials and they're used once then discarded.</p>
<p>Is this perfect? No. But it's a real security model, not vibes.</p>
<p>The domain allowlist is probably the most important piece. A compromised prompt injection attack that tries to exfiltrate data to an external server fails at the network level, not just the application level. Defense in depth.</p>
<h2 id="heading-self-hosted-mode">Self-hosted mode</h2>
<p>Not everyone wants to run on Cloudflare. The project supports a self-hosted mode via npx:</p>
<pre><code class="lang-bash">npx universal-codemode --port 3000
</code></pre>
<p>Point it at your OpenAPI specs, configure your MCP client, done. The Worker version is the "cloud native" path, the npx version is for local dev or running on your own infra.</p>
<p>Config looks like this:</p>
<pre><code class="lang-json">{
 <span class="hljs-attr">"mcpServers"</span>: {
 <span class="hljs-attr">"universal-codemode"</span>: {
 <span class="hljs-attr">"command"</span>: <span class="hljs-string">"npx"</span>,
 <span class="hljs-attr">"args"</span>: [<span class="hljs-string">"universal-codemode"</span>],
 <span class="hljs-attr">"env"</span>: {
 <span class="hljs-attr">"CATALOG_PATH"</span>: <span class="hljs-string">"./specs"</span>,
 <span class="hljs-attr">"ADMIN_TOKEN"</span>: <span class="hljs-string">"your-token-here"</span>
 }
 }
 }
}
</code></pre>
<p>That's your entire MCP configuration. One entry. Covers every API in your catalog.</p>
<p>Compare that to what the equivalent config looks like with the standard one-server-per-API approach. If you're running five integrations, you have five entries in your MCP config, five different sets of env vars, five different deployment concerns. Something breaks and you're debugging which of the five servers is the problem. With this setup, there's exactly one thing to look at.</p>
<h2 id="heading-test-coverage">Test coverage</h2>
<p>13/13 E2E tests passing against real APIs - GitHub, JSONPlaceholder, and httpbin. The test suite covers the full search-then-execute flow, auth parameter handling, error responses, and the catalog management endpoints.</p>
<pre><code class="lang-bash">$ npm <span class="hljs-built_in">test</span>

✓ search returns relevant endpoint <span class="hljs-keyword">for</span> natural language query
✓ search handles queries with no matching endpoints
✓ execute calls GitHub API with correct parameters
✓ execute handles 404 responses gracefully
✓ execute respects timeout configuration
✓ catalog ingestion processes valid OpenAPI spec
✓ catalog ingestion rejects invalid spec
✓ admin endpoints reject requests without valid token... (13/13 passing)
</code></pre>
<p>Real tests against real endpoints, not mocks. If the GitHub API's behavior changes, the tests catch it.</p>
<p>Testing against real APIs instead of mocks is a deliberate choice. Mocks give you confidence that your code does what you think it does. Real endpoint tests give you confidence that your code actually works. For infrastructure that agents depend on at runtime, I want the second kind of confidence. The tradeoff is that tests can fail for reasons outside my control - rate limits, API downtime, auth token expiry. That's fine. Flaky tests that catch real issues are better than reliable tests that don't.</p>
<h2 id="heading-where-this-fits-in-the-universal-mcp-server-landscape">Where this fits in the universal MCP server landscape</h2>
<p>There are a few other projects trying to solve the "too many MCP servers" problem. Most of them are building aggregators - one entry point that proxies to multiple underlying servers. That doesn't solve the token problem, it just reduces the config burden.</p>
<p><img src="https://blog.deeflect.com/medium-img/09-mcp-server-2.jpg" alt="Where this fits in the universal MCP server landscape" /></p>
<p>The Code Mode pattern is different because it changes the <em>interface</em>. Instead of the model needing to know about <code>github_create_issue</code> and <code>github_list_repos</code> and <code>github_get_pull_request</code> as separate tools, it just knows about <code>search</code> and <code>execute</code>. The catalog can grow to 200 APIs and the model's tool interface stays exactly the same size.</p>
<p><a target="_blank" href="https://www.openapis.org">OpenAPI</a> as the common format is doing a lot of work here. Virtually every serious API publishes an OpenAPI spec now. That means the ingestion pipeline is universal - you're not writing custom parsers for each API.</p>
<p>There's also a maintenance angle worth thinking about. When Stripe updates their API, a traditional MCP server for Stripe needs to be updated and redeployed. With this approach, you ingest the updated OpenAPI spec via the admin endpoint and you're done. The search and execute tools don't change. The model's interface doesn't change. One operation, propagated everywhere.</p>
<h2 id="heading-current-status-and-whats-next">Current status and what's next</h2>
<p>MVP is deployed on Cloudflare Workers. The landing page is embedded in the Worker itself (Hono handles the HTML route). Repo is at <a target="_blank" href="https://github.com/deeflect/universal-codemode">deeflect/universal-codemode</a> - MIT licensed, free to use.</p>
<p>What's still in progress:</p>
<ul>
<li>Custom domain (cm. dee. ad is planned)</li>
<li>Real-world testing with Claude Code and Cursor agents, not just the E2E test suite</li>
<li>Seeding more API specs into the catalog - 56 is a start but the long tail of useful APIs is way bigger</li>
<li>Per-catalog auth configuration for the hosted version so agents don't need to pass credentials explicitly</li>
</ul>
<p>The honest status: this is a working MVP with real test coverage, not a demo. But it hasn't been battle-tested in production with real agent workloads at scale yet. That's the next phase.</p>
<p>The spec seeding problem is actually interesting. There are thousands of APIs with published OpenAPI specs - the <a target="_blank" href="https://apis.guru">APIs. guru</a> directory catalogs over 2,000 of them. Bulk-ingesting from that kind of source is on the roadmap. The architecture already handles it - it's a data pipeline problem, not an architectural one.</p>
<h2 id="heading-why-two-tools-is-the-right-number">Why two tools is the right number</h2>
<p>There's a version of this project where I expose five tools - search, preview_spec, execute, list_catalogs, check_health. I went back and forth on it.</p>
<p>Two is correct. Here's why.</p>
<p>Every tool you add to an MCP server is cognitive overhead for the model. The model has to decide which tool to use before it uses it. With <code>search</code> and <code>execute</code>, the decision tree is: do I know exactly which endpoint to call? No, search first. Yes, execute directly. That's it.</p>
<p>More tools means more opportunities for the model to pick the wrong one, more tokens describing the tool schemas, more edge cases in your implementation. The constraint of two tools forced me to make each tool more capable rather than adding escape hatches.</p>
<p>This is the same reason Unix pipes work. A small number of composable primitives beats a large number of specialized commands every time.</p>
<p>I tested a three-tool version with an explicit <code>preview_spec</code> step between search and execute. In theory it lets the model inspect a full spec before committing to an execute call. In practice, the model just used search and execute 95% of the time anyway and the extra tool added noise to every session context. Cut it.</p>
<p>The lesson: when you're designing a tool interface for models, err toward fewer, more capable tools. Models are good at using tools creatively. They're less good at picking between tools when the distinctions are subtle. Make the distinctions obvious by minimizing the surface area.</p>
<h2 id="heading-building-this-as-part-of-a-larger-agent-stack">Building this as part of a larger agent stack</h2>
<p>Universal CodeMode is one piece of my broader setup. If you're curious about how the agent system it connects to actually works - borb, OpenClaw, the cron-based orchestration layer - check out the <a target="_blank" href="https://blog.deeflect.com/dee-ink/">31 Rust CLI tools for agents</a> for background, or browse the <a target="_blank" href="https://blog.deeflect.com/08-prompt-eng-dead/">why prompt engineering died</a> for more on how I think about building agent systems.</p>
<p>The short version: I run multi-agent workflows where different models handle different job types. Having one MCP server that gives all of them access to 56+ APIs without per-model tool configuration changes is the kind of infrastructure win that compounds. Less config, lower token costs, one place to update when an API spec changes.</p>
<p>Every agent in the system gets the same two tools. Sonnet, Codex, Gemini Flash, Opus - they all connect to the same universal server and they all work identically. When I add a new API to the catalog, every agent can use it immediately. Zero redeployment, zero config changes, zero new tool descriptions to fit in context.</p>
<p>That compounding is the real argument for this pattern. Each individual win - fewer tokens, less config, one deployment - is incremental. All of them together, across every agent, across every session, across every API call, adds up to something that materially changes what I can run sustainably as a solo builder.</p>
<p>If you're building anything in this space - agents that need to talk to external services, MCP server implementations, OpenAPI tooling - the <a target="_blank" href="https://github.com/deeflect/universal-codemode">repo is open</a>. Issues and PRs welcome. I'm particularly interested in feedback from people running this with Claude Code or Cursor in real projects.</p>
<p>The pattern works. The implementation is early. Both of those things can be true.</p>
]]></content:encoded></item><item><title><![CDATA[Prompt engineering is dead]]></title><description><![CDATA[Prompt engineering as a skill is dead. I know that's a spicy take. I also know it's correct. I've been building AI agent systems since March 2023. Went…]]></description><link>https://deeflect.hashnode.dev/prompt-engineering-is-dead</link><guid isPermaLink="true">https://deeflect.hashnode.dev/prompt-engineering-is-dead</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Tue, 10 Feb 2026 12:00:00 GMT</pubDate><enclosure url="https://blog.deeflect.com/medium-img/08-prompt-eng-dead.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Prompt engineering as a skill is dead. I know that's a spicy take. I also know it's correct.</p>
<p>I've been building AI agent systems since March 2023. Went deep on prompt engineering early - custom GPTs with specialized knowledge bases, engineered prompt systems for UX research, meal tracking, viral content creation, planning assistants. I did the whole thing. Followed the guides, read the papers, obsessed over system prompt structure.</p>
<p>And somewhere in the last 12 months I realized: almost none of that matters anymore. The skill I spent real time developing got commoditized. What replaced it is harder, more valuable, and almost nobody's talking about it correctly.</p>
<h2 id="heading-why-prompt-engineering-as-a-skill-is-dead">Why prompt engineering as a skill is dead</h2>
<p>Prompt engineering had about 18 months as a legitimate technical differentiator. Call it mid-2022 to late-2023. During that window, knowing how to coax useful output from a model was genuinely non-obvious. Chain-of-thought prompting improved outputs meaningfully. Few-shot examples helped a lot. Persona framing, careful instruction ordering, output format control - all of it made a real difference because the base models needed the help.</p>
<p>Then the models got better. Fast.</p>
<p>GPT-4 Turbo, Claude 3, Gemini 1.5 - these models understand intent. You don't need to hand-hold them through a task with elaborate prompting rituals anymore. Chain-of-thought? Current models do it automatically without being told to "think step by step." Few-shot examples? Models infer from conversational context. Carefully structured personas? You can write "you're a helpful assistant that specializes in X" and it works fine.</p>
<p>The elaborate stuff people were selling as advanced prompt engineering? It was always just "learning to give clear instructions to something that needed clearer instructions." That's not a skill. That's communication.</p>
<p>Here's the tell: if prompt engineering were a real technical skill, you'd need to understand something about how the system works to get better at it. But most prompt engineering advice is just... good writing advice with extra steps. Be specific. Give examples. State your constraints. These aren't insights about AI - they're basic communication principles.</p>
<p>The YouTube courses, the "certified prompt engineer" bootcamps, the LinkedIn posts about prompt frameworks - that whole industry built up around a skill that had a two-year shelf life. I'm not dunking on the people who built that content. It was real value at the time. It's just not the bottleneck anymore.</p>
<h2 id="heading-what-actually-killed-it">What actually killed it</h2>
<p>Three things landed simultaneously and the combination was lethal for prompt engineering as a career path.</p>
<p><strong>Better base models that understand intent.</strong> I can give Claude Sonnet a roughly-worded, slightly ambiguous instruction and it'll figure out what I mean. I don't need to craft it like a legal contract. The model's interpretive ability improved faster than the complexity of what people wanted to do with it.</p>
<p><strong>Tool use and function calling.</strong> This is the big one. A huge chunk of what prompt engineering was trying to do was get models to simulate capabilities they didn't actually have. "Imagine you have access to a search engine..." Now you just give it a search tool. The prompt gymnastics were a workaround for the absence of real tool integration. Now that tool calling is standard, you don't need the workaround.</p>
<p><strong>The realization that it's managerial, not technical.</strong> The best prompt engineers were good writers and good managers - people who could specify what they wanted clearly. That's a useful skill. It's not a technical skill. An engineer who spent years learning systems programming has depth that transfers. A "prompt engineer" who spent years optimizing instruction phrasing has a skill that's been automated by model improvements.</p>
<h2 id="heading-what-replaced-it-agent-architecture-and-tool-design">What replaced it: agent architecture and tool design</h2>
<p>I run a multi-agent system called OpenClaw. 15+ specialized agents, each running a different model, handling different parts of my daily workflow - morning digests, research, code tasks, memory management, content scheduling, crypto position monitoring. The system processes around 40K tokens a day. Monthly API cost is about $40 because I'm aggressive about model selection.</p>
<p><img src="https://blog.deeflect.com/medium-img/08-prompt-eng-dead-1.jpg" alt="What replaced it: agent architecture and tool design" /></p>
<p>The prompts for each individual agent? Maybe 20 lines. Sometimes less. Nothing fancy.</p>
<p>The orchestration code is thousands of lines. The tool integrations are where most of the work lives. The hard thinking went into: which agent handles what, how agents hand off context to each other, what happens when an agent fails, how memory persists across sessions, which model is cheap enough for a given task while still being capable enough to not screw it up.</p>
<p>That's the new skill. And it's actually a skill - one that requires understanding systems, trade-offs, failure modes, and cost structures.</p>
<p>Here's what the real work looks like now:</p>
<p><strong>Model selection by task.</strong> I don't use one model for everything. Opus handles orchestration decisions that require judgment calls. Sonnet handles fast tasks where I need speed over depth. Gemini Flash handles research synthesis because it's cheap and good at skimming large amounts of text. Codex handles code because it's purpose-built. Picking the wrong model for a task either burns money or degrades output quality. That selection logic matters far more than prompt phrasing.</p>
<p><strong>Memory architecture.</strong> A single model call is stateless. Real agent systems aren't. How you persist context across sessions, what you include in each agent's working memory, when to summarize versus retain full conversation history - these decisions affect whether your system stays coherent over time or slowly degrades into confusion. My system uses markdown files (MEMORY.md, SOUL.md, AGENTS.md) that agents read from on each run. It's simple and it works. Getting there took iteration.</p>
<p><strong>Error recovery.</strong> Model calls fail. APIs go down. An agent returns a response that's correctly formatted but semantically wrong. What does your system do? Does it retry with the same prompt? Escalate to a more capable model? Log the failure and skip? Notify you? Building robust error handling into agent pipelines is where I've spent more time than on any individual prompt.</p>
<p><strong>Tool design.</strong> When you build tools for your agents to use, you're essentially designing an API for a semi-autonomous system. The tool needs to do one thing clearly. The input schema needs to be simple enough that a model will call it correctly. The output needs to be structured in a way the model can reason about. Bad tool design leads to agents that can't actually use their tools effectively - and you'll spend time debugging model behavior when the real problem is your tool interface.</p>
<p>If you want to go deeper on how I think about agent systems and the principles behind building them, check out <a target="_blank" href="https://blog.deeflect.com/09-mcp-server/">the universal MCP server</a> for more context on where I'm coming from.</p>
<h2 id="heading-the-mcp-shift-and-why-tool-use-is-the-real-frontier">The MCP shift and why tool use is the real frontier</h2>
<p><a target="_blank" href="https://modelcontextprotocol.io/introduction">Model Context Protocol</a> (MCP) is the clearest signal of where this is all heading. Anthropic published the spec, it's being adopted fast, and it formalizes something I've believed for a while: the future of AI capability is real tool access, not better instructions.</p>
<p>The mental shift is this: instead of engineering a prompt that makes a model pretend to have access to data, you give it actual tools to access real data. Instead of "imagine you're an expert at X with access to Y," you connect it to Y's API and let it query directly.</p>
<p>I built a universal MCP server with 56 API integrations. Notion, GitHub, Slack, calendar, weather, crypto data, Spotify, health APIs, web search, memory storage. My agents don't simulate access to these systems. They actually query them. The outputs are real, current, and accurate in ways that no prompt engineering trick could achieve.</p>
<p>That server took weeks to build. The prompts I wrote for the agents that use it took hours. If you're calibrating where to invest your time, that ratio is your answer.</p>
<p>The <a target="_blank" href="https://github.com/modelcontextprotocol/servers">MCP GitHub repo</a> has a solid list of existing server implementations if you want to see what's available before building your own. Don't rebuild what's already there.</p>
<p>Function calling and tool use aren't features bolted onto models - they're the architecture shift that makes models actually useful in production. A model that can query a live database, run code, check current prices, read a file, and send a message is categorically different from a model that only outputs text. The difference isn't prompt quality. It's what the model has access to.</p>
<h2 id="heading-what-this-means-if-youre-building">What this means if you're building</h2>
<p>If you're still spending serious time on prompt templates and prompt libraries, I'd push back on that investment. Not because prompts don't matter - they do, a little - but because the return on that investment has dropped sharply while the return on tool-building and orchestration knowledge has gone up.</p>
<p><img src="https://blog.deeflect.com/medium-img/08-prompt-eng-dead-2.jpg" alt="What this means if you're building" /></p>
<p>The skills that matter right now:</p>
<p><strong>Systems thinking.</strong> How do components fail? What are the dependencies? Where does state live? These are the questions that determine whether a multi-agent system works reliably or collapses randomly.</p>
<p><strong>API integration.</strong> The ability to connect to external systems, understand their data models, handle their rate limits and errors, and build clean interfaces over them. This is the "prompt engineering" of 2025 - not glamorous, high leverage.</p>
<p><strong>Evaluation.</strong> How do you know your agent system is working? Not just "it didn't crash" but "it did the right thing." Building evals for AI systems is hard, undervalued, and increasingly important as these systems touch real workflows. <a target="_blank" href="https://hamel.dev/blog/posts/evals/">Hamel Husain has written well on this</a>.</p>
<p><strong>Cost optimization.</strong> Running agents at scale costs money. Knowing how to profile token usage, pick the right model tier for each task, and cache aggressively is a real engineering skill. I got my 15-agent system to $40/month through iteration, not luck.</p>
<p>For context on the <a target="_blank" href="https://blog.deeflect.com/10-debugging-agents/">3 months of debugging agents</a>, there's more there - I write about this stuff as I build.</p>
<h2 id="heading-the-honest-version-of-where-prompts-still-matter">The honest version of where prompts still matter</h2>
<p>I want to be fair here. Prompts aren't zero-value. There are still cases where prompt quality meaningfully affects output quality.</p>
<p>Highly specialized domains where the model needs tight constraints. Anything involving consistent output formatting that downstream code parses. System prompts for agents that need specific behavioral guardrails. Evaluation prompts where you're asking a model to grade other model outputs.</p>
<p>But notice: these are narrow, specific cases. And even here, the prompt is usually less than 10% of the total engineering work. The rest is the surrounding system.</p>
<p>The people who'll tell you prompt engineering is still a high-value career skill are usually selling prompt engineering courses. The people who are building real systems with AI have mostly moved on.</p>
<p>If you're newer to this and trying to calibrate what to learn: spend maybe two weeks understanding how prompts work and what affects model behavior. Then spend the next six months learning to build systems. That's the right ratio.</p>
<p>The model will follow good instructions just fine. The question is what system you build around it.</p>
<hr />
<p>Start with one tool. Connect your agent to one real API. See how differently the model behaves when it has actual access to something instead of simulated knowledge. That single experience will do more to reframe your thinking than any prompt engineering course.</p>
]]></content:encoded></item><item><title><![CDATA[My coding stack is 4 models deep]]></title><description><![CDATA[Nobody uses one AI model for coding anymore. Nobody serious, anyway. My multi-model coding workflow has me running four-plus models in sequence on most…]]></description><link>https://deeflect.hashnode.dev/my-coding-stack-is-4-models-deep</link><guid isPermaLink="true">https://deeflect.hashnode.dev/my-coding-stack-is-4-models-deep</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Thu, 05 Feb 2026 12:00:00 GMT</pubDate><enclosure url="https://blog.deeflect.com/medium-img/06-coding-stack.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Nobody uses one AI model for coding anymore. Nobody serious, anyway. My multi-model coding workflow has me running four-plus models in sequence on most days, and I ship more in a week than I used to in a month. That's not hype - that's what happens when you stop treating AI coding tools like a single hammer and start treating them like a crew.</p>
<p>Here's the actual stack, why it's built this way, and what most people get wrong about "vibe coding."</p>
<h2 id="heading-what-vibe-coding-actually-means">What "vibe coding" actually means</h2>
<p>It's not "ask ChatGPT to build me an app." That's how you get a 400-line <code>index.js</code> with no error handling that half-works for 20 minutes before collapsing.</p>
<p>Real vibe coding is coding with leverage. You still need to understand what the code does. You still need to catch hallucinations. You still need to make architectural decisions - maybe more consciously than before, because the AI will happily scaffold the wrong architecture at 10x speed if you let it.</p>
<p>What changed: the AI handles the typing and the boilerplate. The parts that used to eat 60% of my time - setting up file structure, writing CRUD routes, building form components I've built a hundred times - that's mostly automated now. What I bring is the product sense. Knowing what to build is harder than knowing how to build it. The "how" is commoditized. The "what" and "why" still aren't.</p>
<p>My background is product design. Ten-plus years of it, including a long stint as sole designer at a fintech platform doing $4B+ in digital assets. That taught me to think about systems - how pieces connect, what breaks under edge cases, where the user actually gets stuck. That context is the thing AI can't replace. It's why a designer who codes can actually get further with these tools than a CS grad who just knows syntax.</p>
<h2 id="heading-the-four-model-lineup">The four-model lineup</h2>
<p>These are the main players. Each one has a job.</p>
<p><strong>Grok (grok-code-fast)</strong> - The fast pass. I use this first. It's cheap, it's quick, and it's genuinely good at scanning code for obvious issues - logic errors, missing edge cases, things that'll blow up. I don't use it for fixes. I use it for triage.</p>
<p><strong>Claude Code</strong> - The surgeon. Best AI I've used for understanding context and making targeted edits. If I have a function that's almost right but subtly broken, Claude finds the problem without bulldozing the surrounding code. It reads the file, understands the intent, and makes the minimal correct change. This is rare. Most models over-edit.</p>
<p><strong>Codex</strong> - The builder. Heavy refactors, multi-file changes, greenfield scaffolding. When I need to restructure a whole module or build something from scratch, Codex is the move. It's not as precise as Claude on targeted edits but it handles scale better. It'll touch 8 files in sequence and keep things coherent.</p>
<p><strong>Gemini (Flash or Pro depending on context)</strong> - The reader. When I need to analyze a large codebase or understand a sprawling chunk of code I didn't write, Gemini's context window is unmatched. I'll drop 50K tokens of code in and ask it to explain the data flow. It handles that better than anything else I've used.</p>
<p>That's the core four. v0 gets a slot for frontend component generation. It's the fastest way to get a working UI component I can then iterate on with Claude Code.</p>
<h2 id="heading-how-the-actual-pipeline-runs">How the actual pipeline runs</h2>
<p>Real example of how a feature goes from idea to done:</p>
<p><img src="https://blog.deeflect.com/medium-img/06-coding-stack-1.jpg" alt="How the actual pipeline runs" /></p>
<ol>
<li><p>I write a rough spec in plain text. What the feature does, what the inputs and outputs are, what edge cases matter. This step is underrated. The cleaner my spec, the better the AI output at every stage.</p>
</li>
<li><p>If I'm building frontend: I hit v0 first. Describe the component, get something that renders. It won't be perfect but it's 80% of the way there in two minutes.</p>
</li>
<li><p>Grok does a fast pass on whatever exists so far. I'm asking it: "what's obviously wrong here? what breaks?" Quick, cheap, catches the low-hanging problems.</p>
</li>
<li><p>Claude Code handles the refinement. Takes the rough output, applies targeted fixes, handles the business logic, integrates with the rest of the codebase. This is where most of my back-and-forth happens.</p>
</li>
<li><p>If Claude hits a wall - something too structurally complex, or needs changes across multiple files - I hand it to Codex. Codex finishes the heavy lifting.</p>
</li>
<li><p>Grok reviews the final output. Another fast pass. At this point I'm looking for regressions and anything the other models introduced.</p>
</li>
<li><p>I read the code. Final check. I don't skip this.</p>
</li>
</ol>
<p>That last step isn't optional. You cannot ship AI-generated code you haven't read. The hallucinations are sneaky. They produce code that looks right and runs right in tests but breaks in production on a Tuesday when someone does something slightly unexpected. Your name is on the commit. Read the code.</p>
<h2 id="heading-my-multi-model-coding-workflow-for-backend-vs-frontend">My multi-model coding workflow for backend vs frontend</h2>
<p>Different problem types call for different entry points.</p>
<h3 id="heading-frontend">Frontend</h3>
<p>Start with v0. Describe the component - what it does, any constraints, the general look. Get the initial render. Then switch to Claude Code for every iteration after that. Claude is better at "change this specific behavior" than v0 is once you're past the initial generation.</p>
<p>For anything that needs complex state management or integration with existing backend types, I'll write that part myself or with Claude Code from scratch rather than trying to wrangle v0's output. v0 is a starting point, not a production artifact.</p>
<h3 id="heading-backend">Backend</h3>
<p>Codex for scaffolding. Give it the data model, tell it what the API needs to do, let it build the structure. Claude for the business logic layer - anything that involves conditionals, data transformation, edge cases. Debugging: paste the error into whatever's fastest. Usually Grok for the first look, Claude if it needs deeper investigation.</p>
<p>For architecture decisions - where to put things, how services should talk to each other, what the data model should look like - I make those myself. I'll ask Claude or Grok to rubber-duck a decision with me, but I'm not delegating architecture to a model. That's the one place where the AI's lack of business context will hurt you.</p>
<h2 id="heading-the-mcp-layer">The MCP layer</h2>
<p>This is the part most people aren't talking about yet.</p>
<p><a target="_blank" href="https://modelcontextprotocol.io/introduction">MCP (Model Context Protocol)</a> tools change how much context your AI coding setup can actually see. Without good context, you're pasting code snippets manually and hoping the model understands the surrounding system.</p>
<p>The one I use daily: <a target="_blank" href="https://github.com/sammcj/mcp-devtools">sammcj's devtools MCP</a>. At ~9K tokens it gives me basically everything meaningful about a codebase - file structure, dependencies, key functions. I drop this context at the start of any substantial session and the model quality jumps immediately. Less hallucination, more accurate edits, better architectural suggestions.</p>
<p>If you're using AI coding tools without MCP integration, you're leaving a lot on the table. The model can only help you as much as it understands the system. Give it the context.</p>
<h2 id="heading-what-this-costs">What this costs</h2>
<p>People act like the price of these tools is a dealbreaker. It's not. But you should know what you're actually paying.</p>
<p><img src="https://blog.deeflect.com/medium-img/06-coding-stack-2.jpg" alt="What this costs" /></p>
<p>I'm on OpenAI Pro ($200/month). That's basically required if you're using Codex for real work - you need the usage headroom. Claude Pro or Max depending on the month. Grok is included in X Premium, which I'd pay for anyway.</p>
<p>All in, I'm spending around $350-400/month on AI tooling. I get somewhere between $800-1,200 of nominal usage value out of it based on what the APIs would cost at direct rates. And I ship maybe 3-4x faster than I did 18 months ago.</p>
<p>The mental model I use: I'm hiring a part-time engineer who's excellent at specific tasks, needs supervision, and occasionally hallucinates. At $400/month, that's a steal. The thing that makes it work is knowing which part-time engineer to call for which job. That's the whole game.</p>
<h2 id="heading-what-breaks-this-workflow">What breaks this workflow</h2>
<p>Being honest about failure modes:</p>
<p><strong>Bad specs kill everything.</strong> If I'm vague about what I want, every model in the chain produces something subtly wrong in a different way, and now I have five things to reconcile instead of one thing to fix. Time spent on the spec is time saved everywhere downstream.</p>
<p><strong>Chaining without reading.</strong> Running model output straight into the next model without reviewing it first compounds errors. Grok flags an issue, Claude "fixes" it, Codex rebuilds around Claude's fix, and now the original problem is buried under three layers of AI decisions you didn't validate. Read between steps.</p>
<p><strong>Using the wrong model for the task.</strong> Claude on a large multi-file refactor gets expensive and sometimes loses coherence. Codex on a targeted three-line fix is overkill and occasionally makes it worse. Matching the model to the job isn't optional.</p>
<p><strong>Architecture by committee (with AIs).</strong> I did this once - asked three different models how to structure a feature, got three different answers, tried to synthesize them. Waste of time. Architectural decisions are mine. I use models to validate and poke holes, not to make the call.</p>
<h2 id="heading-the-honest-take-on-vibe-coding">The honest take on vibe coding</h2>
<p>Most of the backlash against it is people who watched someone generate slop and extrapolated. Most of the hype is people who generated something that worked for 10 minutes and declared victory.</p>
<p>The actual version is somewhere more boring and more useful: AI handles commodity work at speed, you handle judgment. The skill ceiling on building shifted. You don't need to memorize syntax. You do need to know what good architecture looks like, how to write a tight spec, when the AI is confidently wrong, and what the user actually needs.</p>
<p>I couldn't do this workflow without 10 years of product and design experience. Not because the tools are hard - they're not. But because the inputs I give them are shaped by that experience. The prompts are good because I know what I want. The reviews catch problems because I know what breaks. The architecture holds because I've seen what doesn't.</p>
<p>If you want to build a similar stack: start with one model and learn it well. Understand its failure modes. Then add another model where you keep hitting walls. Don't adopt the whole thing at once - you'll just have four sources of confusion instead of one.</p>
<p>Read everything you ship. That's the one rule that doesn't have exceptions.</p>
<p>You can see more about what I'm building and how I think about this stuff <a target="_blank" href="https://blog.deeflect.com/08-prompt-eng-dead/">why prompt engineering is dead</a>. And if you want to dig into related topics - multi-agent systems, prompt engineering, tool comparisons - check out <a target="_blank" href="https://blog.deeflect.com/09-mcp-server/">the MCP server I built</a> to find threads that go deeper.</p>
]]></content:encoded></item><item><title><![CDATA[Why AI Products Have Terrible UX]]></title><description><![CDATA[Most AI products have terrible UX. Not because the AI is bad - because nobody who understands both AI and design is in the room when these things get…]]></description><link>https://deeflect.hashnode.dev/why-ai-products-have-terrible-ux</link><guid isPermaLink="true">https://deeflect.hashnode.dev/why-ai-products-have-terrible-ux</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Sun, 25 Jan 2026 12:00:00 GMT</pubDate><enclosure url="https://blog.deeflect.com/medium-img/03-ai-bad-ux.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most AI products have terrible UX. Not because the AI is bad - because nobody who understands both AI and design is in the room when these things get built.</p>
<p>I've spent 10+ years in product design, including five years designing institutional fintech for 70+ banks at VALK. Now I build AI systems. I write prompts and I write interfaces. I can spec a component in Figma and wire up the agent backend that powers it. That combination is genuinely rare, and the fact that it's rare is exactly why AI UX is such a disaster right now.</p>
<p>This isn't a subtle problem. Open any AI product built primarily by ML engineers and you'll feel it within 30 seconds.</p>
<h2 id="heading-why-ai-products-have-terrible-ux-by-default">Why AI products have terrible UX by default</h2>
<p>The people who understand how transformers work don't think in interaction flows. They think in loss functions and benchmark scores. When an ML engineer ships a UI, you get a settings panel with 40 sliders and tooltips that say "controls the randomness of model outputs." Thanks. Very helpful.</p>
<p>The people who understand interaction design usually can't implement AI systems. They can map the user journey beautifully but they don't know what a context window is, can't reason about latency tradeoffs, and treat the AI as a black box that either works or doesn't.</p>
<p>The intersection - people who can do both - is genuinely tiny. Which means most AI products get built by one camp or the other. And it shows.</p>
<p>Here's the uncomfortable truth: <strong>a mediocre model with great UX beats a great model with terrible UX every time.</strong> ChatGPT didn't win because GPT-4 was the best model when it launched. It won because the chat interface was dead simple. You typed. It responded. No configuration. No onboarding. No explaining what a temperature setting does.</p>
<p>That chat box was a design decision, not an ML decision. And it's worth billions.</p>
<h2 id="heading-the-specific-ways-ai-ux-fails">The specific ways AI UX fails</h2>
<p>Let me get concrete because "bad UX" is a garbage diagnosis. Here's what I actually see when I use most AI products:</p>
<p><img src="https://blog.deeflect.com/medium-img/03-ai-bad-ux-1.jpg" alt="The specific ways AI UX fails" /></p>
<h3 id="heading-chat-for-everything-syndrome">Chat-for-everything syndrome</h3>
<p>Not every AI interaction needs a text input. Some interactions need a button. Some need a slider (a single, well-labeled one). Some need a select dropdown.</p>
<p>When you build "chat as the UI" because it's easy to implement, you're making your users do the work of figuring out what to ask. That's backwards. The product's job is to make the right actions obvious. If your AI can summarize a document, add a "Summarize" button. Don't make me type "please summarize this document" like I'm filling out a form in 1998.</p>
<p>The chat interface pattern gets cargo-culted because ChatGPT did it and ChatGPT is successful. But ChatGPT's whole thing IS chat. It's a general-purpose assistant. Most AI products aren't general-purpose - they're doing specific things for specific workflows. A focused tool should have focused UI.</p>
<h3 id="heading-loading-states-that-feel-like-crashes">Loading states that feel like crashes</h3>
<p>Generative AI is slow. A response can take anywhere from one second to 25 seconds depending on the model, the prompt length, and what you're generating. Users are not okay with a spinner for 20 seconds. They need to know something is happening, roughly how much longer it'll take, and ideally a preview of the output streaming in.</p>
<p>Streaming output is table stakes in 2025. If your AI product shows a blank area and then suddenly dumps the full response, you've already lost. It feels like the app froze and then magically recovered. Streaming makes the latency feel shorter than it actually is - that's not a trick, it's respecting the user's attention.</p>
<p>I've seen products where a 15-second model call shows a static spinner with no copy, no progress indication, nothing. Users absolutely hit refresh. Then they get confused about duplicate outputs. This is a solved UX problem that keeps getting ignored because the engineer who built the AI part is done and the UI is "good enough."</p>
<h3 id="heading-error-messages-written-for-engineers">Error messages written for engineers</h3>
<p>"Something went wrong." Rate limit exceeded. Context length exceeded. Model unavailable.</p>
<p>These are real failure modes that users hit regularly and none of them should surface as generic error states. When the model hits a rate limit, tell the user there's high demand and you're retrying. When the context gets too long, tell them what to do about it - not in token counts, in plain language. "Your conversation is getting long - try starting a new one for best results."</p>
<p>Error handling is where you find out if a designer was actually involved. Engineers write error messages for themselves. Designers write them for the person who just wanted to finish a task.</p>
<h3 id="heading-settings-pages-designed-for-nobody">Settings pages designed for nobody</h3>
<p>Temperature. Top-p. Frequency penalty. Presence penalty. Max tokens.</p>
<p>These settings exist because they're parameters in the API. They got exposed in the UI because nobody asked "should we expose this?" They just asked "can we expose this?" Yes, you can expose it. That doesn't mean you should.</p>
<p>I get it - power users sometimes want control. But the defaults should be invisible and the advanced settings should be buried behind a "configure" link that 95% of users never click. Progressive disclosure is a basic design concept. Show the simple thing first. Put the complex thing behind one more tap.</p>
<p>When your settings page looks like a synthesizer, you've failed the design. Users don't want to tune a model. They want to accomplish something.</p>
<h3 id="heading-treating-ai-output-as-final">Treating AI output as final</h3>
<p>AI output is a draft. It's always a draft. The best AI products make this obvious by making everything editable in-context. Click a sentence. Change it. The system knows you changed it and uses that as signal.</p>
<p>When AI output renders as static text in a read-only block, you're implicitly telling the user that the AI's word is final. That's backwards. The user is in charge. The AI is a collaborator. The UI should make it trivially easy to edit, regenerate, or reject any piece of output.</p>
<p>Linear's AI summaries are a good example of getting this right. The summary is inline and you can just edit it like any other text. The AI offered a starting point. You own the result.</p>
<h3 id="heading-no-feedback-loop">No feedback loop</h3>
<p>If a user deletes an AI output and types something completely different, that's signal. If they regenerate three times, that's signal. If they always ignore the suggested action, that's signal.</p>
<p>Most AI products collect none of this. Not actively anyway. There's no thumbs up/thumbs down. There's no "fix this" button. There's no way for the user to tell the system "you're getting this wrong."</p>
<p>Beyond the product improvement angle, feedback UI makes users feel like they have agency. The AI isn't doing something to them - they're collaborating with it. That's a fundamental shift in how the product feels, and it costs almost nothing to implement.</p>
<p>Nielsen Norman Group has <a target="_blank" href="https://www.nngroup.com/articles/ai-ux-patterns/">documented this pattern extensively</a> - the products that build in feedback mechanisms consistently score higher on user satisfaction than those that treat AI output as a one-way broadcast. This isn't a new insight. It just keeps getting skipped.</p>
<h2 id="heading-what-good-ai-ux-actually-looks-like">What good AI UX actually looks like</h2>
<p>Good AI UX is invisible. The AI is there, doing things, but you barely notice it. You just notice that the product works better than it should.</p>
<p>Autocomplete that predicts what you actually meant to type. Smart defaults that adjust based on what you've done before. Errors that self-correct before you ever see them. Suggestions that appear before you ask for them, in the right context, at the right time.</p>
<p>The goal is never to show off the AI. The goal is to make the user feel competent. There's a real difference between a user saying "this tool is so intuitive" and a user saying "wow the AI is amazing." The first is good UX. The second usually means the AI is impressive but the UX is still making you aware of it - which means it's getting in the way.</p>
<p>Figma's AI integrations are interesting to watch because Figma's team actually understands design. They still struggle with making AI actions feel predictable - there's always a moment of "wait, what did it just do?" - but they're closer than most. That moment of confusion is a UX debt they're actively trying to pay down.</p>
<p>The products I actually like using right now: Notion AI for the in-context editing flow, Cursor for how it makes AI suggestions feel like a collaborator not a replacement, and Linear for keeping AI features out of the critical path so they enhance without blocking.</p>
<p>All three share something: the AI is ambient. It's there when you need it, gone when you don't, and it never makes you feel like you need to understand it to use it.</p>
<h2 id="heading-why-ai-products-with-terrible-ux-keep-shipping-anyway">Why AI products with terrible UX keep shipping anyway</h2>
<p>The gap isn't closing fast enough. AI is getting more capable every few months. Design is being treated as optional or "we'll fix it later." The result is an ecosystem of increasingly powerful AI wrapped in increasingly confusing interfaces.</p>
<p><img src="https://blog.deeflect.com/medium-img/03-ai-bad-ux-2.jpg" alt="Why AI products with terrible UX keep shipping anyway" /></p>
<p>This is partly structural. Most AI companies are founded by researchers or engineers. Design hires come later, if at all. And when they do come, the designer often lands in a team where the ML engineers have already made the fundamental UX decisions - they just didn't call them design decisions. The architecture of the system becomes the architecture of the interface, which is almost never the right call.</p>
<p>Google's <a target="_blank" href="https://pair.withgoogle.com/guidebook">People + AI Research (PAIR) team</a> has a whole guidebook on this. It's worth reading even if you don't agree with everything in it. The core insight - that AI systems require a fundamentally different design approach than deterministic software - is right. You can't just apply standard UX patterns to a system that might give a different answer every time. The guidelines for how to handle uncertainty, how to communicate confidence levels, how to make AI actions feel predictable without being rigid - that's the hard design work that most teams skip.</p>
<p>The <a target="_blank" href="https://www.anthropic.com/usage-policy">Anthropic model card and usage policy documentation</a> is also a useful lens here. The way they think about how Claude should communicate uncertainty and limitations is essentially applied UX thinking at the model level. That's rare. Most model providers treat the interface layer as somebody else's problem.</p>
<p>The companies that figure this out - that actually hire people who can span both domains, or that build real collaboration between their ML and design teams - are going to clean up. Not because their AI is better. Because their AI actually makes sense to use.</p>
<p>I started <a target="_blank" href="https://blog.deeflect.com/01-quit-fintech/">leaving fintech for AI</a> specifically because I kept seeing this pattern and had nowhere useful to point people. The posts that get the most traction are always the ones about the interface layer, not the model layer. People are hungry for this.</p>
<h2 id="heading-fix-the-ux-before-you-touch-the-model">Fix the UX before you touch the model</h2>
<p>If you're building an AI product right now, the single most high-leverage thing you can do isn't to upgrade your model. It's to watch five users try to use your product without any help from you. Don't say anything. Just watch. You'll see exactly where the AI ends and the confusion begins. That's your design debt.</p>
<p>Spend a week on that before you touch your prompt engineering or your fine-tuning pipeline. The UX problems are costing you more users than the model quality is.</p>
<p>If you want to go deeper on the AI engineering side - how the systems actually get built, what the architecture decisions look like from someone who also designs the interfaces - check out <a target="_blank" href="https://blog.deeflect.com/08-prompt-eng-dead/">what replaced prompt engineering</a> for more technical posts. The design-to-engineering gap is a topic I keep coming back to because I keep seeing it break products that should work.</p>
<p>Fix the interface. The model will get better on its own. The UX won't.</p>
]]></content:encoded></item><item><title><![CDATA[I Stopped Posting on Twitter for 2 Months]]></title><description><![CDATA[I stopped posting on Twitter for two months. Not a planned break, not a "digital detox," not a strategic rebranding pause. I just... forgot. This is what…]]></description><link>https://deeflect.hashnode.dev/i-stopped-posting-on-twitter-for-2-months-1-1</link><guid isPermaLink="true">https://deeflect.hashnode.dev/i-stopped-posting-on-twitter-for-2-months-1-1</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Mon, 15 Dec 2025 12:00:00 GMT</pubDate><enclosure url="https://blog.deeflect.com/medium-img/07-disappeared.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I stopped posting on Twitter for two months. Not a planned break, not a "digital detox," not a strategic rebranding pause. I just... forgot. This is what actually happened when I disappeared from X (Twitter) for October and November 2025, and what I learned about taking breaks you didn't mean to take.</p>
<h2 id="heading-how-i-stopped-posting-on-twitter-for-2-months-without-meaning-to">How I stopped posting on Twitter for 2 months without meaning to</h2>
<p>September 6 was my last post before the gap. A week later I tweeted "staying away from X for a few days, wonder if it ruins reach" and then proceeded to vanish for two full months instead of a few days.</p>
<p>I wasn't planning that. There was no decision point where I said "I'm taking a break." I was building. Seven apps in parallel, deep in agent architecture, ADHD hyperfocus locked in. Twitter stopped feeling like a place I existed in. Not because I was boycotting it or burned out on the discourse. I just got absorbed and the habit broke.</p>
<p>That's the honest version. Not a detox story. I didn't meditate more. I didn't reclaim my attention span through discipline. I got pulled into something more interesting and social media fell off naturally. That's how ADHD actually works - when something grabs you hard enough, everything else gets crowded out.</p>
<p>The gap ran October through November. I came back January 26, 2026 with one post: "I'm back because of Clawdbot meta." No apology, no "I've been doing some reflection," no thread about what I learned. Just back.</p>
<h2 id="heading-what-actually-happened-to-reach-when-i-stopped-posting-on-twitter">What actually happened to reach when I stopped posting on Twitter</h2>
<p>Short answer: yes, disappearing kills your numbers. I came back to impressions that were noticeably down from where they were in September. The algorithm punishes inconsistency in ways that are both predictable and annoying.</p>
<p>Here's what surprised me though - my follower count barely moved. The people who followed me for real reasons didn't unfollow during a two-month gap. They just... waited. Or forgot I existed but kept the follow anyway, which is functionally the same thing.</p>
<p>What did drop off were the engagement-farmers. The follow-back accounts, the people following hoping for a mutual, the ones gaming numbers. When I stopped posting, I stopped being useful to them. They left. Good.</p>
<p>So the actual damage from a two-month absence was:</p>
<ul>
<li>Impressions down significantly on return</li>
<li>Algorithmic reach basically reset</li>
<li>Genuine followers intact</li>
<li>Low-quality followers gone</li>
</ul>
<p>That's not catastrophic. It's annoying if you're trying to grow on a consistent curve, but it's not irreversible. Coming back with something real to say matters more than the reach penalty.</p>
<p>The platform rewards consistency, but it doesn't erase you for breaks. It's not that vindictive. It just forgets you for a while and you have to re-earn distribution. Which, to be clear, still sucks. But it's survivable.</p>
<p>Research from the <a target="_blank" href="https://reutersinstitute.politics.ox.ac.uk/digital-news-report/2024">Reuters Institute Digital News Report</a> backs this up - audiences don't actively track individual creator absences the way creators fear they do. People are mostly watching the feed, not waiting for you specifically.</p>
<h2 id="heading-building-in-public-culture-and-why-it-makes-breaks-feel-worse-than-they-are">Building in public culture and why it makes breaks feel worse than they are</h2>
<p>There's a specific kind of pressure that comes with building in public. The implicit rule is you have to be visible. Posting daily "day 47 of building X" content. Sharing every milestone. Being present enough that people remember you exist.</p>
<p><img src="https://blog.deeflect.com/_astro/i-disappeared-for-2-months-1.webp" alt="Building in public culture and why it makes breaks feel worse than they are" /></p>
<p>Miss a week and you feel like you're falling behind. Miss a month and it feels like career death. I'm not immune to this feeling. I've been building in public for long enough to have internalized the assumption that visibility = momentum.</p>
<p>But the two months proved that assumption wrong in at least one direction.</p>
<p>I built more in those two silent months than in the three months of posting before them. Seven apps. Real infrastructure. Clawdbot, which ended up being the thing I came back to announce. When you're not performing the work, you're just doing it. Turns out those are different modes.</p>
<p>The building in public model optimizes for consistency of output, not quality of output. There's value in that - accountability, community, people following along with the journey. But it can also turn into a content treadmill where the posting becomes the thing instead of the building.</p>
<p>I'm not saying building in public is bad. I'll keep doing it. But I'm now aware that the ADHD hyperfocus mode where I forget Twitter exists and just build for two months is also a valid mode. Maybe more productive in certain phases.</p>
<h2 id="heading-the-adhd-angle-forgetting-to-post-is-not-a-failure">The ADHD angle: forgetting to post is not a failure</h2>
<p>Everyone talking about "intentional breaks" from social media has the same energy: "I realized I needed to step back and prioritize my wellbeing." Very deliberate. Very curated. Very LinkedIn.</p>
<p>That wasn't this.</p>
<p>I didn't decide to take a break. The habit just... dissolved. I was on a 2am coding session in early October, deep in something, and the thought of tweeting about it didn't occur to me. Same the next night. By week two the pattern was just gone.</p>
<p>This is textbook ADHD. The executive function overhead of maintaining a social media posting habit - opening the app, forming a thought worth sharing, hitting post, checking the response - that whole loop requires a certain baseline attention budget. When something captures all of it, the habits that depend on leftover attention just stop running.</p>
<p>The <a target="_blank" href="https://www.health.harvard.edu/mind-and-mood/what-is-executive-function-and-how-does-it-relate-to-adhd">ADHD and executive function research out of Harvard Medical School</a> explains this pretty well - executive function isn't a moral failing, it's a resource allocation problem. When the resource is fully committed elsewhere, discretionary habits are the first to drop.</p>
<p>I've made peace with this. It's not undisciplined, it's just how my brain allocates. The flip side of forgetting to post for two months is also why I can build seven apps in parallel while maintaining an agent system that runs 14 cron jobs. Same mechanism, different outputs.</p>
<p>If you have ADHD and you've done this - gone silent for weeks because you were deep in something - it's not a failure mode. It's just the cost of the hyperfocus that also lets you ship faster than most people.</p>
<p>The trick is not building your brand strategy on a foundation that requires daily consistency you won't reliably deliver. Build it on depth instead. One good post after two silent months is worth more than sixty filler posts.</p>
<h2 id="heading-what-coming-back-actually-looks-like">What "coming back" actually looks like</h2>
<p>January 26. "I'm back because of Clawdbot meta."</p>
<p><img src="https://blog.deeflect.com/_astro/i-disappeared-for-2-months-2.webp" alt="What 'coming back' actually looks like" /></p>
<p>That was the whole post. No explanation, no recap thread, no "here's what I learned while I was away" (except this post, I guess). Just the most direct possible signal: I exist, I have a reason to be back, here's the thing.</p>
<p>This felt right. The alternative - the big return post with the reflective thread - felt like it was performing a story instead of just getting back to work. The people who care will engage with the work. The people who need a narrative about why you were gone aren't really your audience anyway.</p>
<p>I did get some "welcome back" responses. More than I expected, honestly. A few people had noticed the gap and were curious what happened. That was kind of nice - it meant the previous presence had registered as real enough that the absence was notable.</p>
<p>But the bigger signal was that nobody was mad. Nobody had been waiting with a timer. The internet doesn't work that way. People move on, the feed keeps moving, and when you come back with something worth seeing, you get traction again.</p>
<h2 id="heading-what-id-tell-someone-about-to-take-or-accidentally-start-a-social-media-break">What I'd tell someone about to take (or accidentally start) a social media break</h2>
<p>Not going to frame this as advice, because I didn't plan any of it. But if you're reading this because you've already been gone for a month and you're wondering if you've tanked your presence - you probably haven't.</p>
<p>A few things that are actually true from experience:</p>
<p>Genuine followers don't leave during a two-month absence. The people who followed you for real reasons are still there. The follower count number that matters is quality, not quantity, and quiet people who actually care about your work have more patience than the algorithm does.</p>
<p>Your reach will take a hit and that's fine. You'll rebuild it. Reach is lagging indicator of consistency, and consistency can be rebuilt faster than you think when you come back with something real. I came back with Clawdbot. That gave me actual things to say.</p>
<p>The building you do during the silence compounds. Those two months produced more than the three months of documented-daily-grind before them. There's something to that. Not every phase of building should be public. Some of it needs to be quiet.</p>
<p>The "building in public" pressure is real and mostly self-imposed. The audience you're building in public for is smaller and more patient than the anxiety makes it seem. If you're good at what you do and you come back with evidence of it, people remember.</p>
<p>And if you have ADHD and you just disappeared because something grabbed you - that's the mechanism working, not failing. The work you did in the silence is the asset. The posts are just distribution for it.</p>
<h2 id="heading-what-stopped-posting-on-twitter-for-2-months-actually-cost-me-and-what-it-didnt">What stopped posting on Twitter for 2 months actually cost me (and what it didn't)</h2>
<p>I have <a target="_blank" href="https://blog.deeflect.com/05-twitter-growth/">how I grew to 500 followers</a> where you can see the full context of what I work on - design background, fintech, AI engineering, all of it. None of it died during two months off Twitter.</p>
<p>The projects I was building kept building. The systems kept running. The professional relationships that matter don't live on Twitter anyway - they live in Discord servers, in direct messages, in shipped product people can actually use.</p>
<p>Twitter is distribution. It's a real tool and a decent one for this type of work. But it's not the substrate. The work is the substrate.</p>
<p>The two months off X taught me that more than anything. When the posting stopped, nothing important stopped with it. The important stuff was already running somewhere else - in the codebase, in the agent system, in the products actually getting built.</p>
<p>Coming back felt like turning a tool back on. Not like returning from exile.</p>
<p>That's the right relationship to have with it. Check <a target="_blank" href="https://blog.deeflect.com/04-seven-apps/">what I was building instead</a> to see what came out of those two silent months. And if you want context on how Twitter's algorithm actually handles inactive accounts, <a target="_blank" href="https://business.twitter.com/en/help/troubleshooting/how-twitter-ads-work.html">X's own creator documentation</a> doesn't spell it out cleanly - but the pattern from third-party analyses is consistent: reach drops fast after ~2 weeks of silence, then stabilizes, then rebuilds within a few weeks of returning.</p>
<hr />
<p>The algorithm is back to punishing me for the gap. I'm fine with it. The seven apps I built during the silence are more valuable than consistent impressions metrics would've been. Trade you'd make again without thinking about it.</p>
]]></content:encoded></item><item><title><![CDATA[0 to 500 Twitter Followers in 30 Days]]></title><description><![CDATA[500 followers in 30 days sounds like nothing until you remember I started from literal zero on June 7, 2025. New account, no imported audience, no…]]></description><link>https://deeflect.hashnode.dev/0-to-500-twitter-followers-in-30-days-1-1</link><guid isPermaLink="true">https://deeflect.hashnode.dev/0-to-500-twitter-followers-in-30-days-1-1</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Thu, 28 Aug 2025 12:00:00 GMT</pubDate><enclosure url="https://blog.deeflect.com/medium-img/05-twitter-growth.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>500 followers in 30 days sounds like nothing until you remember I started from literal zero on June 7, 2025. New account, no imported audience, no cross-promo deals. If you're trying to grow Twitter followers from zero, my situation was as clean-slate as it gets - my previous account @deeflect got banned and I wasn't going to beg for it back. So I rebuilt. And figuring out how I grew from 0 to 500 Twitter followers taught me more about the platform than the previous years I'd spent on it.</p>
<p>I'm at ~660 now. Not viral. Not a "Twitter guru." But I have a real, engaged audience of AI/dev/startup people who actually interact. That's worth more to me than 50K ghost followers.</p>
<p>Here's what I learned rebuilding from scratch.</p>
<h2 id="heading-the-3-routes-to-grow-twitter-followers-from-zero-pick-wisely">The 3 routes to grow Twitter followers from zero (pick wisely)</h2>
<p>Before I talk tactics, the mental model matters.</p>
<p>There are exactly three routes to growing on X. Route A: be funny and shitpost. Route B: drop insights and add value. Route C: rage bait and controversy. That's it. Every account you've seen blow up used at least one of these. Most big accounts you think are doing something special are just doing one of these three things really well.</p>
<p>Route C works. It works fast. It also fills your replies with people who are wrong on the internet as a personality trait. I'm not interested in managing that energy, so I mostly stayed off it.</p>
<p>Route A gets you shared. Funny spreads. But pure shitposting doesn't build authority - it builds a following that sees you as entertainment, not expertise. The second you post something serious, engagement tanks because you trained them to expect jokes.</p>
<p>Route B gets you saved. Value posts rack up bookmarks and follows from people who want to learn something. But pure value content is too easy to scroll past without engaging. It doesn't spread.</p>
<p>The actual sweet spot - and this is the insight that changed my numbers - is A+B together. A funny observation that also teaches something. A self-deprecating building-in-public moment that contains a real insight. The format makes people laugh, the substance makes them follow.</p>
<p>"Shipped a feature that took 3 days to build. My AI agent replaced it in 47 minutes. I'm choosing to be excited about this."</p>
<p>That's funny and it says something real about where AI tooling is going. That kind of post travels.</p>
<h2 id="heading-what-actually-grew-my-account-from-zero">What actually grew my account from zero</h2>
<h3 id="heading-replies-on-big-accounts-this-was-80-of-it">Replies on big accounts - this was 80% of it</h3>
<p><img src="https://blog.deeflect.com/_astro/0-to-500-followers-in-30-days-1.webp" alt="What actually grew my account from zero" /></p>
<p>Not "great post!" Not "I agree!" Not the kind of thing that reads like a bot (more on that shortly).</p>
<p>Actual additions. Real takes. Occasionally a funny riff on what they said. When someone with 50K followers posts something about AI agents being overhyped, I'm not validating their hot take - I'm adding specificity. "The hype is real, the production readiness isn't. I've been running 14 scheduled agent jobs daily for 3 months and the failure rate on complex multi-step tasks is still too high for me to hand off anything important unsupervised."</p>
<p>That kind of reply does a few things. It shows up in the timeline of everyone following that account. It positions me as someone who's actually done the thing. And if it's good enough, the original poster might like it or reply - which extends the reach further.</p>
<p>The key is being genuinely useful or genuinely funny. Vague agreement is invisible. Disagreement with substance is visible. Addition is visible. The metric I use: would someone screenshot this reply? If not, it's probably not pulling any weight.</p>
<p>I probably wrote 15-20 quality replies a day for the first two weeks. That's the unsexy part nobody talks about. It's not posting content - it's showing up in other people's conversations consistently.</p>
<h3 id="heading-opinionated-takes-from-daily-tool-usage">Opinionated takes from daily tool usage</h3>
<p>I use AI tools every day. Cursor, Claude Code, various agent frameworks, LLM APIs. I have real opinions about what's good and what's broken. Those opinions performed well because they're specific.</p>
<p>"Cursor's composer is great until your project hits ~150 files, then the context quality drops noticeably" is a post. "AI coding tools are amazing" is noise.</p>
<p>The <a target="_blank" href="https://blog.deeflect.com/07-disappeared/">what happened when I stopped posting</a> gives the full background, but the short version: 10+ years in design, deep fintech engineering experience, now building multi-agent systems full-time. That's a specific lens. When I post about AI tools, I'm not regurgitating documentation - I'm reporting from actual usage at a level most people don't have.</p>
<p>Specificity is unfakeable credibility. Anyone can say "this tool is good." Not everyone has run 40K tokens per day through their own agent system and tracked the monthly API cost down to $40.</p>
<h3 id="heading-building-in-public-but-only-the-interesting-parts">Building in public - but only the interesting parts</h3>
<p>"Day 47 of my building in public journey" is dead. Nobody wants that. The journey framing assumes your audience cares about you, and they don't - not yet. They care about what you're doing and what they can learn from it.</p>
<p>What works instead: the specific moment that was actually interesting.</p>
<p>Not "working on my AI project today." Instead: "Realized my RAG pipeline was failing not because of the model but because of my chunking strategy. Three days of debugging to find a paragraph break problem. Love this for me."</p>
<p>Building in public posts that perform have an insight embedded in them. The vulnerability is a delivery mechanism for the learning, not the point itself. When the vulnerability is the point, it reads as attention-seeking. When the learning is the point and the vulnerability makes it human, it actually helps people.</p>
<h3 id="heading-timing-matters-more-than-i-expected">Timing matters more than I expected</h3>
<p>I post when US tech Twitter is active. That's roughly 9am-12pm Pacific and then a second window around 5-8pm Pacific. I'm in LA so this is convenient for me.</p>
<p>But the timing thing is real. The exact same post at 2am gets 20% of the engagement it'd get at 10am. The algorithm's initial distribution window is short - if you don't get traction in the first 30-60 minutes, the post dies. So showing up when your audience is scrolling is a basic requirement that a lot of people ignore.</p>
<h3 id="heading-being-weird-and-specific-instead-of-generically-motivational">Being weird and specific instead of generically motivational</h3>
<p>The fastest way to get lost in the feed is to sound like everyone else. "Consistency is key." "Ship fast, iterate faster." "Your future self will thank you." These are not posts. These are bumper stickers.</p>
<p>I'm Russian-born, ADHD, building AI systems in LA, async-only (no calls, ever), obsessed with multi-agent workflows. That's specific. When I write from that specific perspective instead of trying to be universally relatable, the people who connect with it really connect.</p>
<p>You can't optimize for everyone. You can optimize for your actual people.</p>
<h2 id="heading-what-didnt-work-including-an-embarrassing-confession">What didn't work - including an embarrassing confession</h2>
<h3 id="heading-ai-generated-replies">AI-generated replies</h3>
<p>This one I'm putting in writing because I think a lot of people are doing this and thinking it's working.</p>
<p>For a few months, I was using AI to generate replies to posts in my niche. The idea: stay "active" in conversations, look engaged, maybe get some follows from the visibility. The system did not notice - meaning I wasn't flagged or suppressed as far as I could tell. But the growth was essentially flat. Automated engagement looks active, but builds zero real connections.</p>
<p>Here's why it fails: a good reply starts a conversation. An AI-generated reply that's technically relevant but not genuinely insightful doesn't make anyone want to engage back. It gets ignored or gets a polite like. It doesn't turn into a thread. It doesn't make the original poster remember you. It doesn't build a relationship with anyone who saw it.</p>
<p>I switched to genuine replies only - less volume, more quality. Growth actually improved. Because one real conversation is worth more than 50 AI-generated non-interactions.</p>
<p>The meta-lesson: you can use AI to help draft a reply if you're stuck, but you need to inject your actual perspective into it. The algorithm might count impressions, but humans are better than you think at detecting genuine vs. automated engagement.</p>
<h3 id="heading-mass-following-and-hoping-for-follow-backs">Mass following and hoping for follow-backs</h3>
<p>Did this for like a week, stopped, never mentioned it until now. Following 200 accounts a day hoping 10% follow back is a number game that builds the wrong audience. Even when it "works" you get people who don't care about your content - they just returned a courtesy follow. Those accounts become noise in your metrics and won't engage with anything you post.</p>
<h3 id="heading-generic-tips-and-tricks-threads">Generic "tips and tricks" threads</h3>
<p>I tried a few of these early on. "5 AI tools every developer should know" type content. It did okay in terms of impressions but drove almost no follows. The problem is this content exists everywhere. There's nothing in it that could only come from me. When someone reads a generic tips thread, even a good one, they don't feel any reason to follow the source specifically. They just take the info and keep scrolling.</p>
<p>The posts that converted to follows were the ones with a clear point of view. Posts where you can tell who wrote them from the content alone.</p>
<h2 id="heading-the-introverted-builder-angle">The introverted builder angle</h2>
<p>I want to flag something for anyone who's introverted and thinks Twitter growth requires networking, calls, or showing up to events.</p>
<p><img src="https://blog.deeflect.com/_astro/0-to-500-followers-in-30-days-2.webp" alt="The introverted builder angle" /></p>
<p>It doesn't. I don't do calls. I don't go to tech meetups. I'm async-only. Every single one of my followers came through written content and written replies. No podcast appearances, no cross-promo deals, no "collab" posts.</p>
<p>The platform rewards writing, and writing is something you can do alone at 11pm in your apartment. For introverted builders, that's actually a structural advantage. You're competing with people who need external validation to show up - and you can just quietly be consistent.</p>
<p>Check out the <a target="_blank" href="https://blog.deeflect.com/04-seven-apps/">building 7 apps solo</a> for all the AI engineering and building-in-public content if you want to see how this thinking shows up across different topics.</p>
<h2 id="heading-where-i-am-now-and-what-im-focused-on">Where I am now and what I'm focused on</h2>
<p>660 followers, growing slower than the initial burst but more steadily. The first 500 came fast because I was very active with replies. I've pulled back on reply volume a bit as I'm heads-down on some builds, and the growth has slowed accordingly. That's fine - I'd rather have a smaller engaged audience than chase a number.</p>
<p>The things I'd do exactly the same: heavy reply game in the first month, being genuinely specific and opinionated, building in public with the insight-forward framing.</p>
<p>The things I'd change: started with genuine replies from day one instead of testing the AI reply thing, spent less time on generic content earlier.</p>
<p>If you're starting from zero or rebuilding like I was - the reply strategy is not glamorous but it's the most direct path. Find 10 accounts in your niche with 5K-100K followers, show up in their replies every day with actual value, and do it for 30 days before evaluating whether it's working. That's the playbook. The rest is just execution.</p>
<p>One last thing: don't optimize for follower count if you're building something. Optimize for the right followers. 500 engaged AI/dev/startup people is worth more than 5,000 general followers who won't care about what you're building. Niche compounds. Broad doesn't.</p>
<p>Find me at <a target="_blank" href="https://x.com/deeflectcom">@deeflectcom</a> if you want to watch this experiment continue in real time.</p>
]]></content:encoded></item><item><title><![CDATA[Building 7 Apps at Once as a Solo Founder With ADHD]]></title><description><![CDATA[Seven apps. All running simultaneously. All half-built. All "almost done." That was me six months ago, and if you're a solo founder with ADHD, you probably…]]></description><link>https://deeflect.hashnode.dev/building-7-apps-at-once-as-a-solo-founder-with-adhd-1-1</link><guid isPermaLink="true">https://deeflect.hashnode.dev/building-7-apps-at-once-as-a-solo-founder-with-adhd-1-1</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Tue, 12 Aug 2025 12:00:00 GMT</pubDate><enclosure url="https://blog.deeflect.com/medium-img/04-seven-apps.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Seven apps. All running simultaneously. All half-built. All "almost done."</p>
<p>That was me six months ago, and if you're a solo founder with ADHD, you probably know exactly how that happens. Building 7 apps at once isn't a failure mode - it's the default state when your brain treats every new idea like an emergency and you're technically capable of actually building all of them.</p>
<p>I can do the full stack. Design, frontend, backend, smart contracts. Which sounds like an asset until you realize it means nothing stops me from starting something new at 2am because I read one interesting tweet about a framework I've never tried.</p>
<p>Let me tell you what that actually looks like.</p>
<h2 id="heading-how-building-7-apps-at-once-happens-faster-than-youd-think">How building 7 apps at once happens (faster than you'd think)</h2>
<p>It doesn't start as 7. It starts as 1, then 2, then "just a quick experiment," then you blink and your Notion has 7 active project docs and your GitHub has 11 repos created in the last 90 days.</p>
<p>My list at peak chaos:</p>
<p><strong>OpenClaw</strong> - my AI agent system. The main thing. 14 cron jobs running daily tasks, managing my workflow, aggregating data, handling research. Actually running in production.</p>
<p><strong>A music generation pipeline</strong> - GPT-4 generating lyrics, Suno turning them into actual audio, Midjourney for visuals, ElevenLabs for voiceover. The idea was a fully automated artist that produced content without me touching anything after setup. I got it working. Then got distracted.</p>
<p><strong>Crypto products</strong> - I've shipped tokens that hit $10M+ market cap. The financial incentive is real. The problem is crypto moves fast and demands constant attention, which ADHD brains are simultaneously great and terrible at.</p>
<p><strong>An ADHD planning tool</strong> - I was going to build the productivity app that actually worked for my brain because everything else sucked. Classic "scratch your own itch" trap. You know what happened. I got distracted building it.</p>
<p><strong>MCP servers</strong> - Model Context Protocol is genuinely interesting infrastructure work. I built three of them in a weekend because the architecture grabbed me.</p>
<p><strong>CLI tools</strong> - Small stuff. Quick utilities. The kind of thing you build in 4 hours because you needed it for something else and now it exists.</p>
<p><strong>Automation workflows</strong> - n8n pipelines, custom agents, glue code connecting APIs. This bleeds into everything else so it's simultaneously its own project and embedded in all the others.</p>
<p>Seven things. One person. No cofounders by choice - I'll get to why in a minute.</p>
<h2 id="heading-the-adhd-founder-loop-is-real-and-its-not-what-you-think">The ADHD founder loop is real and it's not what you think</h2>
<p>Everyone explains ADHD as "gets distracted easily." That's not wrong but it misses the mechanism. It's not that I can't focus. It's that my brain allocates attention based on novelty and interest, not importance and priority. A new framework registers as urgent. A 6-week-old project that needs documentation registers as optional.</p>
<p>The loop looks like this:</p>
<ol>
<li>New idea hits. Immediate hyperfocus. Build for 16 hours straight.</li>
<li>Get it working. MVP ships. Dopamine.</li>
<li>Hit the boring middle - marketing, SEO, documentation, polish, customer support.</li>
<li>Brain de-prioritizes it. New shiny thing appears.</li>
<li>Repeat.</li>
</ol>
<p>The boring middle is where non-ADHD founders grind through and ADHD founders bounce. The problem isn't the building. I'm fast at building. The problem is everything after the building.</p>
<p>Here's what took me too long to figure out: the boring middle is where the money is. Shipping is fun. Distribution is how projects survive.</p>
<p>And I can't do distribution manually. It just doesn't happen.</p>
<p>This isn't unique to me - the <a target="_blank" href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3449420/">ADHD and entrepreneurship research from Barkley et al.</a> consistently shows that executive function deficits hit hardest on sustained, low-novelty tasks. Which is exactly what distribution and maintenance are. The building phase is fine. Everything after is structurally harder for ADHD brains.</p>
<h2 id="heading-what-building-7-apps-at-once-as-a-solo-founder-with-adhd-actually-costs-you">What building 7 apps at once as a solo founder with ADHD actually costs you</h2>
<p>The real cost isn't time. It's context switching overhead compounded across seven projects simultaneously.</p>
<p><img src="https://blog.deeflect.com/_astro/7-apps-no-cofounders-all-half-finished-1.webp" alt="What building 7 apps at once as a solo founder with ADHD actually costs you" /></p>
<p>Every time you context-switch between codebases, you pay a mental re-load cost. <a target="_blank" href="https://www.ics.uci.edu/~gmark/chi08-mark.pdf">Research on developer context switching</a> puts the refocus time at 23 minutes on average after an interruption. Multiply that by seven projects and you're paying that tax constantly. You're never fully in any one thing long enough to hit the deep work state where hard problems actually get solved.</p>
<p>My peak chaos period felt productive. I was always building something. But my actual output - measured in shipped features, not hours of activity - was lower than my focused periods. The context switching was eating the work.</p>
<p>The other cost is quality. When you're seven projects deep, you're not doing your best work on any of them. You're doing good-enough work on all of them. Which means none of them have the level of craft that makes a product actually stand out.</p>
<p>I shipped an MVP of the ADHD planning tool that was functional but ugly. No time to polish it. Meanwhile I was debugging MCP server architecture and planning the music pipeline. Something had to give and it was always the boring middle tasks - the ones that determine whether anyone actually uses the thing.</p>
<h2 id="heading-the-solo-founder-reality-nobody-posts-about">The solo founder reality nobody posts about</h2>
<p><a target="_blank" href="https://blog.deeflect.com/02-adhd-and-ai/">how ADHD and AI work together</a> is performance art now. Revenue screenshots get thousands of likes. MRR milestones. "I quit my job and 6 months later..." threads. Everyone's sharing the wins.</p>
<p>Posts about almost going broke get 12 likes. Posts about abandoning your fourth project in a row get silence. The authentic failures don't get engagement so nobody posts them, which means every new solo founder thinks everyone else has it figured out.</p>
<p>I've been broke. I've shipped things that made zero dollars. I've built for three weeks and then deleted the repo because I couldn't figure out what the product actually was. I've had projects that made real money and then lost relevance six months later because I didn't maintain them.</p>
<p>The solo part: genuinely fast. No meetings about meetings. No "we should align on the roadmap" conversations with a cofounder who has different priorities. No equity negotiation. No founder breakup. I've watched every cofounder horror story play out in real time around me - equity fights, one person doing 80% of the work, fundamental disagreements about direction, personality conflicts that kill companies that should have made it. Solo is lonely. It's also fast.</p>
<p>The ADHD + solo combination creates a specific failure mode though. There's no one to tell you you're going down a rabbit hole. No one to say "we've been working on this side feature for two weeks, should we refocus?" Your own judgment is the only check on your impulses and ADHD makes your judgment unreliable at the exact moments you need it most.</p>
<p>The fix isn't a cofounder. The fix is building systems that act like a cofounder for the structural stuff while you handle the actual building.</p>
<h2 id="heading-what-actually-survived-and-why">What actually survived (and why)</h2>
<p>Out of seven active projects, two are still running and one of those is making consistent money.</p>
<p>Five are abandoned or on permanent ice.</p>
<p>Here's the honest accounting: those five failures weren't wasted. They taught me things that made the two survivors better. I learned how to architect agent systems from the music pipeline experiment. The MCP servers gave me infrastructure patterns I'm using in OpenClaw. The ADHD planning tool taught me what actually helps my workflow versus what sounds good in theory.</p>
<p>But the reason the two survivors survived isn't just that I learned from the failures. It's that the survivors automated their boring middles.</p>
<p>OpenClaw runs 14 cron jobs. Morning digest, memory management, content scheduling, health data aggregation, crypto position monitoring - all automated. I talk to it every morning. The daily feedback loop exists. The daily maintenance doesn't.</p>
<p>The crypto products that worked had simple mechanics and network effects that didn't require my constant attention. Once they were live, they ran. The ones that needed daily management died when my attention moved elsewhere.</p>
<p>The pattern is consistent: if I have to manually do something for a project to stay alive, that project will eventually die. Not because I don't care about it. Because ADHD means I'll miss 3 days of manual tasks in a row and then it feels too far behind to recover and then I move on.</p>
<p>If the system can sustain itself through a 2-week hyperfocus absence, it lives. If it can't, it doesn't.</p>
<h2 id="heading-why-ill-never-take-a-cofounder">Why I'll never take a cofounder</h2>
<p>Everyone says this is a mistake. "Two founder teams outperform solo founders statistically." I've read the YC essays.</p>
<p><img src="https://blog.deeflect.com/_astro/7-apps-no-cofounders-all-half-finished-2.webp" alt="Why I'll never take a cofounder" /></p>
<p>Here's my actual take: those statistics are describing average cases and I'm not an average case.</p>
<p>What a cofounder typically brings: accountability, complementary skills, emotional support during hard stretches, a second opinion on decisions, someone to handle the stuff you're bad at.</p>
<p>What I actually need from that list: someone to handle the stuff I'm bad at. Specifically, distribution, SEO, documentation, customer communication. The boring middles.</p>
<p>A human cofounder would need 40-50% equity for that. They'd have opinions about the product direction. We'd need to agree on decisions. We'd have to coordinate schedules. They'd have good months and bad months and burnout cycles that don't sync with mine.</p>
<p>An AI agent running my content pipeline costs me $40/month and doesn't have feelings about feature prioritization.</p>
<p>I'd rather have a multi-agent system that handles my weak spots than a human who wants half the company to do the same job. That's not cynical, it's just math. And it only works because I can build the agents myself.</p>
<p>The loneliness is real. I'm not dismissing it. Some weeks the silence is rough. But the alternative isn't "cofounder" - it's <a target="_blank" href="https://blog.deeflect.com/05-twitter-growth/">growing on Twitter</a> and genuinely engaging with the community instead of just posting screenshots.</p>
<h2 id="heading-the-systems-that-make-solo-adhd-actually-work">The systems that make solo + ADHD actually work</h2>
<p>I've been iterating on this for two years. Here's what actually helps:</p>
<p><strong>File-driven everything.</strong> My agents read from markdown files - SOUL.md for personality, AGENTS.md for protocol, MEMORY.md for context. When something needs updating, I edit a text file. No deployments. No configuration hell. Low friction maintenance survives ADHD gaps. High friction maintenance doesn't.</p>
<p><strong>Cron jobs over manual triggers.</strong> If a task requires me to remember to do it, it will eventually not get done. Scheduled jobs run whether I'm in a hyperfocus sprint or a three-day crash. Everything recurring gets automated.</p>
<p><strong>Ruthless scope decisions at the start.</strong> The ADHD planning tool died partly because I kept adding features during the build phase. Every new feature felt urgent. Scope compound-expanded until the MVP was a six-month project. Now I write down the exact features for v1 and I'm not allowed to add anything until v1 ships. This one rule has probably doubled my shipping rate.</p>
<p><strong>Letting projects die without guilt.</strong> I spent too long trying to "get back to" projects I'd mentally left. Felt like failure. Now I have a graveyard folder on GitHub and I use it. Dead projects get documented (so I can steal the code later) and archived. The folder has 22 repos in it. That's fine.</p>
<p><strong>Using the hyperfocus instead of fighting it.</strong> When I'm locked in on something, that's a resource. I try to batch the hardest technical work for those windows. The structured boring tasks - docs, config, cleanup - get batched for the lower-energy periods when I can work mechanically.</p>
<h2 id="heading-finishing-2-out-of-7-is-actually-fine">Finishing 2 out of 7 is actually fine</h2>
<p>Here's the reframe that helped me most: the 5 abandoned projects aren't failures, they're the cost of finding the 2 that worked.</p>
<p><a target="_blank" href="https://blog.deeflect.com/tags">Most indie developers</a> don't talk about their abandonment rate. They talk about the thing that shipped. But every shipped product has a graveyard of experiments behind it. The experiments weren't wasted - they were the research.</p>
<p>My music generation pipeline taught me how to build multi-tool AI pipelines. Spent two weeks on it, never shipped it as a product, use those patterns constantly now.</p>
<p>The ADHD planning tool taught me that "I'll use this myself" is not the same as "other people will pay for this." Different lesson. Equally valuable.</p>
<p>The CLI tools I built in weekends are still sitting in my shell. I use them every day. Zero revenue. Huge quality-of-life improvement. Not everything needs to be a business.</p>
<p>The crypto tokens that hit $10M+ market cap came after multiple experiments that went nowhere. The ones that worked worked because of things I learned from the ones that didn't.</p>
<p>Building 7 apps at once as a solo founder with ADHD is chaotic. It's also how you discover which two are actually worth finishing.</p>
<p>If you're building solo with ADHD and you've got four half-built things on your GitHub and you feel like you're failing - you're not. You're doing the process. The trick is setting up the systems so that when the thing that matters is ready to run, it can run without you holding it up.</p>
<p>Automate the boring middle. Let the losers die fast. Stay technical enough to build your own infrastructure. And ignore anyone who tells you the only way to do this right involves giving half your company to someone else.</p>
<p>The agent handling my distribution doesn't want equity. That's the whole point.</p>
<hr />
<p>If you want to see how the <a target="_blank" href="https://blog.deeflect.com/about">agent system</a> I built actually works - the one that survived while six other projects didn't - I write about it here. The full architecture, the cost breakdown, what broke, what didn't.</p>
]]></content:encoded></item><item><title><![CDATA[How ADHD and AI Work Together (My Real Stack)]]></title><description><![CDATA[I scored 147 on the RAADS-R and 38 on the AQ-50 - both autism screening tests, not ADHD. But I have ADHD too. The combo means my brain is running two…]]></description><link>https://deeflect.hashnode.dev/how-adhd-and-ai-work-together-my-real-stack-1-1</link><guid isPermaLink="true">https://deeflect.hashnode.dev/how-adhd-and-ai-work-together-my-real-stack-1-1</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Tue, 08 Jul 2025 12:00:00 GMT</pubDate><enclosure url="https://blog.deeflect.com/medium-img/02-adhd-and-ai.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I scored 147 on the RAADS-R and 38 on the AQ-50 - both autism screening tests, not ADHD. But I have ADHD too. The combo means my brain is running two different operating systems at once, neither of which came with a manual. I've known for years that my brain works differently, but seeing the numbers made something click.</p>
<p>How ADHD and AI work together - that's become the actual question I've spent the last year building answers to. Not "how do I fix my ADHD" and not "how do I force myself to be more productive." More like: where are the exact gaps, and can software patch them?</p>
<p>Short answer: yes. Not all of them. But enough to matter.</p>
<h2 id="heading-what-adhd-actually-costs-its-not-what-productivity-gurus-think">What ADHD actually costs (it's not what productivity gurus think)</h2>
<p>The mainstream narrative is that ADHD means you're distracted and you need to focus better. That's a useless frame. The real problem is <strong>executive function failure</strong> - the part of your brain that handles task initiation, working memory, time perception, and emotional regulation around boring tasks.</p>
<p>Concretely, that looks like this for me:</p>
<ul>
<li>I forget things. Not occasionally. Constantly. Including things I cared about 20 minutes ago.</li>
<li>I start projects in hyperfocus bursts and sometimes walk away mid-sentence when the dopamine dries up.</li>
<li>I have a productive window from roughly 11am to 2pm. After 2pm I crash. Creative work comes back around 7pm. This isn't laziness - it's a real energy curve that I've tracked across years.</li>
<li>Decision fatigue hits me hard. By 3pm, choosing between two options of roughly equal weight can genuinely stall me for 30 minutes.</li>
<li>Calls destroy my flow state. I've worked async-only since I started freelancing at 14 because traditional structure never fit.</li>
</ul>
<p>None of this is fixed by a better to-do list app. I've tried every productivity system. GTD, time blocking, Notion templates, physical planners - all failed because they assume linear execution, consistent motivation, and that you'll remember to check the system. ADHD brains don't do any of those things reliably.</p>
<p>What AI does is different. It meets you where you are instead of where you should be.</p>
<h2 id="heading-how-adhd-and-ai-work-together-in-practice">How ADHD and AI work together in practice</h2>
<p>I run a multi-agent system called OpenClaw. One of the agents is borb - that's my day-to-day assistant, and it's the piece that's changed how I work more than anything else in the last two years.</p>
<p>The key insight: <strong>AI doesn't need you to have executive function. It has its own.</strong></p>
<p>Borb maintains memory files. When I forget what I was doing - and I will forget - it has a record. When I say "remind me to follow up on this," it doesn't forget. When I ask the same question for the third time, it answers without judgment. That last part is underrated. Executive dysfunction comes with a lot of shame. An agent that just answers, every time, without the sigh or the "didn't we talk about this?" - that's genuinely useful.</p>
<p>The workflows that actually stuck:</p>
<p><strong>Morning state load</strong> - borb checks my reminders, pulls calendar events, and gives me a plain-English summary of what's in front of me. I don't have to go hunting across four apps to reconstruct what today looks like. It's already there. This sounds small. It is not small. Starting the day without that reconstruction overhead means I hit my 11am-2pm window with actual energy instead of spending it getting oriented.</p>
<p><strong>Building</strong> - I describe what I want in rough terms, the agent scaffolds the structure, and then I hyperfocus on the interesting parts. I've talked about this in <a target="_blank" href="https://blog.deeflect.com/04-seven-apps/">building 7 apps at once</a> - the ADHD pattern of "start fast, lose steam" becomes less destructive when the boring scaffolding is already done. The fun parts stay fun. The scaffolding doesn't require motivation.</p>
<p><strong>Writing</strong> - AI drafts, I edit. Editing is dramatically easier than a blank page for an ADHD brain. The blank page has infinite options and zero constraints. A draft has something to react to. Even a mediocre draft gives me a direction to push against, and pushing against things is something my brain can do.</p>
<p><strong>Research</strong> - This one might be the biggest one. I used to fall down 3-hour rabbit holes when I needed to look something up. Not because I was being inefficient - because that's what an ADHD brain does when it hits something interesting. Now I say "look into X and summarize it" and get back a usable synthesis in 10 minutes. The rabbit hole still exists. I'm just not in it.</p>
<h2 id="heading-why-adhd-and-ai-work-together-better-than-any-productivity-system-ive-tried">Why ADHD and AI work together better than any productivity system I've tried</h2>
<p>There's a reason GTD and every app built on top of it eventually fails for ADHD brains. The research on this is pretty clear - executive function deficits aren't a motivation problem, they're a <a target="_blank" href="https://www.additudemag.com/executive-function-disorder-adhd-brain/">neurological regulation problem</a>. Systems that require you to consistently initiate, remember to check in, and maintain motivation to follow through are asking the exact thing the ADHD brain struggles with most.</p>
<p><img src="https://blog.deeflect.com/_astro/adhd-and-ai-how-i-actually-get-things-done-1.webp" alt="Why ADHD and AI work together better than any productivity system I've tried" /></p>
<p>AI sidesteps that loop in a way static systems can't. A to-do app is passive. It waits for you. An AI agent can be active - it surfaces things, drafts things, reduces the next action to something trivially small. That difference is the whole game.</p>
<p>The clinical picture backs this up too. Research from <a target="_blank" href="https://www.additudemag.com/slideshows/adhd-executive-function-deficits/">ADDitude Magazine's medical review board</a> consistently shows that external scaffolding - someone or something that holds structure on your behalf - is one of the most effective accommodations for executive dysfunction. That's what ADHD coaches do. That's what a good EA does. AI can do a version of it at a fraction of the cost, 24 hours a day, without the social friction of asking a human for help again.</p>
<p>The difference between those external scaffolding approaches and AI: AI doesn't get tired of you.</p>
<h2 id="heading-the-90-day-planning-system-i-actually-use">The 90-day planning system I actually use</h2>
<p>One of the more structured things I built is a multi-model planning system for quarterly work. I run it through Claude, Perplexity, and DeepSeek because they think differently.</p>
<p>Here's the rough structure:</p>
<pre><code class="lang-bash"><span class="hljs-comment"># Run planning session across models</span>
<span class="hljs-comment"># Claude: strategic framing and goal coherence</span>
<span class="hljs-comment"># Perplexity: research-backed context on what's realistic</span>
<span class="hljs-comment"># DeepSeek: adversarial review - what did I miss, what's wishful thinking</span>
</code></pre>
<p>Claude does the strategic layer - takes my rough "here's what I want to do this quarter" and shapes it into something coherent with actual priorities. Perplexity pulls external context - market stuff, comparable benchmarks, anything grounding. DeepSeek punches holes in it. Tells me where I'm being optimistic, where the plan assumes consistent motivation that I won't have.</p>
<p>The output is a quarterly plan that's actually calibrated to how I work, not how I should work. It accounts for the energy curve. It front-loads high-executive-function tasks to the 11am-2pm window. It builds in slack because I will start a side project mid-quarter.</p>
<p>This cost me maybe $3 in API calls. ADHD coaches charging $500/month are selling something similar - someone to help you structure the chaos. The AI version doesn't replace the human relationship, but it does the structural work well enough that I stopped needing the coach.</p>
<h2 id="heading-what-still-doesnt-work">What still doesn't work</h2>
<p>I want to be honest here because this is where most "ADHD and productivity" content fails - everything sounds like it works great.</p>
<p><img src="https://blog.deeflect.com/_astro/adhd-and-ai-how-i-actually-get-things-done-2.webp" alt="What still doesn't work" /></p>
<p>Most AI productivity tools are built by neurotypical people for neurotypical people. They assume:</p>
<ul>
<li>You'll check the app on a schedule</li>
<li>That once you've planned something, you'll follow the plan</li>
<li>That motivation is a dial you can turn up</li>
<li>That reminders are sufficient to trigger action</li>
</ul>
<p>None of that is true for ADHD brains. A reminder I ignore three times isn't a reminder problem - it's a task initiation problem. The reminder sees the symptom and treats it by making more symptoms.</p>
<p>The AI tools that work for me are the ones that do the task or reduce it to the smallest possible action. The ones that fail are the ones that just tell me about the task more times. "You have 5 overdue items" is not useful. "I drafted an email for item 3, want me to send it?" is useful.</p>
<p>The other failure mode: AI planners that generate beautiful structured plans I'll never look at again. I've built these myself. They're impressive to screenshot, useless in practice. A plan I'll actually use is ugly, has a lot of slack built in, and survives contact with a day where I wake up unable to do hard things. Most AI-generated plans look like they were made for someone who executes flawlessly and never has a 2pm crash.</p>
<h2 id="heading-the-design-principle-underneath-all-of-this">The design principle underneath all of this</h2>
<p>The best automations I've built are invisible. They give me back the cognitive capacity I was spending on logistics, and I don't notice them working - I just notice I'm less exhausted.</p>
<p>That's the principle I use now when deciding whether to build a new automation: does this return brain capacity, or does it just offload a task I didn't care about?</p>
<p>Offloading boring tasks is fine. But the real value is when an automation handles something that was eating working memory - that background process running in my head that's tracking ten things at once. When borb maintains my memory files, I'm not the one holding context across sessions. That background process is freed up. That's where it gets actually useful.</p>
<p>The principle maps to AI broadly: don't use it to do more things. Use it to think fewer thoughts you didn't want to be thinking.</p>
<h2 id="heading-how-id-actually-start-if-i-were-building-this-from-scratch">How I'd actually start if I were building this from scratch</h2>
<p>If you're ADHD and you've read this far, here's the concrete version:</p>
<ol>
<li><p><strong>Pick one gap</strong> - not "I want to be more productive." Pick the specific thing that burns the most energy. For me it was morning orientation. For you it might be task switching, or research rabbit holes, or writing block.</p>
</li>
<li><p><strong>Build the smallest intervention</strong> - don't automate your whole life. Build one thing that addresses one gap. If it sticks, expand it. If it doesn't, the cost was low.</p>
</li>
<li><p><strong>Make it push, not pull</strong> - tools you have to check don't work for ADHD. Tools that surface things to you do. The difference between "you should open the app" and "here's your summary in Slack at 9am" is the difference between a system I use and one I abandon.</p>
</li>
<li><p><strong>Use the right model for the task</strong> - I wrote more about my AI engineering stack in the <a target="_blank" href="https://blog.deeflect.com/tags">tags section</a> if you want to see the breakdown. Fast cheap models for logistics, more capable models for judgment calls. Don't run GPT-4-class inference for reminders.</p>
</li>
<li><p><strong>Don't trust AI planning apps</strong> - build your own, even if it's rough. An <a target="_blank" href="https://n8n.io">n8n</a> workflow or a cron job calling an API isn't glamorous but it works because you designed it around your actual workflow, not a generic one.</p>
</li>
<li><p><strong>Start with memory before anything else</strong> - the single highest-leverage thing AI can do for an ADHD brain is hold context you'd otherwise lose. A markdown file your agent reads and updates is worth more than any reminder system.</p>
</li>
</ol>
<p>The real unlock was accepting that I'm not going to become a different person with a different brain. The goal is building systems that work for this brain. AI is the first category of tool where that's actually been possible at the software layer.</p>
<p>If you're somewhere on the spectrum of neurodivergence and you've been grinding through systems that don't fit - this is worth trying. Not because AI fixes it. Because for the first time, the tools can be weird enough to match how you actually work.</p>
<p>The <a target="_blank" href="https://blog.deeflect.com/06-coding-stack/">my coding stack</a> I run is open in spirit if not fully in docs. If you want to talk about how to build something similar, I'm usually in the comments or findable.</p>
]]></content:encoded></item><item><title><![CDATA[Why I Left My Role as Solo Product Designer at VALK]]></title><description><![CDATA[Five years is a long time to stay anywhere. And if you want to understand why I left my role as solo product designer at VALK, the honest answer isn't…]]></description><link>https://deeflect.hashnode.dev/why-i-left-my-role-as-solo-product-designer-at-valk-1-1</link><guid isPermaLink="true">https://deeflect.hashnode.dev/why-i-left-my-role-as-solo-product-designer-at-valk-1-1</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Sun, 22 Jun 2025 12:00:00 GMT</pubDate><enclosure url="https://blog.deeflect.com/medium-img/01-quit-fintech.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Five years is a long time to stay anywhere. And if you want to understand why I left my role as solo product designer at VALK, the honest answer isn't dramatic. No blowup. No better offer waiting. Just a quiet realization, somewhere around late 2024, that the thing exciting me most wasn't the thing paying me. I'd been the only designer at VALK - now rebranded to datai - for five years and two months before I walked away in February 2025.</p>
<p>This is the first thing I've written for this blog, so bear with me finding the voice. I'll just tell you what actually happened.</p>
<h2 id="heading-what-valk-was-and-why-it-mattered">What VALK was, and why it mattered</h2>
<p>When I joined VALK in November 2019 I was the only designer. Not "lead designer with a team underneath" - actually the only one. Every pixel that shipped went through me.</p>
<p>The platform was built on <a target="_blank" href="https://www.r3.com/corda/">R3's Corda blockchain</a> for institutional digital assets. Private markets, illiquid assets, end-to-end transaction infrastructure for the kind of clients who don't mess around - 70+ financial institutions — investment banks, hedge funds, and asset managers — across 15+ countries. $4B+ in deals managed on a platform I designed.</p>
<p>I built the design system from scratch. The full transaction platform UX. A DeFi analytics product called Merlin that eventually pulled in 50K+ unique visitors and monitored $5B+ in portfolios. The company won multiple industry awards including Sell-Side Technology and Asset Management recognitions, and got covered in financial industry press.</p>
<p>I'm not listing those numbers to brag. I'm listing them because they matter for understanding what I walked away from. This wasn't a struggling startup I was escaping. The work was good. The platform worked. The clients were real institutions moving real money.</p>
<p>And I still left.</p>
<h2 id="heading-the-boredom-nobody-talks-about">The boredom nobody talks about</h2>
<p>Here's the thing about being solo designer at a B2B fintech for five years: you get really, really good at a very specific thing.</p>
<p>Institutional dashboards. Transaction flows. Data tables with 40 columns. Compliance screens. The UX patterns for "a hedge fund analyst needs to review a digital bond issuance at 2am from their phone" - I know that problem deeply. I could design it in my sleep, and toward the end, I basically was.</p>
<p>By 2024 I could sit down in Figma, design a complex fintech feature, spec it for the engineers, and write the documentation in a day. What used to take a week took a day. That sounds like growth but it's actually a yellow flag. When the difficulty drops that far below your current skill level, you're not learning anymore - you're executing.</p>
<p>The work was technically solid. I just stopped caring about it.</p>
<p>That's uncomfortable to say because VALK was a genuinely good product doing genuinely important infrastructure work. The people weren't the problem. The exit wasn't bad vibes - it was boredom and curiosity pulling harder than comfort.</p>
<h2 id="heading-when-i-started-noticing-the-gap">When I started noticing the gap</h2>
<p>March 2023. That's when I started doing AI work on the side.</p>
<p><img src="https://blog.deeflect.com/_astro/solo-designer-on-a-platform-used-by-70-banks-then-i-quit-to--1.webp" alt="When I started noticing the gap" /></p>
<p>Not because I had a plan. Because ChatGPT had just dropped and I couldn't stop thinking about what it could do. I started building small things - automation workflows, prompt systems, early agent prototypes. Nothing production-ready, just me poking at a new technology the same way I used to poke at new design tools.</p>
<p>The difference was how it felt. I was doing side projects at 2am and not feeling tired. That's the tell. When you're doing something that doesn't drain you even when it should, pay attention.</p>
<p>By mid-2023 I was building autonomous agents with custom personalities for community management and content creation. End-to-end automation workflows in <a target="_blank" href="https://n8n.io/">n8n</a> and custom Python. AI-powered music generation pipelines stacking GPT-4 + Suno + Midjourney + ElevenLabs into something that actually sounded like it was made by a person. Not demos - working systems I was shipping and iterating on.</p>
<p>Meanwhile at VALK, I was designing another data table.</p>
<p>The gap between the two tracks kept widening. By late 2024 it was obvious. I wasn't going to close it while staying in the same seat.</p>
<h2 id="heading-why-i-didnt-leave-sooner">Why I didn't leave sooner</h2>
<p>Honest answer: salary, stability, and the sunk cost of being good at something.</p>
<p>Five years of context in a product is genuinely valuable. I knew every edge case, every integration, every place the design system had technical debt. Starting over in something new meant being a beginner again - and being a beginner doesn't pay the same as being the person who built the whole thing.</p>
<p>There's also a particular trap that hits people who are technically capable: you can justify staying because the work isn't bad. It's not bad. It's just not growing you. "Not bad" is a terrible reason to stay somewhere, but it's a compelling one in the moment.</p>
<p>I also had no clear destination. "I want to do more AI stuff" isn't a career plan. I didn't have a product to go build, a company to join, or a client waiting. Just a direction. That's terrifying when you're used to a steady paycheck.</p>
<p>What finally tipped it was realizing I was doing the interesting work anyway - just not getting paid for it, and not going deep enough on it because I was saving bandwidth for the job. I had to make a choice about which track was real.</p>
<h2 id="heading-what-actually-made-it-hard-to-leave">What actually made it hard to leave</h2>
<p>This isn't a story about walking away from a soul-crushing corporate grind. I want to be clear about that because those stories are everywhere and this isn't one of them.</p>
<p>VALK was a legitimately good place to work. Async-first by nature - I've been no-calls only for years, and that environment respected it. The team was small and technical. The problem domain was interesting. I had real ownership over a real product.</p>
<p>The hard part was that I was leaving something good. Not escaping something bad. That's a different emotional math.</p>
<p>When you leave something bad, there's relief. When you leave something good, there's mostly just uncertainty. You're trading a known quantity for a direction.</p>
<p>I also felt something like guilt about my design craft. Five years of building that specific muscle - institutional fintech UX, complex data visualization, multi-jurisdictional compliance patterns - and I was shelving it. That felt like waste. It took me a while to see that the design background wasn't being shelved, it was being folded into something new. But I didn't have that clarity on the way out.</p>
<h2 id="heading-why-i-left-my-role-as-solo-product-designer-at-valk-the-honest-version">Why I left my role as solo product designer at VALK: the honest version</h2>
<p>People want a clean narrative when someone makes a big change. The "I had an epiphany" story, or the "the company changed" story, or the "I always knew I'd do this eventually" story.</p>
<p><img src="https://blog.deeflect.com/_astro/solo-designer-on-a-platform-used-by-70-banks-then-i-quit-to--2.webp" alt="Why I left my role as solo product designer at VALK: the honest version" /></p>
<p>None of those fit.</p>
<p>The real reason I left my role as solo product designer at VALK after five years is genuinely mundane: I felt like a dinosaur. The world was changing fast, I was sitting still, and I couldn't make peace with that.</p>
<p>AI wasn't an abstraction to me by then - I'd been building with it for almost two years on the side. I knew what was possible. I knew what I could build if I went all-in. And I knew that every month I stayed was a month I wasn't building those things at the depth they deserved.</p>
<p>That's it. No grand vision. No ten-year plan. Just the thing that excited me most wasn't the thing paying me, and eventually that gap gets too loud to ignore.</p>
<h2 id="heading-what-came-next">What came next</h2>
<p>February 2025 I went full AI specialist.</p>
<p>The work I've been doing since: building multi-agent systems, OSS CLI tooling, automation workflows that actually handle real complexity. My crypto background from 2021 - shipped tokens to $10M+ market cap, raised $140K in presale in 72 hours - means I'm not new to the intersection of technical infrastructure and product. The combination of design, AI engineering, and crypto is genuinely rare and I'm still figuring out how to use it.</p>
<p>What I'm not doing is pretending I have it figured out. Sustainable income without a salary is a real problem I'm actively working on. The freedom to build what I want comes with the anxiety of not knowing what next month looks like. That trade is live and unresolved.</p>
<p>What I do know: I'm not bored. I sit down to work and lose track of time. That's the benchmark I didn't know I was missing until I had it back.</p>
<h2 id="heading-if-youre-in-a-similar-spot">If you're in a similar spot</h2>
<p>I'm not going to tell you to quit your job and follow your passion. That's not advice, that's a bumper sticker.</p>
<p>What I will say: if you're doing the interesting work anyway - on nights and weekends, in the gaps between the real job - that's data. You're already telling yourself what you want. The question is whether you're listening.</p>
<p>The gap between what I was doing at VALK and what I could build with AI was too wide. For me, the answer was to close it. Your math might be different.</p>
<p>But "not bad" is not the same as "right." Know the difference.</p>
<hr />
<p>If you want to follow what I'm building from here - multi-agent systems, AI tooling, the whole mess of going independent - this blog is where I'll document it. You can read more <a target="_blank" href="https://blog.deeflect.com/02-adhd-and-ai/">ADHD and AI</a>, or browse by <a target="_blank" href="https://blog.deeflect.com/03-ai-bad-ux/">why most AI products have bad UX</a> if you want to find something specific.</p>
]]></content:encoded></item><item><title><![CDATA[When design stops being enough]]></title><description><![CDATA[There's a specific kind of dissatisfaction that's hard to name when you're in the middle of it. It's not burnout, I've had burnout, I know what that feels…]]></description><link>https://deeflect.hashnode.dev/when-design-stops-being-enough</link><guid isPermaLink="true">https://deeflect.hashnode.dev/when-design-stops-being-enough</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Mon, 16 Sep 2024 12:00:00 GMT</pubDate><content:encoded><![CDATA[<p>There's a specific kind of dissatisfaction that's hard to name when you're in the middle of it. It's not burnout, I've had burnout, I know what that feels like. It's not boredom either. It's more like... you've been very good at a thing for a long time, and one day you realize the thing itself has stopped being enough.</p>
<p>I've been sitting with this feeling for most of 2024. And I think I finally understand what it is.</p>
<p>I don't want to just design anymore. I want to build.</p>
<h2 id="heading-five-years-is-a-long-time-to-stare-at-the-same-product">Five years is a long time to stare at the same product</h2>
<p>I joined VALK in November 2019. I was 23, fresh out of agency work in Moscow, excited to go deep on a single product after years of jumping between clients every few weeks. The fintech world was new to me, I didn't know the difference between a cap table and a spreadsheet, and asset tokenization sounded like science fiction.</p>
<p>Five years later, I understand institutional capital markets well enough to have real opinions about them. I've designed and redesigned the same core flows so many times I can sketch the investor onboarding funnel from memory. I watched the product grow from basic deal management into white-label infrastructure for 70+ financial institutions. I've seen us launch Merlin, watched it grow, watched it pivot, watched everything pivot eventually.</p>
<p>And somewhere in all of that, something shifted in me.</p>
<p>The honest version: I've spent years designing features that then went through a long, complicated relay, me to engineers, engineers to staging, staging to QA, QA back to engineers, then eventually to production, and what shipped was rarely exactly what I had built in Figma. Not always worse. Sometimes different in ways that were actually fine. But always different. And the gap between the thing I made and the thing that existed in the world kept accumulating, specification by specification, interaction by interaction.</p>
<p>At some point that gap stopped feeling like a normal part of the process and started feeling like a fundamental limitation of my role.</p>
<h2 id="heading-the-merlin-christmas-thing-changed-something">The Merlin Christmas thing changed something</h2>
<p>In late 2022 we did a holiday campaign for Merlin, an NFT project, conceptually simple, but requiring actual frontend work and a smart contract. Dev resources weren't there to execute it. I ended up doing it myself.</p>
<p>I built the frontend. I wrote the smart contract. It shipped.</p>
<p>I'm not going to pretend I suddenly became a senior engineer from that experience. There was a lot of documentation reading, a lot of trial and error, a lot of moments where I genuinely wasn't sure what I was doing. But it worked. Real users interacted with something I had built end-to-end, not just designed.</p>
<p>That feeling was categorically different from shipping a design.</p>
<p>When you design something, you're always an intermediary. Someone else has to interpret your decisions, implement your choices, handle the edge cases you may or may not have anticipated. You're producing instructions, not the thing itself. When I built the Merlin campaign myself, there was no translation layer. My decision, my implementation, directly in the world.</p>
<p>That directness was addictive.</p>
<p>I started paying more attention to the code that lived alongside my designs. Reading pull requests. Asking our frontend engineers more specific questions, not just "can we do this?" but "how would you do this, and what would make it easier?" I started learning things I had no immediate professional use for, just because I was curious.</p>
<h2 id="heading-the-designer-who-can-build-conversation-is-getting-old">The "designer who can build" conversation is getting old</h2>
<p>There's been a long-running discussion in design about whether designers should code. It's produced a lot of hot takes and not a lot of clarity. I've held multiple positions on this over the years.</p>
<p>At the agency, I thought it was mostly theoretical. Work was moving too fast for technical depth to matter, what mattered was producing good concepts quickly. At VALK, working on the same codebase for years and sitting in the same engineering conversations repeatedly, the practical argument became harder to ignore.</p>
<p>The designers I admired most weren't the ones with the cleanest component libraries or the most beautiful interactions in Figma. They were the ones who could sit down with an engineer and say "I understand why this is technically complicated, so let's find an approach that gives us 80% of the experience with 20% of the engineering cost." That's a conversation you can only have if you understand both sides.</p>
<p>I've gotten better at the engineering side through necessity, five years in a small team will do that, but I've never fully crossed over. I want to cross over.</p>
<p>Not to stop designing. Design thinking, the way of looking at problems, understanding what a user actually needs versus what they say they need, that doesn't leave you. It becomes part of how you see everything. I don't think I could turn that off if I tried.</p>
<p>But I want the output to be something I built, not just something I handed off.</p>
<h2 id="heading-the-ceiling-that-comes-with-being-the-only-designer">The ceiling that comes with being the only designer</h2>
<p>There's a specific plateau that happens when you're a solo designer at a company for long enough. You get extremely good at reading the organization, at knowing what's possible, at speaking the language of every stakeholder. You become efficient in ways that are invisible, you stop designing things that will never get prioritized, you pre-negotiate constraints before they become conflicts, you develop a kind of institutional intelligence about the product.</p>
<p>Genuinely valuable. Also a trap.</p>
<p>Because the same familiarity that makes you efficient starts to limit what you're able to imagine. You know too much about what won't work. You've heard too many reasons why something is complicated. You start designing within the organization's constraints before you've even explored what's actually possible.</p>
<p>I noticed this in myself over the past year. I'd open a new design problem and my first instinct was already filtered, not by what would be best for the user, but by what I knew about the current architecture, the current team capacity, the current company priorities. That instinct was usually pragmatically correct. But it meant I had stopped designing at the edges of what was possible.</p>
<p>That's the ceiling. And I don't think you can break through it by staying in the same place.</p>
<h2 id="heading-looking-at-the-whole-arc">Looking at the whole arc</h2>
<p>I started freelancing at 14. Designing logos and WordPress themes for small clients in Russia, learning everything from forums and tutorials, figuring out what worked by watching what people responded to. By 19 I was doing professional UX work. By 22 I was lead designer at an agency in Moscow, running design on 50+ projects, working with companies like Kaspersky and OTPBank.</p>
<p>When I joined VALK at 23 I thought I was stepping into the next chapter, and I was. But looking at the arc now, I can see a pattern: I've always moved forward by expanding what I do, not just getting better at a narrower thing.</p>
<p>Freelance to agency wasn't just a change in scale. It was a different kind of work, different relationships, different skills. Agency to product design wasn't just a slower pace, it required learning to care about a single product deeply, to think in systems instead of sprints. Each transition felt uncomfortable and slightly too ambitious at the time, and obvious in retrospect.</p>
<p>I think I'm at another one of those moments.</p>
<h2 id="heading-what-the-next-version-looks-like-i-dont-entirely-know-yet">What the next version looks like (I don't entirely know yet)</h2>
<p>I'll be honest: I don't have a fully formed plan. I'm still inside the thing, still at VALK, still doing my job, and thinking about what comes next mostly in the early mornings before work or late at night when I should probably be sleeping.</p>
<p>What I know is that I want to spend more time building and less time describing what should be built. I want to be in environments where the gap between design and implementation is smaller, either because I'm doing both, or because the team structure makes that gap less of an obstacle. Work on problems where my understanding of how to make things look and feel useful still matters, but where I'm not the last person before handoff.</p>
<p>I've been playing with development tools more seriously over the past year. Not to become an engineer, the learning curve is steep and I respect what proper engineers do too much to claim their title after a few months of experimentation. But to understand enough to participate differently. To be less of an instruction-giver and more of a collaborator who can sit alongside the code.</p>
<p>The role of "designer who only designs" is compressing. The purely pixel-pushing role, the person who exists only to produce Figma files for others to implement, that's a narrower and narrower space to occupy. The designers who are staying actually relevant, not just employed, are the ones who understand the systems they're designing for.</p>
<p>I've always been more systems-oriented than aesthetics-oriented. I care about how the thing works more than how it looks, even though making it look right matters enormously to me. That instinct might translate well.</p>
<h2 id="heading-what-valk-gave-me-that-i-didnt-expect">What VALK gave me that I didn't expect</h2>
<p>I want to be clear about something: I'm not leaving frustrated. I'm leaving having learned more than I thought was possible in a single job.</p>
<p>I learned an entire industry. I went from not understanding what a data room was to having genuine opinions about how institutional investors think about risk. I designed for users who manage billions of dollars of capital, and I had to think carefully about what trust means at that scale, what makes someone comfortable committing to a transaction in a product you built.</p>
<p>I learned to work without much structure. Small team, enormous scope, constantly changing priorities. You either develop judgment quickly or you produce the wrong things. I developed judgment.</p>
<p>And I learned that the thing I designed and the thing that shipped will never be identical, and that's not a failure, it's the nature of collaborative work. But the closer I can get to the implementation, the smaller that gap becomes.</p>
<p>I'm grateful for all of it. Genuinely.</p>
<h2 id="heading-on-writing-this-blog-for-four-years">On writing this blog for four years</h2>
<p>I started kargaev. me as a personal outlet. Somewhere to think through problems out loud, to process what I was learning, to write for an audience of roughly zero and occasionally be surprised that someone found it useful.</p>
<p>I've been inconsistent. Months where I published nothing, months where I wrote three things in a week. The quality varies. Some of the early posts I reread now and notice the awkward phrasing, the grammatical choices that give away that English is my second language, the slightly over-formal tone of someone writing in their non-native tongue.</p>
<p>But I kept writing. Because the act of trying to explain something forces you to understand it better. And because every so often someone would send a message saying a post helped them think through something they were struggling with, and that was enough to keep going.</p>
<p>I don't know exactly what the next chapter is yet. I know it involves building more and designing differently, and figuring out what I want to do with everything I've accumulated over the past decade.</p>
<p>I'll probably write about it.</p>
<p><em>Originally published on kargaev.me. Imported to blog.deeflect.com archive.</em></p>
]]></content:encoded></item><item><title><![CDATA[The unglamorous work that makes design real]]></title><description><![CDATA[There's a Figma file sitting open on my second monitor right now. It has 2,347 frames. I know this because Figma tells me in the bottom-left corner, and…]]></description><link>https://deeflect.hashnode.dev/the-unglamorous-work-that-makes-design-real</link><guid isPermaLink="true">https://deeflect.hashnode.dev/the-unglamorous-work-that-makes-design-real</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Mon, 11 Mar 2024 12:00:00 GMT</pubDate><content:encoded><![CDATA[<p>There's a Figma file sitting open on my second monitor right now. It has 2,347 frames. I know this because Figma tells me in the bottom-left corner, and I've been watching that number grow for four years. Not because I'm proud of it. It's just evidence of time.</p>
<p>My Behance portfolio, which I haven't updated since 2021, shows a campaign microsite I built at Spacecode in 2017. Clean screens, gradient overlays, a case study that describes my "approach to user-centered design." It has a few thousand views. The VALK work, five years of actual enterprise product design, the design system that scales across a white-label platform used by 70+ financial institutions, isn't on Behance. And even if I tried to put it there, I wouldn't know what to show. The interesting parts don't photograph well.</p>
<h2 id="heading-the-stuff-nobody-posts-on-dribbble">The stuff nobody posts on Dribbble</h2>
<p>If you scroll Dribbble for fintech dashboard inspiration, you will see the same things: dark mode analytics screens with glowing charts, clean onboarding flows, pill-shaped buttons with just the right amount of padding. Everything is populated with beautiful sample data. Numbers that fit perfectly in their containers. Names that are exactly the right length.</p>
<p>You will not see the screen that shows when a user tries to initiate a token transfer but the counterparty's jurisdiction is flagged by the compliance engine, and the user has two of their own documents expired, and the transaction is above the threshold that requires additional review, and we're not sure if we should show one error or three or a combined message that explains the compound problem without creating legal exposure.</p>
<p>That's a real scenario I spent two days on. The final design is four lines of text and a link to a support page. It looks like nothing. It will never be on Dribbble.</p>
<h2 id="heading-the-actual-scope-of-a-screen">The actual scope of a screen</h2>
<p>Here's a habit that took me a while to build: when I add a new screen to the design system, I now immediately create a column of states beside it. Happy path, empty state, loading state, error state, partial data state, permission-restricted state, deprecated feature state for old clients who haven't migrated. Sometimes the permission-restricted state has three sub-states depending on user role.</p>
<p>In a typical case study, someone shows you one screen. That's one out of maybe eight.</p>
<p>The empty states are actually the ones I find most interesting now, micro-UX moments that most products completely abandon. An empty portfolio isn't just a blank table. It's someone who just signed up and has nothing yet, or it's an admin who cleared a category, or it's a filter combination that returned zero results, or it's a user who had data and it's been archived. Each one needs different copy and different next-action guidance. Treating them all the same is a visible failure in the product.</p>
<p>I've started writing the copy for empty states myself rather than leaving a placeholder for the content team. At our size, in our timezone situation, I'm in LA, the rest of the team is in London, if I leave a content placeholder, it might sit there for three weeks while we cycle through Slack threads about it. Better to write something decent and refine it than to block the build on copy.</p>
<h2 id="heading-the-timezone-problem-and-what-it-does-to-documentation">The timezone problem and what it does to documentation</h2>
<p>The eight-hour gap between Los Angeles and London changes how design work actually happens. By the time I'm fully awake and into focus, the London dev team has already had half their working day. If I send a message at 9am my time, they get it at 5pm theirs, end of day.</p>
<p>This means every handoff note I write has to stand on its own. No "ping me if you have questions" as a safety net. If the annotation isn't clear, work stops or, worse, implementation happens based on a wrong assumption, and I find out the next day when I'm looking at the build in staging.</p>
<p>I've become almost obsessive about handoff documentation as a result. Not in a precious way, just thorough. Every component in the Figma file has a sidebar annotation explaining the interaction, the constraint, the edge case. Every screen has a section for "implementation notes" that's separate from the design itself.</p>
<p>Does the dev team always read it? Not always. But when something ships wrong, I can locate exactly where the communication broke down, and that's actually useful for improving the process. The annotations have gotten better over four years because I started tracking which kinds of ambiguity cause problems in implementation. Spacing is never the issue. State transitions are always the issue.</p>
<h2 id="heading-file-organization-is-design-work">File organization is design work</h2>
<p>A Figma file with 2,347 frames can be navigated in about twenty seconds if the organization is right. It can also be a complete nightmare that drives everyone away from using the file and back to "just building from memory."</p>
<p>We have pages organized by product area, then by feature, then by component library, then by archive. Every deprecated design goes into archive with a label and a date. Every in-progress screen lives on a page called "WIP, [feature name], [my initials], [date]." When it's ready for review, it gets moved to the feature page and the WIP page is deleted.</p>
<p>This sounds boring to describe. It took three separate Slack threads over two weeks to agree on this system.</p>
<p>The naming convention debate is a real thing that happens at real companies, and it's not stupid, it represents genuine disagreement about how work should be organized and who the primary audience of the file is. Designers? Developers? Stakeholders? We ended up with a system that slightly annoys everyone, which means it's probably close to right.</p>
<p>The file organization is a design decision. If developers can't find the right frame, they'll find the wrong one. If the component library is messy, people stop using it and start building one-offs. A chaotic Figma file has a real downstream cost in implementation quality, and that cost is usually invisible because nobody traces a misimplemented UI back to the file structure that caused the confusion.</p>
<h2 id="heading-accessibility-annotations-the-work-after-the-design">Accessibility annotations, the work after the design</h2>
<p>Here's one I didn't do well in the early VALK years and have since tried to get more disciplined about: accessibility annotations in the design file.</p>
<p>Not just "make sure there's enough contrast." I mean the actual annotation layer that tells a developer the focus order of interactive elements on a complex dashboard, which elements need aria-labels and what those labels should be, how a screen reader should interpret a table with nested rows that represent different asset classes and their sub-holdings.</p>
<p>Financial data interfaces have particular accessibility challenges because they're so dense. A screen that shows a client's portfolio isn't like a simple form, it's a hierarchy of relationships between entities, and the visual hierarchy is doing a lot of work that a screen reader can't replicate without guidance.</p>
<p>I can't make those annotations exhaustive, there isn't time. But the key ones, on the key flows, matter. We've shipped screens where the developer inferred the wrong reading order because the visual layout was complex and I hadn't annotated it. Those are the bugs that take longest to notice and longest to trace.</p>
<h2 id="heading-maintenance-as-the-main-job">Maintenance as the main job</h2>
<p>At some point in the last year, I realized that the majority of my design work is now maintenance rather than creation. New features require touching existing components. A layout change in one area ripples into three other areas. The design system needs to absorb a new pattern without breaking the consistency of everything built before it.</p>
<p>This is what the fifth year of a product looks like. I don't think anyone warns you about it.</p>
<p>Agency work, which I did at Spacecode for several years before VALK, is almost entirely creation. You're always working on something new. The brief is defined, you design to it, you hand it off, it ships, you move on. I did this for projects with Kaspersky, with OTPBank, with a dozen other clients. The product I'm handing off is never my problem three weeks later.</p>
<p>At a product company, you live with the decisions you made two years ago. That component I designed in 2020, I look at it now and I can see exactly what I was thinking and where I was wrong. The constraint I worked around in 2021 is now part of the furniture, and building anything new means working around it again.</p>
<p>Maintenance is not lesser work. It requires a deeper understanding of the system than greenfield design. When I add a new state to an existing component, I have to know what every existing use of that component depends on, what will break, what will flex, what implicit assumptions developers have made based on the original design. This is harder than designing the component fresh.</p>
<p>It just photographs terribly.</p>
<h2 id="heading-what-senior-design-actually-looks-like">What senior design actually looks like</h2>
<p>I've been thinking about what "senior" means in the context of product design, because I'm at an age and stage where I'm supposed to have figured it out.</p>
<p>My best guess: senior design is characterized by exactly these unglamorous things. The documentation. The edge cases. The accessibility pass. The handoff so good that a developer eight timezones away can implement it correctly without a single clarifying question.</p>
<p>The flashy part, the thing that gets portfolio views and Dribbble follows, is maybe 20% of what I actually do. And it's the 20% that requires the least accumulated knowledge. Anyone can make a beautiful empty-state illustration. Fewer people can design the logic that determines which of your six empty states the user sees and why.</p>
<p>I'm not complaining. I'm mostly just noting the gap between what design looks like from the outside and what it is from the inside. The gap is bigger than I expected when I started.</p>
<h2 id="heading-the-portfolio-problem">The portfolio problem</h2>
<p>My Behance sits there, quietly outdated. I look at it sometimes and feel a mild existential discomfort. The work I'm most proud of from my career is largely invisible. The tokenization platform I designed over five years has processed billions in transactions. The design system underpins a white-label product used by institutions across fifteen countries. None of this is postable in a way that generates Behance views.</p>
<p>The agency work, the OTPBank app redesign, a few splash sites, some brand identities, those are the projects that look impressive in a scroll. They have before-and-after moments. Defined scope that fits in a slide.</p>
<p>I don't have a solution to the portfolio problem. Maybe the people who hire senior product designers at serious companies understand that the visible portfolio is the least interesting part of the picture. Maybe they ask the right questions in interviews, how you handle edge cases, system maintenance, handoff documentation, and the Dribbble portfolio becomes almost irrelevant.</p>
<p>Or maybe everyone just pretends the flashy work is the whole job and we all collectively agree not to post screenshots of our 47 error state variants.</p>
<p>Either way, the work exists. The documentation is in the Figma file, annotated and organized, waiting for someone to implement it correctly. The edge cases are handled. The empty states say something useful.</p>
<p>That's enough, even when it doesn't look like anything.</p>
<p><em>Originally published on kargaev.me. Imported to blog.deeflect.com archive.</em></p>
]]></content:encoded></item><item><title><![CDATA[When your company pivots and your design work stops mattering]]></title><description><![CDATA[There's a specific kind of silence that comes after a pivot announcement. The Figma files don't delete themselves. The components are still there…]]></description><link>https://deeflect.hashnode.dev/when-your-company-pivots-and-your-design-work-stops-mattering</link><guid isPermaLink="true">https://deeflect.hashnode.dev/when-your-company-pivots-and-your-design-work-stops-mattering</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Mon, 18 Dec 2023 12:00:00 GMT</pubDate><content:encoded><![CDATA[<p>There's a specific kind of silence that comes after a pivot announcement. The Figma files don't delete themselves. The components are still there, organized in the same folder structure you spent weeks perfecting. The design system still loads. Everything looks exactly like it did yesterday. But you know, with quiet certainty, that most of it isn't going where you thought it was going.</p>
<p>That silence has been my companion for most of 2023.</p>
<h2 id="heading-four-years-of-product-work">Four years of product work</h2>
<p>I joined VALK in November 2019 as the only designer. No design system, no component library, no brand standards beyond a logo and a color. I built everything from scratch, the tokenization platform interfaces, deal management flows, investor dashboards, cap table tools. Every modal, every empty state, every error message. I made the decisions about spacing scales and typography and when to use a table versus a card layout. It was genuinely mine in a way that product work rarely is.</p>
<p>When you're the sole designer at a company for four years, you develop a strange relationship with the product. You know where every skeleton is buried. You remember why that particular dropdown works the way it does, even though it looks weird, because of a compliance requirement that came in last-minute from a specific client. You carry four years of context in your head that isn't documented anywhere.</p>
<p>That's a lot to hold.</p>
<h2 id="heading-the-pivot">The pivot</h2>
<p>I'm not going to pretend I didn't see it coming. The signals were there throughout 2023, conversations about market positioning, about where institutional blockchain was heading, about what VALK needed to become to stay relevant. Companies at this stage either find a bigger wedge or they stall. I understood the logic.</p>
<p>The decision was to move toward DatAI Network, a significant reposition toward on-chain data infrastructure. It's a real strategic bet, not a vanity rebrand. I can see why the leadership made it.</p>
<p>But here's what nobody really talks about: what happens to the designer when this happens?</p>
<p>The brand for DatAI came from an external design agency. Which is fine, that's often the right call for a major rebrand. Agencies bring fresh perspective, they move fast on identity work, they don't have four years of internal baggage coloring every decision. I understand why you'd go external.</p>
<p>But then you hand that brand to the sole internal designer and say: adapt this to everything we need.</p>
<h2 id="heading-becoming-a-brand-adapter">Becoming a brand adapter</h2>
<p>My job description didn't change. My title didn't change. But the actual work changed substantially.</p>
<p>For most of 2023, I spent roughly sixty percent of my time on presentations, slides, pitch decks, social media templates, and one-pagers. The product design work, the interfaces, the flows, the actual UX, became secondary. Sometimes it felt further back than that.</p>
<p>The deck designer trap is something I'd read about in passing but never thought I would fall into so hard. When I took this role in 2019, I imagined myself deep in interaction problems, thinking about how institutional investors process complex financial data, how to reduce cognitive load in a cap table view. And I did that work for years. It was the work I cared about.</p>
<p>Investor presentations are not that work. Social media graphics are not that work. They require skill and they require care, I'm not dismissing them, but they're not why I studied design. They're not the reason I spent nights in my early twenties reading about information architecture.</p>
<p>Working with someone else's brand guidelines after you've owned the brand for years is its own particular adjustment. The external agency did good work. The visual identity for DatAI is solid. But it's not mine, and adapting it feels like translating, I understand what they were going for, I can execute in their style, but I'm not speaking my own language anymore.</p>
<p>There's a small indignity in that. Nothing dramatic. Just a constant low hum of "this isn't quite what I would have done."</p>
<h2 id="heading-the-emotional-reality-of-watching-your-product-get-deprecated">The emotional reality of watching your product get deprecated</h2>
<p>I want to try to describe what it actually feels like, because I haven't seen many designers write about this honestly.</p>
<p>The VALK tokenization platform that I designed from 2019 to 2022, the one I sweated over, rebuilt the design system for twice, knew every edge case of, that product is not the future of this company. The Merlin DeFi tracker, which I designed and also did some of the frontend work for, is not the future either in its original form. These things still exist in some capacity but they're not where the investment is going.</p>
<p>Intellectually, I know this is just how startups work. Products evolve, strategies shift, things you built get superseded. I've seen it happen at other companies from the outside. Experiencing it from the inside, as the person who made those things, is different.</p>
<p>It's a quiet kind of grief. Nobody died. The company is still alive, actually taking a direction that might work out well. But the product I spent four years caring about, the one I could navigate with my eyes closed, the one where I knew exactly why every decision was made, that product is quietly being set aside.</p>
<p>You grieve it a little. I think you're supposed to.</p>
<p>What helped me recognize this was talking to a friend outside of design who went through something similar when their team's project got cancelled. They said: "The work was real even if the thing doesn't exist anymore." I've been sitting with that. The work was real. The thinking was real. The solutions to real problems were real. The product moving in a different direction doesn't undo four years of craft.</p>
<p>I mostly believe that. On good days I believe it completely.</p>
<h2 id="heading-what-im-actually-doing-with-the-frustration">What I'm actually doing with the frustration</h2>
<p>The healthy answer would be "channeling it productively." The honest answer is: a mix of that and just feeling it.</p>
<p>I've become more rigorous about the work that is still mine. Even if sixty percent of my time is presentations, the forty percent that is product design gets more deliberate attention. When I do get to work on actual interface decisions for DatAI, I'm more conscious of it. I document more carefully. I write down my reasoning in ways I didn't bother to earlier in my career when everything felt self-evident.</p>
<p>I've also gotten more honest with myself about what this period means professionally. Four years at one company is a long time, especially in this industry. I've grown enormously here, I understand institutional finance in ways I couldn't have predicted when I was 23 and had never worked in fintech. I can read a cap table, have an actual conversation about tokenization mechanics, understand compliance constraints intuitively. That knowledge is real and it's mine regardless of what direction the company takes.</p>
<p>But I'm starting to think about what comes next. Not urgently, not with resentment. Just honestly. When a company pivots and the role quietly transforms into something different from what you signed up for, it's a reasonable moment to ask whether this is still the right place to be developing as a designer.</p>
<p>I don't have a clear answer yet. But the question is there, and ignoring it would be worse than sitting with it.</p>
<h2 id="heading-getting-good-at-adapting-someone-elses-vision">Getting good at adapting someone else's vision</h2>
<p>There is one thing I've had to genuinely learn this year, and I want to give it credit rather than just frame it as frustration.</p>
<p>Executing within someone else's brand system, when that system is good, is actually a real skill. The DatAI visual language has a logic to it, and understanding that logic well enough to extend it coherently is not nothing. I've made hundreds of small decisions about how to apply their system to contexts the external agency never anticipated. Data table treatments, mobile breakpoints, slide layouts with very different content densities, loading states and error conditions.</p>
<p>None of that is as satisfying as building the system from scratch. But it's not mindless either. It's a different kind of craft.</p>
<p>I've noticed that I'm more opinionated about this kind of work than I expected to be. Even within external guidelines, there's room for judgment calls. What counts as "on brand" in an edge case isn't always specified. Those small judgment calls are where I can still leave fingerprints.</p>
<h2 id="heading-tofu">Tofu</h2>
<p>I'm going to end this on something unrelated to design because 2023 deserves to be remembered for more than just the pivot.</p>
<p>In early December we got a Maltese puppy. His name is Tofu. He weighs about five pounds and has the energy of something much larger and the expression of a small emperor who is not fully certain the world is being run correctly.</p>
<p>Getting a puppy is objectively chaotic. The sleep disruption, the constant supervision, the steep learning curve of understanding what he needs and when. My partner Anna and I have had approximately zero chill since he arrived.</p>
<p>It is also the best decision of the year. Possibly of several years.</p>
<p>There is something clarifying about a small creature who needs you reliably and completely and doesn't care at all about product pivots or brand guidelines or whether the deck you made looks good on a 4K display. Tofu needs a walk and some food and someone to play with. That's the whole thing. That simplicity, right now, is kind of a gift.</p>
<p>I was skeptical of the "get a dog for your mental health" narrative before this. I understand it now.</p>
<h2 id="heading-some-kind-of-conclusion">Some kind of conclusion</h2>
<p>I don't think I have a tidy takeaway from this year. The honest version is: when your company pivots significantly and you're the sole designer, you absorb a lot of the disruption in ways that aren't always visible to the rest of the team. Your past work quietly becomes legacy. Your role quietly becomes something different. And you have to figure out, largely on your own, how to feel about that and what to do with it.</p>
<p>I'm not bitter about VALK or the pivot. Companies have to make strategic decisions, and this one makes sense. The people I work with are good. The mission, in its new form, is real.</p>
<p>But I also think the designer's experience of a company pivot is worth talking about more honestly than it usually is. You don't just update the Figma files and move on. There's context you lose access to, craft that gets deprecated alongside the product, a version of the job that quietly disappears while the title stays the same.</p>
<p>You mourn it a little. You adapt. You find where your fingerprints can still land.</p>
<p>And sometimes you get a five-pound Maltese puppy who needs a walk right now, actually, and does not care about any of this at all.</p>
<p>That helps more than I expected.</p>
<p><em>Originally published on kargaev.me. Imported to blog.deeflect.com archive.</em></p>
]]></content:encoded></item><item><title><![CDATA[Agency vs product design  -  why I'm not going back]]></title><description><![CDATA[Someone asked me recently if I'd ever go back to agency work. A friend from Moscow, still at a studio there, sending me their latest case study, thirty…]]></description><link>https://deeflect.hashnode.dev/agency-vs-product-design-why-im-not-going-back</link><guid isPermaLink="true">https://deeflect.hashnode.dev/agency-vs-product-design-why-im-not-going-back</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Tue, 05 Sep 2023 12:00:00 GMT</pubDate><content:encoded><![CDATA[<p>Someone asked me recently if I'd ever go back to agency work. A friend from Moscow, still at a studio there, sending me their latest case study, thirty screens, beautiful gradients, a banking app they'd designed in six weeks. It looked incredible. I remembered that feeling. The rush of building something polished from nothing, handing it off, moving on.</p>
<p>My answer was no. And it surprised me a little how certain I was.</p>
<p>I spent almost two years at Spacecode in Moscow before joining VALK. Lead UX/UI, team of five or six designers, somewhere over fifty apps shipped across my time there. Kaspersky, OTPBank, fintech startups, retail, events platforms. Then I joined VALK in late 2019, one product, one designer, and now nearly four years later I'm still here, still the only designer, still working on the same platform that grew into something I couldn't have imagined at the beginning.</p>
<p>These are genuinely different careers. Not just different jobs. Different ways of understanding what design even is.</p>
<h2 id="heading-what-agency-taught-me-and-it-taught-me-a-lot">What agency taught me (and it taught me a lot)</h2>
<p>I want to be honest about this because I see product designers dismissing agency work, and it's unfair.</p>
<p>Spacecode made me fast. Not reckless, actually fast in the right ways. When you're shipping a full product every six to eight weeks, you develop instincts that most product designers never build. You learn which decisions actually matter in week one versus week three. You learn to kill your darlings quickly because there's no time for attachment.</p>
<p>The visual polish I developed there still shows up in my VALK work. Working across so many industries meant exposure to dozens of design patterns I never would have seen otherwise. Banking interfaces, event apps, security software, every project had its own logic, its own user behavior, its own constraints.</p>
<p>Leading a team taught me something too. Reviewing junior work, running crits, helping someone understand why their hierarchy isn't working, you understand your own craft better when you have to explain it. I mentored five or six junior designers at Spacecode. Some of them are probably running their own teams now.</p>
<p>The client presentations also hardened me in a useful way. You learn to defend your decisions to people who don't speak design, who have opinions about colors, who want something "more modern" without knowing what that means. You either develop the language to handle that or you get eaten alive.</p>
<h2 id="heading-what-agency-didnt-teach-me">What agency didn't teach me</h2>
<p>Here's what I didn't understand when I was at Spacecode: I thought design ended at delivery.</p>
<p>It was built into the structure of the work. You shipped the app, wrote up the case study, moved to the next one. Whatever happened after, whether users actually used it, whether the flows made sense in production, whether the edge cases held up, that wasn't really your problem. Not because anyone was cynical about it. Just because the project was over.</p>
<p>I had no idea how much of design happens <em>after</em> that point.</p>
<p>Six weeks is not enough time to understand any domain properly. I designed a banking app for OTPBank and I didn't really understand how the back-office flows connected to what users saw. I made it look right and feel usable, but the deeper logic of the system, the compliance requirements, the actual user journeys across months of usage, I only touched the surface. The timeline didn't allow anything more.</p>
<p>At Spacecode I was always the expert in the room on design. Nobody challenged me on UX decisions in any fundamental way because nobody knew more about it than I did. That felt good. It took me a while at VALK to realize how much I'd been missing by never being challenged by the product itself, by real users, real edge cases, real feedback over time.</p>
<p>And the client politics. That I don't miss at all. Redesigning a section because someone's director had a different opinion. Reverting to an earlier version a week after approval. There's a particular kind of exhaustion that comes from designing things you don't believe in, knowing the real reason they look that way has nothing to do with users.</p>
<h2 id="heading-what-changed-when-i-moved-to-product">What changed when I moved to product</h2>
<p>I joined VALK in November 2019. Asset tokenization for institutional investors, the kind of domain I knew almost nothing about. In my first month I was reading about private securities and permissioned blockchains in the evenings, not because anyone asked me to, but because I couldn't design interfaces for things I didn't understand.</p>
<p>That was the first shift. Agency work doesn't require you to become an expert in the domain. Product work absolutely does.</p>
<p>By the time VALK had scaled to seventy-plus financial institutions across fifteen countries, I understood the platform in a way that's hard to explain. I knew which compliance fields caused friction. I knew which flows our institutional users took shortcuts through because the documented path was too long. I knew what "tokenization" meant not as a marketing term but as an actual technical and legal process with very specific UX requirements.</p>
<p>You can't get that knowledge in six weeks. You can barely get it in six months.</p>
<p>The depth of product design compresses over time, not over sprints. The fourth year of working on something reveals problems you couldn't have seen in the first year, because those problems are created by the decisions you made in the first year.</p>
<h2 id="heading-ownership-changes-how-you-design">Ownership changes how you design</h2>
<p>At Spacecode I was responsible for the design. At VALK I'm responsible for the product experience.</p>
<p>Sounds like a small distinction. It isn't.</p>
<p>When you're the only designer on a product and you'll still be there six months after a feature ships, you make different decisions. You think about edge cases you'd normally cut for timeline because you know you'll be the one fixing them later. You document things properly because future-you will need that documentation. You push back harder on product decisions because when something ships wrong, there's nowhere to point except yourself.</p>
<p>The "not my problem" mindset that was almost structurally required at an agency, it genuinely doesn't exist in product. Everything is your problem. Which is harder, but also more honest about what design actually is.</p>
<p>I think about the features we built in 2020 that are still running, still being used by banks in multiple countries. The interactions I designed then are being experienced by someone right now. That's a different relationship with your work than handing off a file and writing a case study.</p>
<h2 id="heading-the-loneliness-is-real">The loneliness is real</h2>
<p>I don't want to make product design sound like a straightforward upgrade.</p>
<p>At Spacecode I had people to challenge my work every day. Someone to catch the thing I'd stopped seeing because I'd stared at it too long. Someone trying a completely different approach while I was heads-down on mine. Creative friction is real and it makes work better.</p>
<p>At VALK, that friction has to come from somewhere else. From developers who catch technical impossibilities. From the CEO when something doesn't match the product vision. From my own discipline to step back and question decisions I've already made. It's a skill you have to develop deliberately when working solo, the ability to challenge yourself.</p>
<p>Some days it's fine. Some days I'll spend a week going in circles on a problem that twenty minutes with another designer would have solved.</p>
<p>The repetition is also real. Four years on the same product, there are moments where the novelty is completely gone. I've redesigned sections of this platform two or three times. The onboarding flow I'm touching now is something I've touched before. You have to find different sources of interest when you know a product this well. It moves from "how does this industry work" to "why is this specific interaction still creating friction after all this time."</p>
<h2 id="heading-what-actually-transfers-and-what-doesnt">What actually transfers and what doesn't</h2>
<p>The speed of execution stayed. The ability to produce clean, considered work quickly, that's just muscle memory and it doesn't care whether you're on week two of a six-week sprint or month three of a product roadmap. The visual craft transferred. The ability to defend design decisions to non-designers transferred.</p>
<p>What didn't transfer: the way I thought about timelines.</p>
<p>My natural agency instinct was to think in terms of "done when delivered." That took real time to unlearn. Products don't have a delivery moment, they have a current state that will change. Every decision you make is technically provisional. That's a genuinely different mental model and I underestimated how long it would take me to internalize it.</p>
<p>The "make it look good" instinct also needed recalibrating. Not removing, visual quality matters enormously, especially in fintech where trust signals are tied to perceived polish. But at an agency, looking good <em>is</em> the deliverable. At a product company, looking good is in service of something working right. Related, but not the same thing.</p>
<h2 id="heading-what-i-actually-learned">What I actually learned</h2>
<p>Here's something I've been thinking about. I learned design at Spacecode. I became a designer at VALK.</p>
<p>That's not meant to diminish the agency years, they gave me a foundation I couldn't have built any other way. The speed, the breadth, the craft. But understanding what design is <em>for</em>, how it sits inside a living product that real users depend on, how your decisions compound over years, that I only learned by staying.</p>
<p>The version of me who joined VALK in 2019 thought of design in terms of screens and flows and handoffs. The version sitting in Los Angeles in 2023 thinks in terms of systems, tradeoffs, and user relationships that extend across time.</p>
<p>I don't know if that evolution was inevitable or if it required the specific circumstances, a single product, a small team, no other designer to defer to. Probably both. The constraints of being the only designer forced a kind of engagement with the product that might have been easier to avoid otherwise.</p>
<p>The question isn't "how do I make this screen work." It's "why is this problem appearing at this point in the user's experience and what does that tell us about the system."</p>
<p>That's the question I couldn't ask properly at an agency. There was never enough time and never enough continuity.</p>
<p>Would I go back? No. Not because agency work is bad, it was genuinely formative and I respect the designers who do it well. But I've seen what the other side looks like, and I want to keep designing things I'll still be accountable for a year from now.</p>
<p>That accountability is uncomfortable sometimes. It's also the most honest version of what this work actually is.</p>
<p><em>Originally published on kargaev.me. Imported to blog.deeflect.com archive.</em></p>
]]></content:encoded></item><item><title><![CDATA[Four years designing one product]]></title><description><![CDATA[Sometime last month I opened the VALK Figma file looking for a component I built in 2020. I needed to check how I'd handled a particular empty state, one…]]></description><link>https://deeflect.hashnode.dev/four-years-designing-one-product</link><guid isPermaLink="true">https://deeflect.hashnode.dev/four-years-designing-one-product</guid><dc:creator><![CDATA[deeflect]]></dc:creator><pubDate>Sun, 28 May 2023 12:00:00 GMT</pubDate><content:encoded><![CDATA[<p>Sometime last month I opened the VALK Figma file looking for a component I built in 2020. I needed to check how I'd handled a particular empty state, one of those obscure screens that appears when an investor has no active deals. I found it eventually, buried somewhere around frame 1,400. The page has thousands of frames now. I remember when it had forty.</p>
<p>That empty state? I'd designed it in three hours one afternoon in Alanya, Turkey, sitting at a rental apartment desk with a ceiling fan that made too much noise. A throwaway decision. Grey illustration, short line of copy, a button. Three years later it's still there, unchanged, shown to asset managers at seventy-something financial institutions. I stared at it for a few minutes and felt something I couldn't name exactly, not embarrassment, not pride. Something more complicated than either.</p>
<p>Four years. Same product. Same Figma file. Same codebase underneath everything I've drawn.</p>
<h2 id="heading-what-agency-work-taught-me-and-what-it-didnt">What agency work taught me (and what it didn't)</h2>
<p>Before VALK I spent two years at Spacecode, a Moscow agency. In that time I touched something like fifty-plus projects, banking apps, security dashboards, enterprise tools, consumer products. We'd sprint into a new domain every few weeks, learn enough to design something coherent, hand it off, move on. Every Monday felt like a new puzzle.</p>
<p>I got very fast at Spacecode. That's the main thing. Fast at reading a brief, fast at identifying the shape of a problem, fast at generating concepts. Speed was survival there. A week of slow output had real consequences; other projects were waiting, other clients were calling.</p>
<p>What the agency years couldn't teach me was depth. You can't develop depth in six weeks. You understand the surface of a problem, sometimes the layer below it, but you rarely get to the ground. You hand off your designs and you never find out if the empty state you designed in three hours becomes a permanent fixture that thousands of people see every year.</p>
<p>At VALK, I found out.</p>
<h2 id="heading-the-weight-of-accumulated-context">The weight of accumulated context</h2>
<p>The thing about staying with one product for four years is that you know it the way you know your own apartment. Where the awkward corner is. Which drawer sticks. Every workaround that got quietly institutionalized.</p>
<p>I know every edge case in the VALK platform, not from documentation, but from having created the edge cases, discovered them, patched them, or consciously decided to live with them. I know which design decisions were made under deadline pressure in 2020 that became load-bearing by 2021 when we scaled to dozens of institutions. I know which navigation pattern was "temporary" and is now four years old and woven into how every user expects to move through the product.</p>
<p>This kind of knowledge is genuinely useful. When someone proposes a change to the deal management flow, I can trace second and third-order effects almost automatically. I can say "if we move that action here, it creates a conflict with how compliance users approach the same screen from a different entry point", and I know this not because I ran a workshop, but because I lived through the version where it was different and watched what happened.</p>
<p>The weight of that context, though, is real. Every new design decision carries the shadow of every past one. Early on I could move quickly because I didn't know what I didn't know. Now I know too much. I know which assumptions are fragile. I know which constraints are genuinely immovable and which ones just feel that way because they've existed for two years. Making confident decisions has become harder, not easier.</p>
<p>I don't think most design writing is honest about this. There's an assumption that experience makes you faster and more decisive. It can. But with enough context, it can also make you slower, because you genuinely understand the complexity you used to move through without noticing it.</p>
<h2 id="heading-the-quick-fix-that-never-left">The "quick fix" that never left</h2>
<p>In early 2020, we had an urgent issue with how deal documents were displayed in the investor portal. The hierarchy was broken, the most important documents were getting lost. We had a release coming. I designed a fix in an afternoon, a card pattern with status indicators I'd never used in this product before, borrowed from something I'd built at Spacecode.</p>
<p>It worked. The release went out. Nobody complained.</p>
<p>By the end of 2020, that pattern had propagated into four other sections of the platform. By 2021, when financial institutions were onboarding rapidly, it was part of the visual language new users learned first. By 2022, it was referenced in our onboarding materials.</p>
<p>I never formally chose that pattern. I chose it under pressure on one specific afternoon, for one specific problem, in a city I'd only been in for a few months. It's now one of the most recognizable UI elements in a product used by banks and hedge funds across fifteen countries.</p>
<p>There's no such thing as a temporary decision in a living product. Whatever you ship becomes the baseline. The longer it survives, the more weight it carries, until removing it feels like surgery rather than editing.</p>
<h2 id="heading-the-loneliness-of-being-the-only-designer">The loneliness of being the only designer</h2>
<p>Something I rarely write about directly: in four years at VALK, I've been the only designer. No one to compare notes with, to catch my blind spots, to share the particular frustration of caring about UX in an organization full of people who care about other things.</p>
<p>At Spacecode there were other designers around. Not always on the same project, but present. You could ask someone to look at a flow. That kind of creative friction is valuable in ways that are hard to appreciate until it's absent.</p>
<p>At VALK, the product vision lives almost entirely in my head. Mostly that's fine, I've made peace with it, found ways to create useful friction through documentation, through forcing myself to write out rationale rather than just designing it. But there are moments, usually when I'm sitting with a difficult problem that has no clean answer, where I'd give a lot to have another designer in the room. Not to validate me. Just to think alongside.</p>
<p>The Figma file with its thousands of frames is a conversation I've been having with myself for four years. That's its own kind of loneliness.</p>
<h2 id="heading-patience-and-restraint-the-skills-i-didnt-know-i-needed">Patience and restraint, the skills I didn't know I needed</h2>
<p>Agency work rewards output. The artifact matters because the client is evaluating the artifact. The velocity is visible and measurable.</p>
<p>Product work rewards restraint. The best decisions I've made at VALK in the last two years are things I didn't do, flows I didn't redesign, patterns I didn't change, features I pushed back on. These don't show up in a portfolio. There's no frame in Figma that says "Dmitry resisted the urge to redesign this for the third time and the product was better for it."</p>
<p>When you're redesigning something that real users with real professional responsibilities depend on, the cost of disruption is higher than the cost of imperfection. You learn to sit with imperfect solutions while you gather enough evidence to justify changing them. You learn the difference between something that's wrong and something that just bothers you.</p>
<p>That second category is bigger than I expected.</p>
<p>Restraint is harder than it sounds. Especially when you've been looking at the same interface for four years and you can see every flaw. You know you could make it better, but "better" has to be weighed against the transition cost to people who've built workflows around the current version. That calculation doesn't exist in agency work. In agency work, better is always worth it, because nobody has a workflow yet.</p>
<h2 id="heading-when-variety-is-a-feature-not-a-distraction">When variety is a feature, not a distraction</h2>
<p>I'd be lying if I said I don't miss the agency rotation sometimes. The context-switching was exhausting but the variety was genuinely stimulating, every new project a new vocabulary to learn.</p>
<p>Here in Los Angeles, I sometimes catch myself scrolling through design work online and feeling something like nostalgia for problems I've never actually worked on. Healthcare UX. Education platforms. Tools for creative professionals. I've spent four years getting deeply fluent in one domain, private capital markets, asset tokenization, institutional finance. That fluency is real. But it's also a kind of narrowing.</p>
<p>Depth and variety pull in opposite directions. You can get both if you move between deep-product roles over time, but within a single job, the longer you stay, the more specialized you become. I know this product. I do not know what I would do with an unfamiliar problem the way I did in 2018. Some of that flexibility has been traded for expertise.</p>
<p>Whether that's worth it is a question I'm still working out.</p>
<h2 id="heading-what-four-years-actually-builds">What four years actually builds</h2>
<p>There's a kind of satisfaction in long-term product ownership that has no equivalent in agency work. When I watch a financial institution use a flow I designed two years ago, watch them navigate it efficiently, without friction, as if it's obvious, that's different from watching a client approve a prototype. The approval is gratifying. The actual sustained use is something else. Evidence that you built something real.</p>
<p>I've designed for people who have real professional stakes in the product working correctly. Not user-testing participants. People who depend on this software to manage actual capital. That responsibility has made me a more careful designer than any brief or deadline ever did.</p>
<p>Agency taught me speed. Product taught me discipline. I needed both, but I had to learn them separately, and I couldn't have told you that in advance.</p>
<h2 id="heading-a-question-i-keep-coming-back-to">A question I keep coming back to</h2>
<p>In the last few months I've started to notice a thought that keeps returning. Not anxiously, but persistently.</p>
<p>How many more years of this?</p>
<p>Not because I want to leave, I'm genuinely invested in what VALK is building. But four years is a long time with one product, and I find myself wondering when deep expertise tips into insularity. When does caring deeply about one product become a limitation on your growth as a designer?</p>
<p>Some designers spend a decade with a single product and produce extraordinary work. Others need the rotation to stay sharp. I'm still figuring out which kind I am, which feels like an odd thing to still be working out at four years in.</p>
<p>The Figma file keeps growing. The empty state from 2020 is still there, ceiling fan and all.</p>
<p><em>Originally published on kargaev.me. Imported to blog.deeflect.com archive.</em></p>
]]></content:encoded></item></channel></rss>