Open-source invoicing for people who want to own their business data.
Download InvoiceShelf · Documentation · Join Discord
> [!WARNING] > The default `3.x` branch is an alpha preview. It is ready for testing and > feedback, but not for production data. Use the supported > [`2.x` release](https://github.com/InvoiceShelf/InvoiceShelf/tree/2.x) for a > production installation.  ## Run your invoicing from one place InvoiceShelf is a self-hosted web application for creating invoices, tracking payments and expenses, and keeping customer accounts organised. It is built for freelancers and small businesses that want a focused workflow without giving up control of their data. - Create invoices and estimates, then export polished PDFs. - Record payments and see what each customer still owes. - Track expenses, taxes, and business reports. - Schedule recurring invoices for repeat work. - Give customers a portal for invoices, estimates, and payment history. - Manage multiple companies and invite team members with scoped roles. Optional official modules can add specialised features without making the core application heavier. ## Install InvoiceShelf ### Production: InvoiceShelf 2.x Install the current stable release from the [self-hosted download page](https://invoiceshelf.com/download), or run the official Docker image with the `:latest` tag. Follow the [installation guide](https://docs.invoiceshelf.com/installation.html) for the complete setup and upgrade instructions. ### Preview: InvoiceShelf 3.x Use the preview only with disposable or backed-up data: - Download the latest 3.x preview from the [self-hosted download page](https://invoiceshelf.com/download). - For Docker, use `invoiceshelf/invoiceshelf:next` instead of `:latest` in the [official Compose setup](https://github.com/InvoiceShelf/docker). A minimal SQLite Docker setup looks like this: ```bash git clone https://github.com/InvoiceShelf/docker.git invoiceshelf cd invoiceshelf cp docker-compose.sqlite.yml docker-compose.yml # For the 3.x preview, change the image tag in docker-compose.yml to :next. docker compose up -d ``` Open