Skip to content
CAI
Software that uses CAICheck a score

Splode/pomotroid

58.7

Adequate · 30 September 2026

11.2k

lines of production code

TypeScript

with Rust

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

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.