<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Martin Frič — Writing</title>
    <link>https://martinfric.dev/blog/</link>
    <atom:link href="https://martinfric.dev/feed.xml" rel="self" type="application/rss+xml"/>
    <description>Technical essays on backend architecture, workflow engines, multi-tenancy, AI-augmented development, and the practical realities of running a small system in a regulated market.</description>
    <language>en-us</language>
    <lastBuildDate>Fri, 15 May 2026 00:00:00 GMT</lastBuildDate>
    <generator>hand-rolled</generator>

    <item>
      <title>Why we built our own workflow engine instead of using Temporal</title>
      <link>https://martinfric.dev/blog/posts/workflow-engine-why-not-temporal</link>
      <guid isPermaLink="true">https://martinfric.dev/blog/posts/workflow-engine-why-not-temporal</guid>
      <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
      <description>The case for entity-is-state workflow engines in modular monoliths, and why a JSON-config-driven state machine beat external orchestration for our regulated-market use case.</description>
    </item>

    <item>
      <title>Multi-tenant RLS with AsyncLocalStorage in NestJS</title>
      <link>https://martinfric.dev/blog/posts/multi-tenant-rls-als-nestjs</link>
      <guid isPermaLink="true">https://martinfric.dev/blog/posts/multi-tenant-rls-als-nestjs</guid>
      <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
      <description>How to wire Postgres Row-Level Security through every authenticated request using AsyncLocalStorage, transaction-bound sessions, and a single guard — without leaking tenant filters into business logic.</description>
    </item>

    <item>
      <title>Bridging Result&lt;T,E&gt; with TypeORM transactions using a sentinel</title>
      <link>https://martinfric.dev/blog/posts/result-pattern-transaction-rollback</link>
      <guid isPermaLink="true">https://martinfric.dev/blog/posts/result-pattern-transaction-rollback</guid>
      <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
      <description>The no-throw rule in domain/application layers conflicts with TypeORM's throw-to-rollback contract. Here's the sentinel pattern we use to bridge them without leaking exceptions into use cases.</description>
    </item>

    <item>
      <title>When forwardRef becomes a saga: planning module extraction in a modular monolith</title>
      <link>https://martinfric.dev/blog/posts/modular-monolith-extraction-saga</link>
      <guid isPermaLink="true">https://martinfric.dev/blog/posts/modular-monolith-extraction-saga</guid>
      <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
      <description>Cross-module atomic writes via NestJS forwardRef work in-process and break across processes. Saga, outbox, inbox — and why 2PC is usually wrong. The honest cost of extraction and how to plan for it from day one.</description>
    </item>

    <item>
      <title>Claim-state CAS: solving non-idempotent actions in a workflow engine</title>
      <link>https://martinfric.dev/blog/posts/claim-state-cas-primitive</link>
      <guid isPermaLink="true">https://martinfric.dev/blog/posts/claim-state-cas-primitive</guid>
      <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
      <description>Optimistic locking catches double-write, not double-action. A config-driven CAS primitive plus a per-module janitor closes the gap for steps with non-idempotent side effects.</description>
    </item>

    <item>
      <title>Six months of production: what I've learned</title>
      <link>https://martinfric.dev/blog/posts/pilot-case-study</link>
      <guid isPermaLink="true">https://martinfric.dev/blog/posts/pilot-case-study</guid>
      <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
      <description>A retrospective on running a modular-monolith energy-community platform through its first six months in production — what survived contact with real users, what didn't, and what 150+ metering points told me that no design review could have.</description>
    </item>

    <item>
      <title>ADR-driven solo development: 38 decisions, one architect</title>
      <link>https://martinfric.dev/blog/posts/adr-driven-solo-dev</link>
      <guid isPermaLink="true">https://martinfric.dev/blog/posts/adr-driven-solo-dev</guid>
      <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
      <description>Architecture Decision Records are usually a team artifact. They're arguably more valuable solo — they're how you negotiate with your future self about choices your present self can't remember making.</description>
    </item>

    <item>
      <title>AI as multiplier, discipline as durability</title>
      <link>https://martinfric.dev/blog/posts/ai-multiplier-discipline-durability</link>
      <guid isPermaLink="true">https://martinfric.dev/blog/posts/ai-multiplier-discipline-durability</guid>
      <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
      <description>The rules I wrote for myself to make AI a 20x multiplier instead of a lottery: CLAUDE.md as constitution, ADRs as decision graph, memory as persistent context, automation as workflow encoding. Plus why this discipline raises the bus factor instead of lowering it.</description>
    </item>

    <item>
      <title>Three nights of AI: anatomy of a side project</title>
      <link>https://martinfric.dev/blog/posts/three-nights-of-ai-anatomy</link>
      <guid isPermaLink="true">https://martinfric.dev/blog/posts/three-nights-of-ai-anatomy</guid>
      <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
      <description>Anatomy of an AI-augmented sprint-orchestration and code-review dashboard built in three evenings. DDD-lite, branded value objects, a self-learning triage loop, a JSON repair pipeline worth lifting, and a dual-backend AI abstraction — with the rough edges named honestly. Companion piece to the AI-multiplier essay.</description>
    </item>

  </channel>
</rss>
