Swiss accounting software
  • PHP 75.9%
  • Vue 18.1%
  • JavaScript 3.3%
  • Shell 1.8%
  • Blade 0.8%
  • Other 0.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-09-30 14:59:47 +02:00
.githooks fix(hooks): replace gitlab/main drift guard with origin/main file-diff check 2026-05-17 19:14:44 +02:00
.github fix: make PHPUnit CI environment explicit 2026-09-09 17:45:22 +02:00
.specify feat: establish CE boundary and plugin extensions 2026-09-03 14:03:13 +02:00
.vscode release: prepare Gaeld CE 3.6.0 2026-08-20 19:10:22 +02:00
app fix: harden nullable invoice due dates 2026-09-30 14:59:47 +02:00
bootstrap fix: exclude ValidationException from generic 500 catch-all 2026-09-12 17:27:46 +02:00
config feat: migrate to Laravel Passkeys 2026-09-09 18:09:28 +02:00
contract release: prepare CE v3.8.2 minimal API 2026-09-03 18:49:07 +02:00
database feat: structure expense category account mappings 2026-09-23 10:17:38 +02:00
docker test: complete commercial acceptance coverage 2026-09-03 17:43:38 +02:00
lang feat: structure expense category account mappings 2026-09-23 10:17:38 +02:00
plugins/example-plugin feat: establish CE boundary and plugin extensions 2026-09-03 14:03:13 +02:00
public fix: reset stale sessions and retire service worker 2026-09-04 13:13:13 +02:00
resources fix: harden nullable invoice due dates 2026-09-30 14:59:47 +02:00
routes fix: correct invoice payment dates 2026-09-23 08:52:30 +02:00
scripts test: accept subscription label in staging QA 2026-09-18 08:55:13 +02:00
specs release: prepare CE v3.8.2 minimal API 2026-09-03 18:49:07 +02:00
storage chore(security): keep gitlab-ci off public mirror; untrack local test PDFs 2026-05-05 01:41:41 +02:00
tests fix: harden nullable invoice due dates 2026-09-30 14:59:47 +02:00
.dockerignore feat(saas): isolate admin console from CE 2026-08-22 00:55:13 +02:00
.env.example feat: align SaaS offer and CE quotas 2026-09-02 22:55:12 +02:00
.env.production.example feat: align SaaS offer and CE quotas 2026-09-02 22:55:12 +02:00
.gitattributes ci: add keep-ours merge driver for production-only files 2026-04-08 10:55:32 +02:00
.gitignore ci: remove file session override and ignore workspaces 2026-09-09 15:31:41 +02:00
.gitleaks.toml ci(security): allow documented synthetic secret examples 2026-08-05 00:34:56 +02:00
.nvmrc chore: migrate to pnpm and upgrade Node.js to 24 2026-04-02 15:15:52 +02:00
AGENTS.md chore: basic cleanup 2026-05-07 16:19:07 +02:00
artisan Initial commit: Gäld accounting application (Laravel 12 + Inertia + Vue 3) 2026-03-16 17:10:09 +01:00
boost.json chore: add ai tool 2026-05-07 14:22:15 +02:00
CHANGELOG.md fix: harden nullable invoice due dates 2026-09-30 14:59:47 +02:00
CODE_OF_CONDUCT.md chore: GitHub community files, CHANGELOG, CONTRIBUTING, SECURITY, composer update, nginx config 2026-04-01 17:40:08 +02:00
composer.json feat: migrate to Laravel Passkeys 2026-09-09 18:09:28 +02:00
composer.lock feat: migrate to Laravel Passkeys 2026-09-09 18:09:28 +02:00
CONTRIBUTING.md feat: establish CE boundary and plugin extensions 2026-09-03 14:03:13 +02:00
deploy.php.example feat: establish CE boundary and plugin extensions 2026-09-03 14:03:13 +02:00
docker-compose.yml fix(docker): add build context to worker service 2026-04-15 13:20:49 +02:00
gaeld fix: diagnose linux docker access 2026-08-20 20:53:11 +02:00
INSTALL.md docs: record v3.8.2 production rollout 2026-09-03 21:06:55 +02:00
LICENSE chore(license): relicense community edition under AGPL 2026-04-09 09:11:52 +02:00
package.json deps: merge Maska update 2026-09-07 23:07:45 +02:00
phpstan-baseline.neon fix: harden nullable invoice due dates 2026-09-30 14:59:47 +02:00
phpstan.neon chore(phpstan): quarantine legacy bank parsers via ignoreErrors 2026-05-12 11:19:14 +02:00
phpunit.ee.xml fix: close staging release remediation 2026-08-23 17:32:43 +02:00
phpunit.xml chore: prepare v3.8.21 staging release 2026-09-18 08:47:09 +02:00
pint.json feat: OCR receipt scanning, org invitations & member management, cookie consent, quick-create contacts 2026-03-25 12:00:19 +01:00
pnpm-lock.yaml deps: merge Maska update 2026-09-07 23:07:45 +02:00
pnpm-workspace.yaml ci: pin pnpm 11 for reproducible installs 2026-08-05 09:02:28 +02:00
README.md release: prepare CE v3.8.1 2026-09-03 15:24:51 +02:00
RELEASE.md feat: structure expense category account mappings 2026-09-23 10:17:38 +02:00
SECURITY.md docs(release): align v3.0.0 docs and CI to develop branch and sail commands 2026-05-05 01:23:59 +02:00
tailwind.config.js Initial commit: Gäld accounting application (Laravel 12 + Inertia + Vue 3) 2026-03-16 17:10:09 +01:00
vite.config.js fix: load Sentry Vite settings from environment 2026-09-08 13:16:34 +02:00

Gäld

CI License: AGPL v3 PHP 8.4+ Laravel 13

Open-source accounting for Swiss freelancers and small businesses.

Proper double-entry bookkeeping, Swiss QR-Bill invoicing, VAT reporting, and bank reconciliation — built with Laravel and Vue, AGPL-3.0-or-later licensed, fully self-hostable.

Current public release: v3.8.1. Follow the versioned changelog and release runbook before upgrading a live instance.

Website · Documentation · Hosted version · Release runbook

This repository contains the public Community Edition (CE). The hosted SaaS and Enterprise Edition (EE) plugin are maintained in private repositories and are not required for self-hosted CE installations. The CE is a complete accounting product under AGPL-3.0-or-later; no SaaS subscription or private registry access is required to install, operate, export, or contribute to it.


What it does

Gäld covers the full accounting workflow for a small Swiss business:

  • Double-entry accounting — journal, ledger, and trial balance with strict debit/credit balance enforcement
  • Invoicing — professional PDFs with Swiss QR-Bill payment slip (ready to print and send)
  • Expense tracking — log expenses, attach receipts, categorise by supplier
  • Swiss VAT (MWST) — correct rates preconfigured, VAT report ready for the tax authority
  • Bank reconciliation — import CAMT.053 files from your bank, match transactions against invoices and expenses
  • Contacts — shared customer and supplier directory across all modules
  • Financial reports — profit & loss, balance sheet, trial balance
  • REST API — integrate journal entries, contacts, invoices, expenses, and CAMT.053 imports from external applications
  • Multi-language — English, French, German, Italian (EN / FR / DE / IT)
  • Plugin system — extend functionality without touching the core codebase

Getting started

Install Docker Engine with Docker Compose v2 and start Docker Desktop or the Docker service before running setup. The command checks Docker immediately and prints an actionable error if the selected Docker context is unavailable; it does not install or launch Docker Desktop for you.

On Linux, your user must be allowed to access Docker. If docker info reports permission denied, run sudo usermod -aG docker "$USER", start a new login session (or run newgrp docker), and verify with docker info.

./gaeld setup

The setup script builds the Docker image, starts all services (PostgreSQL, Redis, Meilisearch, Mailpit), waits for health checks, and runs the interactive installer — with progress indicators at each step.

Add --demo for a non-interactive setup with sample data:

./gaeld setup --demo

Visit http://localhost:8080. The install wizard walks you through creating your organisation and admin account.

Other useful commands:

./gaeld artisan migrate    # Run migrations
./gaeld doctor             # Diagnose configuration and service health
./gaeld update             # Apply migrations and rebuild application caches
./gaeld logs               # Tail application logs
./gaeld worker             # Tail queue worker logs
./gaeld status             # Show container status
./gaeld down               # Stop everything

For manual installation, upgrades, reverse-proxy configuration, and backup requirements, see INSTALL.md.


Tech stack

Layer Technology
Backend Laravel 13
Runtime PHP 8.4+, Node.js 22+, pnpm 11
Frontend Inertia.js + Vue 3
Database PostgreSQL
Cache / Queue Redis
Docs Docusaurus

Architecture

The codebase follows a domain-driven structure. Each business domain is self-contained under app/Domains/:

Accounting/     — chart of accounts, journal entries, ledger
Banking/        — bank accounts, CAMT import, transaction reconciliation
Contacts/       — customers and suppliers
Expenses/       — expense recording and reporting
Invoicing/      — invoices, payments, QR-Bill generation
Organizations/  — multi-org support, tenant isolation
Reporting/      — read-only financial reports (P&L, balance sheet, cash flow)
Users/          — authentication, profiles

All ledger mutations go through LedgerService, which enforces double-entry integrity. The Reporting domain is a read-only projection — it never writes to the ledger.


Configuration

Optional features are toggled in .env:

FEATURE_BANK_SYNC=false
FEATURE_AUTO_RECONCILIATION=false
FEATURE_AUTOMATION=false
FEATURE_MULTI_CURRENCY=false
FEATURE_API_ACCESS=true

The Community Edition includes a versioned REST API at /api/v1. It supports organization-scoped bearer tokens, account and journal-entry operations, contacts, invoice and expense workflows, and CAMT.053 bank imports. See the public API documentation for request and response examples.

API tokens use the canonical abilities listed by GET /api/v1/meta/abilities, such as accounting.view, invoicing.create, and banking.import. The wildcard * grants all mapped API operations; omitting abilities or sending an empty array has the same effect. Older resource names such as accounts:read remain accepted and are normalized to their canonical permissions. Token expiration accepts 1 to 365 days and is stored as an exact expiration timestamp.


Plugin system

Drop a plugin into /plugins/. A plugin is a standard Laravel service provider with a manifest:

plugins/my-plugin/
├── plugin.json           — name, version, provider class
├── src/
│   └── MyServiceProvider.php
├── routes/web.php        — optional
└── migrations/           — optional

Plugins are auto-discovered on boot. See plugins/example-plugin/ for a minimal working example.


Contributing

Issues and pull requests are welcome. Please read CONTRIBUTING.md before submitting a PR.

./vendor/bin/sail artisan test                      # run the test suite
./vendor/bin/sail bin pint                         # fix code style
./vendor/bin/sail bin phpstan analyse --memory-limit=2G

Please keep pull requests focused and include tests for new behaviour.


License

AGPL-3.0-or-later — see LICENSE.