[{"data":1,"prerenderedAt":642},["ShallowReactive",2],{"navigation":3,"$H9GZRxm5Bi":56},[4],{"title":5,"path":6,"stem":7,"children":8,"page":-1},"Docs","\u002Fdocs","docs",[9,12,16,20,24,28,32,36,40,44,48,52],{"title":10,"path":6,"stem":11},"Getting started","docs\u002Findex",{"title":13,"path":14,"stem":15},"Adjust Colors","\u002Fdocs\u002Fadjust-colors","docs\u002Fadjust-colors",{"title":17,"path":18,"stem":19},"Areas","\u002Fdocs\u002Fareas","docs\u002Fareas",{"title":21,"path":22,"stem":23},"Boards","\u002Fdocs\u002Fboards","docs\u002Fboards",{"title":25,"path":26,"stem":27},"Cards","\u002Fdocs\u002Fcards","docs\u002Fcards",{"title":29,"path":30,"stem":31},"Comments","\u002Fdocs\u002Fcomments","docs\u002Fcomments",{"title":33,"path":34,"stem":35},"Contributing","\u002Fdocs\u002Fcontributing","docs\u002Fcontributing",{"title":37,"path":38,"stem":39},"Disable Signup","\u002Fdocs\u002Fdisable-signup","docs\u002Fdisable-signup",{"title":41,"path":42,"stem":43},"Health Check","\u002Fdocs\u002Fhealth-check","docs\u002Fhealth-check",{"title":45,"path":46,"stem":47},"MCP Server","\u002Fdocs\u002Fmcp-server","docs\u002Fmcp-server",{"title":49,"path":50,"stem":51},"Migration","\u002Fdocs\u002Fmigration","docs\u002Fmigration",{"title":53,"path":54,"stem":55},"Users","\u002Fdocs\u002Fusers","docs\u002Fusers",{"id":57,"title":10,"body":58,"description":68,"extension":638,"meta":639,"navigation":203,"path":6,"seo":640,"stem":11,"__hash__":641},"docs\u002Fdocs\u002Findex.md",{"type":59,"value":60,"toc":624},"minimark",[61,65,69,72,75,80,83,88,124,128,141,145,163,306,310,326,329,333,346,350,362,366,377,395,473,481,485,507,587,590,594,620],[62,63,10],"h1",{"id":64},"getting-started",[66,67,68],"p",{},"LokalBoards is an open-source (MIT License), self-hosted Kanban board system. It allows users to create boards, invite collaborators, and manage Kanban cards. It also includes admin features for user management. All data is stored in your own database, with no reliance on external services.",[66,70,71],{},"We support real-time multiplayer updates. When you edit a card, area, or rename it, the changes are instantly reflected for all users viewing the board. Comments on cards are also updated in real-time across all browsers. This is powered by an internal Socket.IO integration.",[66,73,74],{},"LokalBoards is currently available in the following languages: English (EN), German (DE), French (FR), Spanish (ES), Italian (IT), Dutch (NL), and Polish (PL).",[76,77,79],"h2",{"id":78},"install","Install",[66,81,82],{},"To install LokalBoards, follow these steps:",[84,85,87],"h3",{"id":86},"clone-the-repository","Clone the Repository",[89,90,95],"pre",{"className":91,"code":92,"language":93,"meta":94,"style":94},"language-bash shiki shiki-themes github-light github-dark","git clone https:\u002F\u002Fgithub.com\u002Fflorian-strasser\u002FLokalBoards\ncd LokalBoards\n","bash","",[96,97,98,114],"code",{"__ignoreMap":94},[99,100,103,107,111],"span",{"class":101,"line":102},"line",1,[99,104,106],{"class":105},"sScJk","git",[99,108,110],{"class":109},"sZZnC"," clone",[99,112,113],{"class":109}," https:\u002F\u002Fgithub.com\u002Fflorian-strasser\u002FLokalBoards\n",[99,115,117,121],{"class":101,"line":116},2,[99,118,120],{"class":119},"sj4cs","cd",[99,122,123],{"class":109}," LokalBoards\n",[84,125,127],{"id":126},"install-dependencies","Install Dependencies",[89,129,131],{"className":91,"code":130,"language":93,"meta":94,"style":94},"npm install\n",[96,132,133],{"__ignoreMap":94},[99,134,135,138],{"class":101,"line":102},[99,136,137],{"class":105},"npm",[99,139,140],{"class":109}," install\n",[84,142,144],{"id":143},"configure-environment-variables","Configure Environment Variables",[66,146,147,148,151,152,155,156,159,160],{},"Create a ",[96,149,150],{},".env"," file (and optionally a ",[96,153,154],{},".env.local"," file for local development) with the following settings. Adjust the values to match your database and email configuration. Additionally you can define the used language with ",[96,157,158],{},"NUXT_LANGUAGE"," and one of these properties: ",[96,161,162],{},"en, de, fr, es, it, nl, pl",[89,164,168],{"className":165,"code":166,"language":167,"meta":94,"style":94},"language-dotenv shiki shiki-themes github-light github-dark","# App Name\nNUXT_APP_NAME=LokalBoards\nNUXT_BOARDS_URL=http:\u002F\u002Flocalhost:3000\nNUXT_LANGUAGE=en\nNUXT_PUBLIC_PRIVACY_URL=https:\u002F\u002Fwww.yourdomain.com\u002Fprivacy-policy\u002F\n\n# DB\nNUXT_MYSQL_HOST=localhost\nNUXT_MYSQL_USER=root\nNUXT_MYSQL_PASSWORD=root1234\nNUXT_MYSQL_DATABASE=root\n# Set NUXT_MYSQL_SSL=true if your database requires a TLS connection\n# (common for managed\u002Fexternal MySQL). Optionally set\n# NUXT_MYSQL_SSL_REJECT_UNAUTHORIZED=false if its certificate can't be\n# verified against a public CA.\nNUXT_MYSQL_SSL=false\n\n# Email Configuration\nNUXT_EMAIL_HOST=mail.yourserver.de\nNUXT_EMAIL_PORT=465\nNUXT_EMAIL_SECURE=true\nNUXT_EMAIL_USER=contact@yourdomain.com\nNUXT_EMAIL_PASS=password1234\n","dotenv",[96,169,170,175,180,186,192,198,205,211,217,223,229,235,241,247,253,259,265,270,276,282,288,294,300],{"__ignoreMap":94},[99,171,172],{"class":101,"line":102},[99,173,174],{},"# App Name\n",[99,176,177],{"class":101,"line":116},[99,178,179],{},"NUXT_APP_NAME=LokalBoards\n",[99,181,183],{"class":101,"line":182},3,[99,184,185],{},"NUXT_BOARDS_URL=http:\u002F\u002Flocalhost:3000\n",[99,187,189],{"class":101,"line":188},4,[99,190,191],{},"NUXT_LANGUAGE=en\n",[99,193,195],{"class":101,"line":194},5,[99,196,197],{},"NUXT_PUBLIC_PRIVACY_URL=https:\u002F\u002Fwww.yourdomain.com\u002Fprivacy-policy\u002F\n",[99,199,201],{"class":101,"line":200},6,[99,202,204],{"emptyLinePlaceholder":203},true,"\n",[99,206,208],{"class":101,"line":207},7,[99,209,210],{},"# DB\n",[99,212,214],{"class":101,"line":213},8,[99,215,216],{},"NUXT_MYSQL_HOST=localhost\n",[99,218,220],{"class":101,"line":219},9,[99,221,222],{},"NUXT_MYSQL_USER=root\n",[99,224,226],{"class":101,"line":225},10,[99,227,228],{},"NUXT_MYSQL_PASSWORD=root1234\n",[99,230,232],{"class":101,"line":231},11,[99,233,234],{},"NUXT_MYSQL_DATABASE=root\n",[99,236,238],{"class":101,"line":237},12,[99,239,240],{},"# Set NUXT_MYSQL_SSL=true if your database requires a TLS connection\n",[99,242,244],{"class":101,"line":243},13,[99,245,246],{},"# (common for managed\u002Fexternal MySQL). Optionally set\n",[99,248,250],{"class":101,"line":249},14,[99,251,252],{},"# NUXT_MYSQL_SSL_REJECT_UNAUTHORIZED=false if its certificate can't be\n",[99,254,256],{"class":101,"line":255},15,[99,257,258],{},"# verified against a public CA.\n",[99,260,262],{"class":101,"line":261},16,[99,263,264],{},"NUXT_MYSQL_SSL=false\n",[99,266,268],{"class":101,"line":267},17,[99,269,204],{"emptyLinePlaceholder":203},[99,271,273],{"class":101,"line":272},18,[99,274,275],{},"# Email Configuration\n",[99,277,279],{"class":101,"line":278},19,[99,280,281],{},"NUXT_EMAIL_HOST=mail.yourserver.de\n",[99,283,285],{"class":101,"line":284},20,[99,286,287],{},"NUXT_EMAIL_PORT=465\n",[99,289,291],{"class":101,"line":290},21,[99,292,293],{},"NUXT_EMAIL_SECURE=true\n",[99,295,297],{"class":101,"line":296},22,[99,298,299],{},"NUXT_EMAIL_USER=contact@yourdomain.com\n",[99,301,303],{"class":101,"line":302},23,[99,304,305],{},"NUXT_EMAIL_PASS=password1234\n",[84,307,309],{"id":308},"build-the-application","Build the Application",[89,311,313],{"className":91,"code":312,"language":93,"meta":94,"style":94},"npx nuxt build\n",[96,314,315],{"__ignoreMap":94},[99,316,317,320,323],{"class":101,"line":102},[99,318,319],{"class":105},"npx",[99,321,322],{"class":109}," nuxt",[99,324,325],{"class":109}," build\n",[66,327,328],{},"Move the builded app from \u002F.output to your favorite hosting solution, that is able to run a nodejs app.",[84,330,332],{"id":331},"run-the-application","Run the Application",[89,334,336],{"className":91,"code":335,"language":93,"meta":94,"style":94},"node .\u002Fserver\u002Findex.mjs\n",[96,337,338],{"__ignoreMap":94},[99,339,340,343],{"class":101,"line":102},[99,341,342],{"class":105},"node",[99,344,345],{"class":109}," .\u002Fserver\u002Findex.mjs\n",[76,347,349],{"id":348},"run-with-docker","Run with Docker",[66,351,352,353,356,357,361],{},"LokalBoards ships with a ",[96,354,355],{},"Dockerfile"," and is also published as a prebuilt image\non Docker Hub. The image contains only the app — you still need a reachable\n",[358,359,360],"strong",{},"MySQL"," database. The required tables are created automatically on first\nstart, so an empty database is enough.",[84,363,365],{"id":364},"using-the-prebuilt-image-docker-hub","Using the prebuilt image (Docker Hub)",[66,367,368,369,376],{},"The image is available at\n",[370,371,375],"a",{"href":372,"rel":373},"https:\u002F\u002Fhub.docker.com\u002Fr\u002Fflorianstrasser\u002Flokalboards",[374],"nofollow","hub.docker.com\u002Fr\u002Fflorianstrasser\u002Flokalboards",".",[66,378,379,380,382,383,386,387,390,391,394],{},"Put your settings in a ",[96,381,150],{}," file (see ",[370,384,144],{"href":385},"#configure-environment-variables",") and start the container. It listens on\nport ",[96,388,389],{},"3000",", and uploaded files are stored in ",[96,392,393],{},"\u002Fapp\u002Fpublic\u002Fuploads",", so mount a\nvolume there to keep them across updates:",[89,396,398],{"className":91,"code":397,"language":93,"meta":94,"style":94},"docker pull florianstrasser\u002Flokalboards:latest\n\ndocker run -d \\\n  --name lokalboards \\\n  --env-file .env \\\n  -p 3000:3000 \\\n  -v lokalboards_uploads:\u002Fapp\u002Fpublic\u002Fuploads \\\n  florianstrasser\u002Flokalboards:latest\n",[96,399,400,411,415,428,438,448,458,468],{"__ignoreMap":94},[99,401,402,405,408],{"class":101,"line":102},[99,403,404],{"class":105},"docker",[99,406,407],{"class":109}," pull",[99,409,410],{"class":109}," florianstrasser\u002Flokalboards:latest\n",[99,412,413],{"class":101,"line":116},[99,414,204],{"emptyLinePlaceholder":203},[99,416,417,419,422,425],{"class":101,"line":182},[99,418,404],{"class":105},[99,420,421],{"class":109}," run",[99,423,424],{"class":119}," -d",[99,426,427],{"class":119}," \\\n",[99,429,430,433,436],{"class":101,"line":188},[99,431,432],{"class":119},"  --name",[99,434,435],{"class":109}," lokalboards",[99,437,427],{"class":119},[99,439,440,443,446],{"class":101,"line":194},[99,441,442],{"class":119},"  --env-file",[99,444,445],{"class":109}," .env",[99,447,427],{"class":119},[99,449,450,453,456],{"class":101,"line":200},[99,451,452],{"class":119},"  -p",[99,454,455],{"class":109}," 3000:3000",[99,457,427],{"class":119},[99,459,460,463,466],{"class":101,"line":207},[99,461,462],{"class":119},"  -v",[99,464,465],{"class":109}," lokalboards_uploads:\u002Fapp\u002Fpublic\u002Fuploads",[99,467,427],{"class":119},[99,469,470],{"class":101,"line":213},[99,471,472],{"class":109},"  florianstrasser\u002Flokalboards:latest\n",[66,474,475,476,376],{},"For a self-contained setup including MySQL, a Docker Compose example is provided\nin the ",[370,477,480],{"href":478,"rel":479},"https:\u002F\u002Fgithub.com\u002Fflorian-strasser\u002FLokalBoards#run-with-docker",[374],"project README",[84,482,484],{"id":483},"building-the-image-yourself","Building the image yourself",[66,486,487,488,490,491,494,495,498,499,502,503,506],{},"You can build the image from the ",[96,489,355],{}," in the repository. Because the\nbuild toolchain runs on your machine's architecture while the final image can\ntarget another, use ",[96,492,493],{},"docker buildx"," and pick the platform of your ",[358,496,497],{},"target\nserver"," (",[96,500,501],{},"linux\u002Famd64"," for most hosts) — otherwise the container fails to start\nwith an ",[96,504,505],{},"Exec format error",":",[89,508,510],{"className":91,"code":509,"language":93,"meta":94,"style":94},"# one-time: a builder that supports cross-platform builds\ndocker buildx create --use --name multiarch\n\n# build for the server architecture and push to your registry\ndocker buildx build --platform linux\u002Famd64 -t \u003Cyour-registry>\u002Flokalboards:latest --push .\n",[96,511,512,518,537,541,546],{"__ignoreMap":94},[99,513,514],{"class":101,"line":102},[99,515,517],{"class":516},"sJ8bj","# one-time: a builder that supports cross-platform builds\n",[99,519,520,522,525,528,531,534],{"class":101,"line":116},[99,521,404],{"class":105},[99,523,524],{"class":109}," buildx",[99,526,527],{"class":109}," create",[99,529,530],{"class":119}," --use",[99,532,533],{"class":119}," --name",[99,535,536],{"class":109}," multiarch\n",[99,538,539],{"class":101,"line":182},[99,540,204],{"emptyLinePlaceholder":203},[99,542,543],{"class":101,"line":188},[99,544,545],{"class":516},"# build for the server architecture and push to your registry\n",[99,547,548,550,552,555,558,561,564,568,571,575,578,581,584],{"class":101,"line":194},[99,549,404],{"class":105},[99,551,524],{"class":109},[99,553,554],{"class":109}," build",[99,556,557],{"class":119}," --platform",[99,559,560],{"class":109}," linux\u002Famd64",[99,562,563],{"class":119}," -t",[99,565,567],{"class":566},"szBVR"," \u003C",[99,569,570],{"class":109},"your-registr",[99,572,574],{"class":573},"sVt8B","y",[99,576,577],{"class":566},">",[99,579,580],{"class":109},"\u002Flokalboards:latest",[99,582,583],{"class":119}," --push",[99,585,586],{"class":109}," .\n",[66,588,589],{},"The build stage is pinned to your machine's native architecture, so the heavy\nbuild runs natively (no slow\u002Funstable emulation) while the runtime image targets\nthe platform you requested.",[84,591,593],{"id":592},"how-configuration-is-applied","How configuration is applied",[66,595,596,597,600,601,604,605,608,609,611,612,615,616,619],{},"LokalBoards reads its configuration from ",[358,598,599],{},"environment variables at runtime"," —\nyou never need to rebuild the image to change settings. Provide them either as\nreal environment variables (",[96,602,603],{},"docker run --env-file",", Compose ",[96,606,607],{},"environment:",", or\nyour host panel's env settings) or as a ",[96,610,150],{}," file mounted at ",[96,613,614],{},"\u002Fapp\u002F.env","\n(",[96,617,618],{},"-v \u002Fpath\u002Fto\u002F.env:\u002Fapp\u002F.env:ro","). Real environment variables take precedence\nover the mounted file.",[621,622,623],"style",{},"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 .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":94,"searchDepth":116,"depth":116,"links":625},[626,633],{"id":78,"depth":116,"text":79,"children":627},[628,629,630,631,632],{"id":86,"depth":182,"text":87},{"id":126,"depth":182,"text":127},{"id":143,"depth":182,"text":144},{"id":308,"depth":182,"text":309},{"id":331,"depth":182,"text":332},{"id":348,"depth":116,"text":349,"children":634},[635,636,637],{"id":364,"depth":182,"text":365},{"id":483,"depth":182,"text":484},{"id":592,"depth":182,"text":593},"md",{},{"title":10,"description":68},"5sNA2tf4k-9MMrQOFJ1dlrPYZraQkxXpRy7m7Xl6XGM",1786546244122]