PRISM-INSIGHT
These are 13 specialized AI agents that analyze Korean and US stocks in real-time, and this is open source and free to use.
AI translation
Track monthly committee auctions and payments.
Translation pending
FinanceGitHub @abhibansal60OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
Shared ledger for a monthly savings group among friends: payments, monthly records, Google sign-in
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗A shared ledger for a monthly savings group run among friends: who has paid in, by cash or UPI, and a running record for every month. Built for infrequent use (once or twice a month) with two access levels - a read-only shared link for members, and a PIN-protected admin link for the group's organiser.
Next.js (App Router, TypeScript) · Tailwind CSS · Drizzle ORM · Postgres via Neon · deployed on Vercel.
See src/lib/calc/dues.ts (computeMonthDues) - the single source of truth
for all payout/dues calculations, covered by unit tests in
src/lib/calc/dues.test.ts.
Members join once with Google (valid for the whole committee year) and bid live from the app on auction day.
Holder flow (admin link):
Practice room: the dashboard's "🧪 Practice room" card makes a
throwaway copy of the committee (members, numbers, settings and results so
far; no payments) at its own admin link, and signs the holder straight in.
Bots play every seat nobody has logged into - they bid while the host
console is open with "Bots" ticked, then fold so the fuse burns out.
Friends can join with their number and pick the practice committee at
login (or switch from their home screen). "Reset" wipes and recreates it at
the same link; nothing in it can touch the real committee. No extra
tables: the copy's admin token is derived from the real committee id with
AUTH_SECRET (src/lib/live/practice.ts).
Member flow: /login with their number (or tap the personal link) →
/play is their passbook (season track, what they owe, winners so far) →
/play/live is the room: one big gold button bids the next amount, side
buttons jump higher, every bid relights the fuse, emoji reactions float
across everyone's screen, sounds/haptics for bids, outbids and the hammer.
Members who've already won (and the holder) watch and react but can't bid.
Profit/loss is never shown in the member experience.
Rules live in src/lib/live/rules.ts (tested): bids are the discount,
in steps of ₹500, from the opening bid up to the largest bid
computeMonthDues accepts; the runner-up is the last person the winner
outbid. Bids are placed with a single conditional SQL statement, so two
people tapping at the same instant can't both win - the loser gets "Too
slow!". Sync is by polling (~1s while live), so it works on Vercel with no
extra services; the fuse closes lazily on the first read after it expires.
The live room uses five new tables (member_profiles, live_settings,
auction_sessions, auction_bids, auction_reactions) and touches no
existing ones - until they exist, the rest of the app keeps working and
the live pages show a "one quick setup step" notice. Create them with:
npm run db:push # against the production DATABASE_URL
(drizzle/0001_live_auction.sql is the same change as a migration file,
if the database is managed with db:migrate.)
Copy .env.example to .env.local and fill in:
DATABASE_URL - a Postgres connection string. Recommended: create a
free Neon project and use a dev branch, so local
dev matches production. A plain local Postgres
(postgres://user:pass@localhost/db) also works - src/lib/db/index.ts
switches to node-postgres for localhost URLs.AUTH_SECRET - 32+ random bytes:
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"SETUP_PASSPHRASE - any passphrase; required to create a committee via
/new (a crude anti-spam gate, not a real user system).GOOGLE_CLIENT_ID,
GOOGLE_CLIENT_SECRET, BETTER_AUTH_SECRET (32+ random bytes) and
BETTER_AUTH_URL (the app's origin, e.g. http://localhost:3000).Push the schema to your database:
npm run db:push
Run the dev server:
npm run dev
Run tests:
npm test
Visit /new, enter the setup passphrase, and fill in the committee terms and
member list. On success you'll see two links once:
/admin/<token>) - give this only to the committee holder.
It's protected by a PIN set during setup./c/<token>) - share this with all other members.Save both immediately; the admin link is not shown again (though it can be recovered by anyone with database access - there's no "forgot admin link" flow in v1).
/go/admin and /go/member redirect to whatever URLs are set in the
GO_ADMIN_URL and GO_MEMBER_URL environment variables (unset by default -
each responds 404 until configured). Set these in Vercel's environment
variables to the full admin/member links for your committee, redeploy, and
share https://<your-domain>/go/admin / /go/member instead of the long
tokenized URLs. Keep GO_ADMIN_URL as private as the admin link itself - it
grants the same access.
Off unless GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET are set. The join
link is /join/<committee id>.<signature> (signed with AUTH_SECRET, nothing
stored). Google's stable account id, not the email, identifies a member.
After joining, members log in at /login with Google. Phone-number login
still exists but is off by default; the holder can turn it on in the Live
room settings, and phone fields then appear on the Players page.
Better Auth runs the OAuth round trip in
stateless mode (no tables of its own); links live in member_google_accounts.
The OAuth client needs the redirect URI <origin>/api/auth/callback/google
for every origin (localhost and production; Google allows no wildcards, so
Vercel preview URLs can't sign in with Google).
DATABASE_URL, AUTH_SECRET, SETUP_PASSPHRASE in the Vercel
project's environment variables.npm run db:migrate against the production DATABASE_URL (or apply
migrations as part of the build step) before first use./new on the deployed URL to create the real committee.Notifications/reminders, OTP-verified login, late-payment penalties/interest, edit audit history.