Oracle3
Oracle3: 예측시장 거래 엔진·MCP 서버
다중 통화 개인 순자산 추적기로 은행 계좌·지갑·현금·대출·저축 목표를 한 곳에서 실시간 환율과 함께 관리
A private, multi-currency net worth tracker. Track bank accounts, wallets, cash, loans and savings goals in one place, with live exchange rates and no bank sync.
금융TypeScript · CSSGitHub @Benstikey온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Multi-currency personal finance dashboard — accounts, transactions, net worth, cash-flow forecasting, savings objectives, and loans.
Built with Next.js 16 (App Router), Postgres on Neon, and Tailwind + shadcn/ui.
Requires Node 20+ and a Postgres database.
npm install
Create .env.local:
DATABASE_URL=postgres://... # Neon pooled connection string
SESSION_SECRET=... # openssl rand -base64 32
If the project is linked to Vercel, DATABASE_URL is already set there and can
be pulled with vercel env pull. Generate SESSION_SECRET yourself — rotating
it invalidates every existing session.
Apply the schema, then start the dev server:
npm run db:migrate
npm run dev
Sign up at /login to create the first account.
Database. Plain Postgres, accessed with the Neon serverless driver through
tagged-template queries in src/lib/queries.ts (reads) and the per-route
actions.ts files (writes). Values interpolated into sql`...` are sent as
bound parameters, not concatenated.
Auth. Email + password, hashed with scrypt (src/lib/password.ts). Sessions
are stateless JWTs signed with SESSION_SECRET and stored in an httpOnly cookie
(src/lib/session.ts).
Authorization. This is the part worth understanding. There is no Row Level
Security — that was a Supabase feature built on auth.uid(), and it does not
exist here. Every query that touches user data must filter on user_id
explicitly, and the id must come from requireUserId() in src/lib/dal.ts,
never from a form field or a client argument.
src/proxy.ts also redirects signed-out visitors, but that check is optimistic
only — it reads the cookie and never queries the database. It is not the
security boundary; the user_id filter is.
SQL files in migrations/, applied in filename order by npm run db:migrate.
Each runs in a transaction and is written to be idempotent, so re-running is
safe. Add new files as 0002_*.sql, 0003_*.sql, and so on.