Skip to content

feat: embedded project page — /project/{id} + public project view - #8

Merged
lgalabru merged 2 commits into
mainfrom
feat/project-page
Aug 1, 2026
Merged

feat: embedded project page — /project/{id} + public project view#8
lgalabru merged 2 commits into
mainfrom
feat/project-page

Conversation

@lgalabru

@lgalabru lgalabru commented Aug 1, 2026

Copy link
Copy Markdown
Member

Implements ludovic's e2e ask: after acceptance, the buyer gets {public_url}/project/{id} — an exciting, shareable page served by scarced itself. Stacked on #6.

What

  • Embedded web app (web/ — vanilla HTML/CSS/JS, ~7 KB + logo, compiled in via include_dir, the same mechanism as pay's web-ui but with no node toolchain): dark stage, scarce bolt logo, pulsing live badge, "Agents are actively working on this project", milestone scope cards, and Buzz onboarding CTAs (community web link derived from the relay URL, Buzz Desktop download).
  • GET /api/v1/projects/{id} (schema: project) — the public view the page renders. Deliberately commercial-free: price, per-milestone amounts, payout splits, budget, gate policy and buyer npub cannot appear (no field can carry them; a serialization test enforces it). Quote status re-derived fail-closed against now.
  • project_url in the accept response; the 🚀 contract post and the ops workroom post carry it too. New config key public_url (e.g. https://scarce.sh; unset = bind address for dev).
  • workroom_name moved to studio-core::project so the mirror and the page can never disagree about a channel name.

Verified

  • just ci — 147 tests (7 new: state ladder incl. expiry re-derivation, no-leak serialization, accept URL, page/assets serving, config validation)
  • Live e2e on wss://scarce.communities.buzz.xyz: capture → quote → accept returned project_url; workroom proj-realtime-webhook-replay-debugger-67cd9e36 (channel 4015fe12) created with the URL in its contract post; page serves 200 html/css/js/png, project JSON walks QUOTED → FUNDED → WORKROOM_ACTIVE.

🤖 Generated with Claude Code

@lgalabru
lgalabru changed the base branch from feat/registry-skills to main August 1, 2026 21:21
…rce web app

Acceptance now returns project_url ({public_url}/project/{rfq_id}); the
workroom contract post and ops post carry it. The page is a super-light
web app embedded in the binary (checked-in vanilla HTML/CSS/JS under
web/, include_dir — same mechanism as pay's web-ui, no node toolchain):
scarce logo, live state badge, milestone scope, and Buzz onboarding
links (community web derived from the relay URL, desktop download).
GET /api/v1/projects/{id} serves the view (schema: project) —
deliberately commercial-free: no price, splits, budget, policy or npub
survives serialization (tested). workroom_name moved to studio-core so
mirror and page can never disagree. New config key public_url.
The relay ships a complete onboarding flow at /invite/<code> (Buzz
Desktop deep link, platform-aware download, in-browser claim), so the
page now links a minted invite instead of a bare product URL.
BuzzPort grows mint_invite (NIP-98 signed POST /api/invites, x-auth-tag
for managed identities); scarced keeps a live invite minted (72h ttl,
re-mint daily, hourly retry). Fail-open: without owner/admin role the
mint 403s, the log says why, and the page falls back to the community
link. Buzz Desktop button now points at the canonical releases page.
@lgalabru
lgalabru force-pushed the feat/project-page branch from e1f5821 to 4f8886e Compare August 1, 2026 21:22
@lgalabru
lgalabru merged commit 212b5e1 into main Aug 1, 2026
1 check passed
@lgalabru
lgalabru deleted the feat/project-page branch August 1, 2026 21:23
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