尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗A giving platform for churches in Ghana. Its own service, separate from Church Manager (customer #1).
The database design lives in supabase/migrations/0001_ledger.sql.
churches and givers: reference records. Never deleted.gifts: one row per gift, in whole pesewas. The church receives amount_pesewas exactly; fee_pesewas is what the giver adds. Append-only.gift_events: every change of a gift's progress (pending, succeeded, failed, abandoned, refunded) is a new row. Append-only. A repeated provider notice is rejected by a unique provider_event_id.gift_status and church_totals: read-only views for the current status and what each church has received.src/lib/payments/types.ts: the one interface Maizz talks to (initialise, submit code, verify, refund, parse webhook, capabilities). A second provider later means another adapter, not an app rewrite.src/lib/payments/paystack.ts: the Paystack adapter. Mobile money is charged directly from the Maizz page (givers see Maizz, not Paystack). Cards and bank transfer use Paystack's secure page.src/lib/payments/webhookHandler.ts and src/app/api/webhooks/paystack/route.ts: receive Paystack's notices. A notice is refused unless its signature matches. A payment is only recorded as paid if the amount and currency match the gift exactly. A repeated notice is recorded once.src/lib/config.ts: refuses a live Paystack key unless MAIZZ_ALLOW_LIVE=yes (do not set it before the legal checks are done).src/lib/ledger.ts: the only code that writes to the ledger./setup-check: private page that tests each setting without showing any value. Needs SETUP_CHECK_TOKEN. Also starts a GH₵1 test payment and checks the result. Switched off (404) in Production since 13 Oct 2026: the owner dashboard (Churches, System) does the same jobs behind the owner sign-in. Set MAIZZ_ADMIN_TOOLS=on in Vercel to bring it back for a short while. Until the first owner has set a password it shows only "Add the first Maizz owner".npm install
npm run dev
npm run typecheck
npm test
Givers cover Paystack's 1.95% and Maizz's own 1%, so the church receives the exact gift (src/lib/fees.ts). Whole pesewas only; fees are rounded up.
/give/maizz-test-church is the giver's page: amount (quick buttons or any amount), gift type, mobile money network and number, name or anonymous. It shows "Gift + fees = total" and says only "Maizz". The giver is told thank you only when the ledger says the gift succeeded. Only an active church has a giving page. Run supabase/migrations/0003_gift_types.sql once in Supabase. Card and bank transfer come later.
0004_status_rules.sql). The same payment is recorded once, whether the notice or our own check arrives first./setup-check has a test-mode refund button./api/cron/reconcile, 03:00, needs CRON_SECRET in Vercel) settles waiting gifts, re-checks gifts paid in the last 3 days against the provider, and writes problems to the audit log. /setup-check shows FIX if it has not run in 26 hours.supabase/migrations/0005_church_accounts.sql (after 0003 and 0004) once in Supabase./setup-check has a Churches section: add a church (starts pending), set up its payout account (bank or mobile money, from Paystack's Ghana list), check the account holder's name Paystack returns, then activate. A church cannot be activated without a payout account and your confirmation./give/<church-slug> and works only while the church is active.Blue (#011BFF), white and ink, in the spirit of atom.money. The giving page is a blue field with the amount at the top and one white sheet below. Logo files are in public/brand. Fonts Outfit and DM Mono. The design rule is in CLAUDE.md.
The design brief is docs/design.md. The Claude Design mock-ups (giving page, home, church dashboard, sign-up, receipts, Church Manager "My giving", owner tools) were exported on 10 Oct 2026. The giving page, home page and "page not found" page are built to them. The dashboard, sign-up and "My giving" screens wait for steps 8 and 9, because they need church sign-in with 2FA first. Receipt emails are not built yet, so no page promises one.
People who sign in for a church are added from the owner tools (setup check page, Team). They get an email link to choose a password. To sign in they enter email and password, then a six-digit code sent to their email. Pages: /church/sign-in, /church/invite, /church. Needs migration 0006_church_staff.sql and the settings STAFF_SECRET, RESEND_API_KEY and MAIZZ_FROM_EMAIL. The dashboard screens (overview, gifts, payouts, team, settings) come next.
Signed-in church people see: Overview (last 7 days, this month, all time, by gift type, latest gifts), Gifts (filters, detail, CSV for finance and owners), Payouts (payout account, totals; payout history later), Team and Settings (owners), and a printable QR share card. Pages are in src/app/church/(app). Roles: viewer, finance, owner. Payout history, receipts, password reset and pausing giving are done (see below). The Church Manager "My giving" link (step 8) is built; see docs/CHURCH_MANAGER_LINK.md.
ALERT_EMAIL (plus the email settings). Odd events email the owner at most once an hour per kind. A second cron, /api/cron/watchdog at 08:00, emails if the daily check did not run./church/forgot and /church/reset. Needs migration 0007_password_reset.sql.docs/INCIDENT_RESPONSE.md.Needs migration 0008_owner_signup_pause.sql. The System page shows "Owner dashboard tables are installed" once it is run.
/owner (own sign-in at /owner/sign-in, own people, own sessions and its own cookie, so a church sign-in can never open it). It shows totals across all churches, Maizz's own fee share, failed or waiting gifts, whether the daily check ran, every church, applications and recent alerts. Add the first owner from the setup page ("Maizz owners", at most 5; in Production only until the first owner has a password). Payouts, opening and suspending a church are now under Churches in the dashboard (see the group A notes below)./register. It only saves an application (name, town, contact name, email, phone). Limits: 3 per connection per day, 100 waiting at once, a hidden box for robots. You get an alert email. Accepting an application in the owner dashboard adds the church as "pending" and emails the contact an invite as the church's owner. You still set up the payout account and open the church on the setup page.Needs migration 0009_owner_payout_code.sql (run it in Supabase before the code goes live).
/owner/churches): add a church, set its payout account, open or suspend it, see its people and send an invite again. Changing a payout account needs a fresh six-digit code emailed to the signed-in owner (works once, 10 minutes), and the church's owners are emailed afterwards ("Your payout account was changed to •••• 1234 by Maizz")./owner/system): the setup checks, "Run the daily check now" and "Download the books"./setup-check and /api/admin/* answer 404 unless MAIZZ_ADMIN_TOOLS=on. The nightly check addresses are not affected.docs/LIVE_DATABASE.md.Needs migration 0010_atomic_limits_retention.sql (run it in Supabase before the code goes live) and a new Vercel setting RATE_LIMIT_SECRET (32+ random characters, Production, Sensitive).
src/lib/retention.ts), and the contact details of declined church applications after 90 days. Paid gifts keep their giver. The System page has "Remove a giver's details" (by gift reference) for data requests.middleware.ts). Reports are listed in the audit log as csp.report. Set MAIZZ_CSP=enforce to block for real.Needs migration 0011_refund_total_rule.sql, and two Vercel settings before the code goes live: RATE_LIMIT_SECRET (32+ random characters, Sensitive) and MAIZZ_PUBLIC_URL (for example https://maizz-nu.vercel.app, no slash). Without them giving is refused and no invite or reset email is sent.
MAIZZ_LIVE_DATABASE=yes is set (set it in every Vercel environment that can reach the live database)..github/workflows/tests.yml runs the checks on every push; .github/dependabot.yml checks packages weekly. Turn on branch protection for main in GitHub settings so the checks must pass.Needs migration 0012_owner_authenticator.sql (run it in Supabase before the code goes live: the code reads a new column).
docs/INCIDENT_RESPONSE.md.Needs migration 0013_counters_and_payout_rule.sql (run it in Supabase before the code goes live: the code now counts attempts in a new table).
limit_hits, emptied every night.TOTP_KEY (32+ random characters, different from STAFF_SECRET), and before a live key PROVIDER_STAND_IN_EMAIL (a mailbox Maizz owns). For step 8, MEMBER_LINK_MASTER_KEY (32+ random characters, Production, Sensitive; the link is off everywhere without it).