FocuS is a native Sailfish OS timer for meditation, focus sessions, and interval training. No internet required — all data stays local.
- Custom timers with multiple phases (meditation, pause, etc.)
- Phase sounds (6 sounds + silent option)
- Repetitions (1–100×) for interval training
- Live Cover with countdown & play/pause/stop
- History & stats: calendar view, daily/monthly summaries
- Android import from MeditationTimer (ZIP, merge/replace)
- 100% offline — no network, no accounts, all data local
- Pure Rust core (no Qt) — fully testable with cargo test
- Clock-free core — time injected, active_seconds as single truth
- MVVM + ViewState — single rebuild per tick/command
- Atomic persistence (tmp+rename), JSON/JSONL, timer versioning
- Android import (from https://play.google.com/store/apps/details?id=com.vanniktech.meditationt...)
- Green-IT: clock-free core, 1s polling, chrono→time, atomic writes
License: GPL-3.0-or-later | Source: Codeberg (https://codeberg.org/koleesch/focus)
Created with AI assistance.
| Attachment | Size | Date |
|---|---|---|
| 656.55 KB | 12/09/2026 - 15:39 | |
| 670.34 KB | 12/09/2026 - 15:39 | |
| 656.38 KB | 13/09/2026 - 12:31 | |
| 670.77 KB | 13/09/2026 - 12:31 | |
| 672.17 KB | 15/09/2026 - 15:37 | |
| 662.07 KB | 15/09/2026 - 15:37 | |
| 662.08 KB | 17/09/2026 - 10:53 | |
| 675.98 KB | 17/09/2026 - 10:53 |
- Fix: Persist direct mutations (create/delete/duplicate/reset) immediately
- Fix: SessionSaved event removed, Finished(Session) used for session persistence
- Refactor: with_force_save for direct mutators, with_maybe_save for editor flow
- Fix: set_name and set_repeat_count now buffer via editor (commit_config)
Comments
p1rat
Fri, 2026/09/18 - 13:15
Permalink
great app, clean and simple for intervall training.
would be great, if possible to rename phases and have personal sounds.
koleesch
Fri, 2026/09/18 - 13:41
Permalink
Currently phases don’t have names. Could you explain your use case for naming them?
Personal sounds is a feature I’d also like to implement.
p1rat
Fri, 2026/09/18 - 17:52
Permalink
By giving the phases different names, it is possible to separate exercise intervals—for example, push-ups, sit-ups, etc.