No description
  • Rust 68.6%
  • Svelte 19%
  • TypeScript 8.7%
  • JavaScript 3.3%
  • HTML 0.4%
Find a file
florian 255d0695b3
Some checks are pending
CI / Core tests (macos-latest) (push) Waiting to run
CI / Core tests (windows-latest) (push) Waiting to run
CI / Core tests (ubuntu-latest) (push) Successful in 1m1s
CI / Frontend lint (push) Successful in 25s
CI / Commitlint (push) Has been skipped
Release / Semantic Release (push) Successful in 52s
Release / Build windows-x64 (push) Waiting to run
Release / Build macos-arm64 (push) Waiting to run
CI / Tauri build check (Linux) (push) Successful in 4m12s
Release / Build linux-x64 (push) Has been skipped
Merge pull request 'chore: Configure Renovate' (#1) from renovate/configure into main
Reviewed-on: #1
2026-06-14 02:46:45 +02:00
.cargo ci: fix pipeline — workspace split (core/tauri), lld linux-only, signing optional 2026-03-13 14:50:09 +01:00
.github/workflows feat: proper tauri.conf.json (window config, tray, bundle) + CI streamline 2026-03-13 15:11:24 +01:00
.husky ci: add code quality + release pipeline (lint/test/commitlint/multi-os-release) 2026-03-13 13:24:50 +01:00
crates/hermesx-core feat(ui): dry-run toast feedback, manual booking buttons (behind manual_mode setting), perform_manual_action IPC 2026-03-13 16:48:41 +01:00
docs feat: project scaffold + all analysis docs (architecture, user-stories, selectors, tech-stack, feature-parity) 2026-03-13 13:15:39 +01:00
scripts ci(release): set up semantic-release with version sync across Cargo.toml + tauri.conf.json 2026-03-13 14:58:26 +01:00
src fix(sidecar): dev path uses CARGO_MANIFEST_DIR (reliable), production falls back to next-to-binary; fix MANUAL_ACTIONS keys to match sidecar (mobiles-arbeiten-start etc) 2026-03-13 18:24:25 +01:00
src-sidecar fix(sidecar): use correct ZeusX URL and login flow from zeus-punch (zeusx.intersport.de, JS clicks, workspace.aspx wait) 2026-03-13 18:52:50 +01:00
src-tauri chore(release): 1.9.20 [skip ci] 2026-03-13 18:04:48 +00:00
.commitlintrc.json ci: add code quality + release pipeline (lint/test/commitlint/multi-os-release) 2026-03-13 13:24:50 +01:00
.gitignore fix(sidecar): commit pre-built dist/index.js so Mac dev doesn't require local sidecar build 2026-03-13 18:29:24 +01:00
.gitignore.note ci: fix pipeline — workspace split (core/tauri), lld linux-only, signing optional 2026-03-13 14:50:09 +01:00
.prettierrc.json ci: add code quality + release pipeline (lint/test/commitlint/multi-os-release) 2026-03-13 13:24:50 +01:00
.releaserc.json ci(release): set up semantic-release with version sync across Cargo.toml + tauri.conf.json 2026-03-13 14:58:26 +01:00
Cargo.lock fix(sidecar): use correct ZeusX URL and login flow from zeus-punch (zeusx.intersport.de, JS clicks, workspace.aspx wait) 2026-03-13 18:52:50 +01:00
Cargo.toml ci: fix pipeline — workspace split (core/tauri), lld linux-only, signing optional 2026-03-13 14:50:09 +01:00
CHANGELOG.md chore(release): 1.9.20 [skip ci] 2026-03-13 18:04:48 +00:00
eslint.config.js fix(lint): svelte-eslint-parser with typescript, remove unused ActionResult import, any→unknown 2026-03-13 18:01:16 +01:00
index.html feat(frontend): add Svelte 5 UI (App, Settings, tauri IPC wrappers, vite config) 2026-03-13 15:04:10 +01:00
package-lock.json fix(tray): register positioner on_tray_event hook to fix TrayBottomCenter panic; suppress dead_code in selectors.rs 2026-03-13 18:16:01 +01:00
package.json chore(release): 1.9.20 [skip ci] 2026-03-13 18:04:48 +00:00
README.md docs: rewrite README with emoji headings, badges, architecture diagram, roadmap 2026-03-13 16:04:44 +01:00
renovate.json Add renovate.json 2026-06-14 00:45:21 +00:00
rust-toolchain.toml ci: add code quality + release pipeline (lint/test/commitlint/multi-os-release) 2026-03-13 13:24:50 +01:00
svelte.config.mjs fix(frontend): vite.config.mts (ESM), svelte-plugin@4 for Svelte 5, dist builds clean 2026-03-13 15:12:25 +01:00
tsconfig.json feat(frontend): add Svelte 5 UI (App, Settings, tauri IPC wrappers, vite config) 2026-03-13 15:04:10 +01:00
vite.config.mts fix(frontend): vite.config.mts (ESM), svelte-plugin@4 for Svelte 5, dist builds clean 2026-03-13 15:12:25 +01:00

🪶 HermesX

CI Release Latest Release

A lightweight ZeusX companion for mobile workers — track your time without touching the browser.

HermesX sits quietly in your system tray and handles ZeusX time-tracking bookings with a single click. Start work, take breaks, finish your day — no browser needed.

Rewritten from Electron → Tauri 2 for a fraction of the memory footprint (~30 MB vs ~150 MB+) and proper OS keychain support.


Features

One-click time tracking — Start, pause, and finish Mobiles Arbeiten from the tray
🔔 Smart reminders — Late start, long work streaks, break overruns, end-of-day alerts
🔇 Suppression-aware — Quiet mode, suppress during calls or gaming
💾 Persistent state — Remembers your work state across reboots
🔐 Secure credentials — OS keychain (no plaintext storage)
🏠 Auto-start — Launches with Windows/macOS login
🚀 Tiny footprint — ~5 MB bundle, ~30 MB RAM
🧪 Dry Run mode — Test all flows without touching ZeusX

🏗️ Architecture

┌──────────────────────────────────────────────────┐
│  Systray (Tauri)                                 │
│  ┌─────────────┐  ┌───────────────────────────┐  │
│  │ App.svelte  │  │    Settings.svelte        │  │
│  │ status +    │  │ schedule, workdays, creds │  │
│  │ actions     │  └───────────────────────────┘  │
│  └──────┬──────┘                                 │
│         │ Tauri IPC                              │
│  ┌──────▼────────────────────────────────────┐   │
│  │  Rust Backend                             │   │
│  │  StateMachine · WorkMonitor · Notific.    │   │
│  │  Persistence · ZeusX Dispatcher           │   │
│  └───────────────────────┬───────────────────┘   │
│                          │ spawn sidecar          │
│  ┌───────────────────────▼───────────────────┐   │
│  │  zeus-sidecar (Node.js + Playwright)      │   │
│  │  → clicks ZeusX terminal buttons          │   │
└──┴───────────────────────────────────────────┘───┘

Key principle: dry_run: true → ZeusX dispatcher logs intent, never touches the browser. Safe for dev without production credentials.


🚀 Getting Started

Prerequisites

  • Rust stable (rustup install stable)
  • Node.js 20+, npm
  • Tauri CLI: cargo install tauri-cli --version "^2"

Development

git clone https://github.com/beisel-it/hermesx-tauri
cd hermesx-tauri
npm install
cargo tauri dev

The app starts with Dry Run mode enabled — no ZeusX calls until you configure credentials and disable it.

Build

cargo tauri build

🧪 Testing

# Core logic — pure Rust, no system deps needed
cargo test -p hermesx-core

# Lint + format check
cargo clippy -p hermesx-core -- -D warnings
cargo fmt -p hermesx-core -- --check

# Frontend
npm run build

19 unit tests covering StateMachine transitions, WorkMonitor scheduling, NotificationManager cooldowns, and CredentialStore operations.


⚙️ Configuration

Setting Default Description
Start time 08:30 When morning reminders begin
Work duration 8h Triggers end-of-day reminder
Break duration 30 min Break overrun threshold
Workdays MoFr Suppresses reminders on weekends
Dry Run false Disables all ZeusX automation
Quiet Mode false Disables all notifications

🔄 Release Process

Automated via semantic-release on every push to main:

Commit type Version bump
fix: Patch — 1.0.x
feat: Minor — 1.x.0
feat!: / BREAKING CHANGE: Major — x.0.0

Builds for: 🪟 Windows x64 · 🍎 macOS arm64 · 🐧 Linux x64


📁 Project Structure

hermesx-tauri/
├── crates/hermesx-core/     # Pure Rust — no system deps
│   └── src/
│       ├── config.rs        # UserConfig + defaults
│       ├── state_machine.rs # FSM: NotWorking / Working / Paused / Finished
│       ├── work_monitor.rs  # Schedule + activity evaluation
│       ├── credentials.rs   # Storage-agnostic credential trait
│       └── notification.rs  # Cooldown + suppression
├── src-tauri/               # Tauri binary
│   └── src/
│       ├── main.rs          # App setup, IPC, systray
│       ├── persistence.rs   # tauri-plugin-store wrappers
│       └── zeusX/           # Dispatcher + selector constants
├── src/                     # Svelte 5 frontend
│   ├── App.svelte
│   ├── Settings.svelte
│   └── lib/tauri.ts         # Typed IPC wrappers
└── docs/                    # Architecture, user stories, tech-stack

🗺️ Roadmap

  • ZeusX Sidecar (Playwright automation)
  • OS keychain credential backend
  • Lock-screen detection → auto-reminder
  • Meeting detection (Zoom/Teams)
  • WorkMonitor timer loop → live notifications
  • Windows test on florian-pc

🧬 Origin

HermesX started as an Electron app (florianbeisel/hermesx, v0.5.0). This rewrite keeps all original behaviour while shedding Chromium as a dependency.


Built with Tauri · Svelte 5 · Rust