Mobile-first (390px up, enhance to desktop):
- Sidebar → off-canvas drawer behind a hamburger (overlay + tap-close + safe-area);
static 256px sidebar only at md+. Mobile top bar carries hamburger + workspace + Connect.
- Kanban → horizontal scroll-snap columns (~86vw, peek next) on mobile; 4-col grid at xl.
- Leaderboard / All-Contributors tables wrapped in overflow-x scroll regions (min-w),
body never scrolls sideways. Tab row is horizontally scrollable.
- Task-detail + suggestion modals are full-bleed / bottom-sheet on mobile, centered cards at sm+.
- Overview stacks main + right rail on mobile; all view paddings responsive.
- index.css: overflow-x hidden, env(safe-area-inset-*), clamp() fluid type, thin scroll-x utility.
Design tokens: consolidated every surface hex to the Dework palette as CSS vars
(--bg #0e0e10 / --rail #141416 / --surface #17171b / --border #232328 / --hover #1e1e24),
set per-brand --brand accent at runtime. Deleted the now-unused theme.ts (dead code).
Leaderboards: Task Points = global Karma (formatAmount(karma)) with a transparent
tasks×100 proxy until Karma is canonical on-chain; dropped the separate Karma column.
Contract naming: ABI imports stay indirected via abi.ts (one-line swap for the
finished non-versioned Bounty/Escrow/Reputation/Karma set); scrubbed V1/V2 from
comments + README; README now documents the full platform.
Every view still renders from the fixture with no wallet/chain (screenshot-able).
Verified live at work.zoo.network (real Zoo data) + local at 390px and 1440px.
package: 0.2.0 -> 0.3.0
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
One repo, one Dockerfile. Brand-varying values (chain, addresses, owner
label, header/title, CSP RPC host) move into src/brands.ts, selected at
build time by VITE_BRAND (default zoo). The zoo profile reproduces the
prior hardcoded values exactly, so work.zoo.network is unchanged.
Adds the pars profile (chain 494949, BountyV1 0x316B..cf1F) plus CI and
k8s to stand up work.pars.network:
- docker.yml: a brand matrix builds zoo :sha-<sha> and pars :pars-<sha>
from the same Dockerfile on the luxfi ARC pool.
- k8s/pars/: Deployment + Service (ns pars) + Traefik route fragment.
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
This cluster's hanzoai/ingress (Traefik v3) routes every public zoo host through
the zoo-dynamic ConfigMap (@file provider) with TLS auto-issued by its built-in
ACME resolver over Cloudflare DNS-01 — exactly how api.zoo.network is served.
Kubernetes Ingress objects don't produce the :443 router here (the api-zoo-network
Ingress is vestigial too), so replace k8s/ingress.yaml with k8s/route.yaml, the
router+service fragment merged into zoo-system/zoo-dynamic. One ACME client
(Traefik), no cert-manager. Verified: https://work.zoo.network serves 200 with a
valid LE cert (CN=work.zoo.network).
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
On-chain bounty kanban (Vite+React+viem static SPA) that reads the live
BountyV1/EscrowV1/ReputationV1 work-market on Zoo (chain 200200) directly
over the CORS-enabled JSON-RPC. Split out of luxfi/dao into its own repo so
CI builds a clean image.
- .github/workflows/docker.yml: canonical hanzoai/.github reusable build,
bakes VITE_RPC_URL=https://api.zoo.network/v1/bc/C/rpc, pushes
ghcr.io/luxfi/work-board:sha-<commit> on self-hosted arcd runners.
- k8s/: Deployment (2 replicas) + Service (80->3000) + Ingress
(hanzoai/ingress class, host work.zoo.network, letsencrypt-prod).
Co-authored-by: Hanzo Dev <dev@hanzo.ai>