Track Time. Send Invoices.
Keep It Simple.
Fretwork isn't an app you open. It lives inside the AI agent you already talk to — Grok Bot, Hermes, OpenClaw, Claude, Cursor — and gives it time tracking, invoicing, expenses, and a light CRM. No account, no server, nothing phones home. Your data is one SQLite file on your machine. Paste one line to your agent and it installs everything.
Read https://raw.githubusercontent.com/ryanlanciaux/fretwork.ai/refs/heads/main/AGENT.md and follow it to install Fretwork on this machine, set up my database and business profile, and connect it to yourself. Ask me for my business name, billing email, and a logo image file if I have one.
MIT licensed · Local SQLite, your machine · No accounts, no telemetry
Already installed? Tell your agent "upgrade Fretwork" — it re-runs the install (fretwork upgrade). Your data stays put.
Talk to Your Data
Your agent reads AGENT.md, installs Fretwork from
GitHub with one npm install,
creates your database, and connects itself as an MCP server (Grok Bot, Claude, Cursor, Hermes, OpenClaw,
OpenCode, Codex…) — or drives the fretwork CLI, same operations. Then you just talk.
Show me my invoices
12:14 AMYou have one invoice:
| # | Client | Date | Amount | Status |
|---|---|---|---|---|
| INV-2026-001 | Acme Corp | May 9, 2026 | $1,415.38 | Paid |
Want to do anything with it, or create a new one?
Log 4.5 hours for Acme on the redesign
12:15 AMLogged 4.5 hours against Acme Corp for May 9. Unbilled total is now 11h. Want to invoice May yet?
Yeah — invoice Acme for May and render the PDF
7:43 AMCreated INV-2026-002 for Acme Corp · 11h × $200/hr + 8.875% tax = $2,396.13. PDF saved to ~/.fretwork/invoices/INV-2026-002/invoice.pdf.
Everything It Can Do
58 operations, each available two ways over the same local database: as an MCP tool
for agents that attach local servers, and as a CLI command (every command takes --json).
Agents can read the same table as markdown at /CAPABILITIES.md.
| MCP tool | CLI | What it does |
|---|---|---|
| Clients | ||
list_clients | fretwork clients list | List clients, optionally by status (prospect / lead / client / archived). |
get_client | fretwork clients get <slug> | One client by slug or id. |
add_client | fretwork clients add <name> | Create a client; slug is derived from the name. |
update_client | fretwork clients update <slug> | Change name, email, rate, address, status. |
promote_client | fretwork clients promote <slug> | Advance prospect → lead → client (or set explicitly). |
archive_client | fretwork clients archive <slug> | Soft-delete; keeps history and reports intact. |
delete_client | fretwork clients delete <slug> | Hard-delete; refused while anything still references the client. |
| Time | ||
log_time | fretwork time log | Log billable hours against a client (decimal hours, ISO date). |
list_time_entries | fretwork time list | Entries with client / date-range / unbilled / project filters. |
get_time_entry | fretwork time get <id> | One entry by id. |
update_time_entry | fretwork time update <id> | Edit an entry; refused once it's on an invoice. |
delete_time_entry | fretwork time delete <id> | Delete an entry; refused once it's on an invoice. |
summarise_time | fretwork time summary | Hours, unbilled hours and revenue per client over a range. |
| Timer | ||
start_timer | fretwork time start | Start a running timer (client can be set later). |
stop_timer | fretwork time stop | Stop and log the elapsed time as an entry. |
get_active_timer | fretwork time status | Show the running timer, if any. |
cancel_timer | fretwork time cancel | Discard the running timer without logging. |
update_active_timer | fretwork time timer-update | Change the running timer's client / project / description / rate in place. |
| Expenses & activity | ||
add_expense | fretwork expenses add | Expense with an amount, or a dated activity record (mileage, meeting) without one. |
list_expenses | fretwork expenses list | Filter by client, dates, category, billable, unbilled. |
get_expense | fretwork expenses get <id> | One record by id. |
update_expense | fretwork expenses update <id> | Patch fields; can clear the amount. |
delete_expense | fretwork expenses delete <id> | Delete a record. |
| Invoices | ||
list_invoices | fretwork invoices list | Invoices, optionally by client or status. |
get_invoice | fretwork invoices get <number> | One invoice with line items. |
create_invoice | fretwork invoices create | From a client's unbilled time over a date range, explicit line items, or both. |
update_invoice | — | Edit notes, dates, tax rate, currency (not on paid/void invoices). |
set_invoice_status | fretwork invoices status <number> <status> | draft → sent → paid / overdue / void; timestamps set automatically. |
list_overdue_invoices | fretwork invoices overdue | Unpaid invoices past due, with days overdue. |
reconcile_overdue_invoices | fretwork invoices overdue --mark | Mark past-due 'sent' invoices as overdue. Idempotent. |
delete_invoice | fretwork invoices delete <number> | Delete; releases its time entries back to unbilled. |
render_invoice_html | fretwork invoices render <number> | The invoice as HTML (Mustache template you can customise). |
generate_invoice_pdf | fretwork invoices pdf <number> | PDF via your own Chrome, rendered fully offline. |
| Payments | ||
record_payment | fretwork invoices pay <number> | Record a full or partial payment; marks paid when settled. |
list_payments | fretwork invoices payments | Payments for one invoice or all. |
delete_payment | fretwork invoices payment-delete <id> | Remove a payment; reopens the invoice if it drops below total. |
| Recurring invoices | ||
add_recurring_invoice | fretwork recurring add | Retainers and subscriptions: weekly / monthly / quarterly / yearly templates. |
list_recurring_invoices | fretwork recurring list | Templates, with filters. |
get_recurring_invoice | fretwork recurring get <id> | One template. |
update_recurring_invoice | fretwork recurring update <id> | Pause / resume, change cadence or line items. |
delete_recurring_invoice | fretwork recurring delete <id> | Delete a template. |
run_recurring_invoices | fretwork recurring run | Generate every invoice that's due. Safe to run daily. |
upcoming_recurring_invoices | fretwork recurring upcoming | Preview the next issuances without creating anything. |
| CRM | ||
add_crm_note | fretwork crm note | A dated touchpoint note, optionally with a follow-up date. |
list_crm_notes | fretwork crm notes | Notes by client / date range. |
get_crm_note | fretwork crm note-get <id> | One note. |
update_crm_note | fretwork crm note-update <id> | Edit body, date, follow-up, client. |
delete_crm_note | fretwork crm note-delete <id> | Delete a note. |
list_followups | fretwork crm followups | Clients you haven't talked to in N days (default 14). |
| Business profile | ||
get_config | fretwork config show | Business name, email, address, logo, rate, currency, tax, due days. |
update_config | fretwork config set | Change any of those (the CLI copies a logo file into ~/.fretwork for you). |
init_config | fretwork init | First-run setup; creates the empty database. |
| Reports & data | ||
financial_report | fretwork report financial | Totals by status, revenue and outstanding per client. |
export_data | fretwork export | Versioned JSON snapshot of everything — backup or move machines. |
import_data | fretwork import <file> | Restore: merge (default) or replace (requires confirmation; a backup is written first). |
| Invoice template | ||
print_invoice_template | fretwork template print | Current template HTML (your copy, or the bundled default). |
write_invoice_template | fretwork template write | Replace it; validated first, previous version kept as .bak. |
reset_invoice_template | fretwork template reset | Back to the bundled default. |
| CLI only | ||
| — | fretwork upgrade | Upgrade to the latest version from GitHub; data and settings untouched. |
| — | fretwork install --host <ids> --yes | Wire the MCP server + skill into Hermes, OpenClaw, Claude Code, Claude Desktop, Cursor, OpenCode, Codex, Grok Build. |
| — | fretwork skill path | print | Locate or print the bundled SKILL.md / HELP.md (to save as a skill in hosts like Grok Bot). |
| — | fretwork template path | show-default | Where your template lives; the bundled default for diffing. |
Generated from the source on every build — the table can't drift from the code.
Follow me on
I post what I'm building with Fretwork and the agents it runs in. Questions, bugs, ideas — that's the place.
@ryanlanciaux