The 9M2PJU Mod LoRa APRS Tracker: A Tiny Malaysian Companion for the SOTA, POTA and the APRSMY Sunday Net

There is something quietly satisfying about a small box that knows where it is, tells the world where it is, and does it all without a SIM card, a subscription, or a phone in your pocket. You clip it to your backpack, you switch it on, and a few seconds later your callsign appears on the APRS map, bouncing along whatever path you happen to be walking.

That is the idea behind the 9M2PJU Mod LoRa APRS Tracker, a Malaysia-tuned fork of the lovely LoRa APRS Tracker by Ricardo Guzman (CA2RXU). It runs on the Heltec Wireless Tracker board, a pocket-sized ESP32-S3 with a LoRa radio, a GPS module, and a tiny 80×160 colour TFT screen. It speaks APRS over LoRa on 433.400 MHz, which is the friendly part of the band we use here in Malaysia.

Last updated: July 2026.

What It Is, in One Breath

It is a self-contained APRS tracker. No phone required, no cellular network, no monthly bill. You power it on, the GPS finds the sky, and it starts broadcasting your position, callsign, and APRS symbol over LoRa to any nearby iGate. From there, your dot shows up on aprs.fi, HamHut, and the rest of the global APRS network, just like a regular RF beacon.

The firmware is built and maintained by 9M2PJU, forked from CA2RXU’s open source project and tuned for Malaysian operators. There is a browser-based flasher at lora.hamradio.my so you do not even need to install PlatformIO to get going.

The Hardware: A Pocket-Sized Shack

The target board is the Heltec Wireless Tracker, and it is a genuinely charming little piece of kit:

  • ESP32-S3 dual-core processor with WiFi and Bluetooth
  • SX1262 LoRa radio for the 433 MHz band
  • U-blox GPS for position
  • 0.96 inch ST7735 colour TFT, 80 by 160 pixels
  • Two buttons (BOOT and RST) for menu navigation
  • USB-C for power and flashing
  • 8 MB flash with a partition layout that leaves room for a SPIFFS filesystem holding the web configuration page

It fits in the palm of your hand. With a small 18650 cell and a 3D-printed case, it becomes a proper portable tracker you can take up a hill, on a motorbike ride, or to a SOTA activation.

What 9M2PJU Changed for Malaysia

The original CA2RXU firmware is excellent, but it is tuned for European and world-wide defaults. The fork keeps all of that goodness and adds a layer of Malaysian comfort on top.

LoRa on 433.400 MHz

Preset 1 is set to 433.400 MHz, which is where Malaysian LoRa APRS activity lives. The on-screen label reads LoRa[MY] instead of LoRa[Eu], and when you switch frequencies the change message says MALAYSIA instead of EU/WORLD. Small touches, but they make the device feel like it belongs here.

The LoRa modem settings for the Malaysian preset are sensible for low-power portable work: spreading factor 12, 125 kHz bandwidth, coding rate 4/5, and 20 dBm output. That is a slow but robust configuration, the kind that gets your packets through trees and urban clutter at the cost of a slightly longer air time per beacon.

Malaysia Time on the Display

The clock on the screen shows Malaysia Time (UTC+8), so you do not have to do the mental arithmetic every time you glance at it. The APRS packets themselves still use UTC, because that is what the standard requires, but what you read on the TFT is local time.

 

APRSMYSunday Net Check-In

This is the feature I am most fond of. The original firmware has APRSThursday, the European net check-in. Malaysia has its own Sunday Net run under the callsign APRSMY, and this fork adds a dedicated menu entry for it.

To check in:

  1. Go to Messages, APRSMYSunday, Check In
  2. Pick Quick Check In to send the canned message CHECK #APRSMYSunday Net from LoRa Tracker 73!
  3. Or pick Custom message to type your own text, which gets sent to APRSMY with the prefix CHECK #APRSMY

No phone, no laptop, no digging through menus on a phone app. You check in to the net from the side of a hill, with cold fingers, in about ten seconds. That is the whole point of having a tracker.

Bulletins Reception (BLN)

Receive and store APRS BLN bulletins (broadcast announcements addressed to BLN / BLN0BLN9) in a dedicated Bulletins view, separate from your personal APRS messages.

Bulletins are general-purpose broadcasts sent to all stations (weather alerts, net announcements, emergency notices, event info, etc.) rather than to a specific callsign. Most APRS clients (APRSISCE, YAAC, etc.) put them in a separate “Bulletins” folder, this fork now does the same.

Distance filter: 500 km , only bulletins from senders within 500 km of your GPS position are stored. The tracker caches the last known position of every station it hears (from their beacon packets), then calculates the distance when a BLN bulletin arrives. If the sender is beyond 500 km, the bulletin is silently dropped. If the sender’s position is unknown (no beacon heard yet) or your GPS has no lock, the bulletin is stored anyway (benefit of the doubt).

Dedup: full file scan , before saving a bulletin, the tracker reads the entire /bulletins.txt file and checks for an exact match (sender + addressee + text). If a duplicate is found, it’s skipped. This prevents duplicate bulletins from digipeated/repeated packets filling up storage.

Default: OFF , you must enable bulletin reception explicitly.

A Display That Is Actually Pleasant to Read

The original firmware uses a yellow-on-red header and left-aligned white body text. It works, but on a tiny 80×160 screen it can feel a bit cluttered. The fork redesigns the display from scratch:

  • Navy blue header bar with bright yellow text, centred
  • Centred body text so everything lines up neatly on the narrow screen
  • Colour-coded lines: red for GPS warnings, orange for battery and button hints, green for altitude and speed, yellow for GPS coordinates and the Maidenhead grid, cyan for date and time, grey for the last heard station, white for everything else
  • Coloured APRS symbols: cars and bikes in red, ships in blue, houses and antennas in green, balloons and aircraft in magenta, trains in orange, runners and weather stations in cyan
  • A 2-pixel status accent bar down the left edge: green when GPS is locked, yellow while it is searching, blue when Bluetooth is connected, grey when idle

The startup screen reads 9M2PJU Mod followed by the version date, so you always know which firmware is on the board.

Sensible Default Config

Out of the box, the shipped config is ready for a Malaysian operator:

Setting Value
Callsign 9M2PJU-7 (all three profiles)
LoRa frequency 433.400 MHz
Profile 1 symbol runner [
Profile 2 symbol car >
Profile 3 symbol motorcycle <
GPS Eco Mode off (GPS always active)
APRS path WIDE1-1
Display timeout 3 seconds
Winlink email [email protected]

You will want to change the callsign to your own, of course. That is easy to do from the web configuration page after flashing.

Smart Beaconing Tweaks

Highway speed limits

Europe (EU)

• Most common: 120-130 km/h (the European average is 122 km/h)
• Highest: Bulgaria and Poland at 140 km/h
• Germany Autobahn: no general limit, 130 km/h recommended
• Lowest: Netherlands 100 km/h (daytime), Cyprus 100 km/h
• Rural roads: typically 80-90 km/h
• Urban: 50 km/h

United States

• Most common: 70 mph (113 km/h) on rural interstates
• Highest: Texas at 85 mph (137 km/h) on one segment, several western states at 80 mph (129 km/h)
• Eastern seaboard: 65-70 mph (105-113 km/h)
• Lowest: Hawaii at 60 mph (97 km/h), DC at 55 mph (89 km/h)
• Rural non-interstate: typically 55-70 mph (89-113 km/h)

Malaysia (for comparison)

• Highway (PLUS North-South Expressway): 110 km/h
• Federal/rural roads: 90 km/h
• Urban: 50-60 km/h

How this explains the original CA2RXU values

The original Car profile had fastSpeed=70 km/h. At first glance this seems low for a highway limit of 120-130 km/h (EU) or 113+ km/h (US). But here’s the key insight:

fastSpeed is not the speed limit, it’s the speed above which beaconing is capped at the minimum interval (fastRate=60s). The algorithm doesn’t stop tracking above fastSpeed; it just stops increasing beacon frequency. So at 70 km/h youbeacon every 60s, and at 130 km/h you also beacon every 60s. The fastSpeed threshold determines where the proportional scaling band ends.

The original author’s reasoning was likely:

1. 70 km/h covers the meaningful tracking range. Below 70 km/h, you’re in city/suburban traffic where direction changes and speed variation matter, proportional scaling helps capture those changes. Above 70 km/h, you’re on a highway
moving steadily, 60s intervals (1 km between beacons at 60 km/h, ~2 km at 120 km/h) is already fine for APRS tracking. There’s no tracking benefit to beaconing more frequently at 130 km/h than at 70 km/h.
2. TX airtime at SF12 is expensive. Each beacon at SF12/125kHz takes ~2.5 seconds. Beaconing every 30s at highway speed would eat significant airtime and battery for no real tracking improvement, APRS isn’t turn-by-turn navigation.
3. The original values weren’t designed for any specific country’s speed limit. They’re a general-purpose compromise. The fastSpeed=70 is a “good enough” threshold: above that speed, you’re covering enough ground that 60s intervals
give sufficient position resolution on the APRS map regardless of whether the limit is 110 (Malaysia), 120-130 (EU), or 113+ (US).

Why our tweak still makes sense

Our change of fastSpeed from 70→80 for both Car and Motorcycle wasn’t about matching a speed limit, it was about extending the proportional band so that the 70-80 km/h range (typical Malaysian suburban highway / PLUS highway entry
speed) gets more granular tracking instead of jumping straight to the flat 60s (now 75s) rate. Above 80 km/h the behavior is the same: flat minimum interval.

The bigger battery win in our tweak actually comes from raising fastRate (60→75s) and slowRate (120→150/180s), those apply at all speeds, not just in the proportional band. The fastSpeed change is a tracking-quality refinement, not a battery change.

So the original author’s values were a reasonable general-purpose design, not specifically tied to EU or US speed limits. Our Malaysian tweak preserves the same algorithmic philosophy, just shifts the thresholds to better match local driving patterns and trades a small amount of tracking granularity for meaningful battery savings.

SOTA and POTA Spots and Alerts, Right From the Tracker

This is the feature that surprised me the most. Tucked inside the Reports menu, alongside the weather report and the nearest hospital, police, and fire station lookups, there are two entries for SOTA (Summits on the Air) and POTA (Parks on the Air). Each one opens into two submenus: Spots and Alerts.

When you select SOTA Spots, the tracker sends a LoRa APRS message to the 9M2PJU-4 gateway asking for current SOTA spot activity. The gateway fetches the latest spots from the SOTAwatch API, packages them into APRS message packets, and sends them back to your tracker over LoRa. You get a tidy list of who is activating which summit, right on the little TFT screen, with no phone and no cellular signal needed.

The same works for SOTA Alerts (upcoming activations other hams have posted), POTA Spots (who is in a park right now), and POTA Alerts (planned park activations). Four queries, one gateway, all over LoRa.

The menu path is simple:

  1. Go to Reports, SOTA (or POTA)
  2. Pick Spots to see who is active right now
  3. Pick Alerts to see what activations are coming up

The request goes out as a short APRS message to callsign 9M2PJU-4, which is the Malaysia LoRa gateway that handles these lookups. If you are within LoRa range of that gateway, the reply comes back in a few seconds as a series of APRS messages. If you are out of range, the request still goes out but nobody answers, which is the same gentle limitation as the APRSMYSunday check-in.

For a SOTA activator on a summit with no cellular coverage, this is a lovely thing. You climb the hill, you set up your station, you beacon your position, and then you check SOTA Spots to see if anyone else is on a summit nearby that you might work. All from the tracker in your hand, all over LoRa, all off-grid.

HF Propagation Report

Check current HF propagation conditions from the 9M2PJU-4 APRS Bot, right from your tracker. Useful before a SOTA activation, DXpedition, or anytime you want to know if the HF bands are open.

  • Go to Reports → HF Report, It sends prop to 9M2PJU-4
  • The bot replies with current HF band conditions (MUF, solar flux, K-index, band-by-band status)
  • Reply comes back as an APRS message, read via Messages → Read

Full user guide for 9M2PJU-4 APRS Bot: https://hamradio.my/9m2pju-aprs-bot/

Web UI Redesign: Dark Mode and Local Accents

The visual overhaul isn’t just skin-deep on the tracker’s tiny TFT screen; it extends all the way to the browser-based configuration page. The original upstream firmware uses a stark, high-contrast light theme for its web interface, which can be a bit jarring when you are configuring your device in a dark shack or out in the field at night. The 9M2PJU mod rewrites the stylesheet to introduce a sleek, modern Dark Mode interface. The background is a soft, eye-straining-free deep charcoal, balanced with clean white typography and subtle borders that make navigating the various settings tabs a breeze.

To anchor the project firmly to its roots, the top of the configuration page now features a beautiful Malaysian flag accent bar. The vibrant stripes of the Jalur Gemilang stretch across the header, serving as a proud visual reminder of the local community driving this fork. It’s a thoughtful aesthetic choice that transforms a standard utility page into a personalized dashboard built specifically for Malaysian amateur radio operators.

Flashing It: The Easy Way

The friendliest way to get the firmware onto a Heltec Wireless Tracker is the web installer at lora.hamradio.my. It uses ESP Web Tools, which talks to the board over Web Serial directly from the browser. No software to install, no toolchain to set up.

  1. Open lora.hamradio.my in Google Chrome or Microsoft Edge (Firefox and Safari do not support Web Serial)
  2. Plug in your Heltec Wireless Tracker with a USB-C cable, ideally a data cable and not a charge-only one
  3. Click INSTALL, pick the serial port (usually “USB JTAG/serial debug unit”), and click INSTALL again
  4. Wait for the progress bar to finish. The tracker reboots on its own with the new firmware

If the installer cannot connect, put the board into download mode first: press BOOT and RST together, the screen goes blank, then click INSTALL. After it finishes, press RST once to boot into the firmware.

The web installer flashes five parts in one go: bootloader, partition table, boot app, firmware, and the SPIFFS filesystem that holds the default config. So when you are done, you really are done.

Changing Settings Without a Computer

After flashing, the tracker starts up with the Malaysian defaults. To change your callsign, LoRa settings, or anything else, you do not need to plug it back into a computer. The firmware has a built-in WiFi access point for configuration:

  1. On the tracker, enable WiFi AP mode from the menu
  2. On your phone or laptop, join the WiFi network LoRaTracker-AP with password 1234567890
  3. Open 192.168.4.1 in a browser
  4. Change your callsign, symbols, LoRa frequency, smart beaconing, Bluetooth, battery, notifications, Winlink, and more
  5. Save and reboot

The web UI is the same one CA2RXU ships, just with the Malaysian defaults baked in. It is clean, fast, and works fine on a phone screen.

Understanding APRS WIDE Paths for LoRa APRS in Malaysia

When you send an APRS packet from your LoRa APRS tracker, it only travels as far as your radio signal reaches. A digipeater (digital repeater) is a station that hears your packet and re-transmits it so it can travel further like passing a message along a chain of people. The “path” field in your tracker settings tells digipeaters which ones may relay your packet and how many times. The path uses the format WIDEn-N, where the first number is the digipeater type(WIDE1 = fill-in digipeater, like another tracker or a home station; WIDE2 = wide-coverage digipeater, usually a fixed station on a tall building or hill) and the second number is the hop counter how many times the packet may be relayed.

Each digipeater that relays your packet subtracts 1 from the counter, and when it reaches 0, no more relaying. For example, if you send WIDE2-2, digipeater A relays it as WIDE2-1, then digipeater B relays it as WIDE2-0, and it stops your packet traveled 2 hops total. For LoRa APRS in Malaysia, WIDE1-1 is the correct choice. It gives you one relay hop, which is almost always enough to reach an iGATE because LoRa range is already large (2-10 km or more). LoRa is also slow (~300 bps), so every extra hop means another full packet transmission on the air, eating airtime and increasing the chance of collisions. WIDE2-2 and higher paths are designed for VHF radio (144 MHz) where range is smaller and multiple hops are needed on LoRa at 433 MHz, they just waste bandwidth and cause congestion. WIDE1-1 is the global standard for portable and mobile trackers; it simply means “I’m a low-power portable, please relay me once.”.

If you have no iGATE nearby but a friend with a LoRa APRS tracker is near one, they can turn ON their digipeater (Extras → Digipeater) to relay your packets to the iGATE. Both trackers must use the same path (WIDE1-1), since thedigipeater only relays packets whose path matches its own configured path. You must also be within LoRa range of each other. To verify it’s working, search your callsign on aprs.fi you should see your friend’s callsign with an asterisk (*) in the path column, confirming their digipeater relayed your packet. Avoid WIDE3-3 or higher (considered interference), WIDE1-2 (non-standard), and RELAY (obsolete legacy path). Stick with WIDE1-1 one hop is all you need.

A Few Honest Notes

The LoRa range is line of sight and depends heavily on your antenna and terrain. With the stock whip antenna you will get a kilometre or two in urban areas and several kilometres with a clear path. With a proper elevated antenna you can do much better. It is not a satellite communicator and it will not replace a PLB for serious backcountry use.

The GPS is a U-blox module and it is competent, but a cold start can take 30 to 60 seconds the first time you power on, especially indoors. Give it a clear view of the sky for its first fix and it will be much faster afterwards.

The Winlink password in the shipped config is a placeholder. If you want to use the Winlink email feature to send position messages to a gateway, you will need to set your own real Winlink account password from the web UI.

The APRSMYSunday check-in only works if there is an iGate within LoRa range that is listening on 433.400 MHz and forwarding to the APRS-IS. In the Klang Valley that is usually fine. In the middle of nowhere, your check-in packet will go out but nobody will hear it. That is just how RF works.

Why a Tracker Like This Matters

APRS is one of those parts of amateur radio that rewards tinkering. You can run it from a phone app, and many people do, but a phone app depends on cellular coverage and a charged battery and a data plan. A dedicated LoRa tracker depends on nothing but a charged battery and a view of the sky.

It is also a quiet kind of fun. You are not making contacts in the traditional sense. You are just being visible on the map, leaving a little trail of packets behind you, and contributing to the network for everyone else who is watching. When someone else’s dot moves on aprs.fi, that is their tracker talking to an iGate, and your iGate might be the one that heard it.

The 9M2PJU mod is a small attempt to make that experience feel native to Malaysia. The right frequency, the right timezone, the right net check-in, and a display that is calm to read at a glance. Nothing more than that, and nothing less.

Try It on Your Next Outing

The next time you are heading out for a drive, a ride, or a walk with a view, clip one of these to your bag. Flash it from lora.hamradio.my, set your callsign from the web UI, and let it beacon. By the time you reach the top of the hill, your dot will already be on the map, and the Sunday Net will know you checked in.

73, and may your packets be heard.

Sources and Further Reading

Suggested meta description: The 9M2PJU Mod LoRa APRS Tracker is a Malaysia-tuned APRS firmware for the Heltec Wireless Tracker, running LoRa on 433.400 MHz with a browser-based flasher.

Suggested WordPress excerpt: A relaxed tour of the 9M2PJU Mod LoRa APRS Tracker, a Malaysia-tuned APRS firmware for the Heltec Wireless Tracker with 433.400 MHz LoRa, Malaysia Time, APRSMYSunday net check-in, and a browser-based flasher.

Suggested categories: Amateur Radio, Ham Radio, LoRa, APRS

Suggested tags: APRS, LoRa, LoRa APRS, 9M2PJU, Heltec Wireless Tracker, ESP32, ESP32-S3, 433 MHz, Malaysia, APRSMYSunday, Winlink, smart beaconing, GPS tracking, ham radio, amateur radio, firmware, open source, hamradio.my, SOTA, POTA, Summits on the Air, Parks on the Air, portable operation.

1 comment

Post Comment