Use pnpm: pnpm install, pnpm dev, pnpm build, pnpm lint, pnpm typecheck, pnpm generate, pnpm knip
- The dev server is always running at
http://localhost:3000. - Do not start or restart the dev server.
- Always commit changes before handing work back.
- Amend the previous commit when new changes make it not worthwhile to keep as a separate commit.
- Keep each commit scoped to one coherent change.
- Use semantic commit messages:
<type>(<scope>): <subject>; scope is optional. - Use present-tense, lowercase subjects unless casing is contextually important.
- Types:
feat,fix,docs,style,refactor,test,chore. - Examples:
feat: add playlist filters,fix(api): cache graphql explorer separately,docs: update agent instructions.
- Vite + TanStack Start React app; file routes live in
app/routes. - API routes use
createFileRoute(...).server.handlers. - Root layout, SEO defaults, analytics, RSS link, and
baseUrllive inapp/routes/__root.tsx. - Route tree is generated in
app/routeTree.gen.ts; do not edit it directly. - Use path aliases:
~/*forapp/*,@/*for repo root. - Use
cnfromlib/cn.tsfor conditional class merging. - Prefer semantic Tailwind tokens/classes from
tailwind.config.cjsandstyles/globals.css(bg-canvas,text-fg,text-muted,bg-surface,border-line,font-ui-*,link,prose-custom) over raw color/typography utilities. - Global CSS variables define light/dark theme colors in
styles/globals.css. - GraphQL schema/queries/resolvers live in
graphql; update generated types withpnpm generate. - Do not edit
graphql/types/types.generated.tsdirectly. - Apollo server is mounted at
/api/graphql; GET query caching is operation-name aware. - Contentful images should go through
proxiedImageUrl/contentfulLoader;/api/imageonly allows listed hosts. - MDX posts are compiled server-side in
app/routes/posts/$slug.tsxwithmdxComponentsfromcomponents/Prose. - OG images are generated by
/api/ogusingsatori+sharp; keep server-only imports dynamic when needed. - Node >= 20.
No project-local skills found in .claude/skills or plugins/*/skills.