Projects are the core organizational unit in Timify. Every time entry belongs to a project, which gives you a named container with an optional description, a display color, and an hourly rate for billing calculations. When you open the app, Timify redirects you straight to your last active project, so you can resume tracking with zero friction.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/Aking16/timify/llms.txt
Use this file to discover all available pages before exploring further.
Project data shape
Each row in theprojects table carries the following fields.
UUID primary key, auto-generated with
crypto.randomUUID() on insert.Foreign key referencing the
user table. Cascades on delete — removing a user removes all their projects.Human-readable project name. Must be at least 4 characters long.
Optional free-text description of the project. Accepts
null.Hex color code used to visually identify the project in the UI. Defaults to
#3b82f6 (Tailwind blue-500) when not supplied.Billing rate in the user’s currency per hour. Defaults to
0. Individual time entries can override this value.Whether the project is currently active. Defaults to
true. Inactive projects are hidden from the primary project selector.Unix timestamp of when the project was created. Set automatically by SQLite via
unixepoch().Unix timestamp of the last update. Refreshed automatically on every write via Drizzle’s
$onUpdateFn.Creating a project
You can create a project from two places in the UI: the sidebar dialog (accessible from any page) or the dedicated/app/projects page.
Open the Create Project dialog
Click the New Project button in the sidebar or navigate to
/app/projects and press the + button at the top right.Fill in the project details
Enter a name (minimum 4 characters), an optional description, and an optional hourly rate. The color is assigned automatically and can be changed later.
The
name field is validated with z.string().min(4). Submitting a name shorter than 4 characters returns a validation error and no row is written to the database.Validation rules for createProject
| Field | Rule |
|---|---|
name | Required · minimum 4 characters |
description | Optional · null accepted |
hourlyRate | Optional string coerced to Number() · defaults to 0 |
Editing a project
Navigate to any project’s settings page or open the edit dialog from the project card. TheeditProject server action accepts the same fields as creation, plus color and isActive.
Open the Edit dialog
Click the ⋮ menu on a project card and select Edit Project, or visit
/app/projects/[id]/settings.Update the fields
You can change
name (4–32 chars), description, hourlyRate, color (hex string), and isActive (boolean toggle).Validation rules for editProject
| Field | Rule |
|---|---|
id | Required · must be an existing project UUID |
name | Required · 4–32 characters |
description | Optional |
hourlyRate | Optional string coerced to Number() |
color | Optional · hex color string (e.g. #3b82f6) |
isActive | Required · string "true" / "false" converted via convertStringToBoolean |
Deleting a project
CalldeleteProject(id) or use the Delete option in the project card menu. The action verifies your session, calls db.delete(projects).where(eq(projects.id, id)), then revalidates the project list cache.
Active project and navigation
Timify keeps track of which project you last viewed using the browser’slocalStorage key "active-project". The getActiveProject() helper reads and parses this value on the client side.
Active project set
The app redirects to
/app/project/[id] for the stored project ID and loads its time entries.No active project
The app redirects to
/app/projects so you can select or create a project before tracking starts.