GitHub - mrkaye97/medici: A minimalist Splitwise-like expense-sharing app

3 min read Original article ↗

Medici

Medici is a minimalistic, self-hostable alternative to Splitwise for managing group expenses. Named after the Florentine House of Medici, it focuses on simplicity and privacy while providing all the essential features you need.

Why Medici?

  • Privacy-first: Self-host your financial data instead of trusting third parties
  • Minimalistic: Clean, distraction-free interface with only essential features
  • Easy deployment: Single Docker Compose command to get started
  • No subscriptions: Own your data, no recurring fees
  • Open Source: Fully transparent codebase, no hidden agendas
  • No tracking: No ads, analytics, or data collection
  • No limits: Unlimited pools, friends, and expenses without hidden fees

Features

Core Functionality

  1. Pools: Create groups ("pools") to organize expenses by context (roommates, trips, etc.)
  2. Friend Management: Add friends and organize them into relevant pools
  3. Smart Splitting:
    • Set default split percentages per pool for quick expense entry
    • Split expenses evenly or with custom percentages
    • Automatic debt simplification to minimize transactions
  4. Expense Tracking:
    • Categorize expenses for better organization
    • Add detailed descriptions and notes
    • Track who paid and who owes what

Analytics & Insights

  1. Spending Analytics: View top spending categories
  2. Debt Overview: See who owes you money and how much you owe others at a glance
  3. Payment Integration: Add Venmo handles for easy payment requests and settlements

Privacy & Control

  1. Self-hosted: Keep your financial data on your own infrastructure
  2. Open Source: Full transparency and customizability
  3. No tracking: No analytics, ads, or data collection

Screenshots

View Pools

Friends View Profile View

Pool Details

Roommates Yosemite Trip

Add Expenses

Add Expenses

Quick Start

Docker Compose (Recommended for Self-Hosting)

The easiest way to get Medici running in production is to run the compose.example.yaml file, which will pull the necessary Docker images. You'll need a .env for the backend like this:

DATABASE_URL=postgres://postgres:postgres@localhost:5442/medici
AUTH_SECRET_KEY=medici-key

and for the frontend like this:

VITE_API_URL=http://medici-server:8000

Local Development Setup

For development or if you prefer running without Docker:

Prerequisites:

Detailed Setup Steps:

  1. Install Prerequisites:
# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env

# Install diesel CLI
cargo install diesel_cli --no-default-features --features postgres

# Install just
cargo install just

# Install Node.js and pnpm (using your preferred method)
# On macOS with Homebrew:
brew install node pnpm
  1. Database Setup:
# Start PostgreSQL (method varies by OS)
# On macOS with Homebrew:
brew services start postgresql

# Create database and user
psql postgres -c "CREATE DATABASE medici;"
psql postgres -c "CREATE USER medici WITH PASSWORD 'medici';"
psql postgres -c "GRANT ALL PRIVILEGES ON DATABASE medici TO medici;"
  1. Clone and Configure:
# Clone the repository
git clone https://github.com/your-username/medici.git
cd medici

# Set up environment files
just set-env-backend
just set-env-frontend

# Review and edit .env files as needed
cat server/.env
cat frontend/.env
  1. Initialize and Start:
# Run the complete setup (installs dependencies, runs migrations)
just setup

# Start development servers in separate terminals:

# Terminal 1: Frontend (React dev server)
cd frontend && pnpm dev

# Terminal 2: Backend (Rust server with hot reload)
cd server && cargo watch -x run

The development setup will be available at:

  • Frontend: http://localhost:3001
  • Backend API: http://localhost:8000