[{"data":1,"prerenderedAt":391},["ShallowReactive",2],{"\u002Fdocs\u002Freference\u002Fdevelopment":3},{"id":4,"title":5,"body":6,"description":383,"extension":384,"meta":385,"navigation":386,"path":387,"seo":388,"stem":389,"__hash__":390},"docs\u002Fdocs\u002Freference\u002Fdevelopment.md","Development",{"type":7,"value":8,"toc":377},"minimark",[9,13,31,87,91,148,162,173,207,227,231,241,248,251,260,295,308,315,350,357,361,373],[10,11,5],"h1",{"id":12},"development",[14,15,16,17,24,25,30],"p",{},"NetIgnite is developed in the open on GitHub under the\n",[18,19,23],"a",{"href":20,"rel":21},"https:\u002F\u002Fgithub.com\u002FNetIgnite-project",[22],"nofollow","NetIgnite-project"," organization. All repositories are\nlicensed under the ",[18,26,29],{"href":27,"rel":28},"https:\u002F\u002Fwww.gnu.org\u002Flicenses\u002Fagpl-3.0.html",[22],"AGPL-3.0",".",[32,33,34,47],"table",{},[35,36,37],"thead",{},[38,39,40,44],"tr",{},[41,42,43],"th",{},"Repository",[41,45,46],{},"Stack",[48,49,50,63,75],"tbody",{},[38,51,52,60],{},[53,54,55],"td",{},[18,56,59],{"href":57,"rel":58},"https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FServer",[22],"Server",[53,61,62],{},"Nuxt 3, Nitro (Bun preset) with WebSockets, SQLite via libsql, Bootstrap",[38,64,65,72],{},[53,66,67],{},[18,68,71],{"href":69,"rel":70},"https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FAgent-ESP32",[22],"Agent-ESP32",[53,73,74],{},"C++17, Arduino framework, PlatformIO",[38,76,77,84],{},[53,78,79],{},[18,80,83],{"href":81,"rel":82},"https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FWebsite",[22],"Website",[53,85,86],{},"Nuxt 4, Nuxt UI, Nuxt Content, Tailwind CSS, static generation",[88,89,59],"h2",{"id":90},"server",[92,93,99],"pre",{"className":94,"code":95,"filename":96,"language":97,"meta":98,"style":98},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FServer.git\ncd Server\nbun install\nbun run dev\n","Terminal","bash","",[100,101,102,118,128,137],"code",{"__ignoreMap":98},[103,104,107,111,115],"span",{"class":105,"line":106},"line",1,[103,108,110],{"class":109},"sBMFI","git",[103,112,114],{"class":113},"sfazB"," clone",[103,116,117],{"class":113}," https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FServer.git\n",[103,119,121,125],{"class":105,"line":120},2,[103,122,124],{"class":123},"s2Zo4","cd",[103,126,127],{"class":113}," Server\n",[103,129,131,134],{"class":105,"line":130},3,[103,132,133],{"class":109},"bun",[103,135,136],{"class":113}," install\n",[103,138,140,142,145],{"class":105,"line":139},4,[103,141,133],{"class":109},[103,143,144],{"class":113}," run",[103,146,147],{"class":113}," dev\n",[14,149,150,151,154,155,158,159,30],{},"The dev server runs on ",[100,152,153],{},"http:\u002F\u002Flocalhost:3000"," and stores its database in ",[100,156,157],{},".\u002Fdata\u002F",". The admin\npassword is printed on first start. Run the tests with ",[100,160,161],{},"bun test",[14,163,164,165,168,169,172],{},"Helper scripts in ",[100,166,167],{},"devutils\u002F"," write directly to ",[100,170,171],{},".\u002Fdata\u002Fdb.sqlite",":",[174,175,176,191],"ul",{},[177,178,179,182,183,186,187,190],"li",{},[100,180,181],{},"bun run devutils\u002FcreateAgent.ts"," creates a test agent (secret ",[100,184,185],{},"123456",") for user ",[100,188,189],{},"1",". Restart\nthe dev server afterwards so it loads the agent.",[177,192,193,196,197,200,201,203,204,206],{},[100,194,195],{},"bun run devutils\u002FcreateTestUser.ts"," creates an ",[100,198,199],{},"admin"," user with the password ",[100,202,185],{},". It\nfails if ",[100,205,199],{}," already exists, so run it before the server's first start.",[14,208,209,210,214,215,218,219,222,223,226],{},"Releases are created with the manual GitHub Actions workflows ",[211,212,213],"strong",{},"Create Release"," (builds, tests\nand attaches ",[100,216,217],{},"app.tar.gz",") and ",[211,220,221],{},"Publish Docker Images"," (pushes to\n",[100,224,225],{},"ghcr.io\u002Fnetignite-project\u002Fserver",").",[88,228,230],{"id":229},"esp32-agent","ESP32 Agent",[14,232,233,234,237,238,30],{},"Open the repository in VS Code with the PlatformIO extension, or use PlatformIO Core. Setup,\nbuild and flashing are described on the ",[18,235,230],{"href":236},"\u002Fdocs\u002Fagents\u002Fesp32"," page. The code is\nformatted with the included ",[100,239,240],{},".clang-format",[14,242,243,244,30],{},"To test protocol changes without hardware, use the ",[18,245,247],{"href":246},"\u002Fdocs\u002Fagents\u002Fprotocol#example-agent","example agent",[88,249,83],{"id":250},"website",[14,252,253,254,259],{},"This website, including the docs, is a static site built with the\n",[18,255,258],{"href":256,"rel":257},"https:\u002F\u002Fgit.leicraftmc.de\u002FLeiCraftMC\u002FStyle-Guides",[22],"LeiCraftMC Style Guide"," static-site-with-docs\ntemplate.",[92,261,263],{"className":94,"code":262,"filename":96,"language":97,"meta":98,"style":98},"git clone https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FWebsite.git\ncd Website\nbun install\nbun run dev\n",[100,264,265,274,281,287],{"__ignoreMap":98},[103,266,267,269,271],{"class":105,"line":106},[103,268,110],{"class":109},[103,270,114],{"class":113},[103,272,273],{"class":113}," https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FWebsite.git\n",[103,275,276,278],{"class":105,"line":120},[103,277,124],{"class":123},[103,279,280],{"class":113}," Website\n",[103,282,283,285],{"class":105,"line":130},[103,284,133],{"class":109},[103,286,136],{"class":113},[103,288,289,291,293],{"class":105,"line":139},[103,290,133],{"class":109},[103,292,144],{"class":113},[103,294,147],{"class":113},[14,296,150,297,300,301,304,305,30],{},[100,298,299],{},"http:\u002F\u002Flocalhost:12531",". ",[100,302,303],{},"bun run generate"," writes the static site to\n",[100,306,307],{},".output\u002Fpublic\u002F",[14,309,310,311,314],{},"Docs pages are Markdown files in ",[100,312,313],{},"content\u002Fdocs\u002F",". To add one:",[316,317,318,337,344],"ol",{},[177,319,320,321,324,325,328,329,332,333,336],{},"Create the ",[100,322,323],{},".md"," file with ",[100,326,327],{},"title",", ",[100,330,331],{},"description"," and ",[100,334,335],{},"navigation.title"," frontmatter.",[177,338,339,340,343],{},"Register it in ",[100,341,342],{},"app\u002Fdata\u002Fdocs.ts"," so it appears in the sidebar and the previous\u002Fnext links.",[177,345,346,347,30],{},"Add it to ",[100,348,349],{},"public\u002Fstatic\u002Futils\u002Fsitemap.xml",[14,351,352,353,356],{},"Every page has an ",[211,354,355],{},"Edit this page"," link that opens the file on GitHub.",[88,358,360],{"id":359},"contributing","Contributing",[14,362,363,364,369,370,30],{},"Bug reports and pull requests are welcome in the matching repository. Use\n",[18,365,368],{"href":366,"rel":367},"https:\u002F\u002Fwww.conventionalcommits.org\u002F",[22],"Conventional Commits"," for commit messages, for example\n",[100,371,372],{},"fix: reconnect after WiFi loss",[374,375,376],"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 .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);}",{"title":98,"searchDepth":120,"depth":120,"links":378},[379,380,381,382],{"id":90,"depth":120,"text":59},{"id":229,"depth":120,"text":230},{"id":250,"depth":120,"text":83},{"id":359,"depth":120,"text":360},"NetIgnite's repositories, how to run each one locally, and how to contribute.","md",{},{"title":5},"\u002Fdocs\u002Freference\u002Fdevelopment",{"title":5,"description":383},"docs\u002Freference\u002Fdevelopment","f8WA3LvVb7XxiHfO5FLgBFmO-3mcW75n6UF4u6HuUzc",1792355946378]