尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Crew scheduling for small landscaping companies.
An owner books jobs onto crews across a calendar; each crew opens a phone page showing only their stops for the day and marks them done. Recurring jobs regenerate automatically. Multi-tenant — many companies sign up, and their data never mixes.
Next.js 16 (App Router) · React 19 · Prisma 7 with the @prisma/adapter-pg
driver adapter · PostgreSQL on Neon · Tailwind v4 · TypeScript · Vitest ·
argon2 (@node-rs/argon2) · Zod · Resend · Stripe (hosted Checkout and
Billing Portal).
npm install
cp .env.example .env # then fill in the values below
npm run db:push:test # applies the schema to the TEST database only
npm run dev
The app runs at http://localhost:3000.
| Variable | Purpose |
|---|---|
DATABASE_URL | Production database. Never write to it from a dev machine. |
TEST_DATABASE_URL | Disposable test database; must contain "test" or the suite refuses to run. |
APP_URL | Absolute origin for emailed links and Stripe redirects. Defaults to localhost in appUrl(), but requireAppUrl() throws rather than guess. |
RESEND_API_KEY | Transactional email. Unset means email silently no-ops — see below. |
EMAIL_FROM | Sender address, on a domain verified in Resend. |
STRIPE_SECRET_KEY | Stripe API key. |
STRIPE_WEBHOOK_SECRET | Verifies the webhook signature. The webhook is the only code that creates an Org. |
STRIPE_PRICE_ID | The subscription price. |
STRIPE_PORTAL_RETURN_URL | Optional; derived from APP_URL when unset. |
CRON_SECRET | Authenticates the daily cron routes. They fail closed without it. |
PURGE_ENABLED | Must be "yes" before the deletion job deletes anything. Unset, it reports and does nothing. |
sendEmail never throws — it logs and returns a boolean, so no user-facing
operation fails because a mail provider is down. The trade-off is that a
missing RESEND_API_KEY looks exactly like success. If you are testing the
password-reset or verify-email flows locally, set it.
| Command | Does |
|---|---|
npm run dev | Development server. |
npm test | Vitest against the test database. |
npm run lint | ESLint, including the import-boundary rules. |
npm run build | Production build. |
npm run db:push | Applies the schema to DATABASE_URL — production. |
npm run db:push:test | Applies the schema to the test database. |
npm run db:seed | Truncates everything; refuses to run when real logins exist. |
npm run db:grandfather | Marks pre-billing companies active. Needs GRANDFATHER_CONFIRM=yes. |
Schema changes are applied with prisma db push — there is no migrations
directory — and every change must reach both databases.
All four, in any order:
npx tsc --noEmit
npm run lint
npm run build
npm test
npm test alone is insufficient: Vitest transpiles without typechecking, which
has let a broken build land here before.
AGENTS.md is the real document — it covers the authorization boundary, the
per-tenant scoping pattern, the billing model and deploy order, and a list of
bugs that have already happened here and are easy to reintroduce. Read it
before changing anything under src/lib/auth/, src/lib/data.ts, or billing.