Oracle3
Open-source trading engine and MCP server for prediction markets. Fee-aware no-arbitrage trading across related contracts, live on Kalshi, Polymarket and Solana or on paper.
Track your transactions, spending and savings in one place.
FinanceTypeScript · JavaScriptGitHub @BLAVI12OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Starter repository for a financial planning app. The structure is intentionally framework-neutral and ready for a future Supabase integration.
Copy .env.example to .env.local and add your Supabase project URL and publishable key. Never put a Supabase secret or service-role key in client-side environment variables.Read the full README ↗Personal finance planner: a Next.js web app in web/, deployed on Vercel
at https://fse-group-project.vercel.app, with Supabase for the database and
login, and a bank connection through Tink (Demo Bank sandbox). The database
and the app's server routes both run in Ireland: Supabase in eu-west-1 and
Vercel Functions in Dublin (dub1, set under Settings → Functions on Vercel).
To check it, the x-vercel-id response header contains dub1.
The project documentation (user stories with acceptance criteria, the Tink integration, decisions) starts at docs/README.md.
Nothing needs to be installed.
[email protected] and password demo-planner-2026. This login is public on
purpose and owns only sandbox data (demo login).web/ Next.js app: pages, API routes, components (see web/README.md)
src/
features/ Shared JavaScript: categorisation and exact amounts; auth/ is unused (see Authentication)
lib/supabase/ Supabase client for the shared code
supabase/
migrations/ Database schema, applied in file-name order
seed.sql Demo login and sample data
seed-data/ Category list; seeds/ holds the SQL generated from it
functions/_shared/tink/ Tink client and bank-data rules, used by the web app
tests/ Tests for the shared code; tests/database/ checks the database
docs/ Project documentation: user stories, Tink integration, decisions, data model
The web app has its own settings file; see web/README.md. For the scripts in
scripts/, copy .env.example to .env.local and add your Supabase project
URL and publishable key. Never put a Supabase secret or service-role key in
client-side environment variables.
The web app logs in with @supabase/ssr directly: email and password in
web/app/login/page.tsx, and Google login finished on the server in
web/app/auth/callback/route.ts. See web/README.md.
src/features/auth/ is an earlier, framework-neutral login service written
before the web stack was chosen. The web app does not use it; only the manual
check scripts/try-login.mjs and its own tests in tests/ do.
The web app runs on http://localhost:3000 locally. Google sends the user back
to Supabase, and Supabase then sends them to the app's /auth/callback.
http://localhost:3000 (plus the Vercel
URL once deployed).https://<project-ref>.supabase.co/auth/v1/callback.http://localhost:3000/** (plus https://<vercel-app>.vercel.app/** once
deployed). Use the wildcard form: the app asks to return to
/auth/callback?next=/dashboard, with a query string attached.The same Google OAuth flow handles both login and registration. A first-time
Google user is registered in Supabase Auth; an existing user is logged in. The
web app exposes this flow on both /login and /register.
The bank connection runs in the web app, in the server route web/app/api/tink
with web/lib/tink.ts; its settings and setup are in web/README.md. A GitHub
Actions schedule (.github/workflows/bank-sync.yml) also updates every user's
bank data four times a day through web/app/api/cron/bank-sync. The Tink
code it uses lives in supabase/functions/_shared/tink/ (the folder name comes
from an earlier plan to run it as Supabase Edge Functions). client.ts talks
to Tink, consents.ts decides when a bank permission must be renewed, and
errors.ts decides what the user is told when the bank or Tink fails.
convert.ts turns Tink's accounts and transactions into our rows (amounts
as integer cents from Tink's varying decimal scale, booked/pending status,
transfer flag); reconcile.ts decides which stored transaction each
incoming one is, so a repeated sync never duplicates rows. Both are pure
functions with tests in tests/tink/, run against 309 real Demo Bank
transactions in tests/fixtures/.
USER_NOT_FOUND). In a controlled test, two users connected on 23 October
were still there after 10 hours and gone after 38 hours, untouched. One user
created on 2 October has not been deleted; we don't know why. We ruled out our
own code (no version of it ever deleted a Tink user) and two people sharing
one Demo Bank login (two app users on the same Demo Bank login stayed healthy
side by side). Support is not available to sandbox apps. Effect: the app asks
the person to reconnect; their saved accounts, transactions and categories
stay. An hourly read-only check on 26 and 27 October saw this happen: one
user's Tink user disappeared between 14:58 and 08:53 UTC; the app marked the
connection expired and kept all 3,582 saved transactions. The demo login was
not affected.TINK_TEST_MODE=false. Real banks would need a commercial and regulatory
arrangement with Tink, code changes and testing against real banks.main is not protected on GitHub. Reviews and green checks before
merging are a team rule (AGENTS.md), not enforced by GitHub.Needs Node 24 or later.
npm test # unit tests
npm run typecheck # TypeScript type check
npm run check:category-seed
CI also builds a throwaway database from the migrations and seed files and
runs the checks in tests/database/ against it: data, ownership and
cascade rules in the database itself (db-check.sql), and the access rules
through the real Auth and Data API (rls-check.mjs). Locally, with Docker and
the Supabase CLI:
supabase start
eval "$(supabase status -o env)"
psql "$DB_URL" -f tests/database/db-check.sql
node tests/database/rls-check.mjs "$API_URL" "$PUBLISHABLE_KEY"
Rules for every coding agent working in this repository, and for the people
instructing them, are in AGENTS.md: no direct pushes to main,
no secrets in Git, a person types the bank login, and the data rules learned
from live Tink data. The agent configuration is versioned here:
AGENTS.md, CLAUDE.md (points to AGENTS.md) and
web/AGENTS.md (notes for the Next.js app).
Co-Authored-By: line naming
the agent.Category names, keyword rules, and ignored test descriptions are maintained in
supabase/seed-data/transaction-categories.json. The dashboard sorts
transactions into categories with this list (web/lib/data/dashboard.ts); a
category set by hand on the transaction takes precedence.
The same list fills the category tables of migration 008 through a generated, idempotent SQL seed. Regenerate or verify it with:
npm run generate:category-seed
npm run check:category-seed
Bank data reaches the database only through the Tink sync, which uses the
categorisation and exact-amount helpers in
src/features/transactions/transaction-rules.js. See
docs/fintech-erm.md for the data model.