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.
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
:8999for 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 editdocker-compose.ymlto 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>:8080for the web clienthttp://<your-unraid-ip>:8999/statusfor 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/projectsby default. Your project workspaces live here. Themanual_slop.tomlper project is in this directory./config— Mounted from/mnt/user/appdata/manual_slopby 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.ymlto 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_slopfor the startup output. The hook server should log "HookServer started on :8999".