[{"data":1,"prerenderedAt":384},["ShallowReactive",2],{"navigation":3,"\u002Fabout":80,"\u002Fabout-surround":380},[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":76,"body":82,"description":374,"extension":375,"meta":376,"navigation":377,"path":77,"seo":378,"stem":78,"__hash__":379},"docs\u002F5.about.md",{"type":83,"value":84,"toc":365},"minimark",[85,90,104,108,119,149,153,277,281,284,343,347],[86,87,89],"h2",{"id":88},"license","License",[91,92,93,94,98,99,103],"p",{},"Tick is released under the ",[95,96,97],"strong",{},"MIT License",". Use it, self-host it, fork it, retheme it — commercially or not. See the ",[100,101,102],"code",{},"LICENSE"," file in the repository.",[86,105,107],{"id":106},"inspiration","Inspiration",[91,109,110,111,118],{},"Tick began as an answer to ",[112,113,117],"a",{"href":114,"rel":115},"https:\u002F\u002Fgithub.com\u002Fsolidtime-io\u002Fsolidtime",[116],"nofollow","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:",[120,121,122,130,136,142],"ul",{},[123,124,125,126,129],"li",{},"A more ",[95,127,128],{},"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.",[123,131,132,135],{},[95,133,134],{},"Safer deletion",": cascade previews that spell out consequences, soft delete everywhere, a 30-day trash, and exact undo.",[123,137,138,141],{},[95,139,140],{},"Typed dates",": free-text date\u002Ftime\u002Fduration parsing in manual entry instead of pickers.",[123,143,144,145,148],{},"A real ",[95,146,147],{},"theme editor"," rather than a fixed skin.",[86,150,152],{"id":151},"built-with","Built with",[120,154,155,169,183,191,205,213,226,239,247,255,263],{},[123,156,157,162,163,168],{},[112,158,161],{"href":159,"rel":160},"https:\u002F\u002Fnuxt.com",[116],"Nuxt"," 4 — app framework (and ",[112,164,167],{"href":165,"rel":166},"https:\u002F\u002Fcontent.nuxt.com",[116],"Nuxt Content"," for this documentation)",[123,170,171,176,177,182],{},[112,172,175],{"href":173,"rel":174},"https:\u002F\u002Fui.nuxt.com",[116],"Nuxt UI"," 4 + ",[112,178,181],{"href":179,"rel":180},"https:\u002F\u002Ftailwindcss.com",[116],"Tailwind CSS"," 4 — components and theming",[123,184,185,190],{},[112,186,189],{"href":187,"rel":188},"https:\u002F\u002Fpinia.vuejs.org",[116],"Pinia"," — client state",[123,192,193,198,199,204],{},[112,194,197],{"href":195,"rel":196},"https:\u002F\u002Form.drizzle.team",[116],"Drizzle ORM"," + ",[112,200,203],{"href":201,"rel":202},"https:\u002F\u002Fgithub.com\u002Fporsager\u002Fpostgres",[116],"postgres.js"," — PostgreSQL access and migrations",[123,206,207,212],{},[112,208,211],{"href":209,"rel":210},"https:\u002F\u002Fgithub.com\u002Fatinux\u002Fnuxt-auth-utils",[116],"nuxt-auth-utils"," — sealed-cookie sessions (passwords hashed with Node's scrypt)",[123,214,215,220,221,225],{},[112,216,219],{"href":217,"rel":218},"https:\u002F\u002Fpdf-lib.js.org",[116],"pdf-lib"," — the report ",[112,222,224],{"href":223},"\u002Fguide\u002Freports-calendar#export","PDF export",", drawn directly (no headless browser)",[123,227,228,233,234,238],{},[112,229,232],{"href":230,"rel":231},"https:\u002F\u002Fnodemailer.com",[116],"Nodemailer"," — optional ",[112,235,237],{"href":236},"\u002Finstallation#email-smtp","SMTP"," for invites and password resets",[123,240,241,246],{},[112,242,245],{"href":243,"rel":244},"https:\u002F\u002Fvite-pwa-org.netlify.app",[116],"Vite PWA"," — installable app shell and service worker",[123,248,249,254],{},[112,250,253],{"href":251,"rel":252},"https:\u002F\u002Fgsap.com",[116],"GSAP"," — chart draw-ins and motion",[123,256,257,262],{},[112,258,261],{"href":259,"rel":260},"https:\u002F\u002Fzod.dev",[116],"Zod"," — API validation",[123,264,265,270,271,276],{},[112,266,269],{"href":267,"rel":268},"https:\u002F\u002Flucide.dev",[116],"Lucide"," icons · ",[112,272,275],{"href":273,"rel":274},"https:\u002F\u002Frsms.me\u002Finter\u002F",[116],"Inter"," and friends via Google Fonts",[86,278,280],{"id":279},"known-limitations","Known limitations",[91,282,283],{},"Deliberate trade-offs and rough edges, stated rather than hidden:",[120,285,286,297,303,313,319,325,331,337],{},[123,287,288,291,292,296],{},[95,289,290],{},"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 ",[112,293,295],{"href":294},"\u002Fguide\u002Freports-calendar#what-you-see","Reports",".",[123,298,299,302],{},[95,300,301],{},"No email verification."," An address is never confirmed; it is only proven by an invite or reset link arriving.",[123,304,305,308,309,296],{},[95,306,307],{},"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. ",[112,310,312],{"href":311},"\u002Freference\u002Fsecurity#sessions","Details",[123,314,315,318],{},[95,316,317],{},"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.",[123,320,321,324],{},[95,322,323],{},"Tags cannot be renamed or merged"," — create and delete only.",[123,326,327,330],{},[95,328,329],{},"The calendar's Day view is the default on narrow screens","; the seven-column week is desktop-first.",[123,332,333,336],{},[95,334,335],{},"Reports and exports cover the whole org",", with no per-user filter yet.",[123,338,339,342],{},[95,340,341],{},"Demo mode destroys data by design"," — it wipes and reseeds the demo org on boot. Never point it at anything real.",[86,344,346],{"id":345},"contributing","Contributing",[91,348,349,350,353,354,357,358,361,362,296],{},"The repository ships everything the app needs to run and extend: schema, migrations, seed data, a Docker image, reverse-proxy examples in ",[100,351,352],{},"deploy\u002F"," and this documentation site under ",[100,355,356],{},"docs\u002F",". Start with the ",[112,359,360],{"href":57},"data model"," and ",[112,363,364],{"href":62},"API reference",{"title":366,"searchDepth":367,"depth":367,"links":368},"",2,[369,370,371,372,373],{"id":88,"depth":367,"text":89},{"id":106,"depth":367,"text":107},{"id":151,"depth":367,"text":152},{"id":279,"depth":367,"text":280},{"id":345,"depth":367,"text":346},"License, credits and the project's inspiration.","md",{},{"icon":79},{"title":76,"description":374},"Fgt8PKFar-gBAu8sYEnXD2k4HpMezwCmyB-awDaA_wU",[381,383],{"title":71,"path":72,"stem":73,"description":382,"icon":74,"children":-1},"What Tick does to protect an instance, and what you as the operator still have to do.",null,1790777312388]