KC5ODS // PROJECT ARCHIVE
NODE ONLINE · UTC --:--:--

Field Utility · Windows & macOS

PALM365

Palm OS Handheld ·· Microsoft 365 & Google

Keep a classic Palm PDA in daily sync with a modern cloud — calendar, contacts, and tasks. Two editions: a Windows build that runs beside Palm Desktop, and a macOS build that lives inside jpilot and syncs itself. Nothing is installed on the handheld. An obsolete device, back in service, talking to the present.

Field Note

As far as we know, this is the first bridge to connect a Palm OS handheld to Microsoft 365 — and now to Google as well.

Edition 01 · Windows · Release 2.0

Palm Desktop + Python CLI

Runs on Windows alongside Palm Desktop and HotSync. A small Python tool reads and writes Palm Desktop's own database and reconciles it with Microsoft 365. Calendar and tasks stay two-way, with the handheld as your daily capture device; contacts flow down from Outlook, since entering a full contact card by stylus is its own punishment.

Sync Manifest · Windows
DataDevice → 365365 → DeviceMode
Calendar● YES● YESTwo-way — create/delete either side
Tasks / To Do● YES● YESTwo-way
Contacts— NO● YESOne-way — 365 is master, device mirrors

Pull the package

Recommended
Universal build

Palm365

The setup wizard auto-detects your device and database paths — works with any Palm that syncs to Palm Desktop.

Download .ZIP
Preconfigured
Palm m505

m505 build

Ready-set for the Palm m505 profile. Drop in, add your client ID, sync.

Download .ZIP
Preconfigured
Palm Vx

Vx build

Ready-set for the Palm Vx (Palm OS 4.1) profile.

Download .ZIP

Have these in place first

Palm365 relies on these — it does not install them for you.

From download to first sync

  1. Install the requirements above. Confirm HotSync already works and you can see your data in Palm Desktop.
  2. Unzip Palm365 somewhere simple, e.g. C:\Palm\, then pip install -r requirements.txt.
  3. Register a Microsoft 365 app — follow M365_SETUP.md. You'll copy one client ID from the Azure portal.
  4. Run the setup wizard — it finds your Palm databases and writes the config: python setup.py.
  5. First sync (sign in once at microsoft.com/devicelogin), then press HotSync: python sync_to_palm.py sync.
  6. From then on, the daily rhythm is just: HotSync → sync.bat → HotSync.

Straight talk

Edition 02 · macOS · Apple Silicon

jpilot plugin · syncs itself

The macOS edition takes a different route. Instead of Palm Desktop, it runs as a native plugin inside jpilot, the classic open-source Palm desktop, and does its work automatically: a down-sync when jpilot opens, and a full two-way sync right after every HotSync. Nothing to run by hand. It reads and writes jpilot's .pdb files through pilot-link's libpisock, and — unlike the Windows edition — contacts sync both ways too.

Sync Manifest · macOS
DataDevice → CloudCloud → DeviceMode
Calendar● YES● YESTwo-way — timed & all-day, delete either side
Tasks● YES● YESTwo-way
Contacts● YES● YESTwo-way

Choose your cloud

Microsoft
palm365-mac

Microsoft 365

Outlook calendar, To Do, and contacts — the same bridge, native on the Mac.

sudo port install palm365-mac
Live-tested
palmgoogle-mac

Google

Google Calendar, Tasks, and Contacts. Verified end-to-end on a real Palm Vx, deletions and all.

sudo port install palmgoogle-mac
One cloud per Palm These two ports conflict by design — installing one refuses to proceed if the other is present. A single Palm has one calendar, one contact list, one task list; two clouds rebuilding them at once is asking for duplicate and contradictory writes. Pick whichever is your primary source. If you later switch, remove one before installing the other.

What's under it

Three pieces stack up. MacPorts pulls in whatever a given edition needs.

palm365-mac / palmgoogle-macprovider package — OAuth + cloud API + field mapping
palm-sync-coreshared engine — reconciliation, stable IDs, safety
jpilot (arm64 fix)patched to build clean on Apple Silicon / GTK3

Have these in place first

From install to first sync

  1. Install with MacPorts: sudo port install palm365-mac (or palmgoogle-mac). Not merged upstream yet — see the pre-merge block below.
  2. One-time setup: cd /opt/local/share/palm365-mac && python3.14 setup.py (swap the path for the Google edition). It walks you through creating the app registration / OAuth client — a free, one-time step that grants access to your own data.
  3. Open jpilot and HotSync. Everything after that is automatic. On Google, the first sync opens your browser to sign in once; then it's silent.
Manual override · install now, before the MacPorts merge

The four recipes are still open pull requests, not yet in the official MacPorts index (see Source & Ports below). Until they land, install straight from the PR branches. You'll need MacPorts itself first. This grabs the Portfiles into a local tree, registers it ahead of the official mirror (so dependency resolution doesn't fall back to the old, broken jpilot recipe), then builds all three.

# 1. Grab the Portfiles into a local port tree (palm365 edition shown;
#    for Google, swap the palm365-mac lines for palmgoogle-mac / add-palmgoogle-mac)
mkdir -p ~/macports-local/palm/jpilot ~/macports-local/python/palm-sync-core ~/macports-local/palm/palm365-mac
curl -sL -o ~/macports-local/palm/jpilot/Portfile \
  https://raw.githubusercontent.com/HodsonTech/macports-ports/update-jpilot-gtk3-arm64/palm/jpilot/Portfile
curl -sL -o ~/macports-local/python/palm-sync-core/Portfile \
  https://raw.githubusercontent.com/HodsonTech/macports-ports/add-palm-sync-core/python/palm-sync-core/Portfile
curl -sL -o ~/macports-local/palm/palm365-mac/Portfile \
  https://raw.githubusercontent.com/HodsonTech/macports-ports/add-palm365-mac/palm/palm365-mac/Portfile

# 2. Register it as a source, ahead of the official mirror
sudo sh -c 'echo "file://'"$HOME"'/macports-local/" | cat - /opt/local/etc/macports/sources.conf > /tmp/sources.conf.new && mv /tmp/sources.conf.new /opt/local/etc/macports/sources.conf'

# 3. Build the local index and install all three
cd ~/macports-local && portindex
sudo port -d install jpilot palm365-mac

# 4. One-time setup (no sudo — writes to your own home directory)
cd /opt/local/share/palm365-mac && python3.14 setup.py

Once all the PRs merge upstream, drop the file:// line back out of sources.conf and it behaves like a normal sudo port install from then on.

Field Report · Open Source

Source & ports

All of it is open. The macOS side is being submitted to MacPorts as four recipes — all currently open pull requests, pending review and merge into the official index.

Build your own provider palm-sync-core is provider-agnostic on purpose: it takes an already-authenticated cloud client and a small field-mapping module and handles all the hard reconciliation. palm365-mac and palmgoogle-mac are the two worked examples. Point it at another calendar/contacts/tasks service and you have a third.

Palm365 reads and writes live data in both your cloud account and your Palm databases, including creating and deleting records. It ships with safety features — it backs up cloud data before any deletion and pauses if a sync looks catastrophically wrong — but you are responsible for your own data. Back up your Microsoft 365 or Google information and your Palm databases before first use. Provided "as is," without warranty of any kind.

For operators who build

The Windows package includes PROJECT_OVERVIEW.md — a complete build specification with the hard-won details of the Palm Desktop database format, the duplication-prevention design, and HotSync conduit behavior. The macOS side is on GitHub, with the shared engine documented in its own repo. Detailed enough to rebuild the tool from the schematic.