[{"data":1,"prerenderedAt":583},["ShallowReactive",2],{"navigation_docs_en":3,"-en-self-hosting-manual-install":123,"-en-self-hosting-manual-install-surround":578},[4,36,107],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":35},"Getting started","i-lucide-rocket","\u002Fen\u002Fgetting-started","en\u002F1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"What is Chronicler","\u002Fen\u002Fgetting-started\u002Fwhat-is-chronicler","en\u002F1.getting-started\u002F1.what-is-chronicler","i-lucide-help-circle",{"title":16,"path":17,"stem":18,"icon":19},"Install the app","\u002Fen\u002Fgetting-started\u002Finstall-the-app","en\u002F1.getting-started\u002F2.install-the-app","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Cloud quick start","\u002Fen\u002Fgetting-started\u002Fcloud-quickstart","en\u002F1.getting-started\u002F3.cloud-quickstart","i-lucide-cloud",{"title":26,"path":27,"stem":28,"icon":29},"Your first chat","\u002Fen\u002Fgetting-started\u002Fyour-first-chat","en\u002F1.getting-started\u002F4.your-first-chat","i-lucide-messages-square",{"title":31,"path":32,"stem":33,"icon":34},"Managing users","\u002Fen\u002Fgetting-started\u002Fmanaging-users","en\u002F1.getting-started\u002F5.managing-users","i-lucide-users",false,{"title":37,"icon":38,"path":39,"stem":40,"children":41,"page":35},"Self-hosting","i-lucide-server","\u002Fen\u002Fself-hosting","en\u002F2.self-hosting",[42,47,52,57,62,67,72,77,82,87,92,97,102],{"title":43,"path":44,"stem":45,"icon":46},"Overview","\u002Fen\u002Fself-hosting\u002Foverview","en\u002F2.self-hosting\u002F1.overview","i-lucide-layout-dashboard",{"title":48,"path":49,"stem":50,"icon":51},"Backups and restore","\u002Fen\u002Fself-hosting\u002Fbackups","en\u002F2.self-hosting\u002F10.backups","i-lucide-database-backup",{"title":53,"path":54,"stem":55,"icon":56},"Updating","\u002Fen\u002Fself-hosting\u002Fupdating","en\u002F2.self-hosting\u002F11.updating","i-lucide-refresh-cw",{"title":58,"path":59,"stem":60,"icon":61},"Security and networking","\u002Fen\u002Fself-hosting\u002Fsecurity-and-networking","en\u002F2.self-hosting\u002F12.security-and-networking","i-lucide-shield",{"title":63,"path":64,"stem":65,"icon":66},"Troubleshooting","\u002Fen\u002Fself-hosting\u002Ftroubleshooting","en\u002F2.self-hosting\u002F13.troubleshooting","i-lucide-life-buoy",{"title":68,"path":69,"stem":70,"icon":71},"Requirements","\u002Fen\u002Fself-hosting\u002Frequirements","en\u002F2.self-hosting\u002F2.requirements","i-lucide-cpu",{"title":73,"path":74,"stem":75,"icon":76},"Quick start (guided)","\u002Fen\u002Fself-hosting\u002Fquick-start","en\u002F2.self-hosting\u002F3.quick-start","i-lucide-wand-2",{"title":78,"path":79,"stem":80,"icon":81},"Manual install","\u002Fen\u002Fself-hosting\u002Fmanual-install","en\u002F2.self-hosting\u002F4.manual-install","i-lucide-terminal",{"title":83,"path":84,"stem":85,"icon":86},"GPU acceleration","\u002Fen\u002Fself-hosting\u002Fgpu-acceleration","en\u002F2.self-hosting\u002F5.gpu-acceleration","i-lucide-zap",{"title":88,"path":89,"stem":90,"icon":91},"Performance and memory","\u002Fen\u002Fself-hosting\u002Fperformance-and-memory","en\u002F2.self-hosting\u002F6.performance-and-memory","i-lucide-gauge",{"title":93,"path":94,"stem":95,"icon":96},"Configuration reference","\u002Fen\u002Fself-hosting\u002Fconfiguration-reference","en\u002F2.self-hosting\u002F7.configuration-reference","i-lucide-sliders-horizontal",{"title":98,"path":99,"stem":100,"icon":101},"Models","\u002Fen\u002Fself-hosting\u002Fmodels","en\u002F2.self-hosting\u002F8.models","i-lucide-brain",{"title":103,"path":104,"stem":105,"icon":106},"Licensing and activation","\u002Fen\u002Fself-hosting\u002Flicensing","en\u002F2.self-hosting\u002F9.licensing","i-lucide-key-round",{"title":108,"icon":109,"path":110,"stem":111,"children":112,"page":35},"Reference","i-lucide-book-open","\u002Fen\u002Freference","en\u002F3.reference",[113,118],{"title":114,"path":115,"stem":116,"icon":117},"How it works","\u002Fen\u002Freference\u002Fhow-it-works","en\u002F3.reference\u002F1.how-it-works","i-lucide-workflow",{"title":119,"path":120,"stem":121,"icon":122},"Data and privacy","\u002Fen\u002Freference\u002Fdata-and-privacy","en\u002F3.reference\u002F2.data-and-privacy","i-lucide-lock",{"id":124,"title":78,"body":125,"description":569,"extension":570,"links":571,"meta":572,"navigation":573,"path":79,"seo":574,"stem":80,"__hash__":577},"docs_en\u002Fen\u002F2.self-hosting\u002F4.manual-install.md",{"type":126,"value":127,"toc":559},"minimark",[128,132,519,524,527,531,555],[129,130,131],"p",{},"Use this when the server has no desktop — a VPS, a NAS, a machine in a rack — or\nwhen you'd simply rather see what you're running.",[133,134,135,140,148,185,189,241,245,248,314,323,327,348,389,402,417,421,452,467,470,491,495,505,516],"steps",{},[136,137,139],"h3",{"id":138},"create-a-folder-for-the-install","Create a folder for the install",[129,141,142,143,147],{},"Everything lives here: the compose file, the ",[144,145,146],"code",{},".env",", and by extension your\ndatabase. Put it somewhere permanent.",[149,150,156],"pre",{"className":151,"code":152,"filename":153,"language":154,"meta":155,"style":155},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","mkdir -p \u002Fopt\u002Fchronicler && cd \u002Fopt\u002Fchronicler\n","Terminal","bash","",[144,157,158],{"__ignoreMap":155},[159,160,163,167,171,174,178,182],"span",{"class":161,"line":162},"line",1,[159,164,166],{"class":165},"sBMFI","mkdir",[159,168,170],{"class":169},"sfazB"," -p",[159,172,173],{"class":169}," \u002Fopt\u002Fchronicler",[159,175,177],{"class":176},"sMK4o"," &&",[159,179,181],{"class":180},"s2Zo4"," cd",[159,183,184],{"class":169}," \u002Fopt\u002Fchronicler\n",[136,186,188],{"id":187},"download-the-compose-file","Download the compose file",[190,191,192,225],"tabs",{},[193,194,196],"tabs-item",{"icon":81,"label":195},"Linux \u002F macOS",[149,197,199],{"className":151,"code":198,"filename":153,"language":154,"meta":155,"style":155},"curl -L -o docker-compose.yml \\\n  https:\u002F\u002Fgithub.com\u002FChroniclerLM\u002FReleases\u002Freleases\u002Flatest\u002Fdownload\u002Fdocker-compose.yml\n",[144,200,201,219],{"__ignoreMap":155},[159,202,203,206,209,212,215],{"class":161,"line":162},[159,204,205],{"class":165},"curl",[159,207,208],{"class":169}," -L",[159,210,211],{"class":169}," -o",[159,213,214],{"class":169}," docker-compose.yml",[159,216,218],{"class":217},"sTEyZ"," \\\n",[159,220,222],{"class":161,"line":221},2,[159,223,224],{"class":169},"  https:\u002F\u002Fgithub.com\u002FChroniclerLM\u002FReleases\u002Freleases\u002Flatest\u002Fdownload\u002Fdocker-compose.yml\n",[193,226,229],{"icon":227,"label":228},"i-lucide-monitor","Windows (PowerShell)",[149,230,235],{"className":231,"code":232,"filename":233,"language":234,"meta":155,"style":155},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","Invoke-WebRequest -Uri \"https:\u002F\u002Fgithub.com\u002FChroniclerLM\u002FReleases\u002Freleases\u002Flatest\u002Fdownload\u002Fdocker-compose.yml\" -OutFile \"docker-compose.yml\"\n","PowerShell","powershell",[144,236,237],{"__ignoreMap":155},[159,238,239],{"class":161,"line":162},[159,240,232],{},[136,242,244],{"id":243},"write-the-env","Write the .env",[129,246,247],{},"Two values are required: a database password, and which runtime to use for the\nmodel.",[190,249,250,293],{},[193,251,252],{"icon":81,"label":195},[149,253,255],{"className":151,"code":254,"filename":153,"language":154,"meta":155,"style":155},"printf 'POSTGRES_PASSWORD=%s\\nCOMPOSE_PROFILES=cpu\\n' \"$(openssl rand -hex 24)\" > .env\n",[144,256,257],{"__ignoreMap":155},[159,258,259,262,265,268,271,274,277,280,284,287,290],{"class":161,"line":162},[159,260,261],{"class":180},"printf",[159,263,264],{"class":176}," '",[159,266,267],{"class":169},"POSTGRES_PASSWORD=%s\\nCOMPOSE_PROFILES=cpu\\n",[159,269,270],{"class":176},"'",[159,272,273],{"class":176}," \"$(",[159,275,276],{"class":165},"openssl",[159,278,279],{"class":169}," rand -hex ",[159,281,283],{"class":282},"sbssI","24",[159,285,286],{"class":176},")\"",[159,288,289],{"class":176}," >",[159,291,292],{"class":169}," .env\n",[193,294,295,304],{"icon":227,"label":228},[149,296,298],{"className":231,"code":297,"filename":233,"language":234,"meta":155,"style":155},"\"POSTGRES_PASSWORD=$([guid]::NewGuid().ToString('N'))`nCOMPOSE_PROFILES=cpu\" | Out-File -Encoding ascii .env\n",[144,299,300],{"__ignoreMap":155},[159,301,302],{"class":161,"line":162},[159,303,297],{},[129,305,306,309,310,313],{},[144,307,308],{},"-Encoding ascii"," matters: Docker Compose can't read the UTF-16 that\n",[144,311,312],{},"Out-File"," writes by default.",[315,316,317,318,322],"warning",{},"No default password ships, on purpose — a shipped default would make every\ninstall on the internet identically guessable. Compose refuses to start without\none, and ",[319,320,321],"strong",{},"changing it after the first start locks you out of your own\ndatabase",". Back this file up with your other secrets.",[136,324,326],{"id":325},"pick-the-right-runtime","Pick the right runtime",[129,328,329,332,333,336,337,340,341,344,345,347],{},[144,330,331],{},"COMPOSE_PROFILES"," decides which Ollama container starts: ",[144,334,335],{},"cpu",", ",[144,338,339],{},"nvidia"," or\n",[144,342,343],{},"amd",". ",[144,346,335],{}," always works. If the machine has a graphics card, let the detection\nscript choose:",[149,349,351],{"className":151,"code":350,"filename":153,"language":154,"meta":155,"style":155},"curl -L -o detect-hardware.sh \\\n  https:\u002F\u002Fgithub.com\u002FChroniclerLM\u002FReleases\u002Freleases\u002Flatest\u002Fdownload\u002Fdetect-hardware.sh\nchmod +x detect-hardware.sh\n.\u002Fdetect-hardware.sh\n",[144,352,353,366,371,383],{"__ignoreMap":155},[159,354,355,357,359,361,364],{"class":161,"line":162},[159,356,205],{"class":165},[159,358,208],{"class":169},[159,360,211],{"class":169},[159,362,363],{"class":169}," detect-hardware.sh",[159,365,218],{"class":217},[159,367,368],{"class":161,"line":221},[159,369,370],{"class":169},"  https:\u002F\u002Fgithub.com\u002FChroniclerLM\u002FReleases\u002Freleases\u002Flatest\u002Fdownload\u002Fdetect-hardware.sh\n",[159,372,374,377,380],{"class":161,"line":373},3,[159,375,376],{"class":165},"chmod",[159,378,379],{"class":169}," +x",[159,381,382],{"class":169}," detect-hardware.sh\n",[159,384,386],{"class":161,"line":385},4,[159,387,388],{"class":165},".\u002Fdetect-hardware.sh\n",[129,390,391,392,394,395,397,398,401],{},"It probes the host, writes the right ",[144,393,331],{}," into ",[144,396,146],{},", and suggests\na model for the hardware it found. Details and manual alternatives:\n",[399,400,83],"a",{"href":84},".",[403,404,405,406,408,409,412,413,416],"caution",{},"If ",[144,407,331],{}," is missing entirely, ",[319,410,411],{},"no"," model runtime starts. The stack\ncomes up but can't answer anything, and ",[144,414,415],{},"docker compose logs ollama-pull"," will\nsay so after two minutes.",[136,418,420],{"id":419},"start-it","Start it",[149,422,424],{"className":151,"code":423,"filename":153,"language":154,"meta":155,"style":155},"docker compose up -d\ndocker compose logs -f\n",[144,425,426,440],{"__ignoreMap":155},[159,427,428,431,434,437],{"class":161,"line":162},[159,429,430],{"class":165},"docker",[159,432,433],{"class":169}," compose",[159,435,436],{"class":169}," up",[159,438,439],{"class":169}," -d\n",[159,441,442,444,446,449],{"class":161,"line":221},[159,443,430],{"class":165},[159,445,433],{"class":169},[159,447,448],{"class":169}," logs",[159,450,451],{"class":169}," -f\n",[129,453,454,455,458,459,462,463,466],{},"First start pulls several gigabytes. When ",[144,456,457],{},"chronicler-backend"," reports it's\nlistening on ",[144,460,461],{},"8410",", you're up. ",[144,464,465],{},"chronicler-ollama-pull"," exiting is normal — it\ndownloads the model and stops.",[129,468,469],{},"Check with:",[149,471,473],{"className":151,"code":472,"filename":153,"language":154,"meta":155,"style":155},"docker compose ps\ncurl http:\u002F\u002Flocalhost:8410\u002Fhealth\n",[144,474,475,484],{"__ignoreMap":155},[159,476,477,479,481],{"class":161,"line":162},[159,478,430],{"class":165},[159,480,433],{"class":169},[159,482,483],{"class":169}," ps\n",[159,485,486,488],{"class":161,"line":221},[159,487,205],{"class":165},[159,489,490],{"class":169}," http:\u002F\u002Flocalhost:8410\u002Fhealth\n",[136,492,494],{"id":493},"connect-the-app-and-claim-the-server","Connect the app and claim the server",[129,496,497,498,501,502,401],{},"On any machine on the network, open Chronicler → ",[319,499,500],{},"Settings → Connection →\nLocal",", and enter ",[144,503,504],{},"http:\u002F\u002F\u003Cserver-ip>:8410",[129,506,507,508,511,512,515],{},"The login screen offers ",[319,509,510],{},"Register your admin account"," while the server has no\nusers. Create it, accept the licence terms, and activate your key\n(",[399,513,514],{"href":104},"Licensing",").",[403,517,518],{},"Do this immediately after the first start, from a machine you trust. An empty\nserver is claimable by whoever gets there first.",[520,521,523],"h2",{"id":522},"what-just-started","What just started",[129,525,526],{},"The database schema is created automatically on first boot, and again on every\nupdate — you never run migrations by hand. Before a schema change the backend\ndumps the database first and refuses to continue if that dump fails.",[520,528,530],{"id":529},"optional-next-steps","Optional next steps",[532,533,534,540,545,550],"ul",{},[535,536,537,538],"li",{},"Tune memory: ",[399,539,88],{"href":89},[535,541,542,543],{},"Every setting you can change: ",[399,544,93],{"href":94},[535,546,547,548],{},"Put HTTPS in front: ",[399,549,58],{"href":59},[535,551,552,553],{},"Automatic backups: ",[399,554,48],{"href":49},[556,557,558],"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 .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);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":155,"searchDepth":221,"depth":221,"links":560},[561,562,563,564,565,566,567,568],{"id":138,"depth":373,"text":139},{"id":187,"depth":373,"text":188},{"id":243,"depth":373,"text":244},{"id":325,"depth":373,"text":326},{"id":419,"depth":373,"text":420},{"id":493,"depth":373,"text":494},{"id":522,"depth":221,"text":523},{"id":529,"depth":221,"text":530},"Install the stack from a terminal — the path for a headless server.","md",null,{},{"icon":81},{"title":575,"description":576},"Install the Chronicler stack manually","Download the compose file, write the .env, and start the Chronicler self-hosted stack from a terminal.","2V8CYlDuVHP8IBal7OcFMWxuOBXrfZG0MFSJ2FVpqPg",[579,581],{"title":73,"path":74,"stem":75,"description":580,"icon":76,"children":-1},"Let the app set up the Docker stack for you, then register the first administrator.",{"title":83,"path":84,"stem":85,"description":582,"icon":86,"children":-1},"Use the graphics card you already have — the difference between a minute and a few seconds.",1785092110204]