Portfolio repo. Feel free to dive in to see how it operates.
Turborepo with Next.js (SSR), 9ui components, and Vercel deployment.
├── .env.example # Vercel + portfolio env template
├── apps/
│ ├── api/ # Golang + GraphQL API
│ │ └── README.md
│ └── web/ # Next.js 16 (App Router, SSR)
│ ├── app/
│ │ ├── layout.tsx # Root layout (ToastProvider)
│ │ ├── page.tsx
│ │ └── globals.css
│ ├── components/
│ │ └── ui/ # Re-exports from @repo/ui
│ ├── vercel.json
│ └── README.md
├── packages/
│ ├── config-eslint/ # Shared ESLint
│ ├── config-typescript/ # Shared tsconfig (base, nextjs, ui)
│ └── ui/ # 9ui components (manual imports)
│ ├── components.json
│ ├── src/components/
│ └── 9UI_TODOS.md
├── package.json
├── pnpm-workspace.yaml
└── turbo.json
| Layer | Location | Notes |
|---|---|---|
| Frontend | apps/web |
Next.js 16, App Router, SSR |
| API | apps/web/app/api/ |
Next.js Route Handlers (recommended) |
| Backend | apps/api |
Golang + GraphQL API (stateless) |
| Shared UI | packages/ui |
9ui components, import per-component |
- See
packages/ui/9UI_TODOS.mdfor setup. - Add:
cd packages/ui && npx shadcn add @9ui/<component> - Import:
import { Button } from "@repo/ui/button"or from app:import { useToast } from "@/components/ui/toast" - Toast:
ToastProviderwraps the app inapps/weblayout; useuseToast()in client components.
pnpm install
pnpm dev # Runs all apps
pnpm build # Turbo build
pnpm lint # Turbo lint
pnpm fmt # Format all (markdown, JS/TS, Go)
pnpm fmt:check # Check formatting
pnpm lint:md # Markdown lintCopy .env.example to .env.local and fill in values. Vercel injects its own env vars.
- Import repo → Create Project
- Root Directory:
apps/web - Build: from repo root use
cd .. && pnpm installandcd .. && pnpm turbo run build --filter=web(seeapps/web/vercel.json). - Ignored Build Step:
npx turbo-ignore --fallback=HEAD^1
Remote caching: pnpm dlx turbo login then pnpm dlx turbo link
- apps/web continues to evolve independently while backend deployment strategy is being evaluated; the Go GraphQL API in
apps/apiis in place for future integration.