[{"data":1,"prerenderedAt":123},["ShallowReactive",2],{"page:\u002Farticles\u002Fintroducing-merge-folders-docker":3},{"id":4,"title":5,"author":6,"body":10,"cover":109,"date":110,"description":111,"extension":112,"head":113,"layout":116,"meta":117,"navigation":118,"path":119,"seo":120,"stem":121,"__hash__":122},"pages\u002Farticles\u002F17.introducing-merge-folders-docker.md","Introducing MergeFoldersDocker",{"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":106},"minimark",[13,17,21,24,29,32,74,88,91,102],[14,15,5],"h1",{"id":16},"introducing-mergefoldersdocker",[18,19,20],"p",{},"MergeFoldersDocker brings a repetitive server-side file job into a browser: inspect folders of images, preview their contents, and merge or move them with an explicit collision policy. The Go backend serves an embedded React interface, so the deployed application remains a single binary inside one container.",[18,22,23],{},"The web file explorer generates and caches thumbnails, while WebSocket events report live progress and activity. When two files share a name, the operation can safely rename the incoming file, overwrite the destination, or skip the collision. A chroot-like path boundary prevents the browser from walking outside the configured data directory.",[25,26,28],"h2",{"id":27},"run-it","Run it",[18,30,31],{},"Clone the repository, copy the example environment file, and set two absolute host paths:",[33,34,39],"pre",{"className":35,"code":36,"language":37,"meta":38,"style":38},"language-bash shiki shiki-themes github-light github-dark","cp .env.example .env\ndocker compose up -d\n","bash","",[40,41,42,58],"code",{"__ignoreMap":38},[43,44,47,51,55],"span",{"class":45,"line":46},"line",1,[43,48,50],{"class":49},"sScJk","cp",[43,52,54],{"class":53},"sZZnC"," .env.example",[43,56,57],{"class":53}," .env\n",[43,59,61,64,67,70],{"class":45,"line":60},2,[43,62,63],{"class":49},"docker",[43,65,66],{"class":53}," compose",[43,68,69],{"class":53}," up",[43,71,73],{"class":72},"sj4cs"," -d\n",[18,75,76,79,80,83,84,87],{},[40,77,78],{},"DATA_PATH"," identifies the directory tree the application may browse. ",[40,81,82],{},"CACHE_PATH"," stores generated thumbnails. Open ",[40,85,86],{},"http:\u002F\u002Flocalhost:8080"," after the container starts.",[18,89,90],{},"The collision mode deserves the same care as any bulk file operation. Begin with safe rename or skip, inspect the result, and keep a backup before using overwrite. The application makes the operation visible and bounded; it cannot determine whether two same-named files are truly interchangeable.",[18,92,93,94,101],{},"Visit the ",[95,96,100],"a",{"href":97,"rel":98},"https:\u002F\u002Fgithub.com\u002FAlchemist-Aloha\u002FMergeFoldersDocker",[99],"nofollow","MergeFoldersDocker repository"," for the current Compose file and development setup.",[103,104,105],"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 pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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":38,"searchDepth":60,"depth":60,"links":107},[108],{"id":27,"depth":60,"text":28},"\u002Farticles\u002Fmerge-folders-docker-cover.webp","2026-08-12T00:17:00.000Z","Merge image folders on a remote server through a guarded web UI with thumbnails, collision policies, and live progress.","md",{"title":114},{"Introducing MergeFoldersDocker":115},"Safe Folder Merging from a Browser","page",{},true,"\u002Farticles\u002Fintroducing-merge-folders-docker",{"title":5,"description":111},"articles\u002F17.introducing-merge-folders-docker","dmmNWd4YOgu8R5-ZoRPyRRFrU_RzWKxiUeu0KavH3Ls",1786980373683]