A quiet Windows companion for active-time tracking and session-focused tasks.
Lapse starts tracking automatically, pauses when Windows is idle, locked, or asleep, and keeps a small task list close by without getting in your way.
I believe Lapse can be a genuinely useful tool because I noticed how helpful it is when a timer starts automatically with the PC. There is nothing to remember or set up at the beginning of a session—the elapsed time is simply there whenever I need it, making it much easier not to lose track of how long I have been at the computer.
- Accurate active time — uses monotonic intervals instead of assuming every timer tick arrived on time.
- Automatic activity awareness — pauses after five minutes of inactivity and reacts to lock, unlock, sleep, and resume events.
- Session todo list — add, complete, edit, and remove the few tasks that matter right now.
- Two overlay modes — switch between the full task view and a compact
244 × 52timer strip. - Useful history — review daily totals, a seven-day overview, recent sessions, and foreground-application usage.
- Native Windows behavior — always-on-top support, multi-monitor-safe positioning, autostart, system tray controls, and close-to-tray.
- Private by design — all data stays on the device; there are no accounts, cloud sync, or telemetry.
The expanded overlay combines the current session timer with a deliberately small task list. Collapse it when you only need a glance at the timer and progress.
| Focus view | Compact view |
![]() |
![]() |
| Timer, session status, progress, and tasks | Time and progress at a glance |
Lapse currently targets Windows 10 or newer and Flutter's experimental Desktop Windowing API.
- Flutter on the
mainchannel - Visual Studio with the Desktop development with C++ workload
- Windows desktop and experimental windowing support enabled
flutter channel main
flutter upgrade
flutter config --enable-windows-desktop
flutter config --enable-windowing
flutter pub get
dart run build_runner build
flutter run -d windowsThe current project was developed with Flutter 3.48.0-1.0.pre-515 and Dart 3.14.0-179.0.dev from 29 August 2026.
Warning
Flutter's Desktop Windowing API is experimental. Lapse intentionally follows Flutter's main channel, so SDK upgrades may require code changes.
Lapse stores its versioned state locally at:
%LOCALAPPDATA%\Lapse\state.json
The file contains session time, tasks, application usage summaries, history, and preferences. Application usage is stored as an executable identity, a resolved display name, and cumulative active duration rather than a chronological activity log. Writes are atomic, state is checkpointed every 30 seconds, and same-boot sessions can be recovered after a restart.
The app uses Flutter and Riverpod for its UI and shared session state, with a small native Windows runner bridge for capabilities that the experimental Flutter API does not expose yet.
Flutter UI
├── Overlay window
├── Dashboard window
└── Riverpod session state
├── Active-time and application-usage accumulators
├── Versioned JSON persistence
└── Windows platform services
├── Activity, lock, and power events
├── Foreground application metadata
└── Tray, autostart, topmost, and window positioning
The overlay and dynamically registered Dashboard have separate WindowControllers while sharing a single session controller and persistence layer.
Experimental Windowing API details
Lapse currently uses:
runWidget()instead ofrunApp()- internal
package:flutter/src/widgets/_window.dart WindowController,WindowControllerDelegate, andWindowWindowManager,WindowRegistry, andWindowEntryfor the DashboardWindowController.setSize()for overlay resizing
The two narrow analyzer suppressions around the internal import are intentional until Flutter publishes the API. They are not global analyzer exclusions.
- The experimental Windowing API can change between Flutter
mainrevisions. - Native styling currently identifies the overlay and Dashboard by their centrally defined window titles.
- Boot identity uses a rounded Windows boot-time heuristic derived from
GetTickCount64; a large system-clock correction can conservatively start a fresh session. - An abrupt process termination can lose the current uncheckpointed interval. Normal close-to-tray and Quit actions persist first.
- Lapse is Windows-only.


