Bichon Docs

The commercial server (bichon-pro-server) is a separate binary from the open-source Community build and shares its core. It runs a 30-day Pro trial when no license is present, then continues with the Community feature set; a valid license selects Pro or Enterprise. This page covers the trial, how to obtain and install a license, and what each non-valid state means.

The Community edition never checks a license.

The trial

  • 30 days, starting automatically the first time the Pro binary starts without a license.
  • Runs the Pro feature set with a 2-account limit. The Enterprise compliance suite is not included in a trial.
  • The account limit counts every account type — IMAP, NoSync, and View — not only IMAP sync accounts.
  • The trial clock is persisted in license-state.json in the data root. Deleting only license.txt does not start a new trial; the ledger remembers that a trial started and whether a license was ever installed. Deleting the ledger (or the entire data root) does reset the trial, but it also destroys the archive.
  • A wall clock moved backwards cannot add trial days: the stored start and last-seen timestamps are monotonic.

When the trial ends, the server keeps running with the Community feature set. The archive stays readable and IMAP sync continues, but Pro-only surfaces (audit log, integrity checks, PDF/Word search, analytics, built-in IMAP server, journaling, View accounts, branding, MCP) stop. Account creation is disabled until a valid license is installed.

Obtaining and installing a license

Licenses are Ed25519-signed certificates bound to the deployment's machine ID, which is derived from the instance-id file in the data root.

  1. Copy the machine ID from Settings → License in the WebUI, or call GET /api/v1/license/machine-id.
  2. Send it to rustmailer.com with the edition and account count you need.
  3. Upload the issued license in Settings → License, or POST /api/v1/license/upload with {"license": "<the signed license text>"}. Uploading requires system:root.

An uploaded license is validated and applied immediately, without a restart. The same text is written to license.txt in the data root, so it survives a restart and can be replaced offline during disaster recovery.

Files in the data root

FilePurpose
license.txtThe canonical license. Startup preflight reads it before touching any data. Replace it offline to recover; the change takes effect on restart.
instance-idThe identifier the license is bound to. Created on first start.
license-state.jsonTrial start, last evaluation, and the irreversible "a license was installed here" flag. Do not edit or delete it.

The Pro backup engine includes all three, so restoring a backup onto a replacement machine preserves the instance identity and the restored deployment remains licensed. Restoring only the mail data without instance-id produces a machine mismatch.

Status states

GET /api/v1/license/status returns one of these values. It requires authentication; license upload additionally requires system:root.

StatusMeaningEffect
validA valid license is loadedPro or Enterprise feature set, subject to edt
trialWithin the 30-day trialPro feature set, 2-account limit
trial_expiredTrial elapsed with no licenseCommunity feature set; account creation disabled
update_expiredBuild date is newer than the license's update coverage (upd)Startup refuses: 503 maintenance page until a renewed license is installed or the previous release is restored
machine_mismatchLicense was issued for another machine IDStartup refuses: 503 maintenance page
invalid_signatureSignature verification failedStartup refuses: 503 maintenance page
invalid_issuerLicense was issued for a different productStartup refuses: 503 maintenance page
revokedThe license ID (jti) is on the revocation listStartup refuses: 503 maintenance page
license_removedThis deployment had a license, but license.txt is goneStartup refuses: 503 maintenance page. Removing the file never reopens the trial.
machine_id_unavailableinstance-id cannot be read or createdStartup refuses: 503 maintenance page

A deployment with no license file that has never had one simply runs as a trial; a deployment that has had a license and lost it does not.

Account limits

StateLimit
Trial2 accounts (all types)
Pro5 accounts by default
Enterprise100 accounts by default
AnyA lower alc claim in the license overrides the edition default

Two enforcement rules matter in practice:

  • Creation is refused once the count reaches the limit. The error names the limit and reminds you that local and View accounts count.
  • Restoring a larger data set than the license allows suspends syncing rather than deleting anything. Reads remain available; syncing resumes once accounts are removed or a larger license is installed.

Updates and renewals

  • A license is perpetual for the release you purchase. The first 12 months include new releases.
  • From year two, an annual update subscription is required to run builds released after the upd date. The release you already have keeps working; a newer build that exceeds your coverage stops at the maintenance page.
  • Growing the license later is an upgrade: you pay the difference, and the 12-month update window restarts from the upgrade date.

Note: During early access, update and renewal terms are confirmed with each customer before purchase. See Editions for the feature matrix.

API

MethodPathDescription
GET/api/v1/license/statusCurrent status, masked licensee, edition, account limit and usage, machine ID
GET/api/v1/license/machine-idThis deployment's machine ID
POST/api/v1/license/uploadInstall a license (system:root)
GET/api/v1/featuresThe active edition and feature flags at runtime

On this page