iavil1 downloadsTrack billable time against notes and projects, aggregate by client, and generate invoices in markdown. Free time tracking plus license-gated invoicing. Fully local.
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–39 (one-time).
| Feature | Lite (free) | Premium (~$29–39 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. Invoicing/PDF export is gated behind the license check (LicenseManager.isPremium()).
client and project frontmatter (configurable) tag the entry; if absent, a default client is used and the note name becomes the project.⏺ 0:12:34 · Acme Co); click it to start/stop.data.json (alongside settings) — fully in your vault.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 clean TODO(pdf).Plus a ribbon clock icon to toggle tracking.
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 -- [email protected] # after a sale: mint a key
Billing/delivery (payment + emailing the key) is handled out-of-band by Lemon Squeezy / Gumroad — see the
TODO(billing)insrc/license/LicenseManager.ts.
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.
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.
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.
MIT (plugin source). Premium feature access is governed by a signed license key.