Claude e6b79ce2c2 Add bulk actions, multi-currency, expenses, templates, and reports
Schema (migration 0001):
- clients: add currency column (default USD)
- invoices: add currency column (default USD)
- New expenses table: amount, currency, category, billable, reimbursable,
  client/invoice/business relations, notes
- New invoice_templates table: name, type (notes|terms), content, isDefault

API:
- invoices: add bulkUpdateStatus and bulkDelete procedures (ownership-safe)
- invoices: currency field threaded through create/update schemas
- clients: currency field added to create/update schemas
- New expenses router: full CRUD with authorization
- New invoiceTemplates router: full CRUD, isDefault management per type
- Root router: wire in expenses and invoiceTemplates

Currency (src/lib/currency.ts):
- Shared formatCurrency(amount, currency) utility replacing hardcoded USD
- SUPPORTED_CURRENCIES list (17 currencies)
- Invoice form: currency selector in Config card, auto-fills from client
- Client form: currency selector in Billing Information card

Bulk actions (invoices list):
- Checkbox column with select-all support
- Selection toolbar: Mark as Sent/Paid/Draft dropdown, Delete (N) button
- DataTable: new selectionActions prop renders toolbar when rows selected

Notes templates:
- Invoice form: Notes card with textarea in Details tab
- Template dropdown button appears when templates exist
- /dashboard/invoices/templates: full CRUD page for notes and terms templates

New pages:
- /dashboard/expenses: expense list with summary cards, add/edit dialog
- /dashboard/reports: KPI cards, 12-month revenue area chart, top clients
  bar chart, status breakdown, recent activity
- Navigation: Expenses and Reports added to Main section

https://claude.ai/code/session_012sqEgNQpx676isepeoX4Mi
2026-04-05 02:34:06 +00:00
2025-07-29 19:45:38 -04:00
2025-07-29 19:45:38 -04:00
2026-01-14 02:47:42 -05:00

beenvoice Logo

beenvoice - Invoicing Made Simple

A modern, professional invoicing application built for freelancers and small businesses. beenvoice provides a clean, efficient way to manage clients and create professional invoices with ease.

beenvoice Logo

Features

  • 🔐 Secure Authentication - Email/password registration and sign-in with better-auth, plus SSO via Authentik OIDC
  • 👥 Client Management - Create, edit, and manage client information
  • 🏢 Business Profiles - Manage your business details, logo, and email settings
  • 📄 Professional Invoices - Generate detailed invoices with line items
  • 📅 Timesheet View - Calendar-based time entry with month and week views
  • 📧 Email Delivery - Send invoices via email using Resend
  • 📥 PDF Export - Download invoices as professional PDFs
  • 📊 CSV Import - Bulk import invoice data from CSV files
  • 💰 Flexible Pricing - Set custom rates and calculate totals automatically
  • 📱 Responsive Design - Works seamlessly on desktop, tablet, and mobile
  • 🎨 Modern UI - Clean, professional interface built with shadcn/ui
  • Type-Safe - Full TypeScript support with tRPC for API calls
  • 💾 PostgreSQL Database - Robust relational database with Drizzle ORM

🚀 Tech Stack

  • Frontend: Next.js 16 with App Router
  • Backend: tRPC for type-safe API calls
  • Database: Drizzle ORM with PostgreSQL
  • Authentication: better-auth with email/password and Authentik OIDC SSO
  • UI Components: shadcn/ui with Tailwind CSS v4
  • Email: Resend for transactional email delivery
  • PDF: @react-pdf/renderer for invoice PDF generation
  • Package Manager: Bun

📦 Installation

Prerequisites

  • Node.js 18+ or Bun
  • Docker & Docker Compose (for local PostgreSQL)
  • Git

Quick Start

  1. Clone the repository

    git clone https://github.com/yourusername/beenvoice.git
    cd beenvoice
    
  2. Install dependencies

    bun install
    
  3. Set up environment variables

    cp .env.example .env.local
    

    Edit .env.local and add your configuration:

    # Database
    DATABASE_URL="postgresql://postgres:password@localhost:5432/beenvoice"
    DB_DISABLE_SSL="true"
    
    # Authentication
    AUTH_SECRET="your-secret-key-here"
    BETTER_AUTH_URL="http://localhost:3000"
    
    # Application
    NEXT_PUBLIC_APP_URL="http://localhost:3000"
    NODE_ENV="development"
    
    # Email (optional for local dev)
    RESEND_API_KEY="your-resend-api-key"
    RESEND_DOMAIN="yourdomain.com"
    
  4. Start the database

    docker-compose up -d
    
  5. Push the database schema

    bun run db:push
    
  6. Start the development server

    bun run dev
    
  7. Open your browser Navigate to http://localhost:3000

🏗️ Project Structure

beenvoice/
├── src/
│   ├── app/                    # Next.js App Router pages
│   │   ├── api/               # API routes (better-auth, tRPC)
│   │   ├── auth/              # Authentication pages
│   │   ├── dashboard/         # Main app pages
│   │   │   ├── clients/       # Client management pages
│   │   │   ├── invoices/      # Invoice management pages
│   │   │   └── businesses/    # Business profile pages
│   │   └── _components/       # Page-specific components
│   ├── components/            # Shared UI components
│   │   ├── ui/               # shadcn/ui components
│   │   ├── data/             # Data display components
│   │   ├── forms/            # Form components
│   │   └── layout/           # Layout components
│   ├── server/               # Server-side code
│   │   ├── api/              # tRPC routers
│   │   └── db/               # Database schema and connection
│   ├── lib/                  # Utilities (auth, pdf export, etc.)
│   ├── styles/               # Global styles
│   └── trpc/                 # tRPC client configuration
├── drizzle/                  # Database migrations
├── public/                   # Static assets
├── docs/                     # Documentation
└── docker-compose.yml        # Local PostgreSQL setup

🎯 Usage

Getting Started

  1. Register an Account

    • Visit the sign-up page
    • Enter your name, email, and password
  2. Set Up Your Business

    • Navigate to Business Settings
    • Add your business name, contact info, and logo
    • Configure email settings for invoice delivery (Resend API key + domain)
  3. Add Your First Client

    • Navigate to the Clients page
    • Click "Add New Client"
    • Fill in client details (name, email, phone, address)
  4. Create an Invoice

    • Go to the Invoices page
    • Click "Create New Invoice"
    • Select a client and optionally a business profile
    • Add line items with descriptions, dates, hours, and rates
    • Use the Timesheet tab for calendar-based time entry
    • Save and send or download as PDF

Features Overview

Client Management

  • Create and edit client profiles
  • Store contact information and addresses
  • Set default hourly rates per client
  • Search and filter client list

Invoice Creation

  • Select from existing clients and business profiles
  • Add multiple line items with drag-and-drop reordering
  • Set custom rates per item
  • Automatic total calculations with configurable tax rate
  • Timesheet calendar view for date-based time tracking
  • Professional invoice formatting

Invoice Delivery

  • Send invoices via email directly from the app
  • Rich text email composer with preview
  • Resend and re-deliver sent invoices
  • Track invoice status: Draft → Sent → Paid (+ Overdue)

User Interface

  • Clean, modern design
  • Fully responsive — desktop, tablet, and mobile
  • Intuitive navigation with breadcrumbs
  • Toast notifications for feedback
  • Dark mode support

🔧 Development

Available Scripts

# Development
bun run dev          # Start development server (Turbo)
bun run build        # Build for production
bun run start        # Start production server

# Database
bun run db:push      # Push schema changes to database
bun run db:migrate   # Run migrations
bun run db:studio    # Open Drizzle Studio
bun run db:generate  # Generate new migration

# Docker
bun run docker:up    # Start local PostgreSQL via Docker
bun run docker:down  # Stop Docker services

# Code Quality
bun run lint         # Run ESLint
bun run lint:fix     # Fix ESLint issues
bun run format:write # Format code with Prettier
bun run typecheck    # Run TypeScript type checking

Database Schema

The application uses the following core tables:

  • users - User accounts and authentication
  • sessions - Active user sessions
  • clients - Client information and contact details
  • businesses - Business profiles with email/logo settings
  • invoices - Invoice headers with client and business relationships
  • invoice_items - Individual line items with pricing and position ordering

API Development

All API endpoints are built with tRPC for type safety:

  • Authentication: better-auth integration (email/password + OIDC)
  • Clients: CRUD operations for client management
  • Businesses: Business profile management
  • Invoices: Invoice creation, management, and status tracking
  • Validation: Zod schemas for input validation

🎨 Customization

Styling

The app uses Tailwind CSS v4 with a custom design system:

  • Primary Color: Green (#16a34a)
  • Font: Geist for professional typography
  • Components: shadcn/ui component library
  • Spacing: 4px grid system

Branding

Update the logo and colors in:

  • src/components/logo.tsx - Main logo component
  • src/styles/globals.css - Color variables
  • src/app/layout.tsx - Font configuration

🚀 Deployment

You can deploy this application to any platform that supports Next.js and PostgreSQL (Docker, Coolify, Railway, etc.).

  1. Build the application:

    bun run build
    
  2. Set up production environment variables (see .env.local example above, adjusting URLs and secrets for production)

  3. Run database migrations:

    bun run db:push
    
  4. Start the server:

    bun start
    

Environment Variables

Required for production:

DATABASE_URL="postgresql://user:password@host:5432/dbname"
AUTH_SECRET="your-long-random-secret"
BETTER_AUTH_URL="https://your-domain.com"
NEXT_PUBLIC_APP_URL="https://your-domain.com"
NODE_ENV="production"

# Email (required for invoice sending)
RESEND_API_KEY="re_xxxxxxxxxxxx"
RESEND_DOMAIN="yourdomain.com"

# Optional: Authentik SSO
AUTHENTIK_ISSUER="https://your-authentik-instance/application/o/beenvoice/"
AUTHENTIK_CLIENT_ID="your-client-id"
AUTHENTIK_CLIENT_SECRET="your-client-secret"

Other Platforms

The app can be deployed to any platform that supports Next.js:

  • Coolify: Deploy with Docker Compose support
  • Railway: Connect your GitHub repository (includes managed PostgreSQL)
  • DigitalOcean App Platform: Deploy with automatic scaling

🤝 Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Development Guidelines

  • Follow TypeScript best practices
  • Use shadcn/ui components for consistency
  • Implement proper error handling
  • Follow the existing code style (Prettier + ESLint configs provided)

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

🙏 Acknowledgments

📞 Support


Built for freelancers and small businesses who deserve better invoicing tools.

S
Description
Create professional invoices, manage clients, and track payments. Built for freelancer...
Readme 3.8 MiB
Languages
TypeScript 97%
CSS 1.9%
JavaScript 0.6%
Shell 0.4%