Tag
#dev-log
25 posts across the garden · browse essays
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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).
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.
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.
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.
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.
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.
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.
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.
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.