A cross-platform to-do list manager with encrypted peer-to-peer synchronization
Project description
pytodo-qt
A cross-platform to-do list manager with encrypted peer-to-peer synchronization.
Features
- Multiple lists - Organize tasks into separate lists with private/shared control
- Priority levels - High, normal, and low priority with color coding
- Due dates - Date picker with overdue highlighting and filtering
- Search and filter - Real-time filtering of todo items
- Undo/redo - Full undo/redo for all operations
- Encrypted sync - AES-256-GCM encryption with Ed25519 key exchange
- Device management - Track peers by fingerprint with trust levels (normal/trusted/blocked)
- Sync groups - Organize devices into groups and control which lists sync where
- Auto-sync - Debounced push after changes and periodic full sync on configurable timers
- Offline queue - Queue syncs for offline devices, auto-execute when they come online
- Auto-discovery - Find other instances on your network via mDNS/Zeroconf
- Dark/light themes - WCAG AA contrast-compliant themes with system-following
- Cross-platform - Linux, macOS, and Windows support
Requirements
- Python 3.11 or later
- PyQt6
Installation
Pre-built Binaries
Download the latest release for your platform from the Releases page.
macOS
- Download
pytodo-qt-VERSION-macos-arm64.zip(Apple Silicon) orpytodo-qt-VERSION-macos-x86_64.zip(Intel) - Extract the zip file
- Move
pytodo-qt.appto/Applicationsor~/Applications - First run only: Right-click the app and select "Open" to bypass Gatekeeper
- Alternatively, run:
xattr -rd com.apple.quarantine /Applications/pytodo-qt.app
- Alternatively, run:
- After the first run, you can open normally by double-clicking
Note: The app is ad-hoc signed (not notarized with an Apple Developer ID), so macOS will show an "unidentified developer" warning on first launch. This is normal for open-source software distributed outside the App Store.
Linux
- Download
pytodo-qt-VERSION-linux-x86_64.tar.gzorpytodo-qt-VERSION-linux-arm64.tar.gz - Extract:
tar -xzf pytodo-qt-VERSION-linux-*.tar.gz - Run the install script:
cd pytodo-qt-*/ && ./install.sh - Or run directly:
./pytodo-qt
The install script places the binary in ~/.local/bin/ and creates a desktop entry.
To uninstall: ~/.local/lib/pytodo-qt/uninstall.sh (or run ./uninstall.sh from the extracted archive)
Windows
- Download
pytodo-qt-VERSION-windows-x86_64.zip - Extract the zip file
- Run
pytodo-qt.exe
From PyPI
pipx install pytodo-qt # recommended
pip install pytodo-qt # alternative
From source
git clone https://github.com/berrym/pytodo-qt.git
cd pytodo-qt
pip install .
Development install
pip install -e ".[dev]"
Usage
pytodo-qt
Command-line options
Server Options:
-s, --server {yes,no} enable/disable network server
--pull {yes,no} allow remote pull requests
--push {yes,no} allow remote push requests
-i, --ip IP server bind address
-p, --port PORT server port
Discovery Options:
-d, --discovery {yes,no} enable/disable mDNS discovery
Appearance Options:
-t, --theme {light,dark,system}
Configuration
Configuration is stored in XDG-compliant locations:
| Platform | Config | Data |
|---|---|---|
| Linux | ~/.config/pytodo-qt/ |
~/.local/share/pytodo-qt/ |
| macOS | ~/Library/Application Support/pytodo-qt/ |
same |
| Windows | %APPDATA%\pytodo-qt\ |
same |
config.toml
[database]
active_list = ""
sort_key = "priority"
reverse_sort = false
[server]
enabled = true
address = "0.0.0.0"
port = 5364
allow_pull = true
allow_push = true
[discovery]
enabled = true
service_name = "" # defaults to pytodo-{hostname}
auto_sync_trusted = false # auto-sync when trusted devices come online
auto_sync_delay = 0 # seconds to debounce before auto-push (0 = disabled)
auto_sync_interval = 0 # minutes between periodic full syncs (0 = disabled)
[appearance]
theme = "system" # light, dark, system
Synchronization
pytodo-qt uses a secure peer-to-peer protocol for syncing between instances:
- Discovery - Instances advertise themselves via mDNS (
_pytodo._tcp.local.) - Key exchange - Ed25519 identity keys with X25519 ephemeral session keys
- Encryption - All data encrypted with AES-256-GCM
- Merge - Last-write-wins conflict resolution with UUID-based items
- Device management - Track peers with trust levels and organize into sync groups
- Sync rules - Control which lists sync to which device groups
- Auto-sync - Debounced push after changes, periodic full sync, and sync on trusted device discovery
- Offline queue - Queue syncs for offline devices, auto-execute when they come online
Identity keys are stored in your system keyring (GNOME Keyring, macOS Keychain, Windows Credential Locker).
Development
# Install dev dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Lint and format
ruff check src/ tests/
ruff format src/ tests/
# Type check
basedpyright src/
License
GPLv3 or later. See COPYING for details.
Copyright 2024-2026 Michael Berry trismegustis@gmail.com
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pytodo_qt-0.3.10.tar.gz.
File metadata
- Download URL: pytodo_qt-0.3.10.tar.gz
- Upload date:
- Size: 1.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
191cdb2c0e2640dac65149c219650ea0882222b574ef1766857095c3bd8591e0
|
|
| MD5 |
2171f3c02d89876ee1c9e883cc69c051
|
|
| BLAKE2b-256 |
22723a2e7b033c3939ca1a7a444cca16180de1393720ad44a8508cc16ce08d45
|
Provenance
The following attestation bundles were made for pytodo_qt-0.3.10.tar.gz:
Publisher:
publish.yml on berrym/pytodo-qt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pytodo_qt-0.3.10.tar.gz -
Subject digest:
191cdb2c0e2640dac65149c219650ea0882222b574ef1766857095c3bd8591e0 - Sigstore transparency entry: 1011965226
- Sigstore integration time:
-
Permalink:
berrym/pytodo-qt@75f670df3f87e872fef134b6ab012b8c6635941b -
Branch / Tag:
refs/tags/v0.3.10 - Owner: https://github.com/berrym
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@75f670df3f87e872fef134b6ab012b8c6635941b -
Trigger Event:
release
-
Statement type:
File details
Details for the file pytodo_qt-0.3.10-py3-none-any.whl.
File metadata
- Download URL: pytodo_qt-0.3.10-py3-none-any.whl
- Upload date:
- Size: 1.0 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0974c7264c71bb756107bfe20e245e47bf33421abd71868d9fd78179067e0685
|
|
| MD5 |
34ef4e95882da132fd230fec6d160e2a
|
|
| BLAKE2b-256 |
0f15ddd2b97d5c4bb60a7d5a1845341537492191128f9735aae429e65e7b85c9
|
Provenance
The following attestation bundles were made for pytodo_qt-0.3.10-py3-none-any.whl:
Publisher:
publish.yml on berrym/pytodo-qt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pytodo_qt-0.3.10-py3-none-any.whl -
Subject digest:
0974c7264c71bb756107bfe20e245e47bf33421abd71868d9fd78179067e0685 - Sigstore transparency entry: 1011965261
- Sigstore integration time:
-
Permalink:
berrym/pytodo-qt@75f670df3f87e872fef134b6ab012b8c6635941b -
Branch / Tag:
refs/tags/v0.3.10 - Owner: https://github.com/berrym
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@75f670df3f87e872fef134b6ab012b8c6635941b -
Trigger Event:
release
-
Statement type: