MicroAI Paygate
AI 요청 결제 게이트웨이로 EIP-712 서명, 영수증 발행, 클라이언트 서명 검증 지원
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A personal expense tracker that keeps each user's expenses in a Neon Postgres database they own.
Guava's own database holds only logins and an encrypted pointer to each user's database. Expenses, categories, dashboard widgets and optional Plaid bank connections all live in the user's database, so their financial data never sits on the app's servers.
Built with Next.js 16 (App Router, React 19), Tailwind CSS v4 and shadcn/ui, Prisma 7 on Neon's serverless driver, and Better Auth.
Install dependencies. This also generates both Prisma clients.
pnpm install
Copy the example environment file and fill it in:
cp .env.example .env
| Variable | Value |
|---|---|
DATABASE_URL | Neon console → Connect → pooled connection string for the app database |
DIRECT_URL | The same string with pooling off, used by Prisma migrations |
BETTER_AUTH_SECRET | node -e "console.log(require('crypto').randomBytes(32).toString('base64'))" |
BETTER_AUTH_URL | The app's URL, such as http://localhost:3000 |
ENCRYPTION_KEY | Same command as BETTER_AUTH_SECRET, with a different value |
ENCRYPTION_KEY encrypts stored connection strings and Plaid keys. Changing it makes saved data unreadable, so every environment that shares an app database must use the same value.
Apply the app database migrations and start the dev server:
pnpm db:deploy
pnpm dev
Open http://localhost:3000/api/health to confirm the app reaches its database, then http://localhost:3000 to create an account. Onboarding asks for a second Neon connection string: use a separate, empty database. Guava creates its tables there.
To import bank transactions, open Integrations, save your own Plaid client ID and secret, and click Connect a bank. In the Plaid sandbox, any bank accepts user_good / pass_good.
| Database | Schema | Holds | Migrations |
|---|---|---|---|
| App | prisma/schema.prisma | Users, sessions, and each user's encrypted workspace link | pnpm db:migrate to create, pnpm db:deploy to apply |
| Workspace (a user's) | prisma/user/schema.prisma | Expenses, categories, settings, Plaid keys and banks | pnpm user-db:migration <name>, applied by the app on visit |
Workspace databases aren't managed by prisma migrate. After editing prisma/user/schema.prisma, pnpm user-db:migration <name> writes lib/user-db/migrations/NNNN_<name>.ts. Guava applies pending migrations when a user connects a database and on their first visit after a deploy. For steps SQL can't express, write a code migration ({ up(client) }) in the same folder and add it to index.ts.
pnpm test:unit # Vitest, no database
pnpm test:db:up # Postgres behind Neon's local proxy, in Docker
pnpm test:integration # Vitest against the test databases
pnpm test:e2e # Builds the app and runs Playwright
pnpm test:db:down
Unit tests sit next to the code they cover (lib/**/*.test.ts). Integration and e2e tests live in tests/. Before the first e2e run, install the browser with pnpm exec playwright install chromium.
The test databases come from compose.test.yaml. Setting NEON_LOCAL_PROXY points the app's Neon driver at the local proxy, so the tests exercise the same code as production. tests/env.ts builds the test settings at runtime and passes them over .env, so tests never touch real databases. The database password is random, created on the first pnpm test:db:up in tests/db/.password (gitignored).
CI runs the unit, integration and e2e suites in parallel on every pull request and on pushes to main, alongside Prettier, ESLint, typecheck and commitlint.
| Command | Does |
|---|---|
pnpm dev | Starts the dev server |
pnpm build / pnpm start | Builds / serves the production app |
pnpm lint / pnpm typecheck | Runs ESLint / TypeScript |
pnpm format | Formats with Prettier (format:check to check only) |
pnpm db:migrate | Creates and applies an app database migration (dev) |
pnpm db:deploy | Applies committed app database migrations |
pnpm db:studio | Opens Prisma Studio on the app database |
pnpm user-db:migration <name> | Generates the next workspace database migration |
pnpm -s plaid:dump | Prints raw Plaid data for a workspace's banks, for jq |
Commit messages follow Conventional Commits, checked by commitlint in CI. release-please reads them to open a release pull request that bumps the version and updates CHANGELOG.md.