<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Anchit Verma</title><description>Writing about software, ideas, and the things I&apos;m building.</description><link>https://anchit.me/</link><language>en-us</language><item><title>TIL: CSS color-mix() is production-ready</title><link>https://anchit.me/notes/css-color-mix/</link><guid isPermaLink="true">https://anchit.me/notes/css-color-mix/</guid><description>TIL: CSS color-mix() is production-ready</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;color-mix()&lt;/code&gt; has full browser support now and it&apos;s incredibly useful for generating color variations without preprocessors.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* 50% of accent color mixed with transparent = semi-transparent accent */
background: color-mix(in srgb, var(--color-accent) 50%, transparent);

/* Darken a color by mixing with black */
border-color: color-mix(in srgb, var(--color-accent) 80%, black);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;in srgb&lt;/code&gt; part specifies the color space for interpolation. You can also use &lt;code&gt;in oklch&lt;/code&gt; for perceptually uniform mixing, which tends to produce more natural-looking results.&lt;/p&gt;
&lt;p&gt;I&apos;ve been using this all over this site instead of maintaining separate color tokens for every opacity variant.&lt;/p&gt;
</content:encoded></item><item><title>TIL: git bisect is criminally underused</title><link>https://anchit.me/notes/git-bisect/</link><guid isPermaLink="true">https://anchit.me/notes/git-bisect/</guid><description>TIL: git bisect is criminally underused</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;git bisect&lt;/code&gt; binary searches your commit history to find the exact commit that introduced a bug. It&apos;s shockingly effective and I forget about it every time.&lt;/p&gt;
</content:encoded></item><item><title>Container queries change everything</title><link>https://anchit.me/notes/container-queries/</link><guid isPermaLink="true">https://anchit.me/notes/container-queries/</guid><description>Container queries change everything</description><pubDate>Fri, 20 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Container queries let components respond to their own size instead of the viewport. This is the missing piece for truly reusable components. Finally, a card can be responsive without knowing where it lives on the page.&lt;/p&gt;
</content:encoded></item><item><title>The Tools We Use Shape How We Think</title><link>https://anchit.me/blog/tools-shape-thinking/</link><guid isPermaLink="true">https://anchit.me/blog/tools-shape-thinking/</guid><description>On the relationship between the tools we choose and the way we approach problems — and why it matters more than we think.</description><pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There&apos;s a quote often attributed to Abraham Maslow: &quot;If all you have is a hammer, everything looks like a nail.&quot; It&apos;s become a cliche, but like most cliches, it persists because it&apos;s true.&lt;/p&gt;
&lt;p&gt;I&apos;ve been thinking about this lately in the context of software development. The frameworks we adopt, the languages we write in, the editors we use — they don&apos;t just help us build things. They shape the &lt;em&gt;kinds&lt;/em&gt; of things we imagine building.&lt;/p&gt;
&lt;h2&gt;The editor as a lens&lt;/h2&gt;
&lt;p&gt;When I switched from a heavy IDE to a minimal text editor, something shifted. I started writing smaller functions. I relied less on auto-complete and more on memory. My code got simpler — not because I was trying to write simple code, but because the tool encouraged it.&lt;/p&gt;
&lt;p&gt;The opposite happens too. Give someone a powerful ORM and they&apos;ll model everything as a database relation. Give them a message queue and suddenly every problem is an event.&lt;/p&gt;
&lt;h2&gt;Choosing constraints&lt;/h2&gt;
&lt;p&gt;The interesting move is choosing your constraints deliberately. Instead of reaching for the most powerful tool, sometimes the right choice is the most limited one.&lt;/p&gt;
&lt;p&gt;A static site generator forces you to think about what actually needs to be dynamic. A language without exceptions forces you to handle errors explicitly. A deploy pipeline without rollbacks forces you to test more carefully.&lt;/p&gt;
&lt;p&gt;These aren&apos;t limitations — they&apos;re design decisions that ripple outward.&lt;/p&gt;
&lt;h2&gt;What I&apos;m trying to do about it&lt;/h2&gt;
&lt;p&gt;Lately, I&apos;ve been making a conscious effort to rotate my tools. Not for the novelty, but to keep my thinking flexible. Write some code in a language I don&apos;t usually use. Try a different approach to a problem I&apos;ve solved before.&lt;/p&gt;
&lt;p&gt;It&apos;s uncomfortable, and it&apos;s slower. But the code that comes out the other side tends to be more thoughtful.&lt;/p&gt;
&lt;p&gt;The tools we use shape how we think. It&apos;s worth being intentional about which ones we pick up.&lt;/p&gt;
</content:encoded></item><item><title>Astro content collections are genuinely good</title><link>https://anchit.me/notes/astro-content-collections/</link><guid isPermaLink="true">https://anchit.me/notes/astro-content-collections/</guid><description>Astro content collections are genuinely good</description><pubDate>Sat, 14 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;After using Astro&apos;s content collections for this site, I&apos;m impressed by how well they handle the boring parts of content management — type-safe frontmatter validation, automatic slug generation, and collection-scoped queries.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;z.coerce.date()&lt;/code&gt; trick is particularly nice. You write &lt;code&gt;date: 2026-02-14&lt;/code&gt; in your frontmatter and Zod coerces it into a proper Date object. No parsing, no edge cases.&lt;/p&gt;
&lt;p&gt;The mental model is simple: a collection is a directory of markdown files with a shared schema. Query it, filter it, sort it. Everything is typed.&lt;/p&gt;
</content:encoded></item><item><title>Semantic HTML is still underrated</title><link>https://anchit.me/notes/semantic-html/</link><guid isPermaLink="true">https://anchit.me/notes/semantic-html/</guid><description>Semantic HTML is still underrated</description><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Using the right HTML elements gives you accessibility, SEO, and browser features for free. A &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; element is a disclosure widget without a single line of JavaScript. A &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; is a modal that handles focus trapping. Stop reinventing what the platform gives you.&lt;/p&gt;
</content:encoded></item><item><title>Vertical rhythm in web typography</title><link>https://anchit.me/notes/vertical-rhythm/</link><guid isPermaLink="true">https://anchit.me/notes/vertical-rhythm/</guid><description>Vertical rhythm in web typography</description><pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The trick to making a page &lt;em&gt;feel&lt;/em&gt; well-designed even if you can&apos;t pinpoint why: derive all your spacing from your base line-height.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;--space-unit: calc(var(--fs-base) * var(--leading-body));
--space-sm: calc(var(--space-unit) * 0.5);
--space-md: var(--space-unit);
--space-lg: calc(var(--space-unit) * 1.5);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Everything snaps to a consistent vertical grid. Headings, paragraphs, margins, padding — all multiples of the same base unit. It&apos;s subtle but the difference is immediately noticeable.&lt;/p&gt;
</content:encoded></item><item><title>Writing to Understand</title><link>https://anchit.me/blog/writing-to-understand/</link><guid isPermaLink="true">https://anchit.me/blog/writing-to-understand/</guid><description>Why I write about technical topics even when I don&apos;t fully understand them yet — especially then.</description><pubDate>Sun, 25 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I used to think you needed to be an expert before you could write about something. That writing was the &lt;em&gt;output&lt;/em&gt; of understanding. First you learn, then you explain.&lt;/p&gt;
&lt;p&gt;I had it backwards.&lt;/p&gt;
&lt;h2&gt;The blank page as a debugging tool&lt;/h2&gt;
&lt;p&gt;The moment I try to explain something in writing, I discover the gaps. The parts I thought I understood but actually just had a vague feeling about. The connections I assumed existed but can&apos;t articulate.&lt;/p&gt;
&lt;p&gt;Writing is not the output of thinking. Writing &lt;em&gt;is&lt;/em&gt; thinking.&lt;/p&gt;
&lt;p&gt;This is why rubber duck debugging works. It&apos;s why teaching is the best way to learn. The act of translating an idea from the fuzzy space in your head into concrete words forces precision.&lt;/p&gt;
&lt;h2&gt;The draft as exploration&lt;/h2&gt;
&lt;p&gt;My best technical posts started as confusion. I&apos;d encounter something I didn&apos;t fully understand, and instead of bookmarking it for later, I&apos;d open a blank document and start writing.&lt;/p&gt;
&lt;p&gt;Not writing &lt;em&gt;about&lt;/em&gt; it — writing &lt;em&gt;through&lt;/em&gt; it. Following the thread wherever it led, asking questions on the page, trying different explanations until one clicked.&lt;/p&gt;
&lt;p&gt;Half of these drafts never become posts. That&apos;s fine. The draft served its purpose.&lt;/p&gt;
&lt;h2&gt;Permission to be wrong&lt;/h2&gt;
&lt;p&gt;The hardest part is giving yourself permission to write something that might be wrong. Or incomplete. Or obvious to someone with more experience.&lt;/p&gt;
&lt;p&gt;But here&apos;s the thing: writing that comes from genuine curiosity is almost always interesting, even when it&apos;s imperfect. Readers can tell the difference between someone exploring an idea honestly and someone performing expertise.&lt;/p&gt;
&lt;p&gt;I&apos;d rather read a thoughtful wrong take than a polished summary of conventional wisdom.&lt;/p&gt;
&lt;p&gt;So I keep writing. Not because I have answers, but because writing is how I find them.&lt;/p&gt;
</content:encoded></item><item><title>View Transitions API first impressions</title><link>https://anchit.me/notes/view-transitions/</link><guid isPermaLink="true">https://anchit.me/notes/view-transitions/</guid><description>View Transitions API first impressions</description><pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The View Transitions API makes page transitions trivially easy. Astro supports it out of the box with &lt;code&gt;&amp;lt;ViewTransitions /&amp;gt;&lt;/code&gt;. The browser handles the cross-fade and you can customize with CSS. It feels like magic.&lt;/p&gt;
</content:encoded></item><item><title>The :has() selector is a game changer</title><link>https://anchit.me/notes/has-selector/</link><guid isPermaLink="true">https://anchit.me/notes/has-selector/</guid><description>The :has() selector is a game changer</description><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;:has()&lt;/code&gt; is the parent selector CSS never had. You can now style a parent based on its children: &lt;code&gt;article:has(img)&lt;/code&gt; targets articles that contain images. The days of adding modifier classes just for styling context are over.&lt;/p&gt;
</content:encoded></item><item><title>The Debugging Mindset</title><link>https://anchit.me/blog/debugging-mindset/</link><guid isPermaLink="true">https://anchit.me/blog/debugging-mindset/</guid><description>Why the best debuggers aren&apos;t the ones who know the most — they&apos;re the ones who question the best.</description><pubDate>Sat, 10 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Debugging is not about knowing the answer. It&apos;s about knowing which questions to ask. The best debuggers I&apos;ve worked with share a common trait: they resist the urge to jump to conclusions. Instead, they slow down, form hypotheses, and systematically eliminate possibilities.&lt;/p&gt;
&lt;p&gt;There&apos;s a parallel to scientific thinking here. You don&apos;t prove your theory right — you try to prove it wrong. Every bug is a mystery, and every mystery deserves a method.&lt;/p&gt;
</content:encoded></item><item><title>Modern CLI tools written in Rust</title><link>https://anchit.me/notes/cli-tools-rust/</link><guid isPermaLink="true">https://anchit.me/notes/cli-tools-rust/</guid><description>Modern CLI tools written in Rust</description><pubDate>Thu, 08 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The new generation of CLI tools is fast. ripgrep over grep, fd over find, bat over cat, eza over ls, delta for git diffs. All written in Rust, all dramatically faster and more user-friendly than their predecessors.&lt;/p&gt;
</content:encoded></item><item><title>Native CSS nesting is here</title><link>https://anchit.me/notes/css-nesting/</link><guid isPermaLink="true">https://anchit.me/notes/css-nesting/</guid><description>Native CSS nesting is here</description><pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Native CSS nesting has shipped in all major browsers. You can now write nested selectors without a preprocessor. The syntax is slightly different from Sass — you need &lt;code&gt;&amp;amp;&lt;/code&gt; for non-element selectors — but the mental model is the same.&lt;/p&gt;
</content:encoded></item><item><title>Monorepo tradeoffs in practice</title><link>https://anchit.me/notes/monorepo-tradeoffs/</link><guid isPermaLink="true">https://anchit.me/notes/monorepo-tradeoffs/</guid><description>Monorepo tradeoffs in practice</description><pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Monorepos make cross-cutting changes easy and dependency management simple. But they also make CI slower, git history noisier, and ownership boundaries fuzzier. The right choice depends on your team size and how often packages change together.&lt;/p&gt;
</content:encoded></item><item><title>On Simplicity</title><link>https://anchit.me/blog/on-simplicity/</link><guid isPermaLink="true">https://anchit.me/blog/on-simplicity/</guid><description>Simple isn&apos;t easy. Thoughts on why the simplest solution is usually the hardest to find.</description><pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every junior developer wants to write clever code. Every senior developer wants to write simple code. The difference isn&apos;t skill — it&apos;s taste. Simple code is hard because it requires you to truly understand the problem before you start solving it.&lt;/p&gt;
</content:encoded></item><item><title>Always respect prefers-reduced-motion</title><link>https://anchit.me/notes/prefers-reduced-motion/</link><guid isPermaLink="true">https://anchit.me/notes/prefers-reduced-motion/</guid><description>Always respect prefers-reduced-motion</description><pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you add animations to your site, wrap them in a &lt;code&gt;prefers-reduced-motion&lt;/code&gt; check. Some users have vestibular disorders that make motion genuinely nauseating. One media query is all it takes to be respectful.&lt;/p&gt;
</content:encoded></item><item><title>In Praise of Friction</title><link>https://anchit.me/blog/friction-in-workflows/</link><guid isPermaLink="true">https://anchit.me/blog/friction-in-workflows/</guid><description>Not all friction is bad. Sometimes the resistance in your workflow is doing important work.</description><pubDate>Thu, 20 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We spend a lot of time removing friction from our tools and workflows. Faster builds, instant deploys, one-click everything. But sometimes friction is a feature, not a bug. The pause before you push to production. The review before you merge. These moments of resistance give us space to think.&lt;/p&gt;
</content:encoded></item><item><title>On writing small functions</title><link>https://anchit.me/notes/small-functions/</link><guid isPermaLink="true">https://anchit.me/notes/small-functions/</guid><description>On writing small functions</description><pubDate>Thu, 20 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A function should do one thing. If you can&apos;t name it clearly, it&apos;s probably doing too much. Small functions are easier to test, easier to read, and easier to replace. The overhead of a function call is negligible; the overhead of a confused reader is not.&lt;/p&gt;
</content:encoded></item><item><title>The Popover API replaces a lot of JS</title><link>https://anchit.me/notes/popover-api/</link><guid isPermaLink="true">https://anchit.me/notes/popover-api/</guid><description>The Popover API replaces a lot of JS</description><pubDate>Sat, 08 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The Popover API (&lt;code&gt;popover&lt;/code&gt; attribute + &lt;code&gt;popovertarget&lt;/code&gt;) handles tooltips, dropdowns, and popovers with zero JavaScript. It manages z-index stacking, light-dismiss behavior, and focus. Another win for the platform.&lt;/p&gt;
</content:encoded></item><item><title>Learning in Public</title><link>https://anchit.me/blog/learning-in-public/</link><guid isPermaLink="true">https://anchit.me/blog/learning-in-public/</guid><description>Why sharing what you learn — even when you&apos;re wrong — is one of the best career decisions you can make.</description><pubDate>Tue, 28 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The idea of learning in public used to terrify me. What if I&apos;m wrong? What if someone who knows more reads this and thinks I&apos;m an idiot? But here&apos;s the thing: being wrong in public is one of the fastest ways to get right.&lt;/p&gt;
</content:encoded></item><item><title>Structured logging saves debugging time</title><link>https://anchit.me/notes/structured-logging/</link><guid isPermaLink="true">https://anchit.me/notes/structured-logging/</guid><description>Structured logging saves debugging time</description><pubDate>Sat, 25 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Stop logging strings. Log structured objects with consistent fields: timestamp, level, message, context. When something breaks at 3am, you&apos;ll be grateful you can filter by &lt;code&gt;user_id&lt;/code&gt; instead of grepping through prose.&lt;/p&gt;
</content:encoded></item><item><title>CSS cascade layers solve specificity wars</title><link>https://anchit.me/notes/cascade-layers/</link><guid isPermaLink="true">https://anchit.me/notes/cascade-layers/</guid><description>CSS cascade layers solve specificity wars</description><pubDate>Wed, 15 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;@layer&lt;/code&gt; lets you control the order of cascade precedence explicitly. Put your reset in a low-priority layer, component styles in the middle, and utilities on top. No more &lt;code&gt;!important&lt;/code&gt; hacks.&lt;/p&gt;
</content:encoded></item><item><title>Bun&apos;s test runner is surprisingly good</title><link>https://anchit.me/notes/bun-test/</link><guid isPermaLink="true">https://anchit.me/notes/bun-test/</guid><description>Bun&apos;s test runner is surprisingly good</description><pubDate>Wed, 08 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;bun test&lt;/code&gt; is Jest-compatible but orders of magnitude faster. It supports TypeScript natively, has built-in mocking, and snapshot testing just works. For most projects there&apos;s no reason to reach for a separate test framework.&lt;/p&gt;
</content:encoded></item><item><title>The Case for Small Pull Requests</title><link>https://anchit.me/blog/small-prs/</link><guid isPermaLink="true">https://anchit.me/blog/small-prs/</guid><description>Why smaller PRs lead to better code, faster reviews, and fewer production incidents.</description><pubDate>Sun, 05 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The single biggest improvement most teams can make to their code review process is reducing PR size. Large PRs get rubber-stamped. Small PRs get thoughtful feedback. The math is simple: reviewers have finite attention, and the quality of review degrades exponentially with size.&lt;/p&gt;
</content:encoded></item><item><title>OKLCH is the color space we needed</title><link>https://anchit.me/notes/oklch-colors/</link><guid isPermaLink="true">https://anchit.me/notes/oklch-colors/</guid><description>OKLCH is the color space we needed</description><pubDate>Sun, 28 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;OKLCH gives you perceptually uniform colors. Unlike HSL, changing the lightness value in OKLCH actually looks like the same amount of change across hues. This makes generating consistent color palettes trivially easy.&lt;/p&gt;
</content:encoded></item><item><title>Type Systems as Documentation</title><link>https://anchit.me/blog/type-systems-as-documentation/</link><guid isPermaLink="true">https://anchit.me/blog/type-systems-as-documentation/</guid><description>How a good type system replaces half your documentation and all of your runtime errors.</description><pubDate>Thu, 18 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The best documentation is the kind that can&apos;t go stale. Comments lie. READMEs drift. But types? Types are checked by the compiler every single time you build. A well-designed type system doesn&apos;t just catch errors — it communicates intent.&lt;/p&gt;
</content:encoded></item><item><title>The &lt;dialog&gt; element handles modals properly</title><link>https://anchit.me/notes/html-dialog/</link><guid isPermaLink="true">https://anchit.me/notes/html-dialog/</guid><description>The &lt;dialog&gt; element handles modals properly</description><pubDate>Mon, 15 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; with &lt;code&gt;showModal()&lt;/code&gt; gives you focus trapping, backdrop, Escape to close, and proper accessibility — all built into the platform. Stop building modal components from scratch.&lt;/p&gt;
</content:encoded></item><item><title>The Temporal API is coming to replace Date</title><link>https://anchit.me/notes/temporal-api/</link><guid isPermaLink="true">https://anchit.me/notes/temporal-api/</guid><description>The Temporal API is coming to replace Date</description><pubDate>Mon, 01 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;JavaScript&apos;s &lt;code&gt;Date&lt;/code&gt; object is famously broken. The Temporal API fixes everything: immutable objects, proper timezone support, duration arithmetic, and no more month-indexing-from-zero surprises.&lt;/p&gt;
</content:encoded></item><item><title>Why Side Projects Matter</title><link>https://anchit.me/blog/side-projects-matter/</link><guid isPermaLink="true">https://anchit.me/blog/side-projects-matter/</guid><description>Side projects aren&apos;t just for fun — they&apos;re where you develop taste and take risks you can&apos;t at work.</description><pubDate>Fri, 22 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The best engineers I know all have side projects. Not because they&apos;re workaholics, but because side projects give you a space to experiment without consequences. You can try that weird architecture, use that new framework, or build something purely for the joy of building.&lt;/p&gt;
</content:encoded></item><item><title>CSS Anchor Positioning is wild</title><link>https://anchit.me/notes/anchor-positioning/</link><guid isPermaLink="true">https://anchit.me/notes/anchor-positioning/</guid><description>CSS Anchor Positioning is wild</description><pubDate>Wed, 20 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;CSS Anchor Positioning lets you tether an element to another element without JavaScript. Tooltips, dropdowns, popovers — all positionable relative to their trigger with pure CSS. The &lt;code&gt;anchor()&lt;/code&gt; function is the future of layout.&lt;/p&gt;
</content:encoded></item><item><title>SQLite is the most deployed database in the world</title><link>https://anchit.me/notes/sqlite-everywhere/</link><guid isPermaLink="true">https://anchit.me/notes/sqlite-everywhere/</guid><description>SQLite is the most deployed database in the world</description><pubDate>Sun, 10 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;SQLite runs on every phone, every browser, and most embedded devices. It&apos;s also increasingly viable as a production web database with tools like Litestream and LiteFS for replication. Sometimes the simplest solution really is the best.&lt;/p&gt;
</content:encoded></item><item><title>Naming Things Well</title><link>https://anchit.me/blog/naming-things/</link><guid isPermaLink="true">https://anchit.me/blog/naming-things/</guid><description>The hardest problem in computer science, and some practical heuristics for getting it right.</description><pubDate>Fri, 01 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Phil Karlton said there are only two hard things in computer science: cache invalidation and naming things. He was right about naming. A good name is a tiny act of communication — it tells the next developer (or your future self) exactly what something does without having to read the implementation.&lt;/p&gt;
</content:encoded></item><item><title>Web Components finally make sense</title><link>https://anchit.me/notes/web-components/</link><guid isPermaLink="true">https://anchit.me/notes/web-components/</guid><description>Web Components finally make sense</description><pubDate>Mon, 28 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Web Components had a rough start, but with Declarative Shadow DOM and the ElementInternals API, they&apos;re genuinely useful now. Great for design system primitives that need to work across frameworks.&lt;/p&gt;
</content:encoded></item><item><title>JSDoc types as a TypeScript alternative</title><link>https://anchit.me/notes/jsdoc-types/</link><guid isPermaLink="true">https://anchit.me/notes/jsdoc-types/</guid><description>JSDoc types as a TypeScript alternative</description><pubDate>Tue, 15 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You can get full TypeScript type checking in plain JavaScript files using JSDoc annotations. No build step, no compilation, just &lt;code&gt;// @ts-check&lt;/code&gt; at the top of your file. Perfect for small projects where a full TS setup is overkill.&lt;/p&gt;
</content:encoded></item><item><title>Reading Code Is a Skill</title><link>https://anchit.me/blog/reading-code/</link><guid isPermaLink="true">https://anchit.me/blog/reading-code/</guid><description>We teach people to write code but rarely to read it. That&apos;s a problem.</description><pubDate>Sat, 12 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Most developers spend far more time reading code than writing it. Yet we almost never practice reading deliberately. We don&apos;t study other people&apos;s code the way writers study other writers&apos; prose. We should.&lt;/p&gt;
</content:encoded></item><item><title>@scope is the CSS scoping we always wanted</title><link>https://anchit.me/notes/scope-css/</link><guid isPermaLink="true">https://anchit.me/notes/scope-css/</guid><description>@scope is the CSS scoping we always wanted</description><pubDate>Tue, 01 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;@scope (.card) to (.card-content)&lt;/code&gt; lets you scope styles to a subtree of the DOM with a lower boundary. No more BEM naming conventions or CSS modules just to avoid conflicts. The platform is catching up.&lt;/p&gt;
</content:encoded></item><item><title>Defaults Matter More Than You Think</title><link>https://anchit.me/blog/defaults-matter/</link><guid isPermaLink="true">https://anchit.me/blog/defaults-matter/</guid><description>Why the default configuration of your tools shapes your entire workflow — and your team&apos;s culture.</description><pubDate>Wed, 25 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Most people never change the defaults. This is true of everything from phone settings to framework configurations. The people who set defaults wield enormous power — they&apos;re making decisions on behalf of everyone who never opens the settings page.&lt;/p&gt;
</content:encoded></item><item><title>The light-dark() CSS function simplifies theming</title><link>https://anchit.me/notes/light-dark-function/</link><guid isPermaLink="true">https://anchit.me/notes/light-dark-function/</guid><description>The light-dark() CSS function simplifies theming</description><pubDate>Wed, 18 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;light-dark(#fff, #111)&lt;/code&gt; returns the first value in light mode and the second in dark mode. Combine with &lt;code&gt;color-scheme: light dark&lt;/code&gt; and you can theme an entire site without media queries or class toggling.&lt;/p&gt;
</content:encoded></item><item><title>All Abstractions Leak</title><link>https://anchit.me/blog/abstractions-leak/</link><guid isPermaLink="true">https://anchit.me/blog/abstractions-leak/</guid><description>Joel Spolsky was right. Every abstraction eventually forces you to understand the layer beneath it.</description><pubDate>Tue, 10 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Joel Spolsky coined the Law of Leaky Abstractions in 2002, and it&apos;s as true today as ever. TCP pretends to be reliable until packet loss spikes. ORMs pretend SQL doesn&apos;t exist until you hit a slow query. React pretends the DOM is cheap until you render ten thousand items.&lt;/p&gt;
</content:encoded></item><item><title>htmx makes SPAs feel unnecessary</title><link>https://anchit.me/notes/htmx-simplicity/</link><guid isPermaLink="true">https://anchit.me/notes/htmx-simplicity/</guid><description>htmx makes SPAs feel unnecessary</description><pubDate>Thu, 05 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;htmx lets you add AJAX, CSS transitions, and WebSockets with HTML attributes. No JavaScript framework needed. For content-heavy sites with some interactivity, it&apos;s dramatically simpler than the React/Vue/Svelte path.&lt;/p&gt;
</content:encoded></item><item><title>Technical Debt Is a Bad Metaphor</title><link>https://anchit.me/blog/technical-debt-metaphor/</link><guid isPermaLink="true">https://anchit.me/blog/technical-debt-metaphor/</guid><description>The &apos;debt&apos; framing makes engineers think about trade-offs wrong. Here&apos;s a better way to think about it.</description><pubDate>Wed, 28 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ward Cunningham&apos;s original metaphor was about shipping early to learn faster. Somewhere along the way it became an excuse for writing bad code. Real technical debt is a strategic choice. Most of what we call debt is just mess.&lt;/p&gt;
</content:encoded></item><item><title>Edge computing isn&apos;t always faster</title><link>https://anchit.me/notes/edge-computing/</link><guid isPermaLink="true">https://anchit.me/notes/edge-computing/</guid><description>Edge computing isn&apos;t always faster</description><pubDate>Thu, 22 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Running code at the edge reduces latency for static responses. But if your edge function needs to talk to a database in us-east-1, you&apos;ve just added a hop. Edge is great for caching and transformation, less great for data-heavy operations.&lt;/p&gt;
</content:encoded></item><item><title>Start with a Monolith</title><link>https://anchit.me/blog/monoliths-first/</link><guid isPermaLink="true">https://anchit.me/blog/monoliths-first/</guid><description>Microservices are a scaling strategy, not a starting point. Most teams should start with a monolith.</description><pubDate>Thu, 15 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The allure of microservices is strong. Independent deployments, team autonomy, technology diversity. But the costs are real: distributed tracing, eventual consistency, network partitions. If you don&apos;t have the problems microservices solve, you just have the problems they create.&lt;/p&gt;
</content:encoded></item><item><title>Signals are taking over frontend reactivity</title><link>https://anchit.me/notes/signals-pattern/</link><guid isPermaLink="true">https://anchit.me/notes/signals-pattern/</guid><description>Signals are taking over frontend reactivity</description><pubDate>Thu, 08 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Signals are fine-grained reactive primitives. Solid, Preact, Angular, and now a TC39 proposal. Unlike React&apos;s model of re-rendering entire component trees, signals update only the specific DOM nodes that depend on changed values.&lt;/p&gt;
</content:encoded></item><item><title>Writing Tests First Changed How I Design</title><link>https://anchit.me/blog/writing-tests-first/</link><guid isPermaLink="true">https://anchit.me/blog/writing-tests-first/</guid><description>TDD isn&apos;t about testing — it&apos;s about design. Writing tests first forces you to think about interfaces before implementations.</description><pubDate>Wed, 30 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I resisted TDD for years. It felt slow and backwards. Then I tried it properly for a month and something clicked. When you write the test first, you&apos;re forced to think about what your code should do before you think about how it does it.&lt;/p&gt;
</content:encoded></item><item><title>CSS subgrid aligns nested grids perfectly</title><link>https://anchit.me/notes/subgrid/</link><guid isPermaLink="true">https://anchit.me/notes/subgrid/</guid><description>CSS subgrid aligns nested grids perfectly</description><pubDate>Fri, 25 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;grid-template-rows: subgrid&lt;/code&gt; lets a child grid inherit track sizing from its parent. Card layouts where titles, descriptions, and footers all align across cards — finally possible without hacks.&lt;/p&gt;
</content:encoded></item><item><title>Going Keyboard-Driven</title><link>https://anchit.me/blog/keyboard-driven/</link><guid isPermaLink="true">https://anchit.me/blog/keyboard-driven/</guid><description>How switching to a keyboard-driven workflow changed my relationship with my computer.</description><pubDate>Sat, 12 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I spent a month trying to minimize mouse usage. Vim keybindings everywhere, tiling window managers, terminal-first workflows. The learning curve was brutal but the payoff was real — not just speed, but a sense of flow I hadn&apos;t felt before.&lt;/p&gt;
</content:encoded></item><item><title>Streaming HTML is underappreciated</title><link>https://anchit.me/notes/streaming-html/</link><guid isPermaLink="true">https://anchit.me/notes/streaming-html/</guid><description>Streaming HTML is underappreciated</description><pubDate>Thu, 10 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;HTTP streaming lets the browser start rendering before the full response arrives. Frameworks like Remix and Astro use this to show a shell immediately while slow data loads. First paint happens in milliseconds instead of seconds.&lt;/p&gt;
</content:encoded></item><item><title>Testing Library&apos;s philosophy is right</title><link>https://anchit.me/notes/testing-library/</link><guid isPermaLink="true">https://anchit.me/notes/testing-library/</guid><description>Testing Library&apos;s philosophy is right</description><pubDate>Fri, 28 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&quot;The more your tests resemble the way your software is used, the more confidence they can give you.&quot; Testing Library encourages querying by role, label, and text — not by CSS class or test ID. Tests that test behavior, not implementation.&lt;/p&gt;
</content:encoded></item><item><title>Why Software Estimation Is Broken</title><link>https://anchit.me/blog/estimating-software/</link><guid isPermaLink="true">https://anchit.me/blog/estimating-software/</guid><description>We keep getting estimates wrong because we&apos;re estimating the wrong thing.</description><pubDate>Tue, 25 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Software estimation fails because we estimate effort instead of uncertainty. A task isn&apos;t hard because it takes many hours — it&apos;s hard because we don&apos;t know what we don&apos;t know. The honest answer to most estimates is a probability distribution, not a number.&lt;/p&gt;
</content:encoded></item><item><title>Scroll-driven animations in pure CSS</title><link>https://anchit.me/notes/scroll-driven-animations/</link><guid isPermaLink="true">https://anchit.me/notes/scroll-driven-animations/</guid><description>Scroll-driven animations in pure CSS</description><pubDate>Sat, 15 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;animation-timeline: scroll()&lt;/code&gt; ties animations to scroll position with zero JavaScript. Progress bars, parallax effects, reveal animations — all declarative. The performance is excellent because it runs on the compositor thread.&lt;/p&gt;
</content:encoded></item><item><title>Choose Boring Technology</title><link>https://anchit.me/blog/boring-technology/</link><guid isPermaLink="true">https://anchit.me/blog/boring-technology/</guid><description>Dan McKinley was right. Innovation tokens are limited. Spend them wisely.</description><pubDate>Mon, 10 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every company gets about three innovation tokens. Spend them on the things that differentiate your product, not on your build system. PostgreSQL, Rails, React — these are boring, and boring is a feature. Boring means documented, understood, and battle-tested.&lt;/p&gt;
</content:encoded></item><item><title>Deno 2 goes all-in on Node compatibility</title><link>https://anchit.me/notes/deno-2/</link><guid isPermaLink="true">https://anchit.me/notes/deno-2/</guid><description>Deno 2 goes all-in on Node compatibility</description><pubDate>Sat, 01 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Deno 2 supports &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;node_modules&lt;/code&gt;, and npm packages natively. The friction of migration is nearly gone. You get TypeScript, linting, formatting, and testing built in — no &lt;code&gt;tsconfig.json&lt;/code&gt;, no eslint, no jest config.&lt;/p&gt;
</content:encoded></item><item><title>Building a Healthy Code Review Culture</title><link>https://anchit.me/blog/code-review-culture/</link><guid isPermaLink="true">https://anchit.me/blog/code-review-culture/</guid><description>Code review is a social process disguised as a technical one. The culture around it matters more than the tools.</description><pubDate>Thu, 20 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The difference between a team that loves code review and one that dreads it comes down to culture. Is the goal to find faults or to share knowledge? Do reviewers ask questions or make demands? The tone of your review comments shapes your entire engineering culture.&lt;/p&gt;
</content:encoded></item><item><title>WebAssembly components are the future of plugins</title><link>https://anchit.me/notes/wasm-components/</link><guid isPermaLink="true">https://anchit.me/notes/wasm-components/</guid><description>WebAssembly components are the future of plugins</description><pubDate>Sat, 15 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The WebAssembly Component Model lets you write plugins in any language and run them sandboxed. No FFI, no shared memory bugs, just well-typed interfaces. Extism and Spin are already building plugin systems on this foundation.&lt;/p&gt;
</content:encoded></item><item><title>Progressive Enhancement Still Matters</title><link>https://anchit.me/blog/progressive-enhancement/</link><guid isPermaLink="true">https://anchit.me/blog/progressive-enhancement/</guid><description>Build for the baseline first. Layer on enhancements. Your users on flaky connections will thank you.</description><pubDate>Wed, 05 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Progressive enhancement isn&apos;t about supporting IE6. It&apos;s about building resilient experiences that work even when things go wrong — slow networks, failed scripts, disabled JavaScript. The web is inherently unreliable. Build for that reality.&lt;/p&gt;
</content:encoded></item><item><title>Refactoring Without Fear</title><link>https://anchit.me/blog/on-refactoring/</link><guid isPermaLink="true">https://anchit.me/blog/on-refactoring/</guid><description>Good tests make refactoring safe. Good architecture makes refactoring rare. You need both.</description><pubDate>Sat, 18 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The secret to confident refactoring is a good test suite. Not 100% coverage — that&apos;s a vanity metric. But tests that describe behavior, not implementation. When your tests are coupled to your code structure, refactoring means rewriting tests too, and that defeats the purpose.&lt;/p&gt;
</content:encoded></item><item><title>Documentation-Driven Development</title><link>https://anchit.me/blog/documentation-driven/</link><guid isPermaLink="true">https://anchit.me/blog/documentation-driven/</guid><description>Write the docs before the code. If you can&apos;t explain it simply, you don&apos;t understand it well enough.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Before I write a line of code, I write the README. Not a polished document — just enough to describe what the thing does, how to use it, and why it exists. If the README is hard to write, the design needs more thought.&lt;/p&gt;
</content:encoded></item><item><title>API Design Is Interface Design</title><link>https://anchit.me/blog/api-design/</link><guid isPermaLink="true">https://anchit.me/blog/api-design/</guid><description>An API is a user interface for developers. The same design principles apply.</description><pubDate>Fri, 20 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We think of APIs as technical artifacts, but they&apos;re really design artifacts. Consistency, discoverability, sensible defaults, good error messages — these are the same principles that make a good GUI. Your API&apos;s users are developers, and they deserve good UX too.&lt;/p&gt;
</content:encoded></item><item><title>A Simple Git Workflow That Scales</title><link>https://anchit.me/blog/git-workflow/</link><guid isPermaLink="true">https://anchit.me/blog/git-workflow/</guid><description>Trunk-based development with short-lived branches. No gitflow, no ceremony, just shipping.</description><pubDate>Thu, 05 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;After trying gitflow, GitHub flow, and various hybrids, I&apos;ve settled on the simplest approach: a main branch, short-lived feature branches, and frequent merges. No develop branch, no release branches. Just small changes shipped often.&lt;/p&gt;
</content:encoded></item><item><title>CSS Is More Powerful Than You Think</title><link>https://anchit.me/blog/css-is-powerful/</link><guid isPermaLink="true">https://anchit.me/blog/css-is-powerful/</guid><description>Modern CSS can do things that used to require JavaScript. It&apos;s time to update your mental model.</description><pubDate>Mon, 18 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every year I&apos;m surprised by what CSS can do without JavaScript. Scroll-driven animations, container queries, :has() selectors, subgrid, layer cascading. The language has evolved dramatically and most developers are still writing CSS like it&apos;s 2018.&lt;/p&gt;
</content:encoded></item><item><title>Escaping Dependency Hell</title><link>https://anchit.me/blog/dependency-hell/</link><guid isPermaLink="true">https://anchit.me/blog/dependency-hell/</guid><description>The more dependencies you have, the less you own your software. Here&apos;s how to be intentional about it.</description><pubDate>Fri, 01 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every dependency is a bet. You&apos;re betting that someone else will maintain it, that it won&apos;t introduce breaking changes, and that it won&apos;t have security vulnerabilities. Some bets are worth taking. Many aren&apos;t. The left-pad incident taught us nothing.&lt;/p&gt;
</content:encoded></item><item><title>Observability Is Not Just Logging</title><link>https://anchit.me/blog/observability/</link><guid isPermaLink="true">https://anchit.me/blog/observability/</guid><description>Logs, metrics, and traces are the three pillars — but understanding how they connect is what gives you observability.</description><pubDate>Tue, 15 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You can have a million log lines and still be blind when production breaks. Observability isn&apos;t about the volume of data — it&apos;s about being able to ask arbitrary questions of your system. Structured logs, dimensional metrics, and distributed traces form a triangle that lets you navigate from symptom to cause.&lt;/p&gt;
</content:encoded></item><item><title>Pair Programming Done Right</title><link>https://anchit.me/blog/pair-programming/</link><guid isPermaLink="true">https://anchit.me/blog/pair-programming/</guid><description>Pair programming isn&apos;t two people sharing a keyboard. It&apos;s a skill that requires deliberate practice.</description><pubDate>Tue, 01 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Most pair programming fails because people treat it as an obligation rather than a technique. Good pairing has rhythm: driver and navigator, ping-pong TDD, mob sessions for design. Bad pairing is one person typing while the other checks Slack.&lt;/p&gt;
</content:encoded></item><item><title>Error Handling Deserves More Thought</title><link>https://anchit.me/blog/error-handling/</link><guid isPermaLink="true">https://anchit.me/blog/error-handling/</guid><description>Happy paths are easy. The quality of your software is determined by how well you handle the unhappy ones.</description><pubDate>Sun, 15 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Error handling is where most software falls apart. Not because developers don&apos;t write try-catch blocks, but because they don&apos;t think about what should actually happen when things go wrong. A generic error page is not error handling — it&apos;s error hiding.&lt;/p&gt;
</content:encoded></item><item><title>Set a Performance Budget</title><link>https://anchit.me/blog/performance-budget/</link><guid isPermaLink="true">https://anchit.me/blog/performance-budget/</guid><description>If you don&apos;t measure performance, you can&apos;t manage it. A budget gives your team a shared target.</description><pubDate>Sun, 01 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Performance degrades slowly, one dependency at a time. A performance budget is a line in the sand: your JavaScript bundle can&apos;t exceed 200KB, your Largest Contentful Paint can&apos;t exceed 2.5 seconds. Without a budget, every sprint adds weight and nobody notices until it&apos;s too late.&lt;/p&gt;
</content:encoded></item><item><title>Writing Good Changelogs</title><link>https://anchit.me/blog/writing-changelogs/</link><guid isPermaLink="true">https://anchit.me/blog/writing-changelogs/</guid><description>A changelog is a letter to your future self and your users. Treat it with the care it deserves.</description><pubDate>Thu, 15 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A good changelog tells you what changed, why it changed, and what you need to do about it. &quot;Bug fixes and improvements&quot; is not a changelog entry — it&apos;s an admission that you don&apos;t respect your users&apos; time. Keep a changelog. Write it for humans.&lt;/p&gt;
</content:encoded></item></channel></rss>