尚未偵測到更新。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.