[{"data":1,"prerenderedAt":196},["ShallowReactive",2],{"nav-docs":3,"nav-api":60,"docs-expiry":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":25,"body":91,"description":101,"extension":191,"meta":192,"navigation":193,"path":26,"seo":194,"stem":27,"__hash__":195},"docs\u002Fdocs\u002F05.expiry.md",{"type":92,"value":93,"toc":183},"minimark",[94,98,102,107,114,120,123,126,130,138,141,145,152,163,166,169,173,180],[95,96,25],"h1",{"id":97},"expiry-and-deletion",[99,100,101],"p",{},"Every transfer has a retention period: 14 days by default, 1 to 90 days, or no\nexpiry at all. It is the central promise of the app, so it is enforced twice.",[103,104,106],"h2",{"id":105},"enforced-in-two-places","Enforced in two places",[99,108,109,113],{},[110,111,112],"strong",{},"At request time."," The download routes refuse an expired transfer the moment\nit lapses. The promise made to the sender is exact and does not depend on when a\nscheduled task happens to run.",[99,115,116,119],{},[110,117,118],{},"By the sweep."," A task runs every 15 minutes and deletes the files from disk\nand the rows from the database. This is the part that makes \"the files are\ndeleted from the server\" literally true rather than merely \"the files are\nunreachable\".",[99,121,122],{},"Order matters in that sweep: files first, then rows. A crash halfway through\nleaves rows pointing at missing files, which the download handler already treats\nas gone — whereas deleting the rows first would leave files on disk that nothing\nreferences and nothing will ever clean up.",[99,124,125],{},"The same task also removes abandoned drafts, expired sessions, used-up tokens,\nand storage directories with no matching row.",[103,127,129],{"id":128},"the-scheduled-task-needs-a-long-lived-process","The scheduled task needs a long-lived process",[99,131,132,133,137],{},"The sweep runs on a timer inside the Node process. The app is meant to run as\n",[134,135,136],"code",{},"node .output\u002Fserver\u002Findex.mjs"," behind a proxy, or as the Docker image, and on\neither it works unattended.",[99,139,140],{},"On a platform that starts a process per request, expiry would still be refused\nat download time — but nothing would ever reclaim the disk.",[103,142,144],{"id":143},"the-warning-before-deletion","The warning before deletion",[99,146,147,148,151],{},"Shortly before a transfer lapses, its ",[110,149,150],{},"sender"," gets one e-mail: the files are\nabout to be deleted, here is the link, and here is how many times it has been\ndownloaded so far. \"Not downloaded yet\" the day before deletion is the case\nworth acting on.",[99,153,154,155,158,159,162],{},"The lead time is ",[134,156,157],{},"NUXT_EXPIRY_WARNING_HOURS"," — 24 by default, ",[134,160,161],{},"0"," to switch it\noff.",[99,164,165],{},"It goes to the sender rather than the recipients for two reasons. The sender is\nthe one who can act on it — download the files again, or re-send. And warning\nrecipients would turn one expiry into as many extra outbound mails as the\ntransfer has addresses.",[99,167,168],{},"A transfer whose whole retention is shorter than the lead time is skipped. A\nwarning that arrives with the transfer itself is noise.",[103,170,172],{"id":171},"unlimited-retention","Unlimited retention",[99,174,175,176,179],{},"Choosing \"no expiry\" stores a ",[134,177,178],{},"NULL"," expiry rather than a far-future date, and\nthe sweep skips those rows entirely. A sentinel date would eventually arrive.",[99,181,182],{},"Use it sparingly. The disk is yours, and a tool whose whole point is that files\ngo away works best when they mostly do.",{"title":184,"searchDepth":185,"depth":185,"links":186},"",2,[187,188,189,190],{"id":105,"depth":185,"text":106},{"id":128,"depth":185,"text":129},{"id":143,"depth":185,"text":144},{"id":171,"depth":185,"text":172},"md",{},true,{"title":25,"description":101},"sZ44Arjw9ZnfT2vi4gPA5Zcyb0TGD82-VVYMaePI6wo",1790104591923]