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.
app/routes:/(landing),/trust,/compliance,/privacy,/imprint, plussitemap.tsandrobots.ts./trustis 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./complianceis static and sourced fromlib/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.tsxis the global, always-visible navbar; the footer renders from the layout on every page.lib/content.tsholds 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 (updatewhitepaper.fileSizeinlib/content.tsif 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.
npm run assetsregeneratespublic/og.pngand the favicon set from the brand SVGs (scripts/generate-assets.mjs).npm run compliance:pdfregenerates the compliance one-pager fromlib/compliance-content.json(also runs automatically onprebuild).node scripts/normalize-logos.mjsnormalizes 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 intopublic/clients-partners/and it will match the set.
nvm use # Node 22
npm install
npm run dev # http://localhost:3000There 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:3000Then 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.
-
Commit and push:
git add -A git commit -m "describe the change" git push -
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
-
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.
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);
/trustpublishes its scores as a Dataset with per-release DataDownload links. /sitemap.xml: all five routes with build-timelastModified./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:
- Verify the domain in Google Search Console
(DNS TXT record is the cleanest, no code change needed) and submit
https://cogeto.eu/sitemap.xml. - Verify in Bing Webmaster Tools (it can import from Search Console) and submit the same sitemap. Bing feeds ChatGPT search and other assistants.
- Optional: request indexing of
https://cogeto.euin Search Console for a faster first crawl.
The app lives at /srv/cogeto-web/app and runs as the cogeto user.
- Node 22 via nvm; clone the repo to
/srv/cogeto-web/app,npm ci && npm run buildascogeto. - pm2:
pm2 start ecosystem.config.js(cluster mode, 1 instance, port 3000), thenpm2 save && pm2 startupso it survives reboots. - nginx: server block for
cogeto.euproxying tohttp://127.0.0.1:3000(proxy_passwithHostandX-Forwarded-*headers). - 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.
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