Two layers: daily goals for what you want done today, and strategies for things that span days or weeks.
Goals link to entries (work you've logged) and to strategies. Hours roll up from entries through goals into strategy reports.
strategy: "ship v2 auth"
├── goal: "implement oauth2 pkce" (2026-04-14) → entries #41, #42
├── goal: "add token refresh" (2026-04-15) → entry #45
└── goal: "write integration tests" (2026-04-16) → entry #48
hrs goals add "implement oauth2 pkce"
hrs goals add -d 2026-04-18 "review deployment docs"
hrs goals add -s 1 "write migration scripts"
hrs goals add -s 1 --ticket PROMO-123 "ship pat creation"
-d sets the date (defaults to today). -s links the goal to a strategy. --ticket attaches an external ticket reference (see ticket references). Place flags before the goal text — Go's flag parser stops at the first positional argument.
hrs goals # today's goals
hrs goals -d 2026-04-18 # specific date
hrs goals --format json # machine-readable
hrs goals done 1 # mark goal #1 complete
hrs goals done 1 -e 41,42 # complete and link entries #41 and #42
Linking entries connects the work you logged to the goal it achieved.
hrs goals link 1 -e 41,42 # link entries without completing
hrs goals undo 1 # reopen a completed goal
hrs goals rm 1 # delete a goal
Strategies span multiple days. Daily goals link up to them, and hrs rolls up progress across all linked goals.
hrs strategy add -t "ship v2 auth" -desc "oauth2, token refresh, integration tests"
hrs strategy add -t "ship pat creation" --ticket PROMO-150
Title can also be passed as a positional argument:
hrs strategy add "ship v2 auth"
--ticket attaches an external ticket reference (see ticket references).
hrs strategy # all strategies
hrs strategy -status active # filter by status
hrs strategy --format json # machine-readable
hrs strategy 1 # shorthand for report
hrs strategy report 1 # explicit
hrs strategy report 1 --format json # machine-readable
The report shows goal completion (e.g. 3/5 done), total hours rolled up from linked entries, and a list of all goals.
hrs strategy done 1 # mark as completed
hrs strategy archive 1 # pause (archive)
hrs strategy reopen 1 # set back to active
hrs strategy edit 1 -t "new title" -desc "updated description"
hrs strategy rm 1 # delete (unlinks goals, doesn't delete them)
The typical workflow:
hrs log# 1. create strategy
hrs strategy add -t "migrate to postgres"
# 2. set today's goals, linked to the strategy (-s flag)
hrs goals add "schema migration scripts" -s 1
hrs goals add "update connection pooling" -s 1
# 3. log work as you go
hrs log -c dev -t "wrote migration scripts" -b "up/down for users table;seed data" -e 2
# 4. complete goal, link the entry
hrs goals done 1 -e 50
# 5. check progress
hrs strategy 1
Link goals to a strategy with -s on the CLI or strategy_id via HTTP.
Both goals and strategies can carry an optional ticket_ref — a free-form string pointing at an external work item. Anything works:
PROMO-123PROJ-456ENG-789org/repo#42 or a full URLhrs strategy add -t "ship pat creation" --ticket PROMO-150
hrs goals add -s 1 --ticket PROMO-151 "filament ui"
hrs goals edit 5 --ticket "" # clear
Set the ticket on the strategy, the goal, or both — the filter ORs across them, so a goal under a PROMO-150 strategy still matches --ticket PROMO even when the goal itself carries no ticket.
hrs ls and hrs export accept --ticket to find every entry linked (through a goal) to a goal or strategy whose ticket matches the prefix:
# every entry tagged to a Promotheus ticket — for an R&D claim
hrs export --ticket PROMO --from 2026-01-01 --to 2026-12-31 --format csv
# narrow to one ticket
hrs ls --ticket PROMO-150 --from 2026-04-01
# combine with category
hrs export --ticket PROMO --category dev --format json
The match is a SQL LIKE prefix by default — --ticket PROMO becomes PROMO%. Include % or _ in your value to override.
Ticket filtering only sees entries that are linked to a goal. If you want work to count for a ticket-scoped report, complete the goal with -e <entry_ids> (or hrs goals link) so the link is recorded.
The TUI has a dedicated goals view. Press tab to switch between entries and goals. See TUI explorer for all keybindings.