lockbox

lockbox is a Docker base image that runs an SSH server with no shell behind it. Every connection goes through a small Python wrapper that runs one of 15 built-in file operations, all locked to /work, or a binary you listed in an allowlist. Nothing else runs.

Build your own image on top of it, install a CLI tool, list it in allowed.json, and that tool is now a remote service. No HTTP API, no request parsing, no serialization layer. ssh myapp@host "tool --flag arg" and you’re done. Put it behind Cloudflare Tunnel or Tailscale and you don’t even need an open port.

Quick start

FROM psyb0t/lockbox

ENV LOCKBOX_USER=myapp

RUN apt-get update && \
    apt-get install -y --no-install-recommends ffmpeg && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

COPY allowed.json /etc/lockbox/allowed.json

With allowed.json next to it:

{
  "ffmpeg": "/usr/bin/ffmpeg",
  "ffprobe": "/usr/bin/ffprobe"
}

Getting started walks through building, running and connecting.

You want to Read
Build an image on lockbox and connect to it Getting started
Move files in and out of /work File operations
Set the allowlist, username, UID/GID, volumes and startup hooks Configuration
Ship a one-line installer and host CLI for your image Installer generator
Know exactly what a key holder can and cannot do Security
See how a connection flows through sshd and the wrapper Architecture
Fix an error message Troubleshooting
Build, test and release lockbox itself Development

Images built on lockbox

Image What it does
psyb0t/mediaproc FFmpeg, Sox, ImageMagick and 2200+ fonts, media processing over SSH
psyb0t/qwenspeak Qwen3-TTS text-to-speech over SSH with preset voices, voice cloning and voice design

The image is psyb0t/lockbox on Docker Hub, built for linux/amd64 and linux/arm64. Licensed under WTFPL.