Time Tracker and Invoicing

approved

by 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.

121 downloadsUpdated 10d ago

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-timebuy here.


Lite vs. Premium

FeatureLite (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:

  1. Buy the one-time Premium license from the link above.
  2. Your license key is emailed to you automatically, within seconds — delivery is fully automated, no waiting.
  3. 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 client and project frontmatter (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 clean TODO(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 in src/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.