About
License, credits and the project's inspiration.
License
Tick is released under the MIT License. Use it, self-host it, fork it, retheme it — commercially or not. See the LICENSE file in the repository.
Inspiration
Tick began as an answer to SolidTime, the open-source time tracker for freelancers and agencies. SolidTime's shape — sidebar, ever-present timer, entries list — is great; Tick keeps that shape and reworks the parts its author wanted done differently:
- A more open-ended data model: projects don't need clients, tasks don't need projects, and an entry can attach to any level (or none) with derived-not-copied chains.
- Safer deletion: cascade previews that spell out consequences, soft delete everywhere, a 30-day trash, and exact undo.
- Typed dates: free-text date/time/duration parsing in manual entry instead of pickers.
- A real theme editor rather than a fixed skin.
Built with
- Nuxt 4 — app framework (and Nuxt Content for this documentation)
- Nuxt UI 4 + Tailwind CSS 4 — components and theming
- Pinia — client state
- Drizzle ORM + postgres.js — PostgreSQL access and migrations
- nuxt-auth-utils — sealed-cookie sessions (passwords hashed with Node's scrypt)
- pdf-lib — the report PDF export, drawn directly (no headless browser)
- Nodemailer — optional SMTP for invites and password resets
- Vite PWA — installable app shell and service worker
- GSAP — chart draw-ins and motion
- Zod — API validation
- Lucide icons · Inter and friends via Google Fonts
Known limitations
Deliberate trade-offs and rough edges, stated rather than hidden:
- Tag-grouped report rows sum above the total. An entry with two tags counts in both rows; the totals row counts it once. That fan-out is intended — see Reports.
- No email verification. An address is never confirmed; it is only proven by an invite or reset link arriving.
- Sessions are sealed cookies. There is no session store, so a single device cannot be logged out individually — only a password change (other sessions) or reset (all sessions) revokes them. Details.
- Auth rate limiting is single-node and in-memory, keyed on the socket address, so it is instance-wide behind a proxy. Rate-limit at the proxy for anything bigger than one box.
- Tags cannot be renamed or merged — create and delete only.
- The calendar's Day view is the default on narrow screens; the seven-column week is desktop-first.
- Reports and exports cover the whole org, with no per-user filter yet.
- Demo mode destroys data by design — it wipes and reseeds the demo org on boot. Never point it at anything real.
Contributing
The repository ships everything the app needs to run and extend: schema, migrations, seed data, a Docker image, reverse-proxy examples in deploy/ and this documentation site under docs/. Start with the data model and API reference.