The ArcGIS Velocity Simulator uses two separate configuration systems:
- App Config (
config.json) — Persisted UI preferences: theme, font, window geometry, opacity, dialog sizes, and feature toggles. Saved automatically and restored on every launch. - Launch Config (
launch-config*.json) — Runtime behavior parameters: connection protocol, address, streaming rate, and output settings. Passed viaconfig=<path>on the CLI for headless runs, or applied interactively through the Apply Launch Config From… menu action.
App Config controls how the application looks. Launch Config controls what the application does.
| Aspect | App Config | Launch Config |
|---|---|---|
| File | config.json (platform data dir) |
launch-config*.json (any path) |
| Loaded | Automatically on every startup | Explicitly via CLI config=<path> or menu action |
| Saved | Automatically on every UI change | Manually via Save Launch Config To… menu action |
| Scope | Persistent across sessions | Single run or on-demand application |
| Contents | Theme, font, window size/position, opacity, dialog sizes, feature toggles | Protocol, mode, IP, port, streaming rate, loop, output settings |
| Menu actions | Show / Apply / Save App Config | Show / Apply / Save Launch Config |
See HEADLESS.md for headless launch-config examples and COMMAND-LINE.md for the full CLI reference.
- macOS:
~/Library/Application Support/arcgis-velocity-simulator/config.json - Windows:
%APPDATA%\arcgis-velocity-simulator\config.json - Linux:
~/.config/arcgis-velocity-simulator/config.json
{
"windowState": {
"fullView": { "width": 1365, "height": 395, "x": 195, "y": 168, "splitterPosition": "285px" },
"compactView": { "width": 249, "height": 285, "x": 380, "y": 205, "splitterPosition": "198.5px" },
"currentView": "full"
},
"theme": "dark",
"opacity": 1.0,
"font": { "size": "16px", "family": "monospace" },
"statusAreaVisible": true,
"menuBarVisible": false,
"cameraSupport": false,
"microphoneSupport": false,
"dialogSizes": {
"appConfig": { "width": 660, "height": 400, "x": null, "y": null },
"launchConfig": { "width": 500, "height": 400, "x": null, "y": null },
"velocityLogin": { "width": 590, "height": 840, "x": null, "y": null }
}
}- fullView/compactView: Window dimensions, position, and splitter position for each view mode
- currentView: Current view mode (
"full"or"compact")
When the application is started with no command-line parameters, it launches in normal UI mode and restores saved UI behavior from configuration, including windowState.currentView.
- theme: Selected theme name (see available themes below)
- opacity: Window transparency (0.5 to 1.0, default: 1.0)
- font: Status log font settings (size: 6px-25px, family)
- statusAreaVisible: Show/hide status area
- menuBarVisible: Show/hide menu bar (Windows/Linux)
- cameraSupport: Enable/disable camera-related features (default: false)
- Controls visibility of camera buttons - Toggle Camera, Report Camera Gestures, Log Camera Gestures
- When disabled, automatically turns off camera if active
- In compact mode, camera buttons are hidden regardless of support state
- microphoneSupport: Enable/disable microphone-related features (default: false)
- Controls visibility of microphone buttons - Toggle Microphone, Toggle Offline Speech Recognition (Web Audio API), Log Microphone Commands
- When disabled, automatically turns off both Web Speech API and Offline Speech Recognition if active
- In compact mode, microphone buttons are hidden regardless of support state
- Network errors are logged only once per session to reduce spam
- dialogSizes.appConfig: Remembered width, height, and position (x, y) of the App Config dialog
- dialogSizes.launchConfig: Remembered width, height, and position (x, y) of the Launch Config dialog
- dialogSizes.velocityLogin: Remembered width, height, and position (x, y) of the Velocity Login & Feed Picker dialog (default: 590 x 840)
Size and position are saved automatically when the user resizes or moves either dialog, and restored on next open. When x and y are null (the default), the dialog is centered by the OS.
The application supports 17 different font families for the status log:
| Font | Description | Category |
|---|---|---|
| Default (Monospace) | System monospace font | Monospace |
| Arial | Clean, readable sans-serif | Sans-serif |
| Brush Script MT | Decorative script font | Script |
| Comic Sans MS | Casual, friendly font | Sans-serif |
| Courier New | Classic monospace font | Monospace |
| cursive | Generic cursive font | Cursive |
| Garamond | Classic serif font | Serif |
| Georgia | Elegant serif font | Serif |
| Helvetica | Modern sans-serif | Sans-serif |
| Lucida Console | Console-style monospace | Monospace |
| Monospace | Generic monospace font | Monospace |
| Palatino | Traditional serif font | Serif |
| Segoe UI | Modern UI font | Sans-serif |
| Tahoma | Compact sans-serif | Sans-serif |
| Times New Roman | Classic serif font | Serif |
| Trebuchet MS | Modern sans-serif | Sans-serif |
| Verdana | Readable sans-serif | Sans-serif |
- Sans-serif: Clean, modern fonts (Arial, Helvetica, Segoe UI, etc.)
- Serif: Traditional fonts with decorative strokes (Times New Roman, Georgia, etc.)
- Monospace: Fixed-width fonts for code and data (Courier New, Lucida Console, etc.)
- Script/Cursive: Decorative fonts (Brush Script MT, cursive)
| Theme | ID | Description |
|---|---|---|
| 🔵 Blue | "blue" |
Professional blue theme |
| 🟡 Color Blind | "color-blind" |
High contrast accessibility theme |
| 🌙 Dark | "dark" |
Classic dark theme (default) |
| 🌫️ Dark Gray | "dark-gray" |
Softer dark theme |
| 🟢 Green | "green" |
Nature-inspired green theme |
| ⚫ High Contrast | "high-contrast" |
Maximum contrast for accessibility |
| ☀️ Light | "light" |
Clean, bright light theme |
| ☁️ Light Gray | "light-gray" |
Subtle light theme |
| 🌌 Midnight | "midnight" |
Deep, rich dark theme |
| ☕ Mocha | "mocha" |
Warm brown coffee-inspired theme |
| 🌊 Ocean | "ocean" |
Cool blue-green aquatic theme |
| 🌸 Rose | "rose" |
Elegant pink and rose theme |
| 🌺 Rose Dark | "rose-dark" |
Dark variant of rose theme |
| 🌅 Sunset | "sunset" |
Warm orange and yellow theme |
| 💻 System | "system" |
Matches OS light/dark mode |
Configuration is automatically saved when:
- Window is resized or moved
- View mode is toggled (full ↔ compact)
- Splitter is moved
- Theme is changed
- Status area visibility is toggled
- Window opacity is changed
- Font size or family is changed
- Camera support is toggled
- Microphone support is toggled
- App Config or Launch Config dialog is resized or moved
- Application exits
To manually edit the configuration:
- Close the application
- Edit the JSON file with any text editor
- Ensure valid JSON format
- Restart the application
The application provides methods for configuration backup and restore:
exportConfig(filePath, config)- Export current configurationimportConfig(filePath)- Import and apply configurationreadConfigFile(filePath)- Read configuration without importingwriteConfigFile(filePath, config)- Write configuration datagetConfigPath()- Get current configuration file path
// Export current configuration
const result = await window.api.exportConfig('/path/to/backup.json');
// Import configuration
const result = await window.api.importConfig('/path/to/backup.json');
// Get current config path
const configPath = await window.api.getConfigPath();Headless mode also accepts an optional config=/path/to/launch-config.json command-line parameter. This file is separate from the UI settings file and is intended for automation or scheduled runs.
CLI values always override values loaded from the headless launch-config file.
A ready-to-copy template is available at docs/launch-config.sample.json.
Mode-specific examples are also available at docs/launch-config.server.sample.json and docs/launch-config.client.sample.json.
For the full consolidated parameter table, help-layout options, and mirrored headless examples, see COMMAND-LINE.md and HEADLESS.md.
autoConnectautoStartconfigconnectRetryIntervalMsconnectTimeoutMsconnectWaitForServerdoneFileendLineexitOnCompleteexplainfilenamegrpcHeaderPathgrpcHeaderPathKeygrpcSerializationintervalMsiplinesPerIntervallogFilelogLevelloopmaxLinesmodeonErrorportprotocolrunIdrunModestartLinestdoutwaitForClient
The default headless ip value is 127.0.0.1.
127.0.0.1is the loopback/local-only address. It is the default because it is the safest option for local testing.0.0.0.0is typically used in server mode when the simulator should bind to all local interfaces and accept connections from other machines.
In other words:
- use
127.0.0.1for same-machine testing - use
0.0.0.0for server-mode listening beyond localhost
The launch-config file can use either top-level keys or grouped sections such as connection, headless, output, and streaming.
{
"connection": {
"connectRetryIntervalMs": 1000,
"connectTimeoutMs": 30000,
"connectWaitForServer": false,
"ip": "0.0.0.0",
"mode": "server",
"port": 5565,
"protocol": "tcp",
"waitForClient": false
},
"headless": {
"filename": "./data.csv",
"runMode": "headless"
},
"output": {
"doneFile": "./run.done.json",
"logLevel": "info",
"stdout": true
},
"streaming": {
"endLine": 100,
"intervalMs": 1000,
"linesPerInterval": 1,
"startLine": 1,
"waitForClient": true
}
}See HEADLESS.md for full command examples.
You can reset all configuration settings to their default values using the application's main menu (Configuration → Reset Configuration) or the context menu (Reset Config). When you reset the configuration:
- All settings are restored to their default values (window size, position, theme, font, etc.)
- The current view mode (full or compact) is preserved. This means if you are in compact view, you will remain in compact view after the reset, and vice versa.
- Close the application
- Delete the configuration file
- Restart the application (creates new config with defaults)
# macOS
cp ~/Library/Application\ Support/arcgis-velocity-simulator/config.json ~/Desktop/backup.json
# Windows
copy "%APPDATA%\arcgis-velocity-simulator\config.json" "%USERPROFILE%\Desktop\backup.json"
# Linux
cp ~/.config/arcgis-velocity-simulator/config.json ~/Desktop/backup.json- Settings not loading: Check file exists, valid JSON format, file permissions
- Invalid JSON: Use JSON validator to check syntax
- Permission errors: Ensure app has read/write access to config directory
- ConfigManager class:
src/config.js- Handles all file operations and validation - IPC communication: Secure context bridge for main/renderer communication
- Automatic saving: Debounced saves prevent excessive file writes
- Theme system: 15 themes with CSS variables in
src/themes.css - Testing: Comprehensive unit tests in
test/config.test.js