尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
A personal budgeting web app built with Next.js, TypeScript, and Postgres (via
Prisma), designed around biweekly "quincena" pay periods (as is standard in
Panama and other countries). You enter your net take-home pay per quincena
directly — the app doesn't calculate payroll deductions itself — and it
tracks spending, savings goals, and fixed-budget targets against that income,
retaining full history for every past budget cycle.
1. Make sure Postgres is running locally and a budgetapp_dev database exists:查看完整 README ↗A personal budgeting web app built with Next.js, TypeScript, and Postgres (via Prisma), designed around biweekly "quincena" pay periods (as is standard in Panama and other countries). You enter your net take-home pay per quincena directly — the app doesn't calculate payroll deductions itself — and it tracks spending, savings goals, and fixed-budget targets against that income, retaining full history for every past budget cycle.
budgetapp_dev database exists:
brew install postgresql@16 # if not already installed
brew services start postgresql@16
createdb budgetapp_dev
.env.example to .env and fill in DATABASE_URL and AUTH_SECRET (openssl rand -base64 32).npm install
npx prisma migrate dev
npm run dev
http://localhost:3000 — log in with Google (set it up first, below), then go through onboarding (income → expenses → savings)."Continue with Google" is the only way to log in (first sign-in creates the account; an existing account with the same email is reused). The same OAuth client also powers Profile's optional "Connect Gmail", which auto-imports transaction notification emails (Banco General card purchases, Yappy sent/received). To set it up locally:
.../auth/gmail.readonly scope.http://localhost:3000/api/auth/callback/google (sign-in, local dev)http://localhost:3000/api/gmail/callback (Gmail import, local dev)https://<your-deployed-domain> once deployed.env as GOOGLE_CLIENT_ID
/ GOOGLE_CLIENT_SECRET, and generate a GMAIL_TOKEN_ENCRYPTION_KEY
(openssl rand -base64 32) — this encrypts the stored refresh token.Only emails from Banco General ([email protected]) and Yappy
([email protected]) are ever queried — see lib/gmail-parsers.ts
to add support for other senders/email formats.
The Gmail OAuth routes and a few write actions are rate-limited against a shared Upstash Redis database (free tier) — required so limits are actually enforced across every serverless instance Vercel runs, not just whichever one happens to handle a given request.
UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN from the
database's "REST API" section into .env (local) and the Vercel project
settings (production).The app deploys to Vercel with a hosted Postgres (e.g. Neon's free tier) — both free for personal use.
vercel.json needed
— Next.js deploys with zero config).DATABASE_URL — the Neon connection stringAUTH_SECRET — generate a new one for production, don't reuse the
local dev value (openssl rand -base64 32)GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET / GMAIL_TOKEN_ENCRYPTION_KEY
— only needed if using Gmail import, same values as aboveUPSTASH_REDIS_REST_URL / UPSTASH_REDIS_REST_TOKEN — see "Rate
limiting setup" aboveDATABASE_URL="<neon-connection-string>" npx prisma migrate deploy
https://<your-vercel-domain>/api/gmail/callback) to the Google OAuth
client from step 3 of the Gmail setup above.Local dev is unaffected by any of this — lib/prisma.ts always reads
DATABASE_URL from your local, gitignored .env.
npm run dev — start the dev servernpm run build / npm run start — production build/runnpm test — run unit testsnpx prisma studio — inspect the databasenpx prisma migrate dev — apply schema changes