The local CLI

A small script that talks to the running app, for people who would rather type than click. Entirely optional, and it stays on your machine.

What it can do

owntime status                            totals, unbilled count, pending owntime projects                          list your projects with rates owntime start "Acme — site audit"         start the timer (picked up in ~2s) owntime stop                              stop the timer owntime log 1.5 "kickoff call" --project Acme owntime help

Installing it

The script ships inside the app, at /Applications/owntime.app/Contents/Resources/scripts/owntime.mjs. Symlink it onto your path:

ln -sf "/Applications/owntime.app/Contents/Resources/scripts/owntime.mjs" /usr/local/bin/owntime

No chmod needed, the file already ships executable. Do not chmod it inside the app either: changing a file in a signed bundle breaks the signature, and macOS may then refuse to open the app. A symlink leaves the bundle alone, and keeps pointing at the current version after an update.

Rather not put anything on your path? Run it through node instead: node "/Applications/owntime.app/Contents/Resources/scripts/owntime.mjs" status

Needs Node 18 or newer, since the script uses fetch. Working from the source checkout? Symlink app/scripts/owntime.mjs the same way.

How it talks to the app

owntime listens on 127.0.0.1:45123, your machine only. The script reads the app’s local token and uses it for the commands that write. If the app is not running, every command tells you so rather than failing silently.

What it is not

It is not a second product and not a supported platform. It exists so that a timer can be started from a shell script, a Stream Deck, or a window manager shortcut. If you never open a terminal, you are not missing anything.

Next: keyboard shortcuts · what leaves your Mac