Hulpmiddelen voor ontwikkelaars

De kleine klusjes die een middag onderbreken: een JWT die gelezen moet worden, een payload die leesbaar moet worden, een tekst die een query moet overleven. Elk hulpmiddel hier rekent op de pagina waar je al bent — en daar gaat het om, want wat een ontwikkelaar in zulke velden plakt is meestal precies wat nooit van zijn machine had mogen komen.

19 hulpmiddelen

  • JSON opmakenIemand heeft een muur JSON op één regel gekregen — een API-antwoord, een logveld, een blok configuratie — en moet de structuur zien voordat er iets mee kan.
  • Base64 decoderenIemand heeft een reeks tekens voor zich die op brabbeltaal lijkt en moet weten wat er staat — een JWT, de waarde uit een Kubernetes-secret, een logregel — zonder die aan een onbekende te geven.
  • Unix-timestamp omzettenIemand ziet een getal van tien of dertien cijfers in een logregel, in een databasekolom of in een JSON-payload en moet weten welk moment dat aanwijst, en in welke zone.
  • JSON controlerenIets weigert iemands JSON zonder te zeggen waarom, en die persoon heeft de regel en de kolom nodig van de eerste plek waar het vastloopt.
  • Base64 coderenIemand moet een tekst ergens in krijgen waar die zo niet wordt aangenomen: een data-URI, een Basic Auth-header, een JSON-veld dat een transport moet overleven met eigen opvattingen over welke bytes mogen.
  • SHA-256-hash makenIemand heeft de SHA-256 van een tekst nodig — een integriteitswaarde, een vingerafdruk om te vergelijken, een vaste afgeleide sleutel — en wil het antwoord dat vandaag nog klopt.
  • URL coderenIemand bouwt met de hand een URL — een parameter met spaties of ampersands, een doorstuurdoel dat als waarde in een ander adres moet overleven — en moet weten welke tekens ontsnapt moeten worden en welke juist niet.
  • UUID-generatorIemand heeft nu meteen een of meer identifiers nodig — voor een set testgegevens, een migratie, een configuratiebestand — en wil daar geen terminal voor openen.
  • MD5-hash makenIemand heeft de MD5 van een tekst nodig — om te vergelijken met een waarde in een database, om een cachesleutel na te bouwen, of voor een oude koppeling die er nog op draait.
  • URL decoderenIemand leest een URL uit een logbestand, uit een export van een statistiekpakket of uit een foutmelding, en het interessante deel ligt begraven onder procentreeksen.
  • HTML-entiteiten coderenIemand zet tekst op een pagina die hij niet zelf heeft geschreven — een reactie, een productomschrijving, een stuk voorbeeldmarkup — en wil dat tekens die anders tags worden gewoon tekens blijven.
  • HTML-entiteiten decoderenIemand heeft tekst voor zich waar in plaats van de tekens hun ontsnappingsvormen staan — uit een databaseveld, uit een RSS-feed, uit de export van een scraper — en wil lezen wat er werkelijk staat.
  • JSON verkleinenIemand wil opgemaakte JSON terug op één regel, omdat het in een omgevingsvariabele, in een databaseveld of door een kanaal moet waar elke byte telt.
  • SHA-1-hash makenIemand moet een SHA-1 maken omdat iets anders daarom vraagt — een Git-object, een oud handtekeningschema, een koppeling van vóór 2017 — en niet omdat het een keuze was.
  • URL ontledenIemand heeft een lang adres voor zich en moet de onderdelen los zien — host, poort, pad, query, fragment — in plaats van ze uit het hoofd te tellen.
  • Hex coderenIemand moet de bytes zien die onder een tekst zitten — voor een protocol, om een dump te vergelijken, voor een veld dat hexadecimaal verwacht — en met de scheidingstekens die zijn gereedschap leest.
  • Hex decoderenIemand heeft een hexdump uit een logbestand, uit een netwerkopname of uit een foutmelding en wil weten welke tekst daarachter zit.
  • Querystring ontledenIemand heeft een query string vol trackingparameters en wil één regel per parameter, met gedecodeerde waarden en zonder dat herhaalde sleutels verdwijnen.
  • UUID controlerenIemand heeft een identifier voor zich en moet weten of het een goed gevormde UUID is, en welke versie en variant die opgeeft.

Waarom «draait lokaal» hier geen smaakkwestie is

Wat mensen in een Base64-decoder plakken, op volgorde van hoe vaak: een JWT, een Basic Auth-header, de payload van een webhook, een configuratiebestand. Drie van de vier zijn inloggegevens of bevatten ze. Een pagina die dat op een server decodeert heeft ze gezien, en heeft ze in haar verzoeklogboek staan, of iemand dat nu wilde of niet.

Dat is geen theoretisch bezwaar. Het is de reden dat dit hele genre website bij veel bedrijven op de proxy geblokkeerd staat, en dat er waar dat niet zo is meestal een beleidsregel bestaat die niemand leest. Alles op deze pagina is rekenwerk dat een browser zelf kan; het ergens anders laten doen is een keuze, en het is de verkeerde.

Wat er precies in de browser blijft, en wat niet

De pagina is statische HTML van een CDN. Bij de eerste toetsaanslag laadt een kleine module JavaScript, één keer en daarna uit de cache, en het werk gebeurt in jouw tabblad. Geen enkel verzoek draagt wat je hebt getypt, en dat controleer je in het netwerktabblad in plaats van het van ons aan te nemen.

Twee eerlijke grenzen. De pagina zelf is een verzoek, dus dát je hier was is voor ons en voor je netwerk wel zichtbaar. En de site draagt advertenties en, als je toestemt, statistiek: geen van beide ziet de inhoud van een tekstveld, maar allebei zijn het verzoeken naar derden. Het verschil is dat tussen wat je typt en het feit dat je hier bent: het eerste beweegt nooit, het tweede noodzakelijkerwijs wel.

Wat dit betekent voor de AVG

Als de gegevens het apparaat niet verlaten, is er geen verstrekking aan ons en dus ook geen verwerking in onze opdracht van wat je plakt. Dat is in de praktijk het beslissende punt zodra er een klantrecord, een supportbericht of een payload met persoonsgegevens in het veld staat, en het is de reden dat deze hulpmiddelen bruikbaar zijn waar een serverversie dat niet zou zijn.

Wat er wel gebeurt staat in de privacyverklaring en wordt hier niet mooier gemaakt: het bezoek, de advertentie- en statistiekverzoeken, de toestemming. Dat één hulpmiddel lokaal rekent maakt de hele site niet neutraal — het haalt alleen het zwaarste deel eraf.

Eén vraag per pagina, geen keuzelijst

Eén pagina die Base64, URL en HTML in beide richtingen achter een keuzelijst zou afhandelen, zou minder pagina’s zijn en slechter. Coderen en decoderen gaan op verschillende manieren mis, worden verschillend uitgelegd en verschillend gezocht: wie een kapotte procentreeks voor zich heeft en wie een query aan het bouwen is, hebben elkaar bijna niets te vertellen.

Daarom heeft elke richting een eigen pagina, met de fouten die erbij horen: wat je doet als Base64 uiteenvalt in bytes die geen tekst zijn, waarom `encodeURIComponent` het uitroepteken laat staan en wat dat met een OAuth-handtekening doet. Zo ontstaat een pagina die het lezen waard is, en dat kan alleen omdat ze niet zes doelgroepen tegelijk bedient.

Ze werken zonder verbinding

Zodra de pagina van een hulpmiddel geladen is, gebeurt alles lokaal: het werkt in de trein, in een vliegtuig en achter een bedrijfsproxy die het domein een uur later blokkeert. Er wordt geen service worker geïnstalleerd en er valt niets in te stellen; een pagina die nooit naar buiten belt heeft eenvoudigweg niets te verliezen wanneer de verbinding dat wel doet.

In de praktijk betekent dat dat deze hulpmiddelen juist werken in de situaties waarin een onlinehulpmiddel de verkeerde keuze zou zijn: op een machine van iemand anders, op een netwerk dat je niet vertrouwt, met gegevens die je eigenlijk niet zou moeten verplaatsen. Daar zijn ze voor gemaakt.

Geen account, geen limiet, geen watermerk

Er valt niets te registreren omdat er niets te beheren is. De hulpmiddelen bewaren niets tussen twee bezoeken: het tabblad sluiten wist wat je had getypt, want het bestond nergens anders dan in dat tabblad.

Er is ook geen limiet op de hoeveelheid, en niet uit vrijgevigheid: wij betalen niets voor jouw rekentijd, dus er valt niets te rantsoeneren. Het enige plafond is hoeveel tekst je eigen browser in een veld wil vasthouden.

Waarom de vaktermen Engels blijven

Op deze pagina’s staat payload, token, hash, query string en Base64 — geen «nuttige lading», geen «samenvatting», geen «bevragingsreeks». Dat is geen gemakzucht: het is de taal waarin Nederlandse teams hierover praten en waarin ze ernaar zoeken.

Waar het gewone woord Nederlands is, staat het Nederlandse woord er: checksum, tijdstempel, teken, tabblad, inspringing, trema. De regel is niet «zo veel mogelijk Nederlands», maar «het woord dat in het gesprek valt»; iets anders levert een keurig vertaalde pagina op die niemand vindt.

Wat hier met opzet ontbreekt

Er is geen opmaker voor HTML, CSS of JavaScript, en dat is een besluit en geen gat. Een goede heeft een echte parser nodig; de bibliotheken die daarvoor bestaan wegen meerdere megabytes en zouden een eigen licentie- en laadtijdbeslissing zijn, en een zelfgebouwde sloopt invoer in stilte. De JSON-opmaker is alleen ongevaarlijk omdat die parser al in de browser zit.

Er ontbreekt ook een voorbeeldweergave voor Markdown of HTML. Allebei zouden betekenen dat er vreemde HTML binnen deze pagina wordt gerenderd, en dat is precies wat de pagina voor HTML-entiteiten decoderen met argumenten weigert, omdat zo’n parser netwerkverzoeken kan uitlokken. Een argument dat op de ene pagina geldt, kun je op de volgende niet negeren.

Hulpmiddelen voor ontwikkelaars: veelgestelde vragen

Wordt wat ik plak naar een server gestuurd?

Nee. Elk hulpmiddel in deze sectie rekent op de pagina zelf, en het netwerktabblad is de manier om dat te controleren in plaats van te geloven. De pagina komt van een CDN en de site draagt advertenties, dus er zijn verzoeken: geen daarvan draagt de inhoud van een tekstveld.

Zit er een grens aan hoeveel tekst ik kan plakken?

Alleen wat je eigen machine aankan. Er wordt niets in een wachtrij gezet, geteld of begrensd, want er is geen server die het werk doet en dus iets zou kunnen tellen. Bij zeer grote invoer denkt het tabblad even na: dat is het enige plafond.

Heb ik een account nodig?

Nee, en er valt ook nergens op in te schrijven. De hulpmiddelen onthouden niets tussen twee bezoeken: het tabblad sluiten wist wat je had getypt, want het bestond nergens anders.

Mag ik dit met gegevens van mijn werk gebruiken?

Dat bepaalt jullie beleid, maar het technische antwoord is dat de gegevens de machine niet verlaten, en dat is precies waar zulk beleid meestal over gaat. Moet je het aantonen in plaats van beweren: open het netwerktabblad terwijl je het gebruikt, er valt niets te laten zien.

Waarom zit er geen downloadstap vóór het resultaat?

Omdat er geen bestand is. Het resultaat is tekst op de pagina, klaar om te selecteren en te kopiëren, en er zou niets gewonnen zijn met een knop ertussen. Waar een hulpmiddel wél een bestand maakt, staat de download aan het eind en niet als drempel ervoor.