Wise-Wren-Agent

Wise-Wren-Agent

Docker app from Ferdinand99's Repository

Overview

The agent for Wise Wren: it runs on each server Wren keeps up to date. It connects out to your Wise Wren server (no ports are opened), reports what runs on this server, and carries out the updates and rollbacks someone approved in Wren, with a snapshot first and a health check after. ROOT-EQUIVALENT: this container gets the Docker socket, and access to the Docker socket is root access to the whole server. It also runs as root and mounts Unraid's /boot/config so it can update template containers the way Unraid does. Only install it if you trust your Wise Wren server and everyone who can sign in to it as editor or admin, and keep its token secret. What limits it: Wren can never send a command line, only ask for an approved update of a named target. The agent re-checks every job against Docker and its own agent.toml (in the Config folder): which folders it may touch (roots) and, with [updates] allow/deny, which containers and stacks may be updated at all. Without [updates], every target may be updated once someone approves it in Wren. Setup: in Wren, Servers, Add server; copy the token into WW_AGENT_TOKEN and Wren's address into WW_SERVER_URL. Keep the paths as they are: every folder Wren touches must be mounted at the same path inside the agent. If your appdata pool isn't called cache, add its /mnt/POOL/appdata at the same path. Snapshots are rollback points, not backups.

Wise Wren

Keeps your Docker containers up to date, without surprises.

License: MIT Website

Status: early release (Docker images only). Wren lists what runs on each server (containers, Unraid template containers, Compose stacks and script-updated stacks), checks for new versions and updates what you approve, now or at a time you choose, with a snapshot, a health check and an automatic rollback. Automatic updates inside a window, the Vigilant Vole integration (maintenance windows and monitor-based health checks), ~40 notification channels, a REST API with OpenAPI and MCP tools, in 26 languages. It is tested on Unraid; other Linux Docker hosts are best-effort, btrfs subvolume snapshots are untested on real pools and ZFS uses plain copies. The translations are unreviewed drafts. Installers and static binaries come later. The design is in docs/design.md; to build and run it, see docs/development.md.

Wise Wren ("Wren") keeps the Docker containers on your servers up to date. It checks for new versions on a schedule you choose, tells you about them, and updates only what you approve, or what you have explicitly allowed it to update on its own.

Today, keeping a home server current often means a manual check every day. Unraid's update button covers containers made from its templates, but not Compose stacks or apps that update with a vendor's own script. Other tools either only notify (Diun, What's Up Docker) or update blindly (Watchtower). None of them pause your monitoring, take a snapshot first, check health afterwards and roll back.

What it does

  • Notify, approve or automatic. Each server has a default mode and each target can override it. Approve is the default: one click updates now, or at a time you choose.
  • Scheduled updates. Approve during the day, update tonight. A scheduled update shows as planned maintenance in Vigilant Vole ahead of time.
  • Safe updates, every time. Each run goes through the same steps:
    1. preflight: the new image is pulled before anything stops;
    2. a maintenance window opens in Vigilant Vole;
    3. the target stops gracefully;
    4. a snapshot of its data is taken;
    5. the update runs;
    6. a health check: the containers are healthy and the linked monitors stay up;
    7. on failure, an automatic rollback of the image or Compose files and the data;
    8. the window closes and you get the result.
  • Notifications through the same ~40 channels as Vigilant Vole, from ntfy on your phone to email and Discord. One per new version, with a digest option.
  • One Wren, several servers, through a small agent on each.

Three kinds of targets

Kind Example New version means
Containers, including Unraid template containers nextcloud The image in the registry has changed
Docker Compose stacks immich Any of the stack's images has changed
Script-updated stacks Fluxer, updated with the vendor's installer A source such as GitHub releases reports a newer version

Wren never changes anything you haven't allowed

With automatic updates off, which is the default for every server and target, Wren updates nothing on its own. Automatic updates only run inside a window you set, and any container or stack can be excluded. An approval is for one version: if a newer one appears before it runs, Wren asks again. Scripts are defined on each server, and Wren can only ask for them by name, so it can never become a remote shell.

Install

Wren is a server (the web UI, once) plus a small agent on every Docker host it looks after. Start the server:

mkdir wise-wren && cd wise-wren
curl -fsSLO https://raw.githubusercontent.com/Ferdinand99/Wise-Wren/main/docker-compose.yml
docker compose up -d

Open http://<host>:3003/setup to create the first admin, set the address agents use under Settings → General (or WW_PUBLIC_URL), then Servers → Add server: Wren shows the agent's token once, with the docker run line for that host. On Unraid, install Wise Wren and Wise Wren Agent from Community Applications (templates). Images are on GHCR for amd64 and arm64: ghcr.io/ferdinand99/wise-wren and ghcr.io/ferdinand99/wise-wren-agent, :<version> or :latest.

The agent has the Docker socket, which is root on its host. Read the guides before the first update:

Planned for v1

Updates Around them
Containers, Unraid templates, Compose stacks, script stacks Docker Hub, GHCR, Quay and any OCI registry; GitHub releases
Notify, approve or automatic, per server and per target Release notes with each update, when Wren can find them
Scheduled updates and automatic windows with exclusions Vigilant Vole maintenance windows and monitor-based health checks
Snapshot before, health check after, automatic rollback Notifications to ~40 channels
A history of every run, step by step REST API and MCP tools for everything the web UI can do

Most of the table is in the early releases; static binaries, a Linux installer and wider testing on other Linux hosts come before v1.0. Not in v1: the iOS app (planned later), updating Unraid OS, plugins, VMs, LXC or Kubernetes, building images from source, and offsite backups (Wren's snapshots are short-lived rollback points, not backups). See docs/design.md for the full scope and the phases.

Wren is part of Hedgerow, a family of small self-hosted apps, with Vigilant Vole, Nimble Newt and Keen Kestrel. Like its siblings, it is one Rust binary with SQLite in the family's design, plus a small agent for each server.

License

MIT

Requirements

Early release (v0.1). A running Wise Wren server (template Wise-Wren) and this server's agent token from it. Root-equivalent: it gets the Docker socket.

Related apps

Explore more like this

Explore all

Details

Repository
ghcr.io/ferdinand99/wise-wren-agent:latest
Last Updated2026-10-26
First Seen2026-10-26

Runtime arguments

Network
bridge
Shell
sh
Privileged
false

Template configuration

WW_SERVER_URLVariable

Your Wise Wren server's address, e.g. http://192.168.1.10:3003.

WW_AGENT_TOKENVariable

This server's agent token (wwa_...), shown once in Wren under Servers when you add the server or make a new token.

ConfigPathrw

agent.toml (optional): roots, [updates] allow/deny and script stacks. See docs/agent.md in the Wise Wren repository.

Target
/config
Default
/mnt/user/appdata/wren-agent
Value
/mnt/user/appdata/wren-agent
Docker socketPathrw

Root-equivalent: the agent reads and recreates containers through it.

Target
/var/run/docker.sock
Default
/var/run/docker.sock
Value
/var/run/docker.sock
Appdata (share)Pathrw

Same path inside and outside: Compose folders and the data Wren snapshots.

Target
/mnt/user/appdata
Default
/mnt/user/appdata
Value
/mnt/user/appdata
Appdata (pool)Pathrw

Same path: the share's real pool, so snapshots are fast reflink copies. Change both sides if your pool has another name.

Target
/mnt/cache/appdata
Default
/mnt/cache/appdata
Value
/mnt/cache/appdata
Unraid configPathrw

Same path: Unraid's container templates and Compose Manager projects, for updating template containers the way Unraid does.

Target
/boot/config
Default
/boot/config
Value
/boot/config
Unraid web scriptsPathro

Same path, read-only: Unraid's update_container script.

Target
/usr/local/emhttp
Default
/usr/local/emhttp
Value
/usr/local/emhttp
Unraid statePathrw

Same path: Unraid's update status, kept in sync after an update.

Target
/var/local/emhttp
Default
/var/local/emhttp
Value
/var/local/emhttp
Docker dataPathrw

Same path: what Unraid's scripts read about images and containers.

Target
/var/lib/docker
Default
/var/lib/docker
Value
/var/lib/docker
TZVariable

Time zone for log timestamps.

Default
Europe/Oslo
Value
Europe/Oslo
RUST_LOGVariable

Log level filter.

Default
info
Value
info