34 Commits
Author SHA1 Message Date
zeekay b74b0d4e01 A booking link fills in the attendee, and the Booker ships as a site
/{owner}/{slug}?name=&email=&notes= starts the details step filled in,
as a Cal.com link does: hanzo.ai's sales page sends its visitors here
with the answers they gave. The page reads them once and takes them off
the address before anything reports it.

That needs @hanzo/booker 8.3.6's prefill, so the app moves to the 8.x
line: @hanzo/gui 8.3.5 and React 19. The committed lockfile no longer
matched package.json and is regenerated.

cal.hanzo.ai is served from the Sites plane slug cal-web, and nothing
published there: the image lane pinned a values file universe deleted,
and the forge copy runs no workflows. hanzo.yml gains the site lane and
.github/workflows calls hanzoai/ci; the Dockerfile and the dead lanes go.

Claude-Session: https://claude.ai/code/session_01HuMDfgFssPUptYUzgZ6Cp8
2026-09-27 15:00:35 -07:00
zeekayandHanzo Dev a2608269c3 ci: a runner label names the platform, not the org
hanzo-build-linux-amd64, lux-build-linux-amd64, zoo-build-linux-amd64 and
every other org-prefixed spelling all meant the same machine. Which org a
job belongs to does not change which host can build it, so the org bought
one pool name per org per arch and each could go stale on its own -- the
evo host alone answered to fourteen names for one label.

One vocabulary now: linux-amd64, linux-arm64, macos-arm64, win-amd64. The
generic labels every plain workflow uses (ubuntu-latest, self-hosted) are
untouched, so naive CI keeps working.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-08 12:09:50 -07:00
zeekayandHanzo Dev 444819a18f fix: call the pipeline at the address it actually lives
hanzoai/ci keeps the reusable at .github/workflows/build.yml — the one path
both planes resolve, since github.com reads a reusable only from there and the
forge reads it too. The v1 tag moved with it, so a caller still naming
.hanzo/workflows/build.yml asks for a blob that is not in the tree:

  InsertRun: read hanzoai/ci@v1:.hanzo/workflows/build.yml: object does not exist

The caller itself stays at .hanzo/workflows/cicd.yml on purpose: github.com has
no runner for these labels, so a caller placed there could never be scheduled.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-08 01:14:16 -07:00
zeekayandHanzo Dev 76a2d5c893 chore: symlink AGENTS.md + GEMINI.md + CLAUDE.md -> LLM.md
Co-authored-by: Hanzo Dev <[email protected]>
2026-09-02 00:56:01 -07:00
zeekay 302c55389d fix(type): cal reads Zen from @hanzo/font
main.tsx imported @fontsource-variable/geist and geist-mono and styles.css
named them, so this surface shipped two npm packages of somebody else's face.
One import of @hanzo/font/css covers both roles.
2026-08-25 12:34:52 -07:00
zeekay ff45f79e8c carry the github copy's 1 commits onto the forge
This repo is written on git.hanzo.ai and mirrored to github.com, and the two had drifted apart — 8 commits here the mirror lacked, 1 there this host lacked. Merging rather than overwriting so neither side's work is lost.
2026-08-20 20:56:54 -07:00
zeekay 6f1223fd2d add the licence this fork inherits
This repository was public with no LICENSE file. It is a fork, so the grant is
the upstream's: MIT, with the upstream copyright retained as MIT requires.
2026-08-20 10:34:45 -07:00
zeekayandHanzo Dev e6b3134488 Merge the forge line into main — one history, two remotes
Work landed on GitHub while CI reads the forge, so each remote carried commits
the other did not. Merging keeps both; a force-push either way would have
dropped one side silently.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-12 20:27:14 -07:00
zeekay 2acbf41283 retire the GitHub Actions workflows
Actions are disabled on this repository, so these files have not run in a long
time and cannot run: they are build definitions no forge executes. Builds go
through the native path -- POST /v1/runner, which schedules a BuildKit job --
and CI lives under .hanzo/workflows. A dead workflow that still looks like a
pipeline is worse than none, because it reads as coverage nobody has.
2026-08-07 09:24:35 -07:00
zeekayandHanzo Dev 93db7dbb45 ci: canonical pair — hanzo.yml + forge caller
github.com has no runner for hanzo-build-linux-amd64, so a caller under
.github/workflows is a gate that can never be scheduled. This is the ~7-line
caller on the plane that can (git.hanzo.ai git-runner fleet), pinned @v1.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-06 02:36:59 -07:00
zeekayandHanzo Dev 41442bbd16 ci: canonical pair — hanzo.yml + forge caller
github.com has no runner for hanzo-build-linux-amd64, so a caller under
.github/workflows is a gate that can never be scheduled. This is the ~7-line
caller on the plane that can (git.hanzo.ai git-runner fleet), pinned @v1.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-06 02:30:29 -07:00
zeekay 3ab74696b0 docs(readme): add a README — the repo had none
What the page is, how to run it locally, the layout, and where the depth is.
2026-08-01 14:00:11 -07:00
zeekay 6fbbc13921 ci: build an image that can actually be built
This pipeline could not work on this fleet and had not produced an image in
weeks, while looking idle rather than broken.

  buildctl-daemonless.sh: command not found (exit 127). Jobs run in
  catthehacker/ubuntu:act-24.04 per GIT_RUNNER_LABELS; there is no buildctl
  in it. It also read secrets.GIT_CLONE_TOKEN, which exists on neither the
  repo nor the hanzoai org on git.hanzo.ai.

  The kubectl patch step failed the same way (kubectl: command not found) and
  was futile anyway: cd.hanzo.ai selfHeal restores the App CR from the pin in
  hanzoai/universe on its next poll. Rollout is a reviewed pin there, never a
  CI side effect — so the deploy step is removed, not repaired.

Replaced with the shape proven on hanzoai/playground, the only one of these
whose build job has ever gone green here: setup-buildx + login-action +
build-push-action, using GHCR_USER/GHCR_TOKEN/GH_PAT which DO exist as org
secrets. Keeps playground's imagetools verification, because build-push-action
can exit 0 before the manifest resolves.
2026-07-27 05:05:49 -07:00
zeekay 466563db15 ci: target a runner pool that exists
runs-on named a label no runner on git.hanzo.ai advertises. The four online
git-runners offer hanzo-build-linux-amd64 (plus ubuntu-latest/22.04/24.04);
hanzo-linux-amd64 and hanzo-deploy-linux-amd64 are offered by NOTHING there
(the latter is a GitHub ARC pool, not a forge runner).

A job asking for an unavailable label does not fail — it queues forever and
cancels at the 24h timeout, which reads as 'CI is slow', not 'CI is broken'.

This was latent while the forge repo had actions disabled and the pipeline
could not fire at all. Enabling it made the bug reachable, so it is fixed in
the same pass.
2026-07-27 04:48:06 -07:00
zeekay 338963d800 ci(platform-build): neutralize to sync-notice — native build/deploy is .hanzo/workflows/deploy.yml 2026-07-24 15:12:55 -07:00
zeekay 1af022f12d ci(cicd): neutralize to sync-notice — native build/deploy is .hanzo/workflows/deploy.yml 2026-07-24 15:12:41 -07:00
zeekay 547a5c71f5 ci(deploy): native Hanzo pipeline — BuildKit -> ghcr -> patch app cal-web 2026-07-24 15:11:44 -07:00
zeekay f265afd3f2 chore(cal): v0.2.0 — drop the retired platform build-callback, semver the release
The build workflow no longer calls platform.hanzo.ai/v1/build-callback (that TS
control plane is retired; the edge is the cloud Go binary). The runner just builds
and pushes to GHCR; the operator rolls it out via the App CR. Ship images by
semver tag (v0.2.0), not raw sha.
2026-07-22 23:22:38 -07:00
zeekay eeced893ab feat(cal): render the Booker in the hero + wire Sign in / Create calendar to hanzo.id
The landing hero is now the product itself — the live <Booker> embedded (no
StrictMode loop; renders stably). Drop the 'Try a booking' button. Nav gets
'Sign in' and 'Create your calendar', both entering through hanzo.id (IAM).
2026-07-22 23:14:48 -07:00
zeekay 09a84d14b5 feat(cal): Hanzo H logo + favicon, force Geist Variable across the booker
Add the Hanzo H mark to the nav + favicon (from ~/work/hanzo/logo). Fix the font
family to the real @fontsource name (Geist Variable) and force it across the
Tamagui booker with !important (Tamagui sets font-family inline).
2026-07-22 22:45:35 -07:00
zeekay 30b9b3669e fix(cal): booker uses same-origin /v1/calendar (no CORS) — fixes NetworkError on submit
The cross-origin POST /bookings to api.hanzo.ai failed (cal-api-version header not
in the preflight allow-list). cal.hanzo.ai/v1/calendar already routes to the same
backend, so a relative same-origin path avoids CORS entirely. GET slots worked
cross-origin; the POST didn't.
2026-07-22 22:39:22 -07:00
zeekay a897590be3 fix(cal): reliable dark landing (drop fragile hero embed) — pure HTML renders every time
The nested Tamagui embed in the plain-HTML marketing hero intermittently blanked
the landing. Landing is now pure HTML (always renders); 'Try a booking' links to
the live Booker at /{host}/{event}. Dark monochrome + Geist intact.
2026-07-22 22:36:01 -07:00
zeekay cee07b24d7 feat(cal): dark monochrome theme + Geist Sans/Mono; GuiProvider dark
Kill the blinding white: dark monochrome palette (#0a0a0a bg, #ededed ink,
grey scale), monochrome buttons, Geist Variable Sans + Mono (self-hosted,
CSP-safe), GuiProvider defaultTheme=dark so the Booker embed + routes match.
2026-07-22 22:29:10 -07:00
zeekay f6eced511d fix(ci): drop COPY patches + packages/cal from Dockerfile (atoms removed) 2026-07-22 22:20:12 -07:00
zeekay 3cc933e1d9 feat(cal): render the native @hanzo/booker (Tamagui) — rip out the dead @calcom atoms
The Cal atoms never rendered (4 blank-page failures: dayjs, zustand, infinite-loop).
Replace with the native universal @hanzo/booker on hanzogui/@hanzo/gui, pointed at
/v1/calendar. react-native->react-native-web + GuiProvider is the whole recipe.
Booker at /{owner}/{slug}, CalendarEmbed live-demo in the hero. Render-verified
headless (full calendar renders; atoms bundle 1.7MB -> 410KB). No atoms, no patches.
2026-07-22 22:19:32 -07:00
zeekay c9566d7b25 fix(cal): resolve zustand use-sync-external-store shim so the Booker renders
The Booker crashed 'aue is not a function' because zustand/traditional imports the
named export useSyncExternalStoreWithSelector from use-sync-external-store's CJS
barrel, whose conditional dev/prod require defeats Rollup's named-export analysis
(namespace resolved to {}). Install use-sync-external-store + alias the shim to its
concrete production file so the named export is synthesized. Reverts the incomplete
@hanzo/cal-atoms fork (empty barrel/broken exports) back to the buildable @hanzo/cal
wrapper. Artifact-verified: dayjs .extend=16, empty-namespace crash pattern=0.
2026-07-22 19:26:11 -07:00
zeekay 6a5913d002 fix(ci): COPY patches/ into the Docker install layer (pnpm patchedDependencies) 2026-07-22 17:17:16 -07:00
zeekay c9c464e997 fix(cal): patch @calcom/atoms sideEffects so dayjs.extend(tz) survives + complete @hanzo/cal rename
The atoms declare sideEffects:false, so the bundler dropped their
'import ./vendor/dayjs' that runs dayjs.extend(utc,timezone) — dayjs.tz was
undefined and the Booker crashed at bootstrap (blank page). pnpm-patch the atoms
sideEffects to preserve those extends (verified: bundle extend-count 3→16).
Renames @hanzo/calendar → @hanzo/cal (owned/publishable pkg, tsup dist); root
build is topological (pkg then app); Dockerfile + app rewired.
2026-07-22 17:14:30 -07:00
zeekay cac2b03f2e fix(web): extend dayjs tz/utc singleton (atoms tree-shake drops it) + dedupe dayjs
Booker crashed with 'dayjs.tz is undefined' on tz.guess() because @calcom/atoms
declares sideEffects:false, so the bundler dropped its vendored dayjs.extend(tz).
Extend the shared singleton in @hanzo/calendar and dedupe dayjs to one instance.
2026-07-22 16:59:11 -07:00
zeekay 902b145b55 feat(web): Hanzo Calendar marketing landing + point API at api.hanzo.ai/v1/calendar 2026-07-22 16:51:38 -07:00
zeekay 178f2dbd1d ci: add platform-build dispatch (self-hosted runner image build) 2026-07-22 16:35:34 -07:00
zeekay cbfc9b71ce ci: build image for cal.hanzo.ai deploy 2026-07-22 16:10:17 -07:00
zeekay 06b77a783a build: self-contained multi-stage Dockerfile + native CI/CD
- Dockerfile builds the Vite bundle (pinned pnpm) in stage 1, serves it via
  hanzoai/spa in stage 2 — a fresh docker build no longer needs a pre-built
  app/dist (gitignored), so CI and local builds match.
- .dockerignore keeps the build context lean (deps/bundle rebuilt in-image).
- .github/workflows/cicd.yml builds+pushes ghcr.io/hanzoai/cal:sha-<short> on
  the self-hosted hanzo-build-linux-amd64 pool — zero GitHub-hosted minutes.
- deploy/mirror-to-forge.sh mirrors any repo to git.hanzo.ai/hanzo/<name>.
- deploy/base-native/cicd.yml: paired base image workflow (prepared, not applied).
2026-07-22 14:26:00 -07:00
zeekay 87aba71aaf feat: cal.hanzo.ai — Cal's Booker on native Hanzo Base
The public booking SPA: Cal.com's real <Booker> UI powered entirely by the
native Hanzo Base backend at /v1/calendar (no Cal Prisma/Postgres/Node API).

- packages/calendar: @hanzo/calendar, the debranded fork surface — a thin
  Hanzo-namespaced wrapper over published @calcom/atoms (MIT, see NOTICE) that
  re-exports Provider/Booker under Hanzo names for public, no-OAuth booking.
- app: Vite + React SPA. /{owner}/{slug} renders the Booker against Base;
  /booking/{uid} is the confirmation + cancel view.
- Dockerfile: FROM ghcr.io/hanzoai/spa, COPY app/dist /public.

Free-booking Stripe peers are stubbed so the bundle is self-contained/CSP-clean.
Only MIT @calcom code; Cal copyright preserved in NOTICE.
2026-07-22 13:45:14 -07:00