Deliver content to the field — ExperienceLibrary stores experiences, HydraHead serves them, HydraBody renders them.
After completing the downstream phases, the pipeline has:
HydraExperienceLibrary HydraCluster
┌───────────────────────────┐ ┌─────────────────────────────┐
│ visit-flanders-main-exp │ │ bxl1 / heysel │
│ staging: build 1 v1.0.0 │────────→│ body-001 ● running v1.0.0 │
│ district: bxl1 │ trigger │ body-002 ● running v1.0.0 │
│ venues: heysel, ad6 │ reprov. │ head-001 ● streaming │
└───────────────────────────┘ └─────────────────────────────┘
End users interact with heads. Heads connect to bodies over the network managed by HydraNeck. Bodies run the build from HydraRelease.
Components: HydraExperienceLibrary Type: Sequential (follows Phase 3 — upstream promote)
The experience already exists (created during foundation setup). When a new build arrives, ExperienceLibrary picks it up and you promote it through environments.
ExperienceLibrary subscribes to HydraRelease's SSE stream and reacts to build.uploaded events. When a new build appears for a project it tracks, it automatically updates the experience's development build. If auto_promote is enabled, promotion happens automatically. Otherwise, promote manually:
hydraexperiencelibrary promote visit-flanders-main-experience --to staging
hydraexperiencelibrary get visit-flanders-main-experience --json
hydraexperiencelibrary status
SSE events emitted: experience.promoted
Active components: HydraExperienceLibrary
Components: HydraExperienceLibrary → HydraCluster → hydrabody agents Type: Two sequential waves, each internally parallel
When the experience library promotes and targets districts/venues, it triggers reprovisioning in two waves: bodies first, then heads. Bodies must be running the new build before heads reconnect to their streams.
ExperienceLibrary
│
├── GET /api/v1/nodes?district=bxl1&venue=heysel (HydraCluster)
│ → returns: [body-001 (render-node), body-002 (render-node), head-001 (head), ...]
│
│ Wave 1: Bodies (parallel)
├── POST /api/v1/nodes/body-001/reprovision (HydraCluster)
├── POST /api/v1/nodes/body-002/reprovision (HydraCluster) ← parallel
│
│ Wave 2: Heads (parallel, after bodies complete)
├── POST /api/v1/nodes/head-001/reprovision (HydraCluster)
└── ...
reprovision: true flag in next heartbeat responsePOST /api/v1/body/provision-resultreprovision: true flag in next heartbeatBodies and heads within each wave reprovision in parallel. The two waves are sequential: heads wait for bodies.
# Check node status in HydraCluster dashboard
# Nodes should show provisioning → online
# Health endpoint shows fleet state
curl https://hydracluster.experiencenet.com/api/v1/health
SSE events emitted: provision.started, provision.completed (or provision.failed) per node
Active components:
Once staging is validated, the same flow repeats for production:
# Promote the same build to prod in HydraRelease
hydrarelease release promote \
--project visit-flanders-main-experience \
--env prod --build 1 --version "1.0.0" \
--server https://releases.experiencenet.com \
--token $HYDRARELEASE_AUTH_TOKEN
# Promote in ExperienceLibrary
hydraexperiencelibrary promote visit-flanders-main-experience --to production
Production promotion triggers reprovisioning of production nodes. Staging nodes are unaffected.
Throughout all phases, HydraPipeline observes:
# Health of all services
hydrapipeline status
# Live event stream (shows build.uploaded, release.promoted, provision events)
hydrapipeline watch
HydraPipeline is purely read-only — it never triggers or modifies anything. It consumes SSE events from all hydramonitor-enabled services to provide a unified view.
| What to watch | Source | Event |
|---|---|---|
| Organization created | HydraOrganization SSE | organization.created |
| District created | HydraVenues SSE | district.created |
| Venue created/status changed | HydraVenues SSE | venue.created, venue.status_changed |
| Build uploaded | HydraRelease SSE | build.uploaded |
| Release promoted | HydraRelease SSE | release.promoted |
| Release rolled back | HydraRelease SSE | release.rolled-back |
| Experience created/promoted | HydraExperienceLibrary SSE | experience.created, experience.promoted |
| Node provisioning | HydraCluster SSE | provision.started |
| Node ready | HydraCluster SSE | provision.completed |
| Node failed | HydraCluster SSE | provision.failed |