diff --git a/.docs/design-partner-operating-ledger.md b/.docs/design-partner-operating-ledger.md index b98cd8c..ac5fd06 100644 --- a/.docs/design-partner-operating-ledger.md +++ b/.docs/design-partner-operating-ledger.md @@ -1,6 +1,6 @@ # Design-Partner Operating Ledger -Track aggregates only. Keep names, emails, company details, and conversation notes in a private approved system—not Git. +Track aggregates only. Keep names, emails, company details, and conversation notes in a private approved system, not Git. ## Qualified Prospect @@ -18,7 +18,7 @@ A qualified prospect is part of a small software team that actively maintains an | Week | Landing visitors | CTA clicks | Qualified replies | Conversations | Design partners | $29 willingness-to-pay | Dominant objection | Decision | | ---- | ---------------: | ---------: | ----------------: | ------------: | --------------: | ---------------------: | ------------------ | -------------- | -| — | 0 | 0 | 0 | 0 | 0 | 0 | — | Start outreach | +| TBD | 0 | 0 | 0 | 0 | 0 | 0 | None | Start outreach | ## Conversation Prompts diff --git a/.docs/session-handoff-2026-07-18.md b/.docs/session-handoff-2026-07-18.md index 251cd52..0747ebb 100644 --- a/.docs/session-handoff-2026-07-18.md +++ b/.docs/session-handoff-2026-07-18.md @@ -1,10 +1,10 @@ -# Session Handoff — 2026-07-18 +# Session Handoff: 2026-07-18 ## Restart Context The active repository is `D:\PROJECTS\OMAZYAI\OPENAPISTUDIO\openapi-studio-tanstack`, not the legacy `openapi-studio` workspace. Repository: `github.com/bymilon/openapi-studio-tanstack` (public). -The product is a fresh OpenAPI Studio rebuild for small API teams. Architecture is a feature-based, flattened vertical-slice modular monolith—not a monorepo. The delivery stack is TanStack Start with Solid, Bun, Vite, Tailwind CSS, Hono where an HTTP boundary benefits from it, Valibot, Drizzle, Turso/libSQL, and Cloudflare Workers. Oxlint and Oxfmt are the quality tools. +The product is a fresh OpenAPI Studio rebuild for small API teams. Architecture is a feature-based, flattened vertical-slice modular monolith, not a monorepo. The delivery stack is TanStack Start with Solid, Bun, Vite, Tailwind CSS, Hono where an HTTP boundary benefits from it, Valibot, Drizzle, Turso/libSQL, and Cloudflare Workers. Oxlint and Oxfmt are the quality tools. Read `AGENTS.md`, `specs/mission.md`, `specs/tech-stack.md`, and `specs/roadmap.md` before acting. Follow spec-driven development and keep `.tasks/` as the execution source of truth. Avoid speculative abstractions and feature-parity work. diff --git a/.docs/stack-audit-9.8-plan.md b/.docs/stack-audit-9.8-plan.md index d2b7532..ef6b452 100644 --- a/.docs/stack-audit-9.8-plan.md +++ b/.docs/stack-audit-9.8-plan.md @@ -127,4 +127,4 @@ TSK-1 may begin only when all are true: - TG-001 has an owner and exact validation commands. - No cloud resource, secret, production database, deployment, push, or merge is implicitly authorized. -Meeting this gate raises the design to approximately **9.0/10**. The remaining score must be earned through clean-install, CI, Worker preview, migration, security, rollback, and production evidence—not documentation. +Meeting this gate raises the design to approximately **9.0/10**. The remaining score must be earned through clean-install, CI, Worker preview, migration, security, rollback, and production evidence, not documentation. diff --git a/.tasks/2026-07-18-TSK-1-delivery-foundation-TASKS.md b/.tasks/2026-07-18-TSK-1-delivery-foundation-TASKS.md index 0b14517..2da78bd 100644 --- a/.tasks/2026-07-18-TSK-1-delivery-foundation-TASKS.md +++ b/.tasks/2026-07-18-TSK-1-delivery-foundation-TASKS.md @@ -1,4 +1,4 @@ -# TSK-1 — Delivery Foundation Tasks +# TSK-1: Delivery Foundation Tasks | Field | Value | | ------------ | --------------------------------------------------------- | @@ -11,7 +11,7 @@ Only this file owns execution status, assignment, dependencies, and evidence for TSK-1. -## TG-001 — Runtime Skeleton +## TG-001: Runtime Skeleton - **Owner:** Main agent - **Dependencies:** Complete @@ -22,7 +22,7 @@ Only this file owns execution status, assignment, dependencies, and evidence for - **Validation command:** `bun run check`; then time-bounded `bun run preview`, `GET /health`, dependency inspection, and bundle inspection. - **Evidence:** `bun install --frozen-lockfile`, `bun run check`, and `git diff --check` pass on Bun 1.3.14. The production build prerenders `/` and emits the Worker entry. Built preview smoke checks return `GET /health` 200 with `{"status":"ok"}`, `HEAD /health` 200, `POST /health` 405, and `/` 200. Independent review findings were resolved; no deployment occurred. -## TG-002 — Database Baseline +## TG-002: Database Baseline - **Owner:** Main agent - **Dependencies:** TG-001 @@ -33,7 +33,7 @@ Only this file owns execution status, assignment, dependencies, and evidence for - **Validation command:** `bun run db:check`, `bun run db:smoke`, and `bun run check`. - **Evidence:** Drizzle ORM 0.45.2, Drizzle Kit 0.31.10, and `@libsql/client` 0.17.4 are pinned. `db:check` validates the generated migration graph. `db:smoke` applies the committed migration twice to in-memory libSQL, then completes a typed insert/query. TanStack's `server-only` guard protects the credential-bearing factory. On 2026-07-18, `db:integration` applied the migration twice and completed the same query against disposable Turso database `oas-tsk1-val-6bfd6949` through `@libsql/client/web`; the one-day token remained in process memory and the database was destroyed immediately afterward. -## TG-003 — Automated Quality Gates +## TG-003: Automated Quality Gates - **Owner:** Main agent - **Dependencies:** TG-001, TG-002 @@ -44,7 +44,7 @@ Only this file owns execution status, assignment, dependencies, and evidence for - **Validation command:** `bun run check`; then observe the required GitHub pull-request run and a temporary deliberately failing validation commit. - **Evidence:** Local `bun ci` and `bun run check` pass. The workflow uses SHA-pinned official actions, Bun 1.3.14, Ubuntu 24.04, read-only repository permissions, concurrency cancellation, a ten-minute timeout, no secrets, and no deployment job. PR #1 run `29637211097` passed; deliberate failing commit `51d1be9` was rejected by run `29637241493`; revert commit `072bdb2` restored green run `29637270052`. Independent review found no workflow security blocker. -## TG-004 — Preview and Observability +## TG-004: Preview and Observability - **Owner:** Main agent - **Dependencies:** TG-001, TG-003 @@ -65,4 +65,4 @@ TSK-1 completed its approved implementation and preview-validation scope on 2026 - **Risk:** Medium for local scaffold; high for credentials, data, and deployment. - **Routing:** Main agent writes; independent agents research, review, and validate. Models remain unpinned and are routed by task risk. - **Retry limit:** Stop and re-triage after two materially similar failed approaches. -- **Metrics:** Record accepted outcome, checks, review findings, retries, interventions, and deployment health—not lines of code or token volume. +- **Metrics:** Record accepted outcome, checks, review findings, retries, interventions, and deployment health, not lines of code or token volume. diff --git a/.tasks/2026-07-18-TSK-2-demand-conversion-TASKS.md b/.tasks/2026-07-18-TSK-2-demand-conversion-TASKS.md index f31dcf8..7ee8d6b 100644 --- a/.tasks/2026-07-18-TSK-2-demand-conversion-TASKS.md +++ b/.tasks/2026-07-18-TSK-2-demand-conversion-TASKS.md @@ -1,4 +1,4 @@ -# TSK-2 — Demand and Conversion Tasks +# TSK-2: Demand and Conversion Tasks | Field | Value | | ------------ | --------------------------------------------------------- | @@ -11,7 +11,7 @@ Only this file owns execution status, assignment, dependencies, and evidence for TSK-2. -## TG-001 — Positioning and Offer +## TG-001: Positioning and Offer - **Owner:** Product owner - **Dependencies:** TSK-1, approved TSK-2 specification @@ -22,7 +22,7 @@ Only this file owns execution status, assignment, dependencies, and evidence for - **Validation command:** Product content review against the approved specification. - **Evidence:** Product owner approved the positioning, revised $29/workspace/month hypothesis, `pitechae@gmail.com` contact flow, qualification prompts, Tailwind, and first-party Cloudflare event logging on 2026-07-18. -## TG-002 — Marketing Page +## TG-002: Marketing Page - **Owner:** Main agent - **Dependencies:** TG-001 @@ -33,7 +33,7 @@ Only this file owns execution status, assignment, dependencies, and evidence for - **Validation command:** `bun run check` plus responsive, keyboard, and JavaScript-disabled browser review. - **Evidence:** The prerendered page implements the approved buyer, problem, pilot offer, $29 hypothesis, RFC-safe qualified mailto flow, and truthful pilot terms. Tailwind 4.3.3 is the only UI system. Desktop and 390px screenshots were reviewed; Chromium passes axe, keyboard order, JavaScript-disabled, CTA, metadata, and horizontal-overflow checks. GitHub confirms the linked repository is public. -## TG-003 — Measurement and Operating Ledger +## TG-003: Measurement and Operating Ledger - **Dependencies:** TG-001, approved analytics decision - **Owner:** Main agent @@ -44,7 +44,7 @@ Only this file owns execution status, assignment, dependencies, and evidence for - **Validation command:** Event payload inspection and operating-ledger review. - **Evidence:** Strict Valibot events allow only page view, design-partner click, and repository click. The endpoint requires same-origin browser metadata, rejects unsupported content types and extra fields, and streams at most 64 bytes. Tests cover valid, schema-invalid, cross-origin, oversized, and unsupported requests. Analytics failure cannot block CTA behavior. `.docs/design-partner-operating-ledger.md` stores aggregates only. -## TG-004 — Preview Acceptance +## TG-004: Preview Acceptance - **Owner:** Main agent - **Dependencies:** TG-002, TG-003 diff --git a/.tasks/2026-07-18-TSK-3-landing-redesign-TASKS.md b/.tasks/2026-07-18-TSK-3-landing-redesign-TASKS.md index 6358f84..15ee470 100644 --- a/.tasks/2026-07-18-TSK-3-landing-redesign-TASKS.md +++ b/.tasks/2026-07-18-TSK-3-landing-redesign-TASKS.md @@ -1,15 +1,15 @@ -# TSK-3 — Landing Redesign +# TSK-3: Landing Redesign **Overall status:** DONE -## TG-001 — Product and Design Context +## TG-001: Product and Design Context - **Owner:** Main agent - **Status:** DONE - **Acceptance:** `PRODUCT.md`, `DESIGN.md`, official benchmark, and critique define a truthful non-generic direction. - **Evidence:** Official Apple, Google, GitHub, Stripe, Cloudflare, and Linear surfaces were reviewed for hierarchy, proof, CTA, trust, and responsive patterns without copying trade dress. Impeccable v3.9.1 context, brand register, palette, and independent critique informed `PRODUCT.md` and `DESIGN.md`. Live mode is configured for the TanStack root document; no CSP was detected. -## TG-002 — Product-Led Landing Surface +## TG-002: Product-Led Landing Surface - **Owner:** Main agent - **Dependencies:** TG-001 @@ -17,7 +17,7 @@ - **Acceptance:** Responsive page implements REQ-001 through REQ-007 without new UI dependencies. - **Evidence:** The product owner rejected the true-white/cobalt pass as generic. The replacement uses a distinctive redline identity, a custom contract-path mark, locally hosted Martian Grotesk, an immediate breaking-change painkiller, and a clearly labelled review prototype. Desktop and 390px mobile full-page screenshots have been inspected. No UI dependency was added. -## TG-003 — Release Validation +## TG-003: Release Validation - **Owner:** Main agent - **Dependencies:** TG-002 diff --git a/.tasks/2026-07-18-TSK-4-public-repository-trust-TASKS.md b/.tasks/2026-07-18-TSK-4-public-repository-trust-TASKS.md index 065a276..26b2548 100644 --- a/.tasks/2026-07-18-TSK-4-public-repository-trust-TASKS.md +++ b/.tasks/2026-07-18-TSK-4-public-repository-trust-TASKS.md @@ -1,22 +1,22 @@ -# TSK-4 — Public Repository Trust +# TSK-4: Public Repository Trust **Overall status:** DONE -## TG-001 — Public narrative and boundaries +## TG-001: Public narrative and boundaries - **Owner:** Main agent - **Status:** DONE - **Acceptance:** README and root guidance explain the problem, evidence, limitations, contribution, security, and source terms. - **Evidence:** Product-first README, real website screenshot, explicit available/unavailable table, `CONTRIBUTING.md`, `SECURITY.md`, and source-available `LICENSE` are present. -## TG-002 — GitHub presentation +## TG-002: GitHub presentation - **Owner:** Main agent - **Status:** DONE - **Acceptance:** Description, homepage, topics, and landing-page repository language are accurate. - **Evidence:** GitHub description, preview homepage, ten relevant topics, private vulnerability reporting, and protected `main` are configured. Landing copy now says design-partner research, price hypothesis, proposed workflow, and public build. -## TG-003 — Validation +## TG-003: Validation - **Owner:** Main agent - **Status:** DONE diff --git a/.tasks/2026-07-18-TSK-5-social-brand-asset-TASKS.md b/.tasks/2026-07-18-TSK-5-social-brand-asset-TASKS.md index 9764dcd..48a7b95 100644 --- a/.tasks/2026-07-18-TSK-5-social-brand-asset-TASKS.md +++ b/.tasks/2026-07-18-TSK-5-social-brand-asset-TASKS.md @@ -1,22 +1,22 @@ -# TSK-5 — Social Brand Asset +# TSK-5: Social Brand Asset **Overall status:** DONE -## TG-001 — Brand composition +## TG-001: Brand composition - **Owner:** Main agent - **Status:** DONE - **Acceptance:** Dedicated 1200×630 master and PNG communicate the brand and truthful product status. - **Evidence:** Deterministic SVG master uses the real mark, Martian Grotesk, redline system, concise positioning, explicit demand-validation status, and illustrative contract concept. Final RGB PNG is exactly 1200×630 and visually inspected. -## TG-002 — Distribution metadata +## TG-002: Distribution metadata - **Owner:** Main agent - **Status:** DONE - **Acceptance:** README, Open Graph, Twitter, canonical, and tests reference the asset correctly. - **Evidence:** README hero references the PNG; route metadata includes absolute Open Graph image, type, dimensions, alt text, canonical URL, and Twitter large-card metadata. -## TG-003 — Validation +## TG-003: Validation - **Owner:** Main agent - **Status:** DONE diff --git a/AGENTS.md b/AGENTS.md index b7f7fa1..edb2886 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -25,7 +25,11 @@ Stop and request a product decision when requirements conflict, scope expands, s - Use Valibot at external trust boundaries and `drizzle-orm/valibot` only for persistence validation; public contracts must not be generated from database schemas. - Keep server-only code, bindings, credentials, and database access outside client bundles. - Prefer platform features and existing dependencies. Add abstractions only for a current approved requirement. -- Test public behavior, authorization, failure paths, and data boundaries—not implementation details. +- Test public behavior, authorization, failure paths, and data boundaries, not implementation details. + +### Content punctuation + +- Never use em dashes (`—`) in user-facing content or metadata. Use periods, commas, colons, or parentheses instead. - Never commit secrets or local environment files. ## Architecture and Ownership diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3f85884..db5b417 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,7 +6,7 @@ OpenAPI Studio is an evidence-gated founding build. Discuss substantial product 1. Read `AGENTS.md`, `PRODUCT.md`, `DESIGN.md`, and `specs/roadmap.md`. 2. Keep changes inside one small vertical slice. -3. Preserve truthful product boundaries—do not imply unfinished capabilities exist. +3. Preserve truthful product boundaries. Do not imply unfinished capabilities exist. 4. Do not include real API contracts, customer information, credentials, or generated secrets. 5. Run `bun run check`. diff --git a/DESIGN.md b/DESIGN.md index dde4e15..07f363e 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -49,7 +49,7 @@ Stay structurally flat: square controls, hard rules, no ornamental radius, gradi - The desktop hero uses a literal `7:5` copy-to-artifact grid and collapses to one column at `64rem`. - The 1440×900 and 2048×1000 folds must include the primary CTA, price condition, and complete review artifact without scrolling. - Header plus hero may not exceed the initial viewport height at supported desktop sizes. -- Consequential copy—prototype status, pricing terms, privacy guidance, and artifact captions—never renders below `0.75rem`. +- Consequential copy, including prototype status, pricing terms, privacy guidance, and artifact captions, never renders below `0.75rem`. - Full-page screenshots validate rhythm; viewport-only screenshots validate conversion. Both are required. ## Components diff --git a/PRODUCT.md b/PRODUCT.md index d1260ea..5588bfe 100644 --- a/PRODUCT.md +++ b/PRODUCT.md @@ -41,7 +41,7 @@ Do not resemble generic AI-generated SaaS, anonymous white/cobalt enterprise min 1. Evidence before persuasion: every claim sits beside a truthful artifact, boundary, or verifiable delivery fact. 2. One decision per fold: establish fit, show the workflow, resolve trust, then present the offer. 3. Enterprise restraint, startup honesty: use disciplined hierarchy and finish without pretending to have customers, scale, or capabilities that do not exist. -4. The contract is the visual subject: OpenAPI structure, changes, validation, and publishing provide the imagery—not generic decoration. +4. The contract is the visual subject: OpenAPI structure, changes, validation, and publishing provide the imagery, not generic decoration. 5. Conversion without pressure: make the five-team pilot, response expectation, and $29 post-pilot price explicit. ## Accessibility & Inclusion diff --git a/README.md b/README.md index dc790e1..22a6659 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ Review consequential OpenAPI contract changes before they reach users. [](https://github.com/bymilon/openapi-studio-tanstack/actions/workflows/quality.yml) - + -_Brand preview with an illustrative product concept—not product UI._ +_Brand preview with an illustrative product concept, not product UI._ [View the live preview](https://openapi-studio-tanstack-preview.pibin.workers.dev) · [Join design-partner research](mailto:pitechae@gmail.com?subject=OpenAPI%20Studio%20design-partner%20research) · [Read the product roadmap](specs/roadmap.md) diff --git a/specs/features/2026-07-18-delivery-foundation/spec.md b/specs/features/2026-07-18-delivery-foundation/spec.md index 62a3c5b..834613f 100644 --- a/specs/features/2026-07-18-delivery-foundation/spec.md +++ b/specs/features/2026-07-18-delivery-foundation/spec.md @@ -1,12 +1,12 @@ # Delivery Foundation -| Field | Value | -| --------------- | ----------------------------- | -| Feature ID | TSK-1 | -| Roadmap outcome | Phase 0 — Delivery Foundation | -| Status | SPEC_APPROVED | -| Owner | Product owner | -| Updated | 2026-07-18 | +| Field | Value | +| --------------- | ---------------------------- | +| Feature ID | TSK-1 | +| Roadmap outcome | Phase 0: Delivery Foundation | +| Status | SPEC_APPROVED | +| Owner | Product owner | +| Updated | 2026-07-18 | ## Problem and Outcome diff --git a/specs/features/2026-07-18-demand-conversion/spec.md b/specs/features/2026-07-18-demand-conversion/spec.md index c5bb7f7..456c217 100644 --- a/specs/features/2026-07-18-demand-conversion/spec.md +++ b/specs/features/2026-07-18-demand-conversion/spec.md @@ -1,12 +1,12 @@ # Demand and Conversion -| Field | Value | -| --------------- | ------------------------------- | -| Feature ID | TSK-2 | -| Roadmap outcome | Phase 1 — Demand and Conversion | -| Status | SPEC_APPROVED | -| Owner | Product owner | -| Updated | 2026-07-18 | +| Field | Value | +| --------------- | ------------------------------ | +| Feature ID | TSK-2 | +| Roadmap outcome | Phase 1: Demand and Conversion | +| Status | SPEC_APPROVED | +| Owner | Product owner | +| Updated | 2026-07-18 | ## Problem and Outcome diff --git a/specs/features/2026-07-18-landing-redesign/spec.md b/specs/features/2026-07-18-landing-redesign/spec.md index 9564ebf..3cc24d9 100644 --- a/specs/features/2026-07-18-landing-redesign/spec.md +++ b/specs/features/2026-07-18-landing-redesign/spec.md @@ -1,12 +1,12 @@ # Landing Redesign -| Field | Value | -| --------------- | ------------------------------- | -| Feature ID | TSK-3 | -| Roadmap outcome | Phase 1 — Demand and Conversion | -| Status | SPEC_APPROVED | -| Owner | Product owner | -| Updated | 2026-07-18 | +| Field | Value | +| --------------- | ------------------------------ | +| Feature ID | TSK-3 | +| Roadmap outcome | Phase 1: Demand and Conversion | +| Status | SPEC_APPROVED | +| Owner | Product owner | +| Updated | 2026-07-18 | ## Problem and Outcome diff --git a/specs/mission.md b/specs/mission.md index bd29cb2..96eb9c9 100644 --- a/specs/mission.md +++ b/specs/mission.md @@ -6,7 +6,7 @@ OpenAPI Studio helps small API teams turn an OpenAPI document into a dependable ## Commercial Goal -Reach the first **$1,000 MRR** through a narrow, reliable paid product before pursuing broad legacy parity. Optimize for activation, repeated use, conversion, and retention—not feature count. +Reach the first **$1,000 MRR** through a narrow, reliable paid product before pursuing broad legacy parity. Optimize for activation, repeated use, conversion, and retention, not feature count. ## Primary Customer diff --git a/specs/roadmap.md b/specs/roadmap.md index 3c2e9de..84c4b7d 100644 --- a/specs/roadmap.md +++ b/specs/roadmap.md @@ -2,42 +2,42 @@ This roadmap orders outcomes, not deadlines. Start a phase only when its predecessor meets the approved feature specification and validation contract. Each phase must ship as one or more small, usable vertical slices. -## Phase 0 — Delivery Foundation +## Phase 0: Delivery Foundation Establish repository governance, SDD task tracking, CI, preview deployment, observability, and a Turso migration smoke test. Prove the application can build and run on Cloudflare before product work. -## Phase 1 — Demand and Conversion +## Phase 1: Demand and Conversion Ship prerendered marketing, clear positioning and pricing, conversion analytics, and a waitlist or contact path. Capture evidence before expanding the product surface. -## Phase 2 — Identity and Tenancy +## Phase 2: Identity and Tenancy Add secure authentication, sessions, workspaces, invitations, and centralized role-based authorization with audit events. -## Phase 3 — OpenAPI Core +## Phase 3: OpenAPI Core Import JSON/YAML, validate OpenAPI 3.0/3.1, store a canonical document, and support reliable reopen and revision history. -## Phase 4 — Edit and Publish +## Phase 4: Edit and Publish Deliver the smallest useful editor, conflict-safe saving, revision review, and published documentation derived from the canonical contract. -## Phase 5 — Paid Plan +## Phase 5: Paid Plan Add Scale checkout, verified and idempotent billing webhooks, server-enforced entitlements, and a customer billing portal. Validate activation-to-paid conversion and retention. -## Phase 6 — Workflow Integrations +## Phase 6: Workflow Integrations Add GitHub installation, pull, and conflict-safe commits. Then add safe endpoint execution with SSRF defenses, limits, redaction, and retention controls. -## Phase 7 — Agent Access +## Phase 7: Agent Access Provide scoped MCP tokens with immediate revocation and a minimal set of read, update, and run tools. Treat tool authorization as the same policy boundary as the web application. -## Phase 8 — Migration and Cutover +## Phase 8: Migration and Cutover Build an audited, retry-safe, one-shot legacy importer; rehearse migration; reconcile counts and hashes; then perform a reversible cutover without dual writes. -## Phase 9 — Evidence-Gated Parity +## Phase 9: Evidence-Gated Parity Consider remaining legacy capabilities only when customer interviews, usage, revenue, or retention establish a concrete need. Every addition requires its own approved feature specification. diff --git a/src/features/marketing/marketing-home.tsx b/src/features/marketing/marketing-home.tsx index 30e5c8c..2b640aa 100644 --- a/src/features/marketing/marketing-home.tsx +++ b/src/features/marketing/marketing-home.tsx @@ -75,8 +75,8 @@ export function MarketingHome() {
- Interviews are free. A product pilot and $29/workspace/month price are hypotheses—not - available yet. + Interviews are free. A product pilot and $29/workspace/month price are hypotheses. + They are not available yet.
@@ -119,7 +119,7 @@ export function MarketingHome() { Needs a decisionThe problem
The painkiller is a reviewable decision—not another text editor.
+The painkiller is a reviewable decision, not another text editor.
Current build status
-OpenAPI Studio is in demand validation, not a working editor. Today’s repository contains this website, delivery checks, preview infrastructure, and identifier-free conversion measurement. OpenAPI 3.0/3.1 import, validation, diff review, and - publishing are roadmap work—not implemented yet. No invented customers. No fake - screenshots. No checkout. + publishing are roadmap work. They are not implemented yet. No invented customers. No + fake screenshots. No checkout.
recordConversion('repository_clicked')}> Follow the public build ↗ @@ -213,8 +213,8 @@ export function MarketingHome() {Built and run by{' '} Milon Biswas, independent founder. Email only - the problem and workflow first—no contract upload or confidential material. Personal - reply within two business days. + the problem and workflow first. Do not upload a contract or confidential material. + Personal reply within two business days.
({ meta: [ - { title: 'OpenAPI Studio — Dependable OpenAPI workflows' }, + { title: 'OpenAPI Studio: Dependable OpenAPI workflows' }, { name: 'description', content: @@ -14,7 +14,7 @@ export const Route = createFileRoute('/')({ }, { property: 'og:type', content: 'website' }, { property: 'og:site_name', content: 'OpenAPI Studio' }, - { property: 'og:title', content: 'OpenAPI Studio — Contract changes, made reviewable' }, + { property: 'og:title', content: 'OpenAPI Studio: Contract changes, made reviewable' }, { property: 'og:description', content: @@ -34,10 +34,10 @@ export const Route = createFileRoute('/')({ { property: 'og:image:height', content: '630' }, { property: 'og:image:alt', - content: 'OpenAPI Studio — Contract changes, made reviewable', + content: 'OpenAPI Studio: Contract changes, made reviewable', }, { name: 'twitter:card', content: 'summary_large_image' }, - { name: 'twitter:title', content: 'OpenAPI Studio — Contract changes, made reviewable' }, + { name: 'twitter:title', content: 'OpenAPI Studio: Contract changes, made reviewable' }, { name: 'twitter:description', content: diff --git a/tests/browser/marketing.test.ts b/tests/browser/marketing.test.ts index bd815d7..890643e 100644 --- a/tests/browser/marketing.test.ts +++ b/tests/browser/marketing.test.ts @@ -10,7 +10,7 @@ test('presents a truthful design-partner conversion path', async ({ page }) => { await page.goto('/') await pageView - await expect(page).toHaveTitle('OpenAPI Studio — Dependable OpenAPI workflows') + await expect(page).toHaveTitle('OpenAPI Studio: Dependable OpenAPI workflows') await expect(page.locator('meta[property="og:image"]')).toHaveAttribute( 'content', 'https://openapi-studio-tanstack-preview.pibin.workers.dev/og/openapi-studio-og.png', @@ -42,9 +42,17 @@ test('presents a truthful design-partner conversion path', async ({ page }) => { 'Would we pay $29/workspace/month if this worked? Why or why not?', ) await expect(page.getByText('not a working editor')).toBeVisible() - await expect(page.getByText('roadmap work—not implemented yet')).toBeVisible() - await expect(page.getByText('Illustrative prototype—not a screenshot')).toBeVisible() - await expect(page.getByText('no contract upload or confidential material')).toBeVisible() + await expect(page.getByText('roadmap work. They are not implemented yet')).toBeVisible() + await expect(page.getByText('Illustrative prototype. This is not a screenshot')).toBeVisible() + await expect(page.getByText('Do not upload a contract or confidential material')).toBeVisible() + const renderedContent = await page + .locator('body, title, meta[content]') + .evaluateAll((elements) => + elements + .map((element) => element.getAttribute('content') ?? element.textContent ?? '') + .join('\n'), + ) + expect(renderedContent).not.toContain('—') await expect(page.getByRole('link', { name: 'Follow the public build' })).toHaveAttribute( 'href', 'https://github.com/bymilon/openapi-studio-tanstack',