Modulair
Duidelijke component- en verantwoordelijkheidsgrenzen zodat wijzigingen lokaal blijven waar dat kan.
Architectuur is voor Qavirio de manier waarop verantwoordelijkheden, data, interfaces, integraties en deploymentgrenzen zo worden georganiseerd dat een systeem begrijpelijk blijft terwijl het groeit. We kiezen technologie op basis van context, risico en onderhoudbaarheid — niet omdat één stack overal zou moeten passen.
function qavirio_url($path = '/', $lang = null) {
$lang = $lang ?: qavirio_current_lang();
$clean_path = '/' . ltrim((string)$path, '/');
$trim = trim($clean_path, '/');
$fragment = '';
if (strpos($trim, '#') !== false) {
[$trim, $frag] = explode('#', $trim, 2);
$fragment = '#' . $frag;
}
$slug = sanitize_title(trim($trim, '/'));
if (qavirio_route_is_theme_owned($slug)) {
$prefix = in_array($lang, ['fr','en'], true)
? '/' . $lang : '';
$public_slug = qavirio_localized_slug($slug, $lang);
return home_url($prefix . '/' . $public_slug . '/')
. ltrim($fragment, '/');
}
}
Niet ieder project gebruikt dezelfde stack, maar onderhoudbare systemen hebben wel terugkerende eigenschappen: grenzen zijn herkenbaar, data is niet impliciet, deployment is mee-ontworpen en kritieke functies zijn testbaar.
Duidelijke component- en verantwoordelijkheidsgrenzen zodat wijzigingen lokaal blijven waar dat kan.
Bron, eigenaar, lifecycle, toegang en validatie van data zijn onderdeel van het model.
Configuratie, secrets, builds, health checks, backups en rollback worden niet naar het einde geschoven.
Kritieke workflows krijgen acceptatie- en regressiechecks die losstaan van visuele indruk.
Bij een eenvoudige website kan de architectuur compact blijven. Bij rolgebaseerde métiersoftware willen we juist voorkomen dat autorisatie, datavalidatie en kritieke businessregels verspreid raken over losse schermen. De interface mag veranderen zonder dat daardoor de kernregels opnieuw moeten worden uitgevonden.
Daarom denken we in verantwoordelijkheden: presentatie, applicatieservices, domeinregels, data-opslag, integraties en operationele infrastructuur. Niet ieder project heeft voor elke laag een apart framework nodig, maar het moet wel duidelijk zijn waar een regel thuishoort.
Responsive UI, formulieren, status, navigatie en toegankelijke interactie.
Services verbinden rollen, workflows en businessregels zonder ze in templates te verstoppen.
Opslag, API-contracten, validatie, imports/exports en koppelingen krijgen expliciete grenzen.
Publieke websites, productportalen, métiersoftware en lokale AI hebben verschillende eisen. WordPress kan uitstekend passen wanneer contentbeheer, meertaligheid en snelle commerciële publicatie centraal staan. Django en PostgreSQL passen beter wanneer rollen, relaties, transacties, auditability en complexe businesslogica de kern vormen.
De keuze is dus geen identiteit. We combineren technologie wanneer de grens duidelijk blijft, en vermijden koppelingen die alleen bestaan omdat het technisch kan. Een integratie moet een bedrijfsdoel dienen en een begrijpelijk failure mode hebben.
Sterk voor expliciete modellen, rollen, relaties, transacties en gecontroleerde workflows.
Praktisch waar redactioneel beheer en snelle publicatie een belangrijk deel van het product zijn.
Gebruiken waar de interface live gedrag, visualisatie of rijke client-side interactie nodig heeft.
Wanneer systemen gegevens uitwisselen, moet bekend zijn welk systeem leidend is, welke velden mogen worden geschreven, hoe conflicten worden behandeld en wat er gebeurt wanneer de andere kant tijdelijk niet beschikbaar is. Zonder die afspraken verandert een API snel in een bron van stille inconsistentie.
Daarom ontwerpen we integraties rond contracten en failure modes: schema en validatie, authenticatie, timeouts, retry alleen waar veilig, idempotentie waar nodig en logging die genoeg vertelt zonder onnodig gevoelige gegevens op te slaan.
Voorkomt dat twee systemen hetzelfde veld stilzwijgend overschrijven.
Formaat, verplichte velden en toegestane acties horen expliciet te zijn.
Timeout, veilige foutstatus en herstelpad zijn onderdeel van de integratie.
Een betrouwbare deployment scheidt code van omgeving-specifieke configuratie. Secrets horen niet in repositories of templates. Development, test en productie kunnen verschillende waarden en toegangsniveaus hebben zonder dat daarvoor de applicatielogica wordt herschreven.
Daarnaast moet een release kunnen worden waargenomen: draait de service, bereikt hij zijn database of afhankelijkheden, is de juiste versie actief en bestaat er een bruikbaar rollback- of herstelpad? Zulke operationele vragen zijn onderdeel van architectuur, niet alleen van hosting.
URLs, credentials en feature settings blijven uit businesslogica en broncode waar mogelijk.
Kritieke afhankelijkheden krijgen checks die echt iets zeggen over bruikbaarheid.
Een releaseplan bevat ook wat we doen wanneer een wijziging niet goed uitpakt.
De eerste versie kan bijna altijd werkend worden gemaakt. De echte vraag is wat er gebeurt wanneer regels wijzigen, een nieuwe rol wordt toegevoegd, een integratie verandert of data moet worden gemigreerd. Daarom ontwerpen we voor verandering: migraties moeten herhaalbaar zijn, kritieke routes testbaar en regressies detecteerbaar.
Dat betekent niet dat ieder project een enorme testinfrastructuur nodig heeft. Testdiepte volgt risico. Maar de belangrijkste gedragingen moeten objectiveerbaar zijn, zodat een visueel mooie release niet per ongeluk een functionele verslechtering maskeert.
We kiezen liever een duidelijk systeem dat morgen veilig kan veranderen dan een spectaculair systeem dat alleen vandaag begrijpelijk is.
Beschrijf het probleem. Wij kijken eerst naar doel, gebruiker en proces — daarna pas naar technologie.