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.
Gastos, ingresos, proyectos, agenda y métricas
Translation pending
FinanceTypeScript · HTMLGitHub @carlosaurelio94OnlineOwner 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
Finance, shift and scheduling PWA for gig delivery workers: real hourly earnings and daily targets. Minute-resolution push with the scheduler inside Postgres
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
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 · VercelRead the full README ↗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.