As easy as takeout — your files in a simple to-go box.

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.

github.com/crimsonflower420/KrazyTakeoutGoBox · binary krazytogo · image ghcr.io/crimsonflower420/krazytogo:latest

Folder in. Port out. Box stays empty.

One image under Docker, Podman, or Kubernetes. Mount a folder you already have; the files show up in the browser. See Deploy.

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.

The door is the port

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.

The box stays empty

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.

What the To-Go Box does.

  • Static file serving

    Point -root (or KRAZY_ROOT) at a directory. Optional -browse lists names when there is no index.html.

  • Range and /healthz

    Range requests for resumes. /healthz for probes. Flags beat env beat defaults.

  • Scratch packaging

    Multi-stage → FROM scratch, non-root UID. Same image under Docker, Podman, and Kubernetes (deploy/kubernetes/).

Smoke check, then leave the box running

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.

smoke check
$ krazytogo -root ./data -addr :8080
serving ./data on :8080
$ curl -fsS http://127.0.0.1:8080/hello.txt
hello
smoke check

Host go install — quick first run / smoke check. Fine to try; not the setup you leave running.

Install the binary
go install github.com/crimsonflower420/KrazyTakeoutGoBox/cmd/krazytogo@latest

Requires Go 1.22+. Put $(go env GOPATH)/bin on your PATH (often ~/go/bin).

Make a sample file
New-Item -ItemType Directory -Force -Path data | Out-Null
Set-Content -Path data/hello.txt -Value hello
Run it
krazytogo -root ./data -addr :8080
-root / KRAZY_ROOT
Directory to serve (default ./data; /data in images)
-addr / KRAZY_ADDR
Listen address (default :8080; gokrazy :80)
-browse / KRAZY_BROWSE
Directory listing (default on; off → dirs 404)

Precedence: flags > env > defaults.

Long-running path: Docker or Podman. Kubernetes is in Deploy.

long-running
$ 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
hello
long-running

Mount a folder, publish a port — the intended long-running path in Docker, Podman, or Kubernetes.

Run the box
docker pull ghcr.io/crimsonflower420/krazytogo:latest
docker run --rm -p 8080:8080 \
  -v "$PWD/data:/data" \
  ghcr.io/crimsonflower420/krazytogo:latest
I already cloned the repo

Make the sample file first, then:

From a checkout
go run ./cmd/krazytogo -root ./data -addr :8080
Build the image yourself

From a checkout when you want to change the Dockerfile. Published image is usually enough.

docker build
docker build -t krazytogo .
docker run --rm -p 8080:8080 \
  -v "$PWD/data:/data" krazytogo
Build a local binary

Static binary escape hatch (CGO off). Make the sample file first.

Static build
CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o krazytogo ./cmd/krazytogo
./krazytogo -root ./data -addr :8080

When you want that box to stay up — Docker, Podman, or Kubernetes — Deploy has the same image for each runtime.

One To-Go Box. Three first-class launchers.

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.

Docker

Image ghcr.io/crimsonflower420/krazytogo:latest. Mount /data, publish 8080.

When Docker is already on the machine.

Docker
IMAGE=ghcr.io/crimsonflower420/krazytogo:latest
docker pull "$IMAGE"
docker run -d -p 8080:8080 \
  -v "$PWD/data:/data" "$IMAGE"

Podman

Same image, rootless-friendly. Keep :Z on SELinux volumes. Mount /data, publish 8080.

Same image without a privileged daemon.

Podman
IMAGE=ghcr.io/crimsonflower420/krazytogo:latest
podman pull "$IMAGE"
podman run -d -p 8080:8080 \
  -v "$PWD/data:/data:Z" "$IMAGE"

Kubernetes

Same image. PVC at /data, Service on 8080. Hardened manifests in deploy/kubernetes/.

When you already have a cluster.

  • kubectl apply -k deploy/kubernetes/
  • Image ghcr.io/crimsonflower420/krazytogo:latest
  • PVC at /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.

Short answers.

What is The Krazy To-Go Box?

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.

How does the box run in Docker / Podman / Kubernetes?

Same binary in a scratch image. Mount your folder at /data, publish :8080. One image, three launchers. That is the official packaging.

How do files get in?

You put them on the mounted folder. They appear. Do not SSH or exec into the official image.

Who can download?

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.

Can I style the listing?

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.

Can I run this next to Jellyfin (or another media app)?

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.

Should I install KrazyToGo inside another container?

No. Run the To-Go Box beside the other app. Two boxes, one share, two ports.

Can I run it without a container?

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.

How big is the binary?

About 5.4 MiB stripped on linux/amd64. Stdlib only. Official image is scratch — no shell, no apt, no sshd.

How huge can the share get?

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.

Can I grow the official image?

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.

What about gokrazy?

Optional appliance path. One link: gokrazy.org.

Can I upload files?

No. Read-oriented serving only. You write the volume — SSH onto the share like in the tutorial.

License / support?

GPL-3.0. Coffee + star help: buy Grant a coffee.

Well-defined boundaries — on purpose.

The To-Go Box process stays small. Extra userspace belongs beside the box, not inside the official image.

  • Static roots

    Serves files from -root. Optional directory browse.

  • Read-oriented

    No upload API in the core binary.

  • No admin UI

    Browse is the only page the process serves.

  • Pure Go

    Static binary. No CGO.

Support the project.

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.