Qt 5 GUI frontend for the plptools Psion PDA connectivity library.
PsiConnect is a modern Linux replacement for the old PsiWin application: connect a Psion PDA over a serial link to browse files, install apps, back up the device, and two-way sync the organizer (contacts, agenda, to-dos) with the desktop.
| Feature | Status |
|---|---|
| PDA profile management (create / edit / view) | ✅ |
| Dashboard with device info, last-connected / last-synced | ✅ |
| Organizer two-way sync with local persistence + 3-way merge | ✅ |
Generic Data-app (\DAT\*.DBF) support — pick any file, schema-adaptive editor |
✅ |
| Agenda editor: style, recurrence, alarm, and memo (Psion Word) editing | ✅ |
| To-do lists (multiple lists, priorities, due dates) and anniversaries | ✅ |
| vCard (.vcf) import/export with adjustable field mapping + duplicate handling | ✅ |
| iCalendar (.ics) export | ✅ |
| Backup & restore | ✅ |
| File Manager (browse, get, put, delete) | ✅ |
| Application install (.sis / .app) + local library / store | ✅ |
| SIBO (Series 3) support | ✅ |
| EPOC (Series 5 / Revo / netBook) support | ✅ |
| Auto-detect Psion on serial port | ✅ |
| Share the desktop's Internet with the device (PPP + NAT over the cable) | ✅ |
The Organizer is the most developed part of PsiConnect. Data is parsed from the device's native binary formats, mirrored to a per-profile local database, and reconciled with a 3-way merge so edits on either side are preserved.
Contacts / Data files (SIBO). Series 3 has no dedicated contacts app — contacts live in an ordinary Data-app database, and its schema is user-defined. PsiConnect therefore treats the Contacts tab as a general Data-file editor:
- Discover every
\DAT\*.DBFacross all device drives and choose which file to edit (remembered per profile, with its own sync tie). - A schema-adaptive table renders the file's real columns; a master/detail view edits the selected record with one control per field, typed to the field (text / integer / decimal) and grouping unlabelled text runs into a single multi-line box, just like the Psion Data app.
- vCard import/export maps the file's columns to vCard fields (auto-guessed from the labels, adjustable), and import resolves duplicates by name.
Agenda (SIBO). Appointments, day entries, anniversaries and to-dos are parsed and written back while preserving each entry's structure. A double-click editor covers common fields, style (bold / italic / underline / crossed-out), recurrence, alarm, and memo text (decoded from the Psion Word format). Multiple to-do lists, priorities and due dates are supported.
Persistence & sync. Each profile keeps an SQLite mirror of its organizer data (and the chosen Data file's schema / to-do lists), so the UI works offline. Sync downloads the device files, merges against the last-pushed snapshot, and writes the result back, closing any app holding the file first.
- Psion Series 3, 3a, 3c, 3mx
- Psion Siena
- Psion Workabout
- Psion Series 5, 5mx
- Psion Series 7
- Psion Revo, Revo Plus
- Psion netBook
- Psion Mako
The rich Data-app and Agenda editing described above targets SIBO devices. EPOC contacts/calendar sync uses the EPOC parsers.
PsiConnect
├── core/ Backend logic (no Qt Widgets dependency)
│ ├── PdaProfile Profile data model + JSON persistence
│ ├── ProfileManager CRUD for profiles stored in AppData
│ ├── PlpConnection C++ wrapper around plptools RFSV/RPCS (+ RPCS bootstrap)
│ ├── ConnectionManager Manages ncpd daemon lifetime + retry logic
│ ├── NcpdProcess Launches/monitors the ncpd daemon
│ ├── DeviceDetector Serial port hot-plug detection
│ ├── OpenFileGuard Detects/closes files held open on the device
│ ├── BackupManager Device backup/restore
│ ├── AppLibrary Local .sis/.app catalog
│ └── LogBridge Routes plptools/log output to the UI
├── organizer/ Organizer data handling
│ ├── OrganizerEntry Common entry base (Contact, Appointment, Anniversary, Todo)
│ ├── SiboParser SIBO binary .DBF / agenda parser + writer
│ ├── WordReader Psion Word format reader (agenda memos)
│ ├── EpocParser EPOC binary CDB / Agenda parser
│ ├── OrganizerModel Schema-adaptive QAbstractTableModel
│ ├── OrganizerStore Per-profile SQLite persistence + sync base
│ ├── VCardMapper Column ↔ vCard field mapping, import/export
│ └── VCalExporter iCalendar 2.0 + vCard 3.0 exporter
└── ui/ Qt Widgets UI
├── MainWindow Main window with sidebar navigation
├── DashboardWidget Profiles, connection status, device info, backup
├── FileManagerWidget Psion file browser
├── OrganizerWidget Organizer view / edit / sync / import / export
├── EventEditorDialog Agenda entry editor (style/recurrence/alarm/memo)
├── VCardFieldMapDialog vCard ↔ column mapping
├── AppManagerWidget Install/remove apps on PDA
├── AppStoreWidget Local app library catalog
└── LogsWidget Live log view
Psion PDA ──serial──► ncpd daemon ──TCP (127.0.0.1:7501)──► PsiConnect
- ncpd (part of plptools) runs as a process and speaks the NCP protocol over the serial link.
- PsiConnect starts ncpd automatically when connecting a profile, then communicates with it via TCP using the RFSV (remote file system) and RPCS (remote process/system) protocol factories from libplp.
- On SIBO devices that lack the RPCS server, PsiConnect uploads an embedded copy so process/open-file queries work.
The Internet page gives the connected Psion access to the desktop's Internet
connection. Device IP traffic can't ride the plptools stack (NCP has no IP
channel), so instead the Psion runs its own PPP stack over the serial cable into a
pppd peer on this machine, whose traffic is NAT'd out through the host's uplink.
Psion ──PPP over serial──► pppd ──MASQUERADE──► your uplink (wlan0/ethX) ──► Internet
Because the cable can only do one thing at a time, Internet sharing is mutually
exclusive with the file/organizer link: starting a share disconnects ncpd to
free the port. Click Start Sharing, then set up a dial-up/Internet connection
on the device that uses the cable (the page shows step-by-step, per platform):
- EPOC (Series 5/5mx/Revo/7/netBook) has a built-in TCP/IP + PPP stack.
- SIBO (Series 3 family) needs on-device software such as PsiMail Internet or PsiStack (there is no built-in stack), and typically 19200 baud.
How the privileged bits work. Enabling IP forwarding and adding the iptables
NAT rules needs root; pppd and the serial port do not (if you're in the
dialout/dip groups). PsiConnect authorizes once per session via sudo and
a standard graphical password prompt (askpass), keeps the credential warm, and
runs each step as a normal sudo call to standard tools. Every firewall rule it
adds is tagged with an iptables comment (psiconnect-share) so it can be removed
exactly; the applied changes are also recorded to a small state file, so if
PsiConnect is killed mid-share the Internet page offers to clean up the
leftovers on the next launch.
Expectations. At serial speeds (≤115200 baud) and with the device's vintage browser/TLS support, realistic use is email, plain/legacy HTTP, NNTP and telnet/ssh — modern HTTPS is out of reach for the device's own TLS stack. To bridge that, use the built-in web proxy (below).
The Internet page also runs an in-process transcoding web proxy. The device's ~1999 TLS/cert stack can't handshake with modern HTTPS sites — but the desktop can. Point the device browser at the proxy and PsiConnect fetches each page, doing the modern TLS on the PC, then returns it as plain HTTP/1.0 the device can read.
Opera on Psion ──HTTP/1.0──► PsiConnect proxy ──TLS 1.2/1.3 (OpenSSL)──► the site
- No root and no extra dependency — it just binds a TCP port (default 8080) and reuses Qt Network + OpenSSL, which the app already links.
- On the device, set only the browser's HTTP proxy to
10.0.0.1:<port>(the host end of the PPP link) and leave the HTTPS proxy blank; browse withhttp://addresses. The device never does TLS — the proxy upgrades each request to real HTTPS on the PC and followshttp→httpsredirects, and rewriteshttps://links back tohttp://so navigation keeps flowing through the proxy. (Vintage browsers tunnel their HTTPS-proxy slot withCONNECT, which can't be transcoded; the HTTP-only setup avoids that entirely.) - It can start automatically when a share goes active (Settings → Web proxy).
- Charset: text pages are transcoded to an 8-bit charset the vintage browser can render (default windows-1251 for Cyrillic; configurable in Settings → Web proxy, blank to disable) — modern UTF-8 otherwise drops non-Latin text on the device.
- Further transcoding (image downscaling) can be layered on; heavily script-driven modern sites still won't render fully — nothing can fix that at a proxy — but a great deal of the plain web becomes reachable.
plptoolspackage (providesncpd,sisinstall,libplp.so)- Qt 5 runtime libraries, including the SQLite driver (
libqt5sql5-sqlite) - For Internet sharing:
ppp(providespppd),sudo, and a graphical askpass helper (e.g.ssh-askpass/ksshaskpass). Add yourself to thedialout/dipgroups. The askpass path can also be set in Settings → Internet Sharing.
sudo apt install \
plptools \
qtbase5-dev \
libqt5serialport5-dev \
libqt5svg5-dev \
libqt5charts5-dev \
libqt5sql5-sqlite \
qttools5-dev \
qttools5-dev-tools \
cmake \
ninja-build \
g++
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc)Run directly:
./build/src/psiconnectInstall system-wide:
sudo cmake --install build- Create a PDA profile (File → New PDA Profile).
- Set the serial port your Psion is connected to (e.g.
/dev/ttyUSB0). - Click Connect on the Dashboard.
- PsiConnect will start
ncpdautomatically and establish the connection.
For USB-serial adapters the port is typically /dev/ttyUSB0.
For built-in RS-232 ports it is /dev/ttyS0.
You may need to add your user to the dialout group:
sudo usermod -aG dialout $USER
# then log out and back inGPL v2 (same as plptools).