Skip to content

Tag

#programming

25 posts across the garden · browse essays

EssaysApr 8, 2026Evergreen

The Bamboo House Gets Its Own Page

Swapped three different pitches for three different audiences with one real story: a Miami Beach condo, 940 documents, $6.04.

EssaysApr 8, 2026Evergreen

The Tags Were There the Whole Time

Tags existed in every blog post since day one — I just never wired them up to actually appear on the page.

EssaysApr 7, 2026Evergreen

Portal mutable state, from JSON files to SQLite (Phase 3a)

Moving compliance events and study progress off the filesystem and into WAL-mode SQLite so the portal can finally leave its one long-lived host.

EssaysApr 7, 2026Evergreen

Self-hosting the portal on a Mac mini via Cloudflare Tunnel + Access (Phase 3c Tier 1)

honestcam.ocampo.io is now served from the Mac mini on my desk, gated by Cloudflare Access, and kept alive across crashes and reboots by two launchd user agents.

EssaysApr 7, 2026Evergreen

Removing orphan content/posts/ from an earlier broken sync (Contentlayer slug gotcha)

Four byte-identical duplicates left over from a rsync destination mistake, and the one-line Contentlayer slug regex that caused it.

EssaysApr 6, 2026Evergreen

Dev command center, macOS Keychain integration, and proactive Xero token refresh

A /dev/ dashboard that bookmarks every service honest-cam touches, secrets loaded from macOS Keychain as a fallback to .env, and a proactive Xero token refresh so the 60-day expiry never catches me again.

EssaysApr 6, 2026Evergreen

Landing page i18n: Spanish, Portuguese, and Italian translations via an Anthropic-backed CLI

An AI-powered translation CLI that walks HTML landing pages, preserves structure, translates copy, and ships 12 new pages (ES, PT, IT) with a language switcher, hreflang tags, and Vercel locale routing.

EssaysApr 4, 2026Evergreen

Adding Vercel Web Analytics to the landing pages (two lines, zero dependencies)

A two-line script tag on four landing pages gets me Web Vitals (LCP, CLS, INP, TTFB) on the Vercel dashboard, complementing PostHog on the behavior side.

EssaysApr 4, 2026Evergreen

Landing page redesign: GoHighLevel layout, SEO metadata, and a conversion copy rewrite

A visual overhaul inspired by GoHighLevel (light gradient hero, Poppins, gold CTAs, dark navy sections), full SEO metadata (OG, Twitter, JSON-LD, canonical), and a copy rewrite built around specific numbers instead of vague promises.

EssaysApr 4, 2026Evergreen

Writing down the landing page update process (and refreshing memory files)

A checklist for the recurring landing-page update workflow and a batch refresh of the agent memory files so future sessions stay grounded.

EssaysApr 3, 2026Evergreen

FL 718.111(12)(g) association website and Xero PDF attachments

A statutorily-compliant association website with auth-gated official records, 940 docs auto-symlinked into the right categories, and source PDFs auto-attached to Xero transactions during sync.

EssaysApr 3, 2026Evergreen

First pass at honest-cam landing pages

Four static HTML landing pages (index, managers, owners, investors) deployed on Vercel with a shared CSS/JS bundle and a docs/feature-analytics.md plan for instrumentation.

EssaysApr 1, 2026Evergreen

Writing the architecture docs before writing the code

A docs-only PR that captures the feature plan, compliance model, OCR strategy, Xero integration, and dashboard shape before any of it ships — intentionally.

EssaysApr 1, 2026Evergreen

OCR pipeline: structured field extraction from 941 PDFs via native Anthropic PDF support

Phase 5: per-category prompts, validation-based confidence, Decimal-safe amounts, atomic sidecar writes, and a Haiku-default / Sonnet-retry ladder.

EssaysApr 1, 2026Evergreen

The Honest CAM platform MVP: Xero sync, billing, reporting, budgets (and a rename from PropCo)

Phase A of a PayHOA-equivalent built on Xero: vendor alias resolution, category routing, assessment billing, FL 718-compliant reporting, and YAML budgets — 251 tests, one monster PR.

EssaysApr 1, 2026Evergreen

Owner portal: FastAPI + HTMX with magic-link auth and Stripe checkout

Phase B Step 6: a passwordless self-service portal for unit owners, with HTMX partial swaps, signed-token auth, and Stripe Checkout for assessments.

EssaysApr 1, 2026Evergreen

Fixing six factually wrong CAM exam questions and expanding the bank to 105

A correctness pass on the Florida CAM study guide: six errors that would have cost a real licensee real money, plus coverage of 2024–2025 legislation (HB 1021, HB 913, SB 154).

EssaysApr 1, 2026Evergreen

Study portal: mobile quiz UI, browser speech synthesis, and a team-training admin view

A mobile-first HTMX quiz at /study/, audio mode powered entirely by the browser's SpeechSynthesis API, signed-cookie session state, and an admin dashboard for tracking multiple trainees.

EssaysMar 29, 2026Evergreen

Initial scaffold: an AI-first property management monorepo

Starting the honest-cam project with a Python + TypeScript monorepo, a YAML-driven document reorganization engine, and SHA-256 idempotency on a 958-file real-world dataset.

EssaysJul 4, 2023Evergreen

Swapping Twitter for Substack and giving the sidebar logo a refresh

Retiring the Twitter CTA in favor of a Substack email list, adding a 'meet my family' link to ocampo.io, and replacing the sidebar logo with a new SVG pointing to the personal site.

EssaysJun 26, 2023Evergreen

Allowing Google Tag Manager through the Content-Security-Policy

The inevitable follow-up to adding GTM: the browser's CSP was blocking the script, so this PR adds googletagmanager.com to script-src and img-src in next.config.js.

EssaysJun 26, 2023Evergreen

Fixing a CSP typo: directive names don't take colons

The one-character follow-up to PR #4: removing the stray colons from the CSP directive names so the browser stops ignoring the whole header.

EssaysJun 25, 2023Evergreen

Adding Google Analytics to a Next.js blog the old-fashioned way

First instrumentation on the blog: a gtag wrapper in lib/ga.js, a custom pages/_document.js with the Global Site Tag, and no npm dependency.

EssaysJun 25, 2023Evergreen

A one-line whitespace fix on the gtag script tag

The shortest possible PR: collapsing a two-line JSX attribute into one. Shipping it anyway, because PRs are free and branch hygiene matters.

EssaysJun 25, 2023Evergreen

Migrating to GA4, swapping in Google Tag Manager, and renaming the site to steven.ocampo.io

Universal Analytics is on the way out, so this PR migrates to GA4 via Google Tag Manager loaded through next/script, and renames everything from stevieismagic.com to steven.ocampo.io.