Changelog

What we shipped, when we shipped it.

April 16, 2026

Speech-to-text dictation on asset captions

Dictate context notes with your phone mic. Comma-separated descriptors, cursor-aware insertion. Chrome + Safari supported via Web Speech API.

Service entity + GBP category intelligence

6–8 service tiles auto-derived from your brand playbook, anchored to Google Business Profile categories for local SEO. Services appear on the /work page and each gets a /services/[slug] detail page with schema.org markup.

Free GBP category diagnostic

Public tool at /tools/gbp-diagnostic. Enter your business type, get primary + additional GBP category recommendations with reasoning. No signup required.

TracPost marketing site

New marketing site scaffold at next.tracpost.com. 14-section homepage, pricing page, 8 industry landing pages, ROI calculator, live network feed, auto-populated case studies.

April 15, 2026

Image replace-in-place

Referenced assets can no longer be force-deleted. Instead, upload a replacement — bytes overwrite the existing R2 object at the same URL, so every reference (blog body, OG images, social posts) keeps working. HEIC auto-converts to JPEG. Cloudflare edge cache purges instantly.

Media library sort fix

Oldest/newest sort now selects from the correct end of the dataset. Project filter moved into SQL so narrow project views show all matching assets regardless of library size.

HEIC cleanup pipeline

Original HEIC files are now deleted from R2 after JPEG conversion. Orphan cleanup script reclaimed 384 MB from existing uploads.

Cloudflare CDN cache purge

Replace and delete operations now purge the Cloudflare edge cache for the affected URL. New images appear immediately instead of serving stale bytes for up to 24 hours.

April 14, 2026

Centralized marketing with 6-slot page model

Every tenant marketing site now runs on ISR with variant dispatch. Six stable page slots (home, about, work, blog, projects, contact) with per-slot variant selection. SaaS and service-business variants for home, about, work, and contact.

TracPost as tenant of itself

TracPost's public site renders through the same centralized tenant engine as every other customer. Blog, projects, and marketing pages all served from the same codebase.

Phase 3 cleanup

Removed the legacy static-site deploy pipeline (website spinner). 2,393 lines of dead code deleted. Copy generator moved to lib/tenant-site/.

April 13, 2026

Route refactor complete

Migrated from subdomain-based routing (blog.*, projects.*) to path-based routing (/blog/*, /projects/*). Custom domain resolution via middleware. Preview subdomain for stakeholder previews with automatic 301 graduation post-DNS-cutover.