Geocaching with Linux

An evolving collection of tips for using downloads from the geocaching site under the Linux operating system.

I hope that this information will be of help to anyone who is struggling to get these utilities working. However, I offer no guarantees that any of this will work for you. If it works for you, great. If it causes you, your equipment or any other entity any sort of loss or damage, then I accept no responsibility.

I can't claim much credit for the following information, most of it was found spread around the 'net or by fairly simple debugging. My objective is to provide a page which brings together as much relevent information as possible.

In the beginning

I was introduced to this strangely addictive activity by two friends who inhabit the geocaching world under the names Dennis's Pal and bobgeorge.

Dictionary Corner

Dennis's Pal sent me an email with the following definitions. I found it amusing, and so I will share it with you.

Geocacher - Noun
"A person obsessed with the hunt for hidden tupperware"
Pronounced - Mad-as-a-hatter

Geocaching - Verb
"The use of $12Bn of military hardware to find someone's hidden lunch box"

A strange collection of equipment

Palm Tungsten|C

Originally purchased as a personal organiser. Now I have an extra use for it.

TomTom Go 300

After investigating navigation solutions which might work on the above Palm, I came to conclusion that a standalone unit would be a better solution for in-car navigation.

Garmin eTrex

I tried (and failed) using the TomTom for geocaching. It always assumes that it is on a road, which is good for road navigation, but unhelpful for offroad use. As a result, device number three was purchased.

Linux Tools

Before we get into specifics, I have general tip for using serial devices under linux and in particular Fedora. Other distributions may have a different approach or use a different group for the serial ports. On Fedora systems, we see:

[richard@holly ~]$ ls -l /dev/ttyS*
crw-rw---- 1 root uucp 4, 64 2007-09-06 07:32 /dev/ttyS0
crw-rw---- 1 root uucp 4, 65 2007-09-06 07:32 /dev/ttyS1
crw-rw---- 1 root uucp 4, 66 2007-09-06 07:32 /dev/ttyS2
crw-rw---- 1 root uucp 4, 67 2007-09-06 07:32 /dev/ttyS3

Although this tip is useful for standard serial ports, it is a greater benefit for USB serial devices which are automatically created by udev. Open up the user and group manager tool from the menu and add your username to the uucp group (you will need the root password to use this tool). Logout and back in again and you will have access to your serial ports from your normal user login.


This command line tool is available from It may even be available as part of your distribution of choice. To install on Fedora 7, installation is as simple as typing the following command as root:

yum install gpsbabel

Pilot Link

This command line tool is available from Once again, this package is included with most distributions. On Fedora 7, the command to to type as root to install this package is (unsurprisingly):

yum install pilot-link

In this case, the only command of interest is pilot-xfer. In order for pilot-xfer to work correctly with plucker-setup (which installs the plucker application onto the Palm device) it is necessary to set the environment variable PILOTPORT to the port that corresponds to the Palm device. In the case of a USB Hotsync cradle for the Palm, this will be a /dev/ttyUSB* device. When the hotsync button on the cradle is pressed, a kernel module (typically the "visor" module, unless you have a very recent Palm device) will initiate (through udev) two devices. In my case these are:


The PILOTPORT variable should be set to the second of these devices. In my case I have:

export PILOTPORT=/dev/ttyUSB1

The above command can be added to the end of .bash_profile in the home directory of the user (not root) who will be logged into the system, so that it is set whenever the user logs in.


This command line tool is documented at The best option for download is probably Sourceforge. For me (using Fedora), this was the most tricky of the commands to get working properly. If you use Debian or Ubuntu, I think this package is available as part of your distribution. There is an RPM package available which is "compiled" for the i386 architecture. So, on an i386 machine, we type as root:

rpm -i plucker-1.8-1.i386.rpm

Python? What Python?

The first problem I encountered when installing this package was that the RPM install script could not find which generates the .pyc and .pyo precompiled versions of the Python scripts which comprise the components of the various plucker utilities.

A little searching of the 'net revealed the source of the problem. Recent distributions tend to install Python in a directory which has a name that includes the Python version number. Plucker expects Python to be installed in /usr/lib/python/. The suggested remedy (which is a bit of a bodge) is to create a symlink called python pointing to the current version of Python. On Fedora 7, this would be (as root):

# Uninstall plucker
rpm -e plucker
# Tidy up directories created by the plucker install
# These directories should be empty, procede with caution if they are not
rmdir /usr/lib/python/site-packages
rmdir /usr/lib/python
# Make the symlink
cd /usr/lib
ln -s python2.5 python
# Re-install plucker
rpm -ivh plucker-1.8-1.i386.rpm

Problems with Python's urllib

My inital experiments on Fedora Core 6 worked fine. When I moved to Fedora 7, I found I was getting HTTP Bad Request errors. A little investigation with tcpdump revealed that two almost identical headers were being sent:

User-Agent: Python-urllib/1.17
User-agent: Plucker/Py-1.8

On Fedora core 6, only the User-agent: Plucker/Py-1.8 was being sent. The problem was traced to a subtle change in Python's urllib. In Python version 2.4.4 (Used on Fedora Core 6), the default header has a lowercase 'a'. The header being User-agent: Python-urllib/1.17. This header is deleted by Plucker and replaced with User-agent: Plucker/Py-1.8. Unfortunately, as the header has been renamed in Python 2.5 (Used on Fedora 7) with a capital 'A', the deletion does not work. The fix was to patch Plucker as follows:

--- PyPlucker/ 2004-05-19 16:18:19.000000000 +0100
+++ PyPlucker/      2007-09-03 17:53:48.000000000 +0100
@@ -75,9 +75,9 @@
     def __init__(self, alias_list=None, config=None, *args):
         apply(urllib.FancyURLopener.__init__, (self,) + args)
         self._alias_list = alias_list
-        self.remove_header ('User-agent')
+        self.remove_header ('User-Agent')
         user_agent = (config and config.get_string('user_agent', None)) or 'Plucker/Py-%s' % __version__
-        self.addheader ('User-agent', user_agent)
+        self.addheader ('User-Agent', user_agent)
         referrer = config and config.get_string('referrer', None)
         if referrer:
             self.addheader('Referer', referrer)

Placing the above patch in a file called user-agent.patch, we can issue the following commands as root:

cd /usr/lib/python2.5
patch < ~/user-agent.patch
# Rebuild the precompiled versions
rm -f PyPlucker/Retriever.pyc
rm -f PyPlucker/Retriever.pyo
python /usr/lib/python/ /usr/lib/python/site-packages/PyPlucker
python -O /usr/lib/python/ /usr/lib/python/site-packages/PyPlucker

Problems with netpbm-progs

The sixtyfour bit question

Installing the Palm application

Once the above programs are installed and configured, it should be fairly easy to install the Palm application using plucker-setup. The only issue I had was that plucker-setup needs to have the PILOTPORT environment variable set (described above) so that it can use pilot-xfer to install the Palm application. You could double check this by typing:

[richard@holly ~]$ echo $PILOTPORT

The plucker-setup script is fairly straightforward and just requires answering y/n questions and choosing the language to use for the Palm application. If you are using the USB (visor) driver, remember to press the Hotsync button on the Palm cradle before answering the "Choose a language" question.

Putting it all together

Garmin eTrex: GPS coordinates

Upload waypoints to Garmin eTrex.

gpsbabel -i gpx -f 1234567.gpx -f 1234567-wpts.gpx -o garmin -F /dev/ttyS0

Palm Tungsten|C: Cache details

Create an html file from gpx

gpsbabel -i gpx -f 1234567.gpx -o html -F /tmp/1234567.html

Convert to Plucker format

plucker-build --bpp=8 --doc-name=\"XYZ Caches\"  --maxwidth=300 \
--doc-file=1234567 --home-url=/tmp/1234567.html

It would appear that it is best to use a fully specified path for --home-url, otherwise plucker-build seems lose track of where the source file is located.

Upload to Palm. For the USB interface, it is necessary to press the Hotsync button on the cradle before pressing the enter key for the following command. This is because the interfaces /dev/ttyUSB0 and /dev/ttyUSB1 are dynamically created during the Hotsync.

pilot-xfer -i ~/.plucker/1234567.pdb

TomTom Go 300: Road navigation

Create a points of interest .ov2 file with gpsbabel.

gpsbabel -i gpx -f 1234567.gpx -o tomtom -F Geocache.ov2

And finally...

Profile for A-gent Orange

Powered by WebRing.

Also in this section


Please submit comments and questions about this site to

If you enjoyed this site, small donations towards running costs are always gratefully received (well, I can hope...). Joking aside, thank you for chosing to visit my website.