Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


Maven Central Maven Central (snapshot) Codecov


JVM Platform Status
OpenJDK (Temurin) Current Linux Build (OpenJDK (Temurin) Current, Linux)
OpenJDK (Temurin) LTS Linux Build (OpenJDK (Temurin) LTS, Linux)
OpenJDK (Temurin) Current Windows Build (OpenJDK (Temurin) Current, Windows)
OpenJDK (Temurin) LTS Windows Build (OpenJDK (Temurin) LTS, Windows)


pallene.jar \
  --address a \
  --port p \
  --chroot c \
  --file f \
  --group-id g \
  --user-id u \
  --mime-type m

The pallene.jar command reads the contents of f into memory, opens a socket s and binds it to address a, port p. It then chroots to directory c and switches to group ID g and user ID u. Then, for each client connection k on s, it reads and discards at most 1024 octets from k and then responds with an HTTP HTTP/1.0 200 OK response, serving the contents of f with MIME type m. It then closes k.

The command does NOT fork into the background; it is designed to run under a process supervision system and simply aborts with exit code 1 on any error. The command logs the addresses of connecting clients, but does not log any data or headers the clients send. The command only works on POSIX-compatible systems.

See the examples directory in this source repository for example scripts that can, for example, run the server in a memory-restricted Linux cgroup and run with GC settings optimized for tiny heaps.