Oracle3
Oracle3: 예측시장 거래 엔진·MCP 서버
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Finance, shift and scheduling PWA for gig delivery workers: real hourly earnings and daily targets. Minute-resolution push with the scheduler inside Postgres
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Mobile-first PWA for personal finances, work shifts and scheduling, aimed at
gig delivery and rideshare workers: it tracks what you actually earn per hour
and how far you are from the day's target.
Stack: Next.js 16 (App Router) · TypeScript · Tailwind · Supabase
(magic-link auth, PostgreSQL, RLS) · web-push · pg_cron + pg_net · VercelREADME 전문 보기 ↗Mobile-first PWA that answers two questions: how long will my money last this month? and, for rideshare and delivery drivers, how much do I really make per hour? — counting real kilometres with the phone's GPS.
Live: https://desempleo-inky.vercel.app
Stack: Next.js 16 (App Router) · React 19 · TypeScript · Tailwind · Supabase (Postgres + RLS, magic-link and Google auth) · web-push · pg_cron + pg_net · Leaflet · Vitest + Playwright · Vercel
Two kinds of people use it, and the navigation adapts to each (Hoy · Cuentas · + · Jornada or Métricas · Más).
Everyone — money in order
Drivers and couriers (Uber, Rappi, Didi, PedidosYa…) — the Jornada tab
Works without signal: entries logged offline queue on the phone and sync when connectivity returns; the app shell opens offline.
Also: agenda with push reminders, shared Trello-style boards, CSV export, download all my data and delete my account.
Browser (PWA) Vercel (Next.js) Supabase
───────────── ──────────────── ────────
Server Components ───────────────► SELECTs with the user's session ──► Postgres + RLS
Client Components ─── inserts/updates directly with the anon key ───► (RLS is the
security layer)
Service worker: push, offline cache
OfflineSync: queue → upsert by id
GPS: watchPosition → lib/geo ──────────────── rpc save_gig_track ───► gig_tracks
/api/share → Gemini / Claude
/api/push/* → web-push ◄─── pg_cron + pg_net
/api/account (delete / export)
/api/log → Vercel logs
auth.uid();
routes that need more (cron, invitations, account deletion) use the service
role on the server only.src/lib as pure functions (runway, GPS
distance, real earnings, budgets, dates, amount parsing, offline queue) and
is unit-tested in isolation.A scheduler inside the database. Vercel's Hobby plan can't run cron at
minute resolution, and scheduling reminders from the frontend depends on the
app being open. pg_cron fires every minute inside Postgres, pg_net POSTs to
/api/push/cron with a shared secret, and the handler sends due reminders
through web-push. Trade-off: two extensions and a secret to rotate, in
exchange for minute resolution without a paid plan or a separate worker.
GPS distance you can trust. Summing raw readings turns an 80 km day into
110 km: a parked phone jitters 5–30 m and occasionally jumps hundreds of metres.
lib/geo.ts drops readings with poor accuracy, ignores moves smaller than the
noise (without moving the anchor, so slow progress still adds up), rejects
impossible speeds, and adds a straight line when the signal comes back.
Saving is a single idempotent RPC, so a retry on a flaky connection never
double-counts kilometres. The heatmap is aggregated in Postgres
(gig_heat_cells) instead of shipping thousands of points to the phone.
Offline first where it matters. Drivers log trips in places with no data.
Failed inserts go to a local queue with a client-generated id; OfflineSync
flushes it with upsert … ignoreDuplicates when the connection returns, and
resolves the shift id at send time.
The user's day, not the server's. Vercel runs in UTC: after 9 p.m. in
Argentina it is already "tomorrow". Everything that depends on today
(shifts, runway, today's agenda, greeting) goes through lib/dates.ts with
the user's time zone.
Amounts from any country. "$12.345,67", "$1,234.50", "$ 15.990"
(CLP) and "Bs. 1.234,56" all parse correctly (lib/amount.ts) — both for
LLM output and for what users type.
src/
app/(app)/ screens behind login: hoy, cuentas, jornada, metricas, mas,
agenda, proyectos, capturar, ajustes, como-funciona
app/api/ share, push/cron, push/test, boards/invite, account, log
lib/ pure logic (+ supabase clients, fx, push)
components/ BottomNav, QuickExpense, OfflineSync, gps/, ui/
instrumentation.ts, middleware.ts
public/sw.js service worker (push + offline)
supabase/migrations SQL for schema changes
docs/DATABASE.md tables, views, functions and jobs
tests/ Vitest (lib, api routes, components)
e2e/ Playwright smoke tests
npm install
cp .env.example .env.local # fill in your keys (see comments in the file)
npm run dev # http://localhost:3000
Required: Supabase URL, anon key and service role key; the VAPID keys
(npx web-push generate-vapid-keys) and CRON_SECRET. Optional:
GEMINI_API_KEY or ANTHROPIC_API_KEY for receipt reading
(CAPTURE_DAILY_LIMIT, default 40) and ADMIN_EMAIL.
No secrets in the code. Keys, tokens, the admin e-mail and the Supabase
project live only in environment variables (.env.local, which is git-ignored,
and Vercel → Settings → Environment Variables). tests/security/no-secrets.test.ts
scans every tracked file on each PR and fails if a key, token or personal e-mail
shows up.
The schema, RLS policies and functions are documented in
docs/DATABASE.md. New changes go in
supabase/migrations/ and are applied in the Supabase SQL editor; after
creating a function run notify pgrst, 'reload schema';.
npm test # Vitest: ~520 tests, no network or database needed
npm run test:e2e # Playwright smoke tests against the production build
npm run test:coverage # coverage report in ./coverage
Unit tests cover the pure core (runway, GPS filtering, real earnings, budgets,
time zones, amount parsing, offline queue, receipt extraction), every API route
and the auth middleware, with Supabase, web-push and the LLM providers replaced
by in-memory doubles (tests/helpers/supabase.ts). The E2E suite runs the
production build and checks public pages, route protection and the login flow.
Pull requests run type-checking, unit tests and E2E in GitHub Actions and get a
Vercel preview. Merging to main deploys to production automatically.
Runtime errors from the server and the browser are logged as one-line JSON in
Vercel → Logs ("source":"server" / "source":"client").
The production URL (
desempleo-…) comes from an earlier name of the project.