Wollie is a calm budgeting app for seeing bank accounts, recent spending, budgets, recurring payments, and useful money signals in one clean place.
Production target: Cloudflare Pages.
- TanStack Start (React, SSR)
- Prisma + PostgreSQL on Railway
- Better Auth (email/password, Google OAuth)
- shadcn/ui + Tailwind
- Sign up / sign in
- Budget dashboard
- Accounts / bank-sync status
- Transactions with search and filters
- Budget envelopes
- Recurring payments
- Money insights
- Demo data fallback when live bank sync is not configured
- SimpleFIN-shaped live sync boundary
cp .env.example .env.local
# Edit DATABASE_URL, BETTER_AUTH_SECRET, and optionally Google OAuth / SimpleFIN vars
# Start Postgres (example with Docker)
docker run --name weavel-db -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=weavel -p 5432:5432 -d postgres:16
npm run db:generate
npm run db:push
npm run devWollie can run safely with demo data. To test live SimpleFIN sync, set:
ENABLE_LIVE_BANK_SYNC="true"
SIMPLEFIN_ACCESS_URL="https://user:password@bridge.simplefin.org/simplefin/..."
SIMPLEFIN_LOOKBACK_DAYS="90"The access URL is read only on the server. Do not expose it with VITE_ or put it in client code.
If SIMPLEFIN_ACCESS_URL is present but ENABLE_LIVE_BANK_SYNC is not true, Wollie will show live sync as disabled instead of silently using real bank data.
- Google Cloud Console → Create OAuth client (Web application)
- Authorized redirect URI:
http://localhost:3000/api/auth/callback/google(use yourBETTER_AUTH_URL+/api/auth/callback/google) - Add
GOOGLE_CLIENT_IDandGOOGLE_CLIENT_SECRETto.env.local - Restart the dev server — the login page shows Continue with Google
The old Onie demo seed is disabled by default and refuses to run in production. For local/staging backfill only:
SEED_LEGACY_ONIE_CONTENT=true pnpm db:seedSee docs/prod-launch-checklist.md for the full production checklist.
- Configure the production database.
- Set environment variables:
DATABASE_URLBETTER_AUTH_SECRET— long random string (openssl rand -base64 48)BETTER_AUTH_URL— production URLSITE_URL— production URLGOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRET— optional; redirect URI must behttps://<your-domain>/api/auth/callback/googleENABLE_LIVE_BANK_SYNC—trueonly when live bank credentials are readySIMPLEFIN_ACCESS_URL— required whenENABLE_LIVE_BANK_SYNC=trueNODE_ENV—production
- Run
pnpm preflight:prodwith production env loaded. - Build with
pnpm run build:cf. - Deploy the generated
distdirectory to Cloudflare Pages.
Helpful commands:
pnpm preflight:prod # checks production env shape
pnpm deploy:check # preflight + Cloudflare build
pnpm deploy # build + deploy to the existing onie.pages.dev projectDo not run prisma db push automatically at app start. Apply schema changes as an explicit deployment step after reviewing the Prisma diff.
src/
routes/ # Pages (landing, auth, finance app)
server/ # Server functions (finance, bank sync, auth-backed data)
components/ # UI components
lib/ # Auth, categories, utils
prisma/
schema.prisma # Data models