Installation

Get this open-source Field Day logging software running on your server in about 5 minutes. Works on any Linux machine with 2 GB of RAM, including a Raspberry Pi 4 running off a battery pack at your Field Day site.

System Requirements

FD Commander is designed to run on modest hardware, the kind of gear you'd actually bring to a field site. The deploy script installs everything it needs, so you're starting from a bare OS.

ComponentMinimumRecommended
Operating SystemUbuntu 22.04 / Debian 12Ubuntu 24.04 LTS or Raspberry Pi OS
RAM2 GB4 GB+
Storage16 GB32 GB+
NetworkLAN accessGigabit Ethernet

You do not need to install PHP, MariaDB, Node.js, or any other dependencies yourself. The deploy script handles all of it. It installs PHP 8.4, MariaDB, Node.js 20, Composer, and FrankenPHP automatically.

No Internet Required at Runtime
FD Commander runs fully offline once deployed. The install script downloads dependencies, so you need internet during setup. After that, no external connectivity is required, though an optional weather API integration is available if your site has internet access. Do the install at home before the event.

Install Steps

1

Clone the Repository

Pull down the source code from GitHub.

2

Run the Deploy Script

One command. The script installs PHP 8.4, MariaDB, Node.js, Composer, and FrankenPHP. It compiles front-end assets, runs database migrations, seeds reference data (bands, modes, ARRL sections, bonus types), and creates systemd services for the web server, queue worker, scheduler, and WebSocket server.

3

Open It in a Browser

Navigate to your server's address from any device on the network. Register the first account (it becomes the System Administrator), create your event, and start configuring.

1. Clone the Repository

bash Copy
$ git clone https://github.com/ckoval7/fielddaycommander.git
$ cd fd-commander

2. Run the Deploy Script

At minimum, you need to pass your server's domain name or IP address. The script will use sensible defaults for everything else.

bash Copy
$ sudo ./deploy.sh --domain fd.local

The --domain flag tells the server what hostname or IP address it should respond to. This is the address your operators will type into their browsers to reach FD Commander. A few common choices:

You can change this later by re-running the deploy script with a different --domain value.

The script runs through 9 phases: detecting your OS, installing system packages, cloning and building the application, creating the database, configuring FrankenPHP, setting up SSL (if requested), creating systemd services, opening firewall ports, and caching the configuration. It logs everything to /var/log/fd-commander-deploy.log.

Raspberry Pi Users
On a Raspberry Pi 4, the install may take longer due to Composer dependency resolution and npm asset compilation. This is normal. Make sure you have at least a 16 GB SD card, though a USB SSD is recommended for better database performance.

3. Open It Up

Once the script finishes, open a browser on any device connected to your LAN and navigate to the domain or IP you specified. By default the server runs on port 80 (HTTP). The first account you register automatically gets the System Administrator role.

You're Live
From here, create an event, set your callsign and ARRL section, define stations, and share the registration link with your operators. The dashboard will guide you through the setup checklist.

Deploy Script Flags

The deploy script accepts several optional flags to customize the installation. Only --domain is required.

FlagDefaultDescription
--domain(required)Domain name or IP address for the server
--port80 (HTTP) / 443 (SSL)Port for the web server
--ssloffEnable HTTPS. Uses Let's Encrypt by default
--email(none)Email for Let's Encrypt certificate registration
--ssl-cert(none)Path to a custom SSL certificate file
--ssl-key(none)Path to a custom SSL private key file
--db-namefd_commanderMariaDB database name
--db-userfd_commanderMariaDB username
--db-password(generated)MariaDB password. Auto-generated if omitted
--app-path/var/www/fd-commanderInstallation directory on the server
--reverb-port8080Port for the WebSocket server (Laravel Reverb)
--branchmainGit branch to deploy
--repo-url(GitHub)Custom Git repository URL
--no-seedersoffSkip database seeders (bands, modes, sections, etc.)
--dry-runoffPrint what would be done without making changes

Example: Raspberry Pi on your LAN

bash Copy
$ sudo ./deploy.sh --domain fd.local

This deploys on port 80 with HTTP. Operators connect by opening http://fd.local in any browser. If your network doesn't resolve .local hostnames, use the Pi's IP address instead.

Example: HTTPS with Let's Encrypt

bash Copy
$ sudo ./deploy.sh --domain fd.yourclub.org --ssl --email admin@yourclub.org

Caddy (the web server bundled with FrankenPHP) handles Let's Encrypt certificate provisioning and auto-renewal. This requires the server to be reachable from the internet on ports 80 and 443 during setup.

First Event Setup

The first time you open FD Commander, a setup wizard walks you through three steps. Step 1 sets the admin password for the pre-created SYSTEM account (callsign SYSTEM, email admin@localhost). Step 2 configures site branding: your site name (defaults to "Field Day Commander"), an optional tagline, and an optional logo upload. Step 3 sets your organization information and system preferences including timezone, date format, and time format. After the wizard completes, you're redirected to the login page.

Sign in with admin@localhost and the password you set. The app will display a prominent warning that the SYSTEM account is for initial configuration only. Your first action should be to create a personal account tied to your own callsign. Go to Administration > Users, click Add User, fill in your callsign, email, name, and password, and set the role to System Administrator. Then log out via the account menu in the top-right corner and sign back in with your personal account. From that point on the SYSTEM account can be left alone. See the First Event Setup how-to for a detailed walkthrough.

Create an Event

Click + Create Event on the dashboard. The form has four sections. Under Event Information, give the event a name and pick the event type. When you select Field Day or Winter Field Day, the start and end times auto-populate from the official ARRL schedule in UTC, and the scoring rules default to the correct year. You can adjust these manually if needed. Under Event Location, the fields are technically optional, but latitude and longitude are required for the weather widget and NWS severe weather alerts to function. Fill them in if your site has internet access and you want weather data. City and state appear in auto-filled Section Manager messages, grid square is shown as reference for operators, and talk-in frequency lets visitors know what frequency to tune to for directions to your site. Under Station Configuration, fill in your station callsign, club name, ARRL/RAC section, operating class, and number of transmitters. Under Power Configuration, enter your maximum wattage and select your power sources (Commercial Power, Generator, Battery, or Alternate Power). The form shows the applicable power multiplier as you go. You can also enable a GOTA (Get On The Air) station, which lets novice operators make contacts under supervision, and a visitor guestbook for public sign-ins at your site.

Setup Checklist

The dashboard tracks five setup milestones:

1

Event configuration created

Your event exists with callsign, section, class, and power sources defined.

2

Equipment inventoried

At least one piece of equipment has been added to the system.

3

Stations set up

At least one station has been defined with band and mode assignments.

4

Shifts scheduled

Operator shifts have been created for your stations.

5

W1AW bulletin schedule set up

The W1AW bulletin reception schedule has been configured for the event.

Invite Operators

The dashboard shows a registration link that you can share with your club. By default this is a local network address (e.g., http://fd.local/register) — operators need to be on the same LAN or Wi-Fi network as the server to reach it. If you've set up DNS and TLS, operators can register remotely using your public hostname. Operators visit the link, register with their callsign, and they're in the system. By default, new registrations get the Operator role. You can change registration mode and default roles in Settings.

User Roles

FD Commander ships with five built-in roles. Each role has a specific set of permissions that control what parts of the system a user can access. Roles are managed under Settings > Role Management (a tab on the Settings page).

RoleWhat They Can Do
System Administrator26 permissions. Full access to everything: contact logging, all event management, all station and equipment functions, user administration, scheduling, content management, reporting, security logs, contact import, and weather management. Marked as System Protected, so this role always exists and can't be deleted.
Event Manager23 permissions. Manages the full operational side of Field Day: logging and importing contacts, managing events, stations, equipment, schedules, bonuses, guestbook, photos, security logs, and weather. Cannot administer users, roles, or system settings.
Station Captain10 permissions. Logs and edits contacts, manages stations and equipment inventory, handles equipment assignments, manages the W1AW bulletin schedule, views all equipment, and signs up for shifts. Runs an operating position and keeps operators on task.
Operator4 permissions. Logs contacts, views stations, manages personal equipment, and signs up for shifts. The default role for new registrations. Intentionally minimal so new hams can get on the air without seeing admin clutter.
Config Only8 permissions. A restricted bootstrap role: can manage users, roles, and settings, and has read-only access to events, stations, equipment, reports, and security logs. Cannot log contacts, manage events operationally, or participate in operations. Assigned exclusively to the built-in SYSTEM account. Marked as System Protected.

Permissions Reference

The permission system is organized into eight categories with 26 individual permissions. Each permission controls access to a specific area of FD Commander. The table below shows what each operational role gets out of the box. Config Only (the SYSTEM account role) is not shown here since it is not used for normal operations.

Category Permission Description Oper. Stn. Capt. Evt. Mgr. Sys. Admin
Contact Logging log-contacts Create new QSO entries
edit-contacts Edit or delete existing QSOs -
import-contacts Import contacts from ADIF files - -
Event Management view-events View events list and details - -
create-events Create new Field Day events - -
edit-events Edit existing Field Day events - -
delete-events Delete Field Day events - -
manage-bulletins Manage W1AW bulletin schedule -
verify-bonuses Approve or reject bonus point claims - -
Station & Equipment view-stations View stations list and details
manage-stations Add and edit operating stations -
manage-equipment Manage shared equipment inventory -
manage-own-equipment Create, edit, and delete personal equipment in catalog
view-all-equipment View everyone's equipment catalog -
manage-event-equipment Manage equipment assignments for events -
edit-any-equipment Edit equipment details for any user - -
User Administration manage-users Create, edit, and delete user accounts - - -
manage-roles Create roles and assign permissions - - -
manage-settings Configure system settings and preferences - - -
Content Management sign-up-shifts Sign up for and check in/out of volunteer shifts
manage-guestbook Manage guestbook entries (verify, edit, delete, export) - -
manage-shifts Create, edit, and manage shift schedules and assignments - -
manage-images Upload and delete event photos - -
Reporting view-reports Access detailed score reports - -
Security view-security-logs View security logs and activity records - -
Weather manage-weather Manually enter weather data and trigger storm alerts - -

Creating Custom Roles

The five default roles cover most clubs, but you can create your own. Go to Settings > Role Management and click + Create New Role. Give the role a name, then check the permissions you want it to have. Permissions are grouped by category with a Select All toggle at the top of each group, so you can quickly grant an entire category at once or pick individual permissions one by one. Click Save Permissions when you're done.

A few ideas for custom roles: a Logger role with log-contacts and edit-contacts for experienced operators who need to fix mistakes, a Safety Officer with just manage-guestbook and view-reports for the person running the public information table, or a Tech Lead with manage-stations and manage-equipment but no event management access.

Assigning Roles to Users

Go to Administration > Users to see everyone registered in the system. The table shows each user's callsign, name, email, current role (shown as a colored badge), license class, and account status. Click Edit on any user to open their profile, where you can change their role from the Role dropdown. You can also update their callsign, email, name, and license class from this same form.

New registrations default to the Operator role. You can change the default registration role in Settings > System Preferences.

User Management Actions

The Users page also gives administrators a few account management tools. From the Actions column on any user row, you can Lock Account to temporarily disable a user's access, Force Password Reset to require them to change their password on next login, Reset Password to generate a new one, or Delete to remove the account entirely. These actions are only available to users with the manage-users permission.

Stations

Stations represent individual operating positions. Each one is a radio, an antenna, and someone in a chair. Go to Event Management > Stations to see your station list for the current event. The page shows a summary bar with total stations, how many are active right now, and total equipment items assigned.

Creating a Station

Click + Add Station to open the station form. The Configuration tab has four sections:

Basic Information: Give the station a name (must be unique within the event), an optional hostname (the NetBIOS machine name of the PC running that station's logger, used for automatic station matching with N1MM+ and other external loggers), and confirm which event it belongs to.

Station Type: Check any special designations that apply. GOTA (Get On The Air) marks it as the special station for new operators; only one GOTA station is allowed per event. VHF/UHF Only restricts the station to those bands. Satellite marks it for satellite communications.

Primary Radio: Select the main transceiver from equipment that's been committed to the event. The dropdown pulls from all user equipment catalogs, showing the radio name, wattage, and owner. Once selected, FD Commander displays the radio's power capability so you can verify it fits your power class.

Power Configuration: Set the max power output in watts. FD Commander validates this against the event's power limit and shows a confirmation when it's within range. Describe the power source below (e.g., "Solar + Battery" for the 5x QRP multiplier, "Generator" for backup power, or "Commercial" if you're on grid power). This feeds directly into the scoring engine's power multiplier calculation.

Assigning Equipment

Switch to the Equipment tab to assign additional gear beyond the primary radio. The left panel shows what's already assigned to the station. The right panel lists available equipment, filterable by type, owner, and whether it's committed to this event or from the general catalog. Drag items from right to left to assign them, or use keyboard navigation with Space/Arrows/Escape.

Cloning from a Previous Event

If you're running the same station setup as last time, click Clone from Event on the main Stations page. This copies all station definitions (names, types, power configurations) from a previous event into the current one, so you don't have to rebuild everything from scratch.

Volunteer Scheduling

The scheduling system lets you define shift blocks and roles, then lets volunteers self-sign-up for open slots. There are two views: Event Management > Shift Schedule is the operator-facing board where people browse and claim shifts, and Administration > Manage Schedule is where the event manager builds the schedule.

Setting Up Roles

Before creating shifts, define the roles you need. Go to Administration > Manage Schedule and click the Roles tab. FD Commander ships with sample roles that cover common Field Day positions: Safety Officer, Public Information Table, Public Greeter, GOTA Coach, Message Handler, Event Manager, Station Captain, and Operator. Each role has a description, an optional bonus point value, and two key settings:

Eligibility only vs. Auto-awarded on confirmation controls whether the associated bonus points are granted automatically when the shift is confirmed, or just tracked for eligibility. Requires Confirmation means the event manager must approve the sign-up before it counts.

Click Add Custom Role to create roles specific to your club, like "Antenna Setup Crew" or "Food Coordinator." You can delete or edit the sample roles if they don't fit.

Creating Shifts

Switch to the Shifts tab and click Add Shift. Each shift needs a role (from the dropdown), a start time and end time (entered in UTC, displayed to volunteers in local time), a capacity (how many people can fill the slot), and optionally notes. The Open for Sign-ups toggle controls whether operators can self-assign or whether the manager must assign them manually.

For events with lots of shifts, use the Bulk Create button to generate multiple shift blocks at once instead of creating them one at a time.

Managing Shifts

Each shift card on the admin Shifts tab has an edit button to modify the shift details and a delete button to remove it. Unfilled slots have an Assign button so the event manager can manually place someone without waiting for self-sign-up. For each person already assigned to a shift, the manager can Check In, Check Out, Mark No-Show, or Remove the assignment directly from the card.

The Operator View

Operators go to Event Management > Shift Schedule to see available shifts filtered by role. They can sign up for open slots and click My Shifts to see only their own assignments. The Confirmations tab on the admin side shows all sign-ups awaiting approval, with Confirm and Reject buttons on each entry.

Equipment Tracking

FD Commander gives every operator a personal equipment catalog and ties it into the event workflow so you always know what gear is where. There are four equipment pages depending on your role and what you're looking at.

My Catalog

Go to Equipment > My Catalog and click Add Equipment. The form captures everything you'd want to know about a piece of gear:

Equipment Details: Make and model (required), type (Radio, Antenna, Amplifier, Computer, Power Supply, Accessory, Tool, Furniture, or Other), serial number, and a free-text description. Admins also see an Owner dropdown to assign equipment to any registered user; operators creating their own gear won't see this field — their equipment is automatically assigned to them.

Technical Specifications: Power output in watts (used when the radio is selected as a station's primary transceiver) and estimated value in USD.

Operational Information: Emergency contact phone, comma-separated tags for easy filtering (e.g., "HF, Portable, Contest"), and notes.

Supported Bands: Check every band the equipment can operate on: 160m through 23cm, plus Satellite. This is used when assigning radios to stations.

Equipment Photo: Upload a PNG or JPEG (up to 5 MB) so people can visually identify the gear on-site.

Club Equipment

Admins and event managers can click Add Club Equipment (visible on both the My Catalog page and under Equipment > Club Equipment) for gear that belongs to the club rather than any individual member. Operators won't see this button. The form is the same as personal equipment except there's no owner field — instead there's an optional Managed By field to assign a specific person to be responsible for it. Club equipment has its own dedicated listing page where you can filter by type and status.

All User Catalogs

Admins and event managers can go to Equipment > All User Catalogs to see every piece of equipment in the system across all members, filterable by owner, type, and status. This page also has an Add Equipment for User button so an admin can add gear directly to any member's catalog without logging in as that user.

Committing to an Event

Equipment needs to be committed to an event before it can be assigned to stations. There are two commitment paths:

Operators commit their own gear directly from Equipment > My Catalog. Click the actions menu on any item and choose Commit to Event. A dialog asks which event to commit to, an expected delivery date, and optional delivery notes.

Admins commit club equipment from the Equipment Dashboard at Administration > Event Equipment. Click Commit Club Equipment to assign club gear to the event. Committed gear can then be assigned to specific stations on the station's Equipment tab.

Equipment Dashboard

The Equipment Dashboard (Administration > Event Equipment) tracks each item through its lifecycle: Committed (pledged for the event), Delivered (physically on-site), Returned (back with the owner after the event), or flagged with issues (Lost, Damaged, or Cancelled). Status cards at the top give a quick count across all items. You can view equipment in four groupings: Overview (all equipment in one table), By Owner, By Type, and By Station.

The Export button offers reports grouped by phase. Pre-event: Commitment Summary (CSV) and Delivery Checklist (PDF), Station Inventory (PDF and CSV). Post-event: Return Checklist (PDF) and Historical Record (CSV). Reference and incidents: Owner Contacts (PDF and CSV) and Incident Report (PDF and CSV).

Safety Checklists

Completing the safety checklist earns the Safety Officer bonus (100 points). Go to Event Management > Site Safety to work through it. The page shows a progress counter ("0 of 15 complete") and lists every item with a checkbox.

The Default Checklist

FD Commander ships with the 15-item ARRL Field Day safety checklist. Items cover the essentials you'd expect at a field site: safety officer on-site for the duration, fuel properly stored, fire extinguisher located, first aid kit on hand, CPR/AED-trained person present, NWS weather monitoring, tent stakes marked, antenna structures secured, tripping hazards cleared, site arranged to reduce hazards, stations and equipment grounded, access to police/fire/rescue, designated safety point of contact, and minimizing risk to the public. Each item is marked Required.

Working Through the Checklist

You must be signed on to an active Safety Officer shift before you can check off items. Once you are, walk the site during setup and check off each item as you verify it. FD Commander records who completed each item and when. The progress counter updates in real time, and once all required items are checked, the scoring page automatically awards the 100-point Safety Officer bonus.

Customizing the Checklist

Go to Administration > Manage Safety Checklist to add, edit, or remove items. Click Add Item to create new entries. Each item has a role assignment that controls who can check it off, so you can gate specific items to specific shift roles. If your club has additional safety requirements beyond the ARRL defaults (like generator exhaust ventilation or lightning grounding), add them here.

Contact Logging

Operators log contacts under Logging > Log Contact. The station selection screen shows every station with its current status (Available, Occupied, or In Use), the current operator's callsign, active band and mode, and running QSO count. Click a station to claim it.

Starting a Session

After selecting a station, you choose the band, mode, and power in watts before the logging interface opens. Band and mode are locked for the duration of the session. To change them you must end the session and start a new one. For GOTA stations, there's an additional option to mark the session as supervised (GOTA Coach present), which enables the 100-point coach bonus if 10 or more contacts are supervised.

Making Contacts

The logging interface shows a sticky bar at the top with the station name, band, mode, power, and a live QSO counter. The entry field accepts the full exchange in one shot (callsign, class, section) with autocomplete suggestions as you type. Hit Enter to log. Dupe checks run in real time against every contact logged by every station on every band, so you'll see an immediate warning if the callsign has already been worked on that band. If a contact fails to sync, it appears in a failed contacts dropdown in the header with a retry button.

All contacts go into a shared database via WebSocket (Laravel Reverb), so every connected browser sees updates as they happen. The scoring dashboard, logbook, and band activity all reflect new contacts instantly.

GOTA Operator Tracking

On a GOTA station, the logging interface shows additional fields to identify the operator making the contact: search for a registered user by name or callsign, or manually enter a first name, last name, and callsign for unregistered visitors. This attaches the GOTA operator to each contact for reporting purposes.

Browsing the Logbook

Go to Logging > View Log to open the Logbook Browser. Stats at the top show running totals: total QSOs, total points, unique sections worked, QSOs by mode, and QSOs by band. Below that, a full set of filters lets you slice the log by band, mode, station, operator, ARRL section, callsign, time range, duplicate status (all, exclude dupes, dupes only), and whether the contact was transcribed from paper. The contact table shows QSO time (UTC), callsign, band, mode, class, section, points, station, and the logger who entered it. Use the Export CSV button to download the filtered log.

Post-Event Editing

After the event, operators with the right permissions can edit contacts to fix exchange errors or delete accidental entries. There's a configurable grace period (default: 30 days) during which late contacts can still be added. This is useful for transcribing paper logs (see Paper Log Transcription).

External Logger Integration

FD Commander can receive contacts from external logging programs in real time over UDP, and it can import ADIF files after the fact. This means operators running WSJT-X, N1MM Logger+, fldigi, or any other logger that outputs ADIF don't need to double-log their contacts. The external logger handles the RF side and FD Commander handles scoring, deduplication, and Cabrillo export.

All external logger settings are found under Logging > External Loggers. Each listener can be enabled or disabled independently, and the UDP port is configurable.

Security Notice
UDP logging should only be enabled on private, firewalled networks. Do not enable UDP logging on internet-hosted servers, as UDP is unauthenticated and anyone who can reach the port can send arbitrary data.

N1MM Logger+

N1MM Logger+ can broadcast contact data over UDP. FD Commander listens for these broadcasts and creates contacts automatically. To set it up:

The listener shows live stats: packets received, errors, and uptime. You can expand "Last Log Received" to see the most recent contact data.

WSJT-X / JTDX

WSJT-X and JTDX can send logged QSOs as ADIF records over UDP. This is ideal for FT8, FT4, JT65, and other digital modes where WSJT-X handles the decoding and the operator logs contacts from within WSJT-X. To set it up:

Generic UDP ADIF (fldigi, etc.)

For any logging application that can send plain ADIF text over UDP, FD Commander provides a generic ADIF listener (default port: 2238). This works with fldigi, and any other logger that supports ADIF UDP output. To set it up:

ADIF File Import

If you have contacts in an ADIF file (from a previous logging session, a backup, or another program), you can import them through a three-step wizard. Click Import ADIF at the top of the Logging > External Loggers page.

The import is non-destructive. You review everything before any contacts are written to the database, and invalid records must be resolved (skipped or fixed) before the import can proceed.

Scoring

The scoring page (Event Management > Scoring) shows your live score using the ARRL Field Day formula:

Scoring Formula
(QSO Base Points x Power Multiplier) + Bonus Points + GOTA Bonus = Final Score

QSO points are weighted by mode: CW and digital contacts are worth 2 points each, phone contacts are worth 1. Power multiplier is determined automatically from your configured power sources (5x for ≤5W natural power, 2x for ≤5W or 6-100W with commercial/generator, 1x for over 100W). Bonus points come from 17 ARRL categories defined in the official rules. GOTA bonus is calculated separately: 5 points per GOTA contact, plus a 100-point coach bonus if 10 or more contacts are supervised.

Bonus Categories

The scoring page lists all 17 categories with their status: verified, claimed, or unclaimed. Some bonuses are tracked automatically (like the safety checklist completion or visitor guestbook count). Others are claimed manually by the event manager (like media publicity or satellite QSO). Availability depends on your entry class.

BonusPointsTracking
Emergency Power100/transmitter (max 2,000)Based on configured power sources
Media Publicity100Manual claim
Public Location100Manual claim
Information Booth100Manual claim
Section Manager Message100Automatic (NTS message tracking)
NTS Messages Handled10 each (max 100)Automatic (per radiogram logged)
Satellite QSO100Manual claim
Natural Power QSOs100Manual claim
W1AW Field Day Bulletin100Automatic (W1AW Bulletin page)
Educational Activity100Manual claim
Elected Official Visit100Automatic (guestbook visitor category)
Served Agency Visit100Automatic (guestbook visitor category)
Web Submission50Manual claim
Youth Participation20 each (max 100)Automatic (youth accounts) + manual entry
Social Media100Manual claim
Safety Officer100Automatic (safety checklist completion)
Site Responsibilities50Manual claim (Classes B, C, D, E, F only)

Section Map

The Section Map is an interactive visualization of the 85 ARRL and RAC sections across the United States and Canada (71 US sections including territories, plus 14 Canadian RAC sections). DX contacts are scored normally but do not appear on the map. As contacts are logged, sections light up on the map in real time. It's accessible from the main sidebar under Section Map.

Region Filters

Across the top of the map, a row of filter buttons lets you focus on a specific region: All, US, Canada, or individual call areas (W1 through W0). Selecting a call area zooms the view and dims sections outside that area so you can quickly see which sections within a region you've worked and which you still need.

Color Modes

Three color modes control how sections are shaded:

Section Details

Hover over any worked section to see a tooltip with the section name and abbreviation, total QSO count, bands and modes worked, and how long ago the last contact was made.

Using It During the Event

The Section Map works well on a big screen at the Field Day site. It gives the whole club a visual sense of progress without needing to read a log table. Operators can glance at the map to see which call areas have gaps, and station captains can use it to guide band and direction strategy.

Visitor Guestbook

Field Day is a public event, and the ARRL awards bonus points for public outreach. The guestbook (Guestbook in the sidebar) makes it easy to track who stopped by. It supports location-based check-in so you can verify that visitors are actually at your site, and it categorizes guests for cleaner reporting after the event.

How It Works

The guestbook page is designed to be handed to a visitor on a tablet. It shows a friendly welcome message and a simple form. No account, no password, no friction. During an active event, visitors fill it out and tap submit. When the event isn't running, the page shows a "No Active Event" notice so nobody signs a stale book.

The form collects the following information:

The form also includes a Presence Type selector where the visitor chooses "in-person" or "online." The system pre-selects this based on the location check (see below), but the visitor can change it. This distinction shows up in the guestbook management table so you can see at a glance who was physically present.

Licensed hams and general public are tracked separately. Guest counts feed into the Public Information bonus point tracking on the scoring page.

Setting Up the Guestbook

Guestbook settings live inside the event configuration. Go to Event Management > Edit Event. The coordinates used for proximity detection are set in the Event Location section (latitude and longitude are required for this feature to work). Scroll further down to the Guestbook Settings section, which has three settings:

1. Enable the guestbook. Toggle the "Enable Guestbook" switch to on. The description reads "Allow visitors to sign in when physically at your event location." When this is off, the guestbook page is hidden entirely.

2. Set the detection radius. A slider lets you choose how far from your coordinates a visitor can be and still count as "in-person." The range is 100 to 2,000 meters. The current value displays in both metric and imperial (for example, "500m (1,640 feet)"). If your Field Day site covers a large park or fairground, increase the radius. For a smaller backyard setup, bring it down.

3. Add local subnets (optional). If you have a known network at your site, you can enter one or more subnets in CIDR notation, one per line. For example, 192.168.1.0/24 or 10.0.0.0/8. Visitors whose IP address falls within any of these subnets are automatically considered "in-person," even if GPS is unavailable. This is the fallback mechanism described below.

Location-Based Check-In

When a visitor opens the guestbook page, the system tries to determine whether they are physically at your event site. It does this in two steps:

Step 1: Browser geolocation. The page asks the visitor's browser for their GPS coordinates using the standard Geolocation API. If the visitor allows the location prompt and their device has GPS (most phones do), the system compares the visitor's coordinates against the event coordinates you configured. It calculates the distance using the Haversine formula (great-circle distance on the Earth's surface). If the visitor is within the detection radius, they pass the check and are marked "in-person."

Step 2: Subnet fallback. If GPS is not available (the visitor denied the prompt, the device has no GPS hardware, or the browser doesn't support geolocation), the system falls back to checking the visitor's IP address against the local subnets you configured. If their IP matches any of the subnets, they are marked "in-person." This is useful for tablets connected to your site's Wi-Fi router, where you know the IP range but the device may not have GPS.

If both checks fail, the visitor can still sign the guestbook. They are simply recorded as "online" rather than "in-person."

HTTPS and the Location Feature

There is an important caveat with browser geolocation: modern browsers require HTTPS to use the Geolocation API. On a plain HTTP connection, the browser will silently block the location request without even showing a permission prompt. The visitor's form will still work, but the GPS check will never fire, and everyone will fall back to subnet matching or be marked "online."

This matters because FD Commander is a LAN-hosted application and many Field Day setups run it over plain HTTP on a local IP address (like http://192.168.1.50). In that scenario, the GPS-based location check will not function at all. Visitors signing the guestbook on their own phones will never get a location prompt, and the system will fall back to subnet matching or mark them as "online."

If you want GPS-based location detection to work, serve FD Commander over HTTPS with a certificate the browser trusts. For a standard LAN deployment over plain HTTP, use the subnet fallback instead. Configure the local subnets field with your network's CIDR range, and any device on that network will be detected as "in-person" without needing GPS or HTTPS.

Managing Entries

The event manager can view and manage all entries under Administration > Manage Guestbook. Each entry shows the visitor's name, callsign (if provided), category, presence type (in-person or online), and timestamp. This is useful for cleaning up duplicates, reviewing visitor categories for bonus claims, or exporting totals after the event wraps up.

Weather

The weather page (Weather in the sidebar) shows live conditions and forecasts for your Field Day site. It requires latitude and longitude to be set in your event configuration. Data comes from two sources: Open-Meteo for forecasts and current conditions, and NWS (National Weather Service) for official weather alerts. Both are fetched automatically with no API key required.

Weather Dashboard

The page shows current conditions (temperature, wind speed and direction, gusts), an hourly table for the next 12 hours, and a multi-day daily forecast. Active NWS alerts appear as banners at the top of the page. If an admin has entered a manual override, a notice indicates who entered it and when. The data source and last-updated time are shown at the bottom.

Managing Weather

Users with the manage-weather permission can access Administration > Manage Weather, which has four sections:

Unit System. Switch between metric and imperial. This affects all temperature and wind displays site-wide.

API Status. Shows the connection status for Open-Meteo and NWS. NWS alert polling can be toggled on or off independently. When enabled, you can filter which NWS event types are shown (e.g. hide watch-level alerts and only show warnings). Disabling NWS clears stored NWS alerts but preserves any manual alerts you've entered.

Manual Forecast Override. If your site has no internet access, you can enter conditions manually: temperature, wind speed, wind direction, rain chance, and optional notes. The dashboard shows the override data with a notice that it was manually entered. Clear the override at any time to return to live data.

Storm / Lightning Alert. Post a custom alert message that broadcasts immediately to all connected users as a prominent banner. Useful for calling operators inside during lightning. NWS alerts will display alongside or override this when available. Active alerts can be cleared from the same panel.

NTS Messages / Message Traffic

The National Traffic System (NTS) bonus awards 10 points for every radiogram your station handles during the event, up to a maximum of 100 points. FD Commander tracks three types: originated, relayed, and received & delivered. Each one you log adds to your score automatically. Find this page under Message Traffic in the Event Management section of the sidebar.

Logging Messages

Click New Message to record each radiogram with its type and details. The running count and point total show at the top of the page alongside the SM/SEC and W1AW tallies.

Section Manager Message

The Section Manager/SEC message bonus (100 points) has its own button on the page: SM/SEC Message. Send a formal message to your ARRL Section Manager or Section Emergency Coordinator from your site to claim it. This is tracked separately from the per-radiogram bonus.

ICS-213 Support

If your group practices ARES/RACES emergency communications, FD Commander also supports the ICS-213 General Message format. Enable it under Settings > System Preferences > Enable ICS-213 Message Format to get the standardized form alongside the traditional radiogram format.

W1AW Bulletin

The W1AW Field Day bulletin bonus (100 points) has its own page in the sidebar under W1AW Bulletin. During the event, W1AW (and K6KPH on the West Coast) transmit a special Field Day bulletin on the regular W1AW frequencies. Copy the bulletin via amateur radio and record it here to claim the bonus.

Transmission Schedule

The top of the page shows a transmission schedule so your team knows exactly when to listen. Each entry lists the time (UTC), mode, frequency, and source station. Use the Add Transmission form to build out the schedule from the times published in the ARRL Field Day packet. FD Commander sends reminders 15 minutes before each scheduled transmission so nobody misses a window.

Bulletin Details

When someone copies the bulletin, fill in the Frequency you received it on, the Mode, and the Received At timestamp. Paste the full text of the bulletin into the Bulletin Text field. The bulletin must be copied over the air. It won't appear on Internet bulletins or BBS sites. An accurate copy of the message is required and will be included in your Field Day submission as proof.

Photos

The photo gallery (Event Management > Gallery) gives your group a shared place to collect pictures during the event. Photos are organized into event albums automatically. Each event gets its own album with a cover thumbnail, date, and photo count.

Uploading

Any logged-in user can click Upload Photo from the gallery page or snap a picture directly from a phone browser. Everything is stored on the local server with no cloud dependency, so uploads work even at sites with no internet. Each photo is tagged with who uploaded it and when.

After the Event

The gallery persists after the event ends, so you can browse and download photos later for your club newsletter, social media, or the ARRL Field Day submission page. Photos from previous events stay in their own albums and don't clutter the current one.

Reports

When the event wraps up, go to Reports in the Administration section of the sidebar. Three exports are available:

Cabrillo Export

FD Commander pulls together every QSO across all stations and formats the output to the Cabrillo specification for ARRL Field Day, including your callsign, class, section, and all contact records with correct timestamps, bands, and modes. The exported file is ready to upload directly to the ARRL Field Day submission page. If you transcribed paper logs after the event, those contacts are included too.

ARRL Submission Sheet

Downloads a PDF formatted to the official ARRL Field Day submission sheet. This includes your event details, score summary, and bonus claims in the layout ARRL expects for paper submissions. Useful as a backup record even if you submit electronically.

Logbook Export

Downloads a CSV of all contacts in the logbook. Useful for post-event analysis, sharing with club members, or importing into other logging software.

Audit Logs

The Audit Logs page (Administration > Audit Logs) is a complete tamper-evident record of every significant action taken in the system. It's accessible to System Administrators only.

Each log entry shows the timestamp, the user who performed the action, the action type, and the IP address. Clicking an entry opens a detail modal with the full context, including any changes made. Critical security events are flagged with a warning indicator.

You can filter the log by user, action type, date range, or IP address. Quick-filter buttons let you jump to the last 24 hours, last 7 days, or last 30 days. Results are paginated with 25, 50, 100, or 250 entries per page. The full filtered set can be downloaded as a CSV via the Export CSV button.

Offline Resilience

FD Commander has two layers of resilience. First, the entire platform runs on your LAN with zero internet dependency, fully air-gapped. Second, if a browser temporarily loses its connection to the server (someone trips over the ethernet cable, Wi-Fi drops out), contacts queue locally on the device. When the connection comes back, they sync automatically. A status indicator shows how many contacts are queued and when they've been synced.

Paper Log Transcription

If the server goes down and you fall back to paper for a while, FD Commander has a transcription feature that lets you enter those contacts after the fact with the correct timestamps. This way nothing is lost and your Cabrillo export stays complete. There is a configurable post-event grace period (default: 30 days) during which operators can still enter late contacts.

Network Setup

FD Commander runs on your local network. Operators connect by opening the server's address in any web browser. A typical field setup looks like this:

1

Server

A Raspberry Pi, laptop, or any Linux box connected to your field network via ethernet. Runs FrankenPHP on port 80 and Laravel Reverb (WebSocket) on port 8080.

2

Network

A router or access point providing your field LAN. Can be Wi-Fi, ethernet, or both. No internet connection needed.

3

Client Devices

Any device with a web browser: laptops, tablets, phones. Windows, Mac, Linux, Android, iOS. Connect to the field network and open the server's address.

Firewall Ports
The deploy script opens ports automatically via UFW (Debian/Ubuntu) or firewalld (RHEL). If you're managing your firewall manually, open port 80 (or 443 for HTTPS) for the web interface and port 8080 for WebSocket connections.

Email

Email is entirely optional. By default, FD Commander detects that no mail transport is configured and hides every email-related feature from the UI. Admins set passwords manually, and operators manage their shifts through the web interface. Nobody sees broken links or grayed-out options.

When email is configured, five features appear automatically: the "Forgot password?" link on the login page, a "Send password reset email" option in the admin panel, a "Send invitation email" checkbox when creating users, an "Email Notifications" section on user profiles (security alerts, event notifications, system announcements), and an "Email shift reminders" toggle on user profiles.

Enabling Email

Set MAIL_MAILER to a real transport (like smtp) in your .env file and provide SMTP credentials:

.env Copy
MAIL_MAILER=smtp
MAIL_HOST=smtp.example.com
MAIL_PORT=587
MAIL_USERNAME=your-smtp-username
MAIL_PASSWORD=your-smtp-password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=fieldday@yourcallsign.com
MAIL_FROM_NAME="FD Commander"

Then clear the config cache:

bash Copy
$ cd /var/www/fd-commander && sudo php artisan config:cache

The email features will appear on the next page load. To disable them again, set MAIL_MAILER=log and re-run the cache command.

How detection works
FD Commander checks the MAIL_MAILER value. If it's log or array (the defaults), all email features are disabled and hidden. Any real transport enables them. A backend guard in ReminderService also prevents email sends even if a preference is set in the database while email is unconfigured.

For a detailed walkthrough with provider-specific settings (Gmail, SES, Mailgun), see the Email Setup how-to guide.

Docker

FD Commander includes a Docker Compose setup for containerized deployment. The stack runs two services: an application container (web server, WebSockets, queue worker, scheduler) and a MySQL database container.

Quick Start

bash Copy
# Generate .env with secure defaults (DB password, Reverb keys, etc.)
$ bash docker/setup.sh
 
# Build and start
$ docker compose up -d
 
# Check logs (first run will migrate and seed the database)
$ docker compose logs -f app

The setup script creates .env from .env.example and auto-generates all secrets (DB_PASSWORD, REVERB_APP_KEY, etc.). Run it again on an existing .env to fill in any missing secrets without overwriting existing values. The app will be available at http://localhost (or whichever port you set with APP_PORT).

Configuration

These environment variables in .env are used by docker-compose.yml:

VariableDefaultDescription
APP_PORT80Host port mapped to the container
DB_DATABASEfd_commanderMySQL database name
DB_USERNAMEfd_commanderMySQL user
DB_PASSWORD(required)MySQL password (auto-generated by setup.sh)
DB_ROOT_PASSWORDrootsecretMySQL root password

To run on a custom port:

bash Copy
$ APP_PORT=8080 docker compose up -d

Architecture

The app container runs four processes via supervisord:

ProcessPurpose
Octane (FrankenPHP)HTTP server on port 80
ReverbWebSocket server (port 8080, internal)
Queue WorkerBackground job processing
SchedulerScheduled tasks (runs every 60s)

WebSocket connections reach Reverb through Caddy's reverse proxy at the /app path, so only port 80 is exposed to the network.

First Run

On first startup, the entrypoint script automatically waits for the database, runs all migrations, runs production seeders (event types, bands, modes, sections, roles, permissions, etc.), generates an APP_KEY if not set, generates Reverb WebSocket credentials if not set, and caches configuration, routes, views, and events. Seeders only run once. A marker file in the persistent storage volume prevents re-seeding on subsequent starts.

Data Persistence

Two named volumes store persistent data:

VolumeContents
app-storageUploaded files, logs, framework cache
mysql-dataDatabase files

These survive docker compose down. Use docker compose down -v to remove them (this destroys all data).

HTTPS with a Reverse Proxy

The container serves plain HTTP on port 80. For HTTPS, place a reverse proxy (like Nginx) in front of it. The app includes trustProxies(at: '*') so X-Forwarded-Proto and X-Forwarded-For headers are respected automatically. When behind a TLS proxy, update your .env:

env Copy
APP_URL=https://your-domain.com
REVERB_HOST=your-domain.com
REVERB_PORT=443
REVERB_SCHEME=https

Managing Services

bash Copy
# View all process statuses
$ docker compose exec app supervisorctl status
 
# Restart a specific process
$ docker compose exec app supervisorctl restart queue-worker
 
# View logs
$ docker compose logs -f app
 
# Stop everything
$ docker compose down

Rebuilding After Updates

bash Copy
$ docker compose build
$ docker compose up -d

The entrypoint runs php artisan migrate --force on every start, so new migrations are applied automatically.

Updating

FD Commander includes an update.sh script that pulls the latest code, updates dependencies, runs new database migrations, and restarts services.

bash Copy
$ sudo ./update.sh

Run this at home when preparing for the next event, not during the event itself.