Single binary, self-hosted, chat-style support desk
See the code
Pappice is a small, self-hosted, chat-style support desk. Customers open tickets from the portal; staff assign, reply, and track them.
We built Pappice for our consultancy because the support desks we tried were too heavy, not fully open source, or missing the workflow we needed. We now use it in production across multiple clients.

Pappice is intentionally minimal and self-contained:
Application source, excluding demos and tests (npm run loc; comments included):
| Backend | 12,877 LoCs | | Frontend | 9,143 LoCs |
From a source checkout with Go 1.26+:
go run ./demo/native
The native demo uses local HTTPS with a self-signed certificate and sample data.
It prints the URL and credentials, and removes its data on shutdown. Use
go run ./demo/native -keep to retain the temporary directory.
For the experimental browser-only demo, Node 22+ is also required:
npm run demo:browser
Open http://127.0.0.1:8389. Each tab runs Go and SQLite locally; reloading resets
its data. All sections are available; file transfers and outgoing email/webhook
deliveries are unsupported.
To publish it, run npm run build:browser and serve dist/browser/ on a static
host over HTTPS. Subdirectories work without route rewrites. Enable gzip or Brotli
for the WASM download; the build includes a precompressed .wasm.gz file.
Pappice is in 0.x and has not been externally security audited. API and schema changes may require database migrations between releases.
Follow the deployment guide for Docker Compose (recommended) or binary + systemd. See configuration for optional settings.
Requires Go 1.26+.
go build -trimpath -o dist/pappice ./cmd/pappice
Create a release archive with scripts/build-release.sh.
Run the local checks:
scripts/check.sh
Unsupported race checks and unavailable browser checks are skipped.
Set PAPPICE_CHECK_STRICT=1 to require all checks; releases use strict mode.
Browser tests require Node 22+, OpenSSL, and Chromium or Chrome. Set
PAPPICE_E2E_CHROMIUM=/path/to/chromium to override discovery.
npm run test:browser checks the WebAssembly demo against a static host.
See benchmarks for reproducible memory measurements.
Keep changes small and focused. The checks above must pass before opening a pull request.
Pappice is released under the GNU General Public License v3.0 only
(GPL-3.0-only). See LICENSE.
Copyright 2026 Paolo Marrone and contributors.
203 commits
8 commits
Go
63.3%
JavaScript
27.7%
CSS
5.8%
HTML
1.9%
Shell
1.2%
Single binary, self-hosted, chat-style support desk
See the code
Pappice is a small, self-hosted, chat-style support desk. Customers open tickets from the portal; staff assign, reply, and track them.
We built Pappice for our consultancy because the support desks we tried were too heavy, not fully open source, or missing the workflow we needed. We now use it in production across multiple clients.

Pappice is intentionally minimal and self-contained:
Application source, excluding demos and tests (npm run loc; comments included):
| Backend | 12,877 LoCs | | Frontend | 9,143 LoCs |
From a source checkout with Go 1.26+:
go run ./demo/native
The native demo uses local HTTPS with a self-signed certificate and sample data.
It prints the URL and credentials, and removes its data on shutdown. Use
go run ./demo/native -keep to retain the temporary directory.
For the experimental browser-only demo, Node 22+ is also required:
npm run demo:browser
Open http://127.0.0.1:8389. Each tab runs Go and SQLite locally; reloading resets
its data. All sections are available; file transfers and outgoing email/webhook
deliveries are unsupported.
To publish it, run npm run build:browser and serve dist/browser/ on a static
host over HTTPS. Subdirectories work without route rewrites. Enable gzip or Brotli
for the WASM download; the build includes a precompressed .wasm.gz file.
Pappice is in 0.x and has not been externally security audited. API and schema changes may require database migrations between releases.
Follow the deployment guide for Docker Compose (recommended) or binary + systemd. See configuration for optional settings.
Requires Go 1.26+.
go build -trimpath -o dist/pappice ./cmd/pappice
Create a release archive with scripts/build-release.sh.
Run the local checks:
scripts/check.sh
Unsupported race checks and unavailable browser checks are skipped.
Set PAPPICE_CHECK_STRICT=1 to require all checks; releases use strict mode.
Browser tests require Node 22+, OpenSSL, and Chromium or Chrome. Set
PAPPICE_E2E_CHROMIUM=/path/to/chromium to override discovery.
npm run test:browser checks the WebAssembly demo against a static host.
See benchmarks for reproducible memory measurements.
Keep changes small and focused. The checks above must pass before opening a pull request.
Pappice is released under the GNU General Public License v3.0 only
(GPL-3.0-only). See LICENSE.
Copyright 2026 Paolo Marrone and contributors.
203 commits
8 commits
Go
63.3%
JavaScript
27.7%
CSS
5.8%
HTML
1.9%
Shell
1.2%