TanStack Start + TypeScript + Tailwind CSS + shadcn/ui を使用したモダンな Web アプリケーションテンプレートです。
- Framework: TanStack Start (TanStack Router + Vite)
- Language: TypeScript 7 (native compiler)
- Styling: Tailwind CSS v4
- UI Components: shadcn/ui (Radix UI primitives)
- Authentication: Better Auth (Google OAuth)
- Database: Cloudflare D1 (SQLite) + Drizzle ORM
- Storage: Cloudflare R2
- Hosting: Cloudflare Workers (@cloudflare/vite-plugin)
- Code Quality: Vite+ (
vp checkで format / lint / 型検査) - Testing: Vitest + Testing Library
- Package Manager: Bun
- Git Hooks: Lefthook
git clone <your-repo-url>
cd <your-repo-name>
mise install # Node / Bun / actionlint / shellcheck を mise.toml の版で用意
cargo install similarity-ts # lefthook の pre-push が回す重複検出(Rust 製)
cp .env.local.example .env.local
bun run setup # 依存・git hooks・生成ファイルをまとめて用意
bun run devsrc/routeTree.gen.ts は bun run dev と bun run build が生成し、ルートファイルの追加や削除に追従します。worker-configuration.d.ts は bun run dev が生成し、wrangler.toml の編集にも追従します(build は生成しません)。dev を起動せずに bun run check や bun run test を走らせるときだけ、先に bun run generate-routes と bun run cf-typegen を叩いてください。
similarity-ts が無い環境では、lefthook の pre-push が重複検出(similarity-ts ./src --fail-on-duplicates)を飛ばして push を通します。その欠落は SessionStart の env-check がセッション開始時に報告します。
mise を使わない場合は、package.json の engines.node を満たす Node と、mise.toml が指定する版の Bun を手動で用意してください。Cursor Cloud Agent 環境では .cursor/environment.json が scripts/cloud-agent-install.sh を自動実行し、mise と依存の導入から generate-routes / cf-typegen までを済ませます(bun install は --ignore-scripts なので lefthook の hook は入りません)。shims の PATH 追記は rc ファイルを読むシェルにしか効かないため、rc を読まない非対話シェルからは mise exec -- <コマンド> で実行してください。
bun run dev は portless 経由で起動し、https://my-app.localhost で開きます。linked worktree ではブランチ名の末尾がサブドメインとして前に付きます(ブランチ fix-ui なら https://fix-ui.my-app.localhost)。付くのは末尾だけなので、feat/x と fix/x は同じ URL になり、main と master のブランチには何も付きません。dev サーバのポートは portless が空きから割り当てるので、worktree を並べて起動してもポートの取り合いは起きません。初回は proxy が 443 を使うために sudo を求めます。sudo を使わない場合は先に bunx portless proxy start --port 1355 を実行すると、URL に :1355 が付きます。@cloudflare/vite-plugin により、bun run dev でも Cloudflare D1 / R2 バインディングが有効です。
データベース・認証・ストレージのセットアップ手順は docs/DATABASE_SETUP.md、デプロイ・ロールバック・シークレット運用は docs/DEPLOYMENT.md、このテンプレートを新規プロジェクトに使う手順は docs/FORKING.md、サーバ境界を oRPC / BFF 構成へ動かす場合の前提は docs/SERVER_BOUNDARY.md を参照。
- mise:Node / Bun / actionlint / shellcheck のバージョン固定 (
mise.toml) - shadcn/ui:UI components (
components.json) - TypeScript 7:Type checker (Go-native
tsc) - Vite+:Vite / Vitest / oxlint / oxfmt を束ねる CLI。設定は
vite.config.tsのlint/fmtブロックに集約される - oxlint:Linter (
vite.config.tsのlintブロック) - 自作 oxlint プラグイン (
tools/oxlint-plugins/):vite.config.tsのlint.jsPluginsから読み込まれる。層契約・コンポーネント命名・1ファイル1コンポーネント・テストの形(1テスト1 expect など)を機械的に強制するので、規約は文書だけでなくここにもある - 自作 vite プラグイン (
tools/vite-plugins/):vite.config.tsから読み込まれる。wrangler.tomlの変更を検知してbun run cf-typegenを走らせ、dev 起動時はworker-configuration.d.tsがwrangler.tomlより古いときだけ生成する - react-doctor:React 向け追加ルール (
oxlint.react-doctor.ts) - oxfmt:Formatter (
vite.config.tsのfmtブロック) - portless:dev サーバに名前付き HTTPS URL を割り当てる proxy。
bun run devが経由する - lefthook:Git hooks (
lefthook.yml、bun run setupがprepareスクリプト経由でインストールする) - knip:Unused deps/exports/files detection (
knip.json) - similarity-ts:Code similarity detector
- actionlint:GitHub Actions workflow checker (
mise.tomlが版を固定) - shellcheck:tracked な
*.shの静的検査。bun run check:shellが lefthook の pre-push と CI の両方から呼ぶ (mise.tomlが版を固定)
src/
├── routes/ # TanStack Router file-based routes
│ ├── __root.tsx # Root layout (ThemeProvider, Header, Toaster)
│ ├── index.tsx # Home page
│ ├── login.tsx # Login page
│ ├── profile.tsx # Profile page (auth guard via beforeLoad)
│ ├── auth.auth-code-error.tsx # OAuth failure landing page
│ └── api/ # API routes (auth catch-all, avatars)
├── server/
│ ├── cloudflare.live.ts # CloudflareEnv helper (cloudflare:workers)
│ └── fn/ # Server functions (createServerFn)
├── gateways/ # D1 / R2 persistence
├── entities/ # Domain types and schemas
├── components/ # Shared UI components
│ ├── ui/ # shadcn/ui primitives
│ ├── shared/ # Cross-page shared components
│ └── features/ # Feature-specific components
├── lib/
│ ├── auth/ # Better Auth 設定
│ ├── drizzle/ # Drizzle ORM スキーマ
│ ├── storage/ # R2 ストレージ
│ └── utils.ts
├── test/ # Test helpers (router harness, cloudflare:workers stub)
├── router.tsx # TanStack Router definition
├── ssr.tsx # Server entry (Cloudflare Worker handler)
├── test-setup.ts # Vitest setup
└── styles.css # Tailwind v4 tokens
配置と import 方向の規約は AGENTS.md の Rules を参照してください。
エージェント運用層は4つでできています。
- AGENTS.md:規約の本体。毎セッション自動でロードされます(
CLAUDE.mdはこれを読み込むだけ) .claude/rules/:規約の分冊。path scope を持つものは対象ファイルを編集するときだけ、持たないものは毎セッション読み込まれます.claude/skills/:名前のついた作業の手順。チケット粒度の作業はticket-workが持ち、AGENTS.md はそれを指します.claude/hooks/:規約を機械的に強制する側。SessionStart で依存の欠落を報告し、Bash 実行前にガードを掛け、Stop ではコードが変わった turn だけbun run check(format / lint / 型検査)とbun run testを回します。markdown のリンク切れ検査は変更があれば毎回走ります。ツリー全体を判定する検査は Stop に置かず、knip は CI、similarity-tsは lefthook の pre-push が回します
コミット前のレビューは code-reviewer エージェントが担い、PR ブランチへのコミットと push はエージェントが AGENTS.md の規律に従って自分で行います。main へは PR 経由でだけ入ります。
bunx shadcn@latest add [component-name]