README file from
GithubTime 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 -- [email protected] # after a sale: mint a key
Feedback and support
Bug reports, feature requests, and questions all go to the GitHub issue tracker. It is the only place I track them, so an issue will always get further than a review comment.
- Report a bug — please include your Obsidian version, your operating system, and the steps that reproduce it.
- Request a feature — describe the workflow you are trying to make faster; that is more useful than a proposed solution.
- Browse open issues — worth a look first, in case it is already tracked.
More plugins by the same author
Small, local-first Obsidian plugins that each do one job and keep your data in your vault. All of them are in the community directory — search the name under Settings → Community plugins.
Search and views
- Vault Spotlight — keyboard-first command center — fuzzy search, saved workflows, and result actions.
- Bases Power Pack — kanban, calendar, Gantt, and outline views over your notes or a
.basefile.
Vault health
- Vault Triage — find stale, orphaned, unfinished, and metadata-broken notes, then work through them.
- Attachment Audit — find orphaned, duplicate, oversized, and misplaced attachments, then clean them up safely.
- Patina — score every note's staleness from edits, opens, and inbound links.
- Vault Router — move new notes out of Inbox with fast local routing rules.
- FlowKit Health Dashboard — find which add-on is breaking your vault, and score every one installed.
Writing and research
- Prose Lens — live writing feedback — passive voice, adverbs, hedges, cliches, and a reading grade.
- Prior Art — show similar existing notes while you write, and merge duplicates without losing links.
- Standing Questions — track the open questions in your vault and surface new notes that may answer them.
- Unwritten — report the notes you never wrote — unexplained link pairs, stub hubs, unreasoned decisions.
- Effort Index — measure the editing time behind every note and resurface the expensive ones.
Time and billing
- Task Calendar Bridge — export dated Markdown tasks to standards-based ICS calendar files.
- Invoice Forge — turn
#billablenotes into numbered invoices, so nothing is missed or billed twice.
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.