Skip to content

Repository files navigation

NeetoInvoice Timer for macOS

A lightweight, independent menu-bar timer for NeetoInvoice. It is a native SwiftUI app for macOS 14 or later, with local timer persistence, Keychain credential storage, project and task selection, away-time reconciliation, and durable completed entries.

This project is not made by or endorsed by NeetoInvoice.

Why this exists

I liked the menu-bar utility in time-tracking software I used previously. After that product was acquired by private equity, its pricing rose by what felt like an extraordinary amount. I built this small utility to keep the workflow I enjoyed while using NeetoInvoice.

Current status

The timer, local persistence, documented MCP catalog integration, onboarding, settings, Keychain storage, away-time handling, and conservative upload states are implemented.

NeetoInvoice’s documented CreateTimeEntry MCP tool currently has no idempotency key. Therefore ambiguous uploads are never retried automatically; the app marks them Needs Verification. See docs/API_VALIDATION.md before treating this as a production release.

Get an API key

  1. Open your NeetoInvoice workspace and go to Admin.
  2. Select API Keys.
  3. Select Add API key, give it a label and expiration date, then save it.
  4. Copy the key and paste it into the app with Command-V.

Official instructions: NeetoInvoice API Keys

The app also opens your workspace’s Admin panel from onboarding and Settings. NeetoInvoice does not publish a stable deep-link route for the API Keys screen, so the app does not guess one.

Build and test

Requirements:

  • macOS 14 or later
  • Xcode 16 or later with the macOS SDK

Run the tests:

swift test

Build a Universal 2 app, zip, and checksum:

./scripts/build-app.sh

Outputs are written to build/:

  • NeetoInvoice Timer.app
  • NeetoInvoiceTimer-0.1.0-macOS.zip
  • NeetoInvoiceTimer-0.1.0-macOS.zip.sha256

The script uses the NeetoInvoice Timer Local Signing identity when it is available in the current user’s Keychain. This keeps Keychain authorization stable between local rebuilds. On another Mac, the script falls back to an ad-hoc signature. Neither build is Developer ID signed or notarized, so a downloaded release can still trigger Gatekeeper’s warning.

Open the downloaded app

First try:

  1. Move the app to Applications.
  2. Control-click or right-click it.
  3. Choose Open, then confirm Open.

If macOS still blocks it, this terminal command is a clearly labeled fallback:

xattr -dr com.apple.quarantine "/Applications/NeetoInvoice Timer.app"

Privacy and storage

  • The API key is stored in macOS Keychain. A Developer ID signed build stores it in the data protection keychain, scoped to the app. An ad-hoc build cannot use that keychain, so it falls back to the legacy file-based keychain, where the item is protected by its access control list instead.
  • Timer state, cached catalog data, and completed entries are stored locally with SwiftData.
  • The app has no analytics, hosted server, or third-party dependencies.
  • Credentials, notes, and user email addresses are not logged.
  • Disconnect removes the Keychain credential but preserves unsent entries.
  • No workspace credentials, client data, project data, time entries, or local signing keys are included in this repository or its release archives.

Contributing

I mostly make small utilities like this for my own workflows. If you want to take the app in a different direction, please consider forking it rather than opening a pull request. Forks are welcome and are likely to be the quickest way to shape the app around your own needs.

License

MIT. See LICENSE.

About

Native macOS menu-bar timer for NeetoInvoice

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages