- Python 58.8%
- QML 24.5%
- Gherkin 13.4%
- Shell 3.3%
| .forgejo/workflows | Migrating to python + qml | |
| docs | Migrating to python + qml | |
| features | Add goal specifications and evolutions | |
| icons/86x86 | Migrating to python + qml | |
| python | Migrating to python + qml | |
| qml | Migrating to python + qml | |
| rpm | Migrating to python + qml | |
| scripts | cleanup | |
| .gitignore | cleanup | |
| Evolutions.txt | resolve EVO-110 | |
| GOAL.md | GOAL | |
| README.md | cleanup | |
| sailwa.desktop | Migrating to python + qml | |
SailWA — SailfishOS WhatsApp Client
A simple SailfishOS WhatsApp client for quickly exchanging messages from a secondary phone. Uses the WhatsApp Web multi-device protocol through a Python backend.
Product behavior
Canonical product behavior is described in features/.
The .feature files are the source of truth for what the software does. They are product specifications first and executable BDD scenarios second.
Implementation and delivery tracking belongs outside this directory. Stable feature and scenario IDs let other workflows refer back to the product behavior without making the spec a status surface.
Prerequisites
rpmbuildandtar(for building the RPM)- Python 3.12+ and pip (for development and testing)
pip install -r python/requirements.txt
Build
scripts/build
Output RPMs are written to .devloop/build/rpmbuild/RPMS/noarch/.
Requires rpmbuild and tar on the build host (sudo apt install rpm).
Uses the noarch RPM spec at rpm/sailwa.spec — no compilation step.
Test
Backend unit tests
Requires Python dependencies installed (see Prerequisites).
PYTHONPATH=python python3 -m pytest python/tests/ -x -v
QML smoke tests
Validates QML frontend structure without the Sailfish SDK runtime.
PYTHONPATH=python python3 -m pytest qml/tests/ -x -v
CI
Forgejo Actions runs both test suites and the RPM build on every push and
pull request to main.
Deploy
Deploy the built RPM to a SailfishOS device or emulator:
# To the SDK emulator (default: nemo@192.168.2.15)
./scripts/deploy.sh
# To a physical device
./scripts/deploy.sh nemo@10.0.0.42
The script copies the RPM via SCP and installs it with pkcon install-local.
Development workflow
Run the Python backend directly
For frontend development, run the backend standalone:
python3 python/server.py
The backend listens on http://127.0.0.1:18080 by default. Change the port:
python3 python/server.py --port 18081
# or
SAILWA_PORT=18081 python3 python/server.py
Frontend QML
Edit QML files in qml/ directly — no rebuild needed for frontend changes
when running on-device. The RPM build packages files listed in rpm/sailwa.spec under %files.
Troubleshooting
| Problem | Likely cause | Fix |
|---|---|---|
rpmbuild not found |
RPM tools not installed | Install with sudo apt install rpm |
| Backend won't start | Missing Python dependencies | pip install -r python/requirements.txt |
| Port conflict | Another process on port 18080 | Use --port to pick a different port, or stop the other process |
| Deployment SCP fails | Wrong IP or SSH key not set up | Check the device IP, add your SSH public key to the device: ssh-copy-id nemo@<ip> |
pkcon install-local fails on device |
RPM dependency not met | Try devel-su rpm -i /tmp/<rpm-file> instead |