Skip to content

Repoint the repository at codehacks-io - #27

Open
okcodes wants to merge 9 commits into
mainfrom
org-transfer
Open

okcodes wants to merge 9 commits into
mainfrom
org-transfer

Conversation

@okcodes

@okcodes okcodes commented Sep 11, 2026

Copy link
Copy Markdown
Collaborator

The repository moved from okcodes/vump to codehacks-io/vump. GitHub's
redirect covers a git remote or a browser link today, but it is documented to
stop working the moment anyone claims the old owner/repo string again — not
worth leaving ten files quietly depending on.

What changed

Every hardcoded okcodes/vump in the tree, updated to codehacks-io/vump:

  • Cargo.toml's repository field
  • src/adapters/github.rs's REPOSITORY constant — this is what vump self update/self status/self list actually query, so it was the one that
    mattered most to catch
  • The two URLs .github/actions/check/download-vump.sh uses to resolve and
    download a release
  • README.md (the download link, two composite-action usage examples) and
    DESIGN.md's attestation-verification example
  • Four website/ files: the repo link in its README, the git clone snippet
    shown on the page, content/links.ts (which every other link on the site is
    derived from), and the CI snippet in content/rules.ts

One occurrence is not updated to the new owner — it is fixed a different
way. release-website.yml called this repository's own composite action by
uses: okcodes/vump/.github/actions/check@main. That is this repository
naming itself and its default branch to fetch code it already has checked out.
Swapping the owner would only move the same fragility one repository name to
the right: it works only as long as codehacks-io/vump is never renamed or
transferred again, and the day it is, this line starts silently pulling
whatever ends up at the old address. Referenced by local path
(./.github/actions/check) instead — correct regardless of what this
repository is ever called.

cargo test, cargo clippy -- -D warnings, and pnpm run check all pass.

GitHub-side state (not in this diff, done directly against the repo)

Two things I found by testing rather than assuming, both would have surfaced
as confusing failures on the next real deploy:

  • git remote set-url origin git@github.com:codehacks-io/vump.git on this
    machine's checkout.
  • The github-pages environment only allowed deploys from the main
    branch.
    GitHub auto-created it with that default the moment the earlier
    failed deploy attempt ran configure-pages/deploy-pages — but
    release-website.yml deploys from website-v* tags, which a
    branch-only policy does not cover. Added a tag policy for website-v* via
    gh api repos/codehacks-io/vump/environments/github-pages/deployment-branch-policies -f name='website-v*' -f type='tag'. Confirmed against the sibling
    codehacks-io/virtual-console repo, whose already-working Pages deploy has
    the equivalent entry.

Also checked and found fine, no action needed: the Production-Signing
environment's required-reviewer rule names okcodes specifically — that user
still has admin on codehacks-io/vump, so it is not a blocker. No repository
secrets are configured yet (separate from the transfer; APPLE_CERT_P12 and
friends were never added for this repo). Branch protection on main: none
configured, transfer changed nothing there.

Left for you

  • Signing secrets are still unset, unrelated to the transfer: main
    releases won't get past the Sign job until APPLE_CERT_P12,
    APPLE_CERT_PASSWORD, KEYCHAIN_PASSWORD, APPLE_ID,
    APP_SPECIFIC_PASSWORD_VUMP, and APPLE_TEAM_ID are added as repository
    secrets. Not something I should set from here.
  • GitHub Pages itself is still not enabled (separate 404 confirmed before the
    transfer even happened) — Settings → Pages → Source: GitHub Actions, plus
    the custom domain and DNS, are still yours to do as previously discussed.
  • Any external consumer of .github/actions/check pointed at
    okcodes/vump/... needs to update their own workflow to codehacks-io/vump
    — the redirect covers them for now, but on borrowed time.

🤖 Generated with Claude Code

okcodes and others added 9 commits September 10, 2026 02:47
The binary and the landing page ship on different schedules. Deploying a copy
fix should not require cutting a vump release, which would tell everyone
pinning the binary that something changed when nothing did.

vump.toml now declares two projects, told apart by the shape of their tag:
`main` tracks Cargo.toml and Cargo.lock and tags `v1.2.3`, `website` tracks
website/package.json and tags `website-v1.2.3`. Each shape triggers one
workflow, and `vump check` infers the project from the tag, so neither has to
name --project. The shapes cannot collide: a website tag does not start with
`v`.

website/package.json gets its version back. It was dropped when the site had
no release line, on the grounds that a number nobody maintains is exactly the
kind of lie this repository exists to prevent — but vump now keeps it in step
with the tag, which is what makes it true rather than decorative.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The masthead used to fetch the newest release from the GitHub API on every
page load. Unauthenticated, that is sixty requests an hour per address, so the
version would simply vanish for anyone behind a busy NAT — and a landing page
that says different things to different people at different moments is not one
anybody can quote.

It is a declared input now: src/content/release.json, read at build time.

Reading Cargo.toml instead is the obvious move and is wrong. Cargo.toml holds
the version most recently bumped, which is not the version most recently
published — right now it says 0.8.0-alpha.0 for a tag that was never pushed,
while the newest release is 0.7.0. The page would advertise a download with no
binaries behind it, which is the defect this tool exists to prevent, pointed
at itself.

Pre-releases are skipped for the same reason: the button beside the number
hands over the newest stable, and stating an alpha next to it would be two
answers to one question. `pnpm bump:vump` picks the newest stable from the
repository's own tags, so pointing the site at a new release is one offline
command rather than a lookup that can be rate-limited.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The deployed page shipped an empty #root: correct in a browser, and nothing at
all to a crawler, a link preview, or an agent fetching it. That is a strange
thing for a page whose entire job is being read by someone deciding whether to
try the tool.

`vite build` still produces the client bundle; a second pass builds
entry-server.tsx to dist-ssr/, prerender.mjs inlines that HTML into #root, and
the intermediate is deleted rather than deployed. main.tsx hydrates when #root
already has children and renders normally when it does not, which is what the
dev server serves.

Three things had to stop depending on the browser for this to render on the
server, and none of them are workarounds:

The theme now lives on the document element rather than in React state. The
pre-paint script in index.html is what keeps the page from flashing the wrong
theme, and mirroring that into state would have given the server-rendered HTML
a theme it cannot know. Reading the attribute at the moment of the click
cannot drift from what is on screen.

The theme toggle renders both icons and hides one in CSS. Choosing between
them in JavaScript would mean the prerendered HTML picks a theme the visitor
may not be using, and hydration would swap it under them.

The entrance animations are gated on a `js` class the pre-paint script adds.
Without that, content held at opacity zero waiting for an observer would leave
a scripting-disabled client staring at a blank page — the prerendered markup
would be there, and invisible.

The site's own address is settled while we are here: vump.codehacks.io, at the
root, so the base-path environment variable and its .env are gone.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A bug report is a screenshot. The badge is fixed to the corner rather than
placed in the footer so it appears in every one of them without the reporter
scrolling to the bottom first, and it names the pair that identifies a build:
the site's version and the commit it was built from.

The version is read straight from package.json, which is the file vump keeps
in step with the website-v* tag. A separately computed value could drift from
that tag; this cannot. The commit arrives as a build-time variable the deploy
workflow sets, and reads as "local" when there is no deploy to name.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
release-website.yml builds website/ and publishes it to Pages, gated on
`vump check` agreeing the tag matches website/package.json — the same gate the
binary's release has, for the same reason: find out before the work, not after
the deploy.

It uses the composite action rather than the build in the checkout, which is
the opposite of what release.yml does and deliberate. release.yml verifies the
binary it is about to publish, where an older vump cannot catch a regression in
the very code being released. Here the subject is the website's own version,
so there is no such regression to miss, and building vump would drag a Rust
toolchain and two minutes into a job that ships static files.

Installing is `pnpm install --frozen-lockfile`. The committed lockfile is the
deploy's declared input, so nothing is resolved or discovered at deploy time
and a rebuild of the same commit produces the same bytes.

website.yml runs typecheck, lint, format and build on pull requests that touch
the site, so a broken page is caught in review rather than by a failed deploy.
It is a separate workflow with a path filter rather than a job in test.yml,
which has no path filters and would otherwise run the Rust suite for a copy
edit.

Also anchors release.yml's tag glob to a digit. `v*` matches `voldemort`; it
is the same fix the sibling repository already made, and with a second tag
shape in play the trigger should be exact about which one it wants.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The action was given `working-directory`, which it does not accept. With no
package.json at the repository root — this is a Rust project with a site in a
subdirectory — it had nowhere to read a pnpm version from and stopped before
installing anything.

`package-json-file` is the input that exists, and it is the whole point of
keeping `packageManager` in website/package.json: one declared version for
local development and CI both.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every `uses:` in the repository was checked against its published releases
rather than assumed. actions/checkout was a major behind and moves to v7;
setup-node, configure-pages, upload-pages-artifact, deploy-pages, attest,
upload-artifact, download-artifact and pnpm/setup were already current.
dtolnay/rust-toolchain stays on `stable`, which is a moving reference that
action documents rather than a pin left behind.

release-website.yml also loses its workflow_dispatch trigger. On a manual run
`github.ref_name` is a branch, so the version gate — `vump check` against the
pushed tag — has nothing to check and the deploy would either fail or, worse,
be made to skip the one step it exists for. A deploy is a tagged release here.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The repository moved from okcodes/vump to codehacks-io/vump. GitHub's own
redirect covers a git remote or a browser link for now, but it is documented
to stop working the moment anyone claims the old owner/repo string again -
not a hazard worth leaving ten files depending on.

Every hardcoded occurrence of the old owner is updated: the release URL and
composite action usage in README.md and DESIGN.md's attestation example,
Cargo.toml's repository field, the two GitHub API/download URLs
download-vump.sh uses for `vump self update`, the REPOSITORY constant that
drives it, and the four website files that link to or clone the repository.

release-website.yml's own use of the composite action is the one exception,
and it does not get the new owner name - it gets no owner name at all. That
line was this repository invoking its own action by a remote owner/repo path,
which is the same class of problem one level deeper: a rename works today only
because the old name still resolves, and would resolve to a stranger's code
the day it does not. Referenced by local path (./.github/actions/check)
instead, since the actions/checkout step already has it in the workspace -
correct regardless of what this repository is ever named or owned by.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
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