Private
Public Access
0
0
Files
manual_slop/docs/guide_docker_deployment.md
T
conductor-tier2 161ebb0da6 docs(fix): correct nav link case + relative-path level
Gitea (and any case-sensitive filesystem) was rendering the [Top]
nav links in /docs as broken because of two bugs:

1. Case-sensitivity: 22 links used '../README.md' (all-uppercase)
   but the actual file is 'docs/Readme.md' (capital R, lowercase
   rest). 21 guide_*.md nav bars were affected, plus 1 internal
   cross-link in Readme.md itself. Works on Windows (case-
   insensitive) but broken on Linux/Gitea.

   Fix: 22 occurrences across 22 files changed
   '../README.md' -> '../Readme.md'

2. Wrong relative-path level: 16 links used '../../conductor/...'
   from 'docs/guide_*.md' to reach 'conductor/'. This goes up 2
   levels to 'projects/', which doesn't exist. The correct path
   from 'docs/guide_*.md' to 'conductor/' is 1 level up
   ('../conductor/...'). 12 unique patterns across 10 files
   affected.

   Fix: 16 occurrences across 10 files changed
   '../../conductor/' -> '../conductor/'

3. Bonus: 1 planned-guide link in guide_context_curation.md
   referenced a never-written 'guide_context_presets.md'. The
   ContextPreset schema is now fully covered in the new
   'guide_context_aggregation.md' (per the 2026-06-08 docs
   refresh). Fix: link target updated.

No content was changed, only link paths. 24 files, 37 link
replacements, 37 deletions.

Verification:
- All .md links in docs/ now resolve to existing files
  (validated by path-resolution check from each file's directory)
- The 3 new guides from the previous docs refresh commit
  (guide_discussions.md, guide_state_lifecycle.md,
  guide_context_aggregation.md) had the case bug inherited from
  guide_architecture.md's existing nav pattern; their top-of-file
  nav bars are now correct
- The 21 pre-existing guide nav bars that had the same bug
  (all 21 of them, except the 3 that used the correct case:
  guide_mma.md, guide_simulations.md, guide_tools.md) are now
  also fixed
- Inter-guide links (e.g. [Discussions](guide_discussions.md))
  were not affected; they were always correct because both the
  link text and the actual filename are lowercase

This is a docs-only fix. No code modified.
2026-06-08 19:51:55 -04:00

3.6 KiB

Docker Deployment Guide (Unraid)

Top | Architecture | Tools & IPC


Overview

This guide covers deploying Manual Slop on Unraid (or any Docker host) using the containerized image. The deployment provides:

  • A web-accessible ImGui GUI (browser-based, no local display required)
  • The Hook API on :8999 for agent access
  • Persistent volumes for projects and app state

Prerequisites

  • Unraid 6.10+ (or any Docker host with compose support)
  • A project share mounted at /mnt/user/projects (or edit docker-compose.yml to match your path)
  • API keys for the providers you want to use

Building the Image

From the repo root:

./scripts/docker_build.sh

Or use the helper:

./scripts/docker_build.sh

Pushing to Gitea Registry

If your Gitea instance has a container registry, push the built image:

./scripts/docker_push.sh

This reads your Gitea credentials from credentials.toml (registry_url, username, token) and pushes to https://git.cozyair.dev/ed/manual_slop:latest.

Running the Container

Edit docker-compose.yml to set your volume paths and provider keys (via .env file or environment).

# Create a .env file with your API keys
cat > .env <<EOF
GEMINI_API_KEY=your-key-here
ANTHROPIC_API_KEY=your-key-here
DEEPSEEK_API_KEY=your-key-here
MINIMAX_API_KEY=your-key-here
EOF

# Start the container
docker compose up -d

Accessing the GUI

Open a browser and navigate to:

  • http://<your-unraid-ip>:8080 for the web client
  • http://<your-unraid-ip>:8999/status for the hook API health check

The web client renders the ImGui panels via WebGL. The Hello ImGui web backend streams frame deltas over WebSocket.

Agent Access

Agents interact with the running container via the Hook API on :8999. Examples:

# Check status
curl http://<your-unraid-ip>:8999/status

# Get MMA state
curl http://<your-unraid-ip>:8999/api/gui/mma_status

See guide_tools.md for the full Hook API reference.

Volumes

  • /projects — Mounted from /mnt/user/projects by default. Your project workspaces live here. The manual_slop.toml per project is in this directory.
  • /config — Mounted from /mnt/user/appdata/manual_slop by default. App state: presets, personas, log directory, workspace profiles.

Pulling from Gitea Registry on Unraid

If you pushed the image to Gitea's container registry, pull it on Unraid:

# Login to Gitea registry
docker login git.cozyair.dev -u ed

# Pull the image
docker pull git.cozyair.dev/ed/manual_slop:latest

# Run the container
docker run -d \
  --name manual_slop \
  -p 8999:8999 \
  -p 8080:8080 \
  -v /mnt/user/projects:/projects \
  -v /mnt/user/appdata/manual_slop:/config \
  git.cozyair.dev/ed/manual_slop:latest

Or use docker-compose.yml after editing the image name:

image: git.cozyair.dev/ed/manual_slop:latest

Updating

git pull
docker build -t manual_slop:latest .
./scripts/docker_push.sh  # if using Gitea registry
docker compose up -d

Backup

Back up /config to preserve presets, personas, and workspace profiles. Back up /projects/<project>/conductor/ to preserve track history.

Troubleshooting

  • Port conflicts: Edit docker-compose.yml to change the host port (e.g., "18080:8080" to use 18080 on the host).
  • Permission errors: Ensure the Unraid share has write permissions for the container's UID.
  • Hook API not responding: Check docker logs manual_slop for the startup output. The hook server should log "HookServer started on :8999".