<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>zemnanet</title><link>https://zemna.net/</link><description>Recent content on zemnanet</description><generator>Hugo</generator><language>en</language><lastBuildDate>Tue, 16 Jun 2026 18:00:00 +0700</lastBuildDate><atom:link href="https://zemna.net/index.xml" rel="self" type="application/rss+xml"/><item><title>How I Dissected 54 Design Systems and Transplanted Linear.app DNA Into My Hugo Blog in One Day</title><link>https://zemna.net/posts/linear-design-system-hugo/</link><pubDate>Tue, 16 Jun 2026 18:00:00 +0700</pubDate><guid>https://zemna.net/posts/linear-design-system-hugo/</guid><description>&lt;p>This morning I opened my blog and thought: this looks like a 2015 Tistory template. So I told my Hermes agent, in exactly these words: &amp;ldquo;This looks like garbage. Go through all 54 design systems and rebuild it with the best one.&amp;rdquo;&lt;/p>
&lt;p>It did.&lt;/p>
&lt;h2 id="why-linearapp-won-out-of-54">Why Linear.app Won Out of 54&lt;/h2>
&lt;p>The &lt;code>popular-web-designs&lt;/code> skill in Hermes has templates for 54 real-world design systems — Stripe, Linear, Vercel, Notion, Figma, and 49 others. The agent loaded them all and surfaced five recommendations:&lt;/p></description></item><item><title>Colophon</title><link>https://zemna.net/colophon/</link><pubDate>Tue, 16 Jun 2026 00:00:00 +0000</pubDate><guid>https://zemna.net/colophon/</guid><description>&lt;h1 id="colophon">Colophon&lt;/h1>
&lt;p>This page documents the &lt;strong>how&lt;/strong> of zemnanet — what the site is built with, what tools run it, and why those choices were made.&lt;/p>
&lt;h2 id="stack">Stack&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Layer&lt;/th>
 &lt;th>Tool&lt;/th>
 &lt;th>Why&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Site generator&lt;/strong>&lt;/td>
 &lt;td>&lt;a href="https://gohugo.io/">Hugo&lt;/a> v0.140 extended&lt;/td>
 &lt;td>Go single binary, sub-second builds, no Node toolchain&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Hosting&lt;/strong>&lt;/td>
 &lt;td>&lt;a href="https://pages.cloudflare.com/">Cloudflare Pages&lt;/a>&lt;/td>
 &lt;td>Free, global CDN, zemna.net already on Cloudflare&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Domain&lt;/strong>&lt;/td>
 &lt;td>&lt;a href="https://zemna.net">zemna.net&lt;/a> on Cloudflare Registrar&lt;/td>
 &lt;td>Same provider, no extra DNS hops&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Content&lt;/strong>&lt;/td>
 &lt;td>Markdown + Hugo frontmatter&lt;/td>
 &lt;td>Plain text, version-controlled, AI-friendly&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Versioning&lt;/strong>&lt;/td>
 &lt;td>Git on &lt;a href="https://github.com/zemnanet">GitHub&lt;/a>&lt;/td>
 &lt;td>Public history, no vendor lock-in&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Deployment&lt;/strong>&lt;/td>
 &lt;td>git push to &lt;code>main&lt;/code> → Cloudflare Pages build&lt;/td>
 &lt;td>Zero-config CI; the only &amp;ldquo;ops&amp;rdquo; is git&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Search&lt;/strong>&lt;/td>
 &lt;td>Pagefind (planned)&lt;/td>
 &lt;td>Static index, runs at build time, no JS framework&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="typography">Typography&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Inter&lt;/strong> for UI, navigation, and English headlines — open source, broad weight range, readable at small sizes.&lt;/li>
&lt;li>&lt;strong>Noto Serif KR&lt;/strong> for Korean editorial content — open source, designed for the Korean script.&lt;/li>
&lt;li>&lt;strong>JetBrains Mono&lt;/strong> for code — ligatures for &lt;code>=&amp;gt;&lt;/code> and &lt;code>!=&lt;/code>, tabular numerals.&lt;/li>
&lt;/ul>
&lt;h2 id="colors">Colors&lt;/h2>
&lt;p>Three brand colors, derived from a synthesis of &lt;strong>Korean hanji&lt;/strong> (off-white) and &lt;strong>Indonesian batik&lt;/strong> (navy + vermilion). Full palette and semantic mappings live in the &lt;a href="https://zemna.net/design-system/">design system&lt;/a>.&lt;/p></description></item><item><title>Design System</title><link>https://zemna.net/design-system/</link><pubDate>Tue, 16 Jun 2026 00:00:00 +0000</pubDate><guid>https://zemna.net/design-system/</guid><description>&lt;h1 id="zemnanet-design-system">zemnanet Design System&lt;/h1>
&lt;p>A single source of truth for the &lt;strong>visual&lt;/strong> and &lt;strong>typographic&lt;/strong> language used across:&lt;/p>
&lt;ul>
&lt;li>zemna.net (this website)&lt;/li>
&lt;li>Blog posts and series&lt;/li>
&lt;li>Social media graphics (IG carousels, X headers, podcast covers)&lt;/li>
&lt;li>Any presentation, README, or tool that says &amp;ldquo;zemnanet&amp;rdquo; on it&lt;/li>
&lt;/ul>
&lt;p>The system is &lt;strong>token-first&lt;/strong> — every visual decision is a named token. No hard-coded values in templates. No drift between surfaces.&lt;/p>
&lt;h2 id="tokens">Tokens&lt;/h2>
&lt;p>The token set lives in the theme source at &lt;code>themes/zemnanet-theme/assets/css/tokens.css&lt;/code>. The production build publishes the minified CSS custom properties at &lt;a href="https://zemna.net/css/tokens.min.css">&lt;code>/css/tokens.min.css&lt;/code>&lt;/a>.&lt;/p></description></item><item><title>The quiet consolidation in Korean dev tooling</title><link>https://zemna.net/posts/the-quiet-consolidation-in-korean-dev-tooling/</link><pubDate>Tue, 16 Jun 2026 00:00:00 +0000</pubDate><guid>https://zemna.net/posts/the-quiet-consolidation-in-korean-dev-tooling/</guid><description>&lt;p>The Korean developer-tools market has historically been fragmented. Dozens of small teams shipping one thing well, each with its own API, its own auth model, its own quirks. That era is ending.&lt;/p>
&lt;p>In the last twelve months, three acquisitions have reshaped the landscape:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>A messaging-platform SDK vendor&lt;/strong> absorbed by a larger payment provider — for the auth layer, not the messaging.&lt;/li>
&lt;li>&lt;strong>A monitoring vendor&lt;/strong> rolled up into a CI/CD platform. The monitoring product is now a feature flag.&lt;/li>
&lt;li>&lt;strong>A Korean-built serverless runtime&lt;/strong> was acquired by a Japanese cloud company. The runtime will continue to ship, but the SDKs now match the parent&amp;rsquo;s other products.&lt;/li>
&lt;/ol>
&lt;h2 id="what-this-means-for-users">What this means for users&lt;/h2>
&lt;p>If you&amp;rsquo;re building on Korean dev tools, three practical changes are coming:&lt;/p></description></item><item><title>Stop reaching for a state library</title><link>https://zemna.net/posts/stop-reaching-for-a-state-library/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://zemna.net/posts/stop-reaching-for-a-state-library/</guid><description>&lt;p>Every JavaScript codebase I&amp;rsquo;ve touched in the last two years has had a state-management library somewhere in &lt;code>package.json&lt;/code>. Most of them didn&amp;rsquo;t need one.&lt;/p>
&lt;p>Here&amp;rsquo;s the test: &lt;strong>does your state need to outlive a single function call?&lt;/strong> If the answer is &amp;ldquo;no&amp;rdquo; for 80% of your state, you don&amp;rsquo;t need a library. You need a function.&lt;/p>
&lt;h2 id="the-pattern-that-replaces-90-of-state-libraries">The pattern that replaces 90% of state libraries&lt;/h2>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// store.js — 12 lines, no dependencies
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kr">const&lt;/span> &lt;span class="nx">stores&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">Map&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">export&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="nx">createStore&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">name&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">initial&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">stores&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">has&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">name&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">stores&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">name&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">let&lt;/span> &lt;span class="nx">value&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">initial&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">subscribers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">Set&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">store&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">get&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">set&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">next&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">value&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">typeof&lt;/span> &lt;span class="nx">next&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="s2">&amp;#34;function&amp;#34;&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="nx">next&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="nx">next&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">subscribers&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">forEach&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="nx">fn&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="nx">fn&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">subscribe&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">fn&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">subscribers&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">fn&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="nx">subscribers&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">delete&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">fn&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">stores&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">name&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">store&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nx">store&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>That&amp;rsquo;s it. You get a shared, observable, type-safe-enough value holder. It works in any runtime. It works in tests. It works on the server.&lt;/p></description></item><item><title>The Indonesian developer scene is having its Linux moment</title><link>https://zemna.net/posts/the-indonesian-developer-scene-is-having-its-linux-moment/</link><pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate><guid>https://zemna.net/posts/the-indonesian-developer-scene-is-having-its-linux-moment/</guid><description>&lt;p>I&amp;rsquo;ve been in Jakarta long enough to have watched the Indonesian tech scene go through three hype cycles. The current one is different — and more durable — because it&amp;rsquo;s not being driven by outside attention.&lt;/p>
&lt;h2 id="whats-happening">What&amp;rsquo;s happening&lt;/h2>
&lt;p>Five things that weren&amp;rsquo;t true five years ago:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>A Bahasa Indonesia programming language&lt;/strong> has a working compiler, a small but committed user base, and a project that ships monthly.&lt;/li>
&lt;li>&lt;strong>A Go-based web framework&lt;/strong> designed for Indonesia&amp;rsquo;s specific deployment constraints (intermittent connectivity, low-end VMs) is being adopted in Vietnam and the Philippines, not just locally.&lt;/li>
&lt;li>&lt;strong>An Indonesian-led open-source database&lt;/strong> crossed 10K GitHub stars without ever being posted on Hacker News.&lt;/li>
&lt;li>&lt;strong>Local meetup culture is institutional.&lt;/strong> A &amp;ldquo;Tech in Bahasa&amp;rdquo; monthly event in Bandung has outlasted three major tech-industry layoffs.&lt;/li>
&lt;li>&lt;strong>Government adoption.&lt;/strong> The Indonesian Ministry of Communication has published open-source tools (in Bahasa) for internal use, and they&amp;rsquo;re being forked by local universities.&lt;/li>
&lt;/ol>
&lt;h2 id="why-it-matters">Why it matters&lt;/h2>
&lt;p>The pattern here is the same one that took Linux from &amp;ldquo;hobbyist kernel&amp;rdquo; to &amp;ldquo;everything runs on it&amp;rdquo;:&lt;/p></description></item><item><title>A pragmatic review of Hermes Agent after six months</title><link>https://zemna.net/posts/a-pragmatic-review-of-hermes-agent-after-six-months/</link><pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate><guid>https://zemna.net/posts/a-pragmatic-review-of-hermes-agent-after-six-months/</guid><description>&lt;p>I have been running Hermes as my primary AI agent for about six months. This is a pragmatic review — not sponsored, not a teardown. Just notes from daily use.&lt;/p>
&lt;h2 id="what-it-is-and-what-it-isnt">What it is, and what it isn&amp;rsquo;t&lt;/h2>
&lt;p>Hermes is a &lt;strong>personal AI agent&lt;/strong>. It runs locally, talks to a CLI, a Telegram bot, a Slack workspace, a TUI, and a desktop app — all from the same core. It has skills, memory, scheduled jobs, and the ability to spawn sub-agents.&lt;/p></description></item><item><title>Why I'm no longer worried about AI replacing senior developers</title><link>https://zemna.net/posts/why-im-no-longer-worried-about-ai-replacing-senior-developers/</link><pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate><guid>https://zemna.net/posts/why-im-no-longer-worried-about-ai-replacing-senior-developers/</guid><description>&lt;p>There&amp;rsquo;s a genre of LinkedIn post that goes: &amp;ldquo;AI will replace senior developers because seniors are slower, more expensive, and refuse to learn new tools.&amp;rdquo;&lt;/p>
&lt;p>I have been watching this play out in actual engineering teams for two years. It is not what&amp;rsquo;s happening.&lt;/p>
&lt;h2 id="what-the-data-actually-shows">What the data actually shows&lt;/h2>
&lt;p>Three observations from teams I&amp;rsquo;ve worked with or observed closely:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>AI tooling accelerates junior-to-mid transitions.&lt;/strong> A junior with good AI tooling can do mid-level work in a year instead of three. This is real, and it&amp;rsquo;s good.&lt;/li>
&lt;li>&lt;strong>AI tooling does not close the senior gap.&lt;/strong> A senior is not someone who writes code faster. A senior is someone who knows which code not to write, which abstractions to refuse, and which trade-offs are actually load-bearing for a specific business. AI doesn&amp;rsquo;t help with that. It actively makes it worse by making it cheap to write more code than the problem requires.&lt;/li>
&lt;li>&lt;strong>The most expensive failures are now AI-augmented failures.&lt;/strong> A junior with AI tooling can now ship a confidently-wrong architecture decision at a speed that previously required a senior&amp;rsquo;s review. The senior&amp;rsquo;s job has shifted: less &amp;ldquo;write the system,&amp;rdquo; more &amp;ldquo;stop the system from being written wrong.&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;h2 id="the-frame-that-makes-this-make-sense">The frame that makes this make sense&lt;/h2>
&lt;p>The mistake is treating &amp;ldquo;senior&amp;rdquo; as a function of years. It&amp;rsquo;s not. &lt;strong>Senior is a function of context.&lt;/strong> A senior developer carries an inarticulate, mostly-unwritten model of:&lt;/p></description></item><item><title>About</title><link>https://zemna.net/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zemna.net/about/</guid><description>&lt;h2 id="hi--im-shinjae-kang">Hi — I&amp;rsquo;m &lt;strong>Shinjae Kang&lt;/strong>&lt;/h2>
&lt;p>A senior software developer based in &lt;strong>Jakarta, Indonesia&lt;/strong> for the past 15 years.&lt;/p>
&lt;p>I write here about &lt;strong>IT, AI, and the developer tooling&lt;/strong> I use day to day, with a particular focus on the bridge between &lt;strong>Korean tech&lt;/strong> and &lt;strong>Southeast Asian tech&lt;/strong> — two ecosystems that move in similar ways but rarely talk to each other directly.&lt;/p>
&lt;h3 id="what-this-site-is">What this site is&lt;/h3>
&lt;ul>
&lt;li>A long-running personal blog (1 post per day, every day)&lt;/li>
&lt;li>An English-first publication; the &lt;a href="https://zemna.net/ko/">Korean mirror&lt;/a> and &lt;a href="https://zemna.net/id/">Bahasa Indonesia mirror&lt;/a> are auto-generated&lt;/li>
&lt;li>A working lab for the &lt;a href="https://zemna.net/design-system/">zemnanet design system&lt;/a> and the zemnanet content pipeline&lt;/li>
&lt;/ul>
&lt;h3 id="what-this-site-is-not">What this site is not&lt;/h3>
&lt;ul>
&lt;li>A company blog. There&amp;rsquo;s no company.&lt;/li>
&lt;li>A paid newsletter. No sponsors, no ads, no affiliate links.&lt;/li>
&lt;li>A posting-everything firehose. Quality gates run on every post before it ships.&lt;/li>
&lt;/ul>
&lt;h3 id="where-else-to-find-me">Where else to find me&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>X (Twitter)&lt;/strong> — &lt;a href="https://x.com/zemnanet">@zemnanet&lt;/a>&lt;/li>
&lt;li>&lt;strong>Instagram&lt;/strong> — &lt;a href="https://instagram.com/zemna">@zemna&lt;/a>&lt;/li>
&lt;li>&lt;strong>GitHub&lt;/strong> — &lt;a href="https://github.com/zemna">zemna&lt;/a>&lt;/li>
&lt;li>&lt;strong>Email&lt;/strong> — &lt;a href="mailto:zemna@zemna.net">zemna@zemna.net&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="disclosure">Disclosure&lt;/h3>
&lt;p>Some posts on this site are drafted with AI assistance. The text, opinions, code samples, and final edits are mine. When AI assistance is more than mechanical (e.g. it suggested a research direction), the post will say so in a note at the bottom.&lt;/p></description></item></channel></rss>