尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
The web version of the practitioner app for Nigerian lawyers and NBA branches. A practitioner calculates the prescribed minimum fee under the Legal Practitioners (Remuneration) Order, 2023, issues an invoice their client pays into the branch account, uploads the payment slip, and receives a Certificate of Compliance that anyone can verify by its RBIN.檢視完整 README ↗The web version of the practitioner app for Nigerian lawyers and NBA branches. A practitioner calculates the prescribed minimum fee under the Legal Practitioners (Remuneration) Order, 2023, issues an invoice their client pays into the branch account, uploads the payment slip, and receives a Certificate of Compliance that anyone can verify by its RBIN.
It mirrors the Expo mobile app in the NBA APP repository, which is the source of truth for fee rules and screen design. The database (Supabase: auth, PostgreSQL, row-level security, storage) is shared with that app and the branch admin console, and its schema lives in NBA APP/supabase/migrations, not here.
Node 24.
npm ci
cp .env.example .env.local # Windows PowerShell: Copy-Item .env.example .env.local
npm run dev # http://localhost:3000
.env.local needs three public values:
| Variable | What it is |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | Project URL, from Supabase settings |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Publishable (anon) key. Never a service-role key |
NEXT_PUBLIC_VERIFICATION_URL | Host printed into certificate QR codes. Must match mobile's EXPO_PUBLIC_VERIFICATION_URL and must not change once real certificates are issued |
In Supabase Auth, allow /auth/callback and /auth/callback?flow=recovery as redirect URLs for each origin.
| Command | Does |
|---|---|
npm run dev | Development server |
npm run typecheck | Generates route types and runs TypeScript |
npm run lint | ESLint |
npm test | Unit tests (node --test, TypeScript run natively by Node 24) |
npm run build / npm run start | Production build and server |
Run all four checks before a pull request. Creating an invoice writes to the shared database, so test with a test account.
| Path | Holds |
|---|---|
app/ | Pages and server routes: calculator (/), transactions and invoices, certificates, profile, /verify, /membership, /administrator-account, /offline |
proxy.ts | Sign-in check, and the membership and administrator redirects |
components/mobile/ | The design system ported from mobile: screen, card, button, fields, badges, states, dialog, stepper, app shell, offline banner |
components/<feature>/ | Screens by feature: auth, calculator, transactions, certificates, profile, membership, verify, onboarding |
lib/fees/ | The fee engine (ported from mobile) and its tests |
lib/pdf/ | Server-drawn invoice and certificate PDFs |
lib/ (other) | Data loading and validation per feature, access rules, helpers |
public/sw.js | The service worker |
prompts/ | The plan and verification record for each piece of work (git-ignored; add with git add -f) |
Design tokens (colours, text sizes, radii, fonts) are in app/globals.css. Use the token classes (bg-primary, text-body, rounded-card) and the components/mobile kit rather than hard-coded sizes or colours.
app/manifest.ts), so browsers offer to install it. Installed, it opens in its own window with the NBA icon.public/sw.js runs in production builds only (set NEXT_PUBLIC_ENABLE_SW=true to try it under next dev)./offline page and static files (build assets, fonts, icons, onboarding images)./offline, where the fee calculator works in full. Actions that need the server are disabled with an "Offline" label, and a banner explains what still works.Practitioners use this app. Branch administrators and super administrators are separate accounts that work in the admin console; this app sends them to /administrator-account. The database, not this app, is what enforces that.