Skip to content

Activation funnel + brand: deploy, onboarding, docs, and the /view constellation theme - #41

Open
guirguispierre wants to merge 20 commits into
claude/memoryvault-production-hardening-x7rmlzfrom
claude/deploy-decision-page
Open

guirguispierre wants to merge 20 commits into
claude/memoryvault-production-hardening-x7rmlzfrom
claude/deploy-decision-page

Conversation

@guirguispierre

@guirguispierre guirguispierre commented Jun 15, 2026

Copy link
Copy Markdown
Owner

Stacked on top of #39 (base is its branch claude/memoryvault-production-hardening-x7rmlz, not master). Review/merge #39 first; this only adds the deploy funnel on top.

Deploy decision page + hosted waitlist

Every Deploy CTA on the landing pointed straight at the GitHub README, which is the biggest conversion leak. They now go to a /deploy page that presents two honest paths:

  • Hosted (featured, recommended, visually dominant): "Let us host it for you", $12/mo, ready-in-seconds. Its action is an email waitlist, since billing is not live yet: it POSTs to /api/waitlist, an unauthenticated write-only endpoint backed by a deduped waitlist D1 table, with an honest success state ("You're on the list. We'll email you when hosting opens.") and a no-JS native-form fallback.
  • Self-host (free, full-featured, never crippled): the Cloudflare one-click button plus an accurate CLI quickstart pulled from the README. "Nothing paywalled" stays true.

A short, non-disparaging comparison row sits below. "View on GitHub" still points at the repo. The page matches the dark constellation theme (calm static field), monospace only on the CLI block, no em-dashes.

The waitlist is write-only: there is no public read or GET. The isolation suite gains a case asserting it captures writes but exposes no read (now 21/21).

Honest scope / follow-up: this builds the funnel and captures intent. It does not take payment. Real "hosted by us" needs two things that do not exist yet, billing (Stripe) and per-customer tenant provisioning, which are the follow-up. The "Deploy to Cloudflare" button is wired correctly but true one-click still needs a deploy-ready wrangler.toml (no hardcoded resource IDs) and the user setting AUTH_SECRET; the schema auto-applies on first request.

Verified: npx tsc --noEmit clean, npm test 12/12 + 10/10, isolation 21/21.

First-run onboarding (added)

First-run /view now guides a new user to connect an agent instead of dropping them in an empty grid. When the brain has zero memories it shows a three-step panel: their MCP endpoint (origin + /mcp) with a copy button; real OAuth connection snippets (a verified claude mcp add --transport http command, plus the URL/transport/auth values and a config block for Codex, Cursor, and custom clients, no token to leak); and a "write a test memory" button that lands a genuine first memory through the authenticated MCP path. Once a memory exists the panel collapses to a dismissible hint. Client-side only, scoped to the brain, no auth/isolation changes. Stays in the viewer's own theme.

Docs (added)

Docs in the nav pointed at the bare /endpoints reference, not a guide. Adds /docs in the calm constellation theme with a sidebar over four sections: quickstart (real self-host steps + the hosted waitlist), connect your agent, an organized API reference, and a plain-language how-it-works (importance/confidence/recency, the active/settling/resting tiers, the relation graph, adversarially-tested isolation). The connect commands come from a shared connect-snippets module, so docs and the in-app onboarding panel are guaranteed identical. The full per-endpoint reference stays at /endpoints, linked from the sidebar. Landing "Docs" and "Read the docs" CTAs now point at /docs. No em-dashes in prose, monospace only for code; tsc clean, npm test green, isolation 21/21.

Constellation theme for /view (added)

/view gains a calm Constellation dark theme (no animation, no canvas) matching the public site: same deep-space palette, Spectral/Inter/JetBrains roles, blue accent. It is the new default dark base, paired with paper for day, so an unset brain gets constellation at night and paper by day; explicitly saved preferences are preserved. Registered across all the required spots (themes, client validThemes, the server VIEWER_THEME_NAMES, the bootstrap resolver, and the picker swatch). The theme picker, every existing theme, the mode toggle, and the custom builder are unchanged; /api/viewer-settings and isolation are untouched. tsc clean, npm test green, isolation 21/21.

Every Deploy CTA on the landing pointed straight at the GitHub README, which
is the biggest conversion leak. They now go to a /deploy page that presents
two honest paths: hosted (featured, recommended, visually dominant) and
self-host (free, full-featured, never crippled). Hosted's action is an email
waitlist, since billing is not live yet; it POSTs to /api/waitlist, an
unauthenticated write-only endpoint backed by a deduped waitlist D1 table,
with an honest success state and a no-JS native-form fallback. Self-host
keeps the Cloudflare one-click button plus an accurate CLI quickstart pulled
from the README. View on GitHub still points at the repo. Isolation suite
gains a case asserting the waitlist captures writes but exposes no read.
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jun 15, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
ai-memory-mcp 4b4ac16 Commit Preview URL

Branch Preview URL
Jun 16 2026, 05:40 PM

@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
ai-memory-mcp-dev 9d13cc3 Commit Preview URL

Branch Preview URL
Jun 15 2026, 09:40 PM

A brand-new brain landed in an empty grid with no guidance. When the brain
has zero memories the viewer now shows a guided panel: the brain's own MCP
endpoint with a copy button, real OAuth connection snippets (a verified
`claude mcp add --transport http` command plus the URL/transport/auth values
and a config block for Codex, Cursor, and custom clients), and a button that
writes a genuine first memory through the authenticated MCP path. Once a
memory exists the panel collapses to a dismissible hint and the normal viewer
shows. Client-side only, scoped to this brain; no auth or isolation changes.
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jun 15, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
✅ Deployment successful!
View logs
ai-memory-mcp-dev 4b4ac16 Jun 16 2026, 05:40 PM

@guirguispierre guirguispierre changed the title deploy: deploy decision page with a hosted waitlist Activation funnel: deploy decision page + first-run onboarding Jun 15, 2026
The onboarding panel built the connection command inline. Move the command,
labels, and JSON config into one connect-snippets module so the upcoming docs
connect guide and the in-app onboarding draw from a single source and can never
show different instructions. Onboarding output is unchanged.
Docs in the nav pointed at the bare /endpoints reference, not a guide. Adds
/docs in the calm constellation theme with a sidebar over four sections:
quickstart (the real self-host steps plus the hosted waitlist), connect your
agent (the shared snippets, identical to onboarding, plus the REST shape), an
organized API reference of the routes that exist, and a plain-language
how-it-works covering importance/confidence/recency, the active/settling/
resting tiers, the relation graph, and the adversarially tested isolation. The
full per-endpoint reference stays at /endpoints and is linked from the sidebar.
Landing Docs and Read the docs CTAs now point at /docs.
@guirguispierre guirguispierre changed the title Activation funnel: deploy decision page + first-run onboarding Activation funnel: deploy page, onboarding, and docs Jun 15, 2026
Brings /view in line with the public constellation site: a calm, static
Constellation dark theme (same deep-space palette, Spectral/Inter/JetBrains
roles, blue accent) registered across all the required spots (themes,
client validThemes, the server VIEWER_THEME_NAMES whitelist, the bootstrap
resolver, and the picker swatch). It is the new default dark base, paired
with paper for day, so an unset brain gets constellation at night and paper
by day; explicitly saved preferences are untouched. No animation or canvas
in the app, just one faint static body wash like every other theme. The
theme picker, every existing theme, the mode toggle, and the custom builder
are unchanged.
@guirguispierre guirguispierre changed the title Activation funnel: deploy page, onboarding, and docs Activation funnel + brand: deploy, onboarding, docs, and the /view constellation theme Jun 15, 2026
guirguispierre and others added 15 commits June 15, 2026 16:33
The update banner had top margin but a 0 bottom value, so the content below
crammed against it. Add a matching bottom margin in both the desktop rule
(styles-components) and the mobile override (styles-overlays). CSS only; logic,
z-index, and the header-clearance intent are unchanged.
Replace the two-row header and controls strip with the control-center top
bar: wordmark, a Memories/Graph segmented mode switch, a centered command
search with a clickable command-K affordance, and right-side action icons
(refresh, settings, shortcuts, lock) plus a New memory button. The type
filters move to a chip row above the list. Add a small New memory composer
that writes through the existing memory_save MCP path.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add a stat strip below the top bar with live counts pulled from real data:
total memories, active/settling/fading tiers in the tier colours, and total
links. Fold the 24h recall ribbon into the strip as a compact sparkline.
Add state-tier filter chips and a compact-density toggle to the filter row;
density persists through the existing viewer settings. Memory-state hues are
theme tokens (constellation sets the exact control-center palette) so they
adapt to every theme.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Render the list as an aligned table — state | key | memory | type | links |
seen — under a column header, strongest first. The state cell pairs a glowing
state-coloured dot with a small vertical strength meter; comfortable density
shows a one-line snippet, compact drops it for more rows. Single-click selects
a row (highlight, and drives the rail); double-click opens the existing detail
overlay, so the expand path is preserved.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add a right-column graph rail to the list home: a calm constellation of the
current brain's graph plus a card for the selected memory and its linked
memories, with an Expand affordance that opens the full graph view. The canvas
is deliberately conservative — DPR capped, the loop pauses when the tab is
hidden, when the rail is offscreen, or when the full graph is open, and
reduce-motion holds a static frame. Below 900px the rail collapses (reachable
via the Graph tab), the table drops the key and links columns, and the top bar
wraps so nothing overflows on a phone.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Constellation comfortable/compact/selected, settings overlay, login, and the
paper theme at 1280 and 390, produced by mockup/verify-view-home.mjs.
Colour each graph node by its memory state (active/settling/fading) in the
Constellation tier palette and size it by strength, in both the full graph and
the home rail, so the graph reads like the living system the list shows. State
is derived from the dynamic importance/confidence the graph endpoint already
returns; isolated nodes stay visible and only weak inferred edges are pruned.
Factor the detail overlay into openMemoryDetail(m) and make expandById resolve a
memory from the filtered list or, failing that, the graph payload, so clicking a
graph node (or a linked memory outside the current filter) reliably opens its
detail and selects it. Tolerate the graph node's missing timestamps in the
detail meta.
Keep the existing hover highlight and make it persist for the selected node:
clicking a node or selecting a list row now keeps that node and its neighbors
lit while the rest stay dimmed. In the home rail, clicking a node selects its
row (or opens it if outside the current filter), and selecting a row focuses
its node, so the rail and list stay in step.
Add graph_3d through the same brain-scoped viewer-settings path as the other
preferences: the server sanitizer whitelists it (default false) and the client
defaults/normalizer carry it, so a user's 3D choice persists per brain without
touching other users or bypassing sanitizeViewerSettings.
Add the 3D graph module that injects the 3d-force-graph UMD bundle from
cdn.jsdelivr.net only the first time 3D is enabled, so the default app loads no
3D dependency and needs no build step. On CDN failure it falls back to 2D with
a message. The WebGL renderer and loop are torn down on exit, paused when the
tab is hidden, the pixel ratio is capped, and reduce-motion disables auto-rotate.
Add a 3D toggle to the full-screen graph toolbar (never the rail), off by
default. When on, the same real nodes/edges render in 3D with the same state
colours and strength sizing, clickable to open a memory and rotatable/zoomable;
relation/inferred filters update the 3D data in place. Leaving the graph view
returns to 2D and tears down the renderer.
2D graph state colours, hover-neighbor highlight, a node clicked open, and the
opt-in 3D mode (on + node clicked) at 1280 and 390, from verify-view-home.mjs.
The action icons render with fill:none/stroke, but the old settings glyph was a
fill-style path, so it read as a lumpy outline. Swap it for the standard
stroke cog so it matches the refresh, shortcuts, and lock icons.
Drop the 1200px cap on the list+rail container so the feed and graph rail use
the available width on wide screens.
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