MIT · one container · no agents
Timar wakes the machines in your homelab, updates them, reads their logs, and puts them back the way it found them. Nothing is installed on them — it needs SSH, and Wake-on-LAN for the ones that sleep. Between runs they stay dark, which is why most of them are off in the first place.
amd64 + arm64Linux · OpenWrt · ProxmoxMIT licensed
The problem
Homelab machines are mostly off. The GPU box runs when you need it, the build server sits dark for a week. Tools built for always-on fleets assume an agent that reports in — the one thing a powered-down machine cannot do. So the machines that go longest without a security update are the ones nothing is watching.
Timar inverts it. Waking the host is step one of the job, and shutting it back down is the last. A machine that was off before the run is off after it.
What a run does
qm start on the hypervisor for a guest — a VM has
no wake address of its own. For another subnet, a relay on that segment sends the
packet.apk upgrade can fill the overlay or break a kernel
module on the machine carrying the session you would repair it from.
The reports outlive the notification. Every finished run is archived, so a disk creeping upward or an update failing every Friday shows up as a series. Telegram delivery is a copy, not the only place the findings exist.
Measured, not assumed
A magic packet that never leaves the host. A disk check that fails and reports all-clear. A schedule that stops firing and logs nothing. None of these announce themselves, so the decisions behind them were measured, not reasoned about — the measurements are in ARCHITECTURE.md.
Wake-on-LAN from a bridge network: the send succeeds, no error, and tcpdump
on the LAN sees nothing. Host networking, same image, same button: one packet. That is
why the compose file ships network_mode: host.
Most of the fleet is supposed to be unreachable, so a probe timeout is the normal case. Probes run in parallel behind a short TTL: the page costs one timeout, not one per sleeping machine.
One Alpine image, running as a non-root fixed UID, for amd64 and arm64. A Raspberry Pi is a first-class host — it is what Timar is written on.
Platforms
A check that cannot run on a platform says so, instead of reporting all-clear. Every
command was tried on a real host of that platform first: one df flag GNU
accepts and busybox rejects once made a disk check that passed on every router.
| Platform | System log | Disk | Containers | Unattended updates |
|---|---|---|---|---|
| Linux (systemd) | journalctl | yes | Docker | yes |
| Proxmox VE | journalctl | yes | guests via qm | yes |
| OpenWrt | logread | yes | — | off by default |
Run it
$ curl -O https://raw.githubusercontent.com/orkun-soylu/timar/main/docker-compose.yml $ docker compose up -d
Open http://<host>:8080 and create the operator account — nothing else
answers until you do. Everything an installation is — config, credentials, state,
reports, the SSH key — lives in /data, so backup and migration are
cp -a.
config.yaml, which you can edit by hand.
Do not expose this to the internet. Timar holds an SSH key that reaches
every machine it manages and can grant itself sudo on them. Keep it on a
private network, or behind a reverse proxy you control.
SSH, and Wake-on-LAN for the machines that sleep. Timar generates its own keypair on first use, installs it with your password once, and pins each host key on first sight.
A model to summarise sweeps (Anthropic, any OpenAI-compatible endpoint, or Ollama) and Telegram for delivery. Without them everything still works — you get the raw findings instead of a written assessment.