Oracle3
Oracle3: 예측시장 거래 엔진·MCP 서버
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Scan. Pay. Done. — pay your electricity bill by scanning the QR code on your meter.
VoltPay V2 is a secure, installable web app (PWA) built with Next.js. The full plan, including the V1 audit and the delivery phases, is in docs/PLAN_V2.md.
Prototype: billing data is simulated and payments run in Razorpay test mode. No real money moves.
Next.js 16 (App Router, React 19) · TypeScript · Tailwind CSS 4 + shadcn/ui-style components · PostgreSQL · Drizzle ORM · Better Auth · Zod · Vitest · GitHub Actions. Runtime: Node.js 24 LTS.README 전문 보기 ↗Scan. Pay. Done. — pay your electricity bill by scanning the QR code on your meter.
VoltPay V2 is a secure, installable web app (PWA) built with Next.js. The full plan, including the V1 audit and the delivery phases, is in docs/PLAN_V2.md.
Prototype: billing data is simulated and payments run in Razorpay test mode. No real money moves.
| Phase | Scope | Status |
|---|---|---|
| 0 | Housekeeping: V1 removed from the tree (kept in git tag v1.0) | ✅ Done |
| 1 | Foundation: Next.js 16, Postgres + Drizzle, Better Auth, roles, CI | ✅ Done |
| 2 | Core flow: meters, signed QR, scanner, bills, Razorpay, receipts | ✅ Done |
| 3 | Customer features: link meters, bills, usage chart, complaints | ✅ Done |
| 4 | Admin console: meters, billing cycle, tariffs, complaints, audit | ✅ Done |
| 5 | PWA (installable, offline page), reminder emails, contact inbox | ✅ Done |
| 6 | Hardening & launch: CSP, rate limits, E2E + a11y tests, deploy docs | ✅ Done |
Next.js 16 (App Router, React 19) · TypeScript · Tailwind CSS 4 + shadcn/ui-style components · PostgreSQL · Drizzle ORM · Better Auth · Zod · Vitest · GitHub Actions. Runtime: Node.js 24 LTS.
Prerequisites: Node.js 24+ and a free Neon Postgres database (create a project, then copy its connection string).
# 1. Install dependencies
npm install
# 2. Configure environment
cp .env.example .env.local
# then set DATABASE_URL (Neon), BETTER_AUTH_SECRET and QR_SIGNING_SECRET
# (generate each with: openssl rand -base64 32)
# and, when you have them, RAZORPAY_KEY_ID / RAZORPAY_KEY_SECRET (test mode)
# 3. Create tables, demo accounts and demo meters/bills
npm run db:migrate
npm run db:seed
# 4. Run the app
npm run dev # http://localhost:3000
No Docker needed. A local Postgres via
docker compose up -dalso works if you prefer (use theDATABASE_URLfromdocker-compose.yml).
localhost; on a laptop you can also use the consumer-number box on /scan, e.g. VP-2024-000101)..env.local, a simulated checkout is used (development only; it is disabled in production). With real test keys, the Razorpay checkout opens (use Razorpay's test cards / UPI).npm run db:seed -- --fresh to reset the demo data, or sign in as admin and use Billing → Run billing cycle to create the next bills.| Role | Password | |
|---|---|---|
| Admin | [email protected] | Admin@12345 |
| Customer | [email protected] | Customer@12345 |
In production, set SEED_* variables instead; the seed script refuses default passwords there.
npm run build && npm start, then open the site on your phone/Chrome and choose Install app (button in the footer) or Add to Home Screen. Offline, the app shows the last bill you viewed on that device (amount, due date, meter number only; cleared on sign-out)./api/cron/daily, protected by CRON_SECRET) marks past-due bills overdue and emails customers 3 days before the due date and once when overdue (each at most once; customers can turn them off on their profile). Without RESEND_API_KEY, emails are printed to the server console in development. Admins can run the job from Admin → Billing → Run daily job now./contact page (rate-limited, honeypot) → Admin → Inbox.| Command | What it does |
|---|---|
npm run dev | Dev server with hot reload |
npm run build / npm start | Production build / serve |
npm run lint · npm run typecheck · npm test | Quality checks (also run in CI) |
npm run e2e | Browser tests (Playwright) incl. accessibility |
npm run format | Format with Prettier |
npm run db:generate | Create a migration after editing src/db/schema/* |
npm run db:migrate | Apply migrations |
npm run db:seed | Create demo accounts |
npm run db:studio | Browse the database in Drizzle Studio |
src/
app/ routes: /, /login, /signup, /dashboard, /meters/*, /payments, /complaints, /profile, /scan, /m/[code], /receipts/[id], /admin/* (meters, billing, bills, payments, tariffs, complaints, audit, qr), /api/auth/*, /api/webhooks/razorpay
components/ UI (components/ui = shadcn-style primitives)
db/ Drizzle schema, migrations, connection
lib/ auth (server + client), env validation, utils
server/ server-only logic: authorization helpers, services
proxy.ts optimistic auth redirect for protected routes
tests/unit/ Vitest unit tests
docs/ V2 plan, original plan PDF, legal notes
npm test runs the unit tests. npm run e2e runs the browser tests against a dev server and re-seeds the database first, so point DATABASE_URL at a throw-away database, not data you care about. First time only: npx playwright install chromium. The suite covers the guest scan→pay→receipt flow, the customer area, the admin console, security headers, and WCAG A/AA accessibility checks on every main page.
See docs/DEPLOY.md (Vercel + Neon + Razorpay + Resend, backups) and docs/DEMO.md (the demo script).
requireUser() / requireAdmin() from src/server/authz.ts. proxy.ts is only a fast redirect, not the security boundary.src/proxy.ts) blocks injected scripts; Razorpay's checkout is explicitly allowed.src/lib/env.ts..env.local or any *.db file. The V1 database contained real contact details and is deliberately git-ignored.components.json is configured for shadcn/ui, so you can run npx shadcn@latest add dialog (for example) to add more components.