Paca, a small alpaca

Track the work where you do the work.

Paca is a project manager, a stopwatch and an invoice writer that live in the terminal. Press t when you start, s when you stop, and i when it is time to get paid.

$npm install -g pacatui

MIT · free · needs Bun

paca — dashboard132×40
 1 dash  2 tasks  3 sheets  4 invoices  5 reports  6 settings  ? help                 Helio Patient Portal 57:32 $158.26 [s] Stop


  ████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
  ████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████

  Done 1   In Progress 5   To Do 15


                       37  32  33                                                          31
           28  27     ███ ▁▁▁ ▃▃▃  27          26                              28  30     ▁▁▁  28
   23  19 ▄▄▄ ▃▃▃  21 ███ ███ ███ ▃▃▃      19 ▂▂▂          20      23  24  24 ▅▅▅ ▇▇▇  20 ███ ▅▅▅  24 24
  ▆▆▆ ▁▁▁ ███ ███ ▄▄▄ ███ ███ ███ ███     ▁▁▁ ███  14  16 ▂▂▂  15 ▆▆▆ ▇▇▇ ▇▇▇ ███ ███ ▂▂▂ ███ ███ ███ ███
  ███ ███ ███ ███ ███ ███ ███ ███ ███  12 ███ ███ ▂▂▂ ▅▅▅ ███ ▄▄▄ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
  ███ ███ ███ ███ ███ ███ ███ ███ ███ ▇▇▇ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
  ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
  ───────────────────────────────────────────────────────────────────────────────────────────────────────
  3/8    3/22     4/5    4/19     5/3    5/17    5/31 6/7    6/21     7/5    7/19     8/2 8/9    8/23

  Helio Patient   Northwind Stor  Turnstile CMS  Rio Grande Boo  Paca  Total: 648h



  ┌─Recent Activity──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
   ! Send August invoices in Admin & Ops                                                                               Aug 11 
  ◐ ! Scheduler: block double-booking in Helio Patient Portal                                                            Aug 3 
  ◐ ! Ship the new cart drawer in Northwind Storefront                                                                  Jun 18 
  ◐ ! Redirect map QA — top 500 URLs in Turnstile CMS                                                                    Jun 4 
  ! Magic-link expiry is too aggressive in Helio Patient Portal                                                       May 29 
  ! Menu bar drift after sleep in Paca                                                                                Aug 26 
  ! Cut over production DNS in Turnstile CMS                                                                          Aug 25 
  ○ ! Earnings tab: YoY comparison in Paca                                                                              Aug 25 
  Publish 0.2.0 to npm in Paca                                                                                      Aug 23 
  Editor training session in Turnstile CMS                                                                          Aug 20 
  │                                                                                                                              │
  │                                                                                                                              │
  │                                                                                                                              │
  └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

 s Stop Timer  n New  e Edit  Tab Panel  q Quit                                                                    Welcome to Paca!

Every screen on this page is a real frame: Paca was run inside a pseudo-terminal against a seeded demo database and each cell it painted was recorded, colour and all. The clients and the invoices are invented. The rendering is not.

No tab to go and find.

Every timer you forget to start is a timer you had to leave the editor to start. Paca is one terminal split away, so the cost of logging the hour is a keystroke.

No account.

There is no sign-up, no server and nothing to log into. Your data is a SQLite file at ~/.paca/paca.db that you can copy, back up, or open with any tool that reads SQLite.

No subscription.

It is MIT-licensed and on npm. The only thing it ever talks to over the network is your own Stripe account, and only when you ask it to write an invoice.

Six screens

One number gets you anywhere.

The whole app is six views on one row of number keys, and it never nests. There is no menu to walk, no breadcrumb and no back button — the way back is the number of the place you came from.

1Dashboard
Task mix, a stacked six-month chart of hours by project, and what you touched last.
2Tasks
Projects on the left, that project's tasks on the right. Tab moves between them.
3Timesheets
Uninvoiced time grouped by project, with the money each line is worth.
4Invoices
Every Stripe invoice on the account, newest first, openable in the dashboard.
5Reports
Seven tabs of analytics over everything you have ever tracked.
6Settings
Business name, Stripe key, database, theme, timezone, menu bar, export and import.
paca — tasks132×15
 1 dash  2 tasks  3 sheets  4 invoices  5 reports  6 settings  ? help               Helio Patient Portal 1:15:14 $206.91 [s] Stop
┌─Projects──────────────────────────────────────────┐┌─Tasks - Helio Patient Portal────────────────────────────────────────────────┐
[*] Admin & Ops                              0/3  ! Magic-link expiry is too aggressive                            Tomorrow 
 [*] Helio Patient Portal $165/hr             0/5  ◐ ! Scheduler: block double-booking                                      3d 
[*] Northwind Storefront $145/hr             1/5  ! WCAG 2.2 AA pass on intake                                           7d 
│ [*] Paca                                     0/3  ! FHIR lab result mapping                                          Sep 25 
[*] Rio Grande Booking $135/hr               0/2  ! Insurance card OCR fallback                                      Sep 15 
[*] Turnstile CMS $140/hr                    0/3  │                                                                             │
│                                                   ││                                                                             │
│                                                   ││                                                                             │
│                                                   ││                                                                             │
│                                                   ││                                                                             │
│                                                   ││                                                                             │
└───────────────────────────────────────────────────┘└─────────────────────────────────────────────────────────────────────────────┘
 s Stop Timer  n New  e Edit  Tab Panel  q Quit                                                                    Welcome to Paca!

Projects left, that project's tasks right. Space cycles a task's status, p cycles its priority, and neither one moves the row you are standing on.

The timer

It counts money, not just minutes.

The header carries the running timer everywhere you go — project, elapsed time, and what that time is worth at the project's rate, ticking upward while you work. Which turns out to be the most persuasive argument there is for remembering to stop it.

  1. 01

    Start it from anywhere

    t opens the picker on whichever screen you are on. Pick a project, type what you are about to do, and it starts.

  2. 02

    It survives everything

    The running entry is a row in SQLite with no end time. Quit the app, close the terminal, reboot — it is still running when you come back.

  3. 03

    Fix it afterwards

    Forgot to start it at nine? e on a time entry edits the start, the end and the description, so the timesheet ends up honest.

  4. 04

    Or stay out of the app

    On macOS an optional menu-bar helper shows the live timer and starts and stops it, so you never open the TUI just to punch in.

paca — timesheets · all timers132×23
 1 dash  2 tasks  3 sheets  4 invoices  5 reports  6 settings  ? help               Helio Patient Portal 1:16:14 $209.69 [s] Stop

 All Timers (press 'a' to show billable only)                                                                          [ ← Week →

  Aug 30 - Sep 5                                                                                                     Total: 24h 8m 

  Sep 4  11:00 AM - 11:45 AM   45m      Northwind St…  $108.75   Order confirmation emails                                        
  Sep 4  8:00 AM - 10:30 AM    2h 30m   Paca           -         Reports — earnings tab                                           
  Sep 3  12:20 PM - 1:35 PM    1h 15m   Northwind St…  $181.25   Stripe webhook retry handling                                    
  Sep 3  11:35 AM - 12:00 PM   25m      Turnstile CMS  $58.33    Editorial preview environment                                    
  Sep 3  10:15 AM - 11:15 AM   1h 0m    Helio Patien…  $165.00   Care team assignment rules                                       
  Sep 3  8:00 AM - 9:30 AM     1h 30m   Helio Patien…  $247.50   Appointment scheduler calendar                                   
  Sep 2  2:30 PM - 3:55 PM     1h 25m   Helio Patien…  $233.75   Magic-link auth — token expiry                                   
  Sep 2  1:10 PM - 2:25 PM     1h 15m   Helio Patien…  $206.25   Message threads — read receipts                                  
  Sep 2  9:00 AM - 1:00 PM     4h 0m    Turnstile CMS  $560.00   Author permissions matrix                                        
  Sep 1  2:35 PM - 3:20 PM     45m      Helio Patien…  $123.75   Appointment scheduler calendar                                   
  Sep 1  12:15 PM - 2:30 PM    2h 15m   Turnstile CMS  $315.00   Draft autosave conflicts                                         
  Sep 1  9:50 AM - 11:15 AM    1h 25m   Helio Patien…  $233.75   FHIR mapping for lab results                                      
  Sep 1  8:45 AM - 9:45 AM     1h 0m    Turnstile CMS  $140.00   Redirect map for 4,100 URLs                                       
  Aug 31 10:45 AM - 10:53 AM   8m       Helio Patien…  $22.00    Accessibility sweep on intake                                     
  Aug 31 8:15 AM - 10:15 AM    2h 0m    Rio Grande B…  $270.00   Guide roster scheduling                                           
  Aug 30 11:00 AM - 12:15 PM   1h 15m   Northwind St…  $181.25   Gift card redemption edge cases                                   
 s Stop Timer  a billable only  navigate  [] page weeks  e edit  d delete                                          Aug 30 - Sep 5

a swaps the timesheet for every timer in the week, billable or not, with [ ] paging back through the weeks. The dash in the money column is a project with no rate on it.

Getting paid

From tracked hours to a Stripe draft, without a spreadsheet.

The timesheet is every hour you have tracked and not yet billed, grouped by project, each line already multiplied by that project's rate. Tick the ones you mean to charge for, press i, and Paca builds the invoice in your Stripe account — one line item per entry, dated and described exactly as you logged it.

paca — timesheets132×40
 1 dash  2 tasks  3 sheets  4 invoices  5 reports  6 settings  ? help                 Helio Patient Portal 57:56 $159.36 [s] Stop
 Timesheets (press 'a' to show all timers)
  Helio Patient Portal (Helio Health)                                                                            38h 35m $6366.25 
   [x] Sep 3  10:15 AM - 11:15 AM   1h 0m    $165.00   Care team assignment rules                                                  
   [x] Sep 3  8:00 AM - 9:30 AM     1h 30m   $247.50   Appointment scheduler calendar                                              
   [x] Sep 2  2:30 PM - 3:55 PM     1h 25m   $233.75   Magic-link auth — token expiry                                              
   [x] Sep 2  1:10 PM - 2:25 PM     1h 15m   $206.25   Message threads — read receipts                                             
   [ ] Sep 1  2:35 PM - 3:20 PM     45m      $123.75   Appointment scheduler calendar                                              
   [ ] Sep 1  9:50 AM - 11:15 AM    1h 25m   $233.75   FHIR mapping for lab results                                                
   [ ] Aug 31 10:45 AM - 10:53 AM   8m       $22.00    Accessibility sweep on intake                                               
   [ ] Aug 28 2:35 PM - 4:50 PM     2h 15m   $371.25   Appointment scheduler calendar                                              
   [ ] Aug 26 12:20 PM - 1:05 PM    45m      $123.75   Magic-link auth — token expiry                                              
   [ ] Aug 24 9:14 AM - 9:26 AM     12m      $33.00    Care team assignment rules                                                  
   [ ] Aug 24 8:15 AM - 8:40 AM     25m      $68.75    Provider directory search                                                   
   [ ] Aug 21 12:14 PM - 2:29 PM    2h 15m   $371.25   FHIR mapping for lab results                                                
   [ ] Aug 21 8:15 AM - 10:30 AM    2h 15m   $371.25   FHIR mapping for lab results                                                
   [ ] Aug 20 8:45 AM - 11:15 AM    2h 30m   $412.50   FHIR mapping for lab results                                                
   [ ] Aug 19 12:50 PM - 1:30 PM    40m      $110.00   HIPAA audit log middleware                                                  
   [ ] Aug 18 12:14 PM - 2:44 PM    2h 30m   $412.50   Session timeout warning modal                                               
   [ ] Aug 17 8:00 AM - 9:00 AM     1h 0m    $165.00   Session timeout warning modal                                               
   [ ] Aug 14 2:45 PM - 4:30 PM     1h 45m   $288.75   FHIR mapping for lab results                                                
   [ ] Aug 14 8:00 AM - 8:40 AM     40m      $110.00   Appointment scheduler calendar                                              
   [ ] Aug 13 12:30 PM - 1:10 PM    40m      $110.00   Accessibility sweep on intake                                               
   [ ] Aug 12 12:20 PM - 4:35 PM    4h 15m   $701.25   Message threads — read receipts                                             
   [ ] Aug 11 8:15 AM - 10:30 AM    2h 15m   $371.25   Provider directory search                                                   
   [ ] Aug 7  1:10 PM - 2:25 PM     1h 15m   $206.25   Push notification preferences                                               
   [ ] Aug 6  12:00 PM - 1:15 PM    1h 15m   $206.25   FHIR mapping for lab results                                                
   [ ] Aug 6  9:40 AM - 11:40 AM    2h 0m    $330.00   Provider directory search                                                   
   [ ] Aug 5  8:15 AM - 10:30 AM    2h 15m   $371.25   FHIR mapping for lab results                                                
                                                                                                                                   
  Northwind Storefront (Northwind Coffee)                                                                        33h 59m $4927.58  
   [ ] Sep 4  11:00 AM - 11:45 AM   45m      $108.75   Order confirmation emails                                                   
   [ ] Sep 3  12:20 PM - 1:35 PM    1h 15m   $181.25   Stripe webhook retry handling                                               
   [ ] Aug 30 11:00 AM - 12:15 PM   1h 15m   $181.25   Gift card redemption edge cases                                             
   [ ] Aug 28 12:45 PM - 2:15 PM    1h 30m   $217.50   Mobile nav rewrite                                                          
   [ ] Aug 28 10:15 AM - 11:45 AM   1h 30m   $217.50   Lighthouse pass on PDP                                                      
   [ ] Aug 28 8:00 AM - 9:30 AM     1h 30m   $217.50   Inventory sync with Square                                                  


 s Stop Timer  a all timers  navigate  e edit  d delete  _ select  i create invoice                              Welcome to Paca!
[x] — four lines ticked with Space. The group header keeps the running total for the whole project either way.
paca — create invoice132×40
 1 dash  2 tasks  3 sheets  4 invoices  5 reports  6 settings  ? help                 Helio Patient Portal 58:02 $159.64 [s] Stop
 Timesheets (press 'a' to show all timers)
  Helio Patient Portal (Helio Health)                                                                            38h 35m $6366.25 
   [x] Sep 3  10:15 AM - 11:15 AM   1h 0m    $165.00   Care team assignment rules                                                  
   [x] Sep 3  8:00 AM - 9:30 AM     1h 30m   $247.50   Appointment scheduler calendar                                              
   [x] Sep 2  2:30 PM - 3:55 PM     1h 25m   $233.75   Magic-link auth — token expiry                                              
   [x] Sep 2  1:10 PM - 2:25 PM     1h 15m   $206.25   Message threads — read receipts                                             
   [ ] Sep 1  2:35 PM - 3:20 PM     45m      $123.75   Appointment scheduler calendar                                              
   [ ] Sep 1  9:50 AM - 11:15 AM    1h 25m   $233.75   FHIR mapping for lab results                                                
   [ ] Aug 31 10:45 AM - 10:53 AM   8m       $22.00    Accessibility sweep on intake                                               
   [ ] Aug 28 2:35 PM - 4:50 PM     ┌──────────────────────────────────────────────────────────┐                                   
   [ ] Aug 26 12:20 PM - 1:05 PM    │                                                          │                                   
   [ ] Aug 24 9:14 AM - 9:26 AM     Create Stripe Invoice                                     
   [ ] Aug 24 8:15 AM - 8:40 AM     │                                                          │                                   
   [ ] Aug 21 12:14 PM - 2:29 PM    Helio Health ap@heliohealth.example                       
   [ ] Aug 21 8:15 AM - 10:30 AM    ────────────────────────────────────────────────────────  
   [ ] Aug 20 8:45 AM - 11:15 AM    Date     Description                 Hours        Amount  
   [ ] Aug 19 12:50 PM - 1:30 PM    Sep 3    Care team assignment rules  1.00        $165.00  
   [ ] Aug 18 12:14 PM - 2:44 PM    Sep 3    Appointment scheduler       1.50        $247.50  
   [ ] Aug 17 8:00 AM - 9:00 AM     calendar                                         
   [ ] Aug 14 2:45 PM - 4:30 PM     Sep 2    Magic-link auth — token     1.42        $233.75  
   [ ] Aug 14 8:00 AM - 8:40 AM     expiry                                           
   [ ] Aug 13 12:30 PM - 1:10 PM    Sep 2    Message threads — read      1.25        $206.25  
   [ ] Aug 12 12:20 PM - 4:35 PM    ────────────────────────────────────────────────────────  
   [ ] Aug 11 8:15 AM - 10:30 AM    │                                                          │                                   
   [ ] Aug 7  1:10 PM - 2:25 PM     Total    4 entries                   5.17        $852.50  
   [ ] Aug 6  12:00 PM - 1:15 PM    Rate: $165.00/hr                                          
   [ ] Aug 6  9:40 AM - 11:40 AM    Enter to create draft invoice, Esc to cancel              
   [ ] Aug 5  8:15 AM - 10:30 AM    │                                                          │                                   
                                    └──────────────────────────────────────────────────────────┘                                   
  Northwind Storefront (Northwind Coffee)                                                                        33h 59m $4927.58  
   [ ] Sep 4  11:00 AM - 11:45 AM   45m      $108.75   Order confirmation emails                                                   
   [ ] Sep 3  12:20 PM - 1:35 PM    1h 15m   $181.25   Stripe webhook retry handling                                               
   [ ] Aug 30 11:00 AM - 12:15 PM   1h 15m   $181.25   Gift card redemption edge cases                                             
   [ ] Aug 28 12:45 PM - 2:15 PM    1h 30m   $217.50   Mobile nav rewrite                                                          
   [ ] Aug 28 10:15 AM - 11:45 AM   1h 30m   $217.50   Lighthouse pass on PDP                                                      
   [ ] Aug 28 8:00 AM - 9:30 AM     1h 30m   $217.50   Inventory sync with Square                                                  


  CREATE INVOICE   s Stop Timer  a all timers  navigate  e edit  d delete  _ select  i create invoice            Welcome to Paca!
i — the draft, priced, before anything is sent. Paca stops at draft on purpose: the last look before a client sees it happens in Stripe.

The customer is created once

Link a customer to a project with c. The first invoice creates them in Stripe; every one after that reuses the same customer record.

Entries get marked billed

Anything that goes onto an invoice leaves the timesheet, so the list is always only what you still have to charge for.

Nothing leaves without a key

No Stripe key, no network. Settings holds it, and the settings screen only ever shows you the first and last four characters of it.

Reports

Seven tabs of it, drawn in text.

Bar charts out of block characters, sparklines out of eighth-blocks, tables that line up because everything is one cell wide. It is the part of the app that most wanted to be a web page and most stubbornly refused to become one.

Eight tiles, a 26-week stacked bar of hours by project, and the same five periods compared against the ones before them.

paca — reports · Overview132×44
 1 dash  2 tasks  3 sheets  4 invoices  5 reports  6 settings  ? help                 Helio Patient Portal 58:47 $161.67 [s] Stop

   Overview   Averages   Trends   Projects   Clients   Patterns   Earnings    ←/→ switch  ⇅ scroll

  ┌─────────────────────────────┐ ┌─────────────────────────────┐ ┌─────────────────────────────┐ ┌─────────────────────────────┐
  THIS WEEK                   │ │ THIS MONTH                  │ │ MONTH EARNINGS              │ │ UNBILLED                    
  24.1h                       │ │ 19.5h                       │ │ $2,573                      │ │ $17,052                     
  0% vs last week             │ │ -82% vs last month          │ │ proj. $19,300               │ │ 114h not invoiced            
  └─────────────────────────────┘ └─────────────────────────────┘ └─────────────────────────────┘ └─────────────────────────────┘ 
                                                                                                                                  
  ┌─────────────────────────────┐ ┌─────────────────────────────┐ ┌─────────────────────────────┐ ┌─────────────────────────────┐ 
  AVG / WEEK (3MO)            │ │ AVG / MONTH (3MO)           │ │ EFFECTIVE RATE              │ │ STREAK                       
  23.9h                       │ │ 104h                        │ │ $149/h                      │ │ 6 days                       
  $3,018 / wk                 │ │ $13,124 / mo                │ │ 84% billable                │ │ best 7 · 71% of days         
  └─────────────────────────────┘ └─────────────────────────────┘ └─────────────────────────────┘ └─────────────────────────────┘ 
                                                                                                                                  
  Weekly hours  last 26 weeks                                                                                                     
  37      33                                                                                               
  ███  32 ▂▂▂                                              28  30      31  28                               
  28  27     ███ ▇▇▇ ███  27          26                      24  24 ▁▁▁ ▄▄▄     ▆▆▆ ▁▁▁  24 24                        
  23  19 ███ ▇▇▇  21 ███ ███ ███ ▆▆▆      19 ▆▆▆          20      23 ▂▂▂ ▁▁▁ ███ ███  20 ███ ███ ▂▂▂ ▂▂▂                       
  ███ ▂▂▂ ███ ███ ▅▅▅ ███ ███ ███ ███     ▂▂▂ ███      16 ▃▃▃  15 ███ ███ ███ ███ ███ ▃▃▃ ███ ███ ███ ███                       
  ███ ███ ███ ███ ███ ███ ███ ███ ███  12 ███ ███  14 ▄▄▄ ███ ▃▃▃ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███                       
  ███ ███ ███ ███ ███ ███ ███ ███ ███ ▄▄▄ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███                       
  ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███                       
  ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███                       
  │ ───────────────────────────────────────────────────────────────────────────────────────────────────────                       
  3/8    3/22     4/5    4/19     5/3    5/17    5/31 6/7    6/21     7/5    7/19     8/2 8/9    8/23                           
   
  Helio Patient   Northwind Stor  Turnstile CMS  Rio Grande Boo  Paca  Total: 625h                                    
                                                                                                                                  
  Period comparison                                                                                                               
  PERIOD             HOURS       Δ      EARNED       Δ   DAYS  SESSIONS                                                         
  Today               3.3h    -22%        $109    -83%      1         2                                                         
  This week          24.1h      0%      $3,222     -1%      6        17                                                         
  This month         19.5h    -82%      $2,573    -82%      4        13                                                         
  Last 30 days        120h     +6%     $16,170    +14%     26        79                                                         
  This year           853h   +351%       $108k   +368%    176       554                                                         
                                                                                                                                  
  Weekly workload by client  average hours per week over rolling windows ending today                                             
  CLIENT / PROJECT              30 DAYS    90 DAYS   365 DAYS   TREND                                                           
  Helio Health                  9.0h/wk    6.4h/wk    5.8h/wk    +40%                                                           
  Northwind Coffee              7.2h/wk    5.1h/wk    4.9h/wk    +43%                                                           
 s Stop Timer  ←/→ report  scroll  r refresh                                                                     Welcome to Paca!

Themes

Five of them, and they colour the whole grid.

A theme is not a syntax palette bolted onto a fixed layout — it sets the background, the borders, the status colours and the colours projects get assigned from. Which is why the terminal window itself changes colour below.

paca — Catppuccin Mocha132×34
 1 dash  2 tasks  3 sheets  4 invoices  5 reports  6 settings  ? help               Helio Patient Portal 1:00:37 $166.73 [s] Stop


  ████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
  ████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████

  Done 1   In Progress 5   To Do 15

                       37  32  33                                                          31
           28  27     ███ ▁▁▁ ▃▃▃  27          26                              28  30     ▁▁▁  28
   23  19 ▄▄▄ ▃▃▃  21 ███ ███ ███ ▃▃▃      19 ▂▂▂          20      23  24  24 ▅▅▅ ▇▇▇  20 ███ ▅▅▅  24 24
  ▆▆▆ ▁▁▁ ███ ███ ▄▄▄ ███ ███ ███ ███     ▁▁▁ ███  14  16 ▂▂▂  15 ▆▆▆ ▇▇▇ ▇▇▇ ███ ███ ▂▂▂ ███ ███ ███ ███
  ███ ███ ███ ███ ███ ███ ███ ███ ███  12 ███ ███ ▂▂▂ ▅▅▅ ███ ▄▄▄ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
  ███ ███ ███ ███ ███ ███ ███ ███ ███ ▇▇▇ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
  ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
  ───────────────────────────────────────────────────────────────────────────────────────────────────────
  3/8    3/22     4/5    4/19     5/3    5/17    5/31 6/7    6/21     7/5    7/19     8/2 8/9    8/23

  Helio Patient   Northwind Stor  Turnstile CMS  Rio Grande Boo  Paca  Total: 648h



  ┌─Recent Activity──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
   ! Send August invoices in Admin & Ops                                                                              Aug 11 
  ◐ ! Scheduler: block double-booking in Helio Patient Portal                                                           Aug 3 
  ◐ ! Ship the new cart drawer in Northwind Storefront                                                                 Jun 18  
  ◐ ! Redirect map QA — top 500 URLs in Turnstile CMS                                                                   Jun 4  
  ! Magic-link expiry is too aggressive in Helio Patient Portal                                                      May 29  
  ! Menu bar drift after sleep in Paca                                                                               Aug 26  
  ! Cut over production DNS in Turnstile CMS                                                                         Aug 25  
  └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘


 s Stop Timer  n New  e Edit  Tab Panel  q Quit                                                                    Welcome to Paca!

Keyboard

There is no mouse in here.

hjkl where you would expect it, and single letters for the verbs. Press ? in the app and it will tell you all of this itself.

Global

Jump straight to a view16
Start a timert
Stop the running timers
Show the help screen?
Quitq

Moving around

Down and upjk
Left and right panelhl
Switch panelsTab
Select or confirmEnter
Cancel or go backEsc

Projects and tasks

Createn
Edite
Cycle status: to do → doing → doneSpace
Cycle priority: low → urgentp
Archive or unarchive a projecta
Show archived projectsA
Link a customer to a projectc
Deleted

Timesheets

Tick a line for invoicingSpace
Create a Stripe draft from what is tickedi
Swap to every timer, week by weeka
Page through weeks[]
Edit a time entrye

Reports

Previous and next report
The same, for the bracket-minded[]
Scrolljk
Page through a reportPgUpPgDn
Recalculater
paca — help132×40
 1 dash  2 tasks  3 sheets  4 invoices  5 reports  6 settings  ? help                 Helio Patient Portal 58:30 $160.92 [s] Stop

 A tui task management and timer

 ┌─Navigation─────────────────────────────┐  ┌─Projects───────────────────────────────┐  ┌─Tasks──────────────────────────────────┐
 │                                        │  │                                        │  │                                        │
 1                      Go to Dashboard │  │ n                   Create new project │  │ n                      Create new task 
 2                          Go to Tasks │  │ e                         Edit project │  │ e                   Edit selected task 
 3                     Go to Timesheets │  │ a                    Archive/Unarchive │  │ Space            Toggle status (cycle) 
 4                       Go to Invoices │  │ d                       Delete project │  │ p                      Change priority 
 5                        Go to Reports │  │ A                 Toggle show archived │  │ d                          Delete task 
 6                       Go to Settings │  │                                        │  │                                        │
 ?                            Show Help │  │                                        │  │                                        │
 Tab                      Toggle panels │  │                                        │  │                                        │
 h/l or ←/→               Switch panels │  │                                        │  │                                        │
 j/k or ↑/↓        Move up/down in list │  │                                        │  │                                        │
 Enter                 Select / Confirm │  │                                        │  │                                        │
 Esc                   Cancel / Go back │  │                                        │  │                                        │
 q                            Quit Paca │  │                                        │  │                                        │
 │                                        │  │                                        │  │                                        │
 └────────────────────────────────────────┘  └────────────────────────────────────────┘  └────────────────────────────────────────┘


 ┌─Time Tracking────────────────────────────────────────────────┐  ┌─Reports──────────────────────────────────────────────────────┐
 │                                                              │  │                                                              │
 t                                                Start timer │  │ ←/→ or h/l                                     Switch report 
 s                                         Stop running timer │  │ [ / ]                                          Switch report 
 │                                                              │  │ j/k or ↑/↓                                     Scroll report 
 │                                                              │  │ PgUp/PgDn                                Page through report 
 │                                                              │  │ r                                        Recalculate reports 
 │                                                              │  │                                                              │
 └──────────────────────────────────────────────────────────────┘  └──────────────────────────────────────────────────────────────┘




  Database location: ~/.paca/paca.db


 s Stop Timer  n New  e Edit  Tab Panel  q Quit                                                                               Ready

Settings

Several databases, one command.

Every .db file in ~/.paca is a database Paca can switch to from Settings, which is how you keep the consultancy and the side project from ending up in the same set of reports. It backs the live one up once a day and keeps a month of those, and export and import are both a file on disk.

  • Business name, for the top of your invoices
  • Stripe key, kept out of the screen and out of the logs
  • Timezone, auto-detected or pinned
  • The macOS menu bar helper, on or off
  • Export and import the whole database
paca — settings132×26
 1 dash  2 tasks  3 sheets  4 invoices  5 reports  6 settings  ? help               Helio Patient Portal 1:15:37 $207.96 [s] Stop

 ┌─Business───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
 │                                                                                                                                │
 Business Name       Joe Designs                                                                                               
 Stripe API Key      sk_t**********************************0000                                                                
 ┌──────────────────────────────────────────────────────────┐                                  
 └──────────────────────────────────│                                                          │──────────────────────────────────┘
                                    Select Theme                                             
 ┌─App──────────────────────────────│                                                          │──────────────────────────────────┐
  ▸ Catppuccin Mocha (current)                        
 Database            demo        Dracula  
  Theme               Catppuccin MMonokai                 [Enter to select]  
 Timezone            Auto (AmericNeon  
 Menu Bar            Enabled     Light  
 Export Database     Export to fi│                                                          │                                  
 Import Database     Import from │                                                          │                                  
 ↑/↓ to navigate, Enter to select, Esc to cancel          
 └──────────────────────────────────│                                                          │──────────────────────────────────┘
                                    └──────────────────────────────────────────────────────────┘

 Use j/k or arrows to navigate, Enter to select, Esc to go back

 Database: ~/.paca/demo.db

  SELECT THEME   s Stop Timer                                                                                      Welcome to Paca!

Underneath

React, but the DOM is a grid of characters.

Paca is written with @opentui/react, which runs a React reconciler against terminal cells instead of HTML elements. Components, props, hooks and state all behave the way you already expect — the renderer at the end of it just paints and instead of divs.

Fine print

What it will not do.

Better to read this now than to find out at the end of a billing cycle.

Bun is a hard requirement

The binary is a TypeScript file with a #!/usr/bin/env bun shebang, and install runs bunx prisma generate. npm install -g pacatui still works — it just needs Bun already on the machine.

Stripe is the only way to invoice

There is no PDF generator and no other payment provider. Without a Stripe key the timesheet is still a timesheet; it just cannot become a draft invoice.

One machine, one database

SQLite on your disk. Nothing syncs, so a second machine is a second set of numbers until you export from one and import into the other.

The menu bar is macOS only

It compiles a small Swift helper the first time you switch it on, which needs Xcode Command Line Tools. Everywhere else, the TUI is the whole app.

Invoices are drafts, on purpose

Paca creates the draft and stops. Reviewing it and pressing send happens in Stripe, where you can still fix a line before a client sees it.

No GitHub sync yet

Issues, projects and cloud sync are on the list and not in the app. Tags exist in the schema and have no UI on them.

One command, then paca.

It creates its own database on first run. Nothing to configure until the day you want to send an invoice.

$npm install -g pacatui