Give creators a git-push-to-deploy path for services (scales), mirroring the Perforce-push path that already exists for experiences (Unreal builds). A creator signs in to HydraMancer, requests a git repo for a scale, and pushes to it. The platform builds the image, publishes it to the scale registry, launches or updates the scale on a hydraskin node, and gives it a domain with HTTPS. The creator never handles a registry credential.
This is the service-side sibling of the Perforce work (#484, hydraperforceprovision, hydraperforcewatcher, hydraperforcescale).
HydraMancer's /deploy quickstart lists five clean steps to ship a service, but step 2 (push the image to scaleregistry.experiencenet.com) silently assumes the creator already holds the SCALE_REGISTRY_TOKEN push credential. They do not, and it cannot be self-served, so the "publish fast" promise breaks at exactly that point.
Concretely: while deploying the rogue game as a scale (dogfooding /deploy), everything worked (multi-arch Dockerfile, image built and verified, hydraskin node ready, DNS ready) except publishing the image, which stopped dead at the push token. That is the gap this feature closes: the platform's builder holds the token, the creator only does git push.
| Step | Experience path (exists) | Scale path (this issue) |
|---|---|---|
| Sign in | iamnim login in HydraMancer | same |
| Request access | request a Perforce depot (hydraperforceprovision) | request a git repo (new: git provisioner) |
| Deliver | submit to the depot | push to the repo |
| Detect + act | hydraperforcewatcher fires build-notify; ExperienceLibrary auto-stages | new: scale build-watcher builds the image, pushes to registry, launches/updates the scale |
| Result | experience staged (draft to staging to live) | scale live at <name>.experiencenet.com with HTTPS |
/deploy and /experience, iamnim login, the provision proxy pattern (/api/v1/provision/perforce).hydraperforceprovision (mints access from a verified iamnim org membership).hydraperforcewatcher (detects a push, fires a build-notify webhook, ExperienceLibrary auto-stages).hydrascaleregistry (registry), hydraskin (launch, expose, update a scale), hydrascalerouter (dynamic domain routing from user.hydra.domain/port/health_path labels).rogue repo Dockerfile and deploy-image workflow are a working reference for what a pushed repo carries.Two new services, each a near-copy of a Perforce-side one:
Git provisioner (git analog of hydraperforceprovision). HydraMancer /deploy gains a "request a repo" button. The service creates a repo scoped to the creator's iamnim org, registers a push webhook, and records the mapping repo to scale-name to org.
Scale build-watcher (git analog of hydraperforcewatcher). On push it:
scaleregistry.experiencenet.com/<name>:<sha> using the token it holds,hydraskin updates it if it already exists, on a hydraskin node,user.hydra.domain and user.hydra.port labels and ensures the <name>.experiencenet.com DNS record,Run the container builder (BuildKit) as a scale, not as fixed infrastructure. There is already a hydraskin node on hcloud, so:
<repo>.experiencenet.com, label the scale, create the DNS record./deploy the same draft to staging to live promote/rollback the experiences already have.rogue is the ideal first case. It is a real containerized service, its Dockerfile and deploy workflow are already written and verified, and it hit this exact gap. When the pipeline exists, publishing rogue should be a single git push.
The original write-up assumed a central Gitea. This section revises that.
Adopt the scale-as-repo, push-to-deploy model (the Dokku and Heroku pattern) rather than running a central forge (Gitea or Forgejo). You push a project and it deploys. The forge is not the backbone.
https://<project>.experiencenet.com and reach it wherever the service runs, exactly as the web domain does.Yes. Self-hosted git spans bare git over SSH (minimalist), Gitea and Forgejo (lightweight forge with a UI), and GitLab (heavy full platform). All are legitimate. For push-to-deploy specifically, the Dokku and Heroku and Coolify style (the receiving endpoint is the deploy trigger) is the idiomatic choice, and it is leaner than running a forge.
Strict "repo equals one scale" breaks the moment you want the same source on many scales (a game on many venue kiosks, a service fanned across districts, blue and green). Resolve it by decoupling the source from the targets:
git push means "build this version". Deployment is a separate mapping of that one image onto a target set..hydrabuild.yaml declares the target or targets. One push builds once and rolls the image to every target in the set. The registry is the fan-out point; git is only the version trigger.The nuance the 1:many case forces: because a project can target many scales, its git-receive endpoint should be a thin per-project receiver, not a bare repo bound to any single target scale. It receives the push, hands the SHA to the builder, and then deploys to the declared target set. That is still the scale-as-repo ergonomics, just with the receiver scoped to the project rather than to one running scale.
Build the scale-as-repo push-to-deploy model with a thin per-project git-receive endpoint and the registry as the fan-out point. Keep a forge (Forgejo as a scale) only as an optional later add for creators who want a browsable code home.
rogue is live at https://rogue.experiencenet.com, running as a scale on pi-node-004 (arm64) with a valid Let's Encrypt cert, /data-persisted state, and a working live game over wss. This was done by executing the pipeline STAGES by hand (build multi-arch -> push to scaleregistry -> incus launch + labels + /data disk -> explicit A record -> ACME), which proves the whole path end to end against the real registry, hydraskin node, router and DNS. Full procedure and gotchas in rogue/docs/runbooks/deploy-hydra.md.
What this validated for the automated pipeline: the registry credential works (user hydra), the node pulls and launches from the registry, label-driven routing works, and ACME issues once DNS exists. Remaining to automate (this issue): the git-receive endpoint + hydragitwatcher doing these stages on a git push, in the scale-as-repo model above. hydragitwatcher is currently NEEDS_WORK and still assumes the Gitea model.