尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Multi-tenant quotation and invoice SaaS for small businesses in India, built with GST
(CGST/SGST/IGST) rules in mind. See InvoiceFlow-spec.md and
InvoiceFlow-build-prompt-final.md for the full
product spec and implementation plan.
Next.js (App Router) + TypeScript, Tailwind CSS + shadcn/ui, Prisma against Supabase
Postgres, Supabase Storage, Clerk auth, Resend for email, react-pdf for PDF export.
1. Copy .env.example to .env and fill in real Supabase, Clerk, and Resend
credentials.
2. Install dependencies:
3. Apply the checked-in migrations to your Supabase database:檢視完整 README ↗Multi-tenant quotation and invoice SaaS for small businesses in India, built with GST
(CGST/SGST/IGST) rules in mind. See InvoiceFlow-spec.md and
InvoiceFlow-build-prompt-final.md for the full
product spec and implementation plan.
Next.js (App Router) + TypeScript, Tailwind CSS + shadcn/ui, Prisma against Supabase Postgres, Supabase Storage, Clerk auth, Resend for email, react-pdf for PDF export.
Copy .env.example to .env and fill in real Supabase, Clerk, and Resend
credentials.
Install dependencies:
npm install
Apply the checked-in migrations to your Supabase database:
npx prisma migrate deploy
(Use npx prisma migrate dev instead once you start changing
schema.prisma yourself — it diffs against the database and writes a new
migration file.)
Run the dev server:
npm run dev
Open http://localhost:3000.
Each business member has a role — owner, admin, or staff — plus an optional
position in a manager/report hierarchy (reportsToId on BusinessMember). Owner and
Admin see every document unconditionally; Staff visibility is scoped by hierarchy
(themselves and, if they have direct reports, their reports' documents too — see
docs/hierarchy-access-control-design.md).
"Manager" is never a stored role — it's derived live from whether a member has active
direct reports (lib/auth/permissions.ts).
Permission (what a member can do) and scope (which records they can see) are
independent axes — see docs/permission-layer-design.md.
Route handlers call requirePermission() / requireBusinessAdmin() /
requireBusinessOwner() from lib/auth/ to enforce both.
New members join by accepting an emailed invitation (never by "add member by email")
— see docs/invitation-onboarding-design.md
for the token/expiry/rate-limit design.
Sent documents can be shared via a public, unauthenticated link scoped to the
business's own subdomain ({business-slug}.{apex domain}/public/documents/{token}).
See docs/public-share-subdomains-design.md
for the slug generation/collision handling and why the subdomain isn't resolved in
middleware.
app/ routes: (auth), (app) [dashboard, quotations, invoices, customers,
products, settings], onboarding, invitations, invite/[token],
public/documents/[token], api
components/ ui (shadcn), layout, dashboard, documents, customers, products, settings
lib/ auth, business (hierarchy/slug/subdomain), db, tax, documents,
invitations, pdf, email, rate-limit, validation, storage, env
prisma/ schema.prisma, migrations
docs/ design docs for hierarchy/permissions/invitations/public sharing
Business logic (tax calculations, authorization, document calculations) lives in
lib/, not inside React components. Every tenant-owned query must be scoped by
businessId; use requireAuth() / requireBusiness() / requireBusinessOwner() /
requireBusinessAdmin() / requirePermission() from lib/auth/session.ts and
lib/auth/permissions.ts (or the redirect-on-failure *ForPage() variants in
lib/auth/page.ts) to get it — see lib/auth/.