<?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>DEV Community: Andrew Detwiler</title>
    <description>The latest articles on DEV Community by Andrew Detwiler (@adetwiler).</description>
    <link>https://dev.to/adetwiler</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3922665%2Ffdf60ec6-b193-4000-bb7c-16ba8695faa6.jpg</url>
      <title>DEV Community: Andrew Detwiler</title>
      <link>https://dev.to/adetwiler</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adetwiler"/>
    <language>en</language>
    <item>
      <title>Build With a Memory Is Now a Public Repo</title>
      <dc:creator>Andrew Detwiler</dc:creator>
      <pubDate>Fri, 24 Jul 2026 14:04:01 +0000</pubDate>
      <link>https://dev.to/adetwiler/build-with-a-memory-is-now-a-public-repo-1ncf</link>
      <guid>https://dev.to/adetwiler/build-with-a-memory-is-now-a-public-repo-1ncf</guid>
      <description>&lt;p&gt;I wrote about &lt;a href="https://andrewdetwiler.com/blog/give-the-agent-a-memory" rel="noopener noreferrer"&gt;giving the agent a memory before you give it a task&lt;/a&gt;. That post was the what. This is the how.&lt;/p&gt;

&lt;p&gt;The whole method is now public: &lt;a href="https://buildwithamemory.com/?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=project-memory&amp;amp;utm_content=build-with-a-memory-is-public" rel="noopener noreferrer"&gt;buildwithamemory.com&lt;/a&gt;, backed by a repo you can read, copy, and argue with at &lt;a href="https://github.com/adetwiler/build-with-a-memory" rel="noopener noreferrer"&gt;github.com/adetwiler/build-with-a-memory&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's actually in it
&lt;/h2&gt;

&lt;p&gt;Ten short method docs. Copyable templates. A one-paste prompt that sets a project up from zero. All plain markdown.&lt;/p&gt;

&lt;p&gt;There is nothing to install and nothing to sign up for. That's deliberate. Your project's context should live in your repo, as files you own, next to the code it describes. Not in somebody's hosted memory product. I would rather show you the method and have you keep the files than sell you a subscription to your own context.&lt;/p&gt;

&lt;p&gt;It works with whatever agent you use. The files are just markdown; any tool that can read your repo can read them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I'd start with
&lt;/h2&gt;

&lt;p&gt;If you only take one thing, take the decision records.&lt;/p&gt;

&lt;p&gt;When you make a real decision, write one small file: what you decided, and why. The why is the part you forget first.&lt;/p&gt;

&lt;p&gt;Here's what that buys you. Normally, review cost grows with a project. More code, more history, more "wait, why is it like this?" With decision records, it inverts. The agent reads the decision once and stops re-litigating it. Every session after that is cheaper than the last. Two months in, my reviews got faster, not slower.&lt;/p&gt;

&lt;p&gt;That inversion is the whole reason the rest of the method pays off.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it won't do
&lt;/h2&gt;

&lt;p&gt;Honestly, it's not magic. The agent still gets things wrong. The files go stale if you stop tending them. And a pile of docs nobody maintains is worse than one page that's true. The method is mostly discipline: write the decision down when you make it, write the gotcha down when it bites you, keep the always-loaded page short.&lt;/p&gt;

&lt;p&gt;I'm still figuring out parts of it. The repo says so where that's true.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this came from
&lt;/h2&gt;

&lt;p&gt;I didn't sit down to design a method. It fell out of building real things: my games, and Playloop, the playtest-insights tool I'm building for indie devs. Every gotcha in those repos taught me something about what an agent needs written down. The private projects keep their private files. The method is what generalizes.&lt;/p&gt;

&lt;p&gt;If you want to follow along as it grows, I write &lt;a href="https://buildwithamemory.com/?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=project-memory&amp;amp;utm_content=build-with-a-memory-is-public" rel="noopener noreferrer"&gt;a short letter when there's something worth saying&lt;/a&gt;. And if the playtesting side of this sounds like your problem too, &lt;a href="https://playloop.gg/?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=project-memory&amp;amp;utm_content=build-with-a-memory-is-public" rel="noopener noreferrer"&gt;Playloop&lt;/a&gt; is coming later this year and has a waitlist.&lt;/p&gt;

&lt;p&gt;But mostly: go take the files. That's what they're for. If you try this on a real project and something doesn't hold up, tell me. The method got better every time something broke, and I don't expect that to stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Credits
&lt;/h2&gt;

&lt;p&gt;Not all of this is mine. The mindset shift came from a talk by &lt;a href="https://www.aihero.dev" rel="noopener noreferrer"&gt;Matt Pocock&lt;/a&gt;, and the grilling pillar adapts his grill-with-docs skill. The repo names every borrowed idea in &lt;a href="https://github.com/adetwiler/build-with-a-memory/blob/main/CREDITS.md" rel="noopener noreferrer"&gt;CREDITS.md&lt;/a&gt;. If I borrowed something without naming it, tell me and I will fix it there.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>github</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>How I Built a Local Memory Network for My AI Agents</title>
      <dc:creator>Andrew Detwiler</dc:creator>
      <pubDate>Thu, 23 Jul 2026 21:27:24 +0000</pubDate>
      <link>https://dev.to/adetwiler/how-i-built-a-local-memory-network-for-my-ai-agents-2eca</link>
      <guid>https://dev.to/adetwiler/how-i-built-a-local-memory-network-for-my-ai-agents-2eca</guid>
      <description>&lt;p&gt;Your AI agent forgets everything between sessions. So it re-derives the same&lt;br&gt;
decisions, and you pay for it every time.&lt;/p&gt;

&lt;p&gt;I got tired of paying. Tired of re-explaining the same project every morning,&lt;br&gt;
watching the agent rediscover a gotcha I hit three weeks ago, re-litigating a&lt;br&gt;
decision I already made.&lt;/p&gt;

&lt;p&gt;So I stopped relying on the agent's memory and built the memory into the&lt;br&gt;
projects themselves.&lt;/p&gt;

&lt;p&gt;I've been running this system across everything I build for months now: a&lt;br&gt;
SaaS, a couple of games, personal tools. This post is the full internals. How&lt;br&gt;
the files are structured, how they link to each other, and how the whole thing&lt;br&gt;
became searchable in about 0.2 seconds without a single byte leaving my&lt;br&gt;
machine.&lt;/p&gt;
&lt;h2&gt;
  
  
  The whole idea in one sentence
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The repository itself is the memory.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every durable fact gets written to exactly one file, committed where the work&lt;br&gt;
happens. Decisions, conventions, gotchas, what I'm working on right now. A&lt;br&gt;
fresh agent session doesn't recall any of it. It &lt;em&gt;reads&lt;/em&gt; it.&lt;/p&gt;

&lt;p&gt;That sounds obvious. Maybe it is. But the difference between "we have some&lt;br&gt;
docs" and "the repo is the memory" comes down to three things most doc folders&lt;br&gt;
never get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;map&lt;/strong&gt;, so an agent can find the one file it needs without scanning the tree&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Links&lt;/strong&gt;, so facts have one home and everything else points at it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search&lt;/strong&gt;, for when you don't know which file to open&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me walk through each layer.&lt;/p&gt;
&lt;h2&gt;
  
  
  The part I didn't plan
&lt;/h2&gt;

&lt;p&gt;I built this to stop coding agents from forgetting technical context. But once&lt;br&gt;
the network held decisions, current work, past mistakes, meeting notes, and my&lt;br&gt;
own writing preferences, it turned out to be useful outside the code.&lt;/p&gt;

&lt;p&gt;It now drafts my documentation, release notes, blog posts, and social posts&lt;br&gt;
from the actual history of the work. I review, correct, and approve&lt;br&gt;
everything, but I no longer have to reconstruct what happened before I can&lt;br&gt;
explain it. This post was drafted from the same network it describes, and the&lt;br&gt;
site it lives on is updated through that system too.&lt;/p&gt;
&lt;h2&gt;
  
  
  The shape: three tiers
&lt;/h2&gt;

&lt;p&gt;Not everything belongs in a repo. A convention about how I write tests belongs&lt;br&gt;
in that project. A rule about how I write emails belongs everywhere. My own&lt;br&gt;
working-style preferences belong to me, not to the codebase.&lt;/p&gt;

&lt;p&gt;So the network has three tiers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwnj923zgiv0wwz9m65aj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwnj923zgiv0wwz9m65aj.png" alt="Diagram of three stacked tiers: repo networks committed with the code, wide memory for cross-project facts, and personal per-project memory" width="800" height="649"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fig 1. One home per fact. A top-level index file maps all the networks so any session can locate the right one.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The routing rule is the load-bearing part. The first time a rule shows up&lt;br&gt;
that's wider than the current project, it moves up a tier immediately, in the&lt;br&gt;
same session. Otherwise you end up with four copies that slowly drift apart,&lt;br&gt;
and then you can't trust any of them.&lt;/p&gt;
&lt;h2&gt;
  
  
  Inside a repo network
&lt;/h2&gt;

&lt;p&gt;Here's the anatomy of a single repo's memory, using my biggest project as the&lt;br&gt;
example.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0zspd0b9sflyyrbtl5ve.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0zspd0b9sflyyrbtl5ve.png" alt="Diagram of one repo's read path: an always-loaded CLAUDE.md at the top, a context map below it, and four lazy-loaded doc types underneath: topic docs, ADRs, OPEN.md, and living notes" width="800" height="567"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fig 2. The read path of a fresh agent session. The always-loaded file stays lean on purpose; everything heavy is lazy-loaded through the map.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The always-loaded manual holds only the rules that prevent damage. Everything&lt;br&gt;
else is behind the map, and the map entry for each file includes one line&lt;br&gt;
saying &lt;em&gt;when&lt;/em&gt; to read it. That's what keeps the token cost sane. The agent&lt;br&gt;
doesn't front-load forty documents. It locates, then opens one.&lt;/p&gt;

&lt;p&gt;That sounds wrong if you're used to "more context is better." But every file&lt;br&gt;
the agent loads costs tokens, and most of them wouldn't have changed the&lt;br&gt;
answer.&lt;/p&gt;
&lt;h2&gt;
  
  
  How it all links together
&lt;/h2&gt;

&lt;p&gt;Three kinds of links hold the network together, and none of them are clever.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Wikilinks between notes
&lt;/h3&gt;

&lt;p&gt;Every memory note is one fact in one file, with a little frontmatter and a&lt;br&gt;
slug. Other notes reference it with &lt;code&gt;[[that-slug]]&lt;/code&gt;. A link to a note that&lt;br&gt;
doesn't exist yet is allowed on purpose. It's a marker that something is worth&lt;br&gt;
writing, not an error.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;verify-before-you-report&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Never&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;claim&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;you&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;didn't&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;read&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;from&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;tool&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;this&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;turn"&lt;/span&gt;
&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;feedback&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

Confirm the exit code, re-run the check on the committed tree, then say it.
Related: [[done-means-verified]], [[never-invent-a-sha]]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Index files as hubs
&lt;/h3&gt;

&lt;p&gt;Every tier has a small index: one line per note with a pointer. The indexes&lt;br&gt;
are what get loaded into context; the notes are what get opened on demand.&lt;br&gt;
Same shape at every level, from a single repo's context map up to the&lt;br&gt;
top-level file that maps all the networks on the machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. A health check that keeps the graph honest
&lt;/h3&gt;

&lt;p&gt;Links rot. So a script runs at session start and reports three numbers:&lt;br&gt;
dangling links (a &lt;code&gt;[[slug]]&lt;/code&gt; pointing at nothing), orphans (notes no index&lt;br&gt;
points to), and missing file links. This morning it reported 0 dangling and 8&lt;br&gt;
orphans. Those orphans are real debt, but now I can see it instead of finding&lt;br&gt;
out later.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhs5h0g5t14e98yg7kdik.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhs5h0g5t14e98yg7kdik.png" alt="A network graph of notes: a few large hub nodes with many connections, many small leaf nodes, and one disconnected orphan node drawn with a dashed outline" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fig 3. I also generate an actual interactive version of this from the real files: a small script walks the folder, parses the wikilinks, and emits a self-contained force-graph HTML page. Zero dependencies, nothing hosted.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The pattern underneath all three: &lt;strong&gt;one home, many pointers.&lt;/strong&gt; A fact lives in&lt;br&gt;
one file. Everything else links to it and never copies it. Two copies of the&lt;br&gt;
same fact will disagree eventually, and then your memory is lying to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it's searchable (without sending anything anywhere)
&lt;/h2&gt;

&lt;p&gt;Links work when you know roughly where something lives. Search is for when&lt;br&gt;
you don't.&lt;/p&gt;

&lt;p&gt;The search layer is one SQLite file, built by a small indexer that walks the&lt;br&gt;
whole network: wide memory, every project's notes, and the docs folders of the&lt;br&gt;
repos I care about. It chunks each file into pieces of about 220 words,&lt;br&gt;
respecting markdown sections, and indexes every chunk two ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keyword (BM25 via SQLite's FTS5).&lt;/strong&gt; Catches exact rare tokens: an env var
name, a commit SHA, a number like 0.62. Embeddings genuinely miss these.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic (local embeddings via Ollama).&lt;/strong&gt; Catches paraphrase, so a query
about "pricing" finds the note that says "monetization." Nothing leaves the
machine, which matters because this corpus holds financials and unreleased
work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At query time, both searches run and the results get merged by &lt;strong&gt;Reciprocal&lt;br&gt;
Rank Fusion&lt;/strong&gt;. Not by mixing scores. A BM25 score and a cosine similarity&lt;br&gt;
aren't on the same scale, so you fuse by rank instead, and it needs no tuning.&lt;br&gt;
Answers come back in about 0.2 seconds over roughly eight thousand chunks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxtxky4qg5p5bh73rr2qe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxtxky4qg5p5bh73rr2qe.png" alt="Flow diagram: a query splits into a keyword BM25 branch and a semantic local-embeddings branch, both feed rank fusion, which returns top chunks pointing to one file" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fig 4. If the local embedding model isn't running, it falls back to keyword-only instead of failing. The search has to always answer something, or I'd stop reaching for it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Two design choices here matter more than the retrieval math.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The index is disposable.&lt;/strong&gt; Markdown is the source of truth. The database is&lt;br&gt;
derived from it, and I can delete it and rebuild from scratch in about a&lt;br&gt;
minute. There's no product sitting between me and my own notes, and nothing to&lt;br&gt;
migrate away from later. The notes are still just files on my machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Indexing is incremental by content hash.&lt;/strong&gt; A run with no edits is a no-op&lt;br&gt;
that takes milliseconds. That's what makes it cheap enough to just always be&lt;br&gt;
current.&lt;/p&gt;

&lt;p&gt;The agent gets this as a one-line query tool, and the standing rule is to&lt;br&gt;
orient first: before any real task, ask the network what's in flight on that&lt;br&gt;
topic. The answer is either "here's the context" or "nothing relevant," and&lt;br&gt;
both are useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  The habits that keep it alive
&lt;/h2&gt;

&lt;p&gt;Honestly, this is the part that decides whether the whole thing works. The&lt;br&gt;
files and the search are just plumbing. What actually kills a system like this&lt;br&gt;
is nobody writing anything down.&lt;/p&gt;

&lt;p&gt;Three habits, and the mechanisms that enforce them:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capture in the same pass.&lt;/strong&gt; When a decision gets made or a gotcha gets hit,&lt;br&gt;
it goes to its one home in that same session. Not a follow-up chore, part of&lt;br&gt;
"done." The agent does the writing; my job is to not skip it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hooks that surface memory instead of trusting recall.&lt;/strong&gt; A session-start hook&lt;br&gt;
prints the open items and the current focus before any work begins. Another&lt;br&gt;
hook fires right before a long conversation gets compacted and re-surfaces the&lt;br&gt;
capture rules, because compaction is exactly the moment a learning would&lt;br&gt;
otherwise be summarized away.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One-word verbs for the expensive moments.&lt;/strong&gt; Ending a session well used to&lt;br&gt;
mean writing a handoff by hand, so I mostly didn't. The data made that&lt;br&gt;
embarrassing to look at:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffdwla5q5s4bo15mbaov6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffdwla5q5s4bo15mbaov6.png" alt="Bar chart of session endings: compacted the session to keep going 106 times, cleared and started fresh 65 times, wrote an actual handoff 4 times" width="800" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fig 5. 171 session endings, 4 handoffs. I was stretching sessions instead of ending them, because ending them well was work.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The fix was to make the whole close-out cost one word. I type &lt;code&gt;handoff&lt;/code&gt; and&lt;br&gt;
the agent writes the summary, files the open questions, sweeps for uncaptured&lt;br&gt;
gotchas, and stores it where the next session's hook will surface it. I type&lt;br&gt;
&lt;code&gt;pick up&lt;/code&gt; and the next session starts exactly where the last one stopped. Same&lt;br&gt;
idea for &lt;code&gt;idea&lt;/code&gt; (log a passing thought without derailing the session) and&lt;br&gt;
&lt;code&gt;queue&lt;/code&gt; (one canonical answer to "what's first today," computed by a script&lt;br&gt;
instead of vibes).&lt;/p&gt;

&lt;p&gt;One word removes the friction. The friction was the whole problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;p&gt;It isn't a hosted product or a service I'm asking you to buy. It's also not&lt;br&gt;
magic memory for the AI. The agent still forgets everything between sessions. The system&lt;br&gt;
just makes forgetting cheap, because everything worth knowing is written down&lt;br&gt;
where the next session will look.&lt;/p&gt;

&lt;p&gt;And the AI doesn't get this right on its own. It captures the wrong things,&lt;br&gt;
files duplicates, and lets links rot, unless the rules are written down and&lt;br&gt;
enforced by the same network it maintains. The judgment stays with me. The&lt;br&gt;
system just means I only have to make each call once.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you want to start
&lt;/h2&gt;

&lt;p&gt;You don't need the search index or the graph or the hooks on day one. I didn't&lt;br&gt;
have them either. The minimum that pays for itself immediately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One short always-loaded file: what the project is, how to run it, the rules that matter&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/now.md&lt;/code&gt;: what's active right now, a few dated lines&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/decisions.md&lt;/code&gt;: one dated entry per real decision, with the why&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/notes.md&lt;/code&gt;: gotchas worth not hitting twice&lt;/li&gt;
&lt;li&gt;The habit: write it down in the same session it happens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything else in this post grew out of that seed, one annoyance at a time.&lt;br&gt;
The linking showed up when facts started needing two homes. The search showed&lt;br&gt;
up when I couldn't remember which file held a decision. The verbs showed up&lt;br&gt;
when I noticed I was avoiding my own system because it cost too much to use.&lt;/p&gt;

&lt;p&gt;The public repo, &lt;a href="https://github.com/adetwiler/build-with-a-memory" rel="noopener noreferrer"&gt;Build With a Memory&lt;/a&gt;,&lt;br&gt;
includes the seed version: a single prompt you paste into an agent to install&lt;br&gt;
the basic structure in an existing project. The tools from this post are in&lt;br&gt;
there too, under &lt;a href="https://github.com/adetwiler/build-with-a-memory/tree/main/tools" rel="noopener noreferrer"&gt;&lt;code&gt;tools/&lt;/code&gt;&lt;/a&gt;:&lt;br&gt;
the search indexer, the query tool, the graph generator, and the link-health&lt;br&gt;
check, generalized to run on any folder of notes.&lt;/p&gt;

&lt;p&gt;Writing it down costs less than re-explaining it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are you building into your repos?
&lt;/h2&gt;

&lt;p&gt;I'd honestly love to hear how other people are handling this. If you've got a&lt;br&gt;
memory setup for your agents, even a messy one, what's the piece that actually&lt;br&gt;
gets used? And what died from neglect?&lt;/p&gt;

&lt;h2&gt;
  
  
  Credits
&lt;/h2&gt;

&lt;p&gt;The network is my own build, but the way of working it grew out of is not all mine. A talk by &lt;a href="https://www.aihero.dev" rel="noopener noreferrer"&gt;Matt Pocock&lt;/a&gt; flipped committed project memory from something I toyed with into how I actually work. The method repo keeps the full credit record in &lt;a href="https://github.com/adetwiler/build-with-a-memory/blob/main/CREDITS.md" rel="noopener noreferrer"&gt;CREDITS.md&lt;/a&gt;. If this post uses an idea I have not credited there, tell me and I will fix it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Give the Agent a Memory Before You Give It a Task</title>
      <dc:creator>Andrew Detwiler</dc:creator>
      <pubDate>Mon, 13 Jul 2026 16:31:05 +0000</pubDate>
      <link>https://dev.to/adetwiler/give-the-agent-a-memory-before-you-give-it-a-task-4p8g</link>
      <guid>https://dev.to/adetwiler/give-the-agent-a-memory-before-you-give-it-a-task-4p8g</guid>
      <description>&lt;p&gt;Every AI coding session starts the same way.&lt;/p&gt;

&lt;p&gt;The agent knows nothing about your project. Not the decision you made last&lt;br&gt;
Tuesday. Not the migration that burned you. Not the naming convention you&lt;br&gt;
finally settled on.&lt;/p&gt;

&lt;p&gt;So you re-explain. Every session. Or worse, you don't, and the agent makes&lt;br&gt;
a mistake you already paid for once.&lt;/p&gt;
&lt;h2&gt;
  
  
  The fix is boring
&lt;/h2&gt;

&lt;p&gt;It's not a smarter model. It's not a bigger context window. It's writing&lt;br&gt;
things down, in the repo, where the work happens.&lt;/p&gt;

&lt;p&gt;I keep three kinds of files in every serious project now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A short operating manual the agent always loads. Rules only. If it grows
past a page, something moves out.&lt;/li&gt;
&lt;li&gt;Decision records. One small file per locked decision, with the why. The why
is the part you forget first.&lt;/li&gt;
&lt;li&gt;A gotchas file. Every time something non-obvious bites me, it gets a line
right then. If I save it for later, it never happens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. Plain markdown. No tooling, no framework, nothing to install.&lt;/p&gt;
&lt;h2&gt;
  
  
  What changed for me
&lt;/h2&gt;

&lt;p&gt;Honestly, the difference is bigger than any model upgrade I've tried.&lt;/p&gt;

&lt;p&gt;A fresh session reads the manual and starts acting like it was here last week.&lt;br&gt;
It follows conventions I never mentioned in the prompt. It skips the mistakes I already&lt;br&gt;
made once, because they're written down.&lt;/p&gt;

&lt;p&gt;And the strange part: the notes made me better too. Writing "we decided X&lt;br&gt;
because Y" forces you to actually have a Y.&lt;/p&gt;
&lt;h2&gt;
  
  
  A starter file
&lt;/h2&gt;

&lt;p&gt;Drop this in your repo as &lt;code&gt;AGENTS.md&lt;/code&gt; and edit it honestly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Operating manual&lt;/span&gt;

&lt;span class="gu"&gt;## What this project is&lt;/span&gt;
One sentence. What it does, who it's for.

&lt;span class="gu"&gt;## Rules that are always true&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Commands: how to run dev, tests, build.
&lt;span class="p"&gt;-&lt;/span&gt; The one or two conventions people keep getting wrong.

&lt;span class="gu"&gt;## Decisions (the why matters)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; 2026-07-12: We use X instead of Y because Z.

&lt;span class="gu"&gt;## Gotchas&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; The thing that bit us, and what to do instead.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start smaller than feels right. A pile of docs nobody maintains is worse than&lt;br&gt;
one page that's true.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are you writing down?
&lt;/h2&gt;

&lt;p&gt;I'm still figuring out where the line is between useful memory and busywork.&lt;br&gt;
If you're doing something like this in your own projects, I'd honestly love&lt;br&gt;
to hear what you keep and what you throw away.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>How I’m Building Personal Apps With AI, Next.js, SQLite, and Tailscale</title>
      <dc:creator>Andrew Detwiler</dc:creator>
      <pubDate>Sun, 10 May 2026 02:04:02 +0000</pubDate>
      <link>https://dev.to/adetwiler/how-im-building-personal-apps-with-ai-nextjs-sqlite-and-tailscale-2n40</link>
      <guid>https://dev.to/adetwiler/how-im-building-personal-apps-with-ai-nextjs-sqlite-and-tailscale-2n40</guid>
      <description>&lt;p&gt;For years, building custom software felt like something reserved for startups, funded teams, or companies with dedicated infrastructure.&lt;/p&gt;

&lt;p&gt;That’s changing fast.&lt;/p&gt;

&lt;p&gt;Today, you can build fully custom personal apps for yourself, your family, or a small team in an afternoon using AI. You don’t need cloud infrastructure. You don’t need Kubernetes. You don’t even need to deploy anything publicly.&lt;/p&gt;

&lt;p&gt;You can run modern web apps entirely on your own machine or on a small dedicated computer in your house, securely, and install them on your phone like native apps.&lt;/p&gt;

&lt;p&gt;I’ve been doing this myself for budgeting tools, meal planning apps, grocery lists, internal dashboards, and small tools that help organize things at home.&lt;/p&gt;

&lt;p&gt;And honestly, it works incredibly well. Most of these apps would have never been worth building for me a few years ago.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqix2bj4j2aug1r28f2b9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqix2bj4j2aug1r28f2b9.png" alt="Food Planner app" width="800" height="828"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  The Shift Happening Right Now
&lt;/h1&gt;

&lt;p&gt;The biggest change isn’t just AI generating code.&lt;/p&gt;

&lt;p&gt;It’s that the combination of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI coding models&lt;/li&gt;
&lt;li&gt;Modern frameworks like Next.js&lt;/li&gt;
&lt;li&gt;SQLite&lt;/li&gt;
&lt;li&gt;Progressive Web Apps (PWAs)&lt;/li&gt;
&lt;li&gt;Tailscale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;has lowered the barrier so much that building personal software is now practical for regular developers.&lt;/p&gt;

&lt;p&gt;You no longer need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS infrastructure&lt;/li&gt;
&lt;li&gt;complicated authentication systems&lt;/li&gt;
&lt;li&gt;production-grade distributed databases&lt;/li&gt;
&lt;li&gt;app store deployments&lt;/li&gt;
&lt;li&gt;expensive SaaS subscriptions for every tiny need&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your app is only for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;yourself&lt;/li&gt;
&lt;li&gt;your family&lt;/li&gt;
&lt;li&gt;your friend group&lt;/li&gt;
&lt;li&gt;a small team&lt;/li&gt;
&lt;li&gt;your local business&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;you can simplify almost everything.&lt;/p&gt;

&lt;p&gt;And simplification changes the game.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjwg6qsybnef71fd30mv7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjwg6qsybnef71fd30mv7.jpg" alt=" " width="800" height="753"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  What You’ll Need
&lt;/h1&gt;

&lt;p&gt;The stack is intentionally minimal.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. AI Coding Tool
&lt;/h2&gt;

&lt;p&gt;You can use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ChatGPT&lt;/li&gt;
&lt;li&gt;Claude&lt;/li&gt;
&lt;li&gt;Cursor&lt;/li&gt;
&lt;li&gt;Windsurf&lt;/li&gt;
&lt;li&gt;anything capable of generating and modifying code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is really the only paid part depending on the model you use.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flmd9sgvhf1rdtbxkmyl8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flmd9sgvhf1rdtbxkmyl8.jpg" alt=" " width="800" height="1738"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Next.js
&lt;/h2&gt;

&lt;p&gt;Next.js is perfect for this.&lt;/p&gt;

&lt;p&gt;You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;frontend&lt;/li&gt;
&lt;li&gt;backend API routes&lt;/li&gt;
&lt;li&gt;server rendering&lt;/li&gt;
&lt;li&gt;static assets&lt;/li&gt;
&lt;li&gt;routing&lt;/li&gt;
&lt;li&gt;PWA support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;all in one project.&lt;/p&gt;

&lt;p&gt;No separate backend required.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. SQLite
&lt;/h1&gt;

&lt;p&gt;For personal apps, SQLite is massively underrated.&lt;/p&gt;

&lt;p&gt;You do not need Postgres for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;grocery lists&lt;/li&gt;
&lt;li&gt;meal planners&lt;/li&gt;
&lt;li&gt;budgeting apps&lt;/li&gt;
&lt;li&gt;household management&lt;/li&gt;
&lt;li&gt;internal dashboards&lt;/li&gt;
&lt;li&gt;small team tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SQLite gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a single file database&lt;/li&gt;
&lt;li&gt;zero infrastructure&lt;/li&gt;
&lt;li&gt;no database server&lt;/li&gt;
&lt;li&gt;extremely reliable storage&lt;/li&gt;
&lt;li&gt;backups as simple as copying a file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And for personal applications, it’s more than enough.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Tailscale
&lt;/h1&gt;

&lt;p&gt;This is what makes the whole thing practical.&lt;/p&gt;

&lt;p&gt;Tailscale creates a private encrypted mesh network between your devices.&lt;/p&gt;

&lt;p&gt;Your app never has to be exposed publicly to the internet.&lt;/p&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;host the app on your desktop&lt;/li&gt;
&lt;li&gt;run it on a mini PC&lt;/li&gt;
&lt;li&gt;keep it on an old laptop&lt;/li&gt;
&lt;li&gt;use a small home server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and securely access it from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;iPhone&lt;/li&gt;
&lt;li&gt;Android&lt;/li&gt;
&lt;li&gt;Mac&lt;/li&gt;
&lt;li&gt;Windows&lt;/li&gt;
&lt;li&gt;tablets&lt;/li&gt;
&lt;li&gt;laptops&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tailscale’s free tier supports up to 6 users, which is perfect for families or small teams.&lt;/p&gt;

&lt;p&gt;This is honestly one of the biggest unlocks for personal software development.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Authentication Trick
&lt;/h1&gt;

&lt;p&gt;For personal apps, you don’t need enterprise auth.&lt;/p&gt;

&lt;p&gt;You don’t need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OAuth&lt;/li&gt;
&lt;li&gt;Auth0&lt;/li&gt;
&lt;li&gt;Clerk&lt;/li&gt;
&lt;li&gt;JWT complexity&lt;/li&gt;
&lt;li&gt;social logins&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the app only exists inside your private Tailscale network, you can simplify authentication dramatically.&lt;/p&gt;

&lt;p&gt;One approach I use often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create predefined users&lt;/li&gt;
&lt;li&gt;let the app ask “Who are you?”&lt;/li&gt;
&lt;li&gt;store the selected user locally&lt;/li&gt;
&lt;li&gt;treat that as authenticated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That sounds wrong if you come from enterprise software.&lt;/p&gt;

&lt;p&gt;But context matters.&lt;/p&gt;

&lt;p&gt;Inside a private encrypted Tailscale network shared only with trusted users, this is often completely acceptable for personal tools.&lt;/p&gt;

&lt;p&gt;The result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;almost zero auth complexity&lt;/li&gt;
&lt;li&gt;no external auth provider&lt;/li&gt;
&lt;li&gt;no monthly auth costs&lt;/li&gt;
&lt;li&gt;much faster development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You stop overengineering software that only five people will ever use.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx3tc0yt6tz8z9r9gdqys.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx3tc0yt6tz8z9r9gdqys.jpg" alt=" " width="800" height="828"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Make It a PWA
&lt;/h1&gt;

&lt;p&gt;This part is important.&lt;/p&gt;

&lt;p&gt;When prompting the AI to build the app, include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;installable PWA support&lt;/li&gt;
&lt;li&gt;offline support where possible&lt;/li&gt;
&lt;li&gt;responsive mobile UI&lt;/li&gt;
&lt;li&gt;app manifest&lt;/li&gt;
&lt;li&gt;service worker setup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows the web app to behave almost exactly like a native app.&lt;/p&gt;

&lt;p&gt;You can install it directly from the browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  iPhone
&lt;/h2&gt;

&lt;p&gt;Use Safari → Share → Add to Home Screen&lt;/p&gt;

&lt;h2&gt;
  
  
  Android
&lt;/h2&gt;

&lt;p&gt;Install directly through Chrome&lt;/p&gt;

&lt;h2&gt;
  
  
  Mac and Windows
&lt;/h2&gt;

&lt;p&gt;Install directly from Chromium browsers&lt;/p&gt;

&lt;p&gt;Once installed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;it launches like a native app&lt;/li&gt;
&lt;li&gt;has its own icon&lt;/li&gt;
&lt;li&gt;runs fullscreen&lt;/li&gt;
&lt;li&gt;feels like a real application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most non-technical users won’t even realize it’s a website.&lt;/p&gt;




&lt;h1&gt;
  
  
  Using MagicDNS
&lt;/h1&gt;

&lt;p&gt;Tailscale’s MagicDNS makes the experience even better.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;192.168.1.44:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mealplanner.tailnet-name.ts.net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;budgetbox.tailnet-name.ts.net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes your apps feel like real products instead of random local servers.&lt;/p&gt;




&lt;h1&gt;
  
  
  Example Apps That Work Extremely Well
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Family Apps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Meal Planner
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;weekly meals&lt;/li&gt;
&lt;li&gt;shared grocery list&lt;/li&gt;
&lt;li&gt;pantry tracking&lt;/li&gt;
&lt;li&gt;recipe storage&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Budgeting App
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;monthly expenses&lt;/li&gt;
&lt;li&gt;sinking funds&lt;/li&gt;
&lt;li&gt;subscriptions&lt;/li&gt;
&lt;li&gt;shared family budgeting&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Household Dashboard
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;chores&lt;/li&gt;
&lt;li&gt;maintenance reminders&lt;/li&gt;
&lt;li&gt;schedules&lt;/li&gt;
&lt;li&gt;calendars&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Kids Dashboard
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;allowance tracking&lt;/li&gt;
&lt;li&gt;reading goals&lt;/li&gt;
&lt;li&gt;homework tracking&lt;/li&gt;
&lt;li&gt;screen time systems&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Small Team Apps
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Internal Tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;lightweight CRM&lt;/li&gt;
&lt;li&gt;project tracker&lt;/li&gt;
&lt;li&gt;sprint dashboard&lt;/li&gt;
&lt;li&gt;client management&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Studio Tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;asset trackers&lt;/li&gt;
&lt;li&gt;bug lists&lt;/li&gt;
&lt;li&gt;roadmap viewers&lt;/li&gt;
&lt;li&gt;release planning&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Content Pipelines
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;social post planners&lt;/li&gt;
&lt;li&gt;publishing trackers&lt;/li&gt;
&lt;li&gt;video pipelines&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Why This Matters
&lt;/h1&gt;

&lt;p&gt;We spent years forcing every software idea into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SaaS&lt;/li&gt;
&lt;li&gt;cloud hosting&lt;/li&gt;
&lt;li&gt;subscriptions&lt;/li&gt;
&lt;li&gt;scaling concerns&lt;/li&gt;
&lt;li&gt;public deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But most software ideas do not need to scale to millions of users.&lt;/p&gt;

&lt;p&gt;A huge percentage of useful software only needs to solve problems for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one person&lt;/li&gt;
&lt;li&gt;one family&lt;/li&gt;
&lt;li&gt;one studio&lt;/li&gt;
&lt;li&gt;one team&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI makes custom software generation cheap.&lt;/p&gt;

&lt;p&gt;Modern frameworks make development fast.&lt;/p&gt;

&lt;p&gt;Tailscale makes networking easy.&lt;/p&gt;

&lt;p&gt;PWAs make distribution trivial.&lt;/p&gt;

&lt;p&gt;And SQLite removes infrastructure entirely.&lt;/p&gt;

&lt;p&gt;The result is that personal software development is entering a completely different era.&lt;/p&gt;




&lt;h1&gt;
  
  
  A Sample Prompt
&lt;/h1&gt;

&lt;p&gt;Here’s the type of prompt I’ll give an AI model:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Build a Next.js PWA for meal planning and grocery management.&lt;br&gt;
Use SQLite for storage.&lt;br&gt;
Use simple local authentication where the user selects their identity from predefined users.&lt;br&gt;
Design it mobile-first.&lt;br&gt;
Add installable PWA support.&lt;br&gt;
Include offline support for grocery lists.&lt;br&gt;
Optimize the UI for iPhone and desktop usage.&lt;br&gt;
Use TailwindCSS and shadcn/ui.&lt;br&gt;
Structure the app cleanly with reusable components and API routes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That alone can get you shockingly far now.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;I think we’re entering a phase where developers will increasingly build software specifically for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;their own lives&lt;/li&gt;
&lt;li&gt;their families&lt;/li&gt;
&lt;li&gt;their friend groups&lt;/li&gt;
&lt;li&gt;niche communities&lt;/li&gt;
&lt;li&gt;small businesses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not everything needs to become a startup.&lt;/p&gt;

&lt;p&gt;Sometimes the best software is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;simple&lt;/li&gt;
&lt;li&gt;private&lt;/li&gt;
&lt;li&gt;local&lt;/li&gt;
&lt;li&gt;highly customized&lt;/li&gt;
&lt;li&gt;built for exactly the people using it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And for the first time in a long time, building those kinds of applications is actually easy.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are You Building?
&lt;/h2&gt;

&lt;p&gt;If you’ve been building personal apps or experimenting with local-first setups, I’d honestly love to hear what you’re building or how you’re approaching it.&lt;/p&gt;

&lt;p&gt;I think this space is becoming more interesting every month.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>ai</category>
      <category>selfhosted</category>
    </item>
  </channel>
</rss>
