Опинионированный стартер на готовой инфраструктуре. FSD-структура, тёмная тема, auth (email + OIDC SSO), линтер, форматтер (Allman-style через AST-постпроцессор), импорт-конвертер, pre-commit хук — всё уже настроено.
- TanStack Start (SSR React 19) + TanStack Router (file-based) + TanStack Query v5
- Drizzle ORM + Postgres (Neon Launchpad для dev), миграции через
drizzle-kit - Tailwind CSS v4 через
@tailwindcss/vite, токены в OKLCH - Zod для серверной валидации
- openid-client v6 — OIDC SSO с админкой провайдеров
- Bun — рантайм и пакет-менеджер
- Vitest для тестов
После того как вы скопировали этот шаблон в свою папку:
bun install
bun run setupСкрипт scripts/setup.ts:
- Спросит имя проекта, slug, описание, ключевые слова → подменит в
package.json,src/shared/lib/seo.ts,src/widgets/app-shellиsrc/routes/login.tsx. - Спросит базовый brand-hue (OKLCH H, 0..360) → подменит
--brand-hвsrc/styles.css. - Сгенерирует
.envсDATABASE_URL(опц.), рандомнымAPP_AUTH_SECRETиAPP_PUBLIC_URL. - По желанию удалит
.git/и инициализирует новый репозиторий с первым коммитом.
После прогона scripts/setup.ts можно удалить — он одноразовый.
Затем:
bun run dev # запуск (Neon Launchpad заклеймит БД при пустом DATABASE_URL)
bun run db:migrate # накатить миграции
bun run db:seed # применить системные сиды из db/init.sql
bun run create-admin # создать первого админаbun run dev # vite dev, порт 3044
bun run build # production-сборка
bun run check # tsc -b (типы)
bun run lint # eslint (включая FSD layer-direction guard)
bun run format # форматирование (Prettier + Allman post-processor)
bun run format:check # только проверка
bun run imports:fix # переписать относительные ../../ на @/
bun run imports:check # проверка для CI
bun run test # vitest
bun run db:generate # сгенерировать новую миграцию из изменений схемы
bun run db:migrate # применить миграции
bun run db:seed # применить db/init.sql (после migrate)
bun run db:setup # migrate + seed одной командой
bun run db:studio # drizzle-kit studio
bun run create-admin # создать админа
bun run routes:gen # перегенерировать routeTree.gen.ts
bun run count # cloc по проекту
bun run doctor # react-doctorИнфраструктура:
- FSD-структура (
app → routes → widgets → features → entities → shared) + ESLint layer-direction guard черезimport/no-restricted-paths. - TS-алиасы
@/(./src/*),#/(./src/shared/*),$/(./public/*) + скрипт-конвертерimports:fix(../../→@/...). - Собственный форматтер (
scripts/format.ts): Prettier baseline + AST-постпроцессор для Allman-style фигурных скобок (Prettier/Biome это не умеют). - Pre-commit хук Husky:
check + lint + imports:check + format:check. - Drizzle + кастомный
scripts/migrate.ts(выноситALTER TYPE ADD VALUEиз транзакции, чтобы enum-значения можно было использовать в той же миграции). - shadcn-конфиг с алиасами в
src/shared/ui/(bunx shadcn add <name>кладёт компоненты прямо туда).
Фичи:
- Auth: email/пароль + сессии (хэш в БД, sliding renewal), middleware (
authMiddleware,adminMiddleware,roleMiddleware). - OIDC SSO через
openid-clientv6: админка провайдеров на/admin/oidc-providers, PKCE+state+nonce в HMAC state-cookie, авто-регистрация по email. - Тёмная тема (light/dark/system) с anti-FOUC inline-скриптом.
- Редактирование своего профиля (
features/profile-edit). - Админка: CRUD пользователей и SSO-провайдеров.
UI-атомы (shadcn-стиль в src/shared/ui/): button, input, field, select,
textarea, modal (через portal, SSR-safe), color-picker, multi-select-combobox с
пагинацией и поиском, load-more-footer, optimistic-toggle, theme-toggle.
См. CLAUDE.md — инструкции для AI-агентов с детальным разбором
паттернов проекта (createServerOnlyFn, Modal через portal, OKLCH палитра вокруг
--brand-h, anti-FOUC темы, и т.д.).
| Переменная | Назначение |
|---|---|
DATABASE_URL |
Postgres connection string. В dev Neon Launchpad заклеймит автоматически. |
APP_AUTH_SECRET |
HMAC-секрет для OIDC state-cookie. openssl rand -hex 32. В dev есть fallback с console.warn. |
APP_PUBLIC_URL |
Публичный origin приложения (https://app.example.com). Используется для построения redirect_uri OIDC. В dev fallback localhost. |
Префикс envPrefix настроен на APP_ — если хотите свой, замените в
vite.config.ts и переименуйте переменные.
src/
app/ инициализация приложения
providers/theme-provider контекст темы
tanstack-query/ queryClient + devtools
routes/ file-based routing TanStack Router
__root.tsx корневой документ + anti-FOUC + ThemeProvider
_authed.tsx гард авторизации
_authed/ защищённые роуты (index, admin/...)
api/auth/oidc/ OIDC login/callback
login.tsx страница входа
widgets/app-shell хедер + сайдбар
features/
profile-edit редактирование своего профиля
sso-auth OIDC хелперы (config, state-cookie, user-link)
entities/
user CRUD пользователей
oidc-provider CRUD SSO-провайдеров
shared/
ui/ shadcn-атомики
lib/ инфра (dates, pagination, theme, utils...)
auth/ cookie, middleware, password, session, token
db/ Drizzle client + schema/
router.tsx TanStack Start entry
styles.css палитра (light + dark)
db/init.sql системный seed (пустой по умолчанию)
drizzle/ сгенерированные миграции (пусто - сгенерируйте сами)
scripts/ format, migrate, seed, create-admin, setup, ...