尚未偵測到更新。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