[{"data":1,"prerenderedAt":229},["ShallowReactive",2],{"nav-docs":3,"nav-api":60,"docs-contributing":89},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","\u002Fdocs","docs",[9,12,16,20,24,28,32,36,40,44,48,52,56],{"title":10,"path":6,"stem":11},"Installation","docs\u002Findex",{"title":13,"path":14,"stem":15},"Sending files","\u002Fdocs\u002Fsending-files","docs\u002F02.sending-files",{"title":17,"path":18,"stem":19},"Receiving files","\u002Fdocs\u002Freceiving-files","docs\u002F03.receiving-files",{"title":21,"path":22,"stem":23},"Passwords, galleries and backgrounds","\u002Fdocs\u002Fshare-options","docs\u002F04.share-options",{"title":25,"path":26,"stem":27},"Expiry and deletion","\u002Fdocs\u002Fexpiry","docs\u002F05.expiry",{"title":29,"path":30,"stem":31},"Users","\u002Fdocs\u002Fusers","docs\u002F06.users",{"title":33,"path":34,"stem":35},"Configuration","\u002Fdocs\u002Fconfiguration","docs\u002F07.configuration",{"title":37,"path":38,"stem":39},"Colours and branding","\u002Fdocs\u002Fcolors","docs\u002F08.colors",{"title":41,"path":42,"stem":43},"Docker","\u002Fdocs\u002Fdocker","docs\u002F09.docker",{"title":45,"path":46,"stem":47},"API keys","\u002Fdocs\u002Fapi-keys","docs\u002F10.api-keys",{"title":49,"path":50,"stem":51},"MCP server","\u002Fdocs\u002Fmcp-server","docs\u002F11.mcp-server",{"title":53,"path":54,"stem":55},"Troubleshooting","\u002Fdocs\u002Ftroubleshooting","docs\u002F12.troubleshooting",{"title":57,"path":58,"stem":59},"Contributing","\u002Fdocs\u002Fcontributing","docs\u002F13.contributing",[61],{"title":62,"path":63,"stem":64,"children":65},"Api","\u002Fapi","api",[66,69,73,77,81,85],{"title":67,"path":63,"stem":68},"REST API","api\u002Findex",{"title":70,"path":71,"stem":72},"Transfers","\u002Fapi\u002Ftransfers","api\u002F02.transfers",{"title":74,"path":75,"stem":76},"Uploading files","\u002Fapi\u002Fupload","api\u002F03.upload",{"title":78,"path":79,"stem":80},"Sending a transfer","\u002Fapi\u002Fsend","api\u002F04.send",{"title":82,"path":83,"stem":84},"Downloading","\u002Fapi\u002Fdownload","api\u002F05.download",{"title":86,"path":87,"stem":88},"Recipients","\u002Fapi\u002Frecipients","api\u002F06.recipients",{"id":90,"title":57,"body":91,"description":223,"extension":224,"meta":225,"navigation":226,"path":58,"seo":227,"stem":59,"__hash__":228},"docs\u002Fdocs\u002F13.contributing.md",{"type":92,"value":93,"toc":217},"minimark",[94,98,110,115,154,157,164,168,180,183,187,194,201,205,213],[95,96,57],"h1",{"id":97},"contributing",[99,100,101,102,109],"p",{},"The source is on ",[103,104,108],"a",{"href":105,"rel":106},"https:\u002F\u002Fgithub.com\u002Fflorian-strasser\u002FLokalTransfer",[107],"nofollow","GitHub",",\nMIT licensed.",[111,112,114],"h2",{"id":113},"running-the-checks","Running the checks",[116,117,122],"pre",{"className":118,"code":119,"language":120,"meta":121,"style":121},"language-bash shiki shiki-themes github-light github-dark","pnpm lint\npnpm typecheck\npnpm test\n","bash","",[123,124,125,138,146],"code",{"__ignoreMap":121},[126,127,130,134],"span",{"class":128,"line":129},"line",1,[126,131,133],{"class":132},"sScJk","pnpm",[126,135,137],{"class":136},"sZZnC"," lint\n",[126,139,141,143],{"class":128,"line":140},2,[126,142,133],{"class":132},[126,144,145],{"class":136}," typecheck\n",[126,147,149,151],{"class":128,"line":148},3,[126,150,133],{"class":132},[126,152,153],{"class":136}," test\n",[99,155,156],{},"The suite runs in three layers: pure unit tests, integration tests that exercise\nthe scheduled sweep against a real database and real files, and end-to-end tests\nthat drive a real Nuxt server over HTTP for the paths that only exist as a\nrunning request — the streamed upload, the streamed zip, magic-link sign-in and\npassword reset.",[99,158,159,160,163],{},"It needs a MySQL you can create a database on, and ",[123,161,162],{},"unzip"," on the PATH. Tests\nuse their own database and their own storage root, and refuse to start if the\ndatabase name does not contain \"test\" — dropping tables is the first thing they\ndo. Mail is rendered but never sent.",[111,165,167],{"id":166},"screenshots","Screenshots",[116,169,171],{"className":118,"code":170,"language":120,"meta":121,"style":121},"pnpm demo:screenshots\n",[123,172,173],{"__ignoreMap":121},[126,174,175,177],{"class":128,"line":129},[126,176,133],{"class":132},[126,178,179],{"class":136}," demo:screenshots\n",[99,181,182],{},"Builds the app, seeds a throwaway instance and captures every page in every\nlanguage, with a browsable index. The README's screenshot is one of those\ncaptures and is refreshed on every run, so it cannot show an interface that no\nlonger exists.",[111,184,186],{"id":185},"migrations","Migrations",[99,188,189,190,193],{},"Append a new entry to the ordered list in ",[123,191,192],{},"app\u002Flib\u002FdatabaseSetup.ts"," — never\nedit or remove an existing one, since it may already have run somewhere.",[99,195,196,197,200],{},"Runs are serialised with a MySQL advisory lock, so two containers starting at\nonce cannot both apply the same migration. Column-adding migrations check for\nthe column first, so a process killed between the ",[123,198,199],{},"ALTER"," and its bookkeeping\ndoes not brick the instance on the next boot.",[111,202,204],{"id":203},"conventions","Conventions",[99,206,207,208,212],{},"Comments explain ",[209,210,211],"strong",{},"why",", not what. The code says what it does; a comment earns\nits place by recording the reasoning that is not visible — the failure it\nprevents, the alternative that was tried, the constraint that made the obvious\napproach wrong.",[214,215,216],"style",{},"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 .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":121,"searchDepth":140,"depth":140,"links":218},[219,220,221,222],{"id":113,"depth":140,"text":114},{"id":166,"depth":140,"text":167},{"id":185,"depth":140,"text":186},{"id":203,"depth":140,"text":204},"The source is on GitHub,\nMIT licensed.","md",{},true,{"title":57,"description":223},"0T7rwvpGlLBPnKNNXueUjhmx1SuinuN5tiTaU6HvI-s",1790104591923]