Desk
Invoicetronic Desk is an open-source, white-label web app for Italian electronic invoicing (FatturaPA/SDI). It's a ready-to-use frontend for the Invoicetronic API, available as a cloud service or self-hosted with Docker or native binaries.
No need to learn the API or implement anything: with Desk you can send and receive electronic invoices right away. ISVs and developers can also self-host it, apply their own branding, and give their customers a complete invoicing interface — without writing a single line of UI code.
Try Desk Cloud for free GitHub
Features
- Send & receive invoices — full-text search, date filters, server-side pagination, XML download
- Invoice detail — metadata and complete SDI status timeline
- Upload — drag-and-drop multi-file upload
- Export — filter by month/quarter/date range, download as ZIP
- Company management — CRUD for companies linked to your API key
- Dashboard — recent invoices overview and counters
- Localization — Italian (default) and English
Dashboard vs Desk
Invoicetronic has two web apps with different purposes:
- Dashboard is for developers and account administrators. Use it to manage API keys, configure webhooks, view API logs, switch between test/live environments, and handle billing.
- Desk (this page) is for end users who work with invoices daily. Use it to send, receive, search, upload, export invoices and manage companies — without touching code or APIs.
| Dashboard | Desk | |
|---|---|---|
| Target user | Developer / admin | Accountant / operator / ISV (internal use or integration testing) |
| API keys | Create, rotate, manage | Uses one (configured or per-user) |
| Webhooks | Configure endpoints and events | — |
| API logs | Browse request/response history | — |
| Test/Live mode | Switch environments | Determined by the API key |
| Billing | Manage subscription and payment | — |
| Send & receive invoices | — | Full-text search, filters, pagination |
| Invoice detail & SDI timeline | — | Complete status history |
| Upload invoices | — | Drag-and-drop multi-file |
| Export | — | ZIP download by date range |
| Company management | — | CRUD for linked companies |
| White-label / self-host | No | Yes (Docker, custom branding) |
In short: Dashboard is where you set up the plumbing; Desk is where you (or your customers) do the actual invoicing work. Most users need both: Dashboard once during setup, Desk every day — eventually alongside your own integrations.
Get an API key
Sign up at dashboard.invoicetronic.com and get your API key. Desk works with both sandbox and live API keys — the environment is determined by the key you use. Start with a sandbox key for testing, then switch to live when you're ready. See the Sandbox and API Keys documentation pages for details.
Live environment prerequisites
To use Desk in a live environment, your Invoicetronic account must meet the API prerequisites (accreditation with SDI, etc.). See the Live Environment Prerequisites for the full checklist. No prerequisites are needed for the sandbox — you can start testing immediately.
Cloud or self-hosted
| Cloud | Self-hosted | |
|---|---|---|
| Setup | Sign up and start immediately | Docker compose or native binary on your own server |
| Maintenance | Zero — we handle it | Manual |
| Updates | Automatic — we handle it | Manual (docker pull or download new release) |
| Customization | Limited | Full (CSS, logo, app name) |
| Cost | €5/month | Free |
Cloud
The fastest way to get started. No Docker, no servers, no configuration — just sign up at desk.invoicetronic.com and start working.
Self-hosted with Docker
Standalone mode (single API key, no login — ideal for internal networks):
# docker-compose.yml
services:
desk:
image: invoicetronic/desk
ports:
- "8080:8080"
volumes:
- ./desk.yml:/app/desk.yml
Keep secrets out of config files
Pass the API key via environment variable instead of storing it in desk.yml:
Open http://localhost:8080 — no registration needed.
Multi-user mode (each user registers and enters their own API key):
# docker-compose.yml
services:
desk:
image: invoicetronic/desk
ports:
- "8080:8080"
volumes:
- ./desk.yml:/app/desk.yml # optional
- ./data:/app/data # persist user database
Open http://localhost:8080, register, and enter your API key in the profile page.
Native binaries
Every GitHub release includes self-contained, single-file binaries — no .NET installation required.
| File | OS | Architecture |
|---|---|---|
desk-win-x64.zip |
Windows | x86-64 (Intel/AMD) |
desk-linux-x64.zip |
Linux | x86-64 (Intel/AMD) |
desk-linux-arm64.zip |
Linux | ARM64 (Raspberry Pi 4/5, AWS Graviton) |
desk-osx-x64.zip |
macOS | Intel |
desk-osx-arm64.zip |
macOS | Apple Silicon (M1/M2/M3/M4) |
Windows:
Linux:
macOS:
unzip desk-osx-arm64.zip -d desk # or desk-osx-x64.zip for Intel
chmod +x desk/desk
xattr -d com.apple.quarantine desk/desk # remove Gatekeeper quarantine
./desk/desk
The app listens on http://localhost:5000 by default. Place a desk.yml file in the same directory as the binary to configure it.
Change listening address or port
Use the --urls flag or the ASPNETCORE_URLS environment variable:
Two authentication modes
| Standalone | Multi-user | |
|---|---|---|
| When | api_key is set in desk.yml |
api_key is absent |
| Auth | None — all pages accessible | Registration + login required |
| API key | Shared, from config | Per-user, stored in profile |
| Database | In-memory | SQLite (default) or PostgreSQL |
| Use case | Internal network, VPN, single tenant | SaaS, multi-tenant |
Caution
In standalone mode anyone who can reach the host has full access. Use only in trusted networks.
White-label and theming
Customize colors, logo, and favicon directly in desk.yml:
desk:
branding:
app_name: My Invoicing App
footer_text: "Powered by <a href=\"https://example.com\">My Company</a>"
logo_url: https://example.com/logo-light.svg # navbar (dark background)
logo_dark_url: https://example.com/logo-dark.svg # auth pages (light background)
favicon_url: https://example.com/favicon.png
primary_color: "#1A237E"
accent_color: "#E91E63"
All properties are optional — if omitted, Invoicetronic defaults are used.
For full control over the design system, you can mount a custom/theme.css file that overrides any CSS custom property:
/* custom/theme.css */
:root {
--brand-primary: #1A237E;
--brand-accent: #E91E63;
--brand-font-heading: "Poppins", sans-serif;
}
Password reset (SMTP)
In multi-user mode, users can reset their forgotten password via email. To enable this feature, configure an SMTP server in desk.yml:
desk:
smtp:
host: smtp.example.com
port: 587 # 587 (StartTLS) | 465 (SSL)
username: user@example.com
password: secret
sender_email: noreply@example.com
sender_name: My App
All properties except host and sender_email are optional. If the smtp section is not configured, the "Forgot password?" link is not shown on the login page.
Keep secrets out of config files
Pass SMTP credentials via environment variables:
Tech stack
| Layer | Technology |
|---|---|
| Backend | ASP.NET Core 10.0 + Razor Pages |
| Data grid | AG Grid Community (MIT) |
| UI | Custom CSS design system (no Bootstrap) |
| Auth | ASP.NET Core Identity |
| Database | SQLite (default) / PostgreSQL |
| Config | YAML (desk.yml) |
| Container | Docker multi-platform (amd64/arm64) |
License
Apache License 2.0 — use, modify, and redistribute freely, including for commercial purposes.
