Skip to content

v0.4.0 — The terminal client

Choose a tag to compare

@r0lfi r0lfi released this 03 Oct 08:06
· 19 commits to main since this release

The terminal client: use LayerSmith from a jumphost, a laptop or an admin server, through the same API as the web UI.

LayerSmith terminal client

New

layersmith, a terminal client for a LayerSmith server. A separate, pure-Python package (Python 3.9+) that runs on any machine that can reach the server over HTTP(S). It needs no container runtime, no LayerSmith server installation, no access to the container host and no docker exec.

  • Interactive interface - run layersmith for a keyboard-driven TUI: dashboard, projects with the selected project's details and the live log of its latest build, the image and LLM training wizards, builds, scans, exports, settings and a connection page with a read-only doctor. It works at 80x24, needs no special font, and every status is a word as well as a colour (NO_COLOR is honoured).
  • Command line for scripts - the web UI's functions as commands (projects, build, builds, export, bundle, scan, scans, training, settings, ...), with --json, JSON Lines for followed jobs, documented exit codes, no prompts without a terminal and --yes for destructive actions.
  • Remote by design - local files are uploaded through the API; downloads stream to the client machine and are checked against the SHA256 the server recorded before they get their name. Builds keep running when the client quits or the SSH session drops; layersmith builds wait <id> re-attaches. A change whose answer was lost is never repeated automatically.
  • Network - TLS is always verified (an internal CA is supported with ca_cert), redirects and HTML login pages are errors rather than answers, and HTTP Basic or client certificates work for an authenticating proxy in front of LayerSmith. LayerSmith itself still has no logins, by design.

Install from the files attached to this release - the wheel, or the offline archive with every dependency for Python 3.9-3.13:

curl -LO https://github.com/r0lfi/layersmith/releases/download/v0.4.0/layersmith-client-0.4.0-offline.tar.gz
tar -xzf layersmith-client-0.4.0-offline.tar.gz && cd layersmith-client-0.4.0-offline
sha256sum -c SHA256SUMS
pipx install --pip-args="--no-index --find-links=$PWD/wheelhouse" layersmith-client
layersmith config set server https://layersmith.example.org
layersmith doctor

The client is not on PyPI. Guide: docs/client.md; what it covers of the web UI: docs/client-features.md.

API additions

All additive; existing clients are unaffected.

  • GET /api/builds/{id}/log?offset=N (or ?tail=N) returns a slice of a build log by byte offset, so a client can resume without fetching the whole log again.
  • /api/health lists api_features.
  • /api/settings reports the upload, file-count and build-context limits the server enforces.

The client also works against a 0.3.x server; it then follows logs through the part of the log the server returns with a build, and layersmith doctor says so.

Verified for this release

  • The client test suite (CLI, the TUI headless, and the CLI against the real API with a fake build runtime) on Python 3.9, 3.12 and 3.13 in CI; the backend suite and frontend build as before.
  • The offline archive installed with networking disabled on Python 3.9 to 3.13 (venv) and with pipx.
  • End to end from a separate client container with no server code, data or runtime socket, against a server doing real Podman builds: configure, create a project with an uploaded file, build from the CLI, follow it in the TUI, quit mid-build, re-attach by id, download the archive and air-gap bundle, checksums matching.

Not verified: the TUI in specific terminal emulators beyond headless rendering, a real scanner from the client (findings filters and SBOM download), recording a GPU report, and macOS.

Upgrading

No database change.

docker compose pull && docker compose up -d

Full changelog: v0.3.1...v0.4.0