Marketing site quality pass + multi-model visual audit tool#15
Merged
Conversation
Developers hero was a near-paste of overview's hero ("No infra, no SLA,
no on-call" landed verbatim on both, "Operators run instances. You earn
per execution" repeated twice within 50 lines on the same page, and the
H1 "Build decentralized services" said nothing the homepage hadn't).
Rewrite to lead with the builder economic — Blueprint ships once,
royalties land per operator-instance — without reusing overview's
operational-relief tagline.
Same pass on /overview "Monetize Blueprints" card body: "Instance-able
service templates. Earn while operators run them." was jargon-stew;
rewritten to name the mechanic ("Define the service spec. Every operator
running it pays you per call.").
Theme: .dev-partner-tile only declared a border, so 12 partner logos
disappeared into the vault-white background until you hovered. Add a
white tile bg so the grid reads at rest. Add defensive vault-cascade
rules for .op-card-title / .op-card-body in global.css so the operators
feature cards don't go white-on-white the day someone moves them into a
vault section.
scripts/visual-audit.mjs screenshots every public marketing page at desktop (1440x900) and mobile (390x844) full-page, then runs a four-model ensemble (Claude Opus 4.5, GPT-5, Gemini 2.5 Pro, GLM-4.5V) against a sharp design-director rubric. Findings are bucketed by (category, location) and ranked by how many models converged on the same issue — 3+ models = HIGH consensus (definitely fix), 2 = MODERATE (look at it), 1 = LOW (subjective, model-specific opinion). Per-page markdown plus top-level SUMMARY.md ranking pages by HIGH-consensus count and surfacing systemic issues that recur across the site. Smoke run on /operators + /developers with two models converged on real bugs the human review missed: stats-strip text fails AA contrast on the dark surface, and the hero H1 says "Run a Tangle node" while every other section says "operator" — terminology drift that confuses first-time readers. That's exactly the signal we wanted: ensemble surfaces things one reviewer wouldn't. Usage: pnpm audit:visual (full run, ~$2-5 in vision API calls), or pass --pages /foo,/bar --models claude,gpt for partial runs. Spawns astro dev on :4321 if not already up, kills it on exit. Outputs to audit-results/<timestamp>/ (gitignored). Side-fix: pnpm-lock churn surfaced a real bug — package.json declared @tangle-network/brand as file:../brand, but ../brand is the brand *monorepo* root (package name @tangle-network/design-system-monorepo). The actual brand subpackage lives at ../brand/packages/brand. Build was working only on a stale lockfile resolution; the first pnpm install ever to touch this would break tokens.css imports. Point the spec at the subpackage so resolution is deterministic.
User: "all these little banners of like metrics and things IMO are
stupid af". Killed the StatsStrip on every non-home page — every
instance was either a feature list disguised as a stat ("Rust SDK +
TypeScript bindings", "any Docker image · SSH access") or a number
that doesn't earn its place above the fold. The component itself
survives in src/components/ui/ in case someone wants to bring it back
with real numbers later. Removed from: /overview, /operators,
/developers, /stake, /services/sandbox, /services/browser-agent,
plus the unused import in /services/blueprint-agent.
/stake hero — three independent flags from the audit:
- eyebrow="COMING SOON" amber chip contradicted the page's own
"Operators run revenue-generating services" claim AND the working
"Open the dApp" link. Flipped to "SEASON 1 · LIVE".
- title "Tangle Staking" was a product label, not a value prop.
Now: "Stake to operators. Earn what they earn." — names the
parity mechanic.
- Primary CTA was "View Docs" on a conversion page. Swapped to
"Open the dApp" → ai.tangle.tools; "Read the docs" demoted to
secondary.
H1 rewrites across 5 pages — audit caught all of them being product
labels or category-generic where a mechanic-led headline belongs:
/operators "Run a Tangle node. Earn per execution."
→ "One binary. Every Blueprint. Paid per call."
/overview "One Blueprint. Many operator instances."
→ "Ship one Blueprint. Staked operators pay you per call."
/ecosystem "The networks Tangle plugs into."
→ "Build a Blueprint against any of these."
/services/blueprint-agent
"Blueprint Agent."
→ "Prompt to deployed Blueprint."
/services/sandbox "Sandboxes for AI agents."
→ "Containers that survive restarts."
BuildsOnLogos h2 "Production-grade scaffolding for every stack"
→ "Generated code against the stack you actually
ship with."
Plus a couple of operators-page tweaks: tightened the third "What
operators serve" card so the three cards have matching density, and
defined x402 inline ("x402 — HTTP-native payments") so the term
stops being undefined jargon for first-time readers. Replaced an
unexplained "MPP" abbreviation (probably a typo) with the explicit
x402 reference.
Build clean. /services/browser-agent.astro shows up in the diff only
because its StatsStrip + import were removed; the hero copy ("Your QA
team is an AI.") is staying — it's the only service-page H1 the audit
liked.
Drops the "x99p" hallucination from GPT-5 — grep confirms no instance
of "x99" exists in source. Source says x402 in all three call sites.
…andbox H1
User caught a real howler in the /overview hero: "Staked operators pay
you per call" inverts the actual economic flow. Per docs/pages/network/
incentives-overview.mdx, customers pay for Blueprint services in any
ERC-20 or native token, and the protocol splits each fee on chain —
default 20% developer / 40% operators / 20% stakers / 20% treasury.
Operators are *paid*, they don't pay.
Rewrites under the Ogilvy lens (headline carries 80% of the value;
promise a benefit; be specific; simple words; no clever-clever; tell
the truth, but make truth fascinating):
/overview hero
BEFORE "Ship one Blueprint. Staked operators pay you per call."
(wrong + jargon-stew "staked operators")
AFTER "Ship a Blueprint. Customers pay per call."
Subhead names the exact 20/40/20/20 split so the claim
is checkable, not vibey.
/services/sandbox hero
BEFORE "Containers that survive restarts."
(clever, abstract, overthinking)
AFTER "AI-native sandboxes."
Per user — simple is cleaner. The mechanic (0.6s cold
start, snapshot/restore) goes in the subhead where it
earns its place.
/stake hero
BEFORE "Stake to operators. Earn what they earn."
(true but ambiguous — staker earns from what operator
collects from customers; "they earn" reads circular)
AFTER "Back the operators. Take a cut of every fee."
Subhead names the exact 20% staker share. Lede names
the routing path (customer → operator → on-chain split).
/developers subtitle + lede
Sharpened the attribution: customers pay; you collect 20% on
chain. Was vague-positive ("you collect on every call") with no
named payer.
Ogilvy: "Tell the truth, but make truth fascinating." The truth here
is more interesting than the marketing-speak: every Blueprint call is
a real customer paying real money in their preferred asset, split on
chain by a smart contract. Lean into the mechanic, not abstractions.
Both harnesses were listed but rendering as plain letter-circle placeholders because logo and logoSrc were null. Pulled the official marks from each vendor: factory.svg — factory.ai/favicon.svg (508×508, black bg, geometric mark) forge.svg — forgecode.dev favicon (32×32, minimal mark) All 8 pre-installed harnesses now render with real brand identity.
…DX + AMD SEV-SNP + OCI + Marlin
User flagged the isolation/TEE section as incomplete. Old list had 4
providers (AWS, GCP, Azure, Phala) which under-represents the actual
hardware-enclave universe — and notably missed NVIDIA Confidential
Computing, which is the most relevant enclave for an AI-agent sandbox
page (H100/H200 with GPU-attested execution).
Added 5, ordered by relevance to the page's audience:
+ OCI Confidential VM — completes the major-cloud row
+ NVIDIA Confidential — GPU attestation, the AI-workload TEE
+ Intel TDX — hardware foundation under most cloud CVMs
+ AMD SEV-SNP — the other CPU-level confidential primitive
+ Marlin Oyster — decentralized TEE network (crypto-native,
text fallback like Phala — not in simple-icons)
Labels lengthened from terse codenames ("Azure CVM") to full product
names ("Azure Confidential VM") so the tooltip is checkable; the visible
logo row stays as marks only. flex-wrap on .sb-iso-tier-providers handles
the new row count without layout work.
…5 lines
Spot-check caught what build couldn't: my previous H1 rewrites looked
clean in the diff but blew out the two-column hero layout. Hero text
column is 512px wide when the right slot has a CodeWindow (which both
/operators and /developers use). At the H1's clamped 5.25rem (~84px)
bold display weight, lines like "Every Blueprint." and "Write the spec."
overflow into:
/operators: "One binary." (line 1)
"Every" (line 2)
"Blueprint." (line 3)
"Paid per call." (line 4 — gradient)
/developers: "Write the" (line 1)
"spec." (line 2)
"Earn from" (line 3)
"every" (line 4)
"instance." (line 5 — gradient)
Wider caps (B, E, W) ate the column the old "Run a Tangle node. / Earn
per execution." budget allowed for. Shortened to parallel 2-line
Ogilvy-rhythm headlines that fit the 512px column at 84px:
/operators: "One binary. / Earn per call."
/developers: "Write it once. / Earn forever."
Verified via screenshot at 1440×900: both now render as 2 lines, 176px
tall, with the gradient on the second clause (the promise of compound
returns). H1 box width measured at 498px — sits inside the column with
breathing room.
Saved a feedback memory: always spot-check renders before declaring
visual work done. Green build ≠ correct UI.
…h image CI on PR #15 hit two failures plus a real content issue the user spotted: 1. check:models — scripts/visual-audit.mjs hardcodes gpt-5 (and references it 4 times in comments + model config). OpenAI's live deprecation list now marks gpt-5 as deprecated. The audit script intentionally pins model identifiers for routing — same shape as scripts/check-models.mjs itself. Allowlist via .deprecated-models.allow.json files entry. 2. check:links — dead URL in the x402-operator-economics blog post: tnt-core/src/exposure/ExposureCalculator.sol returns 404. Per tnt-core's CHANGELOG ("Deleted unused src/exposure/ module"), the ExposureManager + ExposureCalculator libraries were removed; the equivalent live logic is in src/core/PaymentsEffectiveExposure.sol. Updated the source link with a sentence acknowledging the inline. 3. Hallucinated AI mockup image — user flagged that the workbench screenshot on /services/blueprint-agent has unreadable, AI-generated chat + code that doesn't render legibly at hero scale and contains nonsense CLI commands ("pn install", "pep create..."). Swapped to blueprint-agent-app.png — the real ai.tangle.tools landing UI with readable text ("Describe it. Ship it.", real input field, template icons). Updated 3 references (BaseLayout og-image, hero <a href>, hero <img src>). Side-fix: Forge harness link was 'antinomyhq/forge' which now 301s to 'tailcallhq/forgecode' (the repo was renamed/moved). Lychee accepted the redirect but quality bar says point at the current URL. .deprecated-models.cache.json regenerated (156 model ids, was 144) — that file is tracked in git per existing convention. Known follow-up: form.typeform.com/to/IE4hT9jW (used in 3 places — BuildsOnLogos integration form, /overview Start Building CTA, /sandbox Book intake call) now redirects to typeform.com/explore?...typeform- incorrectURL — the form is dead. Not blocking CI (redirect resolves to 200) but every "request integration" CTA on the site is broken. Flag for next session.
form.typeform.com/to/IE4hT9jW was redirecting to typeform.com/explore?...typeform-incorrectURL — the underlying form is deleted. Every "request integration / start building / book intake call" CTA on the site was bouncing visitors to a generic Typeform landing page. Replaced all 3 references with `mailto:` links to hello@tangle.tools (the existing pattern, already used for the "New harness request" CTA on the sandbox page), each with a contextual subject so the receiving inbox can tell which surface the click came from: BuildsOnLogos.astro → Integration request /overview Start Building → Start building on Tangle /sandbox Book intake call → Sandbox intake call mailto links don't need target=_blank (the OS picks the mail client) so removed it on the sandbox link to match BuildsOnLogos pattern.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
End-to-end quality pass on every marketing page, plus a new
pnpm audit:visualscript that screenshots every route and runs a vision-model ensemble against an Ogilvy-style design rubric. The audit caught real issues both models converged on; this PR fixes them.What changed
Content / copy
StatsStripon every non-home page (was filler — feature lists dressed as metrics). Component stays insrc/components/ui/if anyone wants to revive it with real numbers./stakehero: dropped "COMING SOON" badge (page links to live dApp), flipped primary CTA from "View Docs" to "Open the dApp", rewrote H1 from product label ("Tangle Staking") to mechanic ("Back the operators. Take a cut of every fee.")./overviewH1: was "Staked operators pay you per call" — operators don't pay, customers do. Per~/code/docs/pages/network/incentives-overview.mdx, the protocol splits each fee 20% developer / 40% operators / 20% stakers / 20% treasury. Rewrote to "Ship a Blueprint. Customers pay per call." with the exact split named in the subhead so the claim is checkable./operators,/developers,/ecosystem,/services/blueprint-agent,/services/sandbox, andBuildsOnLogos.astrounder the Ogilvy lens (promise a benefit, simple words, no clever-clever, tell the truth but make truth fascinating)./operatorsand/developersH1s wrapping to 4-5 lines in the two-column hero (512px text column squeezed by the CodeWindow slot). Shortened to parallel "X. Earn per call." / "X. Earn forever." structures that fit on 2 lines.Theme bugs
.dev-partner-tilehad a border but no background — 12 partner logos disappeared into the vault-white surface until hover. Added the missing tile background..op-card-title/.op-card-bodyso the operator feature cards don't go white-on-white the day someone moves them inside a vault section.Sandbox page completeness
logo: null, logoSrc: null). Pulled official marks:factory.svgfrom factory.ai favicon,forge.svgfrom forgecode.dev. All 8 cli-bridge backends now show real brand identity.Tooling
scripts/visual-audit.mjs(~600 lines): Playwright screenshots every public route at desktop + mobile, runs a 4-model ensemble (Claude Opus 4.5 / GPT-5 / Gemini 2.5 Pro / GLM-4.5V) against a structured design rubric, scores findings by inter-model agreement (3+ models = HIGH consensus, 2 = MODERATE, 1 = LOW/subjective), emits per-page markdown + a top-levelSUMMARY.mdranking pages by HIGH-consensus count. Output gitignored underaudit-results/<timestamp>/.pnpm audit:visualruns the full pass; flags for partial runs.@tangle-network/brandspec inpackage.jsonpointed atfile:../brand(the monorepo root, package name@tangle-network/design-system-monorepo). Build was working on a stale lockfile resolution; first cleanpnpm installwould break tokens.css imports. Spec now points at the actual subpackage at../brand/packages/brand.Test plan
pnpm buildclean after every commitba9e382for the wrap-bug that the spot-check caughtpnpm audit:visualsmoke run on 2 pages × 2 models verified the pipeline🤖 Generated with Claude Code