Softwarewerkplaats · Voor bureaus
Voor bureaus: koppelingen, maatwerk software en vindbaarheid onder uw naam
Softwarewerkplaats bouwt koppelingen, maatwerk software en vindbaarheid voor bureaus, onder de naam van het bureau. Ik ben Stefan Colin uit Zwaag. Ik werk vaak achter een bureau: ik bouw, het bureau levert op onder eigen naam. Ik benader uw klant niet, ook niet na afloop.
Voor webbureaus, marketingbureaus, softwarebureaus en IT-dienstverleners die hun klant liever ja geven dan doorsturen naar een ander.
Stuur één klantvraagof bel 06 30 33 49 97
Door Stefan Colin · bijgewerkt op
Een klantvraag die u niet wilt afwijzen
U kent het moment. Uw klant vraagt of zijn webwinkel met de boekhouding kan praten. Of hij een portaal kan krijgen voor zijn eigen klanten. Het valt buiten wat uw team bouwt. Of uw team heeft er nu geen tijd voor.
Nee zeggen stuurt uw klant naar een ander. Ja zeggen zonder het waar te maken is erger.
Daar kom ik in beeld. U zegt ja, ik bouw het en u levert het op.
Wat u bij mij kwijt kunt
- Koppelingen. Twee pakketten die elkaar niet kennen. Orders, klanten, voorraad of afspraken die nu met de hand van het ene systeem naar het andere gaan. Meer op een API-koppeling laten maken.
- Maatwerk software. Een klantportaal, een interne tool of een module naast een bestaand systeem. Meer op maatwerk software.
- Vindbaarheid in Google en AI. De scan, de audit en de uitvoering, onder uw naam. Meer op white label SEO, met een voorbeeldrapport.
Elke opdracht heeft een begin, een eind en een vaste prijs vooraf. Zo weet u wat u uw klant kunt toezeggen.
Uw klant blijft van u
- U bent mijn opdrachtgever. Ik werk als onderaannemer. Ik factureer u en u factureert uw klant.
- Uw naam staat op het werk. Mijn naam en mijn merk staan niet in het rapport, de handleiding of de schermen. Ik noem de opdracht ook niet als referentie.
- U bepaalt wie de klant spreekt. Standaard bent u dat. Wilt u dat ik meekijk, dan doe ik dat namens u.
- Ik benader uw klant niet. Niet tijdens de opdracht en ook niet daarna. Benadert uw klant mij zelf binnen een jaar na afronding van de opdracht, dan hoort u dat van mij.
Twee sporen zijn technisch zichtbaar. Wie de code schreef, staat in de geschiedenis van de repository. Wilt u daar de naam van uw bureau, dan zet ik die bij de start in. En tijdens de bouw en de garantie staat mijn toegang in de toegangslijsten. Die haalt u daarna weg.
Deze afspraken staan in de offerte. Die gaat voor op mijn algemene voorwaarden.
Wat u bij oplevering krijgt
Alles staat vanaf de start op naam van uw bureau of van uw klant. Dat kiest u in de offerte. Er hoeft later dus niets over te gaan.
- De broncode met de volledige geschiedenis, in een repository op uw naam.
- Het schema van de database en de migraties.
- De hosting, de database en de back-up, ook op uw naam.
- De tests, met het commando waarmee ze draaien.
- Een handleiding voor wie ermee werkt.
- Een beheerbeschrijving: back-up, herstel en de weg terug naar de vorige versie.
- Een overdrachtsdossier. Welke keuzes er zijn gemaakt en waarom. Waar de geheimen staan. Wat er gebeurt als een gekoppeld pakket stopt.
Uw eigen ontwikkelaar kan er zonder mij mee verder. Zo staat het ook in artikel 13 van mijn voorwaarden.
Een overdrachtsdossier zoals uw klant het krijgt
Lees Voorbeeldbureau als de naam van uw eigen bureau. Begin bij hoofdstuk 12. De namen en metingen zijn verzonnen, de adressen eindigen op .example.
docs/overdrachtsdossier.md
Overdrachtsdossier: afsprakenkoppeling fietsenmakerij-molen.example
Voorbeeld van een overdrachtsdossier bij white label-werk. Het bureau, de fietsenmakerij, de adressen en de metingen zijn verzonnen. Alle adressen eindigen op .example, een extensie die nooit een echte site kan zijn. De opbouw volgt het vaste sjabloon van de werkwijze.
1. Wat dit document is
De afsprakenkoppeling is gebouwd, opgeleverd en in gebruik. Dit dossier legt vast wat u in handen heeft.
Het beschrijft waar de koppeling draait en welke gegevens erin staan. Ook hoe de back-up werkt en hoe u de koppeling bijwerkt of terugzet. Verder staan de besluiten erin, met de reden erbij. Zo kan iemand die er niet bij was het overnemen.
Dit dossier hoort bij de oplevering en is van u. Hoofdstuk 12 beschrijft hoe u zonder ons verder kunt.
2. Wat u heeft en wat van u is
De laatste factuur is op 12-8-2026 voldaan. Daarmee is het opgeleverde werk van de fietsenmakerij. Dat zijn de broncode, het databaseschema met de migraties, de tests, de handleiding en dit dossier.
- De broncode in de repository
fietsenmakerij-molen/afsprakenkoppeling, op naam van de fietsenmakerij, met de volledige geschiedenis vanaf de eerste regel. - De handleiding, 11 pagina’s, voor wie in de werkplaats de agenda bijhoudt.
- De beheerbeschrijving in
docs/beheer.md, voor uw ontwikkelaar. - Dit dossier.
3. Wat de koppeling doet
Een klant boekt op fietsenmakerij-molen.example een reparatie. De afspraak staat binnen een minuut in de werkplaatsagenda. De klant krijgt een bevestiging. De dag ervoor volgt een herinnering.
| Onderdeel | Voor wie | Wat het doet |
|---|---|---|
| Boeken | klanten | Het formulier op de site toont alleen tijden die nog vrij zijn in de agenda |
| Agenda | de werkplaats | Elke boeking komt als afspraak in de gedeelde agenda, met fiets, klacht en telefoonnummer |
| Bevestiging | klanten | Een mail met datum, tijd en een link om te verzetten of af te zeggen |
| Herinnering | klanten | Een mail om 17.00 uur de dag voor de afspraak |
| Dagoverzicht | de werkplaats | Om 07.30 uur een mail met de afspraken van vandaag, op volgorde |
In productie sinds 3-8-2026.
4. Waar het draait
| Wat | Waar | Waarom daar |
|---|---|---|
| De koppeling | Fly.io, regio Amsterdam | Dichtbij. De machine staat altijd aan, zodat een boeking nooit op een koude start wacht |
| De database | Neon, regio Frankfurt | Postgres binnen de EU. Houdt bij welke boeking al in de agenda staat |
| De agenda | Google Workspace van de fietsenmakerij | Daar werkte de werkplaats al mee |
| Uitgaande mail | de mailbox van de fietsenmakerij | De klant ziet de fietsenmakerij als afzender en een antwoord komt daar binnen |
Welke versie er draait, leest u af op https://afspraken.fietsenmakerij-molen.example/health. Daar staat het versienummer en het kenmerk van de code.
Hosting en database kosten samen ongeveer € 4 per maand. Die staan op de betaalkaart van de fietsenmakerij.
5. Wie waar bij kan
| Onderdeel | Staat op naam van | Beheerder |
|---|---|---|
| Repository | de fietsenmakerij | Voorbeeldbureau, tot het einde van de garantie |
| Hosting bij Fly.io | de fietsenmakerij | Voorbeeldbureau, tot het einde van de garantie |
| Database bij Neon | de fietsenmakerij | Voorbeeldbureau, tot het einde van de garantie |
| Google-agenda en de toegang daartoe | de fietsenmakerij | de fietsenmakerij |
| Uitgaande mail | de fietsenmakerij | de fietsenmakerij |
| Back-up (bucket bij R2) | de fietsenmakerij | Voorbeeldbureau, tot het einde van de garantie |
Niets staat op naam van het bureau of van iemand anders. Na de garantie haalt u onze toegang weg. Dat is per onderdeel één handeling, beschreven in docs/beheer.md.
De geheimen staan niet in de code en niet in dit dossier. Ze staan versleuteld bij Fly.io.
| Geheim | Waarvoor | Wanneer wisselen |
|---|---|---|
| DATABASE_URL | verbinding met de database | bij het einde van de garantie. Direct bij een vermoeden van misbruik |
| GOOGLE_SERVICE_ACCOUNT | schrijven in de werkplaatsagenda | bij het einde van de garantie |
| SMTP_USER, SMTP_PASS | uitgaande mail | bij een nieuw wachtwoord van de mailbox |
| FORMULIER_SLEUTEL | controle dat een boeking echt van uw site komt | bij het einde van de garantie |
6. Welke gegevens erin staan
| Soort gegeven | Over wie | Waarvoor | Hoe lang |
|---|---|---|---|
| Naam, e-mailadres, telefoonnummer | klanten die boeken | de afspraak en de mails | 90 dagen na de afspraak, daarna automatisch gewist |
| Merk en soort fiets, omschrijving van de klacht | klanten die boeken | de werkplaats weet wat er komt | 90 dagen na de afspraak |
| Tijdstip van boeken, verzetten en afzeggen | klanten die boeken | dubbele boekingen voorkomen | 90 dagen na de afspraak |
De agenda zelf bewaart wat u daar bewaart. De koppeling wist alleen haar eigen kopie. Het wissen na 90 dagen draait elke nacht om 03.00 uur. Een test boekt een afspraak van 91 dagen geleden en controleert dat die na de nachtelijke ronde weg is. Die test draaide op 14-8-2026 groen.
Wie de gegevens nog meer in handen krijgt.
| Leverancier | Waarvoor | Waar |
|---|---|---|
| Fly.io | de koppeling draait daar | Amsterdam |
| Neon | de database | Frankfurt |
| de agenda | de regio die uw Workspace gebruikt | |
| Cloudflare R2 | de versleutelde kopieën van de back-up | EU |
| GitHub | de nachtelijke back-uptaak; de kopie is daar even onversleuteld | buiten de EU, zie docs/BACKUP.md |
| Uw mailprovider | bevestigingen en herinneringen | volgens uw eigen afspraken met die provider |
Voorbeeldbureau verwerkt deze gegevens in uw opdracht. De bouwer die het bureau inschakelde, doet dat als subverwerker onder dezelfde afspraken. Wisselt er een leverancier, dan hoort u dat vooraf.
7. Back-up en herstel
| Wat | Hoe het staat |
|---|---|
| Hoe vaak | elke nacht om 01.17 uur UTC, via de workflow Back-up in de repository |
| Hoe lang bewaard | veertien dagen. De bucket ruimt zelf op en vergrendelt elke kopie zolang hij bewaard wordt |
| Waar | versleuteld in een bucket bij Cloudflare R2 op naam van de fietsenmakerij, in de EU |
| Controle | elke nacht direct na de kopie, met een echte hersteltest. Plus een waakhond die meldt als er 26 uur geen nieuwe kopie is |
De controle telt niet alleen of het bestand er is. Hij zet de kopie terug op een lege database en telt per tabel na of alles erin staat. Gaat er iets mis, dan krijgt de beheerder een mail. Op de eerste van de maand komt er ook een mail als alles goed is.
De laatste controle van 13-8-2026 was schoon. De hersteltest telde 212 boekingen, gelijk aan de database op het moment van de kopie.
Zelf terugzetten: bash scripts/backup/herstel.sh toont de kopieën. Daarna bash scripts/backup/herstel.sh <kopie> "<lege database>". Het script weigert een database die niet leeg is. Gebruik de directe verbinding en niet de pooler. De wachtwoordzin staat in de kluis van de fietsenmakerij, niet bij het bureau. De stappen en het oefenlog staan in docs/BACKUP.md.
8. Bijwerken en terugdraaien
De koppeling werkt niet zichzelf bij. Er verandert pas iets als iemand met de hand uitrolt. Dat is met opzet zo.
Uitrollen: fly deploy -a afsprakenkoppeling --build-arg GIT_SHA=$(git rev-parse HEAD). Controleer daarna /health. Een geslaagde uitrol bewijst dat de bouw lukte, niet dat de wijziging erin zit. Het kenmerk op /health bewijst dat wel.
Terugdraaien: fly releases -a afsprakenkoppeling, daarna de vorige versie opnieuw uitrollen. Geoefend op de proefomgeving op 1-8-2026. Van melding tot terug: vier minuten.
9. Hoe het gebouwd is en wat er gemeten is
Een SvelteKit-toepassing op een Postgres-database, met Drizzle voor het schema en de migraties. Gangbare keuzes. Een andere bouwer kan ermee overweg.
Gemeten op 14-8-2026, op de code in de repository:
| Meting | Uitkomst |
|---|---|
| Tests in de code | 126 groen, geen fouten |
| Tests die het formulier echt invullen in een browser | 18 groen, in Chromium en in WebKit, de motor van Safari |
| Migraties van de database | 3, op volgorde en compleet |
| Twee boekingen tegelijk op hetzelfde tijdstip | één komt erin, de tweede krijgt een ander tijdstip aangeboden |
| Agenda tijdelijk onbereikbaar | de boeking wacht en gaat er alsnog in, getest met een uitval van tien minuten |
| Beveiligde verbinding | afgedwongen, gemeten op de live koppeling |
| Opleverpoort | groen op alles wat mechanisch meetbaar was. Niet van toepassing: het demo-account, want klanten loggen niet in |
De tests draait u zelf met npm install en daarna npm run test. Daarvoor is Node 22 of nieuwer nodig. De eerste keer haalt npx playwright install chromium webkit de browsers op. De tests raken uw echte agenda niet; ze draaien tegen een proefagenda.
10. Besluiten en hun reden
| Besluit | Waarom | Heropenen als |
|---|---|---|
| Boekingen gaan via een wachtrij naar de agenda (jul.) | Is Google even niet bereikbaar, dan gaat er geen boeking verloren | nooit, dit is de kern |
| Klantgegevens na 90 dagen weg (jul.) | Voor een reparatie heeft u ze daarna niet meer nodig. Wat u niet bewaart, kan niet lekken | u garantie op reparaties langer wilt kunnen nagaan |
| Geen account voor klanten (jul.) | Een klant boekt één keer per jaar. Een wachtwoord houdt die klant tegen | vaste zakelijke klanten vaker gaan boeken |
| Mail vanuit uw eigen mailbox (aug.) | De klant herkent de afzender en een antwoord komt bij u | uw mailbox verhuist |
11. Waar het van afhangt
| Waarvan | Waarvoor | Wat als het stopt |
|---|---|---|
| Fly.io | de koppeling draait daar | Een standaard container. Die draait op elke andere aanbieder, met een nieuwe uitrol |
| Neon | de database | Gewone Postgres. De dagelijkse kopie gaat in elke Postgres terug |
| Google Agenda | de werkplaatsagenda | Boekingen wachten in de database. Een andere agenda koppelen is één module, beschreven in docs/beheer.md |
| Uw mailbox | bevestigingen en herinneringen | Boekingen gaan door, alleen de mails stoppen. Een andere mailbox is vier instellingen |
| Veertien softwarepakketten | formulier, agenda, mail, database | Allemaal open en gangbaar. De tests laten zien of een vervanger goed werkt |
Geen van deze partijen zit tussen u en uw gegevens. De kopie van vannacht leest elke Postgres.
12. Als u zonder ons verder wilt
Alles staat al op uw naam. Er hoeft niets over te gaan, behalve kennis.
- Uw eigen ontwikkelaar leest dit dossier en
docs/beheer.md. - De ontwikkelaar draait de tests met
npm run test. Groen betekent dat de eigen omgeving klopt. - Daarna één keer uitrollen en één keer terugdraaien, volgens hoofdstuk 8.
- U wisselt de geheimen uit hoofdstuk 5 en haalt onze toegang weg.
Dat is een middag werk voor iemand die SvelteKit kent. Wilt u daarbij een overdrachtsgesprek, dan plannen we dat in de laatste week van de garantie.
13. Na de garantie
De garantie loopt tot 3-11-2026. Werkt iets niet zoals de offerte beschrijft, meld het dan schriftelijk bij Voorbeeldbureau. Wij herstellen het kosteloos.
Daarna heeft u gekozen voor losse wijzigingen. U vraagt een wijziging aan en krijgt vooraf een vaste prijs. Er loopt niets door.
Vragen over dit dossier: support@voorbeeldbureau.example.
14. Wat er in de repository staat
src/de broncode van de koppeling en het formulier.tests/alle tests, zowel de code-tests als de browsertests.drizzle/het schema van de database en de drie migraties.docs/beheer, back-up, herstel, besluiten en de releasenotities.docs/handleiding/de handleiding voor de werkplaats, als pdf..env.examplewelke instellingen de koppeling nodig heeft, zonder waarden.
Wachtwoorden en sleutels staan er niet in. Daardoor draait de code niet zomaar tegen uw agenda. Dat is de bedoeling.
15. Toegankelijkheid: de vijf kerntaken
Het formulier staat op uw site en moet voor iedere klant werken, ook zonder muis, met een schermlezer en met een aangepast scherm. Gemeten op 14-8-2026, op de code in de repository.
| Kerntaak | Toetsenbord | VoiceOver | 200 procent | Reduce Motion | Verhoogd contrast | Donker |
|---|---|---|---|---|---|---|
| Eerste gebruik: een tijd kiezen | ja | ja | ja | ja | ja | ja |
| Inloggen | niet van toepassing, klanten hebben geen account | |||||
| Kernhandeling: gegevens invullen en boeken | ja | ja | ja | ja | ja | ja |
| Afronden: de bevestiging lezen en een afspraak verzetten | ja | ja | ja | ja | ja | ja |
| Instellingen: een afspraak afzeggen | ja | ja | ja | ja | ja | ja |
Elke taak is echt uitgevoerd: tabben tot het veld, typen, Enter. Daarna is gecontroleerd of de afspraak ook echt in de proefagenda staat.
Hoe ik het werk controleer
Ik bouw met AI. Wat ik oplever, kan uw eigen ontwikkelaar natoetsen, want de tests gaan mee. Daaronder zit mijn werkplaats.
- Een bouwraad van AI-specialisten. Dertien vaste rollen toetsen elke applicatie, van architect en beveiliger tot testmeester. Drie van die rollen kunnen de bouw stilleggen.
- Tests bij elke wijziging. Past er iets aan, dan draaien alle tests opnieuw.
- Controles die geen AI zijn. Vaste scripts meten de oplevering na. Zo keurt het model zijn eigen werk niet goed.
Ik geef akkoord op de blauwdruk, het ontwerp en de livegang. Ik teken voor het resultaat. Wat dat oplevert, ziet u in de demo: een werkende app met verzonnen gegevens. Meer over de werkplaats staat op Over mij.
Werkt u zelf met ontwikkelaars? Laat hen bij de oplevering de tests draaien. Dat zegt meer dan deze pagina.
Na de oplevering
Op het werk zit drie maanden garantie. In die tijd bent u het aanspreekpunt voor uw klant en ben ik dat voor u. Uw klant meldt het bij u, u meldt het schriftelijk bij mij. Ik reageer binnen één werkdag. Werkt iets niet zoals de offerte beschrijft, dan herstel ik het kosteloos.
Na de garantie kiest u. Die keuze staat al in de offerte.
- Overdracht. Uw eigen ontwikkelaar neemt het over met het dossier.
- Losse wijzigingen. U vraagt een wijziging aan en krijgt vooraf een vaste prijs. Er loopt niets door.
- Geplande aanpassing. Verandert een gekoppeld pakket, dan pas ik de koppeling aan. Ook tegen een vaste prijs vooraf.
Heeft uw bureau geen eigen ontwikkelaar, dan zijn losse wijzigingen de gewone weg.
Hoe een opdracht loopt
- U stuurt één klantvraag. Zonder de naam van uw klant, als u dat wilt. Ik reageer binnen één werkdag.
- Binnen twee werkdagen krijgt u een oordeel. Schriftelijk: past het, wat is het risico en welke vorm werkt.
- U krijgt een offerte. Met een vaste prijs, een doorlooptijd en de afspraken over uw klant.
- Ik bouw. Tussendoor ziet u werkende stappen, geen tekeningen.
- Oplevering op uw naam. Met de tests, de handleiding en het dossier.
- Drie maanden garantie. Via u, zoals hierboven.
Veelgestelde vragen
Is dit ook white label?
Ja, in de breedte: koppelingen, maatwerk software en vindbaarheid, onder de naam van uw bureau. Uw klant ziet alleen uw bureau. Voor vindbaarheid specifiek staat alles op white label SEO.
Kan mijn ontwikkelaar uw werk controleren?
Ja. Op verzoek krijgt u elk blok als pull request in de repository op uw naam of die van uw klant. Uw ontwikkelaar kan het lezen en goedkeuren voordat er iets in gaat. De tests gaan altijd mee, zodat uw team ze zelf kan draaien. Dat is het verschil met vibe coding, waar niemand de code leest. Werkt u met pull requests, dan spreken we in de offerte af hoe snel uw ontwikkelaar reageert. Blijft een blok langer liggen, dan schuift de opleverdatum mee.
Wat gebeurt er als Softwarewerkplaats wegvalt?
Dan kan een andere ontwikkelaar verder. Bij Softwarewerkplaats staat alles op naam van uw bureau of uw klant. De tests, de handleiding en het dossier horen erbij. Niets hangt aan de computer of de accounts van Stefan Colin.
Wat ziet mijn klant van u?
Mijn naam en mijn merk ziet hij niet in het werk. Wel blijft er een spoor: de geschiedenis van de repository, tenzij daar de naam van uw bureau in staat. Bij vindbaarheid ligt dat anders. Dat leest u op white label SEO.
Gaan de gegevens van mijn klant door een AI-model?
Nee. Ik bouw en test met verzonnen gegevens. Echte gegevens over personen komen alleen in de omgeving op naam van uw klant. Gebruik ik ze toch bij het bouwen, dan spreken we dat eerst schriftelijk af. Zo staat het in artikel 18 van mijn voorwaarden. De naam, het logo en de kleuren van uw klant zijn geen persoonsgegevens. Die levert u aan en ik zet ze in de instellingen.
Welke beveiligingsnorm houdt u aan?
Ik bouw volgens de OWASP ASVS, de internationale norm voor applicatiebeveiliging. Samen met de AVG geeft dat 28 eisen, elk met een meting. Bijvoorbeeld: wachtwoorden gehasht met argon2id en rechten per gegeven gecontroleerd op de server. Wil uw klant een onafhankelijke pentest, dan spreken we die vooraf af in de offerte.
Hoe zit het met toegankelijkheid?
WCAG 2.2 niveau AA is mijn ondergrens. Bij elke browsertest draait een automatische meting mee. Daarnaast test een aparte ronde elk scherm met alleen het toetsenbord. De belangrijkste taken gaan ook langs een schermlezer.
Van wie is de code?
Na betaling van u. Of rechtstreeks van uw klant, dat kiest u in de offerte. Zo staat het in artikel 12 van mijn voorwaarden.
Tekent u onze geheimhoudingsverklaring?
Geheimhouding geldt al voor beide kanten, ook na afloop (artikel 17). Uw eigen verklaring lees ik graag. Staat er een boete of een onbeperkte aansprakelijkheid in, dan spreken we die eerst samen af.
Werkt u ook voor softwarebureaus?
Ja, voor een koppeling of een module naast uw eigen product. Uw ontwikkelaars kunnen bij de oplevering de tests zelf draaien.
Wat kost het?
Elke opdracht krijgt een vaste prijs vooraf. Die staat in de offerte, die volgt op het oordeel over uw klantvraag. Wil uw klant onderweg iets anders, dan krijgt u eerst een prijs voor dat meerwerk. Zo blijft uw marge staan.
Kunt u de opleverdatum van mijn klant halen?
Dat hoort u in het oordeel, voordat u iets toezegt. Past de datum niet, dan zeg ik dat. Liever nu dan na de handtekening.
Stuur één klantvraag
Stuur één klantvraag, zonder de naam van uw klant als u dat wilt. Ik reageer binnen één werkdag. Binnen twee werkdagen hoort u of ik hem kan dragen. Een nee hoort u ook, voordat u uw klant iets belooft.
de volgende stap
Welke klantvraag ligt er nu bij u?
Stuur hem zoals uw klant hem stelde, zonder naam als u dat wilt. Past hij niet, dan hoort u dat voordat u uw klant iets belooft.
Stuur één klantvraagof bel 06 30 33 49 97
verder op deze site