Skip to content

Cogeto/cogeto-web

Repository files navigation

cogeto.eu: marketing website

Public marketing site for Cogeto: verifiable AI memory you can inspect, correct, and provably delete. Runs EU-hosted, self-hosted, or in a fully offline bubble, with any model, hosted or local. In production since v1.0.

Next.js 15 (App Router) · TypeScript · Tailwind CSS 4 · Framer Motion · Node 22.

Structure

  • app/ routes: / (landing), /trust, /compliance, /privacy, /imprint, plus sitemap.ts and robots.ts.
    • /trust is the only non-static route: ISR (revalidate = 3600) fetches the published trust scores server-side from the public product repo; the visitor's browser never talks to GitHub. A failed refresh throws so ISR keeps serving the last good page.
    • /compliance is static and sourced from lib/compliance-content.json; the one-pager PDF is regenerated from the same JSON on every build (prebuild), so page and PDF cannot drift.
  • components/sections/ holds the landing page, one component per section (hero, what-is, pillars, how-it-works, run-today, whitepaper, team, clients-partners, contact). components/SiteHeader.tsx is the global, always-visible navbar; the footer renders from the layout on every page.
  • lib/content.ts holds all copy; edit text without touching markup. Style rule: no em or en dashes in visible copy.
  • public/brand/ holds brand assets copied verbatim from the product repo (assets/brand). Never modify, restyle, or recreate them (see its README).
  • public/documents/ holds the whitepaper PDF (update whitepaper.fileSize in lib/content.ts if it is replaced) and the generated compliance one-pager (never edit by hand; it is rebuilt from the JSON).
  • public/people/ holds the team photos and logos for the "Who is behind Cogeto" section. If a file is missing, the card falls back to a branded initials monogram; drop the image in and rebuild.
  • public/clients-partners/ holds the client and partner logos.
  • fonts/ holds self-hosted Poppins (latin, 400 to 700); no external font CDN.

Scripts

  • npm run assets regenerates public/og.png and the favicon set from the brand SVGs (scripts/generate-assets.mjs).
  • npm run compliance:pdf regenerates the compliance one-pager from lib/compliance-content.json (also runs automatically on prebuild).
  • node scripts/normalize-logos.mjs normalizes the client and partner logos: it trims transparent padding, scales every mark to a common geometric-mean size (so square emblems and wide wordmarks read equally large), and centers each on a uniform 480x240 transparent canvas. Source logos arrive in arbitrary sizes and paddings; run this once after dropping a new PNG into public/clients-partners/ and it will match the set.

Local development

nvm use          # Node 22
npm install
npm run dev      # http://localhost:3000

Test before shipping

There is no test suite; the checks that matter are the production build and a quick look at the real thing:

npm run build    # must pass; also regenerates the compliance PDF
npm start        # serves the production build on http://localhost:3000

Then eyeball in the browser:

  • Preloader plays (~1.5s) and reveals the hero; hero logo keeps looping.
  • Header is visible on every page; anchors land without hiding headings.
  • Scroll the whole page: status demo cycles, flow diagram pulses, logo wall colorizes on hover.
  • Whitepaper and compliance PDFs download; mailto and copy buttons work.
  • Mobile viewport (~375px): hamburger menu works with keyboard only (Tab, Escape); all five pages show header and footer.
  • Reduced motion (emulate in devtools): preloader skipped, all animations static.
  • No em or en dashes in served HTML: curl -s localhost:3000 | grep -c $'\u2014\\|\u2013' must print 0 (repeat per page; the escapes expand to the two dash characters).

Lighthouse baseline: accessibility 100 on every page; performance 94+ on /, 97+ on /trust and /compliance. Do not regress.

Stop the local server before you forget it is running (Ctrl+C).

Only /trust renders server-side data (fetched from the product repo at build and revalidation time). There are no analytics, no cookies, and zero external requests from the visitor's browser.

Ship an update (the routine)

  1. Commit and push:

    git add -A
    git commit -m "describe the change"
    git push
  2. Deploy on the server:

    ssh <server>
    cd /srv/cogeto-web/app
    sudo -u cogeto git pull
    sudo -u cogeto npm ci
    sudo -u cogeto npm run build
    sudo -u cogeto pm2 reload all
  3. Verify: open https://cogeto.eu, hard-refresh (Cmd+Shift+R), click around.

The pm2 reload step is not optional: a rebuilt .next under a running server serves dead asset hashes (unstyled pages) until the process reloads.

SEO & discoverability

Everything is prebuilt into the site:

  • Metadata: canonical URLs per page, OpenGraph and Twitter cards with a branded og.png (1200x630), theme color, full robots directives.
  • Structured data: schema.org JSON-LD on the homepage (Organization, WebSite, WebPage, SoftwareSourceCode for the public AGPLv3 repo, and the whitepaper as a DigitalDocument); /trust publishes its scores as a Dataset with per-release DataDownload links.
  • /sitemap.xml: all five routes with build-time lastModified.
  • /robots.txt: everything allowed, with AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended and others) listed explicitly so chatbots can read and cite the site.
  • /llms.txt: a plain-language summary of Cogeto for LLM crawlers, with key facts and links to the trust and compliance pages, both PDFs, GitHub, and contact.
  • Semantics: one h1, labeled sections, skip link, alt texts, AA contrast, reduced-motion support.

After each deploy of a content change, the sitemap picks up a new lastModified automatically. To appear in Google and Bing, do this once:

  1. Verify the domain in Google Search Console (DNS TXT record is the cleanest, no code change needed) and submit https://cogeto.eu/sitemap.xml.
  2. Verify in Bing Webmaster Tools (it can import from Search Console) and submit the same sitemap. Bing feeds ChatGPT search and other assistants.
  3. Optional: request indexing of https://cogeto.eu in Search Console for a faster first crawl.

First-time server setup (Ubuntu runbook summary)

The app lives at /srv/cogeto-web/app and runs as the cogeto user.

  1. Node 22 via nvm; clone the repo to /srv/cogeto-web/app, npm ci && npm run build as cogeto.
  2. pm2: pm2 start ecosystem.config.js (cluster mode, 1 instance, port 3000), then pm2 save && pm2 startup so it survives reboots.
  3. nginx: server block for cogeto.eu proxying to http://127.0.0.1:3000 (proxy_pass with Host and X-Forwarded-* headers).
  4. TLS: certbot --nginx -d cogeto.eu -d www.cogeto.eu (auto-renewal via the certbot systemd timer).

For updates after that, see "Ship an update" above.

License

Site code is MIT licensed (see LICENSE). The Cogeto name and logo under public/brand are trademarks and excluded, as is the whitepaper PDF. The product itself is AGPLv3 with a commercial licensing option. Product source: https://github.com/Cogeto/cogeto

Releases

Packages

Contributors

Languages