rTimelogger is a cross-platform command-line time tracking tool written in Rust. It tracks working time using IN / OUT events, supports multiple locations, lunch rules, working gaps, and computes expected exit time and daily surplus accurately.
π Whatβs new in v0.8.2
ποΈ Database migration
Starting from v0.8.2, rTimelogger automatically migrates the database schema to support the new National holiday
position.
- The migration extends the
events.positionCHECK constraint - The migration is idempotent (no changes are applied if the schema is already up to date)
- No manual action is required
π§ Notes
- Holiday should be used for personal leave days
- National holiday should be used for public holidays defined by law or company calendar
- Future versions may introduce calendar-based automation for national holidays
β¨ Features
-
Event-based time tracking (IN / OUT)
-
Multiple working positions:
OOfficeRRemoteCClient / On-siteNNational holidayHHolidayMMixed
-
Automatic calculation of:
- expected exit
- daily surplus
-
Configurable lunch rules
-
Event mode with:
- pairing
- per-pair summaries
- JSON output
- unmatched detection
-
Internal audit log
-
Safe database migrations with automatic backups
-
Cross-platform (Linux, macOS, Windows)
π¦ Installation
π¦ Cargo (recommended)
π§ Arch Linux (AUR)
# or
πΊ Homebrew (macOS / Linux)
π§π¦ Linux (Debian / Ubuntu)
Starting from v0.8.0, rFortune provides an official .deb package.
You can install it directly from the GitHub Releases page:
To verify integrity, download the corresponding .sig file and verify it with GPG (see below).
If dependencies are missing, complete the installation with:
π§π§ Other Linux distros
You can still use the prebuilt tarball:
π macOS
You can use the prebuilt tarballs for Intel or Apple Silicon:
or
πͺ Windows
Download the prebuilt zip file, extract it, and move rtimelogger.exe to a directory in your PATH, e.g.,
C:\Windows\System32\ or create a dedicated folder like C:\Program Files\rtimelogger\ and add it to your system
PATH.
βοΈ Configuration
Initialize configuration and database:
Example rtimelogger.conf:
database: /home/user/.rtimelogger/rtimelogger.sqlite
default_position: O
min_work_duration: 8h
lunch_window: 12:30-14:00
min_duration_lunch_break: 30
max_duration_lunch_break: 90
separator_char: "-"
show_weekday: None # None | Short | Medium | Long
Override database path at runtime:
π§ Main commands overview
| Command | Description |
|---|---|
init |
Initialize DB and config |
add |
Add or edit IN / OUT events |
list |
Show sessions, events, or details |
del |
Delete events or pairs (with confirmation) |
backup |
Backup database (optional compression) |
export |
Export data (CSV / JSON / XLSX / PDF) |
db |
Database utilities |
config |
Manage configuration file |
log |
Show internal audit log |
β Add work sessions β rtimelogger add
Examples:
π Day positions
rTimelogger supports multiple day positions to describe how a working day (or non-working day) is classified.
Supported positions
| Code | Name | Description |
|---|---|---|
O |
Office | Regular office working day |
R |
Remote | Remote working day |
C |
On-site | Working day at customer site |
M |
Mixed | Mixed working locations |
H |
Holiday | Personal holiday (counts against personal leave allowance) |
N |
National holiday | Public holiday (does not affect personal leave allowance) |
β Adding a national holiday
To mark a public/national holiday, use the add command with the national position.
or
Behavior
- No
--in,--out,--lunch, or--work-gapparameters are allowed - The day is recorded as a non-working public holiday
- The day does not contribute to worked time
- The day does not reduce personal holiday allowance
π List output behavior
National holiday days
In both standard and compact list views:
- All time-related fields are displayed as
--:-- - Target end (
TGT) is not computed - Worked delta (
ΞWORK) is neutral (-) - The day is clearly labeled as National holiday
Example:
2025-12-25 (Thu) | National holiday | --:-- | --:-- | --:-- | --:-- | -
βοΈ Holiday vs National holiday
| Aspect | Holiday (H) |
National holiday (N) |
|---|---|---|
| Working day | β | β |
| Counts as personal leave | β | β |
| Expected time | β | β |
| ΞWORK contribution | β | β |
| Requires time entries | β | β |
π Listing sessions β rtimelogger list
The list command displays saved work sessions, supporting multiple layouts and levels of detail.
Basic usage:
Shows the sessions for the current month using the default tabular layout.
π Supported periods
π Weekday display
The weekday is shown inside the date column, using the format:
YYYY-MM-DD (Mo)
YYYY-MM-DD (Monday)
The format is controlled by the show_weekday configuration option:
| Value | Output example |
|---|---|
none |
2025-12-19 |
short |
2025-12-19 (Mo) |
medium |
2025-12-19 (Mon) |
long |
2025-12-19 (Monday) |
π Standard output
Example:
DATE (WD) | POSITION | IN | LNCH | OUT | TGT | ΞWORK
---------------------------------------------------------------------------
2025-12-19 (Fr) | Remote | 08:55 | 00:30 | 18:27 | 17:01 | -02h04m
Columns explained:
- IN β first check-in of the day
- LNCH β total lunch break duration
- OUT β last check-out
- TGT β planned exit time (minimum required work time)
- ΞWORK β worked surplus or deficit
π§Ύ Pair details (--details)
Displays the individual IN/OUT pairs for the selected day. It is available only for single-day periods or
--today.
Output example:
DETAILS
PAIR | IN | OUT | WORKED | LUNCH | POSITION | WG
------------------------------------------------------
1 | 08:55 | 09:37 | 00h42m | 0m | Remote |
2 | 13:07 | 18:27 | 04h50m | 30m | Remote |
Columns explained:
- PAIR β pair index
- IN / OUT β timestamps for the pair
- WORKED β worked time for the pair
- LUNCH β lunch break for the pair
- POSITION β position for the pair
- WG β working gap indicator (π for working gap, βοΈ for non-working gap)
π¦ Compact view (--compact)
Shows a condensed, single-line-per-day view, suitable for long periods.
Example:
DATE (WD) | POSITION | IN / LNCH / OUT | TGT | ΞWORK
--------------------------------------------------------------------
2025-12-19 (Fr) | Remote | 08:55 / 00:30 / 18:27 | 17:01 | Ξ -02h04m
2025-12-22 (Mo) | Holiday | --:-- / --:-- / --:-- | --:-- | Ξ -
Characteristics:
- compact horizontal layout
- weekday forced to short format
- no pair details
β οΈ
--compactcannot be combined with--details
Events listing (--events)
Displays the raw IN / OUT events for the selected day.
Output example:
EVENTS:
Date Time | Type | Lunch | Position | Source | Pair | Work Gap
----------------------------------------------------------------------------------------
β 2025-12-19 08:55 | in | lunch 0 min | Remote | cli | 1 |
09:37 | out | lunch 0 min | Remote | cli | 1 |
13:07 | in | lunch 0 min | Remote | cli | 2 |
18:27 | out | lunch 30 min | Remote | cli | 2 |
ποΈ Holiday days
Days marked as Holiday:
- display no time values (--:--)
- do not affect surplus calculations
- are rendered as neutral rows
β Period total
At the end of the output, a cumulative total is always displayed:
Ξ£ Total ΞWORK: +02h04m
The total accounts for:
- lunch breaks
- work gaps
- holidays (neutral contribution)
π’ JSON output (--json)
Outputs the data in JSON format for easy integration with other tools or scripts.
ποΈ Delete data β rtimelogger del
All deletions require confirmation and automatically reindex pairs.
πΎ Backup database β rtimelogger backup
- confirmation before overwrite
- ZIP on Windows
- TAR.GZ on Linux/macOS
π€ Export data β rtimelogger export
Supported formats:
csvjsonxlsxpdf
Output path must be absolute.
Import data (JSON / CSV)
Starting from v0.8.3, rTimelogger supports importing work sessions and holidays from external files.
This feature is designed to simplify preventive data entry, especially for national holidays.
The import system is safe by default and provides a full dry-run mode.
Supported formats
JSON
Flexible JSON structures are supported. The following formats are valid:
Root object with holidays:
Root object with days:
Root array of day objects:
Notes:
positionis optional:- if omitted, it defaults to
NationalHoliday
- if omitted, it defaults to
nameis optional and stored in the eventmetafield
CSV
CSV files must include a header row.
Example:
date,position,name
2026-01-01,N,New Year
2026-01-06,N,Epiphany
2026-04-25,N,Liberation Day
Notes:
positionmust be a valid location code (N,H,O,R,C,M)- name is optional
Import command
Options
-
--file <path>: Path to the input file (required) -
--format <json|csv>: Input format (default: json) -
--dry-run: Simulate the import without modifying the database (strongly recommended) -
--replace: Replace existing events for conflicting dates (dangerous) -
--source <label>: Logical label describing the origin of imported data. The final stored value will include the format automatically (e.g. import (from json))
Import behavior
-
Only Holiday and NationalHoliday positions are accepted by default.
-
Dates with existing work events are skipped unless --replace is used.
-
Imported holidays:
- do not affect the vacation balance
- are treated as regular timeline entries
-
Each import generates a detailed summary:
- total rows
- imported
- skipped
- conflicts
- invalid rows
Example (dry-run)
Example (apply import)
Metadata and traceability
- Imported events store additional information in the meta field (JSON).
- The source field tracks the origin of the data:
- CLI entries β cli
- Imports β import (from json) / import (from csv)
This ensures full traceability of all events.
ποΈ Database utilities β rtimelogger db
βοΈ Configuration management β rtimelogger config
Missing fields are added automatically with defaults.
π Internal audit log β rtimelogger log
Shows timestamped internal operations (add, del, migrate, backup, β¦).
π Upgrading from older versions
If you are upgrading from 0.7.x or earlier, read:
β‘οΈ UPGRADE-0.7-to-0.8.md
This document explains:
- schema changes
- migration behavior
- removed legacy features
- important behavioral differences
π Documentation
- π CHANGELOG.md
- π UPGRADE-0.7-to-0.8.md
π License
MIT License β see LICENSE.