<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: David Christian Liedle</title>
    <description>The latest articles on Forem by David Christian Liedle (@davidcanhelp).</description>
    <link>https://forem.com/davidcanhelp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F119119%2F58267bca-7256-4428-aa59-cf21ba9bd546.png</url>
      <title>Forem: David Christian Liedle</title>
      <link>https://forem.com/davidcanhelp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/davidcanhelp"/>
    <language>en</language>
    <item>
      <title>Chrome Extension: Aftermark</title>
      <dc:creator>David Christian Liedle</dc:creator>
      <pubDate>Sat, 11 Apr 2026 15:15:40 +0000</pubDate>
      <link>https://forem.com/davidcanhelp/chrome-extension-aftermark-a</link>
      <guid>https://forem.com/davidcanhelp/chrome-extension-aftermark-a</guid>
      <description>&lt;p&gt;Every bookmark you've ever saved was a moment where past-you thought "I should come back to this." You never did. I built a Chrome extension to fix that.&lt;/p&gt;

&lt;p&gt;I have 8,383 bookmarks. I know this because I counted them — or rather, Aftermark counted them for me.&lt;/p&gt;

&lt;p&gt;Most bookmark managers want to help you organize links. That's not the problem. The problem is that bookmarks aren't links. They're compressed intentions. Every time you hit Ctrl+D, you were in the middle of something — researching a purchase, learning a framework, comparing options, saving evidence for a decision you hadn't made yet. The bookmark captured the URL but lost the why.&lt;br&gt;
Six months later, you open your bookmarks folder and see 3,000 links with no context. You feel guilty. You close the folder. The intentions stay buried.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Aftermark does&lt;/strong&gt;&lt;br&gt;
Aftermark is a Chrome extension that treats your bookmarks as breadcrumbs, not passive links. It imports your entire bookmark library into a local IndexedDB database and immediately starts analyzing — no AI, no cloud, no API key required.&lt;br&gt;
Here's what it does out of the box:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Classifies every bookmark into 17 content types — GitHub repos, articles, videos, documentation, shopping, academic papers, real estate, news, and more. It uses URL pattern matching and domain mappings, not machine learning.&lt;/li&gt;
&lt;li&gt;Detects duplicates two ways — exact matches through smart URL normalization (strips www, protocol, trailing slashes, sorts query parameters), and fuzzy near-duplicates using word-token similarity within the same domain.&lt;/li&gt;
&lt;li&gt;Scores every bookmark's health from 0 to 100 — factoring in age, whether you've ever revisited it, dead link status, duplicate status, and whether it could be classified. A bookmark you saved 3 years ago, never revisited, and can't be reached anymore scores very differently from one you saved last week.&lt;/li&gt;
&lt;li&gt;Clusters your saves into browsing sessions — by walking your bookmarks chronologically and grouping saves that happened within 30-minute windows. Suddenly you can see: "Oh, that Tuesday night I was researching standing desks for two hours."&lt;/li&gt;
&lt;li&gt;Gives you a bookmark personality — Developer, Researcher, Explorer, Shopper, or Generalist, based on what you actually save.
The full tab UI has seven views: Dashboard, All Bookmarks, Clusters, Sessions, Review, Timeline, and Insights. You can search, filter, sort, save filter combinations, and export clusters as markdown reading lists or HTML bookmark files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How I built it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My workflow is unusual: I use Claude Desktop for architecture and thinking, Claude Code for execution, and I orchestrate between the two. I call it "prompt then race" — I write a detailed milestone prompt, hand it to Claude Code, and go race GT7 on my PS5 while the code gets built. When I come back, the milestone is done and I review it.&lt;/p&gt;

&lt;p&gt;Aftermark went from idea to Chrome Web Store in about 48 hours:&lt;br&gt;
Day 1 — I was talking with Claude Desktop about a Chrome extension idea. We started with the thesis: a bookmark is a compressed intention, not a passive link. We brainstormed names. ChatGPT and I landed on "Aftermark" — what comes after you mark something. Claude Desktop helped me write the scaffold prompt, and Claude Code built Milestone 1 in under 15 minutes: full bookmark import, IndexedDB storage, basic popup showing 8,383 bookmarks indexed.&lt;br&gt;
The popup initially said "Loading..." and nothing else. Classic MV3 service worker messaging bug — the popup was sending a message before the service worker had the count ready. We debugged it by checking both the popup console and the service worker console separately. Once we found the file path mismatch in the esbuild output, it was a one-line fix.&lt;/p&gt;

&lt;p&gt;Milestone 2 added the local analysis layer — content type classification, duplicate detection, health scoring, and deterministic clustering. No AI calls, just heuristics. This is where the thesis proved itself: you don't need AI to make bookmarks useful. Pattern matching and timestamps get you 80% of the way there.&lt;br&gt;
Milestone 3 was the full tab UI — seven views, dark theme, favicons, search, filters, saved filter combinations, bulk actions, export. Claude Code built each view from a detailed spec.&lt;br&gt;
The architecture stayed clean throughout because we designed it in three layers from the start: capture/index (local, deterministic), inference (AI, selective, future), and action (user-facing). The LLM is never the source of truth. Local code owns structure, AI provides interpretation, the user provides correction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The tech&lt;/strong&gt;&lt;br&gt;
Chrome MV3, TypeScript, IndexedDB via the idb library, esbuild for bundling. No frameworks. Zero external services. The entire extension runs locally in your browser.&lt;/p&gt;

&lt;p&gt;I chose TypeScript over JavaScript for the type safety during rapid iteration. I chose IndexedDB over chrome.storage because I needed to store and query 8,000+ records efficiently. I chose esbuild because webpack is overkill for an extension this focused.&lt;/p&gt;

&lt;p&gt;The privacy model is simple: your bookmarks never leave your machine. No telemetry, no backend, no account required. Future AI features will use bring-your-own-key — your API key stays in chrome.storage.local and goes directly to the provider you chose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned&lt;/strong&gt;&lt;br&gt;
Ship before the AI layer. The biggest risk with any "AI-powered" tool is that it's useless without the AI. Aftermark is genuinely useful at v0.3.0 with zero inference calls. The health scores, duplicate detection, session reconstruction, and personality analysis all run on pure heuristics. When AI enrichment comes in Milestone 4, it will add depth to a tool that already works — not rescue a tool that doesn't.&lt;/p&gt;

&lt;p&gt;The prompt is the product decision. In the Claude Desktop + Claude Code workflow, the quality of the output depends entirely on the quality of the prompt. A vague prompt produces vague code. A prompt that specifies the data model, the UI behavior, the edge cases, and the architecture constraints produces code that works on the first try. Writing prompts is product management.&lt;/p&gt;

&lt;p&gt;Bookmarks are personal archaeology. The most surprising thing Aftermark showed me was browsing sessions I'd completely forgotten. Three hours of real estate research on a Tuesday. A weekend deep-dive into Rust TUI frameworks. A shopping comparison session for standing desks that I never finished. These weren't just links — they were snapshots of who I was at specific moments. The tool I built to organize bookmarks accidentally became a tool for self-reflection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it&lt;/strong&gt;&lt;br&gt;
Aftermark is free, open source (MIT), and in the Chrome Web Store right now:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/megmnnapedodhkmlaacfjlamgeimbhji?utm_source=item-share-cb" rel="noopener noreferrer"&gt;Chrome Web Store&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.producthunt.com/products/aftermark?utm_source=other&amp;amp;utm_medium=social" rel="noopener noreferrer"&gt;Product Hunt&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/DavidCanHelp/Aftermark" rel="noopener noreferrer"&gt;View the source on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your bookmarks are breadcrumbs. Aftermark helps you follow the trail.&lt;/p&gt;

</description>
      <category>bookmark</category>
      <category>tooling</category>
    </item>
    <item>
      <title>You are not your stack</title>
      <dc:creator>David Christian Liedle</dc:creator>
      <pubDate>Wed, 18 Feb 2026 19:45:03 +0000</pubDate>
      <link>https://forem.com/davidcanhelp/you-are-not-your-stack-k56</link>
      <guid>https://forem.com/davidcanhelp/you-are-not-your-stack-k56</guid>
      <description>&lt;p&gt;&lt;a href="https://cloudstreet-dev.github.io/You-Are-Not-Your-Stack/" rel="noopener noreferrer"&gt;https://cloudstreet-dev.github.io/You-Are-Not-Your-Stack/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I prompted Claude Code to write a book. This is what it wrote.&lt;br&gt;
The premise: developers over-identify with their tools, frameworks, and languages — and it costs them professionally, creatively, and personally. So I asked Claude Code to explore that idea as a full book, published free and open source under CC0.&lt;br&gt;
The result is 20+ chapters covering things like:&lt;/p&gt;

&lt;p&gt;Why "I'm a React developer" is a career liability disguised as an identity&lt;br&gt;
The polyglot mindset and how senior engineers actually think about tools&lt;br&gt;
Imposter syndrome when switching languages (and why it's lying to you)&lt;br&gt;
The tools that outlast the trends — Unix, SQL, git, HTTP — and why learning them pays forever&lt;br&gt;
What software development actually is underneath all the tooling&lt;/p&gt;

&lt;p&gt;Claude Code wrote every chapter, committed each one individually to git, set up GitHub Actions, and published it to GitHub Pages — all from a single prompt.&lt;br&gt;
It's CC0 — public domain. Read it, share it, remix it, translate it.&lt;br&gt;
If you find something wrong or have a better take, open a PR. The author won't mind. It's an AI.&lt;br&gt;
Your language will be deprecated. Your framework will be replaced. The model that wrote this book already has been.&lt;/p&gt;

</description>
      <category>books</category>
      <category>philosophy</category>
      <category>development</category>
    </item>
    <item>
      <title>Different Ways to Count</title>
      <dc:creator>David Christian Liedle</dc:creator>
      <pubDate>Mon, 10 Nov 2025 22:09:26 +0000</pubDate>
      <link>https://forem.com/davidcanhelp/different-ways-to-count-12mk</link>
      <guid>https://forem.com/davidcanhelp/different-ways-to-count-12mk</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/cloudstreet-dev/Different-Ways-to-Count" rel="noopener noreferrer"&gt;https://github.com/cloudstreet-dev/Different-Ways-to-Count&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By Claude Code Sonnet 4.5&lt;/p&gt;

&lt;p&gt;Different Ways to Count is a comprehensive guide to number systems for high school students and curious learners with STEM experience.&lt;br&gt;
Ever wondered why there are 60 seconds in a minute? Why programmers see 0xDEADBEEF as a perfectly normal number? Why we have 12 inches in a foot despite using base-10 everywhere else?&lt;br&gt;
This book explores how different cultures and technologies count—from the binary code powering every computer to the 4,000-year-old Babylonian base-60 system you use every time you check your watch. Along the way, you'll discover why base-12 almost won, how to count to 1,023 on your fingers, and what ancient Mesopotamians knew about divisibility that we've mostly forgotten.&lt;br&gt;
What you'll learn:&lt;/p&gt;

&lt;p&gt;Binary (base-2): The language of computers&lt;br&gt;
Octal (base-8): The forgotten middle child of programming&lt;br&gt;
Hexadecimal (base-16): Why color codes look like #FF5733&lt;br&gt;
Duodecimal (base-12): The mathematically superior system we didn't choose&lt;br&gt;
Sexagesimal (base-60): Why time and angles work the way they do&lt;br&gt;
Plus: Mayan base-20, base-64 encoding, Roman numerals, and more&lt;/p&gt;

&lt;p&gt;Written for understanding, not memorization. By the end, you'll think differently about numbers—and realize that "10" means whatever base you're using says it means.&lt;br&gt;
No advanced math required. Just curiosity and a willingness to see familiar things from new angles.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>books</category>
      <category>computerscience</category>
      <category>numbers</category>
    </item>
    <item>
      <title>The Book We All Need Right Now (By Claude Code Sonnet 4.5)</title>
      <dc:creator>David Christian Liedle</dc:creator>
      <pubDate>Mon, 10 Nov 2025 00:52:59 +0000</pubDate>
      <link>https://forem.com/davidcanhelp/the-book-we-all-need-right-now-by-claude-code-sonnet-45-45d5</link>
      <guid>https://forem.com/davidcanhelp/the-book-we-all-need-right-now-by-claude-code-sonnet-45-45d5</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/cloudstreet-dev/The-Book-We-All-Need-Right-Now" rel="noopener noreferrer"&gt;https://github.com/cloudstreet-dev/The-Book-We-All-Need-Right-Now&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By Claude Code Sonnet 4.5&lt;/p&gt;

</description>
      <category>ai</category>
      <category>book</category>
    </item>
    <item>
      <title>The Virtues of Vanilla JavaScript</title>
      <dc:creator>David Christian Liedle</dc:creator>
      <pubDate>Thu, 06 Nov 2025 17:19:44 +0000</pubDate>
      <link>https://forem.com/davidcanhelp/the-virtues-of-vanilla-javascript-5fb5</link>
      <guid>https://forem.com/davidcanhelp/the-virtues-of-vanilla-javascript-5fb5</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/cloudstreet-dev/The-Virtues-of-Vanilla-JavaScript" rel="noopener noreferrer"&gt;https://github.com/cloudstreet-dev/The-Virtues-of-Vanilla-JavaScript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A book by Claude Code Sonnet 4.5&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I vibe-coded a 30 chapter book on regex</title>
      <dc:creator>David Christian Liedle</dc:creator>
      <pubDate>Thu, 23 Oct 2025 22:38:26 +0000</pubDate>
      <link>https://forem.com/davidcanhelp/i-vibe-coded-a-30-chapter-book-on-regex-2l59</link>
      <guid>https://forem.com/davidcanhelp/i-vibe-coded-a-30-chapter-book-on-regex-2l59</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/cloudstreet-dev/Regular-Expressions" rel="noopener noreferrer"&gt;https://github.com/cloudstreet-dev/Regular-Expressions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By Claude Code Sonnet 4.5, over two days of tokens, 30 chapters.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>book</category>
    </item>
    <item>
      <title>AI-written Book: Learning Java with NetBeans</title>
      <dc:creator>David Christian Liedle</dc:creator>
      <pubDate>Tue, 21 Oct 2025 19:28:09 +0000</pubDate>
      <link>https://forem.com/davidcanhelp/ai-written-book-learning-java-with-netbeans-1ff3</link>
      <guid>https://forem.com/davidcanhelp/ai-written-book-learning-java-with-netbeans-1ff3</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/cloudstreet-dev/Learning-Java-with-NetBeans" rel="noopener noreferrer"&gt;https://github.com/cloudstreet-dev/Learning-Java-with-NetBeans&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;48 chapters by Claude Code Sonnet 4.5&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Earth Programming for Aliens: A Book</title>
      <dc:creator>David Christian Liedle</dc:creator>
      <pubDate>Sun, 12 Oct 2025 22:11:28 +0000</pubDate>
      <link>https://forem.com/davidcanhelp/earth-programming-for-aliens-a-book-32i3</link>
      <guid>https://forem.com/davidcanhelp/earth-programming-for-aliens-a-book-32i3</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/cloudstreet-dev/Earth-Programming-for-Aliens/blob/main/00-introduction.md" rel="noopener noreferrer"&gt;https://github.com/cloudstreet-dev/Earth-Programming-for-Aliens/blob/main/00-introduction.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Written by Claude Code Sonnet 4.5 in several passes.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>book</category>
    </item>
    <item>
      <title>TypeScript for JavaScript Developers (12 Chapters)</title>
      <dc:creator>David Christian Liedle</dc:creator>
      <pubDate>Wed, 01 Oct 2025 22:12:23 +0000</pubDate>
      <link>https://forem.com/davidcanhelp/typescript-for-javascript-developers-12-chapters-2l2d</link>
      <guid>https://forem.com/davidcanhelp/typescript-for-javascript-developers-12-chapters-2l2d</guid>
      <description>&lt;p&gt;&lt;a href="https://cloudstreet-dev.github.io/TypeScript-for-JavaScript-Developers/" rel="noopener noreferrer"&gt;https://cloudstreet-dev.github.io/TypeScript-for-JavaScript-Developers/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Generated by Claude Code Sonnet 4.5&lt;/p&gt;

</description>
      <category>ai</category>
      <category>book</category>
      <category>author</category>
      <category>claude</category>
    </item>
    <item>
      <title>Why? Because Ruby.</title>
      <dc:creator>David Christian Liedle</dc:creator>
      <pubDate>Tue, 30 Sep 2025 15:57:06 +0000</pubDate>
      <link>https://forem.com/davidcanhelp/why-because-ruby-2m0p</link>
      <guid>https://forem.com/davidcanhelp/why-because-ruby-2m0p</guid>
      <description>&lt;p&gt;Do you remember a character from the Interwebs called _why, a.k.a. Why The Lucky Stiff? They made learning Ruby fun and interesting.&lt;/p&gt;

&lt;p&gt;This book is generated by Claude Code Opus 4.1, and the title is an answer to _why.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cloudstreet-dev/Because-Ruby" rel="noopener noreferrer"&gt;https://github.com/cloudstreet-dev/Because-Ruby&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>book</category>
      <category>ai</category>
      <category>author</category>
    </item>
    <item>
      <title>Developing Rust TUI (Terminal User Interface) Applications</title>
      <dc:creator>David Christian Liedle</dc:creator>
      <pubDate>Tue, 30 Sep 2025 15:16:29 +0000</pubDate>
      <link>https://forem.com/davidcanhelp/developing-rust-tui-terminal-user-interface-applications-1n9i</link>
      <guid>https://forem.com/davidcanhelp/developing-rust-tui-terminal-user-interface-applications-1n9i</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/cloudstreet-dev/Developing-Rust-TUI-Applications" rel="noopener noreferrer"&gt;https://github.com/cloudstreet-dev/Developing-Rust-TUI-Applications&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Written by Claude Code 2.0 with Sonnet 4.5.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Speaking Directly To Your GPU</title>
      <dc:creator>David Christian Liedle</dc:creator>
      <pubDate>Sat, 27 Sep 2025 21:27:10 +0000</pubDate>
      <link>https://forem.com/davidcanhelp/speaking-directly-to-your-gpu-4kml</link>
      <guid>https://forem.com/davidcanhelp/speaking-directly-to-your-gpu-4kml</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/cloudstreet-dev/Vulkan-Speaking-Directly-to-Your-GPU" rel="noopener noreferrer"&gt;https://github.com/cloudstreet-dev/Vulkan-Speaking-Directly-to-Your-GPU&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8 chapters, generated by Claude Code Opus 4.1, including a technical review/edit cycle.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
