Kostos
Kostos is a web application designed to help groups manage and split expenses collaboratively within projects.
Install / Use
/learn @shynewt/KostosREADME
NOTE: This project was 100% vive coded. It was built to meet our own needs for a feature-rich, user-friendly open source expense splitting app. It works reliably for us and we use it daily, but we do not plan to refactor it. It fulfills its intended purpose as-is.
Kostos makes it easy for groups to track, manage, and split expenses together. No user registration is required. A simple interface with powerful features designed for effortless collaboration.
<h4 align="center"><a href="#screenshots">SCREENSHOTS</a> | <a href="https://kostos.shynewt.com/projects/join?projectId=oGJIl2wqOJ">DEMO</a></h4>✨ Key Features
- Project Management: Create new projects or join existing ones to manage shared expenses.
- Member Management: Add members to projects.
- No user accounts required: Uses unique user and project IDs, your session is stored in your browser local storage.
- Expense Tracking: Record expenses with details like description, amount, date, category, and payment method.
- Flexible Splitting: Split expenses evenly, by specific amounts (supports basic math expressions!) or by shares.
- Payment Tracking: Record which member(s) paid for each expense. Support multiple payers.
- Category Management: Create custom categories with names and colors to organize expenses.
- Payment Method Management: Define and track custom payment methods with names and icons.
- Statistics: Visualize project expense data with beautiful charts.
- Data Import/Export: Functionality to import/export project data (uses Spliit format).
- Progressive Web App (PWA): Configured for PWA capabilities via
next-pwa. - Dockerized: Includes
Dockerfileandcompose.yamlfor easy deployment.
🚀 Self Hosting
-
Get the docker compose file
wget -O docker-compose.yml https://raw.githubusercontent.com/shynewt/kostos/refs/heads/main/compose.yaml -
Run
# The sqlite file must exist before running touch kostos.db && docker compose up -d -
Open http://localhost:3000 in your browser
🧑💻 Development
-
Clone the repository:
git clone <repository-url> cd kostos -
Install dependencies:
npm install -
Set up the database:
-
Run all migrations (creates the database if it doesn't exist):
npm run db:migrate -
(Optional) Seed initial data if needed (check
scripts/init-db.js):npm run db:init
-
-
Run the development server:
npm run dev
Open http://localhost:3000 in your browser.
📜 Available Scripts
npm run dev: Starts the Next.js development server.npm run build: Builds the application for production.npm run start: Starts the production server (requiresbuildfirst).npm run lint: Runs Next.js's built-in linter.npm run db:generate: Generates SQL migration files based on schema changes using Drizzle Kit.npm run db:migrate: Applies all pending migrations to the database using Drizzle Kit.npm run db:push: Pushes schema changes directly to the database (useful for rapid prototyping, potentially destructive).npm run db:studio: Opens Drizzle Studio, a GUI for interacting with the database.npm run db:init: Runs a script to potentially initialize/seed the database (seescripts/init-db.js).npm run db:pull: Introspects the current database schema and updatesdb/schema.ts.
💾 Database
This project uses Drizzle ORM to manage the SQLite database schema and queries.
- Schema: Defined in
db/schema.ts. - Migrations: Managed by Drizzle Kit. Generate new migrations using
npm run db:generateafter changing the schema. Apply migrations usingnpm run db:migrate.
🐳 Docker
- The Docker image uses an entrypoint script that ensures the database file exists and runs all migrations before starting the app.
- You do not need to manually create the database file; it will be created automatically.
- On container startup, migrations are always applied to keep the schema up to date.
⚙️ Tech Stack
- Framework: Next.js
- Language: TypeScript
- UI Library: React
- Styling: Tailwind CSS
- Database: SQLite
- ORM: Drizzle ORM
- Charting: Chart.js / react-chartjs-2
- Date Handling: date-fns
Screenshots
<h5 align="center">Main Project Dashboard</h5> <img src="misc/screenshot_1.png" align="center" /> <h5 align="center">Project Stats</h5> <img src="misc/screenshot_2.png" align="center" /> <h5 align="center">Add Expense Form</h5> <img src="misc/screenshot_3.png" align="center" />Related Skills
diffs
341.2kUse the diffs tool to produce real, shareable diffs (viewer URL, file artifact, or both) instead of manual edit summaries.
clearshot
Structured screenshot analysis for UI implementation and critique. Analyzes every UI screenshot with a 5×5 spatial grid, full element inventory, and design system extraction — facts and taste together, every time. Escalates to full implementation blueprint when building. Trigger on any digital interface image file (png, jpg, gif, webp — websites, apps, dashboards, mockups, wireframes) or commands like 'analyse this screenshot,' 'rebuild this,' 'match this design,' 'clone this.' Skip for non-UI images (photos, memes, charts) unless the user explicitly wants to build a UI from them. Does NOT trigger on HTML source code, CSS, SVGs, or any code pasted as text.
openpencil
1.9kThe world's first open-source AI-native vector design tool and the first to feature concurrent Agent Teams. Design-as-Code. Turn prompts into UI directly on the live canvas. A modern alternative to Pencil.
HappyColorBlend
HappyColorBlendVibe Project Guidelines Project Overview HappyColorBlendVibe is a Figma plugin for color palette generation with advanced tint/shade blending capabilities. It allows designers to
