Onze eigen website, eindelijk live

Na twee jaar bouwen tussen de bedrijven door is onze nieuwe website live. Met Qwik en eigen Markdownplugins hebben we hem snel gemaakt én een stuk prettiger om bij te houden.

Opdrachtgever

10KB website

De website van ons eigen softwarebureau.

Branche
Softwareontwikkeling

Team

Linda
Ewout
Roland
Luuk
Rick

De uitdaging

De lekkende kraan bij ons thuis

De eigen website van een softwarebureau is een beetje de lekkende kraan bij de loodgieter thuis. Je weet precies wat eraan moet gebeuren, maar er is altijd een klus die eerder af moet. Een klant gaat live, een applicatie heeft aandacht nodig, en de eigen site schuift nog een keer door. Bij ons ging dat ook zo.

Na twee(!) jaar ontwikkelen is onze nieuwe website er dan toch. In die tijd hebben we flink gesleuteld aan de techniek én aan de manier waarop we onze pagina's schrijven. Daar vertellen we graag over. Vandaar deze case over de website waarop je hem nu leest.

De volledige homepage van de nieuwe 10KB-website

Snel laden én makkelijk publiceren

We begonnen met twee wensen. De site moest razendsnel worden, met vier keer honderd in Woordenboek · In het kortLighthouseLighthouse is een open-source tool van Google die webpagina's automatisch controleert op onder meer prestaties, toegankelijkheid, best practices en SEO.Lees meer als doel. Die tool van Google beoordeelt websites op snelheid, toegankelijkheid, best practices en SEO. Tegelijk wilden we de menu's, filters, carousels en formulieren die de website prettig maken om te gebruiken. Snelheid moest dus in de techniek zitten, door de hele site heen.

Daarnaast wilden we van het Woordenboek · In het kortCMSEen CMS is software waarmee gebruikers digitale content kunnen aanmaken, ordenen, wijzigen en publiceren, meestal via een beheeromgeving.Lees meer af. We gebruikten Contentful en wilden onze pagina's vrij kunnen opbouwen. De ene keer een tekst met een foto, dan een rij kaarten, ergens een citaat; iedere pagina moest zijn eigen volgorde kunnen krijgen. Dat kun je prima modelleren in Contentful. Alleen was het invullen van al die blokken vervolgens zoveel werk dat het ons tegenhield om nieuwe content te publiceren.

Als softwarebureau brengen we een groot deel van de dag door in een teksteditor. Daar wilden we ook onze verhalen schrijven, met de vrijheid om blokken te verplaatsen of er eentje tussen te voegen. Kopiëren, plakken, aanpassen. Zo ontstond het idee om de pagina's als Woordenboek · In het kortMarkdownMarkdown is een tekstnotatie waarmee je gewone tekst structuur geeft, bijvoorbeeld met koppen, lijsten, nadruk en links.Lees meer op te slaan en de website zelf de opmaak te laten verzorgen.

De vraag achter de vraag

Hoeveel website past er in een tekstbestand?

We begonnen met Qwik en een verzameling herbruikbare componenten. Markdown kwam er eerst bij voor artikelen. Dat beviel zo goed dat we uiteindelijk alle pagina's zo wilden kunnen schrijven. Een hekje voor een kop, een streepje voor een lijst en hier en daar een aanwijzing voor de opmaak: zet deze tekst naast een beeld, maak van deze onderdelen kaarten of toon hier een carousel.

Daarvoor gebruiken we Woordenboek · In het kortMDXMDX is een bestandsformaat waarin je Markdown kunt combineren met JSX, JavaScript-expressies en import- en exportinstructies.Lees meer, dat Markdown met componenten kan combineren. Onze eigen plugins vertalen de aanwijzingen tijdens het bouwen van de website naar de juiste componenten. De opmaak ligt vast in de componenten, dus we hoeven die bij een volgend verhaal niet opnieuw te bedenken.

Onze werkplek met de MDX-bron links en de bijbehorende dienstenpagina rechts in de schermen gemonteerd

Waarom we graag in tekst werken

Het prettige van tekstbestanden merk je vooral als je iets wilt veranderen. We kunnen door alle pagina's zoeken, een term overal aanpassen of twee versies naast elkaar leggen. Woordenboek · In het kortversiebeheerVersiebeheer legt wijzigingen in code vast, inclusief wie wat heeft aangepast en wanneer. Zo kunnen ontwikkelaars samenwerken, veranderingen vergelijken en teruggaan naar een eerdere versie.Lees meer laat precies zien welke zinnen zijn gewijzigd. Een collega kan daarop reageren voordat de wijziging live gaat, en een eerdere versie is terug te halen. We kunnen in de editor blijven waarin we toch al werken.

Diezelfde bestanden zijn ook goed te gebruiken door scripts en AI-agents. Een agent kan de bestaande pagina's, onze schrijfafspraken en de componenten samen bekijken. Daarvoor hoeft hij geen CMS te bedienen of te raden welk invoerveld bij welk stukje van een pagina hoort. Het resultaat blijft een wijziging aan een leesbaar bestand, die we gewoon kunnen beoordelen.

Dat past bij iets waar we binnen 10KB breder mee bezig zijn: company as code. Onze website staat in 42KB, de repository waarin ook bedrijfskennis, handleidingen, werkwijzen en infrastructuur worden beheerd. We gebruiken versiebeheer en automatische controles dus ook voor werk dat je misschien eerder in een losse documentmap zou verwachten. Zo wordt kennis makkelijker terug te vinden en te gebruiken bij de volgende klus. Over 42KB en company as code vertellen we binnenkort meer in een reeks blogposts.

Van aanwijzing naar pagina

Hieronder kun je een ingekorte versie van het MDX-bestand vergelijken met de volledige dienstenpagina. Wijs een onderdeel aan om te zien welke regels erbij horen; dat werkt ook andersom. Met Tab ga je naar het volgende blok en met Shift+Tab naar het vorige. Het blok dat de focus krijgt, licht meteen op. Escape wist de markering; op een touchscreen tik je op een blok.

De MDX-bron

markdown
---
layout: page
title: Diensten voor mission-critical software
---
{/* hero */}
![Diensten van 10KB](~/assets/photos/...)
# Software die _groeit_
Wij bouwen en beheren software waar je ...
- Maatwerksoftware voor jouw processen
- ...
[Plan een kennismaking](/contact)
---
{/* side-by-side shapes="hexagon,dots" */}
![Ontwikkelaars bespreken een oplossing](...)

#### Wat we bieden
## Een _oplossing_ voor jouw situatie

Onze opdrachtgevers willen een nieuw proces
ondersteunen, een eigen SaaS-platform bouwen of
verder met bestaande software waarvan de
technische basis tekortschiet. ...

We helpen die situatie weer beheersbaar te maken
met **software ontwikkeling**, gerichte
**doorontwikkeling** of **onderhoud en support**,
afhankelijk van wat je huidige situatie nodig heeft.

...

---
{/* feature-section gridPattern="both" */}
#### Onze dienstverlening
## De _kern_ van wat we doen

{/* feature icon="pencil" */}
### Software ontwikkeling
Software op maat bouwen, of ...
[Meer weten](/diensten/software-ontwikkeling)
{/* feature icon="settings" */}
### Structurele doorontwikkeling
Bestaande software onderhouden, uitbreiden en ...
[Meer weten](/diensten/structurele-doorontwikkeling)
{/* feature icon="shield-alert" */}
### Onderhoud en support
Monitoring, onderhoud en support voor ...
[Meer weten](/diensten/onderhoud-en-support)
---
{/* side-by-side shapes="hexagon,dots" */}
![Ontwikkelaars werken samen](~/assets/photos/...)

#### Keuzehulp
## Ontwikkelen of _doorbouwen_?

Soms is een nieuwe oplossing de verstandigste stap.
Soms is doorontwikkelen op bestaande software
juist veel logischer. De juiste route hangt af
van veranderbaarheid, technische schuld, ...

Benieuwd welke route bij jouw project past?

{/* icon="arrow-right" */}
[Naar de keuzehulp](/diensten/...)

---
{/* testimonial-carousel gridPattern="both" */}
{/* testimonial */}
## 10KB is een betrouwbare en deskundige partner ...
![Roos Rietveld](~/assets/photos/...)
### Roos Rietveld
Directeur bij Planned Culture

{/* testimonial */}
## Ze denken echt mee en ontwikkelen niet zomaar ...
![Esther Radder](~/assets/photos/...)
### Esther Radder
Productmanager Werkplanner
...
---
{/* side-by-side shapes="hexagon,dots,rhombus" */}
![Ontwikkelaars werken samen](~/assets/photos/...)

#### Onze werkwijze

## Hoe _samenwerking_ eruitziet

In de praktijk werken we vaak als ontwikkelteam
op afstand met een flexibele maandplanning.
Voor het einde van de maand bepalen we samen
welk werk prioriteit heeft en hoeveel inzet
daarvoor logisch is in de volgende periode. ...

We werken op [nacalculatie](/woordenboek/nacalculatie):
je krijgt inzicht in de daadwerkelijk bestede uren.

Je werkt rechtstreeks met developers. ...

[Lees meer over onze werkwijze](/werkwijze)
---
{/* case-study-carousel placement="generic" limit="6" */}

#### Ons werk

## Diensten in de _praktijk_

Voorbeelden van samenwerkingen waarin
ontwikkeling, doorontwikkeling of onderhoud
en support het verschil maakten voor software
waar veel van afhangt.

[Naar onze cases](/cases)

---

{/* faq contentWidth="default" */}

## Veelgestelde _vragen_

### Bouwen jullie ook nieuwe software?
Ja. We bouwen nieuwe webapplicaties, portalen
en platforms op maat. ...

### Wat is het verschil tussen ontwikkeling, ...?
Softwareontwikkeling gaat over een nieuwe
applicatie of een nieuwe technische basis. ...
...
[Neem contact op](/contact)
---

De dienstenpagina

Volledige dienstenpagina met hero, tekstbeeldsecties, dienstenkaarten, testimonials, cases, FAQ en footer

Wijs een blok aan in de bron of de pagina om de twee te vergelijken. Tekst en afbeeldingspaden zijn ingekort met ...; navigatie, contactformulier en footer komen uit de gedeelde layout.

De plugins lezen de Markdown als een syntaxboom: ze weten welk stukje een kop is, welk stukje een alinea en waar een afbeelding staat. Daardoor kunnen ze bijvoorbeeld de kop en tekst onder een side-by-side-aanwijzing verzamelen en aan het juiste component meegeven. Een auteur schrijft de inhoud en kiest het patroon. De plugin regelt de vertaling naar de website.

Bovenaan het bestand, tussen de streepjes, staat de Woordenboek · In het kortfrontmatterFrontmatter is een blok metadata aan het begin van een contentbestand, meestal met waarden die de gebruikte tool uitleest.Lees meer, met bijvoorbeeld de titel, omschrijving en hoofdafbeelding. Ook daar hebben we werk uit handen gehaald. Onze frontmatterplugins koppelen taalversies, bouwen het kruimelpad en de SEO-gegevens, berekenen leestijd en zoeken gerelateerde artikelen. Ze bekijken daarvoor ook de andere pagina's. Via een centrale lijst met cases vullen ze bijvoorbeeld de casecarousels, zodat we op al die plekken niet steeds dezelfde kaart hoeven in te voeren. Ook de volgorde waarin de plugins hun werk doen ligt vast: eerst de taal en tags bepalen, daarna pas gerelateerde artikelen zoeken.

Techniek die het verschil maakt

De browser heeft al genoeg te doen

Een mooie pagina is snel gevuld met grote foto's, lettertypes en JavaScript voor alle interacties. Vooral op een telefoon kost het tijd om dat binnen te halen en uit te voeren. Daarom hebben we steeds dezelfde vraag gesteld: wat moet er werkelijk op het apparaat van de bezoeker gebeuren, en wat kunnen we al afhandelen voordat die op de site komt?

Dat begint bij Qwik. We bouwen de pagina's vooraf als HTML, inclusief de informatie die nodig is om later op een klik te reageren. De bezoeker krijgt zo direct een pagina om te lezen. De interactieve onderdelen kunnen hun werk hervatten zodra ze nodig zijn.

Lighthouse-meting van onze homepage: 98 voor Performance, 100 voor Accessibility, Best Practices en SEO; FCP 1,5 s, LCP 2,4 s, TBT 60 ms en CLS 0

Een pagina hervatten, zonder hydration

Veel frameworks leveren eerst HTML en voeren daarna in de browser opnieuw de componentcode uit om de pagina interactief te maken. Ze herstellen onder meer welke knop bij welke functie hoort en wat de toestand van de applicatie is. Dat heet Woordenboek · In het korthydrationHydration is het proces waarbij een framework server-gerenderde HTML in de browser koppelt aan code en applicatiestatus om de pagina interactief te maken.Lees meer. De pagina kan er dan al zijn, terwijl de browser nog bezig is haar klaar te maken voor gebruik.

Qwik bewaart die informatie bij de HTML. Een knop bevat als het ware al het adres van de code die bij die knop hoort. Het framework hoeft daarom bij binnenkomst niet eerst alle componenten opnieuw langs. Die aanpak heet resumability: hervatten. Vergelijk het met een opgeslagen spelletje; je gaat verder waar je gebleven was, met de benodigde toestand al vastgelegd.

Dat betekent niet dat er geen JavaScript meer is. Het menu moet nog steeds kunnen openen en het formulier moet reageren. Het verschil zit in wanneer de code nodig is. We kunnen die opdelen en gericht laden, zodat een bezoeker niet eerst de werking van de hele pagina hoeft binnen te halen om de eerste alinea te lezen.

Een foto krijgt meer dan één bestand

Voor afbeeldingen doen we veel werk tijdens de build, het moment waarop de bronbestanden in de publiceerbare website worden omgezet. Een grote foto wordt dan verkleind en gecomprimeerd tot verschillende varianten. Die berekening doen we bij het publiceren; bezoekers krijgen de bestanden die al klaarliggen.

De juiste variant hangt af van de ruimte die het beeld op de pagina krijgt én van het scherm. Een telefoon heeft meestal minder pixels nodig dan een groot beeldscherm, maar een scherp telefoonscherm kan wel een hogere pixeldichtheid hebben. Onze afbeeldingspipeline rekent daarom met de werkelijke breedtes van de componenten en maakt varianten voor meerdere schermgroottes en pixeldichtheden.

Met srcset geven we de browser een keuzelijst van die bestanden. Met sizes vertellen we hoeveel ruimte de afbeelding in de opmaak krijgt. Dat tweede detail bleek belangrijk: als de browser denkt dat een beeld breder wordt dan het werkelijk is, kiest hij alsnog een te groot bestand. Voor mobiele hero's hebben we daarom de opgegeven breedtes aangescherpt en een kleinere variant van 384 pixels toegevoegd. De hoofdafbeelding heeft bovendien een eigen mobiele uitsnede.

Eerst wat je meteen ziet

Ook een klein bestand kan te laat komen. De grote afbeelding bovenaan de pagina moet snel in beeld zijn; een foto helemaal onderaan kan best even wachten. We geven het eerste scherm daarom voorrang. Met een preload kondigen we de hero-afbeelding vroeg aan, zodat de browser die al kan ophalen voordat hij bij het beeld zelf aankomt. Die aankondiging gebruikt dezelfde afbeeldingsvarianten als de hero, anders zou een telefoon onbedoeld twee bestanden kunnen downloaden.

Beelden verder naar beneden gebruiken lazy loading: de browser haalt ze op wanneer ze in de buurt van het zichtbare deel komen. De afmetingen staan alvast in de HTML, zodat hij ruimte kan vrijhouden. Dat voorkomt dat tekst tijdens het laden ineens naar beneden springt.

Naast de beelden hebben we de opmaak aangepakt. CSS bepaalt hoe de pagina eruitziet. Het deel dat voor de eerste weergave nodig is, komt direct mee in de HTML. De overige styles kunnen daarna volgen. Vanilla Extract maakt die CSS tijdens de build, en de lettertypes serveren we als lokale, compacte WOFF2-bestanden. Met font-display: optional mag de browser bij een trage verbinding het beschikbare lettertype blijven gebruiken. Zo hoeft hij de tekst niet later alsnog te verschuiven om ons font in te passen.

Minder laden is niet altijd sneller

Tijdens het optimaliseren vonden we ook verrassingen. Onze algemene paginaroute importeerde aanvankelijk alle MDX-pagina's tegelijk. Dat was handig om mee te beginnen, maar een bezoeker kwam natuurlijk voor één pagina. We hebben de metadata voor de server en de laders voor de pagina-inhoud daarom gescheiden. Ook iconen importeren we nu expliciet, zodat een klein icoontje niet onbedoeld een hele verzameling code meetrekt. En hulpfuncties die alleen nodig zijn om stylesheets te bouwen, hebben we losgemaakt van de code die naar de browser gaat.

Bij Qwiks preloader namen we eerst een verkeerde afslag. Die haalt alvast code op die straks nodig kan zijn. Uitzetten scheelde downloads bij binnenkomst, maar bij het doorklikken moest de browser vervolgens bestanden na elkaar ophalen. De navigatie voelde daardoor trager. De preloader staat inmiddels weer aan; we hebben de indeling van de JavaScript-bundels verbeterd.

Dat is waarom we verder kijken dan het eerste laadmoment. De volgende klik, het openen van een menu en het invullen van een formulier horen net zo goed bij een snelle website.

Wat het mogelijk maakte

Ruimte voor het volgende verhaal

De site is live, en publiceren begint nu met een tekstbestand. Een kort artikel of een lange pagina met foto's, citaten en interactieve onderdelen gaat door dezelfde build. De bestanden die daaruit komen staan op S3, met CloudFront als CDN ervoor: een netwerk dat ze bij de bezoeker aflevert. Voor het lezen van een pagina hoeft geen server eerst een CMS te raadplegen. Alleen het contactformulier heeft nog een aparte API nodig om berichten te versturen.

Onze blog over het over-engineeren van het kerstdiner laat zien wat er met die aanpak mogelijk is. Het is een lang verhaal, met veel beelden en uitstapjes. In de bron blijft het een gewoon document waar we samen aan kunnen schrijven. De gedeelde componenten zorgen dat het op de website bij elkaar past.

De volledige blog over het over-engineeren van ons eigen kerstdiner

Wat er uit de meting komt

Het Lighthouse-rapport laat 98 voor performance en 100 voor toegankelijkheid, best practices en SEO zien. Deze test simuleert een trage telefoon met een trage internetverbinding. In die meting verschijnt de eerste inhoud na 1,5 seconde en staat het grootste zichtbare element na 2,4 seconden op zijn plek. De gemeten blokkeertijd is 60 milliseconden, de layoutverschuiving 0. De pagina laat dus al inhoud zien terwijl de rest binnenkomt, met nauwelijks blokkerend rekenwerk en zonder verschuivingen in deze meting.

Die laatste twee punten zijn minstens zo prettig als een hoog cijfer. Een pagina die snel lijkt te laden maar niet op een tik reageert, voelt alsnog traag. En niemand vindt het fijn als een knop verspringt op het moment dat je erop wilt drukken. Daarom controleren we ook zelf of het menu meteen reageert en je vlot naar de volgende pagina kunt.

We kunnen weer verder schrijven

We hebben er lang over gedaan, maar de manier waarop we de site nu kunnen bijhouden past bij ons. Tekst, componenten en publicatie horen bij dezelfde werkwijze. Een verbetering aan een component komt op meerdere pagina's terug, en bij een nieuw verhaal kunnen we de blokken in de volgorde zetten die daarbij past. Precies waar we ooit tegenaan liepen in Contentful.

Helemaal klaar zal onze eigen website vast nooit zijn. Er is altijd nog een detail om mooier te maken of een download die kleiner kan. Maar de volgende keer dat we iets willen vertellen, staat de techniek ons in ieder geval een stuk minder in de weg.

Wat we meenemen

Snelheid zit in de hele pagina

Een licht framework helpt, maar het resultaat hangt ook af van afbeeldingen, styles en de volgorde waarin de browser alles binnenkrijgt. Deze keuzes nemen we mee naar volgende projecten.

  1. Doe het werk voordat de bezoeker komt

    We bouwen de HTML, CSS en afbeeldingsvarianten bij het publiceren. Qwik kan de interacties hervatten zonder de hele pagina te hydrateren.

    In de praktijk

    Bepaal bij de architectuur welke berekeningen vooraf kunnen. Dat scheelt iedere bezoeker downloads en rekenwerk.

  2. Geef het eerste scherm voorrang

    De hero krijgt een passende afbeelding en een vroege preload. Beelden verderop hoeven de eerste weergave niet op te houden.

    In de praktijk

    Controleer welke bestanden het eerste scherm nodig heeft en laat die niet concurreren met onderdelen die pas later aan bod komen.

  3. Meet ook de volgende klik

    Het uitschakelen van de preloader verkleinde de eerste download, maar maakte navigeren trager. We hebben dat teruggedraaid en de bundels aangepast.

    In de praktijk

    Test een hele bezoekroute. Een goede score bij binnenkomst is pas nuttig als menu's, formulieren en volgende pagina's ook prettig werken.

Ewout

Contactpersoon: Ewout

Wat houdt jouw website op?

Soms zit het in de afbeeldingen, soms in de software die de browser eerst moet uitvoeren. We zoeken graag met je uit waar de tijd naartoe gaat.

CONTACT

Neem contact met ons op

Heb je een vraag of wil je sparren over je software? Laat je gegevens achter, dan nemen we snel contact met je op.