<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Momo Engineering Journal</title><link>/</link><description>Recent content on Momo Engineering Journal</description><image><title>Momo Engineering Journal</title><url>/images/og-image.png</url><link>/images/og-image.png</link></image><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 28 Oct 2026 17:47:15 -0600</lastBuildDate><atom:link href="/index.xml" rel="self" type="application/rss+xml"/><item><title>R10 Phase 4: S3 Object Lock — WORM That Actually Refuses Deletes</title><link>/posts/060-r10-object-lock/</link><pubDate>Wed, 28 Oct 2026 12:00:00 +0000</pubDate><guid>/posts/060-r10-object-lock/</guid><description>Object Lock is the S3 feature regulated workloads ask for first: write-once-read-many retention that the storage server itself enforces, not a policy the client promises to honor. This phase gives momo bucket-level lock enablement at creation, per-version retention and legal holds, and a delete path that answers 403 instead of quietly removing bytes. Teaches: how COMPLIANCE and GOVERNANCE differ in who can override them, why lock state must live beside the version record rather than inside object metadata, and which parts of AWS&amp;rsquo;s surface momo deliberately does not pretend to implement.</description></item><item><title>R10 Phase 3: S3 Notification — Event-Driven Webhooks on CAS</title><link>/posts/059-r10-notification/</link><pubDate>Wed, 21 Oct 2026 07:14:25 +0000</pubDate><guid>/posts/059-r10-notification/</guid><description>Implemented S3 bucket notification configurations with real webhook delivery, prefix/suffix filtering, exponential-backoff retries, and all six S3 event types — so backup tools and pipelines can react to object changes instead of polling. Teaches: why a notification dispatcher that returns nil without sending is the trap to watch for, and how events stay honest across plain PUT, multipart, and delete paths.</description></item><item><title>S3 Lifecycle Rules on a Content-Addressed Store: Time as a First-Class Dimension</title><link>/posts/058-s3-lifecycle-on-cas/</link><pubDate>Wed, 21 Oct 2026 03:35:13 +0000</pubDate><guid>/posts/058-s3-lifecycle-on-cas/</guid><description>Lifecycle rules are the first feature that makes momo delete data on a schedule rather than on request — which turns age, storage class, and delete markers into correctness problems. This post walks through the expiration and transition engine, why a background worker is the only safe place to run it, and how expiration composes with versioning&amp;rsquo;s delete markers.</description></item><item><title>⚡ Bolt: Zero-Allocation SigV4 Canonical Headers</title><link>/posts/057-bolt-sigv4-zero-alloc-headers/</link><pubDate>Thu, 15 Oct 2026 11:43:50 +0000</pubDate><guid>/posts/057-bolt-sigv4-zero-alloc-headers/</guid><description>Every authenticated S3 request rebuilds a SigV4 canonical-headers block — and the two obvious ways to write it (strings.Split and Header.Get) each allocate on the hottest authorization path. This post walks through replacing both with an IndexByte scan and an EqualFold lookup, and the golden-equivalence test that proves the rewrite is byte-identical for every request AWS clients actually send.</description></item><item><title>S3 Versioning on a Content-Addressed Store: Two Kinds of Identity</title><link>/posts/056-s3-versioning-on-cas/</link><pubDate>Sun, 11 Oct 2026 08:56:13 +0000</pubDate><guid>/posts/056-s3-versioning-on-cas/</guid><description>Why S3 versioning and content-addressed storage seem to conflict — mutation identity vs content identity — and how momo keeps both: UUIDv4 version records pointing at deduplicated blobs, delete markers that shadow without deleting, and pagination that can only be computed after sorting. Teaches: the real semantics backup tools depend on, and where the version chain deliberately stops being distributed.</description></item><item><title>⚡ Bolt: Zero-Allocation Parsing of ETag Lists</title><link>/posts/052-bolt-etag-matches-zero-alloc/</link><pubDate>Tue, 06 Oct 2026 11:16:37 +0000</pubDate><guid>/posts/052-bolt-etag-matches-zero-alloc/</guid><description>How we removed the heap allocation from ETag list parsing on the S3 conditional-request path by replacing strings.Split with a strings.IndexByte scan. Teaches: what If-Match/If-None-Match actually carry, why Split allocates per request, and how a microbenchmark proves the win.</description></item><item><title>🐜 Adaptive Systems: Ant-Colony Routing and Epigenetic Concurrency</title><link>/posts/052-adaptive-systems-foundations/</link><pubDate>Tue, 06 Oct 2026 05:19:24 +0000</pubDate><guid>/posts/052-adaptive-systems-foundations/</guid><description>How Momo replaces static concurrency limits and rigid replica selection with bio-inspired adaptive mechanisms: Ant Colony pheromone-based replica exploration and Epigenetic host-capacity admission.</description></item><item><title>Packing Small Objects into Superblocks: O(1) Reads Without Per-Blob Inodes</title><link>/posts/055-adaptive-volume-storage/</link><pubDate>Tue, 06 Oct 2026 02:44:44 +0000</pubDate><guid>/posts/055-adaptive-volume-storage/</guid><description>Why millions of small files per directory collapse a filesystem, and how a SeaweedFS-style volume layout fixes it: append-only superblocks, 8-byte-aligned needles with CRC32C frames, hole-punching deletion, and crash recovery by truncation. Teaches: the real cost of per-blob files, why alignment beats variable-length framing, and how to make crash recovery O(1).</description></item><item><title>⚡ Bolt: Zero-Allocation Parsing of AWS Chunked Headers</title><link>/posts/051-bolt-aws-chunked-zero-alloc/</link><pubDate>Thu, 01 Oct 2026 11:32:41 +0000</pubDate><guid>/posts/051-bolt-aws-chunked-zero-alloc/</guid><description>How we removed the last heap allocation from the aws-chunked ingest path by replacing strings.Split and strings.TrimPrefix with a strings.IndexByte scan. Teaches: what a streaming S3 upload body looks like, why Split allocates per chunk, and how a microbenchmark proves the win.</description></item><item><title>Eliminating Redundant Time Formats: Slicing for Speed</title><link>/posts/049-eliminate-redundant-time-format-allocations/</link><pubDate>Sat, 12 Sep 2026 00:00:00 +0000</pubDate><guid>/posts/049-eliminate-redundant-time-format-allocations/</guid><description>By replacing a second &lt;code&gt;time.Format&lt;/code&gt; call with a simple string slice (&lt;code&gt;amzDate[:8]&lt;/code&gt;), we eliminated redundant heap allocations and CPU overhead when generating timestamps for AWS SigV4 requests.</description></item><item><title>⚡ Bolt: Eliminating the Last Remaining S3 XML Time Allocation</title><link>/posts/048-bolt-listparts-appendformat/</link><pubDate>Tue, 08 Sep 2026 11:29:58 +0000</pubDate><guid>/posts/048-bolt-listparts-appendformat/</guid><description>How we eliminated the final per-response heap allocation in S3 XML rendering by swapping time.Format for time.AppendFormat in the ListParts handler. Teaches: the stack-buffer time formatting pattern, why Format allocates, and how microbenchmarks prove the win.</description></item><item><title>FUSE Transport: Migrating to go-fuse/v2</title><link>/posts/029-fuse-go-fuse-v2-migration/</link><pubDate>Tue, 01 Sep 2026 18:40:07 +0000</pubDate><guid>/posts/029-fuse-go-fuse-v2-migration/</guid><description>The momofs FUSE mount traded its hand-rolled bazil.org/fuse adapter for the go-fuse/v2 high-level fs API, mapped all 22 node callbacks to go-fuse interfaces, and deprecated consistency=cached.</description></item><item><title>⚡ Bolt: Zero-Allocation Last-Modified Headers</title><link>/posts/045-bolt-lastmodified-header/</link><pubDate>Tue, 01 Sep 2026 11:19:08 +0000</pubDate><guid>/posts/045-bolt-lastmodified-header/</guid><description>time.Format allocates a fresh string on every S3 GET/HEAD response. Swapping to time.AppendFormat drops that heap escape to zero — measured 32 B/op saved per request on the hottest read path.</description></item><item><title>⚡ Bolt: Eliminating Time Formatting Allocations in S3 HTTP Responses</title><link>/posts/047-bolt-s3-copyresult-time-alloc/</link><pubDate>Sun, 30 Aug 2026 11:20:58 +0000</pubDate><guid>/posts/047-bolt-s3-copyresult-time-alloc/</guid><description>How we optimized S3 XML responses by replacing time.Format with time.AppendFormat to eliminate heap allocations. Teaches: stack-buffer time formatting pattern, hot path identification via pprof.</description></item><item><title>R4: momofs FUSE Transport — Mounting Momo as a Filesystem</title><link>/posts/023-momofs-fuse-transport/</link><pubDate>Fri, 28 Aug 2026 15:57:34 +0000</pubDate><guid>/posts/023-momofs-fuse-transport/</guid><description>The FUSE transport (&lt;code&gt;momo -imp fs&lt;/code&gt;): bazil.org/fuse binding, per-handle buffered writes, /dev/fuse-gated e2e, and a clean unmount lifecycle.</description></item><item><title>The Benchstat Gauntlet: Performance Regressions as CI</title><link>/posts/025-benchmark-benchstat-gate/</link><pubDate>Fri, 28 Aug 2026 00:32:50 +0000</pubDate><guid>/posts/025-benchmark-benchstat-gate/</guid><description>Base-vs-branch benchmark comparison gates every PR — plus the runner-noise saga (S3PutSpool, LocalWrite, allowlist, apostrophe) that made it honest.</description></item><item><title>R4: momofs — POSIX Core Over the CAS Store</title><link>/posts/022-momofs-posix-core/</link><pubDate>Thu, 27 Aug 2026 22:40:31 +0000</pubDate><guid>/posts/022-momofs-posix-core/</guid><description>The R4 POSIX core: inodes as content-addressed manifests, files as blobs, atomic rename, hardlinks, permission enforcement — a filesystem on momo.</description></item><item><title>R3: Write Durability — fsync-Before-Ack, Survivor Quorum</title><link>/posts/021-r3-write-durability-quorum/</link><pubDate>Thu, 27 Aug 2026 19:24:05 +0000</pubDate><guid>/posts/021-r3-write-durability-quorum/</guid><description>Ack only what survived: fsync/group-commit durability barrier, survivor quorum, and read-your-writes — the write-side of the P0 stack.</description></item><item><title>R2: Degraded-Read Survivor Fallback and Self-Heal</title><link>/posts/020-r2-degraded-read-self-heal/</link><pubDate>Thu, 27 Aug 2026 10:14:18 +0000</pubDate><guid>/posts/020-r2-degraded-read-self-heal/</guid><description>When a local replica is corrupted or missing, degraded read fetches from healthy survivors transparently, while a background rebuild loop restores cluster redundancy.</description></item><item><title>R1: Failure-Domain-Aware Placement</title><link>/posts/019-r1-failure-domain-placement/</link><pubDate>Wed, 26 Aug 2026 23:52:57 +0000</pubDate><guid>/posts/019-r1-failure-domain-placement/</guid><description>Replicas must not ride in the same rack: CRUSH weights become rack/zone/DC-aware so a single domain failure can&amp;rsquo;t lose the data.</description></item><item><title>Reducing Read-Verify Hashing: Trust Earned by Real Verification</title><link>/posts/043-reduce-read-verify-hashing/</link><pubDate>Wed, 26 Aug 2026 19:00:59 +0000</pubDate><guid>/posts/043-reduce-read-verify-hashing/</guid><description>Verify-on-read re-hashes the full object on every local read (~8x slower than write). A ReadVerifier seam skips re-verification for blobs verified this process, while scrub still catches bitrot.</description></item><item><title>Perf Profiling Baseline: Measure Before You Optimize — and Keep pprof Off the Wire</title><link>/posts/042-perf-profiling-baseline/</link><pubDate>Wed, 26 Aug 2026 17:46:56 +0000</pubDate><guid>/posts/042-perf-profiling-baseline/</guid><description>Phase-0 profiling harness via go test -cpuprofile/-memprofile; Rule 75 forbids networked pprof on unauthenticated listeners. The baseline proved stdlib SHA-256 already uses AVX2.</description></item><item><title>Seams, Not Plugins: A Fast Path That Stays Concrete</title><link>/posts/044-plugin-seam-architecture/</link><pubDate>Wed, 26 Aug 2026 16:45:18 +0000</pubDate><guid>/posts/044-plugin-seam-architecture/</guid><description>Adaptive behaviors use compile-time Go interface seams injected at decision points — not dynamic plugins. The fast path stays concrete; the trust core stays auditable; policy is declarative.</description></item><item><title>Metrics and Observability: Per-Node Bind, Prometheus Export</title><link>/posts/026-metrics-observability/</link><pubDate>Tue, 25 Aug 2026 06:12:59 +0000</pubDate><guid>/posts/026-metrics-observability/</guid><description>Prometheus metrics export with a per-node metrics_host/metrics_port bind — observability that scales past the &amp;lsquo;just scrape node 0&amp;rsquo; era.</description></item><item><title>Rotating Secrets Without a Secret Server: Deriving, Versioning, and Hot-Reloading Keys</title><link>/posts/054-secrets-management-key-rotation/</link><pubDate>Tue, 25 Aug 2026 03:25:35 +0000</pubDate><guid>/posts/054-secrets-management-key-rotation/</guid><description>How momo manages encryption keys without a central secret server: a pluggable provider chain (env, then config file), a per-node versioned key registry in local storage, and rotation that promotes a new key without any downtime. Teaches: why a provider chain beats a single source, how key versioning enables online rotation, and when rotation is and is not worth the complexity.</description></item><item><title>Tenant Isolation: Deriving Per-Tenant Keys, Enforcing ACLs, and Proving What Happened</title><link>/posts/053-multitenancy-authorization-audit/</link><pubDate>Tue, 25 Aug 2026 03:25:29 +0000</pubDate><guid>/posts/053-multitenancy-authorization-audit/</guid><description>How momo isolates tenants without a central secret server: HKDF-derived per-tenant keys, default-deny ACLs evaluated per request, and a SHA-256 hash-chained audit log that makes tampering detectable. Teaches: key derivation vs. key storage, why ACL evaluation order matters, and how hash chaining turns a log into evidence.</description></item><item><title>R5 Metrics Phases 2-4: Storage, P2P, and Latency Histograms</title><link>/posts/032-r5-metrics-phases-2-4/</link><pubDate>Tue, 25 Aug 2026 03:25:22 +0000</pubDate><guid>/posts/032-r5-metrics-phases-2-4/</guid><description>R5 Phases 2-4 shipped: storage metrics (disk, CAS, GC), P2P metrics (SWIM, leases, scatter-gather), and opt-in latency histograms — all with &amp;lt;1% overhead via sync/atomic counters.</description></item><item><title>Forward: Production Roadmap (R5–R11) and the Research Guide</title><link>/posts/028-roadmap-and-research/</link><pubDate>Tue, 25 Aug 2026 03:24:12 +0000</pubDate><guid>/posts/028-roadmap-and-research/</guid><description>After R1–R4: the P0 hardening done, the P1/P2 tracks (metrics, HA metadata, auth, secrets, S3 breadth) and the research reading guide that seeded it all.</description></item><item><title>S3 501 Discipline: Remaining Ops — SelectObjectContent, UploadPartCopy, Analytics, Inventory, Metrics, Intelligent-Tiering</title><link>/posts/035-s3-501-discipline-remaining-ops/</link><pubDate>Mon, 24 Aug 2026 21:44:12 +0000</pubDate><guid>/posts/035-s3-501-discipline-remaining-ops/</guid><description>Final 501 sweep: SelectObjectContent, UploadPartCopy, analytics, inventory, metrics, intelligent-tiering now return honest 501 NotImplemented.</description></item><item><title>S3 501 Discipline: Object-Level Subresources (tagging, acl, versionId, retention, legal-hold)</title><link>/posts/034-s3-501-discipline-object-subresources/</link><pubDate>Mon, 24 Aug 2026 21:13:07 +0000</pubDate><guid>/posts/034-s3-501-discipline-object-subresources/</guid><description>5 object-level query parameters now return honest 501 NotImplemented instead of silently falling into GetObject/PutObject/DeleteObject.</description></item><item><title>S3 501 Discipline: Honest 'Not Implemented' for 16 Bucket Config Subresources</title><link>/posts/033-s3-501-discipline-bucket-config/</link><pubDate>Mon, 24 Aug 2026 20:00:50 +0000</pubDate><guid>/posts/033-s3-501-discipline-bucket-config/</guid><description>16 bucket config subresources (versioning, ACL, policy, CORS, lifecycle, etc.) now return honest 501 NotImplemented instead of silently misrouting to ListObjects/GetObject.</description></item><item><title>At-Rest Integrity: Verify-on-Read, Checksums, and GC</title><link>/posts/007-at-rest-integrity-and-gc/</link><pubDate>Mon, 24 Aug 2026 19:36:43 +0000</pubDate><guid>/posts/007-at-rest-integrity-and-gc/</guid><description>CAS keys make verify-on-read free: central verification, x-amz-checksum echo, tombstone GC, and corruption surfacing.</description></item><item><title>Centralized Integrity Verification: Checksums Move to the Storage Core</title><link>/posts/031-core-integrity-verification/</link><pubDate>Mon, 24 Aug 2026 18:03:31 +0000</pubDate><guid>/posts/031-core-integrity-verification/</guid><description>S3 integrity checksums moved from a surface-level adapter into the storage/ingest core via a protocol-agnostic ChecksumProvider seam — every write path verified, replicas re-verify on receive.</description></item><item><title>S3 Integrity Checksums: x-amz-checksum-*</title><link>/posts/012-s3-integrity-checksums/</link><pubDate>Mon, 24 Aug 2026 16:36:34 +0000</pubDate><guid>/posts/012-s3-integrity-checksums/</guid><description>x-amz-checksum-CRC32/SHA256 echo on PUT; integrity surfaced to clients so dirty bytes never masquerade as clean. Teaches: client-verifiable integrity, Bolt zero-allocation on read path, Sentinel honesty guarantee.</description></item><item><title>⚡ Bolt: 1000 → 16 Allocations in S3 ListObjectsV2 XML</title><link>/posts/036-s3-listxml-appendformat-optimization/</link><pubDate>Mon, 24 Aug 2026 11:24:01 +0000</pubDate><guid>/posts/036-s3-listxml-appendformat-optimization/</guid><description>S3 ListObjectsV2 XML serialization dropped from ~1000 allocations to 16 per op via inlined time formatting and a pre-allocated escape buffer.</description></item><item><title>Adaptive Scaling: Gossip Fanout, Stream Chunks, Peer Quality</title><link>/posts/018-adaptive-scaling-peer-quality/</link><pubDate>Fri, 14 Aug 2026 19:43:24 +0000</pubDate><guid>/posts/018-adaptive-scaling-peer-quality/</guid><description>Three adaptive feedback loops: gossip fanout scales with cluster size, streaming chunk size adapts to cipher/memory, peer quality feeds quorum decisions.</description></item><item><title>Confidential Dedup via Threshold OPRF — and Auth Lockout</title><link>/posts/014-confidential-dedup-oprf/</link><pubDate>Fri, 14 Aug 2026 00:26:56 +0000</pubDate><guid>/posts/014-confidential-dedup-oprf/</guid><description>Threshold-OPRF lets E2EE cas blobs dedup without revealing content hashes — plus adaptive failed-auth backoff and lockout.</description></item><item><title>Scatter-Gather and Lease Consensus: Quorum Math</title><link>/posts/017-scatter-gather-lease-quorum/</link><pubDate>Thu, 13 Aug 2026 07:58:21 +0000</pubDate><guid>/posts/017-scatter-gather-lease-quorum/</guid><description>Scatter-gather lists across shard owners; leases with correct majority quorum — and the two nasty off-by-one/partition bugs found by audit.</description></item><item><title>S3 Multipart and Protocol Breadth: 501 Discipline</title><link>/posts/009-s3-multipart-and-breadth/</link><pubDate>Thu, 13 Aug 2026 06:02:26 +0000</pubDate><guid>/posts/009-s3-multipart-and-breadth/</guid><description>Multipart upload support plus a rigorous 501 strategy for unsupported S3 subresources — honest breadths over silent misbehavior.</description></item><item><title>⚡ Bolt: Zero-Allocation and Hot-Path Engineering</title><link>/posts/024-bolt-performance-engineering/</link><pubDate>Wed, 12 Aug 2026 11:40:41 +0000</pubDate><guid>/posts/024-bolt-performance-engineering/</guid><description>The Bolt mindset codified: no heap escapes in hashing/encoding, deadline amortization cuts SetDeadline ~98%, allocation hotspots hunted by profile. Teaches: zero-escape patterns, measurement contracts, trade-off posture.</description></item><item><title>S3 and Inbound TLS: HTTPS-by-Default Enforcement</title><link>/posts/011-s3-https-tls-enforcement/</link><pubDate>Wed, 12 Aug 2026 07:23:29 +0000</pubDate><guid>/posts/011-s3-https-tls-enforcement/</guid><description>The S3 gateway turned HTTPS-or-explicit-insecure into the default: no silent plaintext for the gateway or inbound tcp/quic.</description></item><item><title>S3 Auth: SigV4, Presigned URLs, and Key Decoupling</title><link>/posts/010-s3-auth-presigned-sigv4/</link><pubDate>Tue, 11 Aug 2026 23:11:16 +0000</pubDate><guid>/posts/010-s3-auth-presigned-sigv4/</guid><description>Query-string SigV4 for presigned URLs, mandatory X-Amz-Date freshness, and decoupling gateway access/secret keys from the native auth token.</description></item><item><title>S3 Gateway Core: XML, Buckets, Objects, Lists</title><link>/posts/008-s3-gateway-core/</link><pubDate>Tue, 11 Aug 2026 18:25:16 +0000</pubDate><guid>/posts/008-s3-gateway-core/</guid><description>The S3 gateway: SigV4, S3-compliant XML errors, Head/List/Copy, pagination, ranges, and metadata — a compatible API surface for real clients.</description></item><item><title>Client-Held E2EE: Envelope Encryption Real</title><link>/posts/013-e2ee-envelope-encryption/</link><pubDate>Tue, 11 Aug 2026 16:36:53 +0000</pubDate><guid>/posts/013-e2ee-envelope-encryption/</guid><description>Envelope encryption with a client-held key: the server stores ciphertext and can&amp;rsquo;t read it — across S3 and native transports.</description></item><item><title>Signed Payloads and Server-Sent Events for S3</title><link>/posts/039-signed-payload-sse-s3/</link><pubDate>Tue, 11 Aug 2026 05:14:24 +0000</pubDate><guid>/posts/039-signed-payload-sse-s3/</guid><description>SigV4 signed payload verification for S3 PUT/POST and Server-Sent Events for async operation notifications.</description></item><item><title>AWS Chunked Streaming: Signed Payloads Without Buffering</title><link>/posts/040-aws-chunked-streaming/</link><pubDate>Tue, 11 Aug 2026 04:52:58 +0000</pubDate><guid>/posts/040-aws-chunked-streaming/</guid><description>aws-chunked payload encoding streams large S3 uploads in signed chunks — no full-body buffering, per-chunk SigV4 integrity.</description></item><item><title>Transport Evolution: TCP, QUIC, and the Wire Protocol</title><link>/posts/003-transport-tcp-to-quic/</link><pubDate>Tue, 11 Aug 2026 04:02:50 +0000</pubDate><guid>/posts/003-transport-tcp-to-quic/</guid><description>Momo&amp;rsquo;s transport layer grew from TCP to a QUIC/TLS 1.3 fan-out — fixing handshake, ACK framing, deadlines, and TLS identity along the way.</description></item><item><title>The Sentinel Sweep: An Audit-Driven Security Journey</title><link>/posts/015-sentinel-security-audit/</link><pubDate>Tue, 04 Aug 2026 00:47:24 +0000</pubDate><guid>/posts/015-sentinel-security-audit/</guid><description>A 76-deep audit (authed via Sentinel) surfaced CRLF injection, smuggling, traversal and path leaks — the pattern that forged momo&amp;rsquo;s security mindset.</description></item><item><title>Pluggable Storage Backends: local, nfs, s3, raw</title><link>/posts/006-pluggable-storage-backends/</link><pubDate>Sun, 26 Jul 2026 14:33:59 +0000</pubDate><guid>/posts/006-pluggable-storage-backends/</guid><description>The &lt;code&gt;[storage] backend&lt;/code&gt; seam swaps blob storage (local, nfs, s3, raw) behind one Store interface, keeping CAS metadata local.</description></item><item><title>External S3 Client Replication Downgrade: When aws-cli Can't Fan Out</title><link>/posts/030-external-s3-client-replication-downgrade/</link><pubDate>Wed, 01 Jul 2026 23:36:39 +0000</pubDate><guid>/posts/030-external-s3-client-replication-downgrade/</guid><description>External S3 clients like aws-cli don&amp;rsquo;t send momo headers — the server detects this and downgrades client-side replication modes to server-side alternatives, ensuring replication never silently drops.</description></item><item><title>CRUSH-lite: Deterministic Weighted Placement</title><link>/posts/005-crush-placement/</link><pubDate>Tue, 30 Jun 2026 13:09:01 +0000</pubDate><guid>/posts/005-crush-placement/</guid><description>Weighted rendezvous hashing picks replicas deterministically and peer-equally without a central allocator — later hardened for failure domains. Teaches: content-hash-based placement, weighted rendezvous hashing, deterministic stable sort, failure domain filtering.</description></item><item><title>🛡 Zero-Crash Hardening: Defensive Patterns for a Networked Object Store</title><link>/posts/037-zero-crash-hardening-patterns/</link><pubDate>Wed, 03 Jun 2026 06:03:39 +0000</pubDate><guid>/posts/037-zero-crash-hardening-patterns/</guid><description>Systematic defensive coding: nil-safety, numeric overflow guards, resource lifecycle discipline, panic recovery at every boundary, and concurrency safety under -race.</description></item><item><title>Replication Strategies and the Polymorphic Engine</title><link>/posts/002-replication-strategies-polymorphic/</link><pubDate>Mon, 04 May 2026 18:54:37 +0000</pubDate><guid>/posts/002-replication-strategies-polymorphic/</guid><description>Chain, Splay, and Primary-Splay replication — and the metrics-driven controller that switches between them at runtime.</description></item><item><title>CAS: Content-Addressable Storage and Deduplication</title><link>/posts/004-cas-content-addressable-store/</link><pubDate>Wed, 11 Mar 2026 14:34:18 +0000</pubDate><guid>/posts/004-cas-content-addressable-store/</guid><description>Identify every object by its SHA-256 content hash — server-side dedup, verify-on-read, and a path that later mounted a filesystem. Teaches: content addressing principles, single write chokepoint, Bolt/Sentinel patterns.</description></item><item><title>P2P: Gossip, SWIM, and Membership</title><link>/posts/016-p2p-gossip-swim/</link><pubDate>Wed, 11 Mar 2026 14:34:18 +0000</pubDate><guid>/posts/016-p2p-gossip-swim/</guid><description>A scaleless-gossip ring: SWIM-style failure detection, discovered-peer dialing, and ALIVE/OFFLINE restoration — momo&amp;rsquo;s nervous system.</description></item><item><title>Origin: From Replication Playground to Object Store</title><link>/posts/001-origin-and-genesis/</link><pubDate>Tue, 09 Sep 2025 20:10:05 +0000</pubDate><guid>/posts/001-origin-and-genesis/</guid><description>How momo started as a file-replication playground in Go and grew into a distributed content-addressed object store.</description></item></channel></rss>