Skip to content

Say what Glama actually builds, which is not our Dockerfile - #107

Merged
michal-wrzosek merged 1 commit into
mainfrom
worktree-glama-dockerfile-truth
Sep 21, 2026
Merged

michal-wrzosek merged 1 commit into
mainfrom
worktree-glama-dockerfile-truth

Conversation

@michal-wrzosek

Copy link
Copy Markdown
Contributor

The previous change added a Dockerfile and justified it with a claim that is
wrong. Glama does not build it.

Their methodology says a server is built "from a Dockerfile … authored by the
maintainer and checked into the repository, or inferred by Glama's AI-assisted
build system", and I read the first branch as ours. It is not. The server's
admin page is a form, and Glama generates its own Dockerfile from those fields,
clones this repository into /app at a pinned commit, and runs the build steps
there. The generated file confirms it. Nothing in it references what is
committed at the root. Another maintainer hit this and removed theirs.

So this removes the false paragraph, keeps the Dockerfile for the reasons that
actually hold, and writes down the fields Glama does read.

What the Dockerfile is still worth

Two things, both smaller than the reason it was written for:

  • CI builds it on every pull request and speaks a real handshake to the result.
    That is the only check in this repository that exercises the published
    package rather than the source tree.
  • It is still the shortest way for somebody to watch this server run without
    installing anything of ours.

The new document

docs/glama-build-spec.md records the fields to paste into the admin page and
why. Glama's inference for this repository produces:

["pnpm install", "pnpm run build"]
["mcp-proxy", "--", "node", "bin/gitwarren.mjs"]

All three parts fail here. pnpm against a repository with a
package-lock.json and no pnpm lockfile. run build typechecks and runs four
Vite builds, needing the Electron dependency and its platform binary download,
to produce bundles this server does not start from. And bin/gitwarren.mjs
does not exist in this repository at all: that launcher is
packaging/npm/bin/gitwarren.mjs, published rather than checked out, loading a
bundle that exists only inside the built package.

What replaces it installs the published package and runs that, which is the
artifact every agent starts and therefore the honest thing to put in front of
a scanner.

Verified against a copy of their image

Their generated Dockerfile was reproduced verbatim down to the base image, the
NodeSource install, the clone and the PATH, with only the build step and CMD
swapped for the recommended ones, and built for x86-64.

Check Result
npm install -g gitwarren@0.1.17 3 packages, 3 seconds
Compiler needed none; cc, gcc, g++ and make are all absent
better-sqlite3 binding prebuilt linux-x64.node, shipped in the package
Bare server over stdio handshake returned, version 0.1.17
Database location /tmp/gitwarren/gitwarren.db, where the placeholder puts it
Real CMD through mcp-proxy container stays up, handshake returned through the proxy

The absent toolchain is the interesting row. It means the recommended build
step needs nothing beyond what their base image already provides, so it cannot
fail for want of a compiler on their infrastructure.

Version drift

The document pins a version, so sync-plugin-versions.mjs now covers it,
matching only pinned spellings so the surrounding prose can go on saying npx gitwarren mcp untouched. It cannot reach the field on Glama's website and the
document says so. What it keeps current is the line somebody copies.

🤖 Generated with Claude Code

The previous commit added a Dockerfile and justified it with a claim that is
wrong. Glama's methodology says a server is built "from a Dockerfile ...
authored by the maintainer and checked into the repository, or inferred by
Glama's AI-assisted build system", and I read the first branch as ours. It is
not. The server's admin page is a form - base image, build steps, CMD,
environment schema - Glama generates its own Dockerfile from those fields,
clones this repository into `/app` at a pinned commit, and runs the build steps
there. Nothing reads the file at the root.

That was discoverable before writing it, and the cost of not discovering it is
a README that teaches a stranger something untrue about how their listing gets
built. So the paragraph goes, and the file keeps only the reasons that survive
contact with the facts: CI builds it on every pull request and speaks a real
handshake to the result, which is the only check here that exercises the
published package rather than the source tree, and it is still the shortest
way for somebody to watch this server run without installing anything of ours.

`docs/glama-build-spec.md` is the part that was missing. The fields Glama does
read live on their website, where nothing in this repository can check them, so
the next best thing is to keep the document somebody copies them from. It
records what their inference produced and why all three parts of it fail here:
`pnpm` against a repository with a `package-lock.json`, a `run build` that
wants Electron to produce bundles this server does not start from, and a
`bin/gitwarren.mjs` that exists only inside the published package. What
replaces it installs that published package and runs it, which is the artifact
every agent actually starts and therefore the honest thing to put in front of
a scanner.

The version in that document is pinned, so `sync-plugin-versions.mjs` now
covers it too, matching only the pinned spellings so the prose can go on saying
`npx gitwarren mcp` untouched. It cannot reach the field on Glama's website and
does not pretend to; what it keeps current is the line somebody copies.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@michal-wrzosek
michal-wrzosek merged commit 30654db into main Sep 21, 2026
5 checks passed
@michal-wrzosek
michal-wrzosek deleted the worktree-glama-dockerfile-truth branch September 21, 2026 07:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant