Repository navigation
v0.7.0
Breaking Changes
The web dashboard now binds 127.0.0.1 by default
taskmd web start previously listened on every network interface. It now binds
loopback only, reachable just from the machine running it.
The dashboard's JSON API has no authentication, and unless --readonly is set it serves
PUT /api/tasks/{id}, which rewrites task markdown on disk. Binding every interface by
default exposed that to whatever networks the host happened to sit on.
If you reach the dashboard from another machine, you now have to opt in:
taskmd web start --host 0.0.0.0or in .taskmd.yaml:
web:
host: 0.0.0.0
readonly: trueOn untrusted networks, pair a wider bind with --readonly and restrict access at the
host level (firewall, VPN, or an authenticating reverse proxy). taskmd still does not
authenticate web requests.
Reported in #23.
Web Dashboard
- New
--hostflag ontaskmd web start, with a matchingweb.hostconfig key and
TASKMD_WEB_HOSTenvironment variable. Bind one interface on a multi-homed host with
--host 10.0.0.1, or every interface with--host 0.0.0.0. - The startup banner now tells the truth about the bind address. It previously always
printedhttp://localhost:PORT, even when the server was actually on0.0.0.0and
[::]— so anyone reading that line and concluding the dashboard was local-only was
wrong, with nothing in the output to correct them. - A warning is printed when the bind is not loopback, naming the unauthenticated API
and — only when editing is actually enabled — thePUT /api/tasks/{id}write endpoint. - IPv6 bind addresses are handled correctly (
--host ::1). - Listen failures now name the full address instead of just the port: a bind failure on a
specific host is a different diagnosis from a port conflict.
Docker
- The image sets
TASKMD_WEB_HOST=0.0.0.0, so published ports keep working. Inside a
container the network namespace is itself the isolation boundary and-pis the
operator's explicit opt-in, so wildcard is the correct bind there. Without this, the new
loopback default would have made every documenteddocker run -p 8080:8080unreachable. - Set via
ENVrather than baked intoCMD, so the documentedCMDoverrides
(web start --port 3000,web start --readonly) keep working instead of silently
dropping the flag.
Documentation
web.hostandweb.readonlyare now documented in both example configs.web.readonly
has always worked from.taskmd.yamlbut appeared only as a row in the options table.TASKMD_WEB_HOSTandTASKMD_WEB_PORTare documented, with their config-key mapping.- Corrected the config precedence order. Two pages stated that environment variables
rank below config files. The actual order is flags → environment variables → project
.taskmd.yaml→ global~/.taskmd.yaml→ built-in defaults. - New FAQ entry on reaching the dashboard from another machine.
Internal
- The CI Docker smoke test could never fail. Its assertion piped
curl -sfinto
head, and the step ran withoutpipefail, so it took its exit status fromheadand
reported success whether or not the server was reachable. - Added regression guards asserting both Dockerfiles set the wildcard bind and that the
Docker smoke-test step declaresshell: bash. - Removed references to
docs/guides/cli-guide.mdanddocs/guides/web-guide.mdfrom the
audit-docsskill; that directory no longer exists.