Tech stack
An honest inventory of what went into building Meridian.
Design
Tools
- Google Stitch — UI mockups and layout generation
- Gemini 3.0 Flash (via Stitch)
Typography
- Inter (body) — Rasmus Andersson, OFL
- Manrope (headlines) — Mikhail Sharanda, OFL
- Self-hosted via
@fontsource - Material Symbols (icons) — loaded from Google Fonts CDN
Frontend
Runtime
- React 19
- TypeScript 6 (strict)
- Vite 8
Styling & motion
- Tailwind CSS v4 (CSS-first config)
- framer-motion
- clsx, tailwind-merge, class-variance-authority
Architecture patterns worth naming
- Save Guard decorator. Debounces, cancels in-flight requests with
AbortController, and suppresses poll-driven writes during mutations. Wraps the calendar API so consumers don't know or care. - Simulated network proxy. A generic
Proxy-based decorator that injects configurable latency and honorsAbortSignalinto the mock APIs — so rapid move-release-move interactions cancel cleanly even in demo mode. - Optimistic UI with rollback. Mutations apply immediately; a snapshot stack handles concurrent optimistic updates and restores state on failure.
- Viewer-coordinate projection. Availability is stored in each author's timezone and re-projected to the viewer's timezone before heat-map, best-slot, or team-time calculations.
Infrastructure
Hosting
- AWS CloudFront (CDN)
- AWS S3 (static assets)
- AWS Route 53 (DNS)
- AWS Certificate Manager (TLS)
Infra as code
- AWS CDK (TypeScript)
Development tooling
Editors
- Visual Studio Code with direct Claude integration
- Cursor IDE — AI-assisted editor with agent workflows
AI assistants
- Claude (Anthropic) — via VS Code and Cursor
- Gemini 3.0 Flash (design via Stitch)
AI-assistance disclosure
Code was written collaboratively with AI coding assistants across two editors: Visual Studio Code with direct Claude integration and Cursor IDE with Claude-powered agents. Design layouts were generated via Google Stitch with Gemini 3.0 Flash. All architectural decisions, prompt direction, and final review were human.
Design tools were used at build time only. Your data never hits Google, Anthropic, or any AI service at runtime — the app doesn't call any of them once it's running in your browser.
Questions?
Reach me on LinkedIn.