<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>sade.dev</title><description>Notes and developer tools on backend, system design, PostgreSQL, Redis, Laravel and AI-assisted engineering.</description><link>https://sade.dev/</link><language>en-US</language><item><title>The Serverless Migration Decision: Cold-Start and Vendor Lock-in</title><link>https://sade.dev/en/notes/serverless-migration-decision/</link><guid isPermaLink="true">https://sade.dev/en/notes/serverless-migration-decision/</guid><description>Before you move to FaaS: the real cost of cold-start latency, vendor lock-in risk, and the workloads where serverless actually pays off</description><pubDate>Sat, 11 Jul 2026 00:00:00 GMT</pubDate><category>serverless</category><category>architecture</category><category>cloud</category><category>Note</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>The BFF Pattern: A Separate API Layer for Mobile and Web</title><link>https://sade.dev/en/notes/bff-backend-for-frontend/</link><guid isPermaLink="true">https://sade.dev/en/notes/bff-backend-for-frontend/</guid><description>Separate API layers for mobile and web: the hidden cost of bending one API to fit every client, and when a BFF is actually warranted</description><pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate><category>architecture</category><category>api</category><category>bff</category><category>Note</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Synchronous or Asynchronous? The Line Between HTTP and the Queue</title><link>https://sade.dev/en/notes/sync-vs-async/</link><guid isPermaLink="true">https://sade.dev/en/notes/sync-vs-async/</guid><description>Should a job run inside the HTTP request or go to a queue? The decision line, drawn through response time, fault tolerance, and consistency</description><pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate><category>architecture</category><category>queue</category><category>async</category><category>api</category><category>Note</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Transactional Outbox: Dual-Write, At-Least-Once, and Idempotent Consumption</title><link>https://sade.dev/en/systems/transactional-outbox-dual-write-and-idempotent-consumption/</link><guid isPermaLink="true">https://sade.dev/en/systems/transactional-outbox-dual-write-and-idempotent-consumption/</guid><description>Writing to the database but failing to put the event on the queue: closing dual-write with an outbox, suppressing the at-least-once repeats it creates, and encrypting the field.</description><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><category>architecture</category><category>messaging</category><category>idempotency</category><category>reliability</category><category>security</category><category>System</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Event-Driven Architecture: When It Saves You, When It Adds Complexity</title><link>https://sade.dev/en/notes/when-event-driven-architecture/</link><guid isPermaLink="true">https://sade.dev/en/notes/when-event-driven-architecture/</guid><description>The price of loose coupling through events: balancing the flexibility it buys against the risk of making your system&apos;s flow impossible to trace</description><pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate><category>architecture</category><category>event-driven</category><category>messaging</category><category>Note</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>GPU FinOps with eBPF</title><link>https://sade.dev/en/systems/gpu-finops-with-ebpf/</link><guid isPermaLink="true">https://sade.dev/en/systems/gpu-finops-with-ebpf/</guid><description>Why GPU spend is invisible to cgroup and cAdvisor metrics, and how eBPF attributes GPU time and memory to teams for chargeback — with the honest limit at the CUDA boundary that DCGM has to cover.</description><pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate><category>ebpf</category><category>gpu</category><category>finops</category><category>observability</category><category>kubernetes</category><category>System</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Zero Static Authority in Multi-Cluster GitOps</title><link>https://sade.dev/en/systems/zero-static-authority-multi-cluster-gitops/</link><guid isPermaLink="true">https://sade.dev/en/systems/zero-static-authority-multi-cluster-gitops/</guid><description>GitOps across many Kubernetes clusters with no long-lived kubeconfig or token. SPIFFE IDs, SPIRE-issued short-lived SVIDs, trust-domain federation — the order to build it in, and what each step costs.</description><pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate><category>kubernetes</category><category>gitops</category><category>spiffe</category><category>security</category><category>architecture</category><category>System</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Replaying a Dead-Letter Queue Without Making It Worse</title><link>https://sade.dev/en/notes/replaying-a-dead-letter-queue/</link><guid isPermaLink="true">https://sade.dev/en/notes/replaying-a-dead-letter-queue/</guid><description>The DLQ filled up during an outage and you want it back. Naive replay re-poisons the queue or double-fires side effects. The safe shape: reset, dry-run, sandbox-first, select.</description><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate><category>queue</category><category>dead-letter-queue</category><category>reliability</category><category>operations</category><category>architecture</category><category>Note</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Distributed Tracing Across a Polyglot Queue</title><link>https://sade.dev/en/systems/polyglot-queue-distributed-tracing/</link><guid isPermaLink="true">https://sade.dev/en/systems/polyglot-queue-distributed-tracing/</guid><description>A message crosses PHP, Go and Python over a frozen envelope. Turning its journey into one OpenTelemetry trace with no new field and no core dependency — and the honest limit of that.</description><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate><category>opentelemetry</category><category>observability</category><category>distributed-tracing</category><category>messaging</category><category>architecture</category><category>System</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Validating the Schema at the Edge of the Queue</title><link>https://sade.dev/en/notes/validate-schema-at-the-edge/</link><guid isPermaLink="true">https://sade.dev/en/notes/validate-schema-at-the-edge/</guid><description>A message&apos;s data is an untyped contract the queue won&apos;t check. Validate it at the edge: producer-side before publish, consumer-side as a safety net, against a per-URN schema</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><category>queue</category><category>schema</category><category>reliability</category><category>architecture</category><category>Note</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Your Architecture Decisions Rot Because Nothing Runs Them</title><link>https://sade.dev/en/journal/architecture-decisions-rot/</link><guid isPermaLink="true">https://sade.dev/en/journal/architecture-decisions-rot/</guid><description>An architecture decision written in a wiki is a wish. The boundaries you can&apos;t enforce are the ones that quietly erode — until the diagram stops matching the code. Make the rule executable</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><category>architecture</category><category>governance</category><category>opinion</category><category>Journal</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Idempotency: When the Same Message Arrives Twice</title><link>https://sade.dev/en/notes/idempotency-duplicate-delivery/</link><guid isPermaLink="true">https://sade.dev/en/notes/idempotency-duplicate-delivery/</guid><description>At-least-once delivery means a handler will see the same message twice. The idempotency key, where it comes from, and the dedupe that survives a crash</description><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate><category>queue</category><category>reliability</category><category>architecture</category><category>async</category><category>Note</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>AI Didn&apos;t Remove the Bottleneck — It Moved It</title><link>https://sade.dev/en/journal/ai-didnt-remove-the-bottleneck/</link><guid isPermaLink="true">https://sade.dev/en/journal/ai-didnt-remove-the-bottleneck/</guid><description>Cheap code production doesn&apos;t raise throughput if review, integration, and verification can&apos;t keep up. The bottleneck just moves downstream — and that&apos;s where the work now is</description><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate><category>ai-workflow</category><category>productivity</category><category>opinion</category><category>Journal</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Flaky Tests: Retrying Isn&apos;t a Fix</title><link>https://sade.dev/en/journal/flaky-tests-and-determinism/</link><guid isPermaLink="true">https://sade.dev/en/journal/flaky-tests-and-determinism/</guid><description>AI made writing tests nearly free and flaky suites exploded. Why retry and quarantine are a treadmill, and what catches flakiness deterministically</description><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate><category>testing</category><category>ci</category><category>ai</category><category>quality</category><category>Journal</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Schema Evolution: Changing a Contract Without Breaking It</title><link>https://sade.dev/en/journal/schema-evolution-without-breaking/</link><guid isPermaLink="true">https://sade.dev/en/journal/schema-evolution-without-breaking/</guid><description>A message&apos;s data shape is a contract across services you can&apos;t change atomically. The rule: additive is safe, a breaking change needs a new identity — and consumers upgrade first</description><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate><category>architecture</category><category>schema</category><category>queue</category><category>opinion</category><category>Journal</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Can You Ship Vibe-Coded Software to Production?</title><link>https://sade.dev/en/journal/can-you-ship-vibe-coded-to-production/</link><guid isPermaLink="true">https://sade.dev/en/journal/can-you-ship-vibe-coded-to-production/</guid><description>Vibe coding lowers the cost of a first version, not the cost of being wrong. That bill arrives in production, not at build time — and it depends on whose hands shipped it.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><category>ai-workflow</category><category>vibe-coding</category><category>production</category><category>architecture</category><category>opinion</category><category>Journal</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Layered Architecture or Clean Architecture?</title><link>https://sade.dev/en/journal/layered-vs-clean-architecture/</link><guid isPermaLink="true">https://sade.dev/en/journal/layered-vs-clean-architecture/</guid><description>Why the classic layered structure is enough for most projects while we drown in abstraction layers, and when Clean Architecture actually pays off.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><category>architecture</category><category>clean-architecture</category><category>simplicity</category><category>opinion</category><category>Journal</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>The Production Cost of &quot;Just-in-Case&quot; Code</title><link>https://sade.dev/en/journal/the-cost-of-just-in-case-code/</link><guid isPermaLink="true">https://sade.dev/en/journal/the-cost-of-just-in-case-code/</guid><description>Applying YAGNI in practice: the price of adding flexibility you don&apos;t need today, repaid daily in maintenance, readability, and bug surface</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><category>architecture</category><category>simplicity</category><category>decisions</category><category>opinion</category><category>Journal</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Race Conditions and Gaps in Sequential Numbering: JIT Reservation</title><link>https://sade.dev/en/systems/race-conditions-and-gaps-in-sequential-numbering/</link><guid isPermaLink="true">https://sade.dev/en/systems/race-conditions-and-gaps-in-sequential-numbering/</guid><description>Generating legally sequential, gap-free numbers with parallel workers: the JIT reservation pattern that solves race conditions and gaps together</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><category>architecture</category><category>production</category><category>concurrency</category><category>queue</category><category>idempotency</category><category>System</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>When I Move to Microservices</title><link>https://sade.dev/en/journal/when-i-move-to-microservices/</link><guid isPermaLink="true">https://sade.dev/en/journal/when-i-move-to-microservices/</guid><description>The measured signals that justify moving from a monolith to a distributed architecture — and the common false reasons that say it&apos;s still too early</description><pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate><category>architecture</category><category>microservices</category><category>decisions</category><category>opinion</category><category>Journal</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Gitflow or GitHub Flow? How I Choose</title><link>https://sade.dev/en/journal/gitflow-vs-github-flow/</link><guid isPermaLink="true">https://sade.dev/en/journal/gitflow-vs-github-flow/</guid><description>Practical criteria for picking a branching strategy by product model, version count, and deploy rhythm — and how each model breaks in the wrong place.</description><pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate><category>git</category><category>workflow</category><category>branching</category><category>decisions</category><category>opinion</category><category>Journal</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>When I Switch to Trunk-Based Development</title><link>https://sade.dev/en/journal/when-i-switch-to-trunk-based/</link><guid isPermaLink="true">https://sade.dev/en/journal/when-i-switch-to-trunk-based/</guid><description>Why release branches break for high-frequency deploy teams and how much of trunk-based is really discipline — the thresholds I cross and the ones I don&apos;t</description><pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate><category>git</category><category>workflow</category><category>deploy</category><category>decisions</category><category>opinion</category><category>Journal</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Why I Start Projects With a Modular Monolith</title><link>https://sade.dev/en/journal/why-i-start-with-a-modular-monolith/</link><guid isPermaLink="true">https://sade.dev/en/journal/why-i-start-with-a-modular-monolith/</guid><description>The case for drawing clean module boundaries inside a single deployable app before jumping to microservices — and when I stop doing it.</description><pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate><category>architecture</category><category>modular-monolith</category><category>decisions</category><category>opinion</category><category>Journal</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Scale Breaking Points in Data-Intensive Systems</title><link>https://sade.dev/en/systems/data-intensive-systems-breaking-points/</link><guid isPermaLink="true">https://sade.dev/en/systems/data-intensive-systems-breaking-points/</guid><description>As data load grows, where does boring architecture break? Working set, read replicas, partitioning, write load and a separate data layer — the breaking points in order, and what each one costs</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><category>postgresql</category><category>architecture</category><category>production</category><category>scaling</category><category>replication</category><category>System</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Why I Prefer Boring Architecture</title><link>https://sade.dev/en/journal/why-boring-architecture/</link><guid isPermaLink="true">https://sade.dev/en/journal/why-boring-architecture/</guid><description>The pragmatic case for choosing proven tools over chasing new technology. This is not cowardice, it is a budget decision.</description><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate><category>architecture</category><category>decisions</category><category>opinion</category><category>Journal</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Namespace Isolation for a Shared Redis</title><link>https://sade.dev/en/notes/shared-redis-namespace-isolation/</link><guid isPermaLink="true">https://sade.dev/en/notes/shared-redis-namespace-isolation/</guid><description>The pattern I use to avoid key collisions and TTL accidents when a single Redis instance is shared across several projects</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><category>redis</category><category>production</category><category>architecture</category><category>Note</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>My AI-Assisted Engineering Workflow</title><link>https://sade.dev/en/journal/ai-assisted-engineering-workflow/</link><guid isPermaLink="true">https://sade.dev/en/journal/ai-assisted-engineering-workflow/</guid><description>The seven rules I follow to use Claude Code and similar agents on production code with confidence — not a skeptic, a discipline manifesto</description><pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate><category>ai-workflow</category><category>productivity</category><category>opinion</category><category>Journal</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>A PostgreSQL Backup Strategy with pgBackRest</title><link>https://sade.dev/en/notes/pgbackrest-postgresql-backup-strategy/</link><guid isPermaLink="true">https://sade.dev/en/notes/pgbackrest-postgresql-backup-strategy/</guid><description>pg_dump alone is not a backup. A PITR-capable, compressed, verifiable backup architecture with pgBackRest</description><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate><category>postgresql</category><category>backup</category><category>production</category><category>pgbackrest</category><category>Note</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Why Do Laravel Queues Slow Down in Production?</title><link>https://sade.dev/en/notes/laravel-queue-production-slowdown/</link><guid isPermaLink="true">https://sade.dev/en/notes/laravel-queue-production-slowdown/</guid><description>Laravel queue workers are flawless locally and slow in production. The five most common reasons developers overlook</description><pubDate>Sun, 03 May 2026 00:00:00 GMT</pubDate><category>laravel</category><category>queue</category><category>production</category><category>redis</category><category>Note</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Multiple Projects on a Single VPS</title><link>https://sade.dev/en/systems/single-vps-multi-project-architecture/</link><guid isPermaLink="true">https://sade.dev/en/systems/single-vps-multi-project-architecture/</guid><description>One VPS, several independent apps. Deliberate minimalism over Kubernetes: user isolation, separate PHP-FPM pools, shared PostgreSQL/Redis, a plain deploy.</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate><category>vps</category><category>architecture</category><category>nginx</category><category>postgresql</category><category>redis</category><category>System</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Nginx + PHP-FPM Pool Separation</title><link>https://sade.dev/en/notes/nginx-php-fpm-pool-separation/</link><guid isPermaLink="true">https://sade.dev/en/notes/nginx-php-fpm-pool-separation/</guid><description>The concrete benefits of defining a separate pool per application instead of a single PHP-FPM pool when running multiple PHP apps on one VPS</description><pubDate>Sun, 26 Apr 2026 00:00:00 GMT</pubDate><category>nginx</category><category>php-fpm</category><category>production</category><category>vps</category><category>Note</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Laravel Production Stack</title><link>https://sade.dev/en/systems/laravel-production-stack/</link><guid isPermaLink="true">https://sade.dev/en/systems/laravel-production-stack/</guid><description>A production-grade Laravel setup with Nginx + PHP-FPM + Redis + PostgreSQL + Supervisor + Horizon. Each piece job and what you lose if you drop it</description><pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate><category>laravel</category><category>php</category><category>production</category><category>architecture</category><category>System</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item><item><title>Multiple DB Users with pgBouncer auth_query</title><link>https://sade.dev/en/notes/pgbouncer-auth-query/</link><guid isPermaLink="true">https://sade.dev/en/notes/pgbouncer-auth-query/</guid><description>A practical setup for dynamic user authentication via `auth_query` instead of `userlist.txt` when running pgBouncer</description><pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate><category>postgresql</category><category>pgbouncer</category><category>production</category><category>Note</category><author>info@muhammetsafak.com.tr (Muhammet Şafak)</author></item></channel></rss>