尚未检测到更新。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.