Skip to content

Ny webbdesign, enklare innehållshantering och uppdaterade säkerhetsberoenden - #54

Merged
lizell merged 33 commits into
mainfrom
NewLayout
Oct 2, 2026
Merged

lizell merged 33 commits into
mainfrom
NewLayout

Conversation

@matsygfors

Copy link
Copy Markdown
Member

Beskrivning:
Inför en ny design och uppdaterat innehåll för Athegas webbplats. Samtidigt förenklas strukturen så att texter, personal och återkommande komponenter blir lättare att underhålla manuellt och med LLM.
Webbplatsen fortsätter vara helt statisk med Eleventy, Liquid, Markdown och Sass, och publiceras via den befintliga GitHub Pages-processen. Inga nya paket, backendtjänster eller installationssteg tillkommer.
Ändringar

  • Ny design för startsida, navigation, sidfot, blogg, medarbetarsidor och övriga innehållssidor.
  • Uppdaterade texter samt nya sidor för systemutveckling och teknikgranskning.
  • Befintliga Markdown-filer och medarbetarnas sidadresser bevaras.
  • Startsidan delas upp i sektionsfiler. Texter och tjänstekort flyttas till en separat innehållsfil.
  • Gemensamma komponenter införs för tjänstekort och kontaktsektioner.
  • Huvudmenyn hämtar innehåll från samma källa på dator och mobil.
  • Medarbetarlistan genereras automatiskt från personalfilerna. Medarbetarmallen hanterar profilens HTML.
  • CSS delas upp i moduler och den gamla startsidesanimationen kopplas bort från sidladdningen.
  • Datumsemantik och rubriknivåer förbättras. E-postlänkar visar mottagaradressen.
  • 404-texten förtydligas.
  • README och instruktionerna bakom AGENTS.md uppdateras med innehållsmodeller, komponenter och arbetsgång.
  • Låsfilen uppdateras till js-yaml 3.15.2/4.3.2 och liquidjs 10.29.0 för att åtgärda rapporterade sårbarheter.
    Verifiering under arbetet
  • Beroendena har installerats med npm ci och webbplatsen har byggts med npm run build.
  • Vid den senaste strukturändringen jämfördes samtliga 193 genererade HTML-sidor före och efter: identiskt innehåll och struktur bortsett från blanksteg, samt identisk CSS.
  • Medarbetarnas profillänkar och synliga mottagaradresser i e-postlänkar har kontrollerats.
    Kvarvarande uppföljningar
    För att bevara den nya designen har syntaxfärgning, årsnavigering/sidindelning, vissa dubbla artikelingresser och äldre bild-/iframeformat lämnats för separat hantering. Äldre oanvända komponenter finns delvis kvar och kan städas efter kontroll av referenser.

@peterhellberg

peterhellberg commented Sep 18, 2026 •

Copy link
Copy Markdown
Member

Varför har Claude fått för sig att stoppa in en massa onödig (oformaterad) HTML i Markdownfilerna måntro?

@matsygfors

matsygfors commented Sep 18, 2026 via email

Copy link
Copy Markdown
Member Author

@matsygfors

matsygfors commented Sep 18, 2026 •

Copy link
Copy Markdown
Member Author

Jag kollar på det , pushar ändringar nu till branchen

@peterhellberg

Copy link
Copy Markdown
Member

Heh, nu har den helt hoppat i galen tunna och stoppat in hela innehållet i frontmatter 🤦🏻

https://github.com/athega/athega.github.io/blob/5c4c79d99c8e7a6aecd723f9185e45f8c522c142/systemutveckling/index.md

@matsygfors

Copy link
Copy Markdown
Member Author

Ja enligt modellen är detta en pattern som är bra för LLM:er, så vill man köra AI-first kanske det inte har nån betydelse:

"Det kan vara en bra arkitektur om målet är att sidan ska vara strikt komponentbaserad och allt innehåll ska följa samma struktur. Det är exempelvis ganska praktiskt för Codex/AI eftersom den kan ändra:

yaml
hero.heading
process.items
contact.links

utan att behöva förstå HTML-strukturen.
Nackdelen är att redaktören inte längre bara kan skriva vanlig Markdown. Varje nytt innehåll måste passa in i datamodellen som utvecklaren har definierat."

Men jag ändrar så vi fortfarande kan ändra MD-lättare utan kunna datamodellen.

@matsygfors

Copy link
Copy Markdown
Member Author

Ok Chrille har ni några fler specifika invändningar?

@peterhellberg

Copy link
Copy Markdown
Member

Bloggsidan (/blogg) saknar p.eyebrow så rubriken ligger inte på samma höjd som de andra sidan. Respektive bloggartikels ↗ ligger fel alignad (borde ligga i höjd med rubriken)

Claude hittar dessa grejer:

Sidan står sig bra: tydlig typografisk hierarki, konsekvent orange accent, luftig grid och en bra rytm mellan vitt → svart → ljusgrått → footer. Fem saker som drar ner den:

  1. Riktig bugg — bloggkortets rubrik klipps mellan 981 och 1219 px. .home-latest-card har grid-template-columns: 42% 1fr (home.scss:29). 1fr får min-width:auto, och långa svenska sammansättningar ("organisationsscheman") spränger spåret — overflow:hidden kapar texten mitt i ordet. Mätt överskott: 40 px vid 981, 32 px vid 1024, 0 från 1220. Fix: 42% minmax(0,1fr) plus overflow-wrap: break-word (gärna hyphens: auto med lang="sv") på h2.

  2. Fokuskorten är för höga för sitt innehåll vid 900–1100 px. min-height: 310px (home.scss:22) plus pilen låst i botten ger halvtomma kort när griden gått till 2×2 — ungefär 40 % tomrum. Sänk min-höjden i max-width: 980px-blocket, eller låt pilen följa texten i stället för align-self: end.

  3. Kontrast: --orange #ff6600 på vitt ger 2.9:1. Axe flaggar 5 noder (alla .eyebrow/.focus-label samt det orange spannet i h1). Eyebrows är 13 px och behöver 4.5:1. En mörkare ton för text (runt #d45200 ger ~4.5:1) medan #ff6600 behålls för logotyp, ytor och ikoner löser det utan att ändra uttrycket.

  4. Rubriknivåer hoppar. Startsidan går h1 → h3 (tjänstekorten) → h2 (bloggkorten). Bloggkorten borde vara h3 och tjänstekorten h2, annars läser skärmläsare strukturen baklänges.

  5. Småsaker. Etikettkolumnen i callouten är så smal att "ERFARENHET PÅ RIKTIGT" bryts på två rader medan "JOBBA MED OSS" inte gör det — en obalans som syns direkt. I mobil (≤640) döljs .card-arrow helt, så korten tappar sin enda affordans att de är länkar.

@matsygfors

Copy link
Copy Markdown
Member Author

Ok fixat allt utom kontrasten på organge-texterna men jag har satt den till exakt samma färg som loggan. Dock är loggans färg lite för blek för att fungera på små texter. Men det tycker jag fungerar ändå. Det såg konstigt ut med mörkare orange på texterna jmf med loggan. I så fall får vi mörka ner loggan lite så den kontrasten ökar

@peterhellberg

Copy link
Copy Markdown
Member

Kontakta oss knappen känns lite klumpig, och den radbryter inte helt snyggt i menyn

Screenshot 2026-09-24 at 10 48 27

@peterhellberg

peterhellberg commented Sep 24, 2026 •

Copy link
Copy Markdown
Member

Padding mellan olika delar är "all over the place", med mycket omotiverade blankutrymmen.
(Skulle må bra av en enhetlig vertikal rytm)

Screenshot 2026-09-24 at 10 50 17

@peterhellberg

peterhellberg commented Sep 24, 2026 •

Copy link
Copy Markdown
Member

Fontstorlekarna i bloggen behöver ses över så att de får en logisk hierarki. Förslagsvis bör en ratio plockas ifrån exempelvis https://typescale.com/

Screenshot 2026-09-24 at 12 42 50

Att jämföra med hur det ser ut idag:

Screenshot 2026-09-24 at 12 45 04

matsygfors and others added 5 commits September 24, 2026 15:17
…ent checks

Layout and CSS
- Blog: archive, year archive and article pages now use the same section
  spacing system (section-page / --section-flow-gap) as the other pages, and the
  blog article text is 18 px with the site's line height instead of 16 px.
- Introduce shared tokens in base.scss (spacing scale, grid gap, card padding,
  radii, --line-strong, --on-dark-muted) and use them instead of loose pixel
  values. Cards, grids and radii that should match now do.
- One circular arrow component (.card-arrow, .card-arrow-sm) and one shared
  card-title rule replace several near-identical copies.
- Sections with their own background (soft, join, callout, dark, facts) and the
  sections next to them get the full section gap; padding overrides that never
  took effect (about-history, work-intro, ...) and unused rules (.year-nav,
  .archive-year, .archive-item-with-image, .card-number) are removed.
- Smaller page and section headings (--text-page, --text-section).
- Restore syntax highlighting for code blocks (styles/prism.scss); the new CSS
  had dropped the Prism theme.
- Logo is an SVG again (orange variant of the original) instead of a PNG.

SEO and accessibility
- canonical, og:type/site_name/locale, twitter:card and a default og:image
  (_data/site.json); sitemap.xml, robots.txt and an Atom feed at /blogg/feed.xml.
- Skip link, main landmark ids, scroll-margin for the sticky header and
  prefers-reduced-motion.
- Alt text added to the 14 images that lacked it; one h1 per page; links to
  pages that never existed in old posts are now plain text.

Build and content checks
- scripts/image-attributes.mjs adds width/height and lazy loading to images at
  build time.
- scripts/check-site.mjs (npm run check, also run in CI) fails on broken
  internal links or images, missing alt text and pages without exactly one h1.
- scripts/post-defaults.mjs: a blog post can be a single Markdown file. The
  first "# heading" becomes the title and the first paragraph the excerpt;
  front matter still wins. README describes the new, shorter recipe.

Not touched: the old SCSS/JS/templates from the previous design stay in the
repo until we decide what to reuse. Text content is unchanged by this commit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Match the AI & maskininlärning page: the steps section is now a full grey band
instead of a white section with grey cards.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The last sections of Teknikgranskning, Systemutveckling and AI & maskininlärning
now look and space the same way.

- Teknikgranskning: "Vad vi granskar" uses the numbered, grey steps section
  like the other two pages instead of the bordered grid. Six steps are laid out
  as two rows of three on wide screens.
- Systemutveckling: the steps section is a full grey band, matching the AI page.
- The number above each card is separated from its heading by --heading-gap,
  the same distance as an orange label and its heading elsewhere on the site.
- Tighter spacing around the cards: --content-gap (24 px, 16 px on mobile)
  between a section heading and its cards, --grid-gap (12 px) between cards,
  and no leftover bottom margin on the last paragraph in a card.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Set the body font stack to "Helvetica Neue", "Segoe UI", Roboto, Helvetica,
Arial. Mac keeps Helvetica Neue, Windows gets Segoe UI and Android gets Roboto,
all of which have a light weight, instead of everything but Apple devices
falling back to Arial in regular weight.

The site loads no font files at all: it uses fonts already installed on the
visitor's device. The previous site fetched Inter from Google Fonts on every
page view. That is not recommended, since every visitor sends a request to a
third party (a privacy concern) and it costs an extra request per page, and it
also conflicts with our rule of using no external services. The trade-off is
that the typeface differs slightly between platforms.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@matsygfors

Copy link
Copy Markdown
Member Author

Jag har justerat nu så gott jag kunnat, ville inte att layouten ska se ut som i förra athega.se så jag har försökt få till en logisk hierarki. Även tagit bort uppslaget mot google för fonterna (pga integritetsskäl).
Det mesta av layout är omgjord nu sedan senaste commit.

Till exempel likadana sluttabeller på sidorna (gråa nu)

Vi valde bort HTML-omslag runt Markdown (så gjorde vi tidigare eller hur?) och struktur i front matter /YAML
Det var drawbacks är att en som redigerar texten måste kunna HTML och kunna klasserna. Blankrader måste sitta rätt för att Markdown ska tolkas inne i HTML. Det är lätt att råka ändra utseendet när man ändrar en text. Och med front matter texten hamnar utanför Markdown. Långa texter och formatering (fetstil, länkar) blir omständliga i YAML, och innehållet blir svårare att läsa som text.

Så det är Konventioner i Markdown, med korta sektionsanrop
Drawback, en egen DSL. Man måste känna till reglerna, och skriptet (cirka 200 rader) måste underhållas. Sektionsanropen är standard Eleventy, men konventionerna inuti är våra egna.

hoppas det är enklast för den som redigerar innehåll, och den kan gå åt andra hållet om underhållet av skriptet är viktigare. Vi kan också sektionstyperna till ungefär sex(en tredjedel), vilket gör DSL:n enklare utan att ändra hur filerna ser ut.

Blogginlägg använder ingen av dessa. De är vanliga Markdown-filer i _posts/ där en fil räcker: första # rubriken blir titel och första stycket blir ingress om ingen front matter finns. Det gäller alltså ett fjärde sätt som är enklare eftersom inlägg bara är löptext.

Saker som man borde titta på ... men jag är osäker om det måste göras nu.

Två CSS- och mallsystem ligger bredvid varandra. Alla gamla SCSS-, JS- och mallfiler och oanvända bilder finns kvar i repot (layout.scss, home/.scss, jQuery, ai-lab.html, roles.html, intro-bg.).
Ser halvfärdigt ut

Orange text klarar inte kontrastkravet (3,02:1 mot vit, 2,63:1 mot grå; kravet är 4,5:1). Det påverkar alla etiketter, artikellänkar och orange text på grå bakgrund. Men vi kör på den.

Stora filer, fem GIF:ar på 7–14 MB i gamla inlägg (totalt cirka 58 MB), och sajten väger 120 MB.
Fanns innan jag började ändra. Att konvertera ändrar historiskt innehåll, så vi lät det vara.

Råkade committa beroenden i samma commit som layouten. js-yaml och liquidjs och en säkerhetsfix.
Beroenden inte ska uppdateras som sidoeffekt, så det borde ha varit en egen commit.

finns mer.....

@matsygfors

Copy link
Copy Markdown
Member Author

Det viktiga för oss är egentligen att få en LLM baserad lösning så jag och tobbe väldigt lätt kan strutkurera om , byta innehåll , lägga till texter, sidor mm utan att behöva koda och skriva MD filer. Sen ska den vara Bra tekniskt, kodad rätt , fungerar på github-pages osv. Så vi får göra en avvägning mellan "perfekt" lösning tekniskt och enkelheten att kunna administrera förändringar genom branch och PR.

Vi tar gärna förlag på andra sätt att göra det för att komma igång snabbt.

@lizell

lizell commented Sep 29, 2026 •

Copy link
Copy Markdown
Member

Sammanställning från Codex-granskningen på Chrilles uppdrag: första granskningen av webbplatsen samt den efterföljande praktiska Astro-utvärderingen.

Underlaget är commit 8b30074bc1158109c0421c4a7f20bb9ca8d25aee, jämförd med main 5131d20. PR:n pekar fortfarande på samma commit vid kontroll den 29 september. Kommentarerna nedan avser alltså den befintliga koden, inte en senare lokal version.

Första granskningen: bra grund, men några konkreta åtgärder före publicering

Eleventy, Liquid, Markdown och Sass fungerar bra för denna sajt och GitHub Pages. Designen är luftigare och mer sammanhållen, tjänsterna kommer före bloggen och baslayouten behöver ingen JavaScript-bundle. Gemensam navigation, automatiskt personalregister och uppdelade stilar är förbättringar.

Verifierat:

  • Både main och PR-versionen byggdes isolerat.
  • PR:ns bygge och länkkontroll passerade: 192 kontrollerade innehållssidor.
  • Befintliga sektionstester: 6 av 6 godkända.
  • Alla 191 gamla HTML-filer och samtliga 731 filer från basbygget finns kvar på samma sökvägar.
  • Mobil-/datorstickprov genomfördes i Chromium. Detta är inte ett bevis på att samtliga äldre sidor är felfria.

Prioriterade fynd:

  1. Textkontrasten behöver förbättras för liten text. Rättelse 30 september: #ed702d mot vitt ger cirka 3,02:1, inte tidigare angivna 2,65:1 (räknefel i granskningen). Den klarar därför kontrastkravet för stor text på vitt, men inte normal text. Mot den grå bakgrunden #efefef ger den cirka 2,63:1. Varumärkesorange #ff6600 ger cirka 2,94:1 mot vitt. Färgerna behöver bedömas per användning; mörk text på orange eller orange text på sajtens mörka bakgrund är fungerande alternativ utan att ändra varumärkesfärgen. WCAG kräver minst 4,5:1 för vanlig text och 3:1 för stor text. Behåll gärna logotypens orange och använd mörkare orange eller mörk neutral färg för text. Berörd färg, WCAG.

  2. Metadata går sönder av citattecken. Description/excerpt skrivs direkt i HTML-attribut utan escaping i layouten. Fyra metataggar på två artiklar påverkas: /blogg/2010/03/18/extensions-for-episerver/ och /blogg/2009/05/06/railsconf-tisdag/. På den senare väljer excerpt-funktionen dessutom JavaScript-kod som sammanfattning. Escapa attributvärden och använd riktiga textstycken eller explicit description. Layout.

  3. Kontroller behöver köras före merge. Workflow kör nu vid push till main eller manuellt. Lägg ett PR-jobb med bygge, länkkontroll, befintliga tester och jämförelse mot ett manifest över gamla URL:er. Nuvarande länkkontroll missar bland annat fragment och interna länkar skrivna som fullständiga domänadresser. Ett grönt bygge bevisar inte URL-kompatibilitet.

  4. Två skip-länkar saknar mål. Optibberas /apps/optibbera/privacy-policy/ och /apps/optibbera/integritetspolicy/ får ”Hoppa till innehållet” men saknar id="main".

URL-bevarande: dagens adresser bevaras, äldre historik behöver kompletteras

Inga gamla byggda sidor eller filer försvann i PR:n. Alla nio personprofiler finns kvar. Däremot ger följande äldre adresser redan 404 i produktion; motsvarande artiklar finns under /blogg/:

  • /2009/07/06/mongodb/
  • /2009/03/08/sinatra-och-google-spreadsheet/
  • /2009/03/25/athega-bidrar-till-oppen-kallkod/
  • /2009/08/12/in-i-zonen-som-systemutvecklare/
  • /2009/11/10/den-produktive-programmeraren/

Även äldre /files/canvas_mirror.html, /files/canvas_mirror.js, /files/lab/athaga/, dess zipfil och /14/sv/Aftonbladet ger 404. Detta är befintliga fel, inte regressioner introducerade av PR:n.

Återställ relevant innehåll eller specifika alias. Komplettera URL-manifestet med tidigare sitemaps, egna historiska länkar och Search Console. GitHub Pages kan publicera genererade HTML-redirects, men en meta refresh är inte en HTTP 301. Behåll gamla adresser när det går och skicka inte alla borttagna sidor till startsidan.

De fyra kontrollerade /phaser-games/-adresserna fungerar live trots att de inte finns i detta bygge; de tycks publiceras separat och ska inte felaktigt klassas som trasiga.

Layout, innehåll, SEO och bilder

  • Startsidesbudskapet om ”senaste mjukvarutekniken” är allmänt och avsändarorienterat. Förslag att pröva: ”Seniora utvecklare för system som måste fungera”, följt av ett konkret erbjudande.
  • En kontaktväg direkt i heron och ett eller två verkliga, kundgodkända/anonymiserade case skulle stärka köpvägen och förtroendet.
  • Egen historia, personer och uppdrag ger mer särprägel än generiska formuleringar och rutan ”100% Teknikintresse”.
  • Mobilutdrag på bloggkort är 12 px och klipps. Öka storleken eller förenkla korten. Pröva vikt 400 för brödtext i stället för 300.
  • Canonical, robots, sitemap, OG och Atom-feed är bra förbättringar. 41 sidor delar standardbeskrivning; prioritera egna beskrivningar på kommersiellt viktiga landningssidor.
  • Återinför årsnavigation och överväg statisk sidindelning: bloggindex visar ett huvudkort och 141 andra kort.
  • Tomma framtida årsarkiv är fortfarande indexerbara. Sitemap-lastmod bör spegla verklig betydande ändring eller utelämnas när okänd. Utelämna canonical på 404-sidan.
  • Bloggkort använder stora originalbilder, bland annat cirka 2 MB och 1,5 MB. Generera mindre varianter; originalens historiska adresser kan behållas.
  • Relevant JSON-LD för organisation och artiklar/författare är en förbättringsmöjlighet. Det garanterar inte utökade sökresultat.

Astro-utvärderingen: praktiskt genomförd, inte bara en teknikjämförelse

Med förtydligandet att Mats och Tobbe ska redigera genom en LLM blir manuell Markdown-redigering ett mindre tungt kriterium. Jag byggde därför en separat prototyp med Astro 7.3.5 och Node 24:

  • Startsidan och systemutvecklingssidan använder vanliga Astro-komponenter.
  • Alla 142 publicerade blogginlägg renderas av Astro.
  • Tio artiklar med Liquid-uttryck konverterades en gång till vanlig Markdown.
  • Explicita artikel-URL:er bevarar datum, versaler och understreck.
  • Tre startsidesbilder använder Astro Image; originalbilderna behålls.
Kontroll Resultat
Astro-bygge 144 native Astro-sidor
Typkontroll 0 fel, 0 varningar
Gamla byggda sökvägar Ingen saknas i prototypen
Artikelbilder Samma bildreferenser på alla 142 artiklar
Ursprungliga assetfiler utom HTML 524 kontrollerade, identiska byte
Klient-JS på fyra testade native sidtyper Inget

Viktig avgränsning: Övriga 49 HTML-filer är kopierade från Eleventy-bygget som tillfällig övergång, liksom feed/sitemap. URL-resultatet är alltså inte bevis på en fullständig Astro-migrering. Dessa delar måste byggas om för att följa nya innehållsändringar. Befintlig kompilerad CSS återanvändes för att skilja teknikval från redesign.

Redigeringstesterna fungerade: skapa artikel med bild, ändra tjänsternas ordning och lägga till ett kort utan ändrad renderingskod. En artikel utan titel stoppades av innehållsschemat och en okänd komponentvariant stoppades av typkontrollen. Citattecken i metadata escapades korrekt. Detta visar fungerande skydd, men är inte ett jämförande produktivitetstest med Mats/Tobbe eller olika LLM:er.

Bildtestet gav en konkret vinst: startsidans tre original på cirka 538 kB ersattes vid visning av varianter på totalt cirka 12 kB på mobil och 39 kB på dator, vid DPR 1. Det gäller just bildfilerna, inte sidans totala vikt eller CWV. Eleventy Image kan ge motsvarande förbättring.

Migreringskostnaden ligger i äldre Markdown

Efter avstängd automatisk interpunktionsändring var normaliserad brödtext identisk i 136 av 142 artiklar. Sex får ändrad texttolkning, femton annan kodblocksstruktur och tolv ändrade länkar. Två canvas-id:n försvinner på en artikel eftersom markupen visas som kod i stället för element. Vissa skillnader förbättrar kodpresentationen, men behöver granskas som innehållsförändringar. Mustache-kod visas utan syntaxfärgning i den testade Shiki-konfigurationen.

Ett utökat mobilstickprov hittade också en lång länk i HTMX/Mustache-artikeln som ger 417 px dokumentbredd vid 390 px viewport — samma problem i både Eleventy-PR:n och Astro-prototypen. Ett ramverksbyte löser inte CSS-fel.

Rekommendation

För snabbast möjliga lansering är befintlig Eleventy-lösning enklast. För det långsiktiga målet att ofta ändra sidstruktur genom LLM lutar rekommendationen åt Astro: standardkomponenter, validerat innehåll och etablerad bildhantering minskar behovet av egen specialkod.

Astro ger inte bättre SEO automatiskt, och Eleventy kan också förbättras på dessa områden. Astro-installationen omfattade dessutom fler paket, cirka 272 mot PR:ns 142.

Om Astro väljs bör migreringen vara en egen branch/PR med explicit URL- och innehållskontroll. Konvertera återstående sidor, personer, arkiv, feed/sitemap och SCSS-flöde; granska Markdown-avvikelserna; inför kontroll före merge och visuell preview. Prova därefter redaktörsflödet med Mats/Tobbe.

Ingen Astro-version har publicerats och ingen migrationskod har pushats. Verkliga Core Web Vitals, sökdata och hela den historiska externa länkbilden har inte utvärderats.

Officiellt underlag: Astro på GitHub Pages, Astro-komponenter, innehållssamlingar, bilder.

matsygfors and others added 2 commits September 30, 2026 09:37
…nifest gate

From the Codex/Astro review of this branch (Phase 0, contrast excluded — that
one is a deliberate design choice we're keeping):

- The two Optibbera pages (apps/optibbera/) had no layout at all: no <main>,
  no page shell, and a skip link pointing at an id="main" that didn't exist.
  They fell through to the bare "default" layout because their directory had
  no layout.json, unlike every other content directory. Add
  apps/optibbera/optibbera.json ({"layout": "page"}), the same pattern
  roller/roller.json already uses.
- description/excerpt/title were written straight into meta content="..."
  attributes without escaping, so a quote character in either would break the
  tag. Escape all three in layout.html.
- Remove the 404 page's canonical tag (it pointed at /404, which isn't a real
  address to canonicalize to); added a no_canonical front matter flag.
- The blog card excerpt dropped to 12px on mobile for no reason found in the
  cards' own content; removed the override so it matches the 14px used
  everywhere else the excerpt appears.

Checks, so these classes of problem are caught before merge instead of after:

- scripts/check-site.mjs now also resolves links written as "#fragment" or as
  a full https://athega.se/... address (previously only bare root-relative
  paths were checked), and verifies a linked fragment's id actually exists on
  the target page.
- scripts/check-url-manifest.mjs builds the site as it looked at the merge
  base with main and fails if any of those URLs are missing from the current
  build, so a branch can no longer silently drop a page main already
  published. Skips itself gracefully on main, or without network access to
  origin.
- .github/workflows/ci.yml runs on every pull request against main: tests,
  build, the link/image check and the new URL check. It has no deploy
  permissions, unlike deploy.yml, which now also runs the test suite before
  building.
- package.json: added "test" (node's built-in test runner over
  scripts/*.test.mjs) and "check:urls".

Not done from that review, on request: the text contrast colours are
unchanged. The historic pre-2009-repo 404s (e.g. /2009/07/06/mongodb/,
/files/canvas_mirror.*) and the SEO/image/copy suggestions are separate,
larger pieces of follow-up work.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
firstParagraph() already skipped fenced (```) code, but not Markdown's older
4-space-indented form, which several pre-2010 posts use throughout. On
/blogg/2009/05/06/railsconf-tisdag/ this meant an inline JavaScript example
was picked as the meta description instead of being skipped, exactly as
flagged in the Codex review. Verified in a real build: the page now falls
back to the site's default description, since that post has no plain-text
paragraph outside of raw HTML and code.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
matsygfors and others added 6 commits September 30, 2026 10:47
…them

Several pre-2013 addresses for athega.se already 404 in production (flagged in
the Codex review): the blog moved through at least three earlier platforms
(a Blogger-style blog, a WordPress-style blog with author/category pages, and
an even older 2008 company site) before this repo's history begins, so none
of that URL history is recorded anywhere in the codebase itself.

scripts/legacy-urls/ is a one-time pull of every path web.archive.org has ever
seen for the domain (595 total), cross-checked against the current build and
sorted into categories: 37 addresses that just need the /blogg/ prefix added
(exact target already worked out), old monthly/yearly archive pages, blog
posts that were apparently never migrated (including one from 2022,
/blogg/2022/04/03/varan-teatern-aterupptar-samarbetet/, that looks lost
rather than just renamed), pages for former employees, category/tag archives,
and CMS/slide-export noise that isn't worth redirecting individually.

This is reference material for a person to work from, not something the build
reads: manifest.json (structured) and summary.txt (readable), both outside any
path Eleventy turns into pages or copies to _site/.

Not done yet: no redirects exist. Building them (as instant meta-refresh
pages, since GitHub Pages can't do a server-side 301 for individual paths —
Google treats a 0-second meta refresh almost as reliably as one) is the next
step, and still needs a decision on the ~250 addresses that don't have an
obvious target.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Verified with Google's own guidance before building this: an instant
(0-second) meta refresh is treated "almost as reliably" as a server-side 301,
which is what matters here since GitHub Pages can't do a real 301 for an
individual path (only for the whole apex/www domain). Redirecting is also
what Google explicitly recommends over leaving an old URL to 404 — it carries
over whatever ranking signal the old address had, rather than losing it.

- _data/redirects.json: {from, to, title} rows. redirects.html is a single
  Eleventy pagination template that generates one stub page per row, at the
  old address, with the meta refresh and a canonical pointing at the target.
  Add a row to redirect another address; no new template needed.
- The 37 rows here are the "matches-current-post" entries from
  scripts/legacy-urls/manifest.json: the article is still here, the old
  address was just missing the /blogg/ prefix, so the target was already
  known with certainty.
- The stub pages are excluded from all collections (so they don't end up in
  sitemap.xml, which should only list the real, canonical addresses) and are
  already skipped by npm run check's link/h1 checks, which ignore any page
  containing a meta refresh.

Verified: all 37 build at the expected old path and redirect to a real post,
npm run check covers all 229 pages (192 + 37) with no problems, npm test still
passes, and npm run check:urls still confirms nothing from main is missing.

The remaining ~250 addresses in scripts/legacy-urls/ (unmigrated posts, former
employees, old company pages, archive listings) still need a decision each
before they can be redirected the same way.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The "archive-index" rows from scripts/legacy-urls/: monthly archive pages
from two earlier blog platforms (Blogger-style /YYYY/MM/ and a later
/arkiv/YYYY/M/ scheme), none of which have monthly archives on the current
site. Each redirects to /blogg/<year>/ when that year archive exists, or to
/blogg/ when it doesn't (all the 2008 pages, since the earliest post here is
from March 2009).

Fixed a bug in redirects.html while adding these: one of the 25,
/2008_05_01_archive.html, is a literal .html file rather than a directory-style
address like every row added so far, so appending "index.html" to it (as the
permalink template unconditionally did) would have built it at the wrong,
broken path. The permalink now branches on whether `from` already ends in
".html".

Verified: all 62 redirects (37 from before + these 25) build at the exact old
path with no permalink collisions, npm run check covers 254 pages with no
problems, npm run check:urls still confirms nothing from main is missing, and
sitemap.xml is unchanged (187 entries — the redirect stubs still correctly
don't appear in it).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…screens

Two more findings from re-checking the Codex review against the current
build:

- /2009/03/08/sinatra-och-google-spreadsheet/ was one of the five dead URLs
  the review named, and the article is still here (matches-current-post
  pattern, same as the 37 already redirected) — but web.archive.org had never
  crawled that bare-path variant, only the already-live /blogg/-prefixed one,
  so my scripts/legacy-urls/ pull missed it. Added by hand; all five of the
  review's named dead URLs now redirect.
- .article-body had no overflow-wrap, unlike card headings elsewhere in the
  CSS. A bare URL written as a Markdown autolink (<https://...>) in the
  HTMX/Mustache post renders as a link whose visible text is the full,
  space-free address, which overflowed the article column on narrow screens —
  confirmed by finding the exact 87-character string in that post's source.
  Same fix pattern already used on card headings (overflow-wrap: break-word).

/files/canvas_mirror.{html,js} (also named in the review) has no trace in this
repo's history at any point — confirmed out of scope per "don't worry about
pages that aren't in main."

Verified: build, npm test (6/6) and npm run check (255 pages) all pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The blog has a /blogg/<year>/ page for every year 2009–2030, most with no
posts yet. sitemap.xml already excluded years with no posts, but the pages
themselves had no robots meta, so a search engine following a link to one
(e.g. from the year navigation) could still index an empty page.

eleventy.config.js: the set of years that actually have a post is now computed
once, from the _posts/ filenames, and exposed as a `yearHasPosts` filter;
sitemapPages reuses the same set instead of recomputing it.
layout.html: a year archive page (year is only set on blogg/<year>/index.html)
gets <meta name="robots" content="noindex"> when its year has no posts.

Verified: 2027–2030 (no posts) get noindex, 2009 and 2026 (have posts) don't,
build/npm test/npm run check/npm run check:urls all pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…blogg/

The new design never actually linked to a year archive (no year-nav UI was
rebuilt for it), so blogg/<year>/ was orphaned: 22 pages nothing on the site
pointed to, one post-grid template used only by them, and the noindex-for-
empty-years fix from the previous commit existed solely to patch a symptom of
keeping them around.

blogg/<year>/index.html (2009–2030) and _includes/blog/index.html are removed.
Every one of those addresses still works — each now redirects to /blogg/,
which already lists every post in one grid — because main still serves them
today (confirmed: blogg/2009/ and the rest are the same file in main's own
tree), so removing them outright would have 404ed live production URLs. The
16 redirects added two commits ago that pointed old pre-2013 addresses at a
year archive now point straight at /blogg/ instead, avoiding a redirect chain.

Also removed as dead code, now that nothing sets `year` in front matter
anywhere: the `yearHasPosts` filter and its postYears computation in
eleventy.config.js, the year-archive branch of the sitemapPages collection,
and the noindex block in layout.html added in the previous commit.

Verified: build, npm test (6/6), npm run check (255 pages, all 22 new
redirects resolve), and npm run check:urls (nothing from main missing) all
pass. sitemap.xml no longer lists any /blogg/<year>/ address.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

@lizell lizell left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Uppföljande granskning av 164b3c0

Granskning med Codex, publicerad på Chrilles uppdrag. PR:en är klart närmare att kunna släppas. Detta uppdaterar statusen i den tidigare granskningen.

Verifierat löst

  • Description och Open Graph hanterar nu citattecken korrekt i det tidigare EPiServer-fallet.
  • Det indenterade kodblocket hamnar inte längre i RailsConf-artikelns metadata; sidan använder nu beskrivningsfallback.
  • Båda Optibbera-integritetssidorna har rätt sidstruktur och mål för hopplänken.
  • Startsideskortens brödtext är nu 14 px på mobil, verifierat i Chromium.
  • HTMX/Mustache-artikeln ryms nu på 390 px utan den tidigare horisontella scrollen.
  • Kontroller körs på PR i GitHub Actions och är gröna.
  • De fem tidigare utpekade artikellänkarna utan /blogg/ har omdirigeringar.
  • Canonical är borttagen från 404-sidan.

Lokalt passerar 6 tester, bygge, sidkontroll och URL-jämförelse. Alla 190 sid-URL:er som jämförelsen omfattar från main finns kvar som sida eller omdirigering. Jag kontrollerade separat samtliga 85 omdirigeringar: alla har befintliga mål och inga bildar kedjor. Mobilstickprov och två omdirigeringar verifierades även i Chromium.

Tre kommentarer vid berörda kodrader

  1. Kontrollera omdirigeringsmål i CI: en avsiktligt trasig omdirigering passerade sidkontrollen. Detta skulle jag fixa före merge.
  2. Behåll årsarkiv med innehåll: alla årsadresser skickas nu till hela bloggen, vilket tappar besökarens val av år. Detta är en rekommendation om användbarhet och URL-bevarande.
  3. Hantera query-parametrar i länkkontrollen: en giltig länk till /blogg/?utm_source=review underkändes i ett reproduktionstest.

URL:er och SEO

Arbetet med historiska adresser är en tydlig förbättring. Omedelbar meta refresh tillsammans med canonical är rimligt för den statiska publiceringen på GitHub Pages. Google behandlar omedelbar meta refresh som en permanent omdirigering: Googles dokumentation.

Vi kan däremot ännu inte säga att alla historiska adresser är räddade. Inventeringen i scripts/legacy-urls/summary.txt listar bland annat 40 äldre bloggadresser utan migrerad motsvarighet, plus andra kategorier som behöver bedömas. Det är äldre innehållsskuld, inte belagda nya bortfall i PR:en. Bevarande av dagens main och återställning av äldre adresser behöver följas upp separat.

Kontrast, innehåll och teknikval

Kontrastfrågan kvarstår: #ed702d ger cirka 3,02:1 mot vitt och 2,63:1 mot #efefef. Vanlig text behöver 4,5:1 för WCAG AA. W3C.

Det går att behålla Athega-orange #ff6600: använd mörk text på orange knappar, mörk länktext med orange markering och orange detaljer på mörka ytor. Orange #ff6600 mot #111315 ger cirka 6,34:1. Varumärkesfärgen behöver alltså inte bytas för att förbättra läsbarheten.

Layoutens övergripande uttryck är i stort sett oförändrat. Konkreta kundproblem och resultat skulle stärka startsidan mer än formuleringen ”experter på den senaste mjukvarutekniken”. Bildoptimering och innehållsförbättringar kvarstår också från förra granskningen.

Ändringarna stärker möjligheten att lansera med Eleventy. Den tidigare Astro-utvärderingen kvarstår som underlag för ett långsiktigt teknikval; denna uppdatering gör inget ramverksbyte nödvändigt inför lanseringen.

Prioritering: täpp till omdirigeringskontrollen, rätta query-hanteringen och behåll användbara årsarkiv. Kontrastfrågan kvarstår därefter tillsammans med förbättringar av bilder och innehåll.

Comment thread scripts/check-site.mjs Outdated
Comment thread _data/redirects.json
Comment thread scripts/check-site.mjs Outdated
@lizell
lizell merged commit bd20e67 into main Oct 2, 2026
1 check passed
@lizell
lizell deleted the NewLayout branch October 2, 2026 13:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants