About this site

Colophon

Personal site of Abraham Garcia — designer, founder of Workhorse, writing at the seam where design and AI meet. Three things at once: a portfolio of work, a place to write, and a working test bed for an AI-native delivery stack a designer can own end to end. Live at thehonestape.com.

Framework

Astro 5 with server-side rendering. Static surfaces stay static; dynamic pages render at the edge. React 19 for the few interactive islands. TypeScript throughout. Vite under the hood. Build pipeline includes the Astro MDX, React, Sitemap, RSS, and Partytown integrations.

Visual language

Tailwind CSS v3 with the Typography and Animate plugins. shadcn/ui primitives vendored into the repo, sitting on Radix UI for the accessible behavior layer. Lucide for icons. class-variance-authority + clsx + tailwind-merge for variant glue.

Design tokens live in two places. Colors are HSL CSS variables in src/styles/globals.css. Spacing, typography, container, and gap scales are TypeScript constants in src/lib/design-tokens.ts, imported with cn() at the call site. The same tokens drive every surface: web pages, printable PDFs, dossier documents.

Typography

Five families. The four public-site fonts are wired through Astro's Fonts API, which fetches the woff2 files from Google at build time and serves them from this origin — so there are no third-party font requests at runtime. Each family is exposed as a CSS variable (--font-fraunces, --font-plex-mono, and friends) with platform-default fallbacks behind it.

  • Fraunces — display and body. Variable font, weights 300 through 700, both upright and italic. Preloaded so it paints with the first frame. Fallback: Libre Caslon Text → Georgia → ui-serif.
  • IBM Plex Mono — code blocks, terminal UI, eyebrows, meta lines, and the dock. Weights 400, 500, 600, 700. Preloaded. Fallback: ui-monospace → SFMono-Regular → Menlo.
  • Libre Caslon Display — select editorial display contexts (dossier headings, document chrome). Single weight at 400. Loaded on demand. Fallback: Libre Caslon Text → Georgia → ui-serif.
  • Libre Caslon Text — long-form editorial bodies where Caslon's contrast suits the surface. 400 and 700, both styles. Loaded on demand. Fallback: Georgia → ui-serif.
  • Maison Neue and Maison Neue Mono — used only on the resume and dossier surfaces. Self-hosted as woff2 from /assets/fonts/maison-neue/ via @font-face with font-display: swap.

Content

Long-form content — posts, case studies, work pages — is MDX in the repo at src/content/blog/*.md. The schema is defined in src/content/config.ts. Writing is just files and frontmatter, versioned with the rest of the site.

Payload CMS v3 runs alongside as the data layer for visitor messages — contact submissions and newsletter subscribers. Collections live in the same TypeScript repo, sharing the schema with the runtime that reads it.

Forms and motion

React Hook Form with Zod via @hookform/resolvers for validation. react-day-picker for date inputs. Framer Motion, GSAP, and Swiper for motion and carousel work where the page earns it.

Edge runtime

Cloudflare Pages on the Workers runtime. Production data lives in Cloudflare D1 — a SQLite-on-the-edge primitive the Payload adapter speaks to natively. Local dev uses a SQLite file on disk; npm run db:pull brings prod data down for debugging.

Transactional email via Resend through @payloadcms/email-resend. Booking via the Cal.com embed.

Build and tooling

Astro CLI for build and dev, Wrangler for Cloudflare deploys, tsx for TypeScript scripts, concurrently for parallel dev processes, Playwright to render the resume and cover-letter PDFs at build time.

The loop

Claude Code, every day. The model proposes the route, the data shape, the component, the styles. I read the diff, push back where it is wrong, accept where it is right. Then I run it. Patterns survive two or three uses before they get lifted into reusable components.

A longer field note on the loop and the stack lives in The Honest Ape Stack.

Search, feeds, and discovery

MiniSearch for client-side search across the writing index. RSS feed at /rss.xml. Sitemap generated at build time. Open Graph and structured data emitted per page.

Analytics and privacy

Google Analytics 4 and Microsoft Clarity for traffic and session analytics. No third-party trackers beyond those. Email is collected only through the contact form and newsletter subscription, both stored in Payload, never sold or shared.

Newsletter

The Meaning Layer ships from Substack at meaninglayer.substack.com.

Source

The repository is private. The patterns are not — the field note at The Honest Ape Stack walks through the build in detail. The Workhorse studio platform is the same shape, scaled up to a multi-tenant content pipeline with agentic generation in the middle.

Contact

Email hello@thehonestape.com, send a message, or schedule a call.

From
Abraham Garcia
Studio
Charleston, South Carolina
Email
abe@wrkhrs.co
Phone
(202) 550-7569
Studio site
www.wrkhrs.co
LinkedIn
in/thehonestape