Config saved — restart the bot for all changes to take effect.

Editing: /data/config/config.ini

Radio Connection — How the bot connects to your MeshCore radio
connection_type
Connection type: serial, ble, or tcp serial: Connect via USB serial port ble: Connect via Bluetooth Low Energy tcp: Connect via TCP/IP
serial_port
Serial port (for serial connection) Common ports: /dev/ttyUSB0, /dev/tty.usbserial-*, COM3 (Windows)
timeout
Connection timeout in seconds
Bot Behavior — Name, location, rate limits, and startup options
bot_name
Bot name for identification and logging
auto_update_device_name
Automatically update device name to match bot_name on startup true: Device name will be updated to match bot_name if they differ (default) false: Device name will not be updated, keep device name separate from config
rf_data_timeout
RF Data Correlation Settings Time window for correlating RF data with messages (seconds)
message_correlation_timeout
Time to wait for RF data correlation (seconds)
enable_enhanced_correlation
Enable enhanced correlation strategies
node_id
Bot node ID (leave empty for auto-assignment)
enabled
Enable/disable bot responses true: Bot will respond to keywords and commands false: Bot will only listen and log messages
passive_mode
Passive mode (only listen, don't respond) true: Bot will not send any messages false: Bot will respond normally
rate_limit_seconds
Rate limiting in seconds between messages Prevents spam by limiting how often the bot can send messages
bot_tx_rate_limit_seconds
Bot transmission rate limit in seconds between bot messages Prevents bot from overwhelming the mesh network
per_user_rate_limit_seconds
Per-user rate limit: minimum seconds between bot replies to the same user User is identified by public key when available (DMs and channel when provided), else sender name Channel senders are often matched by name only. Set to 0 or disable to effectively turn off per-user limiting
per_user_rate_limit_enabled
Enable or disable per-user rate limiting (true/false)
tx_delay_ms
Transmission delay in milliseconds before sending messages Helps prevent message collisions on the mesh network Recommended: 100-500ms for busy networks, 0 for quiet networks
dm_max_retries
DM retry settings for improved reliability (meshcore-2.1.6+) Maximum number of retry attempts for failed DM sends
dm_max_flood_attempts
Maximum flood attempts (when path reset is needed)
dm_flood_after
Number of attempts before switching to flood mode
timezone
Timezone for bot operations Use standard timezone names (e.g., America/New_York, Europe/London, UTC) Leave empty to use system timezone
bot_latitude
Bot location for geographic proximity calculations and astronomical data Default latitude for bot location (decimal degrees) Example: 40.7128 for New York City, 48.50 for Victoria BC
bot_longitude
Default longitude for bot location (decimal degrees) Example: -74.0060 for New York City, -123.00 for Victoria BC
max_channels
Maximum number of channels to fetch from MeshCore node MeshCore supports up to 40 channels (default: 40) Set to a lower value if you want to limit channel fetching for performance
advert_interval_hours
Interval-based advertising settings Send periodic flood adverts at specified intervals 0: Disabled (default) >0: Send flood advert every N hours
startup_advert
Send startup advert when bot finishes initializing false: No startup advert (default) zero-hop: Send local broadcast advert flood: Send network-wide flood advert
auto_manage_contacts
Auto-manage contact list when new contacts are discovered device: Device handles auto-addition using standard auto-discovery mode, bot manages contact list capacity (purge old contacts when near limits) bot: Bot automatically adds new companion contacts to device, bot manages contact list capacity (purge old contacts when near limits) false: Manual mode - no automatic actions, use !repeater commands to manage contacts (default)
db_path
Database path for main bot database Default: meshcore_bot.db
service_restart_backoff_seconds
Seconds to wait after a failed service restart before retrying (default: 300)
Channels — Which channels to monitor and whether to respond to DMs
monitor_channels
Channels to monitor (comma-separated) Bot will only respond to messages on these channels Use exact channel names as configured on your MeshCore node
respond_to_dms
Enable DM responses true: Bot will respond to direct messages false: Bot will ignore direct messages
prefix_bytes
Set a custom prefix length for the public keys to identify repeaters 1 = 2 hex chars (e.g. 7E), 2 = 4 hex chars (e.g. 7E42). Also used as the mesh graph key length; if the mesh often uses 2-byte paths, set to 2 to avoid conflating distinct links (see Path Command / path-command-config.md).
Banned Users — Usernames the bot will completely ignore
banned_users
List of banned sender names (comma-separated). Matching is prefix (starts-with): "Awful Username" also matches "Awful Username 🍆". No bot responses in channels or DMs.
Localization — Language for bot responses
language
Language code for bot responses (en, es, es-MX, es-ES, fr, de, ja, etc.) Default: en (English) The bot will use translations from translations/{language}.json Supports locale codes: - Simple codes: en, es, fr, de, ja - Locale codes: es-MX (Mexican Spanish), es-ES (Spain Spanish), fr-CA (Canadian French) If locale-specific file not found, falls back to base language (e.g., es.json) If translation file is missing or key not found, falls back to English
translation_path
Path to translation files directory (relative to bot root) Default: translations/
Admin Access Control — Public keys that can run admin commands
admin_pubkeys
Admin Access Control List (ACL) for restricted commands Only users with public keys listed here can execute admin commands SECURITY IMPORTANT: - Public keys MUST be exactly 64 hexadecimal characters (ed25519 format) - Invalid formats will be rejected with error logs - Empty or whitespace-only values disable admin access - Keys are case-insensitive (normalized to lowercase) Format: comma-separated list of 64-character hex public keys (without spaces) Example: f5d2b56d19b24412756933e917d4632e088cdd5daeadc9002feca73bf5d2b56d,1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef IMPORTANT: Leave blank to disable all admin commands. Set your actual admin pubkey(s) here.
admin_commands
Commands that require admin access (comma-separated) These commands will only work for users in the admin_pubkeys list reload: Reload configuration without restarting (radio settings cannot be changed)

No settings in this section.

companion_purge_enabled
Enable companion contact purging true: Purge inactive companions when contact list is full false: Never purge companions (default: false for safety)
companion_dm_threshold_days
Days since last DM to consider companion inactive Companions who haven't DM'd the bot in this many days may be purged
companion_advert_threshold_days
Days since last advert to consider companion inactive Companions who haven't adverted in this many days may be purged
companion_min_inactive_days
Minimum days since last activity (DM or advert) before purge Companions must be inactive for at least this many days
Keywords
test
Available placeholders (message-based): {sender} - Name/ID of message sender {connection_info} - Path info, SNR, and RSSI combined (e.g., "01,5f (2 hops) | SNR: 15 dB | RSSI: -120 dBm") {snr} - Signal-to-noise ratio in dB {rssi} - Received signal strength indicator in dBm {timestamp} - Message timestamp in HH:MM:SS format {path} - Message routing path (e.g., "01,5f (2 hops)") {hops} - Total hop count only (e.g., "2" or "0"); same value as in path/connection_info, for use without the path string {hops_label} - Same as hops with word "hop"/"hops" and pluralization (e.g., "1 hop", "2 hops", or "?" when unknown) {path_distance} - Total distance between all hops in path with locations (e.g., "123.4km (3 segs, 1 no-loc)") {firstlast_distance} - Distance between first and last repeater in path (e.g., "45.6km" or empty if locations missing) {elapsed} - Elapsed time (e.g. 1234ms) or "Sync Device Clock" when device clock is invalid (use {elapsed} only; do not append ms) To add newlines in responses, use \n (single backslash + n): Example: test = "Line 1\nLine 2\nLine 3" This will output: Line 1 Line 2 Line 3 To use a literal backslash + n, use \\n (double backslash + n) Other escape sequences: \t (tab), \r (carriage return), \\ (literal backslash) Available placeholders (mesh network info - same as Scheduled_Messages): Total counts (ever heard): {total_contacts} - Total number of contacts ever heard {total_repeaters} - Total number of repeater devices ever heard {total_companions} - Total number of companion devices ever heard {total_roomservers} - Total number of roomserver devices ever heard {total_sensors} - Total number of sensor devices ever heard Recent activity: {recent_activity_24h} - Number of unique users active in last 24 hours Active in last 30 days (last_heard): {total_contacts_30d} - Total contacts active (last_heard) in last 30 days {total_repeaters_30d} - Total repeaters active (last_heard) in last 30 days {total_companions_30d} - Total companions active (last_heard) in last 30 days {total_roomservers_30d} - Total roomservers active (last_heard) in last 30 days {total_sensors_30d} - Total sensors active (last_heard) in last 30 days New devices (first heard in last 7 days): {new_companions_7d} - New companion devices first heard in last 7 days {new_repeaters_7d} - New repeater devices first heard in last 7 days {new_roomservers_7d} - New roomserver devices first heard in last 7 days {new_sensors_7d} - New sensor devices first heard in last 7 days Legacy placeholders (for backward compatibility): {repeaters} - Same as {total_repeaters} {companions} - Same as {total_companions}
ping
pong
RandomLine
prefix.default
default prefix (blank = no prefix)
triggers.momjoke
Mom Jokes (only in #jokes)
file.momjoke
prefix.momjoke
triggers.funfact
Fun Facts
file.funfact
prefix.funfact
Scheduled_Messages

No settings in this section.

Logging
log_level
Log level: DEBUG, INFO, WARNING, ERROR, CRITICAL DEBUG: Most verbose, shows all details INFO: Standard logging level WARNING: Only warnings and errors ERROR: Only errors CRITICAL: Only critical errors
log_file
Log file path (leave empty for console only) Bot will write logs to this file in addition to console Logs rotate at 5 MB with up to 3 backup files (e.g. meshcore_bot.log.1, .2, .3)
colored_output
Enable colored console output true: Use colors in console output false: Plain text output
meshcore_log_level
MeshCore library log level (separate from bot log level) Controls debug output from the meshcore library itself Options: DEBUG, INFO, WARNING, ERROR, CRITICAL
Custom_Syntax

No settings in this section.

External_Data
weather_api_key
Weather API key (future feature)
weather_update_interval
Weather update interval in seconds (future feature)
tide_api_key
Tide API key (future feature)
tide_update_interval
Tide update interval in seconds (future feature)
n2yo_api_key
N2YO API key for satellite pass information Get free key at: https://www.n2yo.com/login/
airnow_api_key
AirNow API key for AQI data Get free key at: https://docs.airnowapi.org/
forecast_solar_api_key
Forecast.Solar API key for solar forecast data Get key at: https://forecast.solar/ (free tier works without key, paid tier for 3+ day forecasts) Free tier: 2-day forecast, 1-hour resolution Paid tier (14 EUR/year): 3-6 day forecast, 15-30 minute resolution
repeater_prefix_api_url
Repeater prefix API URL for prefix command Leave empty to disable prefix command functionality Configure your own regional API endpoint
repeater_prefix_cache_hours
Repeater prefix cache duration in hours How long to cache prefix data before refreshing from API Recommended: 1-6 hours (data doesn't change frequently)
Prefix_Command
show_repeater_locations
Enable or disable repeater geolocation in prefix command true: Show city names with repeaters when location data is available false: Show only repeater names without location information
use_reverse_geocoding
Use reverse geocoding for coordinates without city names true: Automatically look up city names from GPS coordinates false: Only show coordinates if no city name is available
hide_source
Hide prefix source information true: Hide "Source: domain.com" line from prefix command output false: Show source information (default)
prefix_heard_days
Prefix heard time window (days) Number of days to look back when showing prefix results (default command behavior) Only repeaters heard within this window will be shown by default Use "prefix XX all" to show all repeaters regardless of time
prefix_free_days
Prefix free time window (days) Number of days to look back when determining which prefixes are "free" Only repeaters heard within this window will be considered as using a prefix Repeaters not heard in this window will be excluded from used prefixes list
max_prefix_range
Maximum range for prefix filtering (kilometers) Repeaters beyond this distance from bot location will be excluded from prefix lookups This prevents prefix collisions from far-away repeaters from affecting local prefix availability Set to 0 to disable range limiting
prefix_best_enabled
Prefix best location feature Enable "prefix best <location>" to suggest best prefix (true/false)
prefix_best_min_edge_observations
Minimum edge observations for neighbor detection Edges in the mesh graph must have at least this many observations to be considered Higher values = more conservative (requires more evidence of neighbor relationship) Default: 2
prefix_best_max_edge_age_days
Maximum edge age for neighbor detection (days) Edges not observed within this many days are ignored when finding neighbors Helps filter out stale connections from repeaters that may have moved or gone offline Default: 30
prefix_best_location_radius_km
Location search radius (kilometers) When finding repeaters at a location, search within this radius Larger radius = more repeaters considered, but may include distant repeaters Default: 50
prefix_best_do_not_suggest
Prefixes to never suggest (comma-separated) List of prefixes that should never be suggested by the "prefix best" command Useful for excluding major infrastructure repeaters or reserved prefixes Example: prefix_best_do_not_suggest = 00,FF,01,02 Leave empty to allow all prefixes
Weather
weather_provider
Weather provider selection Options: noaa, openmeteo noaa: Use NOAA API (US-focused, better for US locations, includes weather alerts) openmeteo: Use Open-Meteo API (global coverage, works worldwide) Default: noaa
default_state
Default state for city name disambiguation When users type "wx seattle", it will search for "seattle, WA, USA" Use 2-letter state abbreviation (e.g., WA, CA, NY, TX)
default_country
Default country for city name disambiguation (for international weather plugin) Use 2-letter country code (e.g., US, CA, GB, AU)
temperature_unit
Temperature unit for weather display Options: fahrenheit, celsius Default: fahrenheit
wind_speed_unit
Wind speed unit for weather display Options: mph, kmh, ms (meters per second) Default: mph
precipitation_unit
Precipitation unit for weather display Options: inch, mm Default: inch
Solar_Config
url_timeout
URL timeout for external API calls (seconds)
use_zulu_time
Use Zulu/UTC time for astronomical data true: Use 24-hour UTC format false: Use 12-hour local format
Aurora_Command
enabled
Enable or disable the aurora command
Channels_List
weather
General channels (no category prefix)
emergency
sports.sounders
Sports-focused channels
sports.kraken
sports.mariners
sports.seahawks
sports.reign
sports.storm
sports.huskies
local.capitolhill
Local area channels
local.ballard
local.fremont
local.queenanne
tech.mesh
Technology channels
tech.hamradio
tech.programming
tech.iot
emergency.emergency
Emergency-focused channels
emergency.weather
emergency.traffic
emergency.hamradio
Sports_Command
enabled
Enable or disable the sports command (true/false)
teams
Default teams to show when 'sports' command is used without arguments Comma-separated list of team names (use lowercase)
channel_override
Channel overrides for sports command Format: channel_name = default_team Allows sports command to work in specific channels with default team shortcuts Example: #sounders = sounders (sports in #sounders becomes "sports sounders")
api_timeout
ESPN API timeout in seconds
Stats_Command
enabled
Enable or disable the stats command (true/false)
data_retention_days
Data retention settings Number of days to keep stats data (older data will be automatically cleaned up) Recommended: 7-30 days to balance storage usage with historical data
auto_cleanup
Enable automatic cleanup of old stats data true: Automatically clean up old data based on data_retention_days false: Manual cleanup only
track_all_messages
Stats collection settings Track all incoming messages (not just commands) true: Record all messages for comprehensive stats false: Only record command executions
track_command_details
Track command execution details true: Record detailed command execution info false: Basic command tracking only
anonymize_users
Privacy settings Anonymize user data in stats true: Replace user IDs with anonymous identifiers false: Keep actual user IDs in stats
Data_Retention
packet_stream_retention_days
Data retention controls how long the bot keeps data in the database. The scheduler runs cleanup daily so retention is enforced even when the standalone web viewer is not running. Shorter retention reduces DB size. Packet stream (web viewer real-time display and transmission_tracker) 2-3 days is enough for most deployments; 7 days if you need longer history.
daily_stats_retention_days
Repeater/stats tables: daily_stats, unique_advert_packets, observed_paths
observed_paths_retention_days
purging_log_retention_days
Purging log (audit trail for repeater purges)
mesh_connections_retention_days
Mesh connections (path graph edges). Should be >= Path_Command graph_edge_expiration_days.
Path_Command
enabled
Enable or disable the path command
enable_p_shortcut
Enable "p" shortcut for path command (similar to "t" for test command) true: Respond to just "p" or "p <path_data>" as a shortcut for "path" (default) false: Only respond to "path", "decode", or "route" keywords
path_selection_preset
Path Selection Preset Choose a preset that configures multiple related settings: - balanced: Balanced approach using both graph evidence and geographic proximity (default) - geographic: Prioritize geographic proximity over graph evidence (better for local networks) - graph: Prioritize graph evidence over geographic proximity (better for well-connected networks) Individual settings below can override preset values See docs/path-command-config.md for detailed documentation
proximity_method
Basic Settings Geographic proximity calculation method simple: Use proximity to bot location path: Use proximity to previous/next nodes in the path for more realistic routing (default)
path_proximity_fallback
Enable path proximity fallback When path proximity can't be calculated (missing location data), fall back to simple proximity
max_proximity_range
Maximum range for geographic proximity guessing (kilometers, 0 = disabled) Typical LoRa transmission: < 30km, Long LoRa transmission: up to 200km Repeaters beyond this distance will have reduced confidence or be rejected
max_repeater_age_days
Maximum age for repeater data in path matching (days, 0 = disabled) Only include repeaters that have been heard within this many days
recency_weight
Recency vs Proximity weighting (0.0 to 1.0) 0.0 = 100% proximity (only distance matters) 1.0 = 100% recency (only when last heard matters) 0.4 = 40% recency, 60% proximity (balanced)
recency_decay_half_life_hours
Recency decay half-life in hours (for longer advert intervals) Default: 24 hours. For 48-72 hour advert intervals, use 36-48 hours.
graph_based_validation
Enable graph-based path validation When enabled, uses observed mesh connections to improve path guessing accuracy The graph learns from message paths to validate repeater selections
min_edge_observations
Minimum edge observations required for graph confidence Edges with fewer observations are not considered for path validation Higher values = more conservative (requires more evidence)
graph_edge_expiration_days
Graph edge expiration (days without observation) Edges not observed for this many days will be ignored Helps filter out stale routing information
graph_write_strategy
Graph persistence write strategy: 'immediate', 'batched', or 'hybrid' - immediate: Write each edge update to database immediately (safer for frequent restarts, higher I/O) - batched: Accumulate updates, flush periodically (better performance, risk of data loss on crash) - hybrid: Immediate for new edges, batched for observation count increments (balanced) Recommended: 'hybrid' for development (frequent restarts), 'batched' for production
graph_batch_interval_seconds
Batch write interval in seconds (only used if strategy is 'batched' or 'hybrid') How often to flush pending edge updates to database Lower values = more frequent writes (safer but more I/O) For frequent restarts during development, use 5-10 seconds
graph_batch_max_pending
Maximum pending updates before forcing a flush (only used if strategy is 'batched' or 'hybrid') If this many updates are pending, flush immediately even if interval hasn't elapsed Prevents unbounded memory growth during high message volume
graph_use_bidirectional
Enhanced graph features for improved path accuracy Enable bidirectional edge bonus (check if reverse edges exist for higher confidence)
graph_use_hop_position
Enable hop position validation (validate candidate appears in expected position based on avg_hop_position)
graph_multi_hop_enabled
Enable multi-hop path inference (find intermediate nodes when direct edges don't exist)
graph_multi_hop_max_hops
Maximum hops for multi-hop path inference (default: 2, can be increased to 3 for fallback)
graph_geographic_combined
Combine graph and geographic scores into weighted average (default: false, uses graph-first fallback) When enabled, combines graph and geographic scores instead of choosing one or the other
graph_geographic_weight
Weight for graph score when combining with geographic (0.0-1.0, default: 0.7) Higher values give more weight to graph evidence, lower values favor geographic proximity
graph_confidence_override_threshold
Minimum graph confidence threshold to override geographic selection (0.0-1.0, default: 0.7) When graph confidence >= this value, graph selection overrides geographic even if geographic prefers closer repeaters Lower values (e.g., 0.5) = geographic gets more consideration, higher values (e.g., 0.9) = graph gets more priority Set to 1.0 to always prefer geographic when available, or 0.0 to always prefer graph
graph_distance_penalty_enabled
Enable distance penalties for intermediate hops in graph selection (default: true) When enabled, graph scores are penalized for candidates that create long-distance hops (>50km) This prevents graph from selecting very distant repeaters even if they have strong graph evidence
graph_max_reasonable_hop_distance_km
Maximum reasonable hop distance in km before applying penalty (default: 50) Hops longer than this distance will have their graph score penalized Lower values = more aggressive penalty for long hops
graph_distance_penalty_strength
Distance penalty strength (0.0-1.0, default: 0.3) How much to penalize graph scores for long-distance hops 0.3 = 30% penalty for hops beyond max_reasonable_hop_distance Higher values = stronger penalty, lower values = weaker penalty
graph_zero_hop_bonus
Zero-hop advert bonus for graph selection (0.0-1.0, default: 0.4) Repeaters that have been heard directly by the bot (zero-hop adverts) get this bonus This is strong evidence the repeater is close, even for intermediate hops Higher values = stronger preference for repeaters heard directly
graph_prefer_stored_keys
Prefer candidates that match stored public keys in graph edges (default: true) When enabled, candidates whose public key matches the stored public key in an edge get a significant confidence boost, as stored keys indicate high confidence in the edge This aligns path command selection with what the graph visualization shows
graph_final_hop_proximity_enabled
Enable bot location proximity consideration for final hop in graph selection (default: true) When enabled, for the final hop (last repeater before bot), candidates closer to bot location get a proximity bonus added to their graph score
graph_final_hop_proximity_weight
Weight for proximity score when combining with graph score for final hop (0.0-1.0, default: 0.25) Higher values give more weight to proximity, lower values favor graph evidence 0.25 means 25% proximity, 75% graph score
graph_final_hop_max_distance
Maximum distance in km for final hop proximity consideration (default: 0 = no limit) Repeaters beyond this distance from bot will not receive proximity bonus Set to 0 to disable distance limiting
graph_final_hop_proximity_normalization_km
Distance normalization for final hop proximity scoring (km, default: 200) Closer repeaters get higher proximity scores. Lower values = more aggressive scoring 200km (long LoRa range) means repeaters within 200km get full scoring range, beyond that scores decrease
graph_final_hop_very_close_threshold_km
Very close distance threshold for boosted proximity weight (km, default: 10) Repeaters within this distance get 2x proximity weight (up to 0.6 max)
graph_final_hop_close_threshold_km
Close distance threshold for boosted proximity weight (km, default: 30) Repeaters within this distance get 1.5x proximity weight (up to 0.5 max). Typical LoRa range.
graph_final_hop_max_proximity_weight
Maximum proximity weight for very close repeaters (0.0-1.0, default: 0.6) When a repeater is within very_close_threshold_km, proximity weight is boosted up to this value
graph_path_validation_max_bonus
Path validation bonus settings Maximum bonus for path validation matches (0.0-1.0, default: 0.3) Higher values give more weight to stored path matches when resolving prefix collisions
graph_path_validation_obs_divisor
Observation count divisor for path validation bonus (default: 50.0) Lower values = stronger bonus from observation count. 50.0 means 50 observations = 0.15 bonus
graph_startup_load_days
Load only recent edges on startup (days, 0 = load all historical edges) Edges older than this are skipped at startup to bound initial memory usage. The in-code default is 14 days when this setting is absent from config.ini. Recommended values: 0 - Load all historical edges (servers with ample RAM, e.g. x86 VM) 14 - Good balance of coverage vs. memory (default for unconfigured installs) 7 - Reduced memory footprint for Raspberry Pi Zero 2 W Note: edges older than graph_edge_expiration_days are never loaded regardless of this value.
graph_capture_enabled
Enable graph data capture from incoming packets (default: true) When true, the bot observes routing paths from advertisements, messages, and trace packets and stores edges in the mesh graph. When false, NO new edge data is collected and the background batch writer thread is not started — reducing both CPU and RAM overhead. Any edges already in the database are still available for graph_based_validation if that is also enabled. Set to false on devices that don't use the path command and want minimal overhead.
star_bias_multiplier
Star bias multiplier for path command When a contact is starred in the web viewer, multiply its selection score by this value Higher values = stronger preference for starred repeaters Default: 2.5 (starred repeaters get 2.5x their normal score) Set to 1.0 to disable star bias
Joke_Command
enabled
Enable or disable the joke command (true/false)
seasonal_jokes
Enable seasonal joke defaults (October: spooky, December: Christmas) true: Seasonal defaults are applied (default) false: No seasonal defaults (always random)
long_jokes
Handle long jokes (over 130 characters) false: Fetch new jokes until we get a short one (default) true: Split long jokes into multiple messages
DadJoke_Command
enabled
Enable or disable the dad joke command (true/false)
long_jokes
Handle long jokes (over 130 characters) false: Fetch new jokes until we get a short one (default) true: Split long jokes into multiple messages
Hacker_Command
enabled
Enable or disable the hacker command (true/false; responds to Linux commands with supervillain mainframe errors)
Multitest_Command
response_format
Response format for multitest command results Available fields: {sender}, {path_count}, {paths}, {listening_duration} {sender}: Name/ID of message sender {path_count}: Number of unique paths found {paths}: Newline-separated list of paths {listening_duration}: Listening window duration in seconds Leave empty to use default format Example: "Found {path_count} unique path(s) for @[{sender}]:\n{paths}"
Greeter_Command
enabled
Enable greeter to greet users on first channel message (true/false)
greeting_message
Greeting message template (default for all channels) Available fields: {sender} - the user's name/ID For multi-part greetings, separate messages with pipe (|) Example (single): "Welcome to the mesh, @[{sender}]!" Example (multi-part): "Welcome to the mesh, @[{sender}]!|This is a great place to chat.|Use !help for commands."
channel_greetings
Channel-specific greeting messages (optional) Format: channel_name:greeting_message,channel_name2:greeting_message2 If a channel has a specific greeting, it will be used instead of the default greeting_message Example: Public:Welcome to Public channel, @[{sender}]!|general:Welcome to general, @[{sender}]! Multi-part greetings are supported per channel using pipe (|) separator Leave empty to use greeting_message for all channels
per_channel_greetings
Per-channel greetings (tracking behavior) false: Greet each user only once globally (default - user gets one greeting total) true: Greet each user once per channel (user can be greeted on each channel separately) Note: This controls tracking, not the greeting message itself. Use channel_greetings for different messages.
include_mesh_info
Include mesh network information in greeting true: Add mesh statistics to greeting (total contacts, repeaters, etc.) false: Only send the greeting message
mesh_info_format
Mesh info format template Available fields: {total_contacts}, {repeaters}, {companions}, {recent_activity_24h} Example: "\n\nMesh Info: {total_contacts} contacts, {repeaters} repeaters" Note: Mesh info is appended to the last greeting message part
rollout_days
Rollout period in days When greeter is first enabled on an active mesh, this sets how many days to listen and mark all active users as already greeted before beginning to greet new users. This prevents greeting everyone on an established mesh. Set to 0 to disable rollout (will greet all new users immediately) Note: Use auto_backfill to mark historical users and shorten/eliminate rollout period
auto_backfill
Auto-backfill from historical message_stats data true: Automatically mark all users who have posted on public channels in the past false: Only mark users during rollout period (default) This allows shortening or eliminating the rollout period by using existing data
backfill_lookback_days
Backfill lookback period in days Number of days to look back when auto-backfilling (0 = all time) Only used if auto_backfill = true Example: 30 = only mark users who posted in last 30 days Example: 0 = mark all users who have ever posted (all time)
Alert_Command
enabled
Enable or disable the alert command (true/false)
Announcements_Command
enabled
Enable or disable the announcements command (true/false)
announcements_acl
Announcements Access Control List (ACL) Only users with public keys listed here can send announcements This ACL automatically inherits all members from the Admin_ACL Format: comma-separated list of 64-character hex public keys (without spaces) Example: f5d2b56d19b24412756933e917d4632e088cdd5daeadc9002feca73bf5d2b56d Leave empty to only use Admin_ACL members
default_announcement_channel
Default channel for announcements when no channel is specified Announcements will be sent to this channel if no channel is provided
announcement_cooldown
Announcement cooldown in minutes Prevents the same announcement from being sent too frequently Default: 60 minutes
announce.default
Announcement triggers Format: announce.<trigger_name> = <announcement_text> Users can send: announce <trigger_name> [channel] If channel is not specified, uses default_announcement_channel Example triggers:
announce.bots
announce.other
Airplanes_Command
enabled
Enable or disable the airplanes command (true/false)
api_url
API endpoint URL for ADS-B aircraft data Default: airplanes.live API Supports any standardized ADS-B API using readsb/airplanes.live format Examples: http://api.airplanes.live/v2/ (default) https://adsbexchange-com1.p.rapidapi.com/v2/ (if compatible) http://localhost:8080/data/ (local readsb instance)
default_radius
Default search radius in nautical miles Maximum: 250 nautical miles
max_results
Maximum number of aircraft to return in results Maximum: 50
url_timeout
API request timeout in seconds
Wx_Command
enabled
WebViewer_Command
enabled
Sun_Command
enabled
Solar_Command
enabled
Solarforecast_Command
enabled
Satpass_Command
enabled
Roll_Command
enabled
Repeater_Command
enabled
Ping_Command
enabled
Moon_Command
enabled
Magic8_Command
enabled
Hfcond_Command
enabled
Help_Command
enabled
Hello_Command
enabled
Dice_Command
enabled
Cmd_Command
enabled
Channels_Command
enabled
Catfact_Command
enabled
Aqi_Command
enabled
Advert_Command
enabled
Test_Command
enabled
Trace_Command
enabled
Enable or disable the trace/tracer commands (link diagnostics)
maximum_hops
Maximum path length (hops) for manual or reciprocal path; paths longer than this are capped
trace_mode
Trace mode: one_byte (default) or two_byte (when firmware supports it)
timeout_base_seconds
Timeout: total = timeout_base_seconds + (path hops * timeout_per_hop_seconds); typical 6 hops ~1s, 10 ~2s
timeout_per_hop_seconds
trace_retry_count
Retries: max attempts (default 2 = try once, then once more after delay)
trace_retry_delay_seconds
Seconds to wait before retrying a failed trace
update_graph_one_byte
Update mesh graph with bidirectional link when 1-byte trace succeeds
update_graph_two_byte
Update mesh graph with 2-byte link identification when 2-byte trace succeeds (when supported)
Feed_Command
enabled
Web_Viewer
enabled
Enable or disable the web data viewer SECURITY NOTE: Web viewer has NO AUTHENTICATION built-in Enable web viewer (true/false). SECURITY: only enable if you understand implications; false recommended for production
host
Web viewer host address SECURITY WARNING: - 127.0.0.1: Only accessible from localhost (SECURE - recommended) - 0.0.0.0: Accessible from any network interface (INSECURE - exposes all bot data to network) Using 0.0.0.0 will expose: - All messages and their contents - Contact list and repeater information - Real-time packet stream - Bot configuration details WITHOUT ANY AUTHENTICATION OR ENCRYPTION
port
Web viewer port Must be between 1024-65535 (non-privileged ports) Default: 8080
debug
Enable debug mode for the web viewer true: Enable Flask debug mode (auto-reload on changes) false: Production mode (recommended)
auto_start
Auto-start web viewer with bot true: Start web viewer automatically when bot starts false: Start web viewer manually (recommended)
decode_hashtag_channels
Additional hashtag channels to decode in the packet stream The web viewer can decrypt GroupText messages from hashtag channels without adding them to the radio. Enter channel names (with or without #) as a comma-separated list. The Public channel is always included. Example: #CQ,#ARES,#EmComm This will allow decryption of messages on #CQ, #ARES, and #EmComm channels in addition to any channels configured on your radio. Note: Only hashtag channels work here - custom channels with private keys must be added to the radio itself.
PacketCapture
enabled
Enable packet capture service (true/false)
output_file
Output file for packet data (optional) Leave empty to disable file output Packets will be written as JSON lines
verbose
Verbose output (show JSON packet data in logs) true: Show packet data in logs false: Minimal logging
debug
Debug output (show detailed debugging info) true: Show all debugging information false: Standard logging
owner_public_key
Owner information (for packet analyzer registration) Owner public key (64-character hex string)
owner_email
Owner email address
private_key_path
Private key file path for auth token generation (fallback if device signing unavailable) Optional - on-device signing is preferred Supports 64-byte orlp format (128 hex chars) or 32-byte seed (64 hex chars) Required only if device doesn't support on-device signing or auth_token_method = python Note: If not provided and auth_token_method = python, the service will attempt to fetch the private key from the device automatically
auth_token_method
Auth token signing method device: Try on-device signing first, fallback to Python signing (default, recommended) python: Use Python signing only (requires private_key_path or device key export capability)
iata
Location Code (IATA code for your location) Used in topic templates and auth tokens Example: SEA, LAX, JFK, etc. Default: XYZ (invalid if not set)
mqtt_enabled
MQTT configuration Enable MQTT publishing
mqtt1_enabled
MQTT Broker 1 - Let's Mesh Analyzer (US)
mqtt1_server
mqtt1_port
mqtt1_transport
mqtt1_use_tls
mqtt1_use_auth_token
mqtt1_token_audience
mqtt1_topic_status
mqtt1_topic_packets
mqtt1_websocket_path
mqtt1_client_id
mqtt1_upload_packet_types
mqtt2_enabled
MQTT Broker 2 - Let's Mesh Analyzer (EU)
mqtt2_server
mqtt2_port
mqtt2_transport
mqtt2_use_tls
mqtt2_use_auth_token
mqtt2_token_audience
mqtt2_topic_status
mqtt2_topic_packets
mqtt2_websocket_path
mqtt2_client_id
mqtt2_upload_packet_types
stats_in_status_enabled
Stats and status publishing Enable stats in status messages
stats_refresh_interval
Stats refresh interval (seconds)
jwt_renewal_interval
JWT renewal interval (seconds, 0 = disabled)
health_check_interval
Health check interval (seconds, 0 = disabled)
health_check_grace_period
Health check grace period (consecutive failures before warning)
MapUploader
enabled
Enable map uploader (true/false). Uploads node adverts (repeaters, room servers, sensors) to map.meshcore.dev CHAT adverts skipped; adverts without GPS or with 0.0 coords skipped. Uses device radio parameters
api_url
API endpoint URL The map.meshcore.dev API endpoint for uploading node adverts Default: https://map.meshcore.dev/api/v1/uploader/node
private_key_path
Private key file path (optional) Path to file containing device private key for signing uploads If not provided, the service will attempt to fetch the private key from the device Supports 64-byte orlp format (128 hex chars) or 32-byte seed (64 hex chars) Required only if device doesn't support private key export
min_reupload_interval
Minimum time between re-uploads of same node (seconds) Prevents uploading the same node too frequently to avoid API spam Only nodes with timestamps newer than last upload + this interval will be uploaded Default: 3600 (1 hour)
verbose
Verbose logging Enable detailed debug logging including upload data and signature details true: Show detailed debug information (useful for troubleshooting) false: Standard logging (default)
Weather_Service
enabled
Enable weather service for scheduled forecasts and alert monitoring (true/false)
weather_alarm
Daily weather forecast time Format: HH:MM (24-hour format, e.g., "6:00" for 6 AM) Or use "sunrise" or "sunset" for dynamic times based on your location Bot will send daily weather forecast at this time
my_position_lat
Bot position for weather forecasts and alerts Latitude in decimal degrees
my_position_lon
Longitude in decimal degrees
weather_channel
Channel for daily weather forecasts Weather forecasts will be sent to this channel
alerts_channel
Channel for weather alerts Weather alerts will be sent to this channel
poll_weather_alerts_interval
Weather alert polling interval (milliseconds) How often to check for new weather alerts Default: 600000 (10 minutes)
blitz_collection_interval
Thunder/storm data collection interval (milliseconds) How often to aggregate thunder data for evaluation Default: 600000 (10 minutes) Note: Storm detection area must be configured for this to work
Earthquake_Service
enabled
Enable earthquake alert service (true/false) Polls USGS Earthquake API and posts alerts to a channel when quakes occur in the configured region
channel
Channel to post earthquake alerts to
poll_interval
Poll interval (milliseconds). How often to check USGS for new earthquakes Default: 60000 (1 minute)
time_window_minutes
Time window (minutes). Only earthquakes in the last N minutes are queried Default: 10
min_magnitude
Minimum magnitude to report (e.g. 3.0 for M3.0+) Default: 3.0
minlatitude
Region bounding box (decimal degrees). Defaults are California Southern and northern latitude bounds
maxlatitude
minlongitude
Western and eastern longitude bounds (negative = West)
maxlongitude
send_link
Send USGS event link in a separate message following the alert (true/false) When true: notification message then link-only message. When false: no link sent. Default: true
DiscordBridge
enabled
Enable Discord bridge service Enable Discord bridge (true/false). One-way, read-only webhooks
avatar_style
Avatar generation style Controls how user avatars are generated in Discord Options: color - Generate colored Discord default avatars based on username hash (default, no external API) fun-emoji - Fun emoji-style avatars from DiceBear API avataaars - Cartoon avatar faces from DiceBear API bottts - Robot avatars from DiceBear API identicon - Geometric patterns (GitHub-style) from DiceBear API pixel-art - Retro pixel-style avatars from DiceBear API adventurer - Adventure-themed avatars from DiceBear API initials - User initials on colored background from DiceBear API Default: color
TelegramBridge
enabled
Enable Telegram bridge service Posts MeshCore channel messages to Telegram via the Bot API (one-way, read-only) true: Enable Telegram bridge false: Telegram bridge disabled (default)