Explanation
A closer look at selected parts of STORM. Pick a topic in the contents and jump straight to it.
First launch after installation
The first launch lets you create a standalone game (without features such as setting up missions, etc.) or simply join a game.
Own game (Single)
A quick game with no organizer - for a group of friends.
- Anyone can create the game without an organizer; the game expires after 36 hours.
- The creating player picks “Own game (Single)”, enters an Access code and their name, and confirms “Create and show QR”.
- Everyone else joins via the join link or QR code shared by whoever created the game.
- The game has a single faction and you cannot create missions or groups in it - it is meant for playing with friends.
Join a game
Joining a game created by an organizer or by someone via Own game (Single).
- The event is created either by an organizer - who sets the number of factions, groups and missions/tasks.
- …or the game is created via the “Own game (Single)” option.
- The player then taps “Scan QR” and scans the code. Or taps a join link from email / WhatsApp / Facebook, etc., shared by the game creator.
Player aggregation on the map
At a larger event there can easily be fifty or more players in a small area. Rendering fifty separate dots needlessly strains the phone, the map slows down, and the commander gets nothing useful out of that clutter anyway - what they mainly need to know is how many people are where.
That is why STORM can aggregate positions: instead of individual dots, the player marked as the group commander carries a single marker with a number showing how many players are in their team.
Example: Five groups of ten players = fifty people. Without aggregation, fifty dots on the map. With aggregation, five markers, each showing “10”. The commander instantly sees there are fifty players on site, the map stays readable and rendering stays smooth.
What you need for it
For a team to collapse into a single marker on the map, two things must be in place:
- Mark the team commander On one player in the team, open Settings → Player in the app and tick “Commander” in the “TEAM” section. That player then represents the team on the map.
- Turn on the map filter On the map open Filter and, under “Team display”, tick “Commanders only”. In each team you then see only the commander with a numeric badge; your own position is always visible.
What the “Team player count” field does
The number shown on the commander is driven by the “Team player count” field in Settings → Player:
- 0 = automatic count: only real players who are alive and online (with the app running) are counted. The commander on the map then carries a number equal to the sum of active players.
- A specific number (e.g. 10) = manual override: the commander shows exactly this value regardless of how many people actually run the app. Handy when a team has ten people but only one or two have the app - the map still shows “10”.
- The value applies to all team members; you only set it once.
What you gain
- Less map-rendering load - smoother operation even on weaker phones.
- A clearer map - the commander sees force distribution, not a cloud of dots.
- The number on the marker matches the current player count of the group.
Remote ID drone detection
Every drone is legally required to broadcast its identification and position - so-called Remote ID. It is an open standard (ASTM F3411, also known as Open Drone ID) and it is broadcast unencrypted precisely so that anyone can check what is flying overhead.
STORM listens for that broadcast and draws the detected drone straight onto the game map. The receiver is purely passive - it transmits nothing, never talks to the drone, and needs no cooperation from the pilot. All you need is to be within radio range; you don't have to own the drone or be paired with it.
What matters most is where the position comes from: the coordinates are read straight out of the radio broadcast, i.e. from the drone's own GPS. The position of the phone that picked up the signal is never mixed in - and if the drone does not report its position, STORM would rather not show it at all than guess.
What it means in a game: The enemy launches a drone to scout. The moment it comes within range of any phone with reception enabled, or within range of the ground sniffer, it appears on everyone's map as a red object with a question mark. You can see that you are being watched, where the drone came from and how high it is - and the pilot has no way of noticing.
Two paths a detection takes into STORM
Remote ID can be picked up either by a player's phone out in the field or by the sniffer owner's fixed device. Both end up on the same map:
- A player's phone - reception is opt-in under Settings → GPS → Drone via the “Receive Remote ID” switch. It is off by default. Works on Android 11 and newer, and only while the app is in the foreground.
- A ground sniffer - a standalone box with its own antennas that the sniffer owner mounts on a mast. Its coverage depends on where it is placed and how powerful it is; tested with weaker 5dBi antennas the range was over 2 km with line of sight. It listens for Remote ID over both Wi-Fi and Bluetooth, and reports detections to STORM over the internet. Players need to do nothing at all.
How to pair your own drone
Pairing tells STORM that a particular drone is yours. From then on it positions itself on the map and is visible only to your faction and its allies.
- Find the serial number Turn the drone on and look at STORM - it shows up on the map as an unknown object. Tap it to open the drone card, which carries the serial number with a copy icon next to it.
- Enter it in the app Open Settings → GPS → Drone section, paste the serial number into the “Serial number (Remote ID)” field and confirm with Pair.
- Done The drone appears on the map by itself on the first detection and keeps positioning itself from then on.
Anyone can pair: A drone does not have to be paired by its pilot - any player who can see it on the map can do it. You spot a drone, tap it, and you know it is yours? Pair it. One pairing is enough and it applies to the whole faction.
Who sees which drone
The whole rule rests on a single question: does the drone have an owner?
- An unpaired drone belongs to nobody, so there is nobody to hide it from. Every player of every faction sees it, drawn in red with a question mark and the label “Unknown”. A foreign aircraft over the field is information that belongs to everyone equally.
- A paired drone is its faction's reconnaissance asset. Only its operator's faction and their allies see it - exactly the way a player position behaves.
- One consequence catches people out: pairing someone else's drone by its serial number hides it from the opposition. While it is unknown everyone sees it; the moment somebody pairs it, it disappears for everyone outside their faction. Pairing a foreign aircraft “just to have it named” therefore stops the other faction from pairing it = unfair. Airsoft is a fair-play game and the whole of STORM is built on that: if you don't know the serial number of a drone in your own faction, leave it unpaired.
What you see about a drone on the map
- A quadcopter icon rotated to the direction of flight and colored by faction; an unknown object is red with a question mark.
- Tapping it opens the drone card: model, serial number, altitude, speed, distance from you and the age of the last fix.
- Battery level only for your own paired drone - Remote ID does not broadcast battery, the operator reports it.
- Signal loss is visible in advance: after a minute of silence the icon dims and a countdown appears. The server only removes the drone from the map after five minutes, so you get roughly four minutes in which the drone leaving is visible up front.
- Both the appearance and the loss of a drone are written into history along with coordinates - from history you can jump straight to the spot on the map.
- Organizers also see drones on the admin live map and in the event replay, where the flight trace plays back just like player movement. Replay only has a trace for events played after this feature was deployed.
Limitations worth knowing about
- A phone only picks up Remote ID over Wi-Fi Beacon. Drones and add-on RID modules broadcasting over Bluetooth are picked up by the ground sniffer instead.
- iOS cannot do Remote ID at all - Apple does not let apps scan Wi-Fi. Reception on a phone is therefore Android 11 and newer only.
- Android itself throttles Wi-Fi scans to roughly two per minute, so the marker moves in jumps. It can be turned off in the phone's Developer options (“Wi-Fi scan throttling”); the app reports the state but can do nothing about it on its own.
- A drone hovering in place reports at most once a minute. That is not a reception dropout but a safeguard against pointless data traffic.
What you gain
- You know about a drone over the field even when nobody reported it - enemy reconnaissance included.
- Your own drone positions itself on the map, nobody has to drag it around by hand.
- Data traffic is negligible, in the order of hundreds of kilobytes per hour - a weak signal is no problem.
Air defense and shooting down drones
Drones over the field are not untouchable. A faction can shoot down enemy drones in two ways: with an air-defense (AA) zone or by aiming at the drone with the phone camera. The server decides the hit by itself from Remote ID data, that is the drone's real position and altitude. Nobody reports anything by hand and nobody argues about whether they hit.
The condition for flying at an event is a drone paired in STORM (serial number) with Remote ID switched on. A drone that does not broadcast Remote ID is invisible to air defense, but the organizer gets a record of an unregistered drone in the zone.
Example: The organizer sets a ceiling of 50 m above terrain and a dwell time of 20 s. An enemy reconnaissance drone drops below 50 m above an AA site and stays there for half a minute. The server shoots it down, the pilot gets a full-screen "DRONE SHOT DOWN, land within 0:58" and the drone is out of the game for 15 minutes.
AA zone
An AA site is a point with a radius and belongs to a faction. An enemy drone that stays within the circle for the set time continuously, below the ceiling above terrain, is shot down. Above the ceiling flying is free, the ceiling protects the players below the drone.
- The organizer creates sites in the administration (Event → Drones → Air defense): name, faction, radius, position picked on the map.
- Rules for the whole event: dwell time in the zone, ceiling in meters above terrain, time allowed to land and time out of the game (0 = until the organizer restores the drone).
- Height above terrain is computed from the Remote ID altitude and the elevation model, so the ceiling applies the same over a hill and in a valley.
- Allied drones are not shot down by the zone. Sites cannot be destroyed.
Mobile AA from a perk
A site does not have to stand only where the organizer placed it. The Air defense perk in a Tactical asset point has its own ceiling, radius and duration, and the faction builds it in the field.
- The faction commander releases the perk in the Depot. All faction players get an Air defense placement card in the TOC.
- A player walks to the spot and taps Place. Their GPS position with accuracy up to 50 m is used.
- The commander gets a push and approves or rejects the request in the TOC. The commander places it without approval.
- Once approved, the site shoots down like any other, is hidden from the enemy and switches itself off when the duration expires. The TOC card shows the standing AA and a countdown.
Aim at a drone with the phone
The second way needs no site. The player opens Tools → Aim at drone, the display shows the camera image and a crosshair. They point the phone at the drone and hold it in the crosshair.
- The phone sends the server the direction of the rear camera (azimuth and elevation above the horizon) and its position. The server compares it with the real direction to the enemy drone from Remote ID.
- When the deviation stays within tolerance for the set time continuously, the drone is shot down just like in a zone. The sight shows "Hold! 3 s more" and finally "HIT".
- The organizer enables aiming and sets the aiming time, maximum distance and direction tolerance. A phone compass is off by 10 to 20°, the tolerance accounts for that.
- Needs a data connection, EDGE is enough. A dead player cannot aim.
Warning: Aiming relies on the phone compass, and even a plain piece of metal with no electronics can throw it off. At 200 m a 15° error is about 54 m sideways, so the server sees a drone that is in your crosshair as outside the tolerance. STORM does account for this deviation, though, and it is set in the administration.
- The compass is disturbed by a steel gun, a steel magazine, a steel helmet, another phone or a radio next to the phone, and above all by a magnet, e.g. in a phone holder or case. A plastic or aluminium gun matters little.
- While aiming, keep the phone away from your gun and gear, ideally at arm's length, and without a magnetic case.
- Before the event calibrate the compass with a figure-eight motion and test it: point at a distant fixed object, bring the gun within 10 to 20 cm and watch whether the azimuth changes.
What happens after a shoot-down
- The pilot gets a full-screen DRONE SHOT DOWN with a countdown of the time allowed to land. The message arrives over WebSocket, push notification and the mesh, so even without data.
- The server recognizes from Remote ID that the drone has landed. Flying past the deadline is recorded as "ignoring the shoot-down" and the organizer is alerted.
- The drone is out of the game for the set time and then returns by itself. The organizer can restore it earlier with the Return to game button.
- Both the pilot's faction and the faction that shot it down get a message and a history record. Every event has a record in the administration with position and height above terrain as evidence.
Who sees the AA zone
- On the players' map the zone is a dashed circle in the faction color with the ceiling in the label, so a pilot can avoid it.
- A site marked On map is visible to everyone. A hidden site is seen only by its own faction and allies, the server does not send it to the enemy at all.
- Radar reveals hidden AA too: while a radar (from a mission or a perk) is active, its holder sees the enemies' hidden sites as well.
Limitations worth knowing
- Air defense sees drones whose Remote ID STORM picks up, by phone or by the ground sniffer. It is tested with a sniffer that listens on Wi-Fi 2.4 GHz, 5.8 GHz and Bluetooth 5.
- The server computes height above terrain from the Remote ID altitude and its own elevation tiles, which it downloads for the event area by itself. The player needs nothing for this. When the server has no elevation data, the AA zone shoots nobody down, because without height above terrain it cannot tell whether the drone is below the ceiling.
- The sight's debug mode shows the deviation to the nearest enemy drone. Useful for measuring compass accuracy, but it reveals drone positions, so switch it off at a real event.
What you gain
- Drones stop being invulnerable and aerial reconnaissance has a counter the pilot has to respect.
- The server decides the hit from data, not an argument on the field. Every shoot-down has a record with position and altitude.
- The ceiling above terrain keeps drones at a safe height over players' heads, below it they risk being shot down.
Pairing a mesh node with STORM
Mesh in STORM has two parts. First the organizer enables it on the server and hands out the packages for configuring the nodes. Only then does a player pair their mesh node (e.g. Heltec T114) with the phone over Bluetooth.
Part 1: Server setup (event organizer)
The very first thing is that the event organizer enables mesh in the administration. Without it mesh does not work for the event: nodes cannot be paired and the server ignores their packets.
-
Enable mesh for the event
In the administration open the event, the MESH tab, check the LoRa region (EU_868 for Europe) and the modem preset (LONG_FAST by default) and click Enable mesh. The server generates channels for the event, each faction and each group, plus a broker account for each group's gateway.
Step 1: Event → MESH → Enable mesh -
Each group has its own mesh package
Once enabled, the created groups are listed. Mesh messages have four levels: faction (everyone sees the faction's messages), groups (group commanders talk to each other), teams (messages within a team) and individual players (you can message any player in the whole faction). For this granularity to work, each group has its own mesh package. Click Package next to the group.
Step 2: list of groups, each with a Package button -
QR code for configuring the mesh node
A QR code with the mesh node configuration (region, preset and the event, faction and group channels) appears, together with the broker login for the group's gateway. Distribute the package to everyone who will run a mesh gateway and belongs to that group. The node is configured by scanning the QR code in the Meshtastic app. Only once the node is configured correctly does the client part come next.
Step 3: the group's mesh package with the QR code and gateway details TIP: Configure the node over USB with a script (alternative to scanning the QR code)
The node can also be configured without the Meshtastic app. In the group package click Player link, which puts the channel link on the clipboard. Then connect the node to a computer with a data USB cable and run the mesh-provision script, which sets the channels, region, preset and everything else and verifies the configuration on the node.
In the group package click Player link, the channel link is on the clipboard What you need
- A node (Heltec T114, V3, LilyGO T-Beam, RAK and others, the model does not matter) and a data USB cable. A charge-only cable without data wires will not find the node.
- The STORM channel link from the organizer: in the administration, event → MESH → group package → Player link. The link contains the channel key, do not share it publicly.
-
Python 3 and the Meshtastic library (installed once):
- Windows: install Python from python.org (tick "Add Python to PATH"), then in PowerShell:
py -m pip install --upgrade meshtastic - Linux (Debian/Ubuntu): after installing, add yourself to the dialout group and log in again (USB access):
sudo apt install python3 python3-pip && pip3 install --upgrade meshtastic && sudo usermod -aG dialout $USER - macOS:
brew install python && pip3 install --upgrade meshtastic
- Windows: install Python from python.org (tick "Add Python to PATH"), then in PowerShell:
Running it
Open a terminal (Windows: PowerShell) in the folder with the script and run:
python3 mesh-provision-vx.y.z.py # Linux, macOS py mesh-provision-vx.y.z.py # WindowsReplace x.y.z with the version number of the downloaded file, currently mesh-provision-v1.0.0.py.
The script finds the node port by itself and asks for the channel link: paste it from the clipboard and press Enter.

The script shows everything it will set. Type "y" and press Enter, the configuration is written to the node. 
After writing, the node reboots. The script may fail to reconnect on its own, in that case press Ctrl+C. Do not be alarmed by the ugly messages, the write has already happened. Finally verify the configuration with the --check parameter:
python3 mesh-provision-vx.y.z.py --check # Linux, macOS py mesh-provision-vx.y.z.py --check # Windows
When the check ends with "everything matches", the node is configured.
Part 2: Pairing the node on the phone (player)
To make pairing go smoothly, we recommend the following steps.
- Unpair the node in the system If the node is already paired, e.g. for the Meshtastic app, first unpair it in the system of your mobile device (phone or tablet). In the Bluetooth settings, tap the arrow on the right next to your mesh node.
- Tap Unpair This unpairs a previously paired mesh node. If the node was not paired, skip ahead to step 3.
- Open STORM, Settings → MESH and tap Detect In the STORM app open Settings, the MESH tab, and tap the Detect button. The phone starts looking for a mesh node in range.
- Enter the PIN shown on the mesh node display A pairing prompt appears for the node, here named Bali_33f6. Type the PIN that the mesh node shows on its display at that moment into the text field and confirm with OK.
- Pairing succeeded After pairing, "BLE session active" at the bottom and both ID and BLE indicators in the top right must be green. In addition, the Node ID field must contain the ID of your node, which detection fills in automatically. The "No contact - node hasn't been heard yet" message stays red for now: it turns green once the node sends its first packet to the STORM server over MQTT.
- All green As soon as the server receives the first packet, the status switches to "Active" and everything is green. The mesh is ready to use.
What you gain
- Mesh works even in places with no mobile data signal. Online players learn the positions of offline players and vice versa.
- A player with poor or no signal can create markers, draw on the map and scan mission QR codes.
- The condition is a mesh gateway within range of the nodes that itself has a data connection. The gateway is usually placed on high ground where there is signal, and the nodes must be within its range.
Elevation profile and visibility
Players and commanders can check right on the map whether one spot can be seen from another. Two tools: Terrain profile between two points and What is visible from here, a visibility map around a chosen point. Both work without signal, and the organizer has the same tools on the live map in the administration.
STORM takes elevations from a worldwide elevation model with 30 m resolution. The organizer does nothing: the server downloads the needed tiles by itself according to the event area, and players get them together with the offline map, roughly 1 MB per event. In the field no data flows at all, the phone computes both the profile and the visibility.
Example: The commander taps the hill where they want to post a lookout, picks a 2 km range and the "standing" eye height. The map turns green where the lookout can see and red in the dead ground behind ridges. A terrain profile to the enemy flag then shows which ridge blocks the view.
How to open it
- Tap the map The bearing panel opens above the point with the distance, azimuth and elevations.
- Tap What can be seen from here The second button in the panel. Next to it is Terrain profile, which opens just the profile from my position to the point.
- Visibility from a point opens A mask is drawn on the map: green is visible from the point, red is hidden. Below is the bottom bar with the observer, heights and range.
- Tap the Pin profile chip A terrain profile from the observer to a target you tap on the map is added to the mask. The whole thing then looks like the second picture.
Terrain profile
Tapping the map opens the bearing panel with a Terrain profile button. Start is my position, the target is the tapped point. Below the map a terrain profile between the two points is drawn, with the line of sight from the observer's eyes to the target.
- Segments are colored: green is visible, red is hidden behind terrain. The ridge that blocks the view is marked in the chart.
- The VISIBLE or HIDDEN verdict tells whether the target at the chosen height can be seen from the observer's spot.
- Start and Target chips: tap a chip and then the map to move that point. Start does not have to be my position, a profile can be made between any two points.
- Probe: tapping the profile line on the map places a yellow probe and the chart shows the distance and elevation at that spot. The probe can be dragged along the line with a finger.
What is visible from here
The second button in the bearing panel. Around the chosen point where the observer stands, a mask is drawn on the map: green areas are visible from that spot, red ones are hidden. Below the map is the percentage of visible area within range.
- Range 1, 2, 3 or 5 km, mask opacity is adjustable. A larger range takes longer to compute.
- To the peak: moves the observer to the highest point within 250 m. Useful when the summit marker on the map sits next to the summit of the elevation model.
- Pin profile: adds a terrain profile from the observer to a target you tap on the map, on top of the visibility mask. The mask stays.
Eye height and target height
Both tools take into account how many meters above the terrain the observer's eyes are and how high the thing you want to see is. Presets switch right on the map with + and − buttons.
- Eye height: lying 0.3 m, crouching 1.0 m, standing 1.7 m, tree stand 5 m, drone 60 m.
- Target height: standing person 1.7 m, lying person 0.3 m, vehicle 2.5 m, drone.
- Presets are editable and custom ones can be added, in Tools → Elevation profile. The default range, the elevation model status and a switch for computing the profile right after tapping the map are there too.
Sharing with the team
A profile or a visibility mask can be sent to the team with the Send to team button. No image is sent, only the parameters, about 40 bytes. The recipient gets a message with an Open on map button and their phone computes the result itself. It also goes through the mesh.
Limitations worth knowing
- The model knows terrain, not forest or buildings. In a forest the real view is shorter: treat the result as optimistic when planning a lookout and as pessimistic when sneaking.
- Model resolution is 30 m. A summit marker on the map may sit next to the summit in the model, which is what the To the peak button is for.
- The elevation model downloads with the offline map. Without it neither the profile nor the visibility works, the status is in Tools → Elevation profile. Places without data are gray in the mask, not red.
- An event without an uploaded game map has no area, and without an area the model is not prepared. The organizer can enter the area manually in the administration (center and size in km).
What you gain
- You place a lookout or observation post where there really is a view, not where the map merely looks high.
- While advancing you see which ridges cover you from an enemy hill and where you would expose yourself.
- Works without signal and puts no load on the server: the phone computes everything from a model downloaded at home.
Station - a shared phone for mission QR codes
Not every player wants to carry their own phone in the game: it is expensive, they worry about it, or they simply do not want it there. So the organizer gets a cheap phone, runs STORM on it in Station mode and places it right at the mission, next to its QR code. A player of any faction who gets to the mission taps their faction on the phone, scans the mission QR and the capture is credited to their faction.
The station phone serves all factions and nobody logs in on it. One station QR can connect several phones, so every mission can have its own. The capture history shows 📍 Station and the name of the faction that scanned the QR instead of a player name.
Part 1: Enabling it (organizer)
-
Open TOC and click Station
In the administration open the event, the TOC tab and the Station button on the right.
Step 1: the TOC tab (1) and the Station button on the right (2) -
Set a PIN and enable the station
Enter an organizer PIN (4 to 8 digits) and click Enable station. The PIN protects the station phone: without it nobody can disconnect or switch it. Once enabled, the window shows the station QR code with a link below it; the QR can also be printed.
Step 2: organizer PIN and the Enable station button
Once enabled: the station QR code and link (blurred on purpose here, it grants access to the station). Print, regenerate QR, change PIN, disable. -
Connect the phone
On the station phone open the STORM app and on the start screen, under Join a game, tap Scan QR. Scan the station QR from step 2, or simply open the link on the phone. The phone switches to Station mode.
Step 3: STORM app start screen, the Scan QR button
Part 2: Playing at the station
-
The player taps their faction
The phone shows a tile for every faction with its flag and colour.
Station screen: choosing a faction. Language switch and menu in the top right. - Scans the mission QR The QR scanner opens; the top line says which faction is scanning.
- Reads the result A full-screen message shows the mission, the faction and the result, e.g. Point claimed. It closes by itself after 10 s and the station waits for the next player.
Good to know
- The station must be online with location turned on. Without signal nothing is sent and the phone says so.
- Works with all mission types. Transport delivery via the station needs no photo.
- The station can only be disconnected from the ☰ menu with the organizer PIN. After three wrong attempts disconnecting is locked for 2 hours.
- Whoever has the station QR or link can capture missions for any faction. Do not show it to players; it is only for connecting the station phones. Generating a new QR invalidates the old QR and link and disconnects all phones.
- Players switch the language themselves without a PIN, 11 languages are available.
What you get
- Players without a phone, with a flat battery or without the app can still play missions.
- The cheapest phone with a camera and data placed at the mission is enough, no player logins.
- Results go live into the same score and history as captures from players' phones.