Agentic Trading Lab
에이전트와 대화하고, 거래 아이디어를 테스트하며, 코드 없이 실제 시장 데이터에 AI 트레이딩 에이전트를 적용
FinBoy로 WhatsApp·웹에서 지출을 관리하고 음성 입력·UPI 스크린샷·Google Pay 내역을 가져옵니다
Track expenses on WhatsApp or the web with FinBoy. Add voice entries, capture UPI screenshots and import supported Google Pay statements.
금융Python · TypeScriptGitHub @Sahal-P온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗FinBoy imports Gmail, saved .eml files, or a synthetic demo mailbox into an
evidence-backed ledger. A deterministic money engine provides tracked income,
confirmed net spending, commitments and cash-flow simulations. Review/correction,
privacy controls, and an English/Hindi/Malayalam text/voice assistant share the same
records. WhatsApp supports approved-sender ledger questions and screenshot capture;
hand-enrolled village pilot households also record money and dues by Hindi voice and
confirm them by button (pilot contract). Once sign-up is switched on,
new households join in one tap with WhatsApp (Google as the backup), each with its own private
records, and add money by typing or speaking (sign-up contract)
in English, Hindi or Malayalam, on the web and in the WhatsApp diary
(Malayalam voice contract).
The assembled product is merged into main and published to both requested repositories.
The production frontend is https://finboy.io, hosted on voxpay with its API and
PostgreSQL. The existing API hostname remains https://finboy-api.antlegs.in for
provider callbacks. See production operations and
frontend migration and release status.
Development integration history remains on feat/finboy-integration. Its frozen
baseline feat/finboy-ready-base is
fd618aef74336279e587748b216374d20cc892ad. See
parallel completion, the frozen
financial/API contract, and
demo runbook. Read the final handoff for remaining live
acceptance gaps; provider configuration alone never means completion.
SPEECH_TRANSCRIBE_PROVIDER=groq sends
English/Hindi to Groq whisper-large-v3-turbo (Malayalam stays on OpenAI);
SPEECH_TRANSCRIBE_PROVIDER=sarvam sends all three languages to Sarvam saaras:v3, and
MALAYALAM_TTS_PROVIDER=sarvam speaks Malayalam with Bulbul v3
(Malayalam voice contract).
OpenAI vision reads WhatsApp payment screenshots into the review queue. Resemble Ultra
English/Hindi (human's final provider choice), verified Gemini Malayalam TTS. System
ffmpeg/ffprobe validate/transcode real media. No cloning or training.Money stays integer paise in INR and dates use IST. Production supports the owner's
household login and, once SIGNUP_ENABLED is on, at most SIGNUP_LIMIT self-serve
households that each see only their own records. No bank API, WhatsApp merges/deletions,
automatic confirmation (pilot and self-serve WhatsApp households confirm, reject or correct
the amount of their own records by an explicit button tap, with undo; quick add's Save is an
explicit confirmation), stock/fund recommendations, or training.
“Estimated unallocated amount” comes from email-derived and confirmed records;
actual bank balances may differ. Simulations are not investment recommendations.
Use Node 24 LTS (engines allow 22.18–26), pinned pnpm 12.15.0, uv, Docker Compose, and ffmpeg/ffprobe for voice. Exact packages are in uv.lock and pnpm-lock.yaml.
uv sync --locked --all-packages
pnpm install --frozen-lockfile
pnpm env:setup
pnpm db:up
# Integration round's disposable database; already-exists is harmless:
docker compose exec -T postgres createdb -U finboy finboy_p5
pnpm db:migrate
FINBOY_EXTRACTION_MODE=offline API_PORT=8015 WEB_PORT=3015 pnpm dev
Before migrating, set the ignored backend env to local database finboy_p5 on 127.0.0.1:5433, exact CORS origins localhost:3015 and 127.0.0.1:3015, WEB_APP_URL=http://127.0.0.1:3015, DEMO_TODAY=2026-10-28. Web env sets NEXT_PUBLIC_API_URL=http://127.0.0.1:8015. Preserve the development database role. Other agents use their own databases/ports as documented. Never stop the shared PostgreSQL container or delete its volume during parallel work.
pnpm env:setup creates private ignored env files without overwriting existing
ones. Secrets belong only in ~/.config/finboy/secrets.env and ignored backend env,
mode 600. No secret values go in NEXT_PUBLIC variables, source, logs or screenshots.
Copy only required private settings directly; never print them. All model/voice IDs
are backend settings; missing providers give explicit unavailable/text-only states.
The demo uses 42 synthetic messages and actual recorded extraction responses.
FINBOY_EXTRACTION_MODE=offline replays recordings (model must match the manifest);
rules uses deterministic extraction. Normal configured imports can use live
extraction. Do not rerecord or invoke costly live evaluation without necessity.
| Command | Purpose |
|---|---|
| pnpm check / pnpm build | Lint, unit tests, strict web types / production build |
| pnpm db:migrate / pnpm db:check | Additive migrations / schema drift check |
| pnpm test:integration | Real local PostgreSQL persistence/HTTP/concurrency tests |
| pnpm test:system | Actual imports → finance → multilingual assistant → privacy tests |
| pnpm eval:extraction | Offline strict recorded extraction evaluation |
| pnpm eval:triage | d1-ultra gate on synthetic messages, questions and photos (--check offline) |
| pnpm eval:gpay <statement.pdf> | Google Pay statement gate on a real statement kept outside the repo; aggregates only |
| pnpm voice:benchmark | Offline intent and actual fixture-media validation |
| pnpm demo:render-mailbox --anchor 2026-10-28 | Render synthetic mailbox; does not seed SQL totals |
| pnpm seed:gmail-demo-inbox | Separate insert-only OAuth seeder; human consent |
| pnpm dev:whatsapp-ingress | Exact webhook-only loopback proxy (API_PORT / WHATSAPP_INGRESS_PORT) |
| pnpm final:check-env | Explicitly validate final local finboy/8000/3000 setup |
| pnpm final:db:migrate | Apply additive migrations to reviewed final local finboy |
| pnpm dev:final-api | Start assembled API on registered Gmail callback 8000 |
| pnpm build:final-web / pnpm start:final-web | Build for API 8000 / serve web 3000 |
Final launch does not rewrite p5 env. It refuses production/remote/unexpected settings. Review the runbook before using it and preserve other running ports. No startup creates tables; 0002_phase1 seeds the local user, 0003_whatsapp adds only minimal consent/receipt/delivery metadata. Product records must be generated through the actual import pipeline, never by inserting expected demo totals.
Open /connect → Load demo mailbox. Progress reports real work; then dashboard, transactions, review and assistant consume actual stored records. Sources/evidence and user revision history remain inspectable. Re-import is idempotent and preserves user decisions. Privacy deletion removes imported evidence/orphaned ledger records and extraction cache, preserving audit history. Use it on the reviewed disposable application environment when resetting the demo; do not drop databases/tables.
Gmail setup: read-only application scope; seeder insert-only scope is separate. OAuth app remains Testing, refresh tokens expire after seven days. Registered Gmail callbacks are 8000/8002, not 8015. A2's previous grant was revoked deliberately; the human reconnects before a live demo.
Voice: actual provider capability checks, stock voices and benchmark limits. Browser records at most 30 s / 3 MB into memory, gives an editable transcript, and requests speech separately. Human performs mic permissions; no fake audio.
WhatsApp: existing Meta app/portfolio, approved test sender allowlist, signature/context checks, temporary token expiry, restricted tunnel, metadata-only persistence and durable duplicate suppression. Accepted Graph sends are distinct from delivered/read replies; confirm actual receipt on the approved phone. No arbitrary send endpoint, broad public API tunnel, or production publishing.
Village pilot: Hindi WhatsApp-first pilot for at most 10
hand-enrolled households (4 plus the owner on the Meta test number), consent card, voice
records through review, dues, opt-in reminders, "हिसाब" summaries and the counts-only
pilot.cli report. Enrollment, templates and erasure are operator steps.
Sign-up: one-tap WhatsApp sign-in (a login code confirmed by a
button tap), sign-up inside WhatsApp, Google as the backup, quick add, daily limits and
"Delete my account". Off until SIGNUP_ENABLED is set. The human moves WhatsApp to a real
business number with a permanent token, creates the Google sign-in client and passes brand
verification, and has the draft /privacy-policy and /terms reviewed; see the
sign-up release procedure.
Human performs login/2FA/CAPTCHA/consent/billing. Identify browser profiles by account and stable identity, not numeric IDs after restart. Never send tests to unapproved recipients. Do not push, deploy or merge into main without the requested approval.
Health: /api/v1/health reports core/database availability. Readiness: /api/v1/readiness distinguishes schema, tools and provider configuration; it explicitly does not claim live acceptance. BackgroundTasks are in-process and not durable. Memory-only work cannot replay after restart; stale imports/tasks are marked failed/ interrupted. Responses are no-store, have generated request IDs, and expose fixed errors. Structured logs omit bodies, URLs/query strings, secrets, SQL parameters, exception text and financial content.
See architecture, extraction, money, product UI, design system, integration handoff. The original design worktree and the pre-existing A2 .gitignore edit are preserved.
API contract and synthetic examples describe the isolated read-only demo, overdue liabilities, honest manual scan coverage, versioned review/undo, history pagination, recoverable extraction and private export/deletion previews. Source isolation operations include a read-only aggregate inventory command and non-destructive migration policy. The F01–F38 map distinguishes backend, Product, assembled browser and human acceptance. Never use the old demo import to populate a household ledger. Local UX disposable databases are finboy_ux_api and finboy_ux_ui; all existing production and shared-service protections remain binding.