# Configuration reference

<div style="text-align: justify;">

All settings of an instance live in `config.json` in the data folder (see [Installation and updates](/books/veloxfactory/page/installation-and-updates)). The API token is not part of it, it is stored encrypted in `secrets.json`. Normally you edit everything in the window under **Settings**. The file can also be edited in a text editor, the running engine picks up the change by itself.

---

<h3 id="rules" style="color: #203671; margin-top: 2.2em;">How the configuration is handled</h3>

<table style="width: 100%; border-collapse: collapse;">
  <tbody>
    <tr style="border-top: 1px solid #e6e8ef; border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><strong>Hot reload</strong></td>
      <td style="padding: 6px 10px;">The engine watches the file and applies changes without restart. A new URL, token or WebSocket setting triggers a reconnect, running print jobs finish. Exception: of the <code>logging</code> settings only <code>minimumLevel</code> applies immediately; retention, file size, event log and JSON file take effect after a restart.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><strong>Validation</strong></td>
      <td style="padding: 6px 10px;">On load and before saving. The window shows errors per field. A headless start with an invalid file ends with exit code 1. An invalid change while the engine runs is not applied, the engine keeps the last valid configuration and writes event id 5000.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><strong>New keys</strong></td>
      <td style="padding: 6px 10px;">After an update the service adds keys of the new version with their defaults and writes the file (if it may). Unknown keys are reported in the log and removed on the next save.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><strong>Change log</strong></td>
      <td style="padding: 6px 10px;">Every save is recorded with Windows account, time and changed keys in <code>state.db</code>. The diagnostic package contains the last 500 changes.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><strong>Export and import</strong></td>
      <td style="padding: 6px 10px;"><strong>Settings → Import and export</strong>. The export never contains the token. The import keeps name and id of the receiving instance, check and save afterwards. Useful to roll out one configuration to several sites.</td>
    </tr>
    <tr>
      <td style="padding: 6px 10px; white-space: nowrap;"><strong>Write access</strong></td>
      <td style="padding: 6px 10px;">Saving needs write access to the data folder. Without it the window offers <strong>Restart as administrator</strong>.</td>
    </tr>
  </tbody>
</table>

---

<h3 id="example" style="color: #203671; margin-top: 2.2em;">Example</h3>

```json
{
  "schemaVersion": 1,
  "instance": { "id": "5d0c2f4e-...", "name": "Warehouse North", "serviceAccount": "SRV01\\svc-veloxprint" },
  "api": { "baseUrl": "https://vf.example.com", "timeoutSeconds": 30, "allowUnencrypted": false, "serverTimeZone": "Europe/Berlin" },
  "receive": {
    "mode": "Hybrid",
    "broadcastIds": ["Standard", "Warehouse"],
    "includeWithoutBroadcastId": false,
    "pollingIntervalSeconds": 30,
    "safetyPollIntervalSeconds": 120,
    "pageSize": 10
  },
  "websocket": { "scheme": "wss", "host": "vf.example.com", "port": 443, "appKey": "your-reverb-app-key", "channel": "private-report-print-tasks" },
  "processing": {
    "paused": false, "pauseReason": null, "pausedUntil": null,
    "maxParallelJobs": 4,
    "serializePerPrinter": true,
    "retryCount": 3,
    "retryBackoffSeconds": [5, 30, 120],
    "printTimeoutSeconds": 120,
    "confirmation": "Spooled",
    "dryRunFolder": null
  },
  "printerDefaults": { "scaling": "ActualSize", "autoRotate": true, "dpi": null, "copiesMode": "Driver", "paperSource": null, "duplex": "Default", "color": "Default" },
  "printers": [
    { "queueName": "WH-LABEL-01", "localName": "\\\\printsrv01\\WH-LABEL-01", "dpi": 300 },
    { "queueName": "PDF24", "copiesMode": "Loop" }
  ],
  "logging": { "minimumLevel": "Information", "retentionDays": 30, "maxFileSizeMb": 250, "eventLog": true, "jsonFile": false },
  "statistics": { "retentionDays": 365, "resetAt": null },
  "health": { "enabled": false, "port": 8765 },
  "ui": { "errorNotifications": true, "windowWidth": null, "windowHeight": null, "windowMaximized": false }
}
```

---

<h3 id="instance" style="color: #203671; margin-top: 2.2em;">instance</h3>

<table style="width: 100%; border-collapse: collapse;">
  <thead>
    <tr style="border-top: 1px solid #e6e8ef; border-bottom: 1px solid #e6e8ef;">
      <th style="text-align: left; padding: 6px 10px; white-space: nowrap;">Key</th>
      <th style="text-align: left; padding: 6px 10px; white-space: nowrap;">Default</th>
      <th style="text-align: left; padding: 6px 10px;">Description</th>
    </tr>
  </thead>
  <tbody>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>id</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">new GUID</td>
      <td style="padding: 6px 10px;">Identifies the instance (mutex, stop signal). Never copy it to another instance, an import keeps the local id.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>name</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">machine name</td>
      <td style="padding: 6px 10px;">Display name in the window, on the test page and in the diagnostic package</td>
    </tr>
    <tr>
      <td style="padding: 6px 10px; white-space: nowrap;"><code>serviceAccount</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">null</td>
      <td style="padding: 6px 10px;">Account of the scheduled task, written when the task is set up. Used for the file permissions.</td>
    </tr>
  </tbody>
</table>

<h3 id="api" style="color: #203671; margin-top: 2.2em;">api</h3>

<table style="width: 100%; border-collapse: collapse;">
  <thead>
    <tr style="border-top: 1px solid #e6e8ef; border-bottom: 1px solid #e6e8ef;">
      <th style="text-align: left; padding: 6px 10px; white-space: nowrap;">Key</th>
      <th style="text-align: left; padding: 6px 10px; white-space: nowrap;">Default</th>
      <th style="text-align: left; padding: 6px 10px;">Description</th>
    </tr>
  </thead>
  <tbody>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>baseUrl</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">empty, required</td>
      <td style="padding: 6px 10px;">Base URL of VeloxFactory without <code>/api/v1</code>, e.g. <code>https://vf.example.com</code>. All endpoints are derived from it.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>timeoutSeconds</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">30 (5 to 300)</td>
      <td style="padding: 6px 10px;">Timeout of a single API call</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>allowUnencrypted</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">false</td>
      <td style="padding: 6px 10px;">Allows <code>http://</code> and <code>ws://</code>. Without it both are rejected, because token and PDFs would travel unencrypted. The window shows a warning banner while it is on.</td>
    </tr>
    <tr>
      <td style="padding: 6px 10px; white-space: nowrap;"><code>serverTimeZone</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">Europe/Berlin</td>
      <td style="padding: 6px 10px;">Time zone of the VeloxFactory instance (<code>APP_TIMEZONE</code>). Audit timestamps of the API carry no offset, the lead time statistics need it.</td>
    </tr>
  </tbody>
</table>

The **API token** is entered in **Settings → Connection** and stored in `secrets.json`. Required rights: `global:use-api`, `report-print-task:read`, `report-print-task:update`, optional `printer:read`. The token never appears in logs, exports or diagnostic packages.

<h3 id="receive" style="color: #203671; margin-top: 2.2em;">receive</h3>

<table style="width: 100%; border-collapse: collapse;">
  <thead>
    <tr style="border-top: 1px solid #e6e8ef; border-bottom: 1px solid #e6e8ef;">
      <th style="text-align: left; padding: 6px 10px; white-space: nowrap;">Key</th>
      <th style="text-align: left; padding: 6px 10px; white-space: nowrap;">Default</th>
      <th style="text-align: left; padding: 6px 10px;">Description</th>
    </tr>
  </thead>
  <tbody>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>mode</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">Hybrid</td>
      <td style="padding: 6px 10px;"><code>Hybrid</code>, <code>WebSocket</code> or <code>Polling</code>, see <a href="/books/veloxfactory/page/receiving-and-processing-print-tasks">Receiving and processing print tasks</a></td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>broadcastIds</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">[]</td>
      <td style="padding: 6px 10px;">Broadcast ids this instance prints, exact match. At most 20, unique, no commas, no surrounding spaces, max. 255 characters. At least one is required unless <code>includeWithoutBroadcastId</code> is on.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>includeWithoutBroadcastId</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">false</td>
      <td style="padding: 6px 10px;">Also take tasks and printers without broadcast id. VeloxFactory sends no WebSocket event for such tasks, they arrive only by polling (in Hybrid after at most <code>safetyPollIntervalSeconds</code>). Turn it on in one instance at most.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>pollingIntervalSeconds</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">30 (min. 1)</td>
      <td style="padding: 6px 10px;">Poll interval in mode <code>Polling</code>, and in <code>Hybrid</code> while the WebSocket is down. Below 3 s the window warns: constant API calls, the rate limit is used up quickly.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>safetyPollIntervalSeconds</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">120 (min. 30)</td>
      <td style="padding: 6px 10px;">Safety poll in <code>Hybrid</code> while the WebSocket is subscribed</td>
    </tr>
    <tr>
      <td style="padding: 6px 10px; white-space: nowrap;"><code>pageSize</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">10 (1 to 100)</td>
      <td style="padding: 6px 10px;">Tasks per poll page. Every page carries the PDFs, a small value keeps responses small. Further pages follow immediately.</td>
    </tr>
  </tbody>
</table>

<h3 id="websocket" style="color: #203671; margin-top: 2.2em;">websocket</h3>

Ignored in mode `Polling`. The URL is built as `{scheme}://{host}:{port}/app/{appKey}?protocol=7&client=veloxprint&version={x}`.

<table style="width: 100%; border-collapse: collapse;">
  <thead>
    <tr style="border-top: 1px solid #e6e8ef; border-bottom: 1px solid #e6e8ef;">
      <th style="text-align: left; padding: 6px 10px; white-space: nowrap;">Key</th>
      <th style="text-align: left; padding: 6px 10px; white-space: nowrap;">Default</th>
      <th style="text-align: left; padding: 6px 10px;">Description</th>
    </tr>
  </thead>
  <tbody>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>scheme</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">wss</td>
      <td style="padding: 6px 10px;"><code>wss</code> or <code>ws</code> (<code>ws</code> only with <code>api.allowUnencrypted</code>)</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>host</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">empty, required</td>
      <td style="padding: 6px 10px;">Host of the Reverb server as reachable from the printer machine (<code>REVERB_HOST</code>)</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>port</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">443</td>
      <td style="padding: 6px 10px;">Port of the Reverb server (<code>REVERB_PORT</code>, behind a reverse proxy usually 443)</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>appKey</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">jasper-who</td>
      <td style="padding: 6px 10px;"><code>REVERB_APP_KEY</code> of your VeloxFactory instance</td>
    </tr>
    <tr>
      <td style="padding: 6px 10px; white-space: nowrap;"><code>channel</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">private-report-print-tasks</td>
      <td style="padding: 6px 10px;">Private channel of the print task events. Must start with <code>private-</code>. Keep the default.</td>
    </tr>
  </tbody>
</table>

<h3 id="processing" style="color: #203671; margin-top: 2.2em;">processing</h3>

<table style="width: 100%; border-collapse: collapse;">
  <thead>
    <tr style="border-top: 1px solid #e6e8ef; border-bottom: 1px solid #e6e8ef;">
      <th style="text-align: left; padding: 6px 10px; white-space: nowrap;">Key</th>
      <th style="text-align: left; padding: 6px 10px; white-space: nowrap;">Default</th>
      <th style="text-align: left; padding: 6px 10px;">Description</th>
    </tr>
  </thead>
  <tbody>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>paused</code>, <code>pauseReason</code>, <code>pausedUntil</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">false, null, null</td>
      <td style="padding: 6px 10px;">Maintenance pause. With <code>pausedUntil</code> (ISO 8601 with offset) the pause ends by itself. Survives a restart.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>maxParallelJobs</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">4 (1 to 32)</td>
      <td style="padding: 6px 10px;">Tasks processed at the same time</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>serializePerPrinter</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">true</td>
      <td style="padding: 6px 10px;">One job per printer at a time, in the order of the task ids</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>retryCount</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">3 (0 to 10)</td>
      <td style="padding: 6px 10px;">Local retries on transient errors (printer offline, paper out, spooler refused the job)</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>retryBackoffSeconds</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">[5, 30, 120]</td>
      <td style="padding: 6px 10px;">Wait before retry 1, 2, 3 and so on (1 to 3600 each). With more retries than values the last value repeats.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>printTimeoutSeconds</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">120 (10 to 3600)</td>
      <td style="padding: 6px 10px;">Limit for a print call and for the spooler wait of <code>Completed</code>. A driver that waits for a dialog ends here.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>confirmation</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">Spooled</td>
      <td style="padding: 6px 10px;"><code>Spooled</code>: confirm after handing the job to the Windows spooler. <code>Completed</code>: wait until the spooler job has finished. Can be overridden per printer.</td>
    </tr>
    <tr>
      <td style="padding: 6px 10px; white-space: nowrap;"><code>dryRunFolder</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">null</td>
      <td style="padding: 6px 10px;">Absolute local or UNC path. When set, PDFs are written there instead of printed and not confirmed. Empty = print normally.</td>
    </tr>
  </tbody>
</table>

<h3 id="printers" style="color: #203671; margin-top: 2.2em;">printerDefaults and printers</h3>

`printerDefaults` applies to every printer. An entry in `printers` overrides single values for one queue name; a value missing there (or `null`) falls back to the default. Details and advice in [Printers and printing](/books/veloxfactory/page/printers-and-printing).

<table style="width: 100%; border-collapse: collapse;">
  <thead>
    <tr style="border-top: 1px solid #e6e8ef; border-bottom: 1px solid #e6e8ef;">
      <th style="text-align: left; padding: 6px 10px; white-space: nowrap;">Key</th>
      <th style="text-align: left; padding: 6px 10px; white-space: nowrap;">Default</th>
      <th style="text-align: left; padding: 6px 10px;">Description</th>
    </tr>
  </thead>
  <tbody>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>queueName</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">only in <code>printers</code>, required</td>
      <td style="padding: 6px 10px;">Printer name as the print task carries it (<code>printerName</code> of the VeloxFactory printer). Unique, case-insensitive.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>localName</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">only in <code>printers</code></td>
      <td style="padding: 6px 10px;">Alias: Windows printer that receives the jobs of this queue name. Empty = same name.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>scaling</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">ActualSize</td>
      <td style="padding: 6px 10px;"><code>ActualSize</code> (1:1 from the paper corner) or <code>FitToPage</code> (scaled into the printable area, centred)</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>autoRotate</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">true</td>
      <td style="padding: 6px 10px;">Rotates a page when its orientation differs from the paper</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>dpi</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">null (72 to 1200)</td>
      <td style="padding: 6px 10px;">Output resolution of the driver. Takes effect only if the driver offers exactly this resolution, otherwise the driver default stays. Empty = driver default.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>copiesMode</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">Driver</td>
      <td style="padding: 6px 10px;"><code>Driver</code>: one spooler job with n copies. <code>Loop</code>: one job per copy, for drivers that ignore the copy count (e.g. PDF24, Microsoft Print to PDF).</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>paperSource</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">null</td>
      <td style="padding: 6px 10px;">Tray by name as the driver lists it. Unknown names keep the default tray.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>duplex</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">Default</td>
      <td style="padding: 6px 10px;"><code>Default</code>, <code>Simplex</code>, <code>Vertical</code>, <code>Horizontal</code></td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>color</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">Default</td>
      <td style="padding: 6px 10px;"><code>Default</code>, <code>Color</code>, <code>Monochrome</code> (only on printers that support colour)</td>
    </tr>
    <tr>
      <td style="padding: 6px 10px; white-space: nowrap;"><code>confirmation</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">only in <code>printers</code></td>
      <td style="padding: 6px 10px;">Overrides <code>processing.confirmation</code> for this printer</td>
    </tr>
  </tbody>
</table>

<h3 id="logging" style="color: #203671; margin-top: 2.2em;">logging, statistics, health, ui</h3>

<table style="width: 100%; border-collapse: collapse;">
  <thead>
    <tr style="border-top: 1px solid #e6e8ef; border-bottom: 1px solid #e6e8ef;">
      <th style="text-align: left; padding: 6px 10px; white-space: nowrap;">Key</th>
      <th style="text-align: left; padding: 6px 10px; white-space: nowrap;">Default</th>
      <th style="text-align: left; padding: 6px 10px;">Description</th>
    </tr>
  </thead>
  <tbody>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>logging.minimumLevel</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">Information</td>
      <td style="padding: 6px 10px;"><code>Verbose</code>, <code>Debug</code>, <code>Information</code>, <code>Warning</code>, <code>Error</code>, <code>Fatal</code>. <code>Debug</code> shows WebSocket protocol details (ping, pong, auth). Applies immediately.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>logging.retentionDays</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">30 (1 to 3650)</td>
      <td style="padding: 6px 10px;">Log files older than this are deleted. Takes effect after a restart.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>logging.maxFileSizeMb</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">250 (1 to 10240)</td>
      <td style="padding: 6px 10px;">Size limit per log file; a day beyond it continues in <code>_001</code>, <code>_002</code>. Takes effect after a restart.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>logging.eventLog</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">true</td>
      <td style="padding: 6px 10px;">Warnings and errors to the Windows event log (needs the event source, created with the scheduled task). Takes effect after a restart.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>logging.jsonFile</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">false</td>
      <td style="padding: 6px 10px;">Additional log in compact JSON (<code>veloxprint-*.json</code>) for log collectors. Takes effect after a restart.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>statistics.retentionDays</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">365 (30 to 3650)</td>
      <td style="padding: 6px 10px;">How long statistics are kept</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>statistics.resetAt</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">null</td>
      <td style="padding: 6px 10px;">Set by <strong>Reset statistics</strong>. Jobs before this time no longer count.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>health.enabled</code>, <code>health.port</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">false, 8765 (1024 to 65535)</td>
      <td style="padding: 6px 10px;">Local health endpoint <code>http://localhost:{port}/health</code>, see <a href="/books/veloxfactory/page/monitoring-and-troubleshooting">Monitoring and troubleshooting</a></td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><code>ui.errorNotifications</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">true</td>
      <td style="padding: 6px 10px;">Windows notification of the tray icon on print errors</td>
    </tr>
    <tr>
      <td style="padding: 6px 10px; white-space: nowrap;"><code>ui.windowWidth</code>, <code>windowHeight</code>, <code>windowMaximized</code></td>
      <td style="padding: 6px 10px; white-space: nowrap;">null, null, false</td>
      <td style="padding: 6px 10px;">Last window size, written by the window itself</td>
    </tr>
  </tbody>
</table>

</div>