[{"data":1,"prerenderedAt":135},["ShallowReactive",2],{"page:\u002Farticles\u002Fintroducing-invisible-archive":3},{"id":4,"title":5,"author":6,"body":10,"cover":121,"date":122,"description":123,"extension":124,"head":125,"layout":128,"meta":129,"navigation":130,"path":131,"seo":132,"stem":133,"__hash__":134},"pages\u002Farticles\u002F14.introducing-invisible-archive.md","Introducing Invisible Archive",{"name":7,"avatarUrl":8,"link":9},"Likun Cai","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F103620968?v=4","https:\u002F\u002Fgithub.com\u002FAlchemist-Aloha",{"type":11,"value":12,"toc":118},"minimark",[13,17,21,29,32,37,44,73,76,100,103,114],[14,15,5],"h1",{"id":16},"introducing-invisible-archive",[18,19,20],"p",{},"Invisible Archive is a self-hosted file manager built around one unusual rule: a ZIP archive should behave like a directory. You can navigate into it, search its entries, generate thumbnails, and stream compatible media without first extracting the archive or downloading the whole file.",[18,22,23,24,28],{},"The Go backend resolves a request such as ",[25,26,27],"code",{},"\u002Fphotos\u002F2023.zip\u002Fsummer\u002Fbeach.jpg"," by finding the physical archive and treating the remaining path as a virtual path inside it. A reference-counted LRU cache keeps active archives warm, while SQLite FTS5 provides indexed search. HTTP range support allows seeking in uncompressed media entries, and libvips handles the thumbnail pipeline.",[18,30,31],{},"The Vue interface offers grid, list, and details layouts, virtualized large directories, dark mode, waterfall image discovery, and an installable PWA. A companion Flutter app provides Android browsing and playback.",[33,34,36],"h2",{"id":35},"deploy-with-docker-compose","Deploy with Docker Compose",[18,38,39,40,43],{},"Create a ",[25,41,42],{},".env"," file in the checkout:",[45,46,51],"pre",{"className":47,"code":48,"language":49,"meta":50,"style":50},"language-env shiki shiki-themes github-light github-dark","APP_PORT=8881\nLIBRARY_DIR=\u002Fpath\u002Fto\u002Fyour\u002Fmedia\nCACHE_DIR=\u002Fpath\u002Fto\u002Fyour\u002Fcache\n","env","",[25,52,53,61,67],{"__ignoreMap":50},[54,55,58],"span",{"class":56,"line":57},"line",1,[54,59,60],{},"APP_PORT=8881\n",[54,62,64],{"class":56,"line":63},2,[54,65,66],{},"LIBRARY_DIR=\u002Fpath\u002Fto\u002Fyour\u002Fmedia\n",[54,68,70],{"class":56,"line":69},3,[54,71,72],{},"CACHE_DIR=\u002Fpath\u002Fto\u002Fyour\u002Fcache\n",[18,74,75],{},"Then start the stack:",[45,77,81],{"className":78,"code":79,"language":80,"meta":50,"style":50},"language-bash shiki shiki-themes github-light github-dark","docker compose up -d\n","bash",[25,82,83],{"__ignoreMap":50},[54,84,85,89,93,96],{"class":56,"line":57},[54,86,88],{"class":87},"sScJk","docker",[54,90,92],{"class":91},"sZZnC"," compose",[54,94,95],{"class":91}," up",[54,97,99],{"class":98},"sj4cs"," -d\n",[18,101,102],{},"The source library is designed to be mounted read-only, while thumbnails and the SQLite index live under the cache path. Keep that boundary intact: the file manager is intended for browsing, not modifying the underlying archive collection.",[18,104,105,106,113],{},"Visit the ",[107,108,112],"a",{"href":109,"rel":110},"https:\u002F\u002Fgithub.com\u002FAlchemist-Aloha\u002Finvisible-archive",[111],"nofollow","Invisible Archive repository"," for current deployment files and implementation details.",[115,116,117],"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}",{"title":50,"searchDepth":63,"depth":63,"links":119},[120],{"id":35,"depth":63,"text":36},"\u002Farticles\u002Finvisible-archive-cover.webp","2026-08-12T00:14:00.000Z","Browse, search, thumbnail, and stream files inside ZIP archives without extracting them onto your NAS.","md",{"title":126},{"Introducing Invisible Archive":127},"ZIP Files as Transparent Folders","page",{},true,"\u002Farticles\u002Fintroducing-invisible-archive",{"title":5,"description":123},"articles\u002F14.introducing-invisible-archive","x2c5b91v8z1dIF2ExJoXr6C4CMyEddSCbSFOVzNDiWg",1786980373684]