Stack
Jak je postavený tenhle web
Auditujeme cizí aplikace, takže by bylo divné, kdyby ta naše neobstála. Tady je, z čeho se skládá, a u každého tvrzení i způsob, jak si ho ověřit. Nic z toho není jen na slovo.
Lighthouse
- Výkon
- 100
- Přístupnost
- 100
- Osvědčené postupy
- 100
- SEO
- 100
- Agentic Browsing
- 3/3
Úvodní stránka bhpslabs.com/cs, měřeno v Lighthouse v prohlížeči Chrome .
V číslech
- 'unsafe-inline' v CSP
- 0
- unit testů
- 460+
- e2e testů v Playwrightu
- 230+
- JS úvodní stránky (brotli)
- ~180 kB
- CSS (gzip)
- 8 kB
- jazyky, každá stránka v obou
- 2
Základ
Web je jedna aplikace v TypeScriptu. Server i prohlížeč sdílejí tytéž typy, takže změna adresy nebo dat se projeví chybou v editoru, ne na produkci.
TanStack StartaTanStack Router: vykreslení na serveru, typované cesty a parametry. Proč jsme ho zvolili místo Next.js, píšeme na blogu.React 19,Vite 8aNitrojako server. Běží vNode 24v Dockeru pod neprivilegovaným uživatelem.Tailwind CSS 4a vlastní tokeny pro denní a noční režim. Komponenta se nevětví podle režimu, větví se token.Paraglidepro překlady: texty se kompilují do typovaných funkcí, takže překlep v klíči je chyba v editoru, ne prázdné místo na stránce.TypeScript 7,OxlintaOxfmt. Kontrola typů, lint i formát běží jedním příkazempnpm run cqa jsou součástí CI.
Výkon
Každá veřejná stránka se předvykresluje při sestavení. Jeden seznam adres slouží pro prerender i pro sitemapu, takže se nemůžou rozejít.
- JS a CSS jsou předkomprimované do gzipu i brotli a mají v názvu otisk obsahu, takže je prohlížeč drží v cache rok (
immutable). - HTML se vždy ověřuje (
must-revalidate): nový článek je vidět hned po nasazení. - Dvě variabilní písma místo sady řezů, obě přednačtená, aby text po načtení neposkakoval.
- Rastr v úvodu se kreslí do 2D canvasu a má vlastní e2e test na snímkový rozpočet. Ten běží sám, aby měřil vykreslování, ne zátěž od ostatních testů.
Bezpečnost
Content Security Policy se skládá pro každou HTML odpověď zvlášť. Do script-src se zapíšou SHA-256 otisky přesně těch inline skriptů, které v odpovědi jsou. Nonce by nešel, protože stránky jsou předvykreslené a nonce by v souboru zamrzl.
Strict-Transport-Securityspreload,Cross-Origin-Opener-Policy,X-Content-Type-Options,X-Frame-Options: DENYaReferrer-Policy.Permissions-Policyvypíná 14 rozhraní prohlížeče, která web nepotřebuje: kameru, mikrofon, polohu, platby, USB a další.- Vložit jde jen video z
youtube-nocookie.coma Vimea. Nic jiného se do stránky nedostane. - Návštěvnost měří Umami na vlastní doméně, bez cookies a bez lišty se souhlasem.
- CI umí vygenerovat SBOM ve formátu CycloneDX a ověřit ho proti požadavkům nařízení o kybernetické odolnosti (CRA).
Pro vyhledávače a AI asistenty
Web má čtenáře, kteří nejsou lidé. Vyhledávače i jazykové modely dostanou totéž co návštěvník, jen ve tvaru, který jim sedí.
- Každá stránka má canonical,
hreflangpro oba jazyky a jeden JSON-LD graf: firma, web, stránka, drobečková navigace, u článků autor. - Sitemapa uvádí datum změny jen tam, kde ho opravdu známe. Datum sestavení by byl falešný signál čerstvosti.
- Táž adresa vrátí markdown místo HTML, když si o něj klient řekne hlavičkou
Accept: text/markdown. Agent tak čte obsah bez lišty a skriptů. /llms.txtshrnuje firmu pro modely./.well-known/agent-skills/index.jsona/.well-known/ai-catalog.jsonpopisují, co agent na webu může udělat; hlavičkaLinkna ně odkazuje z každé stránky.- Přes WebMCP web nabízí agentům v prohlížeči nástroje: otevřít stránku, zjistit kontakt a odeslat poptávku. Popis nástroje agentovi říká, že ji smí poslat jen pro člověka, který o ni požádal a potvrdil její obsah.
robots.txtpovoluje AI crawlery a pravidlemContent-Signalříká, k čemu obsah smějí použít.
Blog
Články jsou markdown v repozitáři, vedle kódu. Při sestavení je zpracuje unified (remark a rehype) a kód obarví Shiki, takže v prohlížeči neběží žádný zvýrazňovač.
- Obrázek bez alternativního textu sestavení zastaví. Nedostupný obsah se nedá nasadit omylem.
- Odkaz na YouTube nebo Vimeo na samostatném řádku se sám změní ve vložené video v režimu bez cookies.
- Každý jazyk má RSS feed s celým textem článků a každý autor svůj vlastní.
Přístupnost
Přístupnost se testuje stejně jako všechno ostatní: automaticky.
- Playwright pouští
axenad stránkami v obou režimech a obou jazycích. - Barvy mají kontrastní povinnost. Oranžová jako text má vlastní ztmavený token, protože ta původní na světlém podkladu neprojde.
- Odkaz pro přeskočení navigace, hlášení změny stránky pro čtečky obrazovky, viditelný fokus a respekt k
prefers-reduced-motion.
Testy
Unit testy ve Vitestu a Testing Library hlídají logiku: CSP, vyjednávání jazyka, markdown pro agenty, feed, formuláře. E2e testy v Playwrightu procházejí web jako člověk: navigaci, klávesnici, motivy, SEO značky i přístupnost.
Pro zvědavé
Značka >_ v liště otevře terminál. Umí ls, cd, cat, whoami a pár dalších příkazů, kterými si přečtete obsah jiné stránky, aniž byste opustili tu svou. Je v něm i had a rm -rf taky něco udělá.
Ověřte si to sami
Nic z toho nemusíte brát na slovo. Stačí terminál:
npx lighthouse https://bhpslabs.com/cs --view
curl -s -D - -o /dev/null https://bhpslabs.com/cs | grep -i content-security-policy
curl -s -H "Accept: text/markdown" https://bhpslabs.com/cs/audit
curl -s https://bhpslabs.com/llms.txt
curl -s https://bhpslabs.com/.well-known/agent-skills/index.json
curl -s https://bhpslabs.com/cs/blog/feed.xml