Skip to content

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

Invoicetronic Desk screenshot

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
# desk.yml
desk:
  api_key: YOUR_API_KEY

Keep secrets out of config files

Pass the API key via environment variable instead of storing it in desk.yml:

# docker-compose.yml
services:
  desk:
    image: invoicetronic/desk
    ports:
      - "8080:8080"
    environment:
      - Desk__api_key=YOUR_API_KEY
docker compose up -d

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
docker compose up -d

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:

# Extract the archive, create desk.yml, then:
.\desk.exe

Linux:

unzip desk-linux-x64.zip -d desk
chmod +x desk/desk
./desk/desk

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:

./desk --urls http://0.0.0.0:8080
# or
export ASPNETCORE_URLS=http://0.0.0.0:8080

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;
}
# docker-compose.yml
volumes:
  - ./my-theme.css:/app/wwwroot/custom/theme.css

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:

# docker-compose.yml
environment:
  - Desk__smtp__host=smtp.example.com
  - Desk__smtp__port=587
  - Desk__smtp__username=user@example.com
  - Desk__smtp__password=secret
  - Desk__smtp__sender_email=noreply@example.com

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.