A beautiful budgeting app that helps you grow your finances. Built with Next.js 14, Prisma, Lucia Auth, and AI-powered assistance.
- 🤖 AI-Powered Assistant - Meet Bud, your personal gardener! Chat naturally to add transactions, create accounts, transfer funds, and more
- 🔐 Secure Authentication - Sign up and sign in with Lucia session-based auth
- 💰 Multiple Accounts - Track savings, budgets, allowances, retirement, and stock accounts
- 📊 Transaction Tracking - Record income and expenses with automatic balance updates
- 🔄 Easy Transfers - Move money between accounts with one click
- 👥 Dashboard Sharing - Invite family or partners to view and collaborate on your finances
- ⚡ Quick Actions - Add transactions, transfers, and accounts from a convenient modal interface
- 🎨 Beautiful UI - Modern, clean design with a soothing earthy color palette
Bud is your AI-powered personal gardener who helps tend to your financial garden. Just chat naturally:
- "Add a $50 grocery expense to my checking account"
- "Transfer $200 from savings to my budget"
- "Create a new vacation fund account with $500"
- "Delete that coffee transaction from yesterday"
Bud uses OpenAI GPT to understand your requests and performs actions directly on your accounts.
- Framework: Next.js 14 (App Router)
- Database: PostgreSQL with Prisma ORM
- Authentication: Lucia Auth
- AI: OpenAI GPT-4o-mini with function calling
- Styling: Tailwind CSS
- Language: TypeScript
- Node.js 18+
- PostgreSQL database (or use a service like Neon, Supabase, Railway)
- OpenAI API key (for Bud AI features)
- Clone the repository and install dependencies:
npm install- Create a
.envfile in the root directory:
DATABASE_URL="postgresql://username:password@host:5432/database?sslmode=require"
NEXT_PUBLIC_APP_URL="http://localhost:3000"
OPENAI_API_KEY="sk-..."- Generate Prisma client and push the schema to your database:
npm run db:generate
npm run db:push- Start the development server:
npm run dev- Open http://localhost:3000 in your browser.
id: Unique identifieremail: User email (unique)hashedPassword: Argon2 hashed passwordname: Optional display name
id: Unique identifiername: Account nametype: SAVINGS | BUDGET | ALLOWANCE | RETIREMENT | STOCKbalance: Current balance (Decimal)userId: Owner reference
id: Unique identifieramount: Transaction amount (Decimal)description: Transaction descriptiondate: Transaction datetype: INCOME | EXPENSE | TRANSFERaccountId: Associated accounttransferToAccountId: Destination account (for transfers)
id: Unique identifierownerId: Dashboard ownerviewerId: User with accesspermission: VIEW | EDITcreatedAt: Share creation date
id: Unique identifierownerId: InviterrecipientId: Optional (if user exists)email: Invitee emailpermission: VIEW | EDITstatus: PENDING | ACCEPTED | DECLINED | EXPIRED
npm run dev- Start development servernpm run build- Build for productionnpm run start- Start production servernpm run db:generate- Generate Prisma clientnpm run db:push- Push schema to databasenpm run db:migrate- Run migrationsnpm run db:studio- Open Prisma Studio
src/
├── app/
│ ├── (auth)/ # Auth pages (signin, signup)
│ ├── (dashboard)/ # Protected dashboard pages
│ ├── api/ # API routes
│ │ ├── auth/ # Auth endpoints
│ │ ├── accounts/ # Account CRUD
│ │ ├── transactions/ # Transaction CRUD
│ │ ├── transfers/ # Transfer operations
│ │ ├── invitations/ # Sharing invitations
│ │ ├── shares/ # Dashboard shares
│ │ └── chat/ # AI chat endpoint
│ ├── globals.css # Global styles
│ ├── layout.tsx # Root layout
│ └── page.tsx # Landing page
├── components/
│ ├── dashboard/ # Dashboard components
│ │ ├── Bud.tsx # AI assistant
│ │ ├── QuickActions.tsx
│ │ ├── ShareModal.tsx
│ │ └── ...
│ └── ui/ # Reusable UI components
├── lib/
│ ├── auth.ts # Lucia auth configuration
│ ├── password.ts # Password hashing utilities
│ ├── prisma.ts # Prisma client
│ └── utils.ts # Utility functions
└── prisma/
└── schema.prisma # Database schema
Built by Brennon
MIT