Changes.
This site is our own weekend project, and this is its logbook: everything that changed, day by day, baked in when the site was built. The link in the footer says when that was.
- Branschsidorna har fått innehåll. Ny dokumenttyp
industryi Sanity (slug som matcharsrc/lib/industries.js, lokaliserat intro, referenser till tjänstesidor)./branscher/<slug>hämtar dokumentet vid sidan av uppdragen och visar introt plus ”Tjänster som hör hit” ovanför uppdragslistan; saknas dokument ser sidan ut som förut. Sex intron skrivna och publicerade (sv + en, 125–178 ord vardera), tre stycken per bransch: vad branschen kräver, vad vi gjort där med länkar till uppdragen, och vilka tjänster som hör dit — allt hämtat ur uppdragsbeskrivningarna, inga nya siffror. Sidorna går från 42–88 ord till runt 200. Portable Text-länkar som börjar med/renderas nu som router-länkar (håller sig på/enpå engelska sidor, klientnavigering) — gäller även inläggen. Webhooken omskapad medindustryi filtret. Studion deployad med typen. - Beskrivningar på 135–160 tecken där de var korta. Kontaktsidan har fått en egen
seoDescriptioni i18n (sv 158, en 151) i stället för den korta ledtexten; branschsidornas mall säger nu vad sidan innehåller (”Paperphytes uppdrag inom branschen: plattformsteknik, DevOps och produktutveckling i drift”) i stället för ”Se Paperphytes uppdrag…”, 135–160 tecken för alla sex branscher på båda språken; policysidornas underrubriker i Sanity (som också är sidornas meta description) utökade till 142–160 tecken (sv + en, publicerade). Uppföljning av titelfixen mot produktion: 147 sidor i sitemap, 0 titlar över 60 tecken. - Titlar inom 60 tecken. Nytt fält
seoTitlepåblogPost(schema + sidfråga) och en regel iuseSeo-hjälparenpageTitle(): ” — Paperphyte” läggs bara till när hela titeln ryms i 60 tecken, annars visas titeln utan suffix; uppdragssidor tappar först branschsegmentet, sedan suffixet. Sju inlägg vars titel ensam är över 60 tecken har fått kortaseoTitlei Sanity (helgprojekt, reaktioner, agent-inlägget, Claude Design-loopen, IAM Roles Anywhere, QRGeno, plattform som produkt). Verktygens och uppdragsindexetsseoTitlei i18n kortade så suffixet ryms; Plattformsteknik (en) och Delivery Engineering (sv + en) trimmade med några tecken i Sanity. Studion deployad med det nya fältet. Fallstudier visar ”Kund: fallrubrik” bara när det ryms, annars uppdragstitel + bransch. Verifierat lokalt: 16 tidigare för långa sidor ligger nu på 36–60 tecken. - Engelska inläggs-URL:er borta.
/en/anteckningsbok/<slug>(aldrig prerendrad, men länkad 15 gånger från engelska bloggindexet, från startsidans remsa och från/en/verktyg) svarar nu 308 till/anteckningsbok/<slug>viaredirectsivercel.json. NyPostLink-komponent: på engelska sidor renderas inläggslänkar som vanliga<a href>till den oprefixade adressen (routerns/en-basename skulle annars prefixa varje<Link>), medhreflang/langsatt till inläggets språk; på svenska sidor är det fortfarande klientnavigering. Används i bloggindexet (utvalt + lista), ”Just nu”-remsan, verktygssidans lässlista och relaterade inlägg.useSeo: sidor utan språkpar (alternates: false) kanoniseras alltid till den oprefixade URL:en, så ett engelskspråkigt inlägg aldrig pekar sin canonical mot en adress som omdirigerar. - SEO-fixar efter genomgång av sajten. (1) Startsidans layoutskift: uppmätt CLS 0,27–0,54 på mobil (Sanity-sektionerna monterades tomma vid hydrering och ”Just nu”-remsan sköt ner allt under sig). Ny prerender-databrygga: klienten hämtar via
fetchSanity, prerendern serialiserar svaren till<script id="__sanity" type="application/json">i ögonblicksbilden, ochprerendered(query)ger komponenterna samma data som starttillstånd —ServicesochJustNuhydreras nu med innehåll. Remsans celler har fast minsta höjd (150px) och en platshållare med samma mått när seed saknas. Uppmätt efteråt: CLS 0,000 på/och/en. (2) Mjuka 404:or: alla sju detaljsidor sätterrobots: noindex, follownär slugen inte finns, ochuseSeotar bort en tidigarerobots-meta när nästa route inte begär någon (så en 404 inte läcker in vid klientnavigering);/_shell.htmlfårX-Robots-Tag: noindex. (3)trailingSlash: falseivercel.json—/en/och/konsulttjanster/blir 308 i stället för dubbletter. (4) Säkerhetsrubriker på Vercel:X-Content-Type-Options,X-Frame-Options,Referrer-Policy(samma som inginx.conf; CSP:n där är inaktuell — nämner fonts.googleapis men inte Matomo eller api.github.com — och kopierades inte). Bonus:PRERENDER_ONLY=/,/enrenderar ett urval lokalt. Verifierat i headless Chrome mot lokalt prerendrad bundle med slow-4G/4× CPU. - ”Var det här användbart?” på verktyg och ordlistetermer (
Useful-komponenten): en ja/nej-fråga längst ner på AI-redo-kollen (i resultatvyn), Väntetidskalkylatorn, AGENTS.md-generatorn, Repo-röntgen och varje/ordlista/<term>. Återanvänder reaktionsbackenden (api/react.js, Upstash) oförändrad: ja/nej lagras somlike/dislikeunder namnrymda slugs (verktyg-<route>,ordlista-<slug>) så de aldrig krockar med ett inlägg —GET /api/react?slug=verktyg-repo-rontgensvarar på vilka verktyg som är värda att bygga vidare på. Ett svar per webbläsare (minns ipaperphyte_reactions), byte och ångra fungerar, räknare visas, tack-rad efter svar, samma spärr på 20 anrop per IP och tio minuter. Gemensam plumbing flyttad tillsrc/lib/reactions.js(bloggensReactionsanvänder samma). Cookies- och integritetspolicyn uppdaterade (sv + en, publicerade): lokal lagring och Upstash-räknarna gäller nu även verktyg och ordlistetermer; verktygslistan i cookies-policyn nämner alla fyra verktyg. Verifierat i headless Chrome mot bundlen medcreateHandlersoch en Redis-fejk i minnet: ja → byt till nej → ångra → ja + omladdning behåller valet; bloggens reaktioner opåverkade. - Relaterade inlägg under varje inlägg. Tre kort längst ner (”Läs vidare / Relaterade inlägg.”) med de inlägg som delar flest taggar med det lästa, vid lika många taggar det nyaste först; inlägget självt utesluts och sektionen döljs när inga taggar delas. Ny
RELATED_POSTS_QUERY(count(tags[@ in $tags])i GROQ), korten återanvänder.tools-reading-kortet från/verktygplus en ny metarad med datum och lästid. Svaret nyckelas på slug så gamla kort inte ligger kvar vid klientnavigering mellan inlägg. - Ändringssida
/andringaroch deploy-stämpel i sidfoten. Hela den här changeloggen visas nu på en egen sida, dag för dag med underpunkter och kodspann intakta, och sidfoten har fått en rad ”Senast deployad 5 sep. 2026 21:02 · 1934279” som länkar dit. Allt bakas in vid bygget via Vitedefine(scripts/build-info.js→__BUILD_INFO__, läses isrc/lib/buildInfo.js): inga anrop till GitHub från besökarens webbläsare, ingen rate limit, fungerar även om repot är privat. Parsern tar## YYYY-MM-DD, punkter och underpunkter; inline-markdown (kod, fet, länkar) blir riktiga element, inga HTML-strängar. Sidchromet är tvåspråkigt, loggen svensk. Med i prerender, sitemap ochllms.txt. SaknasCHANGELOG.mdi byggmiljön (t.ex. en Docker-kontext som bara innehållerfrontend/) visar sidan en tom-text och stämpeln länkar ändå. Commit-hash frånVERCEL_GIT_COMMIT_SHAellergit rev-parse. Ett första utkast la de tre senaste posterna som block på startsidan; det ströks — startsidan är en säljsida, och tre teasers utan länk gjorde inte loggen mer läst. - Alt-text på tjänstesidornas hero-bilder (Sanity, publicerat): plattformsteknik, devops, developer-experience, produktutveckling och delivery-engineering saknade alla alt-text; nu beskrivande svensk alt-text per bild (laptop med konfetti, moduler i rörledningar, idé→flöde→app, leveransloop med hjärtkurva, pipeline med tre grindar och kanariefågel). Även de sju sektionsbilderna på plattformsteknik (kuber, kluster-rutnät, vågformer med avvikelse, nätverksdiagram) och produktutveckling (passare på pappersark, MCP-nav med databas/dokument/verktyg/kod, pratbubbla med gnistor) har fått alt-text. Samtliga bilder på tjänstesidorna har nu alt-text.
- ”Just nu”-remsa på startsidan (
JustNu-komponenten, mellan hero och Åtaganden): senaste inlägget med kategori, datum, lästid och reaktionsräknare (ReactionsSummary), nyaste verktyget och senaste uppdraget — tre celler i samma 1px-rutnät som tjänstekorten, staplade under 960px. Data från en nyJUST_NU_QUERY(sex senaste inläggen + senaste uppdraget); klienten väljer första inlägget på besökarens språk och faller tillbaka på det nyaste. Verktygslistan flyttad tillsrc/lib/tools.jsmedadded-datum så både/verktygoch remsan läser samma lista. Renderar ingenting tills Sanity svarat, och ingenting alls om anropet misslyckas. - Ordlistelänkar i inlägg. Första omnämnandet av varje ordlisteterm i ett inläggs brödtext blir en prickad länk till
/ordlista/<slug>med kortdefinitionen som tooltip vid hover/fokus (src/lib/glossaryLinks.js+GlossaryMark). Bara vanliga stycken och listpunkter — inte rubriker, citat, kod eller inne i befintliga länkar — och varje term högst en gång per inlägg. Termer på formen ”Namn (FÖRK)” matchar långformen eller förkortningen (förkortningen skiftlägeskänsligt); termer på fyra tecken eller mer får ett kort böjningssuffix (”golden paths”, ”plattformen”). Ordlistan hämtas en gång per sidladdning. På pekskärm finns ingen tooltip; länken går till definitionen. - Nytt verktyg: Repo-röntgen (
/repo-rontgen+/en/repo-rontgen). Klistra in ett publikt GitHub-repo (URL,org/repoeller git-remote) och få arton kontroller i fyra grupper — onboarding (README, AGENTS.md/CLAUDE.md, CONTRIBUTING, .editorconfig, devcontainer), reproducerbart bygge (låsfil, Dockerfile/compose, Makefile/justfile/package.json, fastnålad verktygsversion), kontroller & automation (CI, pre-commit, Dependabot/Renovate, CODEOWNERS, PR-mall) och puls (licens, push senaste 90 dagarna, ingen öppen PR äldre än 30 dagar, inte arkiverat) — med poäng av 18, tre nivåer (Frisk / Under observation / Remiss), vad som letades efter per kontroll, pulsfakta och ett ”Nästa steg” som pekar på AGENTS.md-generatorn när AGENTS.md saknas och Delivery Engineering när CI saknas. Fyra anrop direkt från webbläsaren tillapi.github.comutan inloggning (repo, rotlistning,.github/-listning, öppna PR:ar); bara rotkatalogen och.github/på standardgrenen läses. Delbar länk via?repo=org/reposom kör vid sidladdning. Logiken ligger isrc/lib/repoXray.js, sidan iRepoRontgenPage.jsxpå.vk-*/.ark-*-chassit plus nya.rx-*-klasser. Felläge för ogiltig adress, 404, GitHubs anonyma gräns (60 anrop/timme) och nätverksfel.- Inkopplad på alla nio ställen: route,
tools.js, i18n (rontgen,toolsPage.tools.rontgen,toolCta.rontgen;/verktyg-ledtexten säger nu ”Fyra sätt”), prerender, sitemap,llms.txt, ochToolCTApå tjänstesidan DevOps. - Verifierat i headless Chrome mot den byggda bundlen: startsidans remsa (sv/en, mobil), ordlistelänkar på tre inlägg (tooltip, inga länkar i rubriker eller nästlade), Repo-röntgen med inspelade GitHub-svar för
vitejs/vite(12/18) samt ogiltig adress och 404. Lint: 25 fel (26 sedan tidigare, inga nya). - Integritetspolicyn uppdaterad i Sanity (sv + en, publicerad): nytt stycke under ”När du besöker den här webbplatsen” om att Repo-röntgen anropar
api.github.comdirekt från webbläsaren (fyra anrop per repo, GitHub ser IP-adress och repo, Paperphyte ser inget, inget sparas, inga anrop förrän besökaren klistrar in ett repo); GitHub, Inc. (USA) tillagd under ”Vem vi delar uppgifter med”; rättslig grund (berättigat intresse, 6.1 f) förtydligad för GitHub-anropen.
- Inkopplad på alla nio ställen: route,
- Hela tjänstekortet klickbart. Åtaganden-korten (startsidan och
/konsulttjanster, sammaServices-komponent) länkar nu i sin helhet till tjänstesidan, inte bara titeln och "Läs mer"-knappen. Stretched link-mönstret i CSS: titellänken får ett::after-lager som täcker kortet, knappen ligger kvar ovanpå med egen hover och fokusring, och titellänken har fått en:focus-visible-ram. Ingen markup ändrad — skärmläsare och tangentbord ser fortfarande två vanliga länkar. Baksidan: texten i korten går inte längre att markera med musen. - Hero-ledtexten avslutas nu med "…drifta digitala produkter." — "— utan teaterföreställning." / "— without the theatre." struket ur sv/en i18n. Frasen fanns aldrig i Sanity.
- Ny bloggpost publicerad: "Er nästa plattformsanvändare är en agent — och den läser inte wikin" (
/anteckningsbok/plattformsanvandaren-ar-en-agent, kategori DX, 5 min). Tesen: en kodagent beter sig som en nyanställd på dag ett, varje dag, utan kollega att fråga — den läser bara det som finns i repot, gissar i stället för att fråga, kör kommandon i stället för att klicka och lär sig av felmeddelanden. Det gör den till den ärligaste DX-mätaren en organisation har, och inlägget beskriver vad en golden path behöver för att fungera utan tyst kunskap (kontraktsfil i repot, CI-kontroller körbara lokalt, felmeddelanden som specifikation, sandlådor med kortlivade rättigheter). Länkar vidare till golden paths-, plattform som produkt- och IAM Roles Anywhere-inläggen, AI-redo-kollen och tjänstesidan Developer Experience. Genererad hero-bild i sajtens isometriska stil med svensk alt-text.- Featured flyttad: den nya posten ligger nu i hero-slotten på
/anteckningsbok; "Sluta skriva wiki-sidor, börja bygga golden paths" är avflaggad. Exakt ett inlägg är featured. - Inlägget använder inline-markdown (
**fet**,[text](url)) i span-texterna, på samma sätt som Väntetidskalkylator-posten;transformBodyifrontend/src/lib/portableText.jsxexpanderar dem.
- Featured flyttad: den nya posten ligger nu i hero-slotten på
- Integritetspolicy och cookies-policy uppdaterade i Sanity (sv + en, publicerade) efter genomgång mot hur sajten faktiskt beter sig:
- Google Fonts/Google LLC struket överallt — typsnitten har varit self-hostade sedan 2026-07-25. Båda policyerna säger nu att typsnitten ligger på egen domän.
paperphyte_langstruket ur cookies-policyn: språket följer av URL:en (/en/), inget lagras. Endastpaperphyte_consentfinns i localStorage.- Ny cookie deklarerad:
mtm_consent_removed— sätts av Matomo vid nej i cookie-rutan (forgetConsentGiven), livslängd 30 år enligt matomo.js. - Nytt avsnitt i integritetspolicyn: "När du skriver till oss på WhatsApp" (Meta Platforms Ireland som mottagare, metadata, alternativ). Meta tillagd under "Vem vi delar uppgifter med", liksom QRGeno (kontaktsidans QR-kod går via
api.qrgeno.comsom loggar skanningar innan vidarebefordran till LinkedIn). - Tredjepartsleverans förtydligad:
matomo.jshämtas fråncdn.matomo.cloudvid varje sidladdning oavsett samtycke (IP i InnoCrafts CDN-loggar, ingen spårning); bilder fråncdn.sanity.ionämns bredvidapicdn.sanity.io; verktygssidorna sparar ingenting.
- Nytt verktyg: AGENTS.md-generatorn (
/agents-md-generatorn+/en/agents-md-generatorn) — nio frågor om ett repo (vad det är, kommandon, om CI:s kontroller går att köra lokalt, vägen till produktion, grenar/commits, läs-först-filer, regler, fråga-först och vad agenten får göra utan att fråga) blir en färdigAGENTS.mdellerCLAUDE.md, på engelska eller svenska, att kopiera eller ladda ner. Tomma fält utelämnas ur filen; en radräknare säger till över 70 rader ("mer än en sida"). „Visa ett exempel" fyller i ett realistiskt repo på filens språk. Allt genereras lokalt, inget sparas.- Byggd på
.vk-*-chassit från Väntetidskalkylatorn plus nya.amg-*-klasser (textfält, pill-val, förhandsvisning). Filens egna strängar ligger i koden (FILE.sv/eniAgentsMdGeneratornPage.jsx) eftersom filspråket väljs oberoende av sajtspråket; UI-copyn ligger i i18n underagentsmd. - Listad på
/verktyg(ledtexten säger nu "Tre sätt"), i sitemap, prerender (bilingual) ochpublic/llms.txt— som fått en ny sektion "Free tools"; verktygen saknades där helt. ToolCTApå tjänstesidan Developer Experience byter från Väntetidskalkylatorn till generatorn; Plattformsteknik behåller kalkylatorn.- Smoke-testad i headless Chrome mot den byggda bundlen (sv/en UI, båda filspråk, båda filnamn, tre verktyg listade på
/verktyg). Lint: inga nya fel (26 sedan tidigare, oförändrat).
- Byggd på
- Död newsletter-copy borttagen ur
footeri sv/en i18n — inget formulär har någonsin renderat den. - Lanseringsbloggpost publicerad i Sanity ("AGENTS.md-generatorn: sidan kodagenten läser först",
/anteckningsbok/agents-md-generatorn, kategori DX, flaggadshowOnToolsPage) med genererad hero-bild. Agent-posten länkar nu till generatorn i steg 2 av "Så börjar du". - Dela-knapp på alla blogginlägg. Ny komponent
SharePostlängst ner i varje inlägg (rad med etiketten "Värt att skicka vidare?", knappen "Dela inlägget" och tillbaka-länken). Användernavigator.share()med inläggets titel, ingress och kanoniska URL där webbläsaren har Web Share API (mobil, Safari, Edge); annars kopieras länken till urklipp och knappen visar "Länken är kopierad" i 2,5 s. Avbrutet delningsark ignoreras tyst; blockerat urklipp faller tillbaka påexecCommand('copy'). sv + en. Verifierad i headless Chrome (fallback-vägen, urklippet fårhttps://paperphyte.com/anteckningsbok/<slug>även från/en/-URL:en, eftersom inlägg är enspråkiga). - Reaktioner på blogginlägg (gren
feat/reactions): fyra räknare — 👍 gilla, 👎 ogilla, ❤️ älska, 👏 applådera — längst ner i varje inlägg, ovanför dela-raden. Klick räknar upp, klick igen tar tillbaka; gilla och ogilla utesluter varandra. Optimistisk uppdatering med rollback vid fel; vid 429 visas en vänlig notis.- Ny backend: Vercel Function
frontend/api/react.js(GET ?slug=→ räknare,POST {slug, kind, delta}→ uppdaterade räknare) mot Upstash Redis: en hash per inlägg (reactions:<slug>,HINCRBY= atomärt), plus sorted setreactions:topmed totalen per inlägg för en framtida riktig "Populärast"-sortering. Sliding-window-rate-limit 20 reaktioner per IP och tio minuter via@upstash/ratelimit; inget om besökaren lagras med räknaren. Klient och limiter är injicerbara (createHandlers) och testade mot en in-memory-fake (8 fall: validering, inkrement, take-back ej under noll, 429 per IP, 503 utan konfiguration). - Frontend:
Reactions.jsx(visas först när räknarna laddats; döljs helt om API:et svarar fel/503), i18nblogPage.reactions*, CSS.post-reactions*. Vilka reaktioner webbläsaren gett sparas i localStorage underpaperphyte_reactions— artighet, inte säkerhet. - E2E i headless Chrome mot byggd bundle med den riktiga handlern på fake-Redis: toggle, take-back, gilla↔ogilla, persistens efter reload, ny besökare, engelska etiketter, 429-rollback, 503 → dolt.
- Innan merge/deploy: (1) Upstash Redis är kopplat via Vercel Marketplace; integrationen injicerar
KV_REST_API_URL/KV_REST_API_TOKEN(plusKV_REST_API_READ_ONLY_TOKEN,KV_URL,REDIS_URLsom inte används). Funktionen läser både de namnen och Upstashs egnaUPSTASH_REDIS_REST_URL/_TOKEN; utan något av paren svarar endpointen 503 och sidan döljer knapparna, så deploy är ofarlig. Kontrollera att variablerna är aktiverade för både Production och Preview i Vercel. (2) Policyerna är uppdaterade och publicerade i Sanity:paperphyte_reactionsi cookies-policyns localStorage-lista (plus ett stycke om räknarna under "Tredjepartsleverans"), och i integritetspolicyn ett stycke under "När du besöker", Upstash, Inc. (USA; databas i EU) under "Vem vi delar uppgifter med" samt missbruksskyddet i "Rättslig grund" — allt sv + en. (3) ESLint har fått ett block förapi/**(Node- + webbglobaler).
- Ny backend: Vercel Function
- Ny sida: Verktyg (
/verktyg+/en/verktyg) — samlingssida för sajtens självbetjäningsverktyg (AI-redo-kollen och Väntetidskalkylatorn) med format, tidsåtgång och vad man får ut av vart och ett. Verktygen är kodade, inte innehåll: URL:erna ligger iTOOLSi sidan, copyn i i18n. ItemList-JSON-LD, hreflang och prerender som övriga sektionssidor.- Nytt fält på
blogPost:showOnToolsPage(bool). Inlägg som flaggas dyker upp i sektionen "Bakgrunden till verktygen" längst ner på sidan, sorterade på publiceringsdatum. Sektionen döljs helt när inget inlägg är flaggat. Fältnamnet är camelCase eftersom det är en objektnyckel i dokumentet och i GROQ — bindestreck skulle falla på schemavalidering. Studion behöver deployas om för att växeln ska synas i redigeringsgränssnittet (cd content-studio && pnpm deploy). - "Verktyg" tillagd i footerns Företag-kolumn (sv + en). Huvudnavigationen är oförändrad — den ligger kvar på fem poster.
- Nytt fält på
- Nytt verktyg: Väntetidskalkylatorn (
/vantetidskalkylatorn+/en/vantetidskalkylatorn) — räknar om väntan på bygget till förlorade utvecklartimmar och kronor per år. Tre reglage (utvecklare, byggen per dag, minuter per bygge) plus två redigerbara antaganden (andel av väntan som går förlorad, standard 60 %, och kostnad per utvecklartimme, standard 850 kr). Utlåtande i tre nivåer (Ni har anställt väntan / Det syns i marginalen / Det här är inte er flaskhals) med nästa steg som länkar till DeLaval-fallstudien, plattformsteknik, Developer Experience, ordlistan och AI-redo-kollen. Allt räknas lokalt, inget sparas.- Matematiken visas öppet på sidan ("Så räknar vi") med varje mellansteg — samma hållning som de streckade "siffra saknas"-rutorna på fallstudierna. 220 arbetsdagar och 1 600 timmar per heltidstjänst, båda avrundade nedåt.
- Knappen "Kopiera länk med era siffror" lägger inmatningen i query-strängen (
?dev=&b=&min=&spill=&kr=) så resultatet kan skickas vidare till den som äger budgeten. Sidan läser tillbaka värdena vid inläsning; ogiltiga eller orimliga värden faller tillbaka på standardvärdet. ToolCTA-banner med nyckelnvantetidpå DeLaval-fallstudien samt på tjänstesidorna Plattformsteknik och Developer Experience.KonsulttjanstPagehar fått sammaTOOL_CTA_BY_SLUG-mekanism somAssignmentPage; bannern renderas mellan tjänstebeskrivningen och processavsnittet, och bara när dokumentet är inläst.- CSS-sektionen
/* AI-REDO-KOLLEN */heter nu/* TOOL PAGES */; den gemensamma verktygschromen delas mellan.ark-*och.vk-*i stället för att dupliceras. - Sidan ingår i sitemap och prerender (bilingual; 133 rutter totalt).
- Lanseringsbloggpost publicerad i Sanity ("Väntetidskalkylatorn: vad kostar er väntan på bygget?",
/anteckningsbok/vantetidskalkylatorn, kategori DX) med genererad hero-bild. OBS: posten publicerades innan verktyget deployats — dess länkar till/vantetidskalkylatornger 404 tills koden är ute. - OBS:
localhostligger inte i projektets CORS-lista, så Sanity-drivna sidor renderar inte i utvecklingsläge utan att API-anropet proxas. Verifieringen av ToolCTA-placeringen gjordes med en sådan proxy — lägg till en dev-origin i CORS-listan om det ska gå att köra lokalt utan omvägar.
- Nytt blogginlägg med kortkommandon för skärmdumpar
- Nytt verktyg: AI-redo-kollen (
/ai-redo-kollen+/en/ai-redo-kollen) — tolv frågor i fyra dimensioner (skyddsräcken i koden, testgrinden, reproducerbarhet, arbetssätt & ansvar) som visar om en kodbas är redo för AI-assisterad utveckling. Utlåtande (Grinden håller / glappar / saknas), dimensionsanalys och rekommendationer som länkar till QRGeno-fallstudien, tjänstesidor och ordlistan. Allt räknas lokalt; svarsordningen slumpas.- Ny återanvändbar komponent
ToolCTA— drop-in-banner för verktyg på valfri sida (i18n-driven). Placerad på QRGeno-fallstudien. - Lanseringsbloggpost skriven som utkast i Sanity ("AI-redo-kollen: är er kodbas redo att koda i par med AI?",
/anteckningsbok/ai-redo-kollen) med genererad hero-bild — publicera den när verktyget är deployat, annars länkar den till en 404. - bloggpost published
- Ny återanvändbar komponent
- Fyra fullständiga fallstudier på
/uppdrag/atg,/uppdrag/delaval,/uppdrag/qrgenooch/uppdrag/urb-it(sv + en), implementerade från Claude Design-utkasten "Fallstudie *".- Uppdrag med fallstudieinnehåll renderar nu en komplett fallstudielayout: hero med faktaruta (kund/period/roller/åtagande), innehållsförteckning, numrerade sektioner (problem, angreppssätt, beslut, utfall, teknik), mörka citatband och relaterade uppdrag.
- Nya Sanity-typer (
caseSection,caseBlock,caseItem,caseQuote,caseRelated) plus fält på assignment (caseTitle,caseLead,caseService,caseSections,caseRelated) — allt innehåll ligger i Sanity, tvåspråkigt, publicerat. - ATG:s teknikförteckning kompletterad med Nexus, SonarQube, Prometheus och Grafana (enligt designens anteckning).
- Utfallsmått utan verifierad siffra visas i streckade "siffra saknas"-rutor (DeLaval har riktiga siffror: 1 000 parallella tester, 30 000 vCPU-timmar/mån, 80 000 byggen/mån). Studion behöver deployas om för de nya fälten.
- Ny sida: Uppdrag (
/uppdrag+/en/uppdrag) — hela uppdragsregistret (21 uppdrag) med filtrering på bransch och roll, fritextsök på teknik/kund, statistik i hero och en mörk "Fallstudier"-sektion med fyra utvalda uppdrag (DeLaval, QRGeno, ATG, Urb-it). Implementerad från Claude Design-utkastet "Uppdrag Index", mappad till sajtens designtokens.- Assignment-schemat utökat med
featured,featuredOrderoch fallstudiefält (caseProblem/caseApproach/caseOutcome, sv/en) — ifyllda och publicerade för de fyra utvalda uppdragen. OBS: utfallsrutorna är markerade "siffra saknas" tills faktiska siffror fylls i; Studion behöver deployas om för de nya fälten. - "Uppdrag" tillagd i huvudnavigationen; sidan ingår i sitemap och prerender (128 rutter) med ItemList-JSON-LD.
- Assignment-schemat utökat med
- Ny sektion: Ordlista (
/ordlista+/en/ordlista) — 16 tvåspråkiga "Vad är …?"-sidor om plattformsteknik, DevOps, DX och modern mjukvaruleverans (golden path, DORA, GitOps, SRE, MCP m.fl.).- Ny Sanity-typ
glossaryTermmed term, kort definition, brödtext samt relaterade tjänster och begrepp (svaga referenser). Studion behöver deployas om för att typen ska synas i redigeringsgränssnittet. - Varje sida har DefinedTerm-JSON-LD, hreflang (sv/en/x-default) och länkar vidare till tjänstesidor och blogginlägg; sidorna ingår i sitemap och prerender (126 rutter totalt).
- Ordlistan länkas från footern på alla sidor.
- Ny Sanity-typ
- SEO-fixar, audit punkt 6–8:
- Nya sökordsrika sidtitlar: tjänstesidorna får ett nytt
seoTitle-fält i Sanity (sv/en, ifyllt och publicerat för alla sex tjänster, t.ex. ”DevOps-konsulter — CI/CD, drift & incidenter”), och sektionssidorna (konsulttjänster, konsulter, branscher, kontakt, anteckningsbok) får seo-titlar via i18n./konsulttjansterheter inte längre ”Åtaganden” i sökresultat. - Ny 1200×630 og-bild (
/og-default.png) för länkdelningar; loggan kvar som Organization-logotyp i JSON-LD. Konsultsidornas meta-beskrivningar förlängda (tagline + introduktion). - Typsnitten self-hostas nu som variabla woff2 under
/fonts/med preload — inga anrop till fonts.googleapis.com på kritiska vägen. - OBS: Studion behöver deployas om för att
seoTitle-fältet ska synas i redigeringsgränssnittet.
- Nya sökordsrika sidtitlar: tjänstesidorna får ett nytt
- SEO-fixar efter fullständig audit (punkt 1–5 av 8):
- Startsidans hero-rubrik är nu sidans
<h1>(båda språken) — tidigare saknade startsidan H1 helt. - Okända URL:er får riktig 404-status: 404-sidan prerendras till
404.html, och SPA-fallbacken pekar på ett neutralt skal (_shell.html) i stället för startsidans snapshot — inga fler soft-404:or med startsidans canonical. - Policysidorna (
/policy/*, sv + en) prerendras och ingår i sitemapen — tidigare fick crawlers bara startsidans skal. - Sanity-bilder optimeras via CDN-parametrar (
auto=format&fit=max&w=…&q=75→ WebP/AVIF, nedskalning) medfetchpriority="high"på herobilder ochloading="lazy"under fold. - Hashade assets under
/assets/cachas nuimmutablei ett år (tidigaremax-age=0).
- Startsidans hero-rubrik är nu sidans
- Engelska har nu egna URL:er under
/en/(t.ex./en/kontakt) i stället för att renderas på samma URL:er som svenskan. Svenska URL:er är oförändrade och förblir huvudspråk (x-default).- Språket styrs av URL:en — localStorage/navigator-detektering borttagen, så sökmotorer och besökare ser samma innehåll för en given URL.
- Alla tvåspråkiga sidor deklarerar ömsesidig
hreflang(sv/en/x-default), språkspecifik canonical,og:locale:alternateoch<html lang>. - Sitemap listar båda språkvarianterna med
xhtml:link-alternates (och/kontaktsom tidigare saknades); prerendern renderar alla/en-rutter. - Blogginlägg är fortsatt enspråkiga: ingen
hreflang, canonical pekar alltid på inläggets språk-URL. Listsidan/anteckningsbokfinns även som/en/anteckningsbok. - Språkväxlaren i menyn navigerar nu till samma sida i det andra språket.
- Ny bloggpost publicerad: "Plattform som produkt: sluta bygga verktyg ingen vill använda" (
/anteckningsbok/plattform-som-produkt), kategori Plattformsteknik. - Lade till markdown-arbetskopia för den tidigare publicerade posten "Ersätta AWS Access Keys med IAM Roles Anywhere":
frontend/src/pages/changes.md.
The log is written in Swedish in the repo’s CHANGELOG.md and shown here as is.