Log in
Seblog.nl

Seblog.nl

Toetsenborden: Colemak voor Nederlands

Dit is onderdeel van een serie over toetsenborden, zie het eerste deel voor een overzicht.

Eergisteren vertelde ik over hoe ik overstapte van Qwerty op Colemak en weer terug en weer terug. Nou ja, terug. Momenteel gebruik ik dus Qwerty op mijn Apple toetsenborden (inclusief die in mijn MacBook) en Colemak op de Moonlander. Maar niet helemaal Colemak, daar ga ik het vandaag over hebben.

Het probleem met een efficiënte toetsenbordindeling met compromissen zoals Colemak, is dat er altijd andere compromissen te maken zijn. Vrij veel bronnen over Colemak vertellen je direct over het bestaan van ‘Colemak Mod-DH’. Voor het gemak, hier is Colemak, met wat ruimte om duidelijker te zien welke vinger wat moet doen:

Q W F P G   J L U Y ;
 A R S T D   H N E I O
  Z X C V B   K M , . /

Bij Colemak zie je dat de D en de H te verkrijgen zijn door de wijsvinger zijwaards te bewegen. Dit komt voort uit het principe dat de middelste rij het gemakkelijkste te bereiken is. Niet iedereen was het daar mee eens: de zijdelingse verplaatsing is wat onhandig. Mod-DH verplaatst de D en H naar de locatie van de V en de M, om zo net wat efficiënter te zijn, ten kostte van wat meer verschuivingen.

Nou ja, dacht ik toen ik het las: dat is optimaler voor Engels, maar dat hoeft niet per se waar te zijn voor Nederlands. En standaard Colemak is al beter dan Qwerty, dus laat ik dat gewoon doen. Maar dat is dus wel een punt: voor Engels, voor Nederlands…

Problemen voor het Nederlands

Eén van de problemen waar ik al snel tegenaan liep, is dat Colemak bepaalde letters enorm ‘straft’, die voor het Nederlands niet eens op zo’n heel gekke plek zaten op Qwerty. Het meest in het oog springend is de J, wat in het Engels gek genoeg de minst voorkomende letter van het alfabet is.

De J krijgt (zoals je hierboven zag) de linker bovenhoek van de rechterhand. Nou zit ik inmiddels op een columnar layout met de Moonlander (zoals gister uitgelegd), dus daarmee is het effect iets minder erg, maar het is nog steeds best wel een enorme uithoek van het toetsenbord. Daarnaast krijgt de Y (in het Nederlands de twee-na-zeldzaamste) een toppositie.

Zie Colemak bovenin en zoek het in het Nederlands toch behoorlijk veelvoorkomende achtervoegsel ‘-lijk’. Drie van de letters moet je typen met dezelde wijsvinger, en geen van die drie zit op de middelste ‘home-row’ rij. Ik kreeg hier gewoon echt een beetje pijn van in mijn hand. (Zoek ‘m ook even op op Qwerty: zie? Daar zit '-lijk' eigenlijk heel lekker in een driehoekje.)

Aanpassingen voor Nederlands

In stijl van Colemak heb ik dus een paar aanpassingen gedaan toen ik opnieuw begon met het gebruiken van de Moonlander. Ik wilde heel graag de R en S weer terug omdraaien, want ik vind dat een heel gekke aanpassing in Colemak, maar ik merkte dat dit al best diep in mijn muscle memory zat, dus ik heb die zo gelaten.

q w d p f   y h u l ;
 a r s t g   k n e i o
  z x c v b   j m , . /

De ‘-lijk’ is nog steeds niet optimaal, maar in elk geval al een stuk beter. Ik was over het algemeen best tevreden met deze layout en ben tot ongeveer 72 woorden per minuut gekomen, wat ik acceptabel en ook werkbaar voor werk vindt.

Full disclosure is wel dat ik veel met Vim werk en dus de maffe designoverweging heb meegenomen dat HJKL pijltjestoetsen kunnen zijn. In deze layout staat H netjes links van L en K netjes boven J.

Als je dit zelf wil proberen is het goed om te bedenken dat ik dit allemaal niet in software op mijn Mac oplos. De Moonlander is een ‘programmable keyboard’, wat wil zeggen dat je elke knop iets anders kan laten doen als je dat wil. Ze hebben daar een heel makkelijke website voor, waar je zelf die toetsen kan instellen en op je toetsenbord kan zetten.

Dit maakt dus dat mijn Mac gewoon denkt dat ik op Qwerty typ, terwijl stiekem alle toetsen op een andere plek zitten. Dit betekent ook dat ik mijn Moonlander in elke laptop of tablet kan pluggen en dan gewoon mijn eigen layout heb. Dat maakt zo’n persoonlijke layout ook bruikbaar: ik neem mijn eigen handen en eigen toetsenbord mee.

Maar goed, ik moet dus bekennen dat ik dit alweer niet meer gebruik. Inmiddels ben ik bezig een andere knotsgekke zelfgemaakte layout te leren, maar meer daarover later deze week in een eigen blogpost. Als je geïnspireerd bent om af te stappen van Qwerty, kijk ook naar die post, maar Colemak is wel veel makkelijker om mee te beginnen vanuit Qwerty, of kijk naar Minimak voor zelfs nog minder wijzigingen.

Toetsenborden: over split, staggered en columnar

Dit is onderdeel van een serie over toetsenborden, zie het eerste deel voor een overzicht.

Kijk, ‘staggered’ verwijst naar een eigenschap van het toetsenbord dat je waarschijnlijk al kent. Als je naar een standaard toetsenbord kijkt, zie je dat elke rij net een beetje schuin staat ten opzichte van de rijen erboven en eronder. Sterker nog: geen enkele rij staat precies gelijk aan een ander (meestal). Dit is nuttig, omdat er onder elke toets een balkje zit, die beweegt zodra je erop drukt. Deze balkjes duwen dan vervolgens een hamertje op het papier, zodat letters verschijnen – wacht, dit klopt al een tijdje niet meer.

Deze erfenis van typemachines noemen ze een ‘row staggered layout’ of dus gewoon ’staggered’. Het hoeft technisch gezien helemaal niet meer, maar onze handen zijn eraan gewend en iedereen leert het zo, omdat het nu eenmaal zo is zoals het is.

q w e r t y u i o p
 a s d f g h j k l ;
  z x c v b n m , . /

Het idee van tien-vingerig typen – een techniek die ik zelf niet altijd helemaal goed toepas – is dat je elke vinger een eigen rij aan letters geeft. Zet je wijsvingers op de F en de J (daar zitten ook kleine bobbeltjes op) en vanuit daar vallen je vingers precies juist. Zoals gister besproken heeft Colemak net wat nuttigere letters direct onder je vingers hier, maar ook voor Qwerty is dit de way to go.

Maar als je toch elke vinger een aparte rij toewijst, waarom die rijen dan niet gewoon recht onder elkaar zetten? In het diagrammetje hieronder heb ik maar gelijk even een split toegepast, voor het overzicht.

q w e r t   y u i o p
a s d f g   h j k l ;
z x c v b   n m , . /

Dit was voor mij het moment waarop erachter kwam dat ik de B al jaren met de verkeerde hand typ (en nu waarschijnlijk nog steeds wel eens op mijn normale toetsenbord).

Deze rangschikking van toetsen in een grid heet ortholiniair en hoewel het even wennen is, denk ik wel dat dit een betere rangschikking is, omdat het meer de correcte tienvingerigheid van het typen onderstreept. De split in de diagram is trouwens optioneel: je hebt deze dingen ook in één groot blok.

Zoals gezegd heb ik dus de Moonlander gekocht, en als je goed kijkt zie je dat de toetsen op dat ding niet in een perfecte grid staan, maar juist steeds een beetje opschuiven per kolom (in plaats van per rij) zodat ze meer gelijk lopen met de manier waarop je vingers ook niet allemaal even lang zijn. Dit heet ‘column stagger’ of ‘columnar’, want alle toetsen schuiven op per kolom, niet per rij.

Na wat wennen en verfijning van mijn smaak vind ik de column stagger van de Moonlander niet sterk genoeg. Gelukkig is er zoiets als een ‘aggressive column stagger’, maar daar kom ik later deze week nog op terug.

O, ik zou ook nog iets zeggen over split. Nou ja: het geeft je vooral je een betere positie in je schouders. Ik merk het niet enorm, maar het is wel lekker, en ik ben natuurlijk ook vaak weer op mijn oude toetsenbord te vinden. Een kop koffie tussen je toetsenbord hebben staan is een beloning op zichzelf.

Dank voor het lezen van deze spreekbeurt. Misschien is deze video ook leuk, met voorproefje van wat er nog komt (minder toetsen). Morgen gaan we verder met Colemak voor het Nederlands.

Toetsenborden: dag Qwerty, hoi Colemak

Dit is onderdeel van een serie over toetsenborden, zie het eerste deel voor een overzicht.

Toen ik destijds de Moonlander bestelde was er een wachttijd van ongeveer vier weken. Het is een columnar split toetsenbord, en zo’n beetje elk Youtubefilmpje en blogpost die ik erover zag of las zei dat je ‘helemaal opnieuw moest leren typen’ op dit toestenbord, omdat de toetsen allemaal net een beetje zijn verschoven. (Morgen meer over columnar en split.)

Wat ik ook zag is dat veel mensen die herstart aangrijpen om daarwerkelijk een ander toetsenbordlayout te leren. Columnar is efficiënter, waarom dan niet ook gelijk iets efficiënters pakken dan het aloude Qwerty? Hoewel ik al jaren op de hoogte was van het bestaan van Dvorak, koos ik voor Colemak, om redenen.

Over Qwerty

Er gaat een mythe rond over Qwerty dat het ontworpen is om mensen slomer te laten typen, zodat de hamertjes in de typemachines niet vast kwamen te zitten. Ik zou zeggen dat dat meer waar is voor het niet-columnar aspect van het toetsenbord, maar daarover dus morgen meer. Qwerty is ontstaan uit een piano-toetsenbord met twee rijden, ABC tot en met LMN en daaronder M tot en met YXZ. Weet je, ik praat gewoon dit filmpje na, en een ander die ik nu niet meer terug kan vinden.

A B C D E F G H I J L M N
 . Z Y X W V U T S R Q P O

Je kunt stiekem nog best veel heen-en-weer alfabet terugvinden in Qwerty als je goed kijkt:

Q W E R T Y U I O P
 A S D F G H J K L ;
  Z X C V B N M . , /

Wat het filmpje ons vooral leert, is dat typen destijds een vak was, dat geleerd moest worden via een cursus. Het ontwerp van het toetsenbord ging dus vooral in eerste instantie over wat het beste was, maar daarna slechts over wat het meest gebruikt wordt. (Hallo Whatsapp.) Inmiddels hebben we Qwerty omdat we Qwerty hebben.

Een beter alternatief als Dvorak (niet de componist Dvořák) bestaat al sinds 1932, maar toch is Qwerty de standaard gebleven. Ik koos echter voor mijn nieuwe layout voor Colemak, die Qwerty als basis neemt en slechts enkele verbeteringen daarop doorvoert.

Q W F P G J L U Y ;
 A R S T D H N E I O
  Z X C V B K M , . /

De hele onderste rij blijft vrijwel hetzelfde, maar verder probeert het veelgebruikte letters, zoals klinkers en N, T, R en S, in het midden te plaatsen. Het idee is dat je daardoor niet de hele tijd je vingers hoeft te verplaatsen: als je je handen in het midden legt zijn de letters die je zoekt waarschijnlijk al direct onder één van je vingers te vinden.

Lessen van het overstappen

Eén van mijn eigen fouten bij het leren van dit nieuwe layout: ik dacht dat ik gelijk overal moest overstappen op Colemak. Ik ging dus nog voor mijn Moonlander binnen was (als voorbereiding) aan de slag met overstappen op al mijn toetsenborden, dus het Apple toetsenbord en ook de iPad. Het ging wel, maar ik was van de een op de andere dag een héél slome typer.

Wat ik mezelf met terugwerkende kracht meer zou aanraden, is om even te wachten tot de Moonlander er is. De mechanische switches van de Moonlander, maar vooral ook de split en de positie van de toetsen maken dat het ding heel anders aanvoelt dan mijn Apple toetsenbord. En gek genoeg onthouden mijn vingers dat.

Na een tijdje ging het namelijk gewoon niet meer. Ik moet voor werk gewoon veel dingen typen, en opeens maar 35 woorden per minuut kunnen produceren is dan best onhandig op sommige momenten. Mijn collega was ook eens overgestapt, en weer teruggegaan, dus interessant doen ging me ook niet redden. Uiteindelijk heb ik mijn Apple Magic Keyboard weer gepakt en ben ik net zo lang typing tests gaan doen tot ik Qwerty weer terug had (spoiler alert: dat gaat best snel, maar ook al mijn slechte gewoontes waren terug).

Toen ik maanden later weer eens de Moonlander aanraakte merkte ik dat Colemak nog steeds best wel enorm in mijn vingers zat, zelfs al was ik alweer maanden aan het typen (met de slechte gewoonten) op Qwerty. De moraal van dat verhaal is dus dat een toetsenbord met een andere feel best een andere layout kan hebben en dat je muscle memory dat prima bijhoudt. Ik typ nu Qwerty op mijn MacBook zelf en Colemak op de Moonlander, en dat is veel beter vol te houden als je af en toe een lap tekst moet produceren (zoals deze).

Bij het terugkeren naar Colemak heb ik wel een paar wijzigingen doorgevoerd, waarover overmorgen meer, want ik moet jullie morgen al over columnar en splits vertellen.

Seb doet toetsenborden

Het begon allemaal bij een foto die ik zag op een Discord-server. Ik ben al jaren (tien, ongeveer) een trouw gebruiker van de ingebouwde MacBook toetsenborden en de Magic losse varianten die Apple daarvan verkoopt. Daarmee dus ook Qwerty, de rechtopstaande Enter, en de §/±-knop, die ideaal is voor je eigen sneltoetsen, omdat er geen enkele standaard toetsencombinatie is die die knop gebruikt.

Maar het begon dus bij die foto, met daarop de Moonlander van ZSA. (Had ik al gezegd? Klikken en/of deze serie lezen is op eigen risico.) Het was het begin van een lang konijnenhol naar beneden (?) waar ik, met tussenpauzes, steeds dieper in terecht ben gekomen. Ik ga er de komende week over bloggen, want het is gewoon te veel om in één blog te beschrijven.

Wat ik hier in elk geval alvast kan verklappen, is dat ik de Moonlander heb aangeschaft, in gebruik heb genomen, weggelegd heb, weer in gebruik heb genomen en op het punt sta om hem weer weg te leggen. Dit is hoe je zo’n konijnenhol induikt: in stapjes.

Meer info over deze reis dus komende week. Hier een overzicht van de delen:

Bij wijze van vanantie naar een onbekende Albert Heijn gegaan. Kan ik iedereen aanraden, alles wat je kent maar dan op een andere plek.

Je komt wel met meer zooi thuis die je anders nooit koopt.

Altijd alles kwijt zijn is vervelend, maar een idee hebben, opstaan, naar die ene onlogische plek lopen en daar inderdaad vinden wat je zocht vind ik stiekem ook best eng.

Advent of Code

Ik was dus bezig met Advent of Code maar ben uitgevallen na dag 12. Het is de eerste keer dat ik meedoe (collega was erg enthousiast) en ik had mezelf direct al een moeilijkheid gegeven van elke dag in een andere programmeertaal te werken. Maar na 12 dagen werd ik wel een beetje tureluurs van DuckDuckGoën hoe je een bestand moet inlezen in weer een andere taal. De laten waren nog niet op, ik had nog tot dag 18 aan talen klaar staan, met een nog veel langere lijst aan ideeën voor meer talen.

Dus vooralsnog ben ik gebleven bij de volgende 12 talen.

1. C

De eerste dag was makkelijk en ik herkeek colleges over C dus ik dacht, waarom niet. Beetje mezelf makkelijk van af gemaakt door niet zelf de file in te lezen maar hem in een #define te stoppen.

2. Elixir

Hier ben ik best bedreven in, dus deze was makkelijk. Hier hoefde ik ook nog niet op te zoeken hoe je een bestand opent want dat weet ik gewoon uit mijn hoofd. Het was ook een goede opdracht voor pattern-matching, dus Elixir leek me een prima keuze ervoor.

3. PHP

Dit is mijn 'moedertaal' als het om programmeertalen gaat, dus ook hier viel het nog allemaal best mee. Ik heb de oplossing ook ontzettend procedureel opgeschreven.

4. Ruby

Op een of andere manier kreeg ik heel erg Sandi Metz vibes toen ik deze opdracht las, dus daarom niet gewoon Ruby? Ruby is een taal die tegenwoordig een slechte naam heeft ('sloom', 'magic', 'onduidelijk'), maar ik vind het wel een heel vriendelijke taal.

5. Rust

Dit is een van de langere stukken code, gewoon omdat je veel meer zelf moet doen in Rust. (In C ook, maar zoals gezegd, de eerste dag was vrij simpel, en ik speelde vals.) Ik heb de uiteindelijke oplossing achteraf zelfs nog een stukje opgeruimd, qua code. Dit was niet de eerste keer dat ik me in Rust verdiepte, maar ik merk dat ik dankzij de colleges over C en assembly meer achtergrond had voor waarom bepaalde dingen werken zoals ze werken. Was erg interessant, eigenlijk wil ik meer van de problemen hierin doen.

6. Javascript

Dit was een maandag en ik had weer even een taal nodig die ik goed kende. Vooral in mijn oplossing voor deel 1 vond ik mezelf erg grappig (een Fish object met een anotherDayInTheLife() method die soms een kind returnt), maar helaas moest dat allemaal kapot voor deel 2.

7. Go

Ooit heb ik geprobeerd een go-bot te maken in Go, aan de hand van een boek dat het in Python doet. Ik had eigenlijk direct een segmentation fault omdat ik ergens een nil dereference, en dat was het einde van mijn avontuur in Go. Maar deze opdracht ging prima en segfaultloos.

8. Clojure

De colleges over C en assambly waren op dit punt aangekomen bij functioneel programmeren in Scheme. Hoewel ik waarschijnlijk wel ergens de Kawa-interpreter had kunnen vinden, besloot ik toch om naar de wat modernere en momenteel populairdere lisp Clojure te kijken. Het ging best aardig, maar in deel twee zat ik compleet vast en na vier uur vloeken besloot ik de oplossing voor PHP – die ik inmiddels prima in mijn hoofd had – uit te schrijven. Ook daar heb ik lekker fancy lopen doen met operators die ik normaal nooit kan gebruiken. Toen ik daarna het volgende college over Scheme aanzette, maakte ik kennis met let en het feit dat het niet erg is om dat te gebruiken (maar een beetje). Gewapend met dat bouwblok heb ik ook de versie in Clojure nog werkend gekregen die avond.

9. Python

De go-bot zoals beschreven in het boek had veel weg van de vorm van dit probleem: het zijn punten op de kaart en als die buren zijn worden ze samengevoegd. Daarnaast had ik gewoon ook even zin in een wat bekendere taal, na het Clojure-avontuur. Omdat het een kaartje is heb ik me bij deze ook uitgeleefd met de weergave van dat kaartje, met allemaal kleuren in de terminal.

10. Erlang

Tegen deze tijd waren eindelijk mijn dromen over haakjes sluiten verdwenen, komen ze met deze opdracht! Over Erlang: als je eenmaal Elixir kent valt Erlang best wel mee, maar de syntax is wel heel absurd als je het nog nooit gezien hebt. Maar ook hier kon ik erg goed pattern-matching gebruiken, vandaar de keuze.

11. Crystal

Ik moest weer even terug naar een gecompileerde taal, dus dat werd Crystal. Dit heb ik echt helemaal speciaal voor Advent of Code geïnstalleerd, maar ik ben dus best wel onder de indruk: het heeft de vriendelijkheid van Ruby, maar dan mét static type checking en het compiled dus naar iets best snels. Ik heb me ook hier helemaal uitgeleefd met terminal-kleuren en er zelfs een animatie van gemaakt.

12. Typescript

Het is bijna valsspelen, want Typescript en Javascript zijn echt niet zo heel anders, maar ik gebruikte Deno, de Typescript-versie van Node, en daarvoor moest ik toch echt weer even opzoeken hoe ik een file moest inlezen.


Dit rammelende stukje werd mede mogelijk gemaakt door mijn gevoel dat ik meer moet bloggen. Misschien ga ik nog wel verder aan Advent of Code, maar ik wil eigenlijk ook weer dingen gaan doen aan dit weblog. Vandaar.

Stronk

Een tijdje terug was er een landelijk nieuwsbericht over rellen in het Goffertpark, op dezelfde dag dat er ook een tribune sneuvelde onder het gewicht van een grote groep hossende Vitesse-supporters. De rellen waren flink uit de hand gelopen, er werd met van alles gegooid, ‘zelfs met een boomstam’, stond er.

Nog veel langer geleden fietste ik op een dag naar werk. Mijn route ging destijds door het Goffertpark. En het was niet zomaar een dag: het stormde. Net na het stadion stond een boom die al heftig ver was doorgezakt en flink stond te schudden. Ik heb toen naar de boom geknikt en ben afgeslagen, richting de Weg door Jonkerbos, om er niet onder te komen te liggen.

Toen ik terugfietste naar huis bleek de boom inderdaad te zijn omgevallen. Later is hij weggezaagd, bleef alleen de stronk over. Mijn route is sindsdien veranderd, maar telkens als ik er langs fiets groet ik die stronk nog even.

Vandaag kwam ik weer langs de stronk, en zoals ik inmiddels al vermoedde was het bovenste stuk, dat al een tijdje wat losser hing, weg. Gek, dacht ik, ik had op die bewuste dag niet verwacht die boom jaren later nog schade zou veroorzaken en het tot het landelijk nieuws zou schoppen.

I noticed that in my new login-setup, sessions last much longer. It used to be an hour or 3, but now I have been away from my computer for a full day and I am still logged in.

I like it, because it means that I will see my site more often in a logged-in state (as will others), but I will add to the ever-growing todo-list that I need some 'I trust this computer' checkbox.

Next up must be Webmentions, I feel. I just posted this article with a lot of backlinks to old posts, but since I send all Webmentions in a synchronous way on first-post-visit, it took ages, and I actually got a 502 Bad Gateway out of my site. But I also need weekend, so we will see.

IndieAuth without IndieAuth.com

In February 2017, I added the ability for other people to log in to my site, both via IndieAuth and Twitter. Since June 2019 this feature is more useful, as I moved all my checkins to being ‘private’, meaning there is actually something to see (albeit sparsely posted).

For this, I used the now outdated and deprecated service IndieAuth.com, which back then was also used to log in to the IndieWeb wiki. Due to the confusion between IndieAuth.com (the service) and IndieAuth (the protocol), a new project called IndieLogin was started and the IndieWeb wiki moved to that one. Since it didn’t offer that login service to others, as IndieAuth.com did, I never switched.

Since this week I have a new IndieAuth endpoint for myself. (Meaning: a place I can use to prove my own identity to others.) Unfortunately, it is not compatible with the outdated IndieAuth.com, so I could not use it to prove my identity to my own site. Because this felt wrong (and because I had the IndieAuth flow in my head again now), I decided that my site needed to do that part of IndieAuth on it’s own as well.

Since I was at it, I also have Twitter login working via the new flow. That was easier, because the library support was more plug-and-play.

Juggling with cookies

Last week I wrote about my new setup where I run two applications, the old PHP and the new Elixir, behind an unusual NGINX configuration. For the aforementioned feature of authentication, I had to create even a bigger beast.

All the posts, and all the logic for showing or hiding private posts, are still in PHP. The new authentication is in Elixir. Both ends are storing the information about the current logged-in user in session cookies. How do I merge those two into one user experience?

Luckily, since both applications run under the same domain, the browser is actually unaware of the fact that there are two apps. It just sends all cookies back.

So, in PHP I ask for all headers, look for a cookie-one that is named _yak_key, and if it is there, it makes a direct localhost call to Yak, the Elixir server, with that cookie. Yak exposes one route that just returns the currently logged-in user as a JSON. If that call returns a user, PHP can set a cookie of its own.

Then for the logout, PHP used to redirect to the homepage, but now it redirects to the page that logs you out of Yak, which redirects to the homepage.

At some point this setup will change again, but for now it seems to me as a good way to make one further step in the features I want to support in the new version of my site, while keeping the old one running.


Oh yeah, you may hunt down that localhost-call that checks the login status. It is actually exposed to the outside world too. But if you can provide it with a cookie for a person that is not you, that person and I have a problem anyway, regardless of you knowing the endpoint.

Showing incorrect IndieAuth redirect_uri to the user

Last Thursday I started using my new IndieAuth endpoint, which I can use authorize apps build by others (like the Quill Micropub client), to do stuff with my site (like posting this blogpost for example). In the following weekend I added a lot more validations than just my password, making it a safer endpoint.

One of these validations is the redirect_uri. My previous endpoint already showed this to me on the login-page, so I could manually inspect it, which is a good practice. The spec, however, describes that one should fetch the client_id (which is a URL) and look for a link with the rel-value of `rel="redirect_uri", which can be either in the HTML or in the HTTP Header.

So this is what it (currently) normally looks like:

Image showing the redirect_uri in grey.

And this is what it looks like when the redirect_uri differs from scheme, domain and/or port, and is also not present in at the client_id.

Image showing the redirect_uri in red and with explanation, plus the discovered redirect_uri.

Note that it is okay for Quill not to advertise another redirect_uri, for it is redirecting to a URL with the same scheme, domain and port. It only needs to add the link if it wants a URL where one of these are different. It is now clearer that someone who is not Quill is trying to steal a token.

Meer laden