Sign inSign up

ardanlabs/kronk

By ardanlabs

•Updated about 4 hours ago

Your personal engine for running open-source LLMs locally. Use Go for hw accelerated local AI.

Image
Machine learning & AI
Developer tools
0

50K+

ardanlabs/kronk repository overview

⁠Kronk — Local LLM Inference & Audio Transcription Server

Kronk is a high-performance, GPU-accelerated server for local LLM inference and audio transcription. Built on llama.cpp and whisper.cpp, it provides an OpenAI-compatible API for chat completions, responses, embeddings, reranking, and audio transcription.

⁠Quick Start

Run the server with CPU inference:

docker run --rm -p 11435:11435 -v kronk-data:/kronk ghcr.io/ardanlabs/kronk:latest

Check that it's running:

curl http://localhost:11435/v1/liveness

Models download automatically on first use.


⁠Available Images

TagDescriptionArchitectures
latest / allAll backends (CPU, CUDA, Vulkan, ROCm)linux/amd64, linux/arm64
cpuCPU-only (smallest image, runs everywhere)linux/amd64, linux/arm64
cudaNVIDIA CUDA onlylinux/amd64, linux/arm64
vulkanVulkan (works on AMD, Intel, NVIDIA)linux/amd64
rocmAMD ROCm onlylinux/amd64
jetsonNVIDIA Jetson Orin/Xavier (L4T runtime)linux/arm64

⁠Platform Support

Host OSGPUImageBackendStatus
LinuxNVIDIA:cudaCUDA✅ Fully supported
LinuxAMD:rocmROCm✅ Fully supported
LinuxAMD:vulkanVulkan✅ Fully supported
LinuxIntel:vulkanVulkan✅ Fully supported
LinuxNVIDIA:vulkanVulkan✅ Fully supported
LinuxNone:cpu / :latestCPU✅ Fully supported
Linux arm64Jetson:jetsonCUDA✅ Fully supported
Linux arm64SoC iGPU:vulkanVulkan✅ Fully supported
macOSAny:latestCPU⚠️ Works (Apple Silicon GPU not exposed to containers)
WindowsNVIDIA:cudaCUDA✅ Supported (Docker Desktop + WSL2)
WindowsAMD/Intel:cpuCPU⚠️ Works (Vulkan via WSL2 unreliable for inference)
WindowsNone:cpuCPU✅ Fully supported

Legend:

  • ✅ Fully supported with GPU acceleration
  • ⚠️ Works with significant caveats

⁠GPU Run Examples

⁠NVIDIA GPU

Requires NVIDIA Container Toolkit⁠.

docker run --rm --gpus all -p 11435:11435 -v kronk-data:/kronk ghcr.io/ardanlabs/kronk:latest

Specific GPUs by index:

docker run --rm --gpus '"device=0,1"' -p 11435:11435 -v kronk-data:/kronk ghcr.io/ardanlabs/kronk:latest

Specific GPUs by UUID:

docker run --rm --gpus '"device=GPU-3a1f...,GPU-9b2e..."' -p 11435:11435 -v kronk-data:/kronk ghcr.io/ardanlabs/kronk:latest
⁠AMD GPU (ROCm)

Requires /dev/kfd and /dev/dri access. The user running Docker must be in the render and video groups.

docker run --rm \
  --device=/dev/kfd --device=/dev/dri \
  --group-add video --group-add render \
  --security-opt seccomp=unconfined \
  -p 11435:11435 -v kronk-data:/kronk \
  ghcr.io/ardanlabs/kronk:rocm
⁠Vulkan (AMD, Intel, NVIDIA)

A single image that works across GPU vendors. Requires Mesa Vulkan drivers on the host.

docker run --rm --device=/dev/dri --group-add video --group-add render \
  -p 11435:11435 -v kronk-data:/kronk \
  ghcr.io/ardanlabs/kronk:vulkan

Vulkan on NVIDIA: Requires NVIDIA Container Toolkit with graphics capabilities:

docker run --rm --gpus all \
  -e NVIDIA_DRIVER_CAPABILITIES=compute,utility,graphics \
  -p 11435:11435 -v kronk-data:/kronk \
  ghcr.io/ardanlabs/kronk:vulkan

Vulkan on Intel: Expose /dev/dri (ANV driver):

docker run --rm --device=/dev/dri --group-add video --group-add render \
  -p 11435:11435 -v kronk-data:/kronk \
  ghcr.io/ardanlabs/kronk:vulkan

Multi-GPU selection: Pin a specific GPU with environment variables:

# Select by PCI ID (format: <vendor>:<device>)
# 1002 = AMD, 8086 = Intel, 10de = NVIDIA
docker run --rm --device=/dev/dri --group-add video --group-add render \
  -e MESA_VK_DEVICE_SELECT='1002:744c' \
  -p 11435:11435 -v kronk-data:/kronk \
  ghcr.io/ardanlabs/kronk:vulkan

Verify Vulkan devices inside the container:

docker exec -it <container> vulkaninfo --summary
⁠NVIDIA Jetson (Orin / Xavier)

Requires JetPack 6+ and nvidia-container-runtime configured as the default runtime.

docker run --rm --runtime nvidia \
  -e NVIDIA_DRIVER_CAPABILITIES=compute,utility,graphics \
  -p 11435:11435 -v kronk-data:/kronk \
  ghcr.io/ardanlabs/kronk:jetson

Verify CUDA detection:

docker run --rm --runtime nvidia \
  --entrypoint nvidia-smi \
  ghcr.io/ardanlabs/kronk:jetson

⁠Audio Transcription (Bucky)

Every image includes whisper.cpp shared libraries and ffmpeg for decoding non-PCM audio uploads (WebM/Opus, MP4/AAC, OGG, M4A).

Pull a Whisper model (models are ~50-500MB, not baked into images):

docker exec -it <container> kronk bucky model pull tiny.en

Transcribe an audio file:

curl -X POST http://localhost:11435/v1/audio/transcriptions \
  -F file=@samples/jfk.wav \
  -F model=tiny.en \
  -F response_format=json

⁠Ports

PortService
11435Main API (chat completions, embeddings, models, /v1/liveness, etc.)
11445Debug server (Prometheus /metrics, pprof, statsviz)

To keep the debug server local-only, override KRONK_WEB_DEBUG_HOST=127.0.0.1:11445.


⁠Volume & Persistence

Mount a volume on /kronk to persist models, catalog, keys, and libraries across container restarts:

docker run --rm -p 11435:11435 -v kronk-data:/kronk ghcr.io/ardanlabs/kronk:latest

Models, libraries, catalog data, and API keys are all stored under /kronk. Named volumes are recommended — bind mounts require chown 10001:10001 on the host directory (the container runs as UID/GID 10001).


⁠Environment Variables

VariableDefaultDescription
KRONK_DOWNLOAD_ENABLEDfalseAllow model/library downloads from the browser UI (disabled by default for security)
KRONK_WEB_API_HOST0.0.0.0:11435API bind address
KRONK_WEB_DEBUG_HOST:11445Debug server bind address
KRONK_POOL_MODEL_CONFIG_FILE/etc/kronk/model_config.yamlPath to model configuration file
KRONK_BASE_PATH/kronkBase path for all Kronk data

⁠Verifying Image Signatures

Every published manifest is signed with cosign⁠ keyless (Sigstore / Fulcio / Rekor) by the docker.yml⁠ GitHub Actions workflow. There are no long-lived signing keys — the signature is bound to the workflow identity and recorded in the public Rekor transparency log.

To avoid cluttering the ardanlabs/kronk tag list with sha256-*.sig entries, Docker Hub signatures are stored in a sibling repository, ardanlabs/kronk-signatures⁠. Verifiers must point cosign at that repo via COSIGN_REPOSITORY:

COSIGN_REPOSITORY=ardanlabs/kronk-signatures \
  cosign verify ardanlabs/kronk:latest \
    --certificate-identity-regexp \
      'https://github.com/ardanlabs/kronk/.github/workflows/docker.yml@.*' \
    --certificate-oidc-issuer https://token.actions.githubusercontent.com

The mirror images on GHCR keep signatures co-located (the default cosign layout), so verifying those does not need COSIGN_REPOSITORY:

cosign verify ghcr.io/ardanlabs/kronk:latest \
  --certificate-identity-regexp \
    'https://github.com/ardanlabs/kronk/.github/workflows/docker.yml@.*' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com

Substitute latest with any published tag (<version>-<variant>, latest-<variant>, etc.). A successful verification prints the Fulcio cert, the GitHub Actions workflow identity, and the Rekor log entry index.


Tag summary

Content type

Image

Digest

sha256:11e8a40f1…

Size

389.9 MB

Last updated

about 4 hours ago

docker pull ardanlabs/kronk