The share is the folder
Mount any folder already on your computer at /data. The files appear — any file type. No rebuild, no docker exec, no SSH into the official image.
Mount any folder already on your computer into The Krazy To-Go Box. The contents appear at a port — list them, open them, take them to go. Same tiny static binary in Docker, Podman, or Kubernetes. Serves any file type.
How it works
One image under Docker, Podman, or Kubernetes. Mount a folder you already have; the files show up in the browser. See Deploy.
Mount any folder already on your computer at /data. The files appear — any file type. No rebuild, no docker exec, no SSH into the official image.
Inside the box the server listens on :8080. Map whatever host port you want. Localhost, LAN, public IP, or Tailscale — that choice is yours. Auth lives outside the binary.
Official image is FROM scratch. No shell, no apt, no theme engine. Tools and pretty pages live on the volume or in a helper container beside the To-Go Box.
The built-in directory page is an unstyled list of names. If you drop an index.html (and optional style.css) on the volume, that page is served instead. Copy examples/browse/ onto the share. Do not bake a theme into the official image.
Features
Point -root (or KRAZY_ROOT) at a directory. Optional -browse lists names when there is no index.html.
Range requests for resumes. /healthz for probes. Flags beat env beat defaults.
Multi-stage → FROM scratch, non-root UID. Same image under Docker, Podman, and Kubernetes (deploy/kubernetes/).
Quick start
Host go install is a quick first run — fine to try, great as a smoke check. The intended long-running path is the Krazy To-Go Box in Docker, Podman, or Kubernetes: mount a folder, publish a port.
$ krazytogo -root ./data -addr :8080 serving ./data on :8080 $ curl -fsS http://127.0.0.1:8080/hello.txt hellosmoke check
PS> krazytogo -root ./data -addr :8080 serving ./data on :8080 PS> curl.exe -fsS http://127.0.0.1:8080/hello.txt hellosmoke check
Host go install — quick first run / smoke check. Fine to try; not the setup you leave running.
go install github.com/crimsonflower420/KrazyTakeoutGoBox/cmd/krazytogo@latest
Requires Go 1.22+. Put $(go env GOPATH)/bin on your PATH (often ~/go/bin).
Requires Go 1.22+. Put %USERPROFILE%\go\bin on your PATH.
Requires Go 1.22+. Put $(go env GOPATH)/bin on your PATH (often ~/go/bin).
krazytogo -root ./data -addr :8080
-root / KRAZY_ROOT./data; /data in images)-addr / KRAZY_ADDR:8080; gokrazy :80)-browse / KRAZY_BROWSEPrecedence: flags > env > defaults.
Long-running path: Docker or Podman. Kubernetes is in Deploy.
$ docker pull ghcr.io/crimsonflower420/krazytogo:latest $ docker run --rm -p 8080:8080 -v "$PWD/data:/data" \ ghcr.io/crimsonflower420/krazytogo:latest serving /data on :8080 $ curl -fsS http://127.0.0.1:8080/hello.txt hellolong-running
PS> docker pull ghcr.io/crimsonflower420/krazytogo:latest PS> docker run --rm -p 8080:8080 -v ${PWD}/data:/data ` ghcr.io/crimsonflower420/krazytogo:latest serving /data on :8080 PS> curl.exe -fsS http://127.0.0.1:8080/hello.txt hellolong-running
Mount a folder, publish a port — the intended long-running path in Docker, Podman, or Kubernetes.
docker pull ghcr.io/crimsonflower420/krazytogo:latest
docker run --rm -p 8080:8080 \
-v "$PWD/data:/data" \
ghcr.io/crimsonflower420/krazytogo:latest
docker pull ghcr.io/crimsonflower420/krazytogo:latest
docker run --rm -p 8080:8080 `
-v ${PWD}/data:/data `
ghcr.io/crimsonflower420/krazytogo:latest
Make the sample file first, then:
go run ./cmd/krazytogo -root ./data -addr :8080
From a checkout when you want to change the Dockerfile. Published image is usually enough.
docker build -t krazytogo .
docker run --rm -p 8080:8080 \
-v "$PWD/data:/data" krazytogo
Static binary escape hatch (CGO off). Make the sample file first.
CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o krazytogo ./cmd/krazytogo
./krazytogo -root ./data -addr :8080
$env:CGO_ENABLED = "0"
go build -trimpath -ldflags="-s -w" -o krazytogo.exe ./cmd/krazytogo
.\krazytogo.exe -root .\data -addr :8080
When you want that box to stay up — Docker, Podman, or Kubernetes — Deploy has the same image for each runtime.
Deploy targets
The official image is the same ~5.4 MiB static binary in a scratch box. Docker, Podman, and Kubernetes are equal ways to run it. Lead with image + volume at /data + port 8080. Use Quick start on the host to prove a file serves; use one of these three when you want that shape to last. gokrazy remains an optional appliance (build with -tags gokrazy), not a fourth runtime.
Image ghcr.io/crimsonflower420/krazytogo:latest. Mount /data, publish 8080.
When Docker is already on the machine.
IMAGE=ghcr.io/crimsonflower420/krazytogo:latest
docker pull "$IMAGE"
docker run -d -p 8080:8080 \
-v "$PWD/data:/data" "$IMAGE"
Same image, rootless-friendly. Keep :Z on SELinux volumes. Mount /data, publish 8080.
Same image without a privileged daemon.
IMAGE=ghcr.io/crimsonflower420/krazytogo:latest
podman pull "$IMAGE"
podman run -d -p 8080:8080 \
-v "$PWD/data:/data:Z" "$IMAGE"
Same image. PVC at /data, Service on 8080. Hardened manifests in deploy/kubernetes/.
When you already have a cluster.
kubectl apply -k deploy/kubernetes/ghcr.io/crimsonflower420/krazytogo:latest/data. Publish port 8080. Same volume shape as Docker and Podman.Optional appliance path — not the product identity. Same binary. Build with -tags gokrazy. One link: gokrazy.org.
FAQ
A crazy tiny file server for the contents of your folder. Mount a folder, publish a port, take the files to go — as easy as takeout. Static pure-Go binary.
Same binary in a scratch image. Mount your folder at /data, publish :8080. One image, three launchers. That is the official packaging.
You put them on the mounted folder. They appear. Do not SSH or exec into the official image.
Anyone who can reach the published port. Bind localhost to keep it here. Use Tailscale / Caddy / Ingress when you want a smaller door. No login in the binary.
Official list is plain names. Put index.html on the volume to replace it — see examples/browse. A lone style.css cannot restyle the auto list, because the auto list does not link it.
Yes — as a second container on the same folder, not inside the other image. Mount the media volume into both. Keep the app on its port. Publish a different host port for the To-Go Box (default inside the box is :8080). That port is a plain list of names plus downloadable files. Whoever can reach it can GET them; put Tailscale or Caddy in front if the port should not be public. Installing the binary into Jellyfin’s image does not make that image a To-Go Box. The official box stays scratch, and smaller than some JPEGs. The library lives on the volume.
No. Run the To-Go Box beside the other app. Two boxes, one share, two ports.
Yes. Host go install is a quick first run / smoke check — fine to try. For anything you want to keep running, put the To-Go Box in Docker, Podman, or Kubernetes: mount a folder, publish a port.
About 5.4 MiB stripped on linux/amd64. Stdlib only. Official image is scratch — no shell, no apt, no sshd.
The image stays tiny. The ceiling is the filesystem you mounted — no product cap. A single file on ext4 is about 16 TiB; cloud disks commonly reach 64 TiB each.
No. Do not grow the official image. Run a helper container beside the To-Go Box for apt, curl, or SSH. See the Packages tutorial.
Optional appliance path. One link: gokrazy.org.
No. Read-oriented serving only. You write the volume — SSH onto the share like in the tutorial.
GPL-3.0. Coffee + star help: buy Grant a coffee.
File-Server Core
The To-Go Box process stays small. Extra userspace belongs beside the box, not inside the official image.
Serves files from -root. Optional directory browse.
No upload API in the core binary.
Browse is the only page the process serves.
Static binary. No CGO.
Tutorials
Three ways to take files to go. The To-Go Box stays tiny. The volume — and companions beside it — do the rest.
Mount the same volume into Jellyfin and the To-Go Box. Companion listing on a second port.
Plug in a drive, mount the path into the box, publish a port.
Mount directories from all over your computer into one share.
Go krazy — leave the toolkit on the other side of the wall.
Support
The Krazy To-Go Box is free software under GPL-3.0. If a tiny Go file server in a to-go box saves you an afternoon, a coffee keeps the maintainer caffeinated and the core binary sharp.