diff --git a/.agents/PAPERCUTS.md b/.agents/PAPERCUTS.md index 0359119..b429243 100644 --- a/.agents/PAPERCUTS.md +++ b/.agents/PAPERCUTS.md @@ -10,6 +10,7 @@ data, or sensitive paths. ## Open +- [ ] `2026-07-19T04:06:52Z` — `codex` — `pnpm --dir web build` fails with `vite: command not found` when `web/node_modules` is absent, despite the root toolchain being installed. Document or enforce the package-local install required before validating the `web/` subpackage. - [ ] `2026-07-19T02:55:56Z` — `claude` — Adding a docs folder under `web/content/docs` whose `meta.json` lists an `[Overview](...)` link renders a duplicated, double-highlighted sidebar entry, because the folder-index strip in `web/src/lib/source.ts` (`transformPageTree.folder`) is a per-folder-name allowlist. Derive it from the meta convention (or strip the index for all folders) so new sections don't need a hidden source.ts edit. - [ ] `2026-07-14T01:28:30Z` — `claude` — Regenerating the lockfile (adding or moving a dep) makes `pnpm install` re-run the `minimumReleaseAge` gate on transitive peers already pinned at that exact version (`mysql2`, `sql-escaper`, `@aws-sdk/credential-providers`), failing the install even though nothing about them changed. `pnpm install --config.minimumReleaseAge=0` — then confirm the lockfile diff stays version-neutral — unblocks it; worth documenting that regen step so the gate doesn't re-block already-pinned versions. - [ ] `2026-07-10T21:28:46Z` — `codex` — `pnpm --dir badseo run typecheck` works through the root toolchain but `pnpm --dir badseo run build` can't find Vite because `badseo/node_modules` is absent. Document or enforce the package-local install before validating the `badseo/` subpackage. diff --git a/web/public/product-hunt.svg b/web/public/product-hunt.svg new file mode 100644 index 0000000..c2858ba --- /dev/null +++ b/web/public/product-hunt.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/web/src/components/landing-page.css b/web/src/components/landing-page.css index ccefad4..e1082cb 100644 --- a/web/src/components/landing-page.css +++ b/web/src/components/landing-page.css @@ -97,22 +97,6 @@ margin: 0; text-wrap: balance; } -/* Desktop keeps the headline on two lines via a forced break; mobile wraps - naturally (the break is removed below the tablet breakpoint). */ -.itc-h1-br { - display: inline; -} -@media (max-width: 767px) { - .itc-h1-br { - display: none; - } -} -@media (min-width: 768px) { - /* Let the forced
own the break; don't let balance re-split into 3 lines. */ - .itc-display-xl { - text-wrap: wrap; - } -} .itc-display-lg { font-size: clamp(32px, 4.4vw, 52px); font-weight: 500; @@ -318,34 +302,12 @@ color: var(--ink); transition: color 0.18s ease; } -.itc-hero-title-accent { - color: inherit; - -webkit-box-decoration-break: clone; - box-decoration-break: clone; -} .itc-hero-subtitle { transition: background-color 0.18s ease, border-color 0.18s ease, color 0.18s ease; } -.itc-hero-subtitle-counter, -.itc-hero-subtitle-win { - -webkit-box-decoration-break: clone; - box-decoration-break: clone; - font-style: italic; - transition: - background-color 0.18s ease, - color 0.18s ease, - text-decoration-color 0.18s ease; -} -.itc-hero-subtitle-counter { - color: #7a746d; -} -.itc-hero-subtitle-win { - color: var(--orange); - font-weight: 500; -} @media (max-width: 767px) { .itc-hero { min-height: calc(100svh - 120px); diff --git a/web/src/components/landing-page.tsx b/web/src/components/landing-page.tsx index 2efff27..d767483 100644 --- a/web/src/components/landing-page.tsx +++ b/web/src/components/landing-page.tsx @@ -196,24 +196,15 @@ function Hero() { className="itc-display-xl itc-hero-title" style={{ maxWidth: 1180, margin: "0 auto" }} > - Say goodbye to{" "} - bloated,{" "} -
- overpriced SEO tools. + The modern, open source SEO platform.

- Speed up strategy decisions with quality SEO data for every workflow, - all in one place.{" "} - - Don't put SEO on autopilot - - ,{" "} - - work with your AI agent to actually win. - + Without quality data, AI gives generic advice. OpenSEO is built for + you and your AI agent to work together on SEO strategy + content + tailored to your business.

@@ -237,7 +228,7 @@ function Testimonial() { className="itc-display-md itc-testimonials-title" style={{ margin: "0 auto 32px" }} > - Trusted by customers all over the world + Trusted by hundreds of customers worldwide
{TESTIMONIALS.map((t) => ( diff --git a/web/src/routes/_marketing.tsx b/web/src/routes/_marketing.tsx index f03b296..035bbc9 100644 --- a/web/src/routes/_marketing.tsx +++ b/web/src/routes/_marketing.tsx @@ -10,6 +10,8 @@ import { SiteFooter } from "@/components/site-footer"; import { featureGroups } from "@/lib/feature-pages"; const GITHUB_REPO = "every-app/open-seo"; +const PRODUCT_HUNT_URL = + "https://www.producthunt.com/products/openseo?launch=openseo"; // Used if GitHub is unreachable at build time so the header never renders empty. const FALLBACK_STAR_COUNT = "2.1k"; @@ -157,6 +159,23 @@ function MarketingLayout() { return (
+ {isHome ? ( + + + + + OpenSEO just launched on Product Hunt. + + Upvote & comment + + + ) : null}