Pomodoro-style timers and time tracking from the top panel. - One timer per topic (Study, Break, Gaming, ...) with play, pause and reset - Manage topics: add, edit, hide, delete and reorder - Daily, weekly and monthly stats per topic - Notification and sound when a timer finishes - Keeps running across lock screen, suspend and logout
Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.
| Version | Status |
|---|---|
| 1.0.0 (1) | Unreviewed |
FocusFlow 1.0.0 – Pomodoro-style timers and time tracking in the top panel. Target: GNOME Shell 46. License: GPL-2.0-or-later (LICENSE included). Source: https://github.com/Rahulrgd/focusflow-gnome unlock-dialog session mode: Used so that a timer that runs out while the screen is locked still plays its finish chime and shows its notification. While locked, the panel indicator is hidden (Main.sessionMode 'updated' -> container.visible = false, menu closed), and the keybinding's ActionMode is NORMAL | OVERVIEW, so nothing is reachable on the lock screen. This is also explained in a comment in disable(). What enable() creates and disable() removes: - PanelMenu.Button indicator (destroyed) - One GLib timeout (1 s tick, only while a timer runs; removed in destroy()) - Keybinding 'toggle-timer' via Main.wm.addKeybinding (removed) - MessageTray source for finish notifications (destroyed) - A Gio.FileMonitor on the history file (cancelled) - A system-bus signal subscription to logind PrepareForSleep, to finish an overdue timer right after resume (unsubscribed) - GSettings handlers (connectObject/disconnectObject) All references are set to null. Data and I/O: - Topics and settings in the extension's own GSettings schema. - Session history in ~/.local/share/focusflow/sessions.jsonl, written with async Gio calls (append_to_async / replace_contents_bytes_async). The only synchronous calls are one mkdir of that folder and one existence check of the bundled sound file at enable. - Nothing is sent over the network. Other notes: - All GObject classes have explicit, prefixed GTypeNames (FocusFlow*) to avoid clashes with other extensions. - No GTK/Adw imports in the shell process; prefs.js does not import Shell modules. - The finish sound (sounds/done.oga) is generated by a script in the repository, no third-party audio.