Escritura

Blog

49 artículos

Artículos sobre frontend, tecnología y el oficio de construir software. Escritos a lo largo de los años en mi blog personal y en Octa.

2026

Leap Seconds After 2035: What Was Actually Decided, and the Proposals on the Table

The 2022 CGPM resolution doesn't abolish leap seconds — it raises the tolerated UT1−UTC difference, with the practical effect that insertions cease. A survey of replacement proposals (leap minute, Levine's rate adjustments, BIPM's Continuous UTC group) plus a 4-year scheduled-block variant.

Timezone Propagation: How IANA Changes Reach Your Application

How IANA timezone changes travel from the tzdb release through CLDR, OS updates, and language runtimes — including Node.js's Date/Intl split where the same environment can produce two different answers, and the British Columbia permanent DST workaround.

Completing the IPoAC Stack: Why DoAC Had to Exist

The IPoAC protocol family had no naming layer for 35 years. DoAC fills the gap with the AA resource record, the Pigeon of Last Resort bootstrap procedure, retransmission semantics calibrated for multi-day transit, and DNSSEC key distribution via Trusted Courier Pigeon.

My First Internet Draft: DNS over Avian Carriers

Notes on submitting draft-cruzgonzalez-ipoac-dns-00 to the IETF: what DoAC specifies, the AA resource record wire format, the Pigeon of Last Resort bootstrap problem, DNSSEC over Trusted Courier Pigeon, and the path to publication as an April Fools RFC.

Injecting git config per-process with GIT_CONFIG_KEY_n

Injecting git safe.directory per-process via GIT_CONFIG_COUNT and GIT_CONFIG_KEY_n environment variables — no file writes, no sudo — the correct fix for deploy agents running as root against repositories owned by www-data.

floo: a minimal deploy agent for self-hosted VPS

floo runs an HTTP deploy agent on the server with YAML-defined project steps, scoped tokens stored as SHA-256 hashes, and real-time log streaming via SSE. systemd as the process supervisor, no Docker, no managed platforms.

Bifrost: what changed when a private tunnel became a public package

Design changes required to turn a single-user WebSocket tunnel into a self-hostable package: named peers with subdomain routing, scoped tokens stored as SHA-256 hashes, backpressure limits, dead connection detection, and queue drain on disconnect.

Building @avelor/vhost: From Repeated Pain to Open Source Tool

@avelor/vhost generates Apache VirtualHost configs from a YAML file — with a managed-config marker for gradual migration, a default-vhost that blocks unrecognized requests, and content-negotiated error pages that serve HTML or JSON based on the Accept header.

Why I Built mesh: Local Dev Proxy with Named Services and Failure Injection

mesh is a local dev proxy where services get names instead of port numbers, and a YAML rules block injects failures at the network layer — 503s, delays, per-request rates — without touching backend code or adding mocks.

CV as Code: Generating a PDF from an Astro page with Playwright

Generating a print-ready PDF CV from a static Astro page using Playwright headlessly — why @page margins are ignored by Playwright, why astro-pdf was skipped, and ATS compatibility pitfalls with em dashes and special characters.

Feature flag services don't store user IDs — and the consequence of that

Tessera stores no user records — rollout consistency comes from deterministic hashing, not a user registry. The consequence: exposure analytics require a separate events table. How LaunchDarkly, Statsig, and PostHog Flags handle the same tradeoff.

Separating the flag evaluation API from the dashboard in the same monorepo

Why Tessera's feature flag evaluation API runs on Hono rather than Next.js API routes — cold start latency, deployment coupling, and framework overhead — and how a shared monorepo makes the split cheap while keeping evaluation logic in one place.