[{"data":1,"prerenderedAt":506},["ShallowReactive",2],{"navigation":3,"\u002Fgetting-started":80,"\u002Fgetting-started-surround":502},[4,9,14,50,75],{"title":5,"path":6,"stem":7,"icon":8},"Getting started","\u002Fgetting-started","1.getting-started","i-lucide-rocket",{"title":10,"path":11,"stem":12,"icon":13},"Installation","\u002Finstallation","2.installation","i-lucide-hard-drive-download",{"title":15,"path":16,"stem":17,"children":18,"page":49},"Guide","\u002Fguide","3.guide",[19,24,29,34,39,44],{"title":20,"path":21,"stem":22,"icon":23},"Timer & entries","\u002Fguide\u002Ftimer-and-entries","3.guide\u002F1.timer-and-entries","i-lucide-timer",{"title":25,"path":26,"stem":27,"icon":28},"Projects, clients & tasks","\u002Fguide\u002Fprojects-clients-tasks","3.guide\u002F2.projects-clients-tasks","i-lucide-git-branch",{"title":30,"path":31,"stem":32,"icon":33},"Reports & calendar","\u002Fguide\u002Freports-calendar","3.guide\u002F3.reports-calendar","i-lucide-chart-column",{"title":35,"path":36,"stem":37,"icon":38},"Theme editor","\u002Fguide\u002Ftheme-editor","3.guide\u002F4.theme-editor","i-lucide-palette",{"title":40,"path":41,"stem":42,"icon":43},"Importing data","\u002Fguide\u002Fimport","3.guide\u002F5.import","i-lucide-hard-drive-upload",{"title":45,"path":46,"stem":47,"icon":48},"Team & organizations","\u002Fguide\u002Fteam","3.guide\u002F6.team","i-lucide-users",false,{"title":51,"path":52,"stem":53,"children":54,"page":49},"Reference","\u002Freference","4.reference",[55,60,65,70],{"title":56,"path":57,"stem":58,"icon":59},"Data model","\u002Freference\u002Fdata-model","4.reference\u002F1.data-model","i-lucide-database",{"title":61,"path":62,"stem":63,"icon":64},"API routes","\u002Freference\u002Fapi","4.reference\u002F2.api","i-lucide-route",{"title":66,"path":67,"stem":68,"icon":69},"Environment variables","\u002Freference\u002Fenv","4.reference\u002F3.env","i-lucide-settings-2",{"title":71,"path":72,"stem":73,"icon":74},"Security","\u002Freference\u002Fsecurity","4.reference\u002F4.security","i-lucide-shield",{"title":76,"path":77,"stem":78,"icon":79},"About","\u002Fabout","5.about","i-lucide-info",{"id":81,"title":5,"body":82,"description":496,"extension":497,"meta":498,"navigation":499,"path":6,"seo":500,"stem":7,"__hash__":501},"docs\u002F1.getting-started.md",{"type":83,"value":84,"toc":489},"minimark",[85,90,99,102,106,257,261,268,341,348,357,380,384,387,403,406,446,449,453,485],[86,87,89],"h2",{"id":88},"what-is-tick","What is Tick?",[91,92,93,94,98],"p",{},"Tick is a ",[95,96,97],"strong",{},"self-hosted, MIT-licensed time tracker"," for freelancers and small teams. It pairs a persistent one-keystroke timer with a fast entries list, an open-ended client → project → task model, safe deletion everywhere (soft delete, cascade previews, 30-day trash, undo), server-resolved billable rates, and a built-in theme editor — all in a single small app you run with Docker or plain Node.",[91,100,101],{},"It runs as one Nuxt app in front of one PostgreSQL database. There is no required external service: auth is session-based (scrypt-hashed passwords), and everything — timer, entries, catalog, reports, PDF rendering, theming — is served from the same process. An SMTP server is the one optional extra, and only to email invites and password-reset links.",[86,103,105],{"id":104},"features","Features",[107,108,109,116,143,170,180,186,192,198,215,221,227,232,238,251],"ul",{},[110,111,112,115],"li",{},[95,113,114],{},"Sticky timer bar"," on every page: start typing, hit Enter, attach a client\u002Fproject\u002Ftask later. Run up to ten timers at once — the bar holds the one you pin, the rest live in the running list.",[110,117,118,121,122,126,127,130,131,135,136,126,139,142],{},[95,119,120],{},"Time page",": entries grouped by day or by project, free-text filtering with ",[123,124,125],"code",{},"#tag"," and ",[123,128,129],{},"@name"," shortcuts, bulk select with ",[132,133,134],"em",{},"Mark billable",", ",[132,137,138],{},"Move to…",[132,140,141],{},"Delete",".",[110,144,145,148,149,135,152,135,155,135,158,126,161,164,165,142],{},[95,146,147],{},"Manual entries"," with forgiving free-text parsing — ",[123,150,151],{},"yesterday",[123,153,154],{},"last tue",[123,156,157],{},"2pm",[123,159,160],{},"1.5h",[123,162,163],{},"90m"," all work. See the ",[166,167,169],"a",{"href":168},"\u002Fguide\u002Ftimer-and-entries#date-time-and-duration-formats","full format table",[110,171,172,175,176,179],{},[95,173,174],{},"Open-ended structure",": every entry is \"simple\" until you attach something. Entries store a single reference (client, project ",[132,177,178],{},"or"," task); the rest of the chain is derived at read time, so re-filing a task re-files its history automatically.",[110,181,182,185],{},[95,183,184],{},"Rates resolve server-side",", first non-null wins: entry override → project → client → org member → user default.",[110,187,188,191],{},[95,189,190],{},"Safe deletion",": cascade-delete dialogs preview exactly what happens, everything soft-deletes into a 30-day trash, and every destructive action gets an undo toast with a visible countdown.",[110,193,194,197],{},[95,195,196],{},"Dashboard"," with today\u002Fweek stat cards, a 16-week activity grid, a billable donut and per-day bars — drawn in with GSAP.",[110,199,200,203,204,207,208,211,212,142],{},[95,201,202],{},"Reports"," over any range, regroupable by client \u002F project \u002F task \u002F tag, with ",[95,205,206],{},"CSV"," and server-rendered ",[95,209,210],{},"PDF"," export. See ",[166,213,30],{"href":214},"\u002Fguide\u002Freports-calendar#export",[110,216,217,220],{},[95,218,219],{},"Calendar"," week and day views where entries are drag-created, dragged between days and resized on a 5-minute grid.",[110,222,223,226],{},[95,224,225],{},"Import"," from Toggl Track, Clockify or any CSV, with a dry-run preview before a single row is written.",[110,228,229,231],{},[95,230,35],{},": 12 presets, 17 primary colors, 9 neutral palettes, radius, five fonts, dark\u002Flight, optional sidebar starfield. Applies live and persists per user.",[110,233,234,237],{},[95,235,236],{},"Multi-user orgs"," with owner\u002Fadmin\u002Fmember roles, per-member rates, and invite links that are emailed when SMTP is configured and copyable when it is not.",[110,239,240,243,244,248,249,142],{},[95,241,242],{},"Self-hoster controls",": ",[166,245,247],{"href":246},"\u002Finstallation#registration-modes","registration modes"," (open \u002F invite-only \u002F closed), password reset with or without SMTP, auth rate limiting, security headers and CSP — see ",[166,250,71],{"href":72},[110,252,253,256],{},[95,254,255],{},"Installable PWA"," with a mobile layout, so the phone version is a real app rather than a shrunken desktop.",[86,258,260],{"id":259},"quickstart-docker-compose","Quickstart (Docker Compose)",[91,262,263,264,267],{},"The repository ships a ",[123,265,266],{},"docker-compose.yml"," that runs the app plus a bundled Postgres 17 with a persistent volume. Migrations apply automatically on startup.",[269,270,275],"pre",{"className":271,"code":272,"language":273,"meta":274,"style":274},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone https:\u002F\u002Fgithub.com\u002Fticktimer\u002FTick.git tick && cd tick\ncp .env.example .env\n# edit .env: set NUXT_SESSION_PASSWORD (openssl rand -base64 36)\ndocker compose up -d\n","bash","",[123,276,277,307,319,326],{"__ignoreMap":274},[278,279,282,286,290,293,296,300,304],"span",{"class":280,"line":281},"line",1,[278,283,285],{"class":284},"sBMFI","git",[278,287,289],{"class":288},"sfazB"," clone",[278,291,292],{"class":288}," https:\u002F\u002Fgithub.com\u002Fticktimer\u002FTick.git",[278,294,295],{"class":288}," tick",[278,297,299],{"class":298},"sMK4o"," &&",[278,301,303],{"class":302},"s2Zo4"," cd",[278,305,306],{"class":288}," tick\n",[278,308,310,313,316],{"class":280,"line":309},2,[278,311,312],{"class":284},"cp",[278,314,315],{"class":288}," .env.example",[278,317,318],{"class":288}," .env\n",[278,320,322],{"class":280,"line":321},3,[278,323,325],{"class":324},"sHwdD","# edit .env: set NUXT_SESSION_PASSWORD (openssl rand -base64 36)\n",[278,327,329,332,335,338],{"class":280,"line":328},4,[278,330,331],{"class":284},"docker",[278,333,334],{"class":288}," compose",[278,336,337],{"class":288}," up",[278,339,340],{"class":288}," -d\n",[91,342,343,344,347],{},"Open ",[123,345,346],{},"http:\u002F\u002Flocalhost:3000"," and register your first account. Registering creates a personal organization with you as its owner.",[91,349,350,351,354,355,142],{},"Other install paths (plain ",[123,352,353],{},"docker run"," against your own Postgres, or native Node + PM2) are covered in ",[166,356,10],{"href":11},[358,359,360],"warning",{},[91,361,362,363,366,367,370,371,374,375,379],{},"Registration is ",[95,364,365],{},"open"," by default — anyone who can reach the host can create a workspace. Before exposing an instance, set ",[123,368,369],{},"NUXT_PUBLIC_REGISTRATION=invite"," (or ",[123,372,373],{},"closed",") and put TLS in front of it. The ",[166,376,378],{"href":377},"\u002Freference\u002Fsecurity#what-you-have-to-do","security checklist"," is short and worth reading once.",[86,381,383],{"id":382},"demo-data","Demo data",[91,385,386],{},"For development or a demo instance, the seed script fills the database with a realistic org — three clients, five projects, tasks, tags and about three weeks of time entries:",[269,388,390],{"className":271,"code":389,"language":273,"meta":274,"style":274},"npm run db:seed\n",[123,391,392],{"__ignoreMap":274},[278,393,394,397,400],{"class":280,"line":281},[278,395,396],{"class":284},"npm",[278,398,399],{"class":288}," run",[278,401,402],{"class":288}," db:seed\n",[91,404,405],{},"Then log in with:",[407,408,409,422],"table",{},[410,411,412],"thead",{},[413,414,415,419],"tr",{},[416,417,418],"th",{},"Field",[416,420,421],{},"Value",[423,424,425,436],"tbody",{},[413,426,427,431],{},[428,429,430],"td",{},"Email",[428,432,433],{},[123,434,435],{},"mara@example.com",[413,437,438,441],{},[428,439,440],{},"Password",[428,442,443],{},[123,444,445],{},"tick-demo",[91,447,448],{},"The seeded user (Mara Juhl, org \"Hollow Studio\", $85\u002Fh default rate) has data on the dashboard, the Time page and every manage page, so you can explore the whole app immediately.",[86,450,452],{"id":451},"where-to-go-next","Where to go next",[107,454,455,463,468,473,478],{},[110,456,457,459,460,462],{},[166,458,10],{"href":11}," — Docker, ",[123,461,353],{},", native + PM2, reverse proxy, SMTP, registration modes.",[110,464,465,467],{},[166,466,20],{"href":21}," — the day-to-day tracking workflow.",[110,469,470,472],{},[166,471,25],{"href":26}," — how the data model and rates work.",[110,474,475,477],{},[166,476,71],{"href":72}," — what the app protects, and what you have to do before going public.",[110,479,480,126,482,484],{},[166,481,56],{"href":57},[166,483,61],{"href":62}," — for integrating or contributing.",[486,487,488],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":274,"searchDepth":309,"depth":309,"links":490},[491,492,493,494,495],{"id":88,"depth":309,"text":89},{"id":104,"depth":309,"text":105},{"id":259,"depth":309,"text":260},{"id":382,"depth":309,"text":383},{"id":451,"depth":309,"text":452},"What Tick is, what it does, and how to get a copy running in two minutes.","md",{},{"icon":8},{"title":5,"description":496},"9DzpRsewS1fhYl0wXAH1rdu-ccrvOaE6JG6tDZSoMPk",[503,504],null,{"title":10,"path":11,"stem":12,"description":505,"icon":13,"children":-1},"Run Tick with Docker Compose, plain docker run, or natively with Node and PM2.",1790777311701]