Oracle3
Oracle3: 예측시장 거래 엔진·MCP 서버
AI 기반 거래 분류와 포트폴리오 추적, 재무 인사이트를 제공하는 자체 호스팅 다중통화 개인 자산 인텔리전스 플랫폼
Self hosted multi-currency personal wealth intelligence platform with AI-powered transaction classification, portfolio tracking, and financial insights.
금융TypeScript · JavaScriptGitHub @danielvsantos온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Self-Hosted Personal Finance for Global Citizens
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Self-Hosted Personal Finance for Global Citizens.
AI-powered transaction classification, real-time portfolio tracking, passive income projection, and an MCP server for your AI agents.
Secured by AES-256 encryption. Open-source and designed for global wealth.
Most financial tools force you to trade privacy for convenience. If your financial footprint spans multiple countries, currencies, and asset classes, you're usually handing your most sensitive data to a third-party SaaS — or stitching it together in spreadsheets.README 전문 보기 ↗Most financial tools force you to trade privacy for convenience. If your financial footprint spans multiple countries, currencies, and asset classes, you're usually handing your most sensitive data to a third-party SaaS — or stitching it together in spreadsheets.
Bliss is the open-source alternative. A single, self-hostable dashboard that unifies bank accounts, investment portfolios, expense tracking, and financial summary reporting across borders. Everything runs on your infrastructure, classified by AI, normalized to your chosen currency, and encrypted at rest.
Built with Spec-Driven Development — every feature was documented in detailed technical specs before a line of code was written.
A deterministic AI waterfall that learns from your behavior and gets smarter over time:
| Tier | Method | Speed | How it works |
|---|---|---|---|
| 1. Exact Match | In-memory cache | < 1ms | O(1) lookup against your transaction history. Instantly recognizes recurring merchants. |
| 2. Vector Match (tenant) | pgvector cosine search | ~10ms | Semantic matching using 768-dim embeddings (Gemini or OpenAI). Catches variations like "AMZN" vs "Amazon.com". |
| 3. Vector Match (global) | Cross-tenant pgvector | ~10ms | Falls back to global embeddings, discounted by 0.92x, for new tenants with sparse data. |
| 4. LLM Fallback | Configured LLM provider (Gemini, OpenAI, or Anthropic) | ~500ms | Full AI classification with reasoning for truly novel transactions. Confidence is hard-capped at 0.90, with the top band reserved for cases where merchant + Plaid hint + amount all agree. The model can decline genuinely opaque transactions instead of guessing. |
Every correction feeds the loop immediately — your override updates the in-memory cache and generates a new vector embedding, so the same merchant is auto-classified next time.
Adapter-driven ingestion with 30+ preconfigured bank formats (Chase, Bank of America, Citi, Capital One, Amex, HSBC, Barclays, Revolut, N26, BBVA, CaixaBank, Nubank, and more):
Sixteen financial lenses organized into six categories (Spending, Income, Savings, Portfolio, Debt, Net Worth) analyze your patterns across four cadence tiers:
SecurityMaster fundamentals, triggered every Monday. A passive income outlook is part of the portfolio, quarterly, and annual reviewsEach tier is calendar-gated and runs a strict data-completeness check before generation, so partial periods never get compared to full ones. A deterministic pre-pass computes all financial deltas, baselines, and anomalies locally — the LLM writes prose about verified math rather than attempting to calculate numbers itself. Insights persist across runs, and you can manually refresh any tier for any period from the UI.
Your personal income statement, across borders and currencies. Bliss organizes finances into a structured financial summary — Income flows through Essentials, Lifestyle, and Growth spending to produce Discretionary Income, Savings Capacity, and Net Savings.
Every recurring charge in one place, found automatically across Plaid-synced and CSV-imported transactions. Detection is deterministic: no LLM, no guessing.
See what your holdings and benefits are expected to pay over the next 12, 24 or 36 months, next to what you actually received over the last 12.
Bliss ships with an MCP server, so Claude and other MCP clients can work with your finances in plain language: search and re-categorize transactions, work the bank-sync review queue, review an imported statement, answer spending and portfolio questions, and clean up subscriptions.
Setup takes about five minutes: see Use Bliss with Claude, Connecting AI Agents, and the MCP Tool Reference.
Host completely isolated financial environments for family, friends, or a partner from a single deployment. Every database query includes tenantId — strict query-level isolation with no data leakage between users. View-only access lets you share visibility without giving control.
Self-hosted doesn't mean risk-free. Transaction descriptions, account numbers, and Plaid access tokens are encrypted before they reach the database. Classification lookup tables use SHA-256 hashes instead of plaintext for performance indexes. A documented key rotation procedure covers ENCRYPTION_SECRET and every other Bliss-owned secret. No telemetry, no cloud sync, no third-party analytics — every byte stays on your hardware, except what you choose to send to an LLM provider or hand to an AI agent you connect.
Every transaction triggers a scoped analytics update. Monthly aggregations across categories, tags, currencies, and countries are computed incrementally — never a full table scan. Tag-based budgeting lets you create tags like "Japan Trip" or "Home Renovation" with optional budgets and date ranges. Export filtered data as CSV/XLSX for tax prep or external analysis.
Three services. Nine asynchronous workers. Sixty endpoints. One configuration file.
[ ENTRYPOINT: Nginx :8080 (Docker) ]
│
├──► / [ FRONTEND SPA ]
│ ├── React 18, Vite 6, shadcn/ui
│ └── Communicates via REST (JWT in HttpOnly Cookie)
│
├──► /api/ [ API LAYER ]
│ ├── Next.js 15 (Pages Router), NextAuth
│ ├── >60 Endpoints (Transactions, Reports, Users)
│ ├── MCP server at /api/mcp (40 tools, token or OAuth)
│ └── Communicates via Internal REST (API Key Auth)
│
└──► /svc/ [ EXPRESS BACKEND :3001 ]
├── Event-Driven Architecture
├── 9 Asynchronous BullMQ Workers
│
├─► Redis 7 (Cache + Job Queues)
│
├─► Database: PostgreSQL 16 + pgvector
│ ├── Secure Store: AES-256-GCM Encryption
│ └── AI Embeddings: 768-dim Vectors
│
└─► 3rd Party Integrations:
├─► AI: LLM provider abstraction (Gemini / OpenAI / Anthropic)
├─► Banks: Plaid (Sync + Tokens)
├─► Prices: TwelveData (Real-time Stocks)
├─► FX: TwelveData (Historical Rates; CurrencyLayer optional/legacy)
└─► Ops: Sentry (Observability)
See the full Architecture Documentation for the deep dive.
Three commands to a running instance:
git clone https://github.com/danielvsantos/bliss.git && cd bliss
./scripts/setup.sh # prompts for LLM provider, generates secrets, creates .env
docker compose up # pulls images and starts all services
During setup.sh you're asked to pick an LLM provider (Gemini / OpenAI / Anthropic) and paste its API key. An LLM is required for AI classification and financial insights. See Choosing an LLM Provider for the full comparison.
Open http://localhost:8080 and create your account. The database is automatically migrated and seeded with reference data (countries, currencies, banks).
Prerequisites: Node.js 22+, pnpm 9+, PostgreSQL 16 with pgvector, Redis 7+
git clone https://github.com/danielvsantos/bliss.git && cd bliss
cp .env.example .env # edit DATABASE_URL and REDIS_URL for your local setup
./scripts/setup.sh # generates secrets (skip if you already have .env)
pnpm install # installs all workspace dependencies
pnpm exec prisma migrate deploy --schema=prisma/schema.prisma
pnpm exec prisma db seed # seeds countries, currencies, banks
pnpm dev # starts all three services in parallel
See the Guides for detailed setup instructions.
Bliss ships with carefully crafted CLAUDE.md files that give AI assistants full context on the architecture, conventions, and subsystems. Combined with 56 technical specification files and 24 OpenAPI YAML definitions, the repo is designed for AI coding agents to onboard instantly. If you use Claude Code, just open the repo and start working -- it already knows the codebase.
cd bliss
claude # Claude Code automatically loads the project context
The project includes five CLAUDE.md files that layer context by scope:
| File | Scope |
|---|---|
CLAUDE.md | System architecture, critical rules (module systems, design tokens), all subsystems |
apps/api/CLAUDE.md | Route handler patterns, auth flow, Prisma extensions, event dispatch |
apps/backend/CLAUDE.md | Worker patterns, event routing, services, classification config |
apps/web/CLAUDE.md | Design tokens, component conventions, hooks reference, chart colors |
apps/docs/CLAUDE.md | Sync script rules, content architecture, Nextra patterns |
Claude Code loads the root file everywhere, plus the app-specific file when you're working in that directory. This means it knows to use require() in the backend, import in the API, and never to use green-500 in the frontend -- without you having to explain it.
AI classification and financial insights are powered by an LLM. Pick one — Gemini, OpenAI, or Anthropic — at setup time.
| Provider | Role | Env Vars |
|---|---|---|
| Google Gemini | Default. Native embedding support. | LLM_PROVIDER=gemini, GEMINI_API_KEY |
| OpenAI | Native embedding support. | LLM_PROVIDER=openai, OPENAI_API_KEY |
| Anthropic Claude | Best prose quality for insights. Requires a secondary provider (Gemini or OpenAI) for embeddings. | LLM_PROVIDER=anthropic, ANTHROPIC_API_KEY, EMBEDDING_PROVIDER, matching embedding-provider key |
Without an LLM configured, Tier 1 (exact match) still works for already-categorized merchants, but new merchants stay unclassified and the insights page is empty. See the LLM provider guide for details.
Enable additional features by adding API keys. All degrade gracefully if missing.
| Feature | Provider | Env Var | What it unlocks |
|---|---|---|---|
| Bank sync | Plaid | PLAID_CLIENT_ID | One-click bank account linking and automatic transaction sync |
| Stock prices & FX | Twelve Data | TWELVE_DATA_API_KEY | Real-time and historical pricing for 10,000+ symbols, plus historical & current FX rates for multi-currency conversion (default FX source) |
| Currency rates (legacy) | CurrencyLayer | CURRENCYLAYER_API_KEY | Optional legacy FX source. Only used when CURRENCY_PROVIDER=CURRENCYLAYER; Twelve Data covers FX by default |
| Error tracking | Sentry | SENTRY_DSN | Production error monitoring and performance tracing |
Without the optional keys, Bliss still provides full manual transaction management, CSV import, and portfolio management with manual valuations.
bliss/
├── apps/
│ ├── api/ # Next.js API layer (auth, REST, Prisma)
│ ├── backend/ # Express + BullMQ workers (AI, portfolio, sync)
│ ├── web/ # React SPA (Vite + shadcn/ui)
│ └── docs/ # Documentation site (Next.js + Nextra)
├── packages/
│ └── shared/ # Shared modules (encryption, storage adapter)
├── prisma/ # Schema, migrations, seed script
├── docker/ # Dockerfiles + nginx config
├── scripts/ # setup.sh and utility scripts
├── docs/ # Architecture, configuration, specs
├── .env.example # All env vars with descriptions
└── docker-compose.yml
pnpm test # run all 4,732 tests across all apps
pnpm test:api # 2,146 tests (Vitest) — unit + integration
pnpm test:backend # 1,387 tests (Jest) — unit + integration
pnpm test:web # 1,199 tests (Vitest + MSW) — hooks, pages, components, contexts
All environment variables are documented in .env.example and explained in detail in the Configuration Reference.
The single root .env file is the source of truth for local development. Docker Compose reads from it automatically. For production, the deployment platform (Railway, Cloud Run, or your own host) manages its own environment variables.
We welcome contributions! See CONTRIBUTING.md for:
AGPL-3.0 — free to use, modify, and self-host. If you distribute a modified version as a service, you must open-source your changes.