Time Tracker and Invoicing
approvedby saiken
Track billable time against notes and projects, aggregate by client, and generate invoices in markdown. Free time tracking plus license-gated invoicing. Fully local. - This plugin has not been manually reviewed by Obsidian staff.
Time Tracker & Invoicing
Stop leaking billable hours — clock time on the notes you're already working in, then turn it into client-ready invoices without leaving Obsidian.
Track billable time against your notes and projects, aggregate it by client, and generate invoices — built for freelancers and consultants who live in Obsidian. Fully local: no external API, no account, your data stays in your vault.
Open-core / one-time purchase. Time tracking is free forever in the Lite tier. Invoicing & PDF export unlock with a one-time license — $29 one-time — buy here.
Lite vs. Premium
| Feature | Lite (free) | Premium ($29 one-time) |
|---|---|---|
| Start/stop tracking on the active note | ✅ | ✅ |
| Live timer in the status bar | ✅ | ✅ |
| Client/project tagging via frontmatter | ✅ | ✅ |
| Totals by client (command) | ✅ | ✅ |
| Invoice generation (markdown) | — | ✅ |
| PDF export | — | ✅ (stub today) |
All time tracking is free — no trial, no expiry. Invoicing and PDF export are the only paid features, gated behind the license check (LicenseManager.isPremium()).
Purchase: Buy Me a Coffee — Time Tracker & Invoicing Premium. License keys are verified offline (Ed25519) — no account, server, or subscription.
Activate in three steps:
- Buy the one-time Premium license from the link above.
- Your license key is emailed to you automatically, within seconds — delivery is fully automated, no waiting.
- Paste it into the plugin's License setting — Premium unlocks instantly, verified offline.
How it works
Tracking time
- Start tracking active note — begins a timer against the currently open note. The note's
clientandprojectfrontmatter (configurable) tag the entry; if absent, a default client is used and the note name becomes the project. - Stop tracking — closes the timer and records a time entry.
- A status bar item shows the running timer (
⏺ 0:12:34 · Acme Co); click it to start/stop. - Entries are stored locally in the plugin's
data.json(alongside settings) — fully in your vault.
Aggregation
- Show tracked time totals — summarizes hours by client.
- Aggregation also powers invoicing (totals broken down by project → invoice line items).
Invoicing (premium)
- Generate invoice (Premium) — pick a client; the plugin builds a markdown invoice (one line item per project, configurable rounding) and saves it to your invoice folder, with business details and totals.
- PDF export is stubbed today (
exportPdfStub) — it saves the markdown and points you to Obsidian's built-in Export to PDF. A real local PDF generator is left as a cleanTODO(pdf).
Commands
- Start tracking active note (Lite)
- Stop tracking (Lite)
- Toggle tracking (start/stop) (Lite)
- Show tracked time totals (Lite)
- Generate invoice (Premium)
- Verify license key
Plus a ribbon clock icon to toggle tracking.
Settings
Default hourly rate, currency, hours rounding, client/project frontmatter property names, and default client (all free). Business name/address/email and invoice folder are premium (invoice-only) and locked until licensed. License key lives under License.
Keys are verified offline with Ed25519 signatures (tweetnacl) — no account, server, or network call, keeping the plugin 100% local. A key is
base64url(payload).base64url(signature), verified against the public key insrc/license/publicKey.ts.
Selling keys (author workflow):
node scripts/keygen.mjs # one-time: create keypair
npm run license:generate -- buyer@email.com # after a sale: mint a key
Build
npm install
npm run build # bundles to main.js
npm run dev # watch mode
npm run typecheck # tsc --noEmit
npm test # offline license verification tests
npm run build produces main.js next to manifest.json and styles.css.
Install
Community plugins (recommended): open Settings → Community plugins, search Time Tracker and Invoicing, and install it — one click, auto-updates.
Manual install — copy main.js, manifest.json, and styles.css into:
<your-vault>/.obsidian/plugins/time-tracker-invoicing/
Then enable Time Tracker & Invoicing in Settings → Community plugins.
Project layout
time-tracker-invoicing/
├── manifest.json
├── versions.json
├── package.json
├── tsconfig.json
├── esbuild.config.mjs
├── styles.css
├── .github/workflows/
│ └── release.yml # tag-driven GitHub release (build + attach assets)
├── scripts/
│ ├── keygen.mjs # one-time Ed25519 keypair generator (author)
│ ├── generate-license.mjs # mint a customer key (author)
│ └── customer-license-template.txt
├── tests/
│ └── license.test.mjs # offline license sign/verify round-trip
└── src/
├── main.ts # entry, commands, status bar, persistence
├── settings.ts # settings tab
├── license/
│ ├── LicenseManager.ts # offline Ed25519 verification
│ └── publicKey.ts # embedded public key
├── types/tweetnacl.d.ts # minimal tweetnacl type shim
├── timeStore.ts # entries, active timer, aggregation
├── invoice.ts # invoice markdown generation + PDF stub (premium)
└── types.ts # shared interfaces & defaults
Reference: the licensing approach, settings-tab patterns, build/test setup, and project layout are adapted from the Vault Spotlight plugin — see "Borrowed from Vault Spotlight" notes in the repo.
License
MIT (plugin source). Premium feature access is governed by a signed license key.
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.