Summary
ARTEX v0.5.0 adds Ollama support, requires a one-time setup token before anyone can claim a fresh instance, removes startup secrets from the environment that agent shells and tools inherit, and makes the Docker image build from a fresh clone. It also moves to Go 1.26.10 and Node 22 and adds race-detector and shellcheck runs to CI. Full list: CHANGELOG.md. Entries marked "direct commit" landed on main without a pull request.
Upgrade note: first-run setup now asks for a setup token printed in the server log, and Docker installs publish port 8787 on 127.0.0.1 by default. Set ARTEX_BIND_ADDR=0.0.0.0 in .env, or use a reverse proxy or an SSH tunnel, for remote access.
New features
- Ollama support: an
ollamaLLM profile format for a local or LAN Ollama server. No API key is needed,OPENAI_API_KEYis never inherited, the base URL defaults tohttp://127.0.0.1:11434/v1and is normalized to the/v1root, and the profile works in the failover pool, task LLM chains, model listing and connection tests (#128). - Setup token for first-run setup: while no admin password is set, the server generates a random 128-bit one-time token at startup and prints it to its log (
docker compose logs artex | grep "Setup token"). The/setuppage asks for it and it is cleared once the password is stored (#137). ARTEX_BIND_ADDRsets the addressdocker-compose.ymlpublishes the web UI on; the default is127.0.0.1(#137).
Security fixes
- First-run claim: anyone who reached port 8787 on a fresh install before the operator could set the admin password.
POST /api/auth/initnow requires the setup token (constant-time comparison, 403 when missing or wrong), and Docker installs bind 8787 to loopback by default (#137). - Startup secrets removed from the environment:
ARTEX_PG_DSN,ANTHROPIC_API_KEYandOPENAI_API_KEYare unset insideserver.Newafter they are read and before the MCP discovery goroutine and the task resume loop start, so agent shells, MCP stdio servers and custom tools no longer inherit them (#136).Newdid not apply its options, so the scrub from #136 did not run in the binary until #146 fixed it (#146). - Saved API keys go only to their own endpoint:
POST /api/llm/testandPOST /api/llm/modelsused a saved key for anybase_urlin the request body. A saved key is now sent only when the request's provider and normalized base URL match the ones it was saved for (#142). ARTEX_LLM_PROVIDERis matched case-insensitively: a value such asOllamafell through to the Anthropic default and sentANTHROPIC_API_KEYto the configured base URL (#140).
Bug fixes
- Ollama base URL on the environment path is normalized to the
/v1root like the saved-profile path, so an Ollama server configured throughARTEX_LLM_BASE_URLno longer answers 404 on chat (direct commit 1c35c9c). - A malformed
config.jsonis an error with the file path, instead of being treated as missing (#141). install.shescapes the values it writes intoconfig.jsonand.env, so passwords containing",\,|or&no longer corrupt them; the port must be numeric (#141).scripts/backup.sh --keep 0is rejected instead of deleting every dump, including the one just written; values with a leading zero are rejected too (#139).backups/is ignored again in.gitignore, so database dumps no longer show up as untracked files (#138).
Build and CI
- The image is built from the checkout instead of pulled from the defunct
autumn27/artexnamespace;install.shandupdate.shbuild it locally (direct commit 1ed154e). - A fresh clone builds the image: the Dockerfile is now a multi-stage build (Node 22 frontend export, Go 1.26
build.shwith the release job's flags, runtime image) and no longer needs a prebuiltdist/binary (#147). update.shstops on a diverged clone with recovery commands instead of rebuilding the old tree (direct commit 1ed154e).- CI runs
go test -raceon every package with tests except./server, andshellcheck -S warningoninstall.sh,update.sh,start.shandscripts/backup.sh(#144). The race run has its own database (direct commit 0477751).
Upgrades
- Go 1.26.10 (was 1.26.3) and
golang.org/x/netv0.62.0 (was v0.58.0), with x/crypto 0.58.0, x/text 0.43.0, x/sys 0.49.0, x/sync 0.24.0, x/mod 0.41.0 and x/tools 0.51.0 (#145). - Node 22 in the runtime image instead of the end-of-life Node 20 (#143).
Known issues
- The JWT signing key is not in the Docker volume. The server writes
jwt.keynext to the executable (/app/jwt.keyin the image), not in/app/dataas the Dockerfile anddocker-compose.ymlcomments say. Recreating the container (for exampledocker compose up -d --buildafter an update) generates a new key and signs every user out. A key found atdata/jwt.keyis moved to/app/jwt.keyon start and removed from the volume. - The secret scrub has limits. A process running as the same user can still read the server's
/proc/<pid>/environ(and, in Docker, that of PID 1,start.sh). Other variables that may carry credentials, such asARTEX_LLM_PROXY, are not scrubbed. - The LLM test and model-list endpoints still take
proxyfrom the request, so a saved key can pass through a request-supplied proxy when the base URL is plain HTTP. - Postgres passwords with
@,/,#or?break theARTEX_PG_DSNthatdocker-compose.ymlbuilds by interpolation, and Compose interpolates$in.env. - The Docker build context includes local secrets:
.dockerignoredoes not exclude.env,config.jsonorjwt.key, so the build stage'sCOPY . .puts them in a build-stage layer of the local builder cache. They are not copied into the final image. - Image supply chain: recon tools are downloaded at pinned versions but not checksum-verified, sqlmap tracks its default branch, and the Playwright packages are installed at
@latest. Draft #127 proposes checksum verification. - No Docker image is published for this release. The release workflow's
dockerjob only runs whenDOCKERHUB_ENABLEDis set. Build the image from the checkout withdocker compose up -d --build. - CI gaps:
./serverdoes not run under-race; there is nogovulncheckstep and nodocker buildjob. Four tests skip themselves (see #9). - Reported, not fixed in this release:
list_task_credentialsemits an invalid"required": [""]schema that strict LLM providers reject (#130), and the MCP Streamable HTTP client fails against servers that only support protocol version 2025-11-25 (#131, fix proposed in #132).
Contributors
- @glauberportella: thank you for Ollama support (#128), a careful change across the provider, profile storage, failover pool, task chains and settings UI that keeps the profile keyless without ever falling back to a cloud key or endpoint.
- @BaaRai: thank you for authoring the security, bug-fix, build and CI changes in #136 through #147, and for reviewing, verifying and merging #128.