A simple TUI app for task, timer and invoicing for projects.
Track your time and bill for it without leaving the terminal. If Paca saves you a few minutes a week, a ⭐ on GitHub helps other freelancers find it.
- Project Management - Organize tasks by projects with color coding
- Task Tracking - Create, edit, and manage tasks with priorities and statuses
- Time Tracking - Start/stop timers with descriptions and hourly rates
- Timesheets - View uninvoiced time entries grouped by project
- Stripe Invoicing - Create draft invoices directly from time entries
- Invoice Management - View and manage all your Stripe invoices
- Dashboard - Overview of projects, tasks, and time stats
- Reports - Weekly/monthly hour & earnings analytics, trends, client and project breakdowns, work patterns
- Menu Bar - Native macOS menu bar companion for quick timer control
- Offline-first - All data stored locally in SQLite
- Vim-style Navigation - Keyboard-driven interface
npm install -g pacatui
pacabun install -g pacatui
pacagit clone https://github.com/wes/paca.git
cd paca
bun install
bun run startSimply run:
pacaOn first run, Paca will automatically create its database at ~/.paca/paca.db.
| Key | Action |
|---|---|
1 |
Dashboard |
2 |
Tasks |
3 |
Timesheets |
4 |
Invoices |
5 |
Reports |
6 |
Settings |
? |
Help |
t |
Start timer |
s |
Stop timer (when running) |
q |
Quit |
| Key | Action |
|---|---|
j / ↓ |
Move down |
k / ↑ |
Move up |
Tab |
Switch panels |
Enter |
Select/Confirm |
Esc |
Cancel/Go back |
| Key | Action |
|---|---|
← / → or h / l |
Previous/next report |
[ / ] |
Previous/next report |
j / k or ↑ / ↓ |
Scroll |
PgUp / PgDn |
Page through a report |
r |
Recalculate |
| Key | Action |
|---|---|
n |
Create new |
e |
Edit |
d |
Delete |
Space |
Toggle task status |
p |
Cycle priority |
a |
Archive/Unarchive project |
A |
Toggle show archived |
c |
Link customer to project |
| Key | Action |
|---|---|
Space |
Select entry for invoicing |
e |
Edit time entry |
d |
Delete time entry |
i |
Create invoice from selected |
| Key | Action |
|---|---|
Enter |
Open invoice in browser |
r |
Refresh list |
] |
Next page |
[ |
Previous page |
Access settings by pressing 6:
- Business Name - Your business name for invoices
- Stripe API Key - Enable invoicing features
- Timezone - Set display timezone (or auto-detect)
- Menu Bar - Toggle the macOS menu bar companion
- Export/Import - Backup and restore your data
- Database:
~/.paca/paca.db - Backups:
~/.paca/backups/— exports and daily auto-backups, with the Stripe key removed
Both live in a 0700 directory with 0600 files, readable only by you.
Paca includes a native macOS menu bar companion that shows your running timer and lets you start/stop timers without opening the TUI.
- Press
6to open Settings - Select Menu Bar and press
Enterto toggle it on
paca menubar enable # Compile & launch
paca menubar disable # Stop & remove
paca menubar status # Show current statusThe first time you enable it, Paca compiles a small native Swift helper binary (requires Xcode Command Line Tools). The paca mascot icon appears in your menu bar with live timer status.
Requires: Xcode Command Line Tools (xcode-select --install)
To enable invoicing:
-
Create a restricted key at dashboard.stripe.com/apikeys → Create restricted key. Paca needs exactly two write permissions:
- Customers — Write
- Invoices — Write
Leave everything else set to None. The key starts with
rk_. -
Press
6to go to Settings -
Add the key under Stripe API Key
-
Link customers to projects using
cin the Projects view -
Create invoices from the Timesheets view
Use a restricted (
rk_) key, not a standard secret (sk_) key. A secret key can move money, read your full customer list and issue refunds; a restricted key scoped as above can only do what Paca actually does. Paca will warn you if you paste ansk_key.
The key is stored in plain text in the SQLite database at ~/.paca/paca.db, which Paca keeps at 0600 inside a 0700 directory. That protects it from other users on the machine. It does not protect it from anything running as you, so:
- Do not put
~/.pacain a synced folder (Dropbox, iCloud Drive, a dotfiles repo). - Exports and the daily auto-backup in
~/.paca/backups/have the Stripe key stripped out, so those files are safe to copy elsewhere. After restoring from a backup, re-enter your key in Settings. - Rotate the key in the Stripe dashboard if you suspect the file has been copied.
- Runtime: Bun
- TUI Framework: @opentui/react
- Database: SQLite via libsql
- ORM: Prisma 7
- Payments: Stripe API
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
MIT - see LICENSE for details.


