CalTopo integration

As a SAR team administrator I am very interested in being able to integrate Meshtastic with CalTopo. We very frequently operate in areas with no cell coverage. We use Garmin InReach devices, but they require a connection to the internet for data to propagate on the map.

I would like to be able see team members in the field and for the team members to be able to see each other assuming they are in range of each other. Some thing like Atak but through CalTopo.

I have Administrator level access to our team account.

Having watched the Meshtastic video and documentation on integration, I find myself unable to follow the serial connection process. I have also read but find the CalTopo APRS integration instruction over my head.

Is there a video or a thread or willing person that can talk a novice through the process step by step, of connecting nodes to CalTopo?


So you enabled the Serial Module, entered the correct RX/TX pins, and set the mode to CALTOPO? Then you should get the output at the default baud of 38400 (which can be configured).

Maybe @thebentern can help you out further.

1 Like

I would appreciate a more thorough walk through of this set up as well. CalTopo debug shows traffic serial traffic that does appear to come from the TBeam, but shows it as symbol gibberish. I’ve tried multiple bauds, making sure they’re the same, etc. Cannot seem to get CalTopo to see NMEA format text. I have another APRS application called QTH that was able to decode the TBeam position data fine. Not sure why it’s not working with CalTopo. Also, with a SAR team in southern Wyoming, and considering adding meshtastic devices to our gear. Any help would be very appreciated! Prefer Mac…

1 Like

Update 2/25/24: I finally got things working. I ended up having to install and Python CLI config tool. I copy and pasted the exact code listed on the meshtastic CalTopo integration page (CalTopo / SARTopo | Meshtastic). Then no more gibberish in the CalTopo debug log.

The code I have in the the file is:



This is on a mac.

One thing that is slightly annoying-- it seems like if the node connected via usb to the computer doesn’t also have it’s own GPS lock, it will not pass along the APRS position of any other nodes in the mesh. This means I may have to get an longer micro-usb cable to allow me to put the usb connected node outside our SAR trailer, so that it has reliable GPS lock. If it’s in the metal walled trailer, it would likely loose it’s own GPS lock and stop relaying the GPS location of the other nodes on the mesh. If I have this wrong, and could change a setting, please let me know.

If I understand you correctly, to make Meshtastic work with CalTopo you have to have a node at the command center to read the nodes in the field.

Also with my lack of understanding, you had to load some kind of custom code settings to make it work.

Now if only it could be dumbed down enough for me to duplicate what you have done.:sweat_smile:

You don’t need custom code. In addition to the mobile device, mac application, and web based config of nodes, meshtastic offers a command line based config option. You can follow this guide to install the command line tools: Meshtastic Python CLI installation | Meshtastic

I have almost no experience with command line applications. But I decided as a last ditch I better try to get the Python command line tool working and then post the code verbatim listed on the page which explains meshtastic-CalTopo integration found here: CalTopo / SARTopo | Meshtastic

The command line code I copy and pasted exactly is: meshtastic --set serial.enabled true --set serial.baud BAUD_9600 --set serial.mode CALTOPO --set serial.override_console_serial_port true

Once I followed both sets of instructions (the installation of the Python command line tool, and following the instructions in the link above) it started working. I’m not sure why I wasn’t able to get it working before, because as far as I can tell the other graphical node management options (cell phone applications, mac app, web browser) offer configuration of the same settings as the command line, but maybe not. Or I simply didn’t have the correct values in.

Just to be clear, the last leg is to make sure you “turn on” CalTopo listening for APRS devices in CalTopo’s “” file that is found in the folder CalTopo Desktop installs on your device. (aside: as far as I’m aware, this functionality only works if you have access to CalTopo Desktop, which is the offline computer based version of CalTopo. You have to have a paid CalTopo account for this. If you’re part of a SAR team, and your team has a paid CalTopo account, you should have access to the offline CalTopo Desktop). You just paste the code I have in my last post into the file and save (if you’re on mac that is. The CalTopo instruction page lists the code you’d need to paste into that file if you’re on Windows here under “APRS Integration”: Live Tracking and Locators | CalTopo Training). You will need to change the device identification in these pasted codes. To find the device (node) and what it’s called on a mac, you post the following command into the mac Terminal application (mac’s built in command line application): ls /dev/tty.*

Once you have the usb connected node’s device number, you’d copy and paste that number where the XXXXX’s are in the code below. To be clear, paste this code into the “” file in the CalTopo folder and save it; I used the TextEdit application on my mac to open/edit/save this file. This is the code for a Mac, Windows is slightly different, and the format for that can be found on the CalTopo APRS integration instruction page I linked to above.


And yes, it seems as though CalTopo will not see the position data of nodes on the mesh network unless the local node also has its own GPS lock and is transmitting that data. Once the local node (to be clear, you must connect one of the nodes directly to the computer using a data micro usb/usb-c cable, this functionality will not work over bluetooth) has a GPS position of it’s own, it’ll tell that to CalTopo and relay the other nodes’ positions as well.

Yes, our team does have a paid pro account to which I am an administrator, I am a Mac user for sure. I have the desktop version on my laptop already. Thank you for putting it together with more detail. I might have to try and play around with the python.

At the current time we are using the InReach for off line tracking, but it still requires command to have internet access for that to work.

Maybe a more simple How-To Step by step would be helpful:

  1. Install offline CalTopo Desktop: CalTopo Desktop | CalTopo Training

  2. Install Meshtastic Python CLI command-line tool: Meshtastic Python CLI installation | Meshtastic

  3. Connect node to computer via data enabled usb cable.

  4. Figure out what the node is called / which port the node is on. On a Mac, open the Terminal application and paste the following code to see all USB devices, find the one with the long 11 character alphanumeric: ls /dev/tty.*

Windows will have one of the COM ports being used.

  1. Open “” file using basic text edit application (find this file in /users/myusername/CalTopo on Macs or c:\Users\myusername\CalTopo on Windows).

  2. (Mac) Into that empty file, paste the following and save. Make sure to replace the XXXXXXXX with the node’s alphanumeric number we identified above (the “9600” after the equal sign is the BAUD):


(If you’re on Windows, it looks like the code should be the following but making sure the correct COM number is used for the connected node; replace the X after COM with the correct number:


I’m getting this from the CalTopo instruction page found here: Live Tracking and Locators | CalTopo Training

  1. Also paste and save the following code into the file so that you can see what location data CalTopo is seeing from the connected node once up and running. This allows you to see that the APRS information is being sent properly to CalTopo. See Ben’s video showing what you should see here:

  1. Paste the following code into the computer’s command line application (after the Python CLI tool has been installed). This should configure the node correctly and it should reboot:

meshtastic --set serial.enabled true --set serial.baud BAUD_9600 --set serial.mode CALTOPO --set serial.override_console_serial_port true

  1. Open CalTopo Desktop. Once the connected node has a GPS lock on its own position, you should see what Ben shows in the video above. If so, follow the rest of the steps he outlines in that video to see the GPS location on CalTopo.

Yes we have the exact same situation. But our areas of operation frequently do not have internet/cell connection. And the InReach’s monthly fee is taxing.

I did my best to follow your guide and after much learning have got nodes to populate on CalTopo.

  1. “Install CalTopo desktop”
    No problem had already installed it.

  2. “Install Meshtastic Python CLI tool”
    This step set me back awhile, having zero experience I learned that the “Terminal “ on Mac is the CLI. After that, copied the script from the guide. Then got stuck on the password prompt and learned that you just type in your password (that is not shown at all) and press enter.

3-4. Connect node via USB
No problem, but my code was 12 characters.

5-7. “Open”
Using the application “Text Edit” that I did not know was factory installed, I was able to open and paste the script. To save the change I used the drop down menu from “File” to “save” the script.

  1. “Open CalTopo Desktop”
    This step worked and I saw the data streaming.
    Opened an offline CalTopo map and some of the local nodes populated on the map.

So far I am not seeing all the nodes that I can see in the regular Meshtastic node list.

I can only see those nodes from an offline map, unless they are saved to the map from the offline map.

I will keep messing around with it and see what can and can not be done. As yet I can not effectively use this level of integration for a real world mission.

Anyone getting better results?

Looking at the CalTopo desktop, it is generating a new line nearly every second! I can see a node in the data about every 10 seconds.

This data is being generated regardless of whether or not a node is connected, the node info is not in the stream, but being generated as a fast clip all the same. Before pasting commands the Desktop was not generating anything.

Interesting is that I see node info for nodes that are not populating on the map.

Less that half of nodes that are active are populating on the map.

I did some more testing.
From the offline map I recorded the nodes that populated to the map. Then chose “Show Track”.

In the CalTopo Mobile App on the same map, all the saved nodes populate and show realtime position updates, update every 2 minutes! Which for SAR is crazy fast.

As I drove the test loop, on the mobile app I could see my location updating.

I am not sure why some nodes populate and others don’t, but those that do update quickly.

Been a few hours now and finally all the expected nodes populated on the map.

I am thinking it must have something to do with position update settings on the nodes themselves.

Some nodes took hours to show up while others popped up with in moments of turning them on.

Sort of like the ATAK mode I need a CalTopo mode.

In the Serial configuration menu there is a CalTopo mode.

So far I have only one node ( the one I did the original setup with) that will allow nodes to populate on the map.

To the best of my ability I have tried to configure a second node to push serial data to CalTopo.

So far the second node best as I can tell, has the same setup as the first, even see node information in the CalTopo desktop, but will not populate on the map.

I would like to be able to grab any node in the fleet to send serial info to CalTopo.

Is there a part of the configuration I am missing?

New guy here. I found this topic very interesting as I’d like to get involved in meshtastic comms for SAR teams. I am an embedded software engineer who works on satellites for a living, so I may be able to help you guys out.

As far as connecting any node to the desktop to transmit serial data, I think that’s definitely doable, we just have to rule out the issues.

First off, like you mentioned, whatever node you plug in needs to be configured to send APRS messages via serial port to your desktop. Side note, this can be done via android too!

Then you have to make sure whenever you plug in a new device, that the right serial port is being used in the caltopo settings. For example, you can plug in a device and it’s listed under dev.ttyUSB0. Then later plug in a device and now it’s listed as dev.ttyUSB1. OS can be tricky like that, so you have to double check every time you plug a node in. We can set up a routine to automatically assign the port to a specific name, like “meshtastic” on your desktop that will go in the caltopo properties.

I’d be interested to see why caltopo doesn’t update any node position unless the plugged in node is providing gps lock. It’d be reasonable to assume you could assign the node to a fixed position while it’s plugged in to get around this. The issue is more than likely meshtastic not sending NMEA messages for some reason

1 Like

The node I have connected to the computer is not gps enabled.

There is clearly some small detail preventing me from using a different node to feed serial data to the desktop.

Secondly, I am finding that the longer I have node tracking enabled the longer the update period becomes. When I first started tracking the updates were about 2 minutes apart. After a day the updates have become more like 2 hours apart.

In the CalTopo desktop there is a lot information updating regardless if a node is connected or not. Before copy and pasting the code to the desktop :desktop_computer: no information was populating at all.

My guess is that there is way more information being processed than what is relevant to Meshtastic and server is being overwhelmed. A new line of code is generated 2-3 times per second and no code is being deleted, making the file grow very large.

I have found that closing and reopening the desktop to be helpful.

The first thought that comes to mind regarding the delay in gps updates from all nodes, is if you have “smart gps” enabled. That would definitely impact your location update period. If so, try turning that off for your devices equipped with gps. This may not have an impact based on what you said about the period improving after restarting the desktop app.

So the terminal app caltopo is using may or may not be logging the serial data to file. It can certainly bog down a system if it is. I’ll play with caltopo a bit to see the cpu usage and processes. Programs like anything built by microsoft are absolutely horrible and hog up your machine. Let’s hope the developers at caltopo were kind enough to avoid this.

Next, can you paste a screenshot of your caltopo log showing the traffic? Im curious about the data you’re getting when you don’t have a node connected to serial. My guess is it’s constantly checking for serial data and timing out.

Lastly, In the caltopo properties you copied, try changing this line from




Then save the file and restart the program. That should clean up the onslaught of logs per second.

Here is the Desktop from a cold start with out a node connected.
Did not take long for this data to pile up.

I will give the modified script a try.

Here is what the desktop looks like with your recommended change to the file.