<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>SwiftProject — Notes from the bench</title>
    <link>https://swiftproject.in/notes</link>
    <description>Engineering field notes, architecture principles, and delivery playbooks by SwiftProject.</description>
    <language>en-us</language>
    <lastBuildDate>Thu, 29 Oct 2026 17:25:05 GMT</lastBuildDate>
    <atom:link href="https://swiftproject.in/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>YAGNI — you aren&apos;t gonna need it</title>
      <link>https://swiftproject.in/notes/yagni</link>
      <guid isPermaLink="true">https://swiftproject.in/notes/yagni</guid>
      <category>Principle</category>
      <description>why I refuse to build the feature you&apos;ll need next month. — you&apos;re not a prophet</description>
      <content:encoded><![CDATA[<p>Don&apos;t build the feature you imagine you&apos;ll need next month. You&apos;re not a prophet, and the imagined future is usually wrong anyway — different users, different constraints, different priorities.</p><p>Every speculative feature is a tax you pay forever: it ships with bugs, gets in the way of the feature you actually need, and confuses the person reading the code later.</p><p>Build what&apos;s needed, keep it simple, and let the future feature earn its place. When it does arrive, you&apos;ll build it better — because now you know how it&apos;s really used.</p>]]></content:encoded>
      <pubDate>Thu, 29 Oct 2026 17:25:05 GMT</pubDate>
    </item>
    <item>
      <title>DRY — don&apos;t repeat yourself</title>
      <link>https://swiftproject.in/notes/dry</link>
      <guid isPermaLink="true">https://swiftproject.in/notes/dry</guid>
      <category>Principle</category>
      <description>the third copy-paste is a bug factory, not a shortcut. — bug factory</description>
      <content:encoded><![CDATA[<p>Copy-pasting the first time is a reasonable shortcut. The second time, you&apos;re creating debt. The third time, you have a bug factory — because now a fix has to be applied in three places, and it never is.</p><p>Extract it once, name it well, and stop maintaining the same code in five places. The rule isn&apos;t about avoiding repetition for its own sake — it&apos;s about having one source of truth for a behavior.</p><p>Your future self will thank you — probably at 11pm, in a bugfix, wondering why the fix in module A didn&apos;t reach module B.</p>]]></content:encoded>
      <pubDate>Thu, 29 Oct 2026 17:25:05 GMT</pubDate>
    </item>
    <item>
      <title>KISS — keep it simple</title>
      <link>https://swiftproject.in/notes/kiss</link>
      <guid isPermaLink="true">https://swiftproject.in/notes/kiss</guid>
      <category>Principle</category>
      <description>the simplest thing that works, ships first and breaks least. — ships first</description>
      <content:encoded><![CDATA[<p>The simplest thing that works usually ships first, breaks least, and is easiest for the next engineer — probably you, in six months — to understand.</p><p>Complexity is a debt you pay with attention. Every abstraction, every config option, every clever trick consumes a little of the attention you&apos;d rather spend on the product.</p><p>If a &apos;simple&apos; solution needs three explanations and a diagram, it&apos;s not simple. Choose boring technology, clear structure, and let the interesting problems stay interesting.</p>]]></content:encoded>
      <pubDate>Thu, 29 Oct 2026 17:25:05 GMT</pubDate>
    </item>
    <item>
      <title>How I scope a freelance project</title>
      <link>https://swiftproject.in/notes/scoping-a-freelance-project</link>
      <guid isPermaLink="true">https://swiftproject.in/notes/scoping-a-freelance-project</guid>
      <category>Guide</category>
      <description>fixed scope, fixed price, and what I need from you on day one. — no hourly guesswork</description>
      <content:encoded><![CDATA[<p>I quote a fixed scope with a fixed price. No hourly guesswork — because hourly billing rewards slowness, and neither of us wants that. You know what you&apos;re paying; I know what I&apos;m building.</p><p>On day one I need three things: the workflow you&apos;re trying to fix, who actually uses it, and what &apos;done&apos; looks like to you. If you can&apos;t describe the workflow, we fix that first — that&apos;s the real problem, and the code is usually easy once it&apos;s clear.</p><p>We decide the rest together: one small slice first, shipped and reviewed, before the whole build. It&apos;s how the messy first draft becomes a product you trust.</p>]]></content:encoded>
      <pubDate>Thu, 29 Oct 2026 17:25:05 GMT</pubDate>
    </item>
    <item>
      <title>Designing a slot-booking flow people don&apos;t fight</title>
      <link>https://swiftproject.in/notes/slot-booking-flow</link>
      <guid isPermaLink="true">https://swiftproject.in/notes/slot-booking-flow</guid>
      <category>Case Study</category>
      <description>scheduling looks simple until real humans and real calendars show up. — the friction is never in the calendar</description>
      <content:encoded><![CDATA[<p>A client came to me with a portfolio site that needed a slot booking system. Simple, they said. Then real calendars showed up: double-bookings, timezone confusion, cancellations, and people who expected a confirmation email within seconds.</p><p>We designed real-time availability with no double-booking window, an explicit confirmation path, and zero ambiguity about what happens next — plus a clean way to cancel that doesn&apos;t punish the visitor.</p><p>The lesson I keep learning: the friction is never in the calendar. It&apos;s in the questions you forgot to ask upfront — what happens when someone books twice, or when the slot they just wanted closed? Answer those and the code is almost boring.</p>]]></content:encoded>
      <pubDate>Thu, 29 Oct 2026 17:25:05 GMT</pubDate>
    </item>
    <item>
      <title>Premature optimization is the root of all evil</title>
      <link>https://swiftproject.in/notes/premature-optimization</link>
      <guid isPermaLink="true">https://swiftproject.in/notes/premature-optimization</guid>
      <category>Principle</category>
      <description>optimize when the profiler tells you, not when your ego does. — when the profiler tells you</description>
      <content:encoded><![CDATA[<p>Optimize when the profiler tells you to, not when your ego does. Most &apos;performance issues&apos; in early builds are actually architecture issues wearing a costume.</p><p>Correct, readable, and slow-enough beats fast, clever, and unmaintainable — every time. A 200ms query you can understand is worth more than a 20ms query nobody can touch.</p><p>Measure first, then optimize the thing that matters. Premature optimization is how you end up with a cache invalidation bug at 2am and no one to blame but a clever idea.</p>]]></content:encoded>
      <pubDate>Thu, 29 Oct 2026 17:25:05 GMT</pubDate>
    </item>
    <item>
      <title>Custom tools vs off-the-shelf</title>
      <link>https://swiftproject.in/notes/custom-vs-off-the-shelf</link>
      <guid isPermaLink="true">https://swiftproject.in/notes/custom-vs-off-the-shelf</guid>
      <category>Guide</category>
      <description>when &apos;build it ourselves&apos; is actually the right call. — the workflow IS the business</description>
      <content:encoded><![CDATA[<p>Off-the-shelf wins when the workflow is generic — CRM, email, basic accounting. Custom wins when the workflow IS the business: inventory, billing, approvals, compliance.</p><p>The rule I use: if you can name the cost of the workaround — the manual export, the spreadsheet, the double entry — custom is worth quoting. If you can&apos;t, the off-the-shelf tool is probably cheaper than my invoice.</p><p>The best outcome is often a hybrid: the shelf tool for the boring 80%, and a thin custom layer where your business actually differs. That&apos;s what I design, and it&apos;s usually what ships.</p>]]></content:encoded>
      <pubDate>Thu, 29 Oct 2026 17:25:05 GMT</pubDate>
    </item>
    <item>
      <title>Code is for humans</title>
      <link>https://swiftproject.in/notes/code-is-for-humans</link>
      <guid isPermaLink="true">https://swiftproject.in/notes/code-is-for-humans</guid>
      <category>Principle</category>
      <description>the machine doesn&apos;t care about your variable names. — the machine doesn&apos;t care</description>
      <content:encoded><![CDATA[<p>Names matter. Structure matters. Comments explain why, never what — the code already says what it does; the comment is where you confess the reason.</p><p>The person reading your code later is the real customer — and it&apos;s usually you, at 2am, wondering what you meant. Be kind to that person.</p><p>Good code reads like a letter from a thoughtful engineer. It&apos;s not about cleverness; it&apos;s about leaving the room clean enough that the next person can walk in without tripping.</p>]]></content:encoded>
      <pubDate>Thu, 29 Oct 2026 17:25:05 GMT</pubDate>
    </item>
    <item>
      <title>Choosing a database — SQL vs NoSQL</title>
      <link>https://swiftproject.in/notes/choosing-a-database</link>
      <guid isPermaLink="true">https://swiftproject.in/notes/choosing-a-database</guid>
      <category>Guide</category>
      <description>the question isn&apos;t &apos;best database&apos;. it&apos;s &apos;what queries will you run?&apos;. — what queries will you run</description>
      <content:encoded><![CDATA[<p>People ask &apos;PostgreSQL or MongoDB?&apos; like there&apos;s one right answer. There isn&apos;t. The right question is: what queries will you run, and how do they relate to each other?</p><p>Relational wins when your data has relationships you&apos;ll always query together — orders and customers, roles and permissions, transactions and balances. Fixed schemas, migrations and ACID are worth the ceremony when the business counts beans.</p><p>Document stores shine when your reads are a known shape, writes arrive in bigger chunks, and the schema shifts every week. I&apos;ve shipped both — the rule I apply: if the business calls it a &apos;record&apos;, go relational. If it calls it a &apos;document&apos;, go documents.</p>]]></content:encoded>
      <pubDate>Thu, 29 Oct 2026 17:25:05 GMT</pubDate>
    </item>
    <item>
      <title>Server-side 101: what happens between request and response</title>
      <link>https://swiftproject.in/notes/backend-101</link>
      <guid isPermaLink="true">https://swiftproject.in/notes/backend-101</guid>
      <category>Guide</category>
      <description>the journey of a click — and where it usually goes wrong. — the journey of a click</description>
      <content:encoded><![CDATA[<p>Every click is a small journey: client → network → server → validation → data → response → render. When something breaks, it breaks at one of those stations — and finding it is just walking the line.</p><p>The mistakes I see most: validation done only in the UI, errors swallowed silently, and no thought about what a bad request or a duplicate click looks like server-side. The server is where the product actually lives — the UI is just a window.</p><p>One rule turns most of my backends boring in the best way: assume every request is hostile, return explicit errors, and log the ones that mattered. Boring backends ship; clever ones file incident reports.</p>]]></content:encoded>
      <pubDate>Thu, 29 Oct 2026 17:25:05 GMT</pubDate>
    </item>
    <item>
      <title>Indexes: the 20% that fixes 80% of slow queries</title>
      <link>https://swiftproject.in/notes/indexes-matter</link>
      <guid isPermaLink="true">https://swiftproject.in/notes/indexes-matter</guid>
      <category>Guide</category>
      <description>before you cache, before you shard — read the EXPLAIN. — read the EXPLAIN</description>
      <content:encoded><![CDATA[<p>Most &apos;the database is slow&apos; complaints are one missing index away from solved. Before you reach for caching or sharding, read the query plan. EXPLAIN is a lie detector for your assumptions.</p><p>Indexes trade writes for reads — so the art is picking the few that match your real query patterns. Index what you filter, join and order by. Don&apos;t write an index for every column you can name; that&apos;s how writes get slower every year.</p><p>And an index isn&apos;t magic: a query that scans twenty thousand rows because of a WHERE on an unindexed column will still read all of them. Measurement first, always — the plan says what&apos;s expensive before your users do.</p>]]></content:encoded>
      <pubDate>Thu, 29 Oct 2026 17:25:05 GMT</pubDate>
    </item>
    <item>
      <title>Auth without fear: sessions, JWTs and password resets</title>
      <link>https://swiftproject.in/notes/auth-without-fear</link>
      <guid isPermaLink="true">https://swiftproject.in/notes/auth-without-fear</guid>
      <category>Guide</category>
      <description>the feature everyone&apos;s afraid of, and why it doesn&apos;t need to be scary. — boring is exactly what you want</description>
      <content:encoded><![CDATA[<p>Auth scares people — two weeks of &apos;where do I store the token?&apos; and &apos;what if attackers think about this more than I do?&apos;. The good news: solid auth is mostly boring, and boring is exactly what you want here.</p><p>Sessions when you own the page, short-lived JWTs when you need stateless APIs, and a battle-tested provider (Better Auth, Supabase Auth, NextAuth) instead of a hand-rolled crypto toy. The docs know more than your clever idea.</p><p>Password resets, email verification and rate limiting aren&apos;t afterthoughts — they&apos;re sixty percent of the feature. decide them upfront, and the scary part disappears.</p>]]></content:encoded>
      <pubDate>Thu, 29 Oct 2026 17:25:05 GMT</pubDate>
    </item>
  </channel>
</rss>