It's my blog yo!
- Frontend: React 18 + React Router v7 + TypeScript + Vite
- Styling: Tailwind CSS + custom styles
- Content: MDX in
content/blog,content/til, andcontent/pages - Caching: Redis +
@epic-web/cachified - Background jobs: Inngest
- Search and observability: Algolia + Sentry
- Deployment: Fly.io
- Node.js 24.x (Volta pins
24.13.1) - pnpm (Volta pins
10.6.3) - Docker + Docker Compose (for Redis)
- Chromium (used by Playwright/mermaid tooling)
Optional:
- Volta for toolchain pinning
- Dotenv Vault for pulling environment values
- Inngest CLI for local function inspection
-
Install dependencies:
pnpm install
-
Create local env values:
- copy
.env.exampleto.env, or - pull with dotenv vault:
npx dotenv-vault pull
- copy
-
Start Redis:
docker-compose up -d
-
Optionally run Inngest locally:
npx inngest-cli@latest dev
-
Start the app:
pnpm dev
App runs at http://localhost:8080 by default.
pnpm dev- start local dev serverpnpm build- build the app with React Routerpnpm start- run production server entrypnpm clean- remove build/cache artifactspnpm lint- run ESLintpnpm typecheck- run TypeScript project build checkspnpm format- run Prettierpnpm knip- check for unused files/deps/exportspnpm test- run smoke tests via Vitestpnpm test:watch- run Vitest in watch modepnpm test:single- run a single test file or filtered tests
- Pre-commit hook runs
lint-staged. lint-stagedruns clean, test, lint, typecheck, and prettier on staged files.- CI deploy workflow runs lint, typecheck, and test before deploy.
- Deploy target is Fly.io (
fly.toml). - Main deploy workflow lives in
.github/workflows/deploy.yml. - Content refresh workflow lives in
.github/workflows/refresh-cache.yml.