Oracle3
Oracle3: 예측시장 거래 엔진·MCP 서버
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
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.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.