tagged reasoning content. A typical workflow: user SSHs in, verifyPublicKey checks their GitHub key against the whitelist/blacklist, useChat establishes the session, messages flow through appendMessage and are stored via createOrUpdateConversation`, and the AI response streams back through the same path.

Code Health & Issues

  • HIGH - Pin third-party GitHub Actions to a commit SHA - .github/workflows: docker/setup-qemu-action@v3, docker/setup-buildx-action@v3, docker/login-action@v3, docker/metadata-action@v5 are on mutable tags, risking supply chain compromise.
  • HIGH - Add a test suite; this repository has none: 46 source files with zero test files means any change ships with no signal existing behavior holds.
  • MEDIUM - Enable Dependabot or Renovate: 1 manifest(s) with no update bot configured; advisories remain unpatched without automated monitoring.
  • MEDIUM - Pin the container base image by digest - Dockerfile: node:22-slim and gcr.io/distroless/nodejs22-debian12 use mutable tags, meaning build composition can change between runs without record.
  • MEDIUM - Gate pull requests on a dependency vulnerability scan - .github/workflows: no dependency scan in CI; a known-vulnerable package could reach production undetected.
  • MEDIUM - Add a non-root USER to the image - Dockerfile: CMD/ENTRYPOINT with no USER directive; process runs as root against every mounted volume.
  • MEDIUM - Review the install lifecycle script and disable scripts in CI - package.json: postinstall script executes during install, creating an event-stream-style compromise vector in CI.
  • LOW - Set timeout-minutes on the workflow jobs - .github/workflows/docker.yml: 1 workflow declares no job timeout; a wedged step runs to the six-hour platform default.
  • LOW - Add the repository convention files this project lacks: missing .editorconfig, .gitattributes with text=auto eol=lf, and a formatter config.

The Bottom Line

This is a functional SSH AI chat implementation with a clean separation between auth, chat state, and data access. The codebase is well-structured for its scope, with clear entry points and a resolvable call graph. However, the absence of tests and the use of mutable GitHub Action tags and base images represent real production risks. Teams comfortable with SSH-based tooling and who accept the current health trade-offs can deploy this, but anyone requiring auditability or long-term maintainability should address the high-severity findings first.