Splode/pomotroid
58.7
Adequate · 30 September 2026
11.2k
lines of production code
TypeScript
with Rust
2
measurements over time
What this system is
Pomotroid is a desktop Pomodoro timer application built with Tauri 2, Rust, and Svelte 5. It manages focus sessions with a drift-corrected timer engine, persistent SQLite storage for settings and statistics, and a customizable theming system. The application provides real-time state broadcasting via WebSocket, global keyboard shortcuts, and audio notifications to support structured work and break cycles.
How it got here
2018 — Tauri 2 and Svelte 5 rewrite
12 changes.
The project underwent a complete architectural rewrite, migrating from an Electron and Vue.js stack to a native Tauri 2 application with a Svelte 5 frontend. This transition involved replacing the legacy build tooling and state management with modern alternatives like SvelteKit, Vite, and Rust-based backend services. Legacy components, configuration files, and development scripts were systematically removed to establish a streamlined, new project structure.
2026 — Tauri-based desktop rewrite
15 changes.
The project underwent a comprehensive rewrite to a Tauri-based desktop architecture, replacing the previous stack with a Rust backend and Svelte frontend. This period established core functionality including a drift-corrected timer engine, SQLite persistence, a dynamic theme system, and real-time WebSocket broadcasting, alongside new UI components for settings and statistics.
Features
Complete UI rewrite with new timer controls, settings, and localization
The application has been rewritten using Svelte and Tauri, introducing a redesigned user interface. The main view now features a central timer with a circular progress dial, play/pause/skip controls, and a compact 'mini controls' mode. A dedicated settings window has been added, organized into sections for appearance (with light/dark theme pickers and auto mode), notifications (including custom audio support), and about (with auto-update checks). The UI now supports local keyboard shortcuts for timer control, displays tooltips for various elements, and includes localization support for multiple languages. The titlebar provides window management and access to settings and statistics.
src/lib · high confidence
Initial app shell with window resizing, theme auto-switching, and local shortcuts
The application now launches with a main page that initializes settings, applies the active theme (including automatic switching based on the OS color scheme), and sets the user's locale. Users can resize the application window via invisible edge/corner handles (disabled on macOS where native decorations are used) and control the timer using local keyboard shortcuts for volume and fullscreen. The right-click context menu is also disabled by default to provide a cleaner interface.
src/routes · high confidence
New WebSocket server for real-time timer state and event broadcasting
A new optional WebSocket server has been added to the application, binding to localhost (127.0.0.1) on a configurable port. This server allows external clients to subscribe to real-time timer events, including round changes, pauses, resumes, resets, and start notifications. Clients can also request the current timer state directly via a 'getState' message. The server handles connection lifecycle gracefully, emitting a 'websocket:error' Tauri event if the port is already in use rather than crashing.
src-tauri/src/websocket · high confidence
New dedicated settings window with organized sections and live theme/locale updates
A new settings interface has been introduced, replacing the previous layout with a dedicated window featuring a sidebar navigation for Timer, Appearance, Notifications, Shortcuts, System, and About sections. This page handles the initialization of user preferences, including applying the correct theme (supporting auto light/dark mode based on OS settings) and setting the application locale on load. It also implements live updates, so changes to language or theme settings are reflected immediately without a restart, and it resolves a startup white-screen flicker by deferring the window show command until after the theme is applied.
src/routes/settings · high confidence
New release automation and database seeding scripts
Added three new scripts to the repository: bump-version.sh automates the release process by validating a semver input, updating version strings in tauri.conf.json, Cargo.toml, and package.json, refreshing Cargo.lock, renaming the CHANGELOG.md \[Unreleased\] section to the new version tag, and creating a git commit and annotated tag; new-release-cycle.sh complements this by inserting a fresh \[Unreleased\] header into CHANGELOG.md for the next development cycle; and seed-db.py generates realistic historical Pomodoro session data (work, short breaks, long breaks) into the local SQLite database, supporting options for custom day counts, database paths, clearing existing data, and dry-run previews.
scripts · high confidence
New statistics dashboard with daily, weekly, and yearly views
A new stats page has been added to the application, providing a dedicated interface for viewing usage statistics. The page features a tabbed layout allowing users to switch between 'Today', 'Week', and 'All Time' views. The 'Today' and 'Week' tabs display detailed statistics, while the 'All Time' tab includes a heatmap visualization. The component integrates with the application's settings and theme system, automatically applying the correct theme and locale on load, and refreshes data in response to session clears or setting changes.
src/routes/stats · high confidence
New theme system with bundled themes, custom user themes, and live updates
The application now includes a comprehensive theme management system. It ships with 38 bundled themes (including Andromeda, Ayu, Catppuccin variants, Dracula, Nord, and others) embedded in the binary. Users can also create and manage custom themes by placing JSON files in the \{app\_data\_dir}/themes/\ directory; these custom themes override bundled themes with matching names. The system automatically detects changes to custom theme files via a file watcher, debouncing events to avoid excessive reloads, and emits a \themes:changed\ event to update the UI in real time without requiring a restart.
src-tauri/src/themes · high confidence
Removals
Removal of Vue-based timer and event bus utilities
The legacy timer implementation and its associated event bus have been removed from the renderer utilities. This deletes the \event-bus.js\ file, which previously exported a global Vue instance for cross-component communication, and the \timer.js\ file, which managed countdown logic using \setInterval\ and emitted events like \timer-completed\ and \timer-started\ via that bus. Users relying on these specific utility modules for timer control or event listening will need to adopt the new timer architecture.
src/renderer/utils · high confidence
Removal of legacy Electron main process entry points
The legacy development and production entry points for the Electron main process (index.dev.js and index.js) have been removed. This cleanup eliminates the old window creation logic and development tooling setup, indicating a migration to a new application bootstrap structure.
src/main · high confidence
Removal of legacy electron-vue build and development tooling
The legacy electron-vue scaffolding scripts and configuration files have been removed from the project. This includes the deletion of the build orchestrator (build.js), the development runner (dev-runner.js), the hot-reload client (dev-client.js), and the specific Webpack configurations for the main process, renderer process, and web target. Users relying on the previous development workflow or build commands associated with these files will need to adopt the new build system replacing this directory.
.electron-vue · high confidence
Architecture
Project rewritten to Tauri 2, Rust, and Svelte 5 with new developer tooling
Pomotroid has been rebuilt from the ground up, replacing the previous Electron + Vue.js stack with a native Tauri 2 application backed by Rust and a Svelte 5 frontend. This rewrite introduces a new SvelteKit build configuration, integrates Prettier with the Svelte plugin for consistent code formatting, and establishes a new project structure with dedicated documentation for themes, security, and contributing. The change also includes the removal of legacy configuration files such as \.babelrc\, \.eslintrc.js\, and the old CI scripts (\.travis.yml\, \appveyor.yml\), streamlining the development environment for the new architecture.
(repo-wide) · high confidence
Behavioural changes
7 commits (0 fixes) modifying build
A change to existing behaviour in build — 7 commits, 3 files.
build · medium confidence · unverified
Application restructured with new theming and typography
The application has been rewritten to use a new global CSS structure that defines CSS custom properties for dynamic theming, allowing colors to be overridden at runtime. It introduces embedded variable fonts (Mona Sans and Mona Sans Mono) for improved typography and optical sizing. The entry point has migrated from an EJS template to a SvelteKit HTML layout, and the app title is now capitalized as 'Pomotroid'.
src · high confidence
Audio engine rewritten with custom sound support and rodio integration
The audio module has been completely rewritten to use the rodio library, introducing a dedicated OS thread for playback to ensure stability. Users can now upload and configure custom audio files for work alerts, short break alerts, and long break alerts, which are stored in the application data directory and take precedence over the built-in embedded sounds. The system also includes validation for supported formats (such as ADPCM WAV) and handles edge cases like waking from standby.
src-tauri/src/audio · high confidence
Database schema migration and new statistics queries introduced
The application now includes a database migration system that upgrades the SQLite schema, specifically converting timer duration settings from minutes to seconds and seeding new configuration defaults such as disabled global shortcuts and enabled local keyboard shortcuts. Additionally, new database queries have been added to support statistics visualization, allowing the app to retrieve daily, weekly, and all-time work session stats, including completion rates and hourly breakdowns.
src-tauri/src/db · high confidence
Initial project rewrite with Tauri backend
The application has been rewritten from the ground up using Tauri, replacing the previous architecture with a Rust backend that exposes IPC commands to the frontend. This change introduces a new command system for managing the timer, settings, themes, and statistics, alongside dedicated modules for audio management, global shortcuts, system tray integration, and desktop notifications. The rewrite also establishes a persistent database layer for storing user settings and session history, and implements platform-specific behaviors such as Linux notification dispatch via subprocess and asynchronous tray creation to prevent UI blocking.
src-tauri/src · high confidence
Initial project rewrite with Tauri configuration and build automation
The src-tauri directory has been rewritten to establish the Tauri-based desktop application structure. This includes a new tauri.conf.json that defines the app as 'Pomotroid' (v1.7.1) with specific window settings, security policies, and an updater plugin configuration pointing to a GitHub raw endpoint. A new build.rs script automates versioning by parsing git tags and SHA hashes to generate build metadata, while a .gitignore file excludes generated Cargo and Tauri schema artifacts.
src-tauri · high confidence
Removal of Vuex store implementation
The application's state management layer based on Vuex has been removed. The main store configuration file, the module index, and the specific Counter module (which tracked a round number) have all been deleted from the codebase. This indicates a migration away from the previous Vuex-based architecture, likely to a different state management solution or a simplified approach, as the infrastructure for managing reactive state via Vuex is no longer present.
src/renderer/store · high confidence
Removal of core renderer entry points and root component
The main.js entry point, the root App.vue component, and the assets placeholder have been deleted from the renderer directory. This removes the standard Vue application initialization and the primary Timer component wrapper, indicating a structural shift in how the renderer is bootstrapped or a migration to a different rendering architecture.
src/renderer · high confidence
Removal of empty static placeholder file
The empty .gitkeep file in the static directory has been removed, indicating that the directory is no longer required to exist as an empty placeholder in the repository structure.
static · high confidence
Removal of legacy Timer component
The legacy Timer.vue component has been removed from the application. This component previously provided basic timer controls (start, pause, resume, reset) and displayed time in a simple text format. Its removal indicates a shift in how timer functionality is handled, likely replaced by the newly introduced timer-controller component mentioned in the commit history.
src/renderer/components · high confidence
Removal of placeholder files in dist directories
The placeholder files (.gitkeep) in the dist/electron and dist/web directories have been removed. This cleanup eliminates empty directory markers that previously ensured these build output paths existed in the repository, reflecting a shift in how these distribution artifacts are managed.
dist · high confidence
Reworked settings storage and introduced platform-specific global shortcuts
The application's settings system has been rewritten to use a SQLite database for persistence, replacing the previous storage mechanism. This change introduces a new set of default configuration values, including a 'Pomotroid Light' theme, a countdown-style timer dial, and local keyboard shortcuts for timer control. A key behavioral change is the introduction of global keyboard shortcuts for timer management (toggle, reset, skip, restart), which are disabled by default and feature platform-specific default bindings (Super+Shift on macOS, Control+F keys on other platforms). Additionally, the settings now support persistent window positioning and size, auto-updates, and verbose logging.
src-tauri/src/settings · high confidence
Rewritten timer engine with drift correction and configurable break sequencing
The timer logic in \src-tauri/src/timer\ has been rewritten to use a dedicated OS thread with a drift-correcting loop that schedules ticks against a monotonic clock, eliminating cumulative timing errors. The new engine supports precise state management including start, pause, resume, reset, skip, and suspend/wake-resume commands, and exposes detailed events (Started, Tick, Complete, Paused, Resumed, Reset, Suspended) to the frontend. The sequence module now handles Pomodoro-style round progression (Work → Short Break → Work → Long Break) with configurable durations and support for disabling short or long breaks, while maintaining a session work count for tracking focus rounds across cycles. The TimerController provides a clean API for managing the timer state and integrates with system tray, database, and WebSocket broadcasting.
src-tauri/src/timer · high confidence
System tray icon now reflects active theme colors and supports countdown mode
The system tray icon is now rendered dynamically using colors from the active application theme (background, focus, short, and long round colors) instead of a static image, ensuring visual consistency when users switch themes. Additionally, the tray icon now visually indicates the timer's state, including a progress arc and pause indicators, and supports a countdown dial mode in addition to the default incrementing behavior. The tray menu also includes common controls (start, pause, resume, skip, reset round) and respects the 'min\_to\_tray' setting for creation/destruction.
src-tauri/src/tray · high confidence
Updated Android app launcher icon assets
The Android application now uses a new launcher icon configuration. The diff introduces an adaptive icon definition (ic\_launcher.xml) that specifies a foreground drawable and a white background color, replacing the previous icon assets. This ensures the app icon displays correctly on Android 8.0 (API level 26) and above with the new adaptive icon style.
src-tauri/icons · high confidence
Dependencies
Project rewritten to Tauri 2 and SvelteKit with updated dependencies
The application has been rewritten from an Electron/Vue stack to a Tauri 2 and SvelteKit architecture. This change updates the core runtime dependencies, replacing Vue and Vuex with Svelte 5 and @sveltejs/kit, and switching the build tool from Webpack to Vite. The desktop backend now uses Tauri 2 (including plugins for dialog, log, notification, opener, and updater) instead of Electron, and the Rust backend dependencies (such as rodio, rusqlite, and axum) have been updated to their latest major versions. The project version is now 1.7.1.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 61 → 59 (-1.8)
- Rubric changed (rubric-2026.09.10 → rubric-2026.09.18) — scores are not directly comparable.
Lenses
- Code Health 57 → 57 (+0.0)
- Architecture 100 → 99 (-1.2)
- Maturity 66 → 66 (+0.0)
- Readiness 61 → 53 (-7.8)
- Security 60 → 71 (+10.8)
- Event Sourcing 100 → 100 (+0.0)
- Accessibility 60 → 60 (+0.0)
- Performance 100 (new)
Resolved (6)
- Dependency hygiene PARTLY measured — npm pinning read, dependency currency not (no pnpm-resolved versions to grade)
- Documentation: no installation or build instructions (README.md)
- Documentation: no licence statement (README.md)
- Documentation: no usage examples (README.md)
- Hotspot: src-tauri/src/commands.rs (src-tauri/src/commands.rs)
- Hotspot: src/lib/utils/localShortcuts.ts (src/lib/utils/localShortcuts.ts)
New (22)
- Documentation: no architecture or design documentation
- Duplicate types with identical structure. Both types contain exactly the same three properties (work_alert, short_break_alert, long_break_alert) of type PathBuf. This creates unnecessary maintenance overhead and confusion about which type to use in different contexts.
- Functional duplication between the controller method and the command handler. 'TimerController.toggle()' is the core logic, while 'commands.timer_toggle' is a wrapper that likely calls it. While this separation of concerns (logic vs. IPC/command handling) is common, the naming 'timer_toggle' in commands mirrors the controller method exactly, and without seeing bodies, it's unclear if the command does additional work. However, the more glaring issue is the inconsistency in how other actions are exposed. For example, 'TimerController' has 'reset', 'skip', 'restart_round', but the commands module exposes 'timer_reset', 'timer_skip', 'timer_restart_round'. This is consistent, BUT 'TimerController' also has 'suspend' and 'wake_resume', while the commands module does NOT expose 'timer_suspend' or 'timer_wake_resume'. This implies the public API surface (commands) is incomplete compared to the internal controller capabilities, or the naming convention is inconsistent (timer_* vs direct method calls).
- Inconsistent return type and purpose. 'parse_hex_color' returns a PathBuf, which is highly unusual for a color parsing function (typically returns a color struct or tuple). 'TrayColors.from_colors_map' returns a TrayColors struct. The naming 'parse_hex_color' suggests it converts a string to a color, but returning a PathBuf implies it might be saving the color to a file or returning a path to a cached resource, which is confusing. If it returns a PathBuf, it should be named 'save_hex_color_to_file' or similar. If it returns a color, the return type is wrong.
- Medium CVE: [GHSA redacted] (package-lock.json)
- Medium vulnerability: RUSTSEC-2026-0285 (src-tauri/Cargo.lock)
- Outdated: futures-util
- Outdated: log
- Outdated: rusqlite
- Outdated: serde
- Outdated: serde_json
- Outdated: symphonia-codec-adpcm
- Outdated: tauri
- Outdated: tauri-build
- Outdated: tauri-plugin-dialog
- Outdated: tauri-plugin-global-shortcut
- Outdated: tauri-plugin-log
- Outdated: tauri-plugin-notification
- Outdated: tauri-plugin-opener
- Outdated: tauri-plugin-updater
- …and 2 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
Splode/pomotroid was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 30 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit f9f0b266f7a04b895599ca660544219c0d0df054 — the exact code this score is about.
- Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-505904ce13c1.