Koffan

Koffan

Docker app from Uderzo's Repository

Overview

Koffan is a lightweight, self-hosted shopping list app designed for families and couples.

Features:

  • Real-time sync (WebSockets)
  • Offline-first / PWA support
  • Minimal resource usage
  • Simple password-based auth

Change APP_PASSWORD on first install.

Koffan Logo

Koffan

Free shopping assistant
A fast and simple app for managing your shopping list together

Deploy on Railway   Deploy to Render   Deploy to DigitalOcean   Deploy to Heroku


Screenshots

Koffan


What does "Koffan" mean?

Pronounced KOF-fan (rhymes with "coffin" but with an "a" at the end). The name comes from the Polish word "kochanie" (meaning "darling" or "sweetheart"), which evolved into a playful nickname. It's a long story, but let's just say the name stuck! :D

What is Koffan?

Koffan is a lightweight web application for managing shopping lists, designed for couples and families. It allows real-time synchronization between multiple devices, so everyone knows what to buy and what's already in the cart.

The app works in any browser on both mobile and desktop. Just one password to log in - no complicated registration required.

Why did I build this?

I needed an app that would let me and my wife create a shopping list together and do grocery shopping quickly and efficiently. I tested various solutions, but none of them were simple and fast enough.

I built the first version in Next.js, but it turned out to be very resource-heavy. I have a lot of other things running on my server, so I decided to optimize. I rewrote the app in Go and now it uses only ~2.5 MB RAM instead of hundreds of megabytes!

Features

  • Ultra-lightweight - ~16 MB on disk, ~2.5 MB RAM
  • Multiple lists - Create separate lists for different stores or purposes, with custom icons
  • PWA - Install on your phone like a native app
  • Offline mode - Add, edit, check/uncheck products without internet (auto-sync when back online)
  • Auto-completion - Fuzzy search suggestions from your history, remembers sections
  • Organize products into sections (e.g., Dairy, Vegetables, Cleaning)
  • Mark products as purchased
  • Mark products as "uncertain" (can't find it in the store)
  • Real-time synchronization (WebSocket)
  • Responsive interface (mobile-first)
  • Dark mode - Automatic theme based on system preferences
  • Multi-language support (PL, EN, DE, ES, FR, PT, UK, NO, LT, EL, SK, SV, RU)
  • Simple login system
  • Rate limiting protection against brute-force attacks
  • REST API - Programmatic access for integrations and migrations (docs)

Tech Stack

  • Backend: Go 1.21 + Fiber
  • Frontend: HTMX + Alpine.js + Tailwind CSS
  • Database: SQLite

Local Setup (without Docker)

You can run Koffan directly on your machine using Go. This works on any system (macOS, Linux, Windows).

1. Install Go

macOS (Homebrew):

brew install go

Linux (Debian/Ubuntu):

sudo apt install golang-go

Windows: Download from go.dev/dl

2. Clone and Run

git clone https://github.com/PanSalut/Koffan.git
cd Koffan
go run main.go

App available at http://localhost:3000

Default password: shopping123

To set a custom password:

APP_PASSWORD=yourpassword go run main.go

Arch Linux (AUR)

Arch Linux users can install Koffan from the AUR using an AUR helper:

yay -S koffan

The AUR package is community-maintained by @SergeantBiggs, not by the Koffan project.

Docker

Upgrading from 2.9.x or earlier? The default container port changed from 80 to 8080 in 2.10.0 so the image can run as a non-root user. If you are upgrading, update your port mappings and any reverse proxy upstreams accordingly:

  • docker run -p 80:80docker run -p 80:8080
  • docker run -p 3000:80docker run -p 3000:8080
  • Reverse proxies (nginx / Caddy / Traefik): point the upstream to the container's port 8080
  • If you previously overrode PORT via env to work around the privileged port, you can drop that override

Coolify and other auto-discovery setups that read the image's EXPOSE will pick up the new port on redeploy without any manual change.

Quick Start (recommended)

docker run -d -p 3000:8080 -e APP_PASSWORD=yourpassword -v koffan-data:/data ghcr.io/pansalut/koffan:latest

App available at http://localhost:3000

Build from source

docker-compose up -d
# App available at http://localhost:8080

Environment Variables

Variable Default Description
APP_ENV development Set to production for secure cookies
APP_PASSWORD shopping123 Login password
DISABLE_AUTH false Set to true to disable authentication (for reverse proxy setups)
PORT 8080 (Docker) / 3000 (local) Server port
DB_PATH ./shopping.db Database file path
DEFAULT_LANG en Default UI language (pl, en, de, es, fr, pt, uk, no, lt, el, sk, ru)
LOGIN_MAX_ATTEMPTS 5 Max login attempts before lockout
LOGIN_WINDOW_MINUTES 15 Time window for counting attempts
LOGIN_LOCKOUT_MINUTES 30 Lockout duration after exceeding limit
API_TOKEN (disabled) Enable REST API with this token (docs)

Deploy to Your Server

Docker

git clone https://github.com/PanSalut/Koffan.git
cd Koffan
docker build -t koffan .
docker run -d -p 80:8080 -e APP_PASSWORD=your-password -v koffan-data:/data koffan

Coolify

  1. Add new resource → Docker Compose → Select your Git repository or use https://github.com/PanSalut/Koffan
  2. Set domain in Domains section
  3. Enable Connect to Predefined Network in Advanced settings
  4. Add environment variable APP_PASSWORD with your password
  5. Deploy

Persistent Storage

Data is stored in /data/shopping.db. The volume ensures your data persists across deployments.

Documentation

For more information, check the Wiki:

  • REST API - Programmatic access, migrations, integrations
  • Multiple Instances - Running separate instances for different households

Feature Requests

Have an idea? Check open feature requests and vote with 👍 on the ones you want most.

Want to suggest something new? Create an issue.

Sponsors

I love and admire the open source philosophy. That's why I created Koffan - to give back to the community that has given me so much over the years.

If you find this project useful and want to support my work (completely optional!), you can become a sponsor:

Sponsor

Thank You

I'm incredibly grateful to these amazing people for supporting Koffan:

License

MIT License with Commons Clause.

You are free to use, modify, and share this software for any purpose, including commercial use within your organization. However, you may not sell the software or offer it as a paid service.

Install Koffan on Unraid in a few clicks.

Find Koffan in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for Koffan Review the template variables and paths Click Install

Categories

Related apps

Explore more like this

Explore all

Details

Repository
ghcr.io/pansalut/koffan:latest
Last Updated2026-07-14
First Seen2026-01-15

Runtime arguments

Web UI
http://[IP]:[PORT:8080]
Network
bridge
Shell
sh
Privileged
false
Extra Params
--restart unless-stopped

Template configuration

WebUI PortPorttcp
Target
8080
Default
3000
Value
3000
AppData DirectoryPathrw
Target
/data
Default
/mnt/user/appdata/koffan
Value
/mnt/user/appdata/koffan
Application PasswordVariable

Login password for Koffan (CHANGE THIS)

Target
APP_PASSWORD
Default
change-me
Value
change-me
Application EnvironmentVariable

Set to 'production' when using HTTPS or reverse proxy

Target
APP_ENV
Default
development
Value
development
Disable AuthenticationVariable

Disable login entirely (ONLY if proxy handles auth)

Target
DISABLE_AUTH
Default
false
Value
false
Database PathVariable

SQLite database file location

Target
DB_PATH
Default
/data/shopping.db
Value
/data/shopping.db
Default LanguageVariable

UI language (en, no, de, fr, es, pl, pt, uk, lt)

Target
DEFAULT_LANG
Default
en
Value
en
API TokenVariable

Optional REST API token (leave empty to disable)

Target
API_TOKEN