pnpm 工作区 + Turborepo 管理多应用与共享包
monorepo-template — Vite 启动器模板
作者 louisbrulenaudet
基于 pnpm 工作区与 Turborepo 的全栈 Monorepo 启动模板,包含 Hono API Worker 与 React SPA,部署到 Cloudflare Workers。
看看你的网站会是什么样
浏览真实页面截图,比较内容排版与手机效果。点击下方缩略图切换,放大查看整页细节。
全部页面与视图 3
截图用于了解视觉与布局,交互效果请以实际项目为准。
值得关注的模板亮点
从已有项目资料中,快速了解它的特点。
内置 worker-api(Hono HTTP 网关)与 front-app(React SPA)两个可部署应用
共享包覆盖 Zod 线协议、枚举、Hono 中间件及 TypeScript/Vitest 配置
Worker 按角色前缀命名并分配固定端口段,便于扩展
集成 Changesets 版本管理与 GitHub Actions CI/CD、预览工作流
附带 Cursor 与 Claude Code 的 agent 规则及钩子脚本
模板详细介绍
该模板面向需要将多个 Worker 与前端应用放在同一仓库管理的全栈项目。仓库使用 pnpm 工作区与 Turborepo 组织构建,包含两个可部署应用:worker-api 是基于 Hono 的 HTTP 网关,front-app 是调用该网关的 React SPA。共享包提供 Zod 线协议、枚举、Hono 中间件以及 TypeScript 与 Vitest 配置预设。
架构上,浏览器只通过 HTTP 访问网关,Worker 之间通过 service binding RPC 调用,每个数据库由唯一 Worker 持有。Worker 按名称前缀区分角色(worker-api、worker-*、queue-*、webhook-*、mcp-*、front-*),端口按角色分配(87xx 给 Worker,517x 给前端开发服务器)。
仓库还包含 Changesets 版本管理、GitHub Actions 的 CI/CD 与预览工作流,以及面向 Cursor 和 Claude Code 的 agent 规则与钩子脚本。CD 默认暂停,需在 GitHub 仓库的 production 环境中配置 Cloudflare 与 Sentry 相关变量和密钥后手动启用。
使用限制:需要 Node.js 24(≥24.11)与 pnpm 11 以上;首次运行无需环境文件,但部署与远程 Worker 功能需要 Cloudflare 账号。新增 Worker 没有生成器,需复制相近应用并手动配置端口、发布顺序与绑定。
适合你的项目吗?
适用场景
- 需要将多个 Cloudflare Workers 与前端 SPA 放在同一仓库统一构建与部署
- 希望以 Hono 作为 HTTP 网关、Worker 间通过 service binding RPC 通信
- 需要在团队中共享 Zod 线协议、枚举与 Hono 中间件等跨应用代码
- 为 agent 辅助开发准备规则、技能与钩子脚本的仓库结构
适合人群
- 熟悉 pnpm 工作区、Turborepo 与 Cloudflare Workers 的开发者
- 计划在 Cloudflare 边缘运行全栈应用并自行管理部署配置的团队
- 需要多 Worker 按角色划分、共享类型与中间件的项目
上手与定制指南
结合仓库当前版本的说明,按下面的资料检查内容、配置与运行要求。
- 1
需要 Node.js 24(≥24.11)与 pnpm 11 以上;依赖安装须在仓库根目录执行
- 2
首次运行无需环境文件;worker-api 的 Sentry 通过 .env 或 shell 中的 SENTRY_DSN 开启,未设置时保持关闭
- 3
安装后运行 pnpm types 生成各应用的 Env 类型,修改 cloudflare.config.ts 后需重新生成
- 4
CD 默认暂停,需在 GitHub production 环境配置 CLOUDFLARE_API_TOKEN、CLOUDFLARE_ACCOUNT_ID 等变量与密钥,并将 CD_ENABLED 设为 true
- 5
新增 Worker 需复制相近应用并手动配置名称、端口、发布顺序与绑定,不要在 cloudflare.config.ts 存在前运行 cf init/dev/build
授权与来源资料
使用条件与限制
免费使用 · 保留许可声明本次收录的是公开仓库中采用 Apache-2.0 许可的免费版本;免费范围为该版本代码,不代表外部服务或第三方素材免费。
使用时需要遵守
- 允许免费使用、修改、商用和分发;分发时需随附 Apache-2.0 许可证。
- 修改过的文件需显著标明改动,并保留相关版权、专利、商标及归属声明。
- 若原项目附有 NOTICE 文件,分发衍生作品时需保留其中适用的归属声明。
- 许可包含适用的贡献者专利授权;发起许可所述专利诉讼会终止该专利授权,且不授予商标使用权。
- 代码按现状提供;担保与责任限制以原许可证及适用法律为准。
额外费用与待核对事项
- 部署、登录及使用远程 Worker 功能需要 Cloudflare 账号;仅本地首次运行无需账号。
- CD 默认暂停,需在 GitHub production 环境配置 Cloudflare/Sentry 变量与密钥并将 CD_ENABLED 设为 true 才能启用自动部署。
- 网关的 Sentry 监控默认关闭,需自行提供 SENTRY_DSN 才启用。
- 分支预览默认暂停,需完成 Cloudflare Access 等一次性配置并将 PREVIEWS_ENABLED 设为 true 才可用。
- 新增 Worker 无生成器,需手动复制相近应用并配置名称、端口、发布顺序与绑定。
- 要求 Node.js 24(≥24.11)与 pnpm 11 以上,依赖安装须在仓库根目录执行。
- 演示图片、字体、图标及其他第三方素材需按各自许可核对,不能仅凭代码的 Apache-2.0 许可判断。
- 域名、托管、数据库、支付或 AI 等外部服务可能另外收费。
查看原文依据
no-charge, royalty-free, irrevocable copyright license
许可证原文
**Cloudflare account** only for `pnpm run login`, deploys, and remote Worker features
README 原文
Set the repository variable `CD_ENABLED` to `true` in the same act as adding them.
README 原文
`SENTRY_DSN=<dsn>` in `apps/worker-api/.env`, or `SENTRY_DSN=<dsn> pnpm dev`, turns on the gateway's Sentry, which stays off when unset.
README 原文
**Previews are paused** until the repository variable `PREVIEWS_ENABLED` is `true`.
README 原文
There is no generator: copy the closest sibling under `apps/`, its `cloudflare.config.ts` and `vite.config.ts` included, and wire it in.
README 原文
https://github.com/louisbrulenaudet/monorepo-template/blob/main/LICENSEhttps://github.com/louisbrulenaudet/monorepo-template/blob/main/README.md**Node.js 24** (≥ 24.11; `.nvmrc` pins the exact version)
README 原文
DeepSeek 根据仓库许可证和 README 整理 ·2026-10-02。结果仅覆盖已读取资料,依赖、图片、字体及后续条款变更以各自原文为准。
项目核对记录与介绍依据
模板资料
- 来源平台
- GitHub
- 资料与维护参考分
- 资料较完整 · 92 / 100
- 技术栈
- Vite · React
- 网站类型
- 启动器
这个分数如何计算
本站按许可资料(最高30分)、演示链接(12分)、预览图(10分)、Star数(15分)、记录的维护时间(15分)、描述完整度(8分)、功能记录(5分)和分类资料(5分)计算。它不是代码、安全或性能测试,也不是 Google 评分;有链接不代表已实测可用。
这个项目需要核对什么
- 记录的仓库更新时间
- 2026-10-02
- 截图检查日期
- 2026-10-02
已收录演示链接。请用你的内容与屏幕尺寸检查;有演示不代表表单、认证或支付已经可用。
目录记录的主要技术栈是 Vite。请通过依赖清单和锁文件核对实际版本与托管要求。这些说明基于收录资料,不代表代码审计或部署实测。
查看具体选型方法 →介绍的制作与核对状态
介绍由 AI 辅助整理目录与仓库资料。仓库作者不等于这篇介绍的审核者。
已完成服务器许可规则与 AI 来源核对;未经过人工编辑审核。
查看当时使用的来源资料
SHA-256: a514be4408674d657a14bdd9509966e486fde50eae405ece8041d57ec48e2aa2
2026-10-02T18:08:57.914Z
来源文件 / 仓库# Monorepo starter based on pnpm with Cloudflare, Hono, React, Vite and Tailwind 🚚⛅
[](https://oxc.rs/)
[](https://www.typescriptlang.org/)
[](https://developers.cloudflare.com/)
[](https://pnpm.io/)
[](https://turborepo.dev/docs)
A minimal, production-oriented monorepo starter built on pnpm workspaces with Turborepo, Cloudflare Workers, Hono, React (Vite), **Tailwind CSS v4**, and **TanStack Router/Query**. It ships two apps - [`worker-api`](apps/worker-api/README.md), a Hono HTTP gateway, and [`front-app`](apps/front-app/README.md), a React SPA that calls it over HTTP - plus the shared packages, CI/CD, and agent tooling to grow into more Workers.
## Architecture
```mermaid
flowchart TB
subgraph entry [Public entry]
direction LR
Front["front-* :517x"]
Ext["External providers"]
McpClients["MCP clients"]
end
subgraph publicWorkers [Public Workers]
direction LR
Gateway["worker-api :8700"]
Webhook["webhook-* :876x"]
Mcp["mcp-* :878x"]
end
subgraph privateWorkers [Private Workers]
direction LR
Biz["worker-* RPC only"]
Queue["queue-*"]
end
subgraph shared [Shared packages]
direction LR
Enums["@repo/enums-common"]
DTOs["@repo/dtos-common"]
Enums --> DTOs
end
Front --> Gateway
Ext --> Webhook
McpClients --> Mcp
Gateway --> Biz
Webhook --> Biz
Mcp --> Biz
Gateway --> Queue
Webhook --> Queue
Biz --> Queue
shared -.-> Front
shared -.-> publicWorkers
shared -.-> privateWorkers
```
A Worker's name prefix states its role (`worker-api`, `worker-*`, `queue-*`, `webhook-*`, `mcp-*`, `front-*`); the full table is in [AGENTS.md](AGENTS.md). Browsers reach the gateway over HTTP only, Workers call each other through service-binding RPC, and every database has exactly one owning Worker.
```
.
├── apps/ # Deployable Workers and SPAs
├── packages/ # Shared @repo/* libraries and config presets
├── hooks/ # Agent hook scripts for Cursor and Claude Code
├── .changeset/ # Pending release notes
├── .agents/ # Agent skills (source of truth)
├── .claude/ # Claude Code rules, agents, settings
├── .cursor/ # Cursor mirror of the same rules and agents
└── .github/ # CI, release, CD, and Preview workflows
```
| Shared package | Purpose |
|----------------|---------|
| [`@repo/dtos-common`](packages/dtos-common/README.md) | Zod Mini wire contracts, one subpath per boundary (`/api` today) |
| [`@repo/enums-common`](packages/enums-common/README.md) | Shared constrained string values as `as const` objects |
| [`@repo/hono-middleware`](packages/hono-middleware/README.md) | Hono middlewares shared by the public-HTTP Workers: request id, Sentry, secure headers, JSON errors, validation |
| [`@repo/typescript-config`](packages/typescript-config/README.md) | TypeScript presets for Workers, React/Vite, and libraries |
| [`@repo/vitest-config`](packages/vitest-config/README.md) | Vitest factories for Node and the Cloudflare Workers pool |
## Getting started
### Prerequisites
- **Node.js 24** (≥ 24.11; `.nvmrc` pins the exact version) - [fnm](https://github.com/Schniz/fnm) is a good version manager
- **pnpm** 11 or later on `PATH`: it switches itself to the version pinned in root `package.json` `devEngines.packageManager` (Corepack reads only the legacy `packageManager` field, so it no longer applies)
- **Cloudflare account** only for `pnpm run login`, deploys, and remote Worker features
### Install
```sh
pnpm install # dependencies + workspace links - always from the repo root
pnpm exec cf cli telemetry disable # once per machine; replaces Wrangler's send_metrics: false
pnpm run login # optional - cf auth login, for deploys and remote resources (bare pnpm login is the npm-registry builtin)
pnpm prepare # Vite+ pre-commit hook
```
Each app's Cloudflare config is a typed `cloudflare.config.ts`, run by the `cf` CLI (beta). `pnpm types` generates the `Env` types of every app with a `types` script (`worker-api` today) into its gitignored `.cloudflare/types/index.d.ts`; `pnpm check-types` runs it first, and `cf dev` / `cf build` refresh it. Run it once after install so the editor sees `Env`, and again after editing a `cloudflare.config.ts`.
No env file is needed for a first run. A Worker app takes local secrets from a gitignored `.env` or the shell, never a `.dev.vars`: `SENTRY_DSN=<dsn>` in `apps/worker-api/.env`, or `SENTRY_DSN=<dsn> pnpm dev`, turns on the gateway's Sentry, which stays off when unset. Frontend overrides go in `apps/front-app/.env`, copied from `.env.example`. Every `.env*` file there holds public `VITE_*` values only, and the agent sandbox, which cannot read them, runs the app with `SKIP_ENV_FILES=1` so the Cloudflare Vite plugin skips them instead of aborting.
### First run
1. `pnpm dev` starts every dev server (`cf dev`, which runs Vite with the Cloudflare plugin for both apps).
2. `http://localhost:8700/api/v1/health` answers `{ "status": "ok", "version": "0.0.0" }`.
3. `http://localhost:5174` serves the SPA; its footer shows the API version.
4. **Shift+Alt+D** reveals the Vite DevTools dock. Its Rolldown panel stays empty until a build has run: `pnpm turbo run build --filter=front-app`.
Work on one app with `pnpm turbo run dev --filter=worker-api`. `pnpm run` lists every root script; `pnpm run check` is the seconds-long static check and `pnpm run ci` the full local PR gate. Every PR also gets a non-blocking **Code quality** comment listing the unused code (Knip) and duplicated code (jscpd) it adds or resolves; `pnpm knip` and `pnpm jscpd` show the whole repo locally.
### Git hooks
`pnpm prepare` installs the [Vite+](https://viteplus.dev/guide/commit-hooks) pre-commit hook (`.vite-hooks/pre-commit`). It runs `vp staged --fail-on-changes` - oxfmt and oxlint safe fixes on staged files only, configured in the `staged` block of the root [`vite.config.ts`](vite.config.ts). When a fix changes a file, the commit stops and leaves the fix unstaged: review it, `git add` it, and commit again; the `lint-staged automatic backup` entry it leaves in `git stash list` can be dropped once the commit succeeds. `vp hooks status` checks that the dispatcher is active, and `VP_GIT_HOOKS=0 git commit …` skips it for one commit. The agent hooks in [`hooks/`](hooks/README.md) are a separate system that never runs on a human commit.
## Development ports
Workers use **87xx** by role: gateway 8700-8709, business 8710-8739, queue 8740-8759, webhook 8760-8779, MCP 8780-8789. Frontends use **5170-5199** for Vite dev and **4170-4199** for preview; today `worker-api` runs on 8700 and `front-app` on 5174 (preview 4174). The assigned registry and the local-dev rules live in [`.claude/rules/backend/ports.md`](.claude/rules/backend/ports.md).
## Create a new Worker
There is no generator: copy the closest sibling under `apps/`, its `cloudflare.config.ts` and `vite.config.ts` included, and wire it in. Never run `cf init`, `cf dev`, or `cf build` in the new directory before its `cloudflare.config.ts` exists: `cf` autoconfiguration rewrites the project.
1. **Name** it with the prefix for its role (table in [AGENTS.md](AGENTS.md)), e.g. `apps/worker-account`, and rename `name` in `package.json` and in each deployment of `cloudflare.config.ts` (the bare name for development, `-staging` / `-production` for the deployed Workers).
2. **Port**: take the next free port in the role's range - `server.port` in `vite.config.ts` and `monorepo.devPort` in `package.json`.
3. **Release wiring** in the `package.json` `monorepo` block: `deployOrder` (lower promotes first - gateways before the SPAs that call them) and `healthPath` (the public path CD probes, or `null` when the app has no public HTTP surface). CD discovers apps from `apps/*` and fails closed when either is missing.
4. **Turbo**: a package `turbo.json` with `"extends": ["//"]` and `"tags": ["app"]`, which `pnpm boundaries` checks.
5. **Bindings and secrets**: in `env` of `cloudflare.config.ts` - `bindings.secret()` for a secret, with a `bindings.text()` fake in the `test` mode. Keep the same `env` keys in every mode: `Env` is inferred from the whole config.
6. **Install and typegen**: `pnpm install`, then `pnpm types`.
Service bindings and RPC typing: [`.claude/rules/backend/workers-config.md`](.claude/rules/backend/workers-config.md). Queue consumers use the dual-handler layout in [AGENTS.md](AGENTS.md).
## Releases and deploys
Versioning is [Changesets](https://changesets.dev). Every app under `apps/` shares one version, a release is a `vX.Y.Z` git tag plus a Cloudflare Workers promote, and nothing is published to npm. Add a changeset naming the affected apps to any PR that changes what an app ships (`pnpm changeset`; `pnpm release:check` gates it in CI), check what is queued with `pnpm release:status`, and release by merging the `chore: release` PR. Contributor walkthrough: [`.changeset/README.md`](.changeset/README.md); pipeline invariants and recovery: [`.claude/rules/ops/release.md`](.claude/rules/ops/release.md).
### Continuous deployment
[`cd.yml`](.github/workflows/cd.yml) uploads a version of every app (`cf workers versions create`), promotes each to 100% in `monorepo.deployOrder` (`cf workers deployments create`), smokes the gateway, and creates the GitHub Release. The production Workers are `worker-api-production` and `front-app-production`. Pipeline detail: [`.claude/rules/ops/cd.md`](.claude/rules/ops/cd.md).
> [!NOTE]
> **CD is paused** until the `production` GitHub Environment holds the values below. Set the repository variable `CD_ENABLED` to `true` in the same act as adding them.
| Name | Kind | Purpose |
| --- | --- | --- |
| `CLOUDFLARE_API_TOKEN` | secret | `cf` auth - a scoped token, never a global API key |
| `CLOUDFLARE_ACCOUNT_ID` | secret | Target account |
| `VITE_API_BASE_URL` | variable | Production API origin baked into `front-app` |
| `VITE_SENTRY_DSN` | variable | Optional public `front-app` Sentry DSN, also used by Preview builds; empty disables Sentry |
| `SENTRY_ORG` | variable | Optional; arms the CD steps that upload each app's source maps to the Sentry project named like the app, then mark its release deployed (auto-resolving `Fixes <SHORT-ID>` issues) |
| `SENTRY_AUTH_TOKEN` | secret | Sentry org auth token for those steps (scoped to the steps, never the build) |
| `CD_ENABLED` | variable | Must be `true` for `release.yml` to call CD |
Token permissions: Account → Workers Scripts Edit (required) and Account Settings Read (typical for `cf` and Wrangler); Zone → Workers Routes Edit only with zone routes; Account → Secrets Store Edit only when binding Secrets Store.
Before the first production deploy:
- Set `SENTRY_DSN` once per deployed Worker: `pnpm exec wrangler secret put SENTRY_DSN --name worker-api-<staging|production>`, or pass `--secrets-file <path>` to `cf deploy` / `cf workers versions create`, keeping that file outside the checkout (e.g. under `$TMPDIR`) and deleting it after use. `worker-api` declares it with `bindings.secret()`; Previews bind it as an empty text value, so Sentry stays off there. Wrangler signs in separately from `pnpm run login` (`cf auth login`): run `pnpm exec wrangler login` first, or export `CLOUDFLARE_API_TOKEN` / `CLOUDFLARE_ACCOUNT_ID`.
- Set `corsOrigins` in the `production` deployment of [`apps/worker-api/cloudflare.config.ts`](apps/worker-api/cloudflare.config.ts) (the `CORS_ORIGINS` binding). It ships empty, which fails closed (`/api/*` answers 503 and the CD smoke fails), and text bindings ship inside the uploaded version, so fixing it takes a new release rather than a CD re-run.
After the first production deploy, run `pnpm --filter=<app> exec cf workers triggers deploy --mode production` once per app, and again after changing `previewUrls`, `workersDev`, routes, custom domains, or crons in its `cloudflare.config.ts`: CD's versions and deployments apply no triggers.
To ship by hand: `pnpm turbo run deploy --filter=<app> --force` (or `pnpm run deploy` for every app) builds, type-checks, uploads, and moves 100% of traffic in one step (`cf deploy --prebuilt --mode production`); `pnpm turbo run upload --filter=<app> --force` (or `pnpm run upload`) only uploads a version. `--force` skips Turbo cache reads, so a hand ship never uses a Build Output restored from the remote cache, which same-repo PR runs can write. Promote an uploaded version, or roll back to an earlier one (`pnpm --filter=<app> exec cf workers deployments list --worker <app>-production` shows the previous version ids), with `pnpm --filter=<app> exec cf workers deployments create --worker <app>-production --strategy percentage --versions '[{"version_id":"<id>","percentage":100}]'`.
### Branch Previews
[Worker Previews](https://developers.cloudflare.com/workers/previews/) give a branch an isolated, production-like copy of each Worker with its own URL, logs, and traces. `pnpm preview:deploy` builds each app as a Preview under `--mode production`, deploys it with `cf previews deploy` under a name derived from the branch (`PREVIEW_NAME=demo` overrides), and smokes it; `pnpm preview:delete` removes it with `wrangler preview delete`, which `cf` lacks (same separate Wrangler sign-in). [`preview.yml`](.github/workflows/preview.yml) does the same for every same-repo PR and deletes it when the PR closes.
> [!NOTE]
> **Previews are paused** until the repository variable `PREVIEWS_ENABLED` is `true`. First do the once-per-account setup in [`.claude/rules/ops/previews.md`](.claude/rules/ops/previews.md) - apply `previewUrls` once per app (`pnpm --filter=<app> exec cf workers triggers deploy --mode production`), set `corsOrigins` in the `PREVIEW` deployment of `apps/worker-api/cloudflare.config.ts`, and put Cloudflare Access on the `front-app` Preview URLs, which are public by default. Then create a `preview` GitHub Environment holding `CLOUDFLARE_API_TOKEN` and `CLOUDFLARE_ACCOUNT_ID` (same permissions as CD), plus the optional `CF_ACCESS_CLIENT_ID` / `CF_ACCESS_CLIENT_SECRET` of an Access service token included in a Service Auth policy, so the smoke probe passes Access.
## Agent tooling
[AGENTS.md](AGENTS.md) is the entry point for coding agents - Cursor reads it directly, Claude Code through [CLAUDE.md](CLAUDE.md). Every app, package, and `hooks/` carries its own `AGENTS.md` and `CLAUDE.md` pair, and path-scoped rules are mirrored under `.claude/rules/` and `.cursor/rules/`.
> [!IMPORTANT]
> **Start Claude Code from the repository root.** `.claude/settings.json` - permission denies, hooks, sandbox - [loads only from the directory a session starts in](https://code.claude.com/docs/en/large-codebases), so a session started in `apps/worker-api/` reads every instruction file but runs without the enforcement layer. For package-scoped work, start at the root and filter: `pnpm turbo run <task> --filter=<package>`.
- **Domain reviews** - human-only `/review [domains] [focus]`: bare `/review` (or `/review all`) runs every domain - `architecture`, `ci`, `code-quality`, `configuration`, `performance`, `security`, `seo`, `simplicity`, `tests`, `ui` - and `/review security` or `/review security,ci apps/worker-api` runs only those; the focus is a path, a workspace, `diff` (changes against `main`), or free text. It runs one read-only `reviewer` subagent per domain in parallel, verifies every finding against the cited line, and replies with a single plan whose items carry IDs (`C1`, `I2`, `H1`...) you can answer with `fix C1, I2` or `accept O1`. It writes no files. A new domain is one file: `.agents/skills/review/domains/<id>.md`.
- **Stack reviews** - human-only `/review-stack <selector> [focus]`: a dep (`oxc`, `sentry`, `cf`...), a family (`frontend`, `workers`, `toolchain`, `tanstack`, `observability`, `agents`), `all`, or `changed` (deps touched since the last release), comma-separated to combine - e.g. `/review-stack oxc`, `/review-stack tanstack caching`, `/review-stack changed`. Bare `/review-stack` lists every dep. It retrieves ground truth first (the installed documentation MCP collector, then the official docs), runs one subagent per dep in parallel, verifies every cited finding, and replies with a single plan whose items carry IDs (`C1`, `I2`...) you can answer with `fix C1, I2` or `accept O1`. It writes no files. A new tool is one file: `.agents/skills/review-stack/deps/<id>.md`.
- **Hooks** - the agent guard, format, and lint hooks: [hooks/README.md](hooks/README.md).
- **`.cursorignore`** trims what the model sees; it is not an access-control boundary.
## Contribution
- Run `pnpm run ci` before opening a PR; GitHub CI runs the same gates.
- Add a changeset (`pnpm changeset`) naming the affected apps to every PR that changes what an app ships, including through a shared package or a runtime dependency bump.
- Wire-format changes update `@repo/dtos-common` and every producer and consumer in the same PR.
Licensed under the [Apache License 2.0](LICENSE).
看看同类模板
对比同技术栈与用途的模板,找到更适合的视觉与内容结构。

react-starter-kit
Modern React starter kit with Bun, TypeScript, Tailwind CSS, tRPC, Stripe, and Cloudflare Workers. Production-…
Vite · SaaS

cove
The Cove Stack: 🏝️ minimal TanStack Start template with Vite+, Better Auth, Drizzle ORM, shadcn/ui
Vite · SaaS

vite-react-boilerplate
A production ready, scalable starter template for Vite + React
Vite · 启动器

react-vite-admin
This Starter utilizes React, Recoil, React Query, React Hooks, Typescript, Axios And Vite. 全新技术栈的后台管理系统
Vite · 后台

typescript-react_best_practices-vite_template
<⚡⚛️> Start your React project with Vite following code best practices (TypeScript, Linting, testing, CI/CD…)
Vite · 启动器

cloudflare-starter-kit
Template (boilerplate) repository for scaffolding Cloudflare Workers projects
Vite · 启动器
