Oracle3
Oracle3: 예측시장 거래 엔진·MCP 서버
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A multi-user personal finance tracker: accounts, categories, and transactions, entered manually or synced from a bank through Plaid (sandbox). A weekly spending digest is emailed to each user.
I built it to learn AWS system design hands-on: serverless compute, API Gateway with Cognito auth, private networking, event-driven pipelines with SQS, and managing all of it with Terraform.README 전문 보기 ↗A multi-user personal finance tracker: accounts, categories, and transactions, entered manually or synced from a bank through Plaid (sandbox). A weekly spending digest is emailed to each user.
I built it to learn AWS system design hands-on: serverless compute, API Gateway with Cognito auth, private networking, event-driven pipelines with SQS, and managing all of it with Terraform.
flowchart LR
subgraph Client
FE[React + TypeScript<br/>Vite, hosted on Vercel]
end
FE -- JWT --> APIGW[API Gateway REST<br/>Cognito authorizer]
FE -- signup/login --> COG[Cognito User Pool]
COG -- PostConfirmation --> PC[post-confirmation λ]
APIGW --> ACC[accounts λ]
APIGW --> CAT[categories λ]
APIGW --> TXN[transactions λ]
APIGW --> PL[plaid-link λ]
PLAID[(Plaid Sandbox)] -- webhook --> APIGW
APIGW --> PW[plaid-webhook λ]
subgraph VPC [VPC: private subnets only]
ACC & CAT & TXN & PC --> RDS[(RDS Postgres 16)]
PP[plaid-persist λ] --> RDS
DG[digest λ] --> RDS
end
PL & PW --> SM[Secrets Manager<br/>Plaid tokens + cursors]
PL & PW --> Q1[[plaid-events SQS]] --> PP
EB[EventBridge<br/>weekly cron] --> DG --> Q2[[notification-events SQS]] --> NT[notifications λ] --> SES[SES email]
TXN --> Q3[[transaction-events SQS]]
PostConfirmation trigger Lambda creates their row in users./accounts, /categories, /transactions) is handled by one Lambda running a small Hono router. Every query is scoped to the caller's user_id, which is looked up from the token's sub claim, so users can't read or change each other's data.plaid-link creates a Link token and exchanges the public token for an access token. It stores the token in Secrets Manager and puts an item_created event on SQS.SYNC_UPDATES_AVAILABLE, plaid-webhook pages through /transactions/sync from the stored cursor, saves the new cursor, and puts the changes on SQS.plaid-persist runs inside the VPC and consumes that queue. It upserts rows into Postgres, keyed on Plaid's transaction ID, so redelivered messages are idempotent. Re-syncs don't overwrite a category the user set by hand.An EventBridge cron triggers digest. It totals each user's last 7 days of transactions by category and puts one message per user on SQS. notifications sends each message as an email through SES.
Every queue has a dead-letter queue (maxReceiveCount = 4) and a CloudWatch alarm on DLQ depth.
| Layer | Tech |
|---|---|
| Frontend | React 19, TypeScript, Vite, React Router, react-plaid-link (hosted on Vercel) |
| API | AWS API Gateway (REST), Cognito authorizer |
| Compute | AWS Lambda (Node.js 22), Hono, Zod validation, bundled with esbuild |
| Data | RDS PostgreSQL 16, Drizzle ORM and migrations |
| Async | SQS + DLQs, EventBridge scheduler, SES |
| Secrets | Secrets Manager (RDS master password managed by RDS; Plaid credentials and per-item tokens) |
| Infra | Terraform (modular: network, database, auth, api, async, plaid, migrate) |
| Testing | Vitest: unit tests per handler, plus integration tests against the deployed API |
plaid_transaction_id / plaid_account_id plus ON CONFLICT upserts make replaying a message safe.numeric(12,2), never floating point.backend/
src/db/schema.ts Drizzle schema (users, categories, accounts, transactions, plaid_items)
src/lambdas/<name>/ one handler per Lambda (+ unit tests)
src/integration/ integration tests against the deployed API
drizzle/ generated SQL migrations
scripts/build-<name>.sh esbuild bundle -> dist/<name>.zip
frontend/ React SPA
infra/
modules/ Terraform modules
envs/dev/ dev environment (root module)
docs/superpowers/ design spec and phase-by-phase implementation plans
Prerequisites: Node 22, Terraform ≥ 1.7, an AWS CLI profile, a Plaid sandbox account, and an SES-verified sender email.
# 1. Build the Lambda bundles
cd backend && npm install
for f in scripts/build-*.sh; do bash "$f"; done
# 2. Provision infrastructure
cd ../infra/envs/dev
# create terraform.tfvars with: aws_profile, ses_sender_email, plaid_client_id, plaid_secret, plaid_env
terraform init && terraform apply
# 3. Apply database migrations (invoke the migrate Lambda)
aws lambda invoke --function-name dev-financeapp-migrate /dev/stdout
# 4. Run the frontend
cd ../../../frontend && npm install
cp .env.example .env # fill in values from `terraform output`
npm run dev
To link a bank in the Plaid modal, use user_good / pass_good. For an item where you can create test transactions via /sandbox/transactions/create, use user_transactions_dynamic.
cd backend
npm test # unit tests (mocked)
API_BASE_URL=... TEST_USER_EMAIL=... TEST_USER_PASSWORD=... \
npm run test:integration # hits the real deployed stack
Done: infrastructure, auth, core CRUD API, frontend, the async digest/notification pipeline, and Plaid sandbox sync.
Next: