Give your agent a wallet you control.
에이전트가 일회용 카드나 기계 결제 프로토콜로 온라인 결제하고, 모든 요청을 직접 승인
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Self-hosted LLM-based personal expense-tracker; Built entirely with AI
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A self-hosted expense tracker that turns receipts and bank statements into a clean, reconciled ledger.
Snap a receipt or upload a PDF bank statement and the app extracts the transactions, classifies and matches them to your expenses, and verifies the numbers add up, the goal is to kee your ledger complete and trustworthy with little manual entry.
I want to understand my spending: where my money goes and where I could save. The app turns my receipts and bank statements into a ledger I can trust. One question I want it to answer: "I want to buy this, can I?"
It is also an experiment in building a real app with AI. I don't write the code. I direct the AI and review its output, and when it gets something wrong I fix the workflow rather than patch the code myself. Having the AI plan before it writes code is a big part of how this works. I want to see how far this goes while keeping the code decent, and that friction shows me where my AI workflows need work.
AI is used in two places: building the app, and features inside it such as receipt OCR and bank statement extraction, with more planned.
It is self-hosted, so my financial data stays on my own instance.
I build it in public on purpose. If the AI pushes bad code it is visible to anyone, and the risk of embarrassment keeps the bar higher.
Experimental, with frequent breaking changes. It is not optimized for performance. The goal is a decent, working app. No fixed end goal, though handling small company expenses later would be nice.
CHARGES/CREDITS columns, CR markers,
foreign-currency rows, multiple cardholders, and header/footer noise. Extracted rows link back to
your expenses so nothing is double-counted.AWS-backed features (Textract, Bedrock, Bedrock Data Automation, S3) default to mock mode, so the
app runs end-to-end locally with no cloud account; set them to real for production.
Requires JDK, sbt, Node, and PostgreSQL. See docs/guide/local-setup.md for the full setup, then:
sbt server/run # backend (http://localhost:9000)
sbt web/dev # frontend (http://localhost:8080)
Database schema is managed by Play Evolutions and applied on startup. API docs (Swagger UI) are served
at /api/docs/index.html.
sbt server/test # backend (needs Docker for a throwaway Postgres)
sbt web/test # frontend
Runs the whole app locally: Postgres, backend, and web with no extra setup:
docker compose up --build
Then open http://localhost:8080. The web dev server proxies /api/* to the backend
container, so the frontend reaches the backend with no reverse proxy. The first start is slow
(it links the Scala.js bundle and boots webpack); later starts are fast.
What comes up:
| Service | Port | What it runs |
|---|---|---|
postgres | — | Postgres 16 (schema applied automatically by Play Evolutions) |
backend | 9000 | Play backend in dev mode (sbt server/run) |
web | 8080 | Scala.js webpack dev server (sbt dev-web), proxies /api → backend |
Stop with Ctrl-C; docker compose down -v also removes the database volume.
Receipt OCR and bank-statement extraction use AWS. They default to mock (no AWS calls), so the
app runs fully without an AWS account. To enable the real services, copy .env.example to .env,
set the relevant *_MODE to real, and fill in credentials, docker-compose propagates these into
the backend container:
| Variable | Purpose |
|---|---|
TEXTRACT_MODE / BEDROCK_MODE / BDA_MODE | mock (default) or real per feature |
AWS_REGION, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY | credentials for Textract + S3 |
AWS_S3_BUCKET | bucket for stored documents |
BEDROCK_REGION, BEDROCK_ACCESS_KEY_ID, BEDROCK_SECRET_ACCESS_KEY | statement extraction (Amazon Bedrock) |
BDA_PROFILE_ARN, BDA_STANDARD_PROJECT_ARN, BDA_BANK_STATEMENT_BLUEPRINT_ARN, BDA_OUTPUT_S3_URI | statement-extraction fallback (Bedrock Data Automation) |
JEV_MODE | mock (default, placeholder picks, no document classification) or real for bank-statement row category/merchant suggestions and the document classifier (JEV) |
JEV_API_KEY (optional JEV_BASE_URL, JEV_MODEL, JEV_MIN_CONFIDENCE) | JEV API credentials for the suggestions and the classifier; JEV_MIN_CONFIDENCE (default 0.85) is the lowest document-type confidence the classifier acts on |
Ansible playbooks under infra/ deploy to a managed server behind nginx. Admin API routes are intended
to sit behind the reverse proxy's HTTP basic auth — keep that in place.
Bootstrapped from the wiringbits Scala web-app template.
MIT — see LICENSE.