Self-hosted · macOS, Windows + web

Time tracking your team can audit.

Workforce analytics for teams of 10–50, running entirely on your own infrastructure. The client cannot be hidden, cannot read what you type, and shows every person exactly what was recorded about them — because those are constraints in the code, not promises in a policy document.

Records

  • Time entries and durations
  • Active app and website category
  • An activity level, as a percentage
  • Periodic screenshots, if enabled
  • Active window titles, if enabled

Never records

  • Keystrokes — what you type
  • Message or document content
  • Passwords
  • Webcam, microphone, or clipboard
  • Location or GPS

Guarantees

The limits are structural

Four things hold regardless of how an administrator configures it. They are enforced by the shape of the code, not by settings someone could change.

No stealth mode

The menu bar indicator changes state as tracking and capture happen, and no setting, API, or administrator can hide it. There is no build target that removes it — a fixed product constraint, not a backlog item.

Consent gate

Nothing is captured until the signed-in person has acknowledged the monitoring policy. The gate is enforced on the server as well as the client, and there is no administrator override.

Counted, not read

The activity percentage comes from asking macOS how many keyboard and mouse events occurred — never which ones. The client requests no Accessibility or Input Monitoring permission, so it has no code path that could read what you type even if someone added one.

Symmetric access

Employees read their own screenshots, samples, and entries through the same API a manager uses, scoped to themselves. Screenshot data is never readable by a manager in a way it is not readable by the person in it.

Not legal advice

Employee monitoring carries disclosure obligations that vary by jurisdiction — several US states require written notice, GDPR applies to EU-based staff, and other countries differ. Nifty Timer encodes a defensible default, but it is not a substitute for talking to legal and HR before you roll it out.

What it does

Three surfaces, one record

A menu bar or system tray app on each machine, a web dashboard for managers, and an admin surface for the people who have to answer for it.

For the team
  • Start, stop, and pause from the menu bar; assign entries to a project or task, with an optional note.
  • Automatic tracking that pauses on sleep or lock and stops after an idle threshold.
  • On return: “You were away for X minutes — keep or discard?” Discard is the default.
  • Idle and distraction nudges arrive as local notifications, never streamed live to a manager.
  • A self-view of everything recorded about you — with the ability to redact any screenshot, giving a reason.
For managers
  • Team overview: who is tracking now, hours per person today.
  • Per-person timeline — entries, app breakdown, activity percentage, screenshot thumbnails.
  • Hours per project across the team.
  • Date-range CSV export, filterable by person, project, or team.
  • Timesheet approvals for payroll.
For admins
  • Users, teams, and roles; OIDC single sign-on.
  • Monitoring policy per team: screenshot interval, idle threshold, blur mode, retention, or capture off entirely.
  • Productive and unproductive app and site lists, applied on the client.
  • Data export and right-to-erasure tooling; deletions are written to an audit log in the same transaction.
  • Retention enforced by a nightly job rather than by policy prose.

Self-hosting

Your servers, your database

There is no third-party SaaS in the data path. Screenshots and samples live in your own object storage, and nothing is sent anywhere you did not configure.

API
NestJS on Fastify, Node 24 LTS
Database
PostgreSQL 18, via Prisma — activity and screenshot tables are monthly-partitioned
Dashboard
Next.js App Router, React 19
Jobs
BullMQ on Redis — rollups, retention, email summaries
Storage
MinIO, or any S3-compatible endpoint
Clients
Swift 6, SwiftUI and AppKit on macOS 14+; C# 13 and WPF on .NET 9 for Windows 10 1809+
Deploy
Docker Compose behind a Caddy TLS proxy

Download

macOS client — pilot build

Signed by Nifty IT Solution and verified before publishing. Read the install guide first: because this build is not yet notarized, macOS asks for one extra confirmation the first time you open it.

This build is for our own pilot

The server address is compiled into the app, pointing at this deployment, and cannot be changed after the fact. It is published openly so testers can install it without a login — but it is only useful with an account we issued. Running Nifty Timer for your own organization needs a build pointed at your server.

Requires
macOS 14 Sonoma or newer, Apple Silicon
Permission
Screen Recording only — no Accessibility, no Input Monitoring
Apple check
Signed, not yet notarized — one confirmation on first launch
Server
Compiled in at build time to this deployment

Download

Windows client — pilot build

Read the install guide first: this build is not yet code-signed, so Windows shows a SmartScreen warning the first time you run it and needs one extra confirmation.

This build is for our own pilot

The server address is compiled into the app, pointing at this deployment, and cannot be changed after the fact. It is published openly so testers can install it without a login — but it is only useful with an account we issued. Running Nifty Timer for your own organization needs a build pointed at your server.

Requires
Windows 10 version 1809 or newer, 64-bit
Permission
None — Windows asks for no grant to record the screen
Install
Unzip anywhere and run NiftyTimer.exe — no installer, no admin rights
Updates
Checked automatically; applied only when you choose