<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet href="https://koenraijer.com/feed.xsl" type="text/xsl"?>
<rss version="2.0"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
    <title><![CDATA[Koen Raijer]]></title>
    <link>https://koenraijer.com</link>
    <description><![CDATA[Personal website of Koen Raijer. Psychiatry resident and amateur programmer who dabbles in writing. Mostly about mind-stuff and technology.]]></description>
    <language>en-us</language>
    <copyright><![CDATA[© 2026 Koen Raijer. All rights reserved.]]></copyright>
    <managingEditor>Koen Raijer</managingEditor>
    <lastBuildDate>Fri, 03 Apr 2026 22:01:01 GMT</lastBuildDate>
    <pubDate>Sun, 30 Nov 2025 00:00:00 GMT</pubDate>
    <ttl>60</ttl>
    <atom:link href="http://localhost:3000/feed" rel="self" type="application/rss+xml" />
    <atom:updated>2025-11-30T00:00:00.000Z</atom:updated>
    <image>
        <url>https://koenraijer.com/241122_avatar.webp</url>
        <title><![CDATA[Koen Raijer]]></title>
        <link>https://koenraijer.com</link>
    </image>
    
        <item>
            <title><![CDATA[Individuele Digitale Soevereiniteit]]></title>
            <link>https://koenraijer.com/individuele-digitale-soevereiniteit</link>
            <guid isPermaLink="true">https://koenraijer.com/individuele-digitale-soevereiniteit</guid>
            <pubDate>Sun, 30 Nov 2025 00:00:00 GMT</pubDate>
            <atom:updated>2026-02-17T00:00:00.000Z</atom:updated>
            <dc:creator><![CDATA[Koen Raijer]]></dc:creator>
            <description><![CDATA[Over het belang digitale onafhankelijkheid en weerbaarheid in veranderende tijden. Een concrete gids over hoe je je kunt loskoppelen van (Amerikaanse) techreuzen. Geen technische kennis vereist.]]></description>
            <content:encoded><![CDATA[<p>Tot voor kort was ik volledig toegewijd aan het Apple ecosysteem. Als betalend abonnee vertrouwde ik volledig op de clouddiensten van iCloud. Ik heb sindsdien een drastische ommezwaai gemaakt en ben nu de trotse <em>system administrator</em> van mijn eigen server. Op deze gehuurde computer in een Duits serverpark draait nu mijn hele digitale leven: wachtwoorden, bestanden, foto’s, contacten, agenda’s, herinneringen, notities, en zo verder. Dat gebeurt bijna uitsluitend met gratis en open-source software, zonder in te leveren op functionaliteit. Op veel gebieden ben ik er zelfs op vooruit gegaan. Het geheel wordt uitgebreid afgeschermd en beveiligd. Applicaties zijn überhaupt alleen <em>vindbaar</em> via mijn privé-VPN waartoe alleen mijn telefoon en laptop toegang hebben. De tweede verdedigingslinie bestaat uit wachtwoordbeveiliging met tweefactorauthenticatie. En ten slotte wordt al het verkeer automatisch gemonitord op verdachte activiteit. Verdachte afzenders worden onmiddellijk geblokkeerd. In dit essay schets ik welke maatschappelijke ontwikkelingen me hiertoe hebben doen bewegen, en beschrijf ik in detail de weg ernaartoe en de gemaakte overwegingen. Niet omdat ik vind dat iedereen hetzelfde proces moet doorlopen, maar zodat je als lezer voelt dat er voor iedereen ruimte is om stappen te zetten naar meer digitale soevereiniteit.</p> <h2> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#i-waarom-is-digitale-soevereiniteit-zo-belangrijk" target="_self" rel>I. Waarom is digitale soevereiniteit zo belangrijk?</a></h2> <p>Digitale soevereiniteit gaat over het terugnemen van de teugels van grote techbedrijven. Het gaat over stoppen met lijdzaam toekijken terwijl grof geld wordt verdiend aan onze aandacht over de rug van onze tijd en onze relaties. Want technologie is niet alleen gereedschap om te gebruiken. De smartphone is een extern implantaat, een brain-computer interface, dat wordt bediend met onze handen en ogen. In tegenstelling tot ons brein kent het geen evolutionaire, maar economische selectiedruk. Onderlinge competitie tussen beursgenoteerde bedrijven zonder serieuze externe regulering betekent een  <a href="https://en.wikipedia.org/wiki/Race_to_the_bottom" target="_blank" rel="nofollow">race to the bottom<sup>W</sup></a>, waarin uiteindelijk vooral het belang van de aandeelhouder wordt gerespecteerd. Dat leidt tot designkeuzes die niet goed voor ons zijn. Je voorpagina is volledig op je afgestemd. Niet om je ten dienste te zijn, maar om een zo groot mogelijke emotionele reactie bij je uit te lokken. Het achterliggende algoritme houdt geen rekening met de aard van die emotie, die vaak negatief blijkt te zijn <span><button><sup> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fn-8" target="_self" rel>8</a></sup></button>.<span><span>8<span></span></span><span>Humprecht, E., Amsler, M., Esser, F., &amp; Van Aelst, P. (2024). Emotionalized Social Media Environments: How Alternative News Media and Populist Actors Drive Angry Reactions. <em>Political Communication</em>, <em>41</em>(4), 559–587.  <a href="https://koenraijer.com/archive/humprecht_2024.pdf" target="_self" rel>https://doi.org/10.1080/10584609.2024.2350416<sup>PDF</sup></a></span><span><span></span><span>↖</span></span></span></span> Als je je pagina ververst, verschijnt keer op keer een verrassingsassortiment van materiaal. Net als in een casino werkt een variabele beloning namelijk het meest verslavend. Ik las laatst dat nog maar zo’n 10% van het materiaal dat mensen op de grote platforms bekijken nog van bekenden komt <span><button><sup> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fn-1" target="_self" rel>1</a></sup></button>.<span><span>1<span></span></span><span>Seetharaman, D. (2025, April 16). Zuckerberg says Meta’s share of time people spend on social media declined. <em>The Information</em>.  <a href="https://www.theinformation.com/articles/zuckerberg-says-metas-share-time-people-spend-social-media-declined" target="_blank" rel="nofollow">https://www.theinformation.com/articles/zuckerberg-says-metas-share-time-people-spend-social-media-declined<sup>↗</sup></a></span><span><span></span><span>↖</span></span></span></span> De overige 90% is dus van mensen wiens baan het is om kijkers te werven, of mensen wiens taak het is je hun product te verkopen. Het stompt af en maakt passief, het voedt ons zonder voedzaam te zijn.</p> <p>Tegelijkertijd doet het, helaas deels in potentie, ook onvoorstelbaar veel goeds. Technologie stelt ons in staat om relaties te onderhouden met anderen ongeacht de fysieke afstand, het emancipeert op vlak van kennisoverdracht en kansengelijkheid, en het stelt ons in staat om herinneringen stante pede vast te leggen, om maar een aantal zaken te noemen.</p> <p>Goed, het bespreken van de voor- en nadelen van social media is niets nieuws. Mijn punt is dat deze technologie toegang verschaft tot ons brein aan techbedrijven die vulgaire motieven hebben. Dat heeft niet alleen effect op je als individu, het verandert onze gebruiken, gewoontes en de manieren waarop we met elkaar omgaan. Het verandert het culturele weefsel dat ons verbindt. Er zijn legio voorbeelden van politieke inmenging via social media: tijdens de coup in Myanmar, Cambridge Analytica tijdens de Amerikaanse presidentsverkiezingen van 2016, de aanval op het capitool in 2021, of de radicalisering van moslims en andere religieuze fanatici via online echokamers. Er zijn ook legio voorbeelden van de effecten ervan op onze kinderen; zie de boeken van Jonathan Haidt (hoewel empirisch niet altijd even valide), de ambities om telefoongebruik op Nederlandse scholen in te perken, de vereenzaming van jongeren, toename van eenpersoonshuishoudens. Hoewel niet alles strikt toe te schrijven is aan technologie of smart phones, lijkt schermtijd in bredere zin een drijvende kracht achter veel van deze ontwikkelingen.</p> <p>Sommige van de voorbeelden vallen meer in de categorie politiek bijeffect van een economisch gemotiveerde keuze, bijvoorbeeld door de nadruk van sociale media op negatief emotioneel geladen materiaal. Anderen vallen meer in de categorie bewuste politieke beïnvloeding, wanneer regeringen of politieke belangenorganisaties botlegers en spamaccounts inzetten die propaganda verspreiden. Als je gehecht bent aan jezelf en je wil ontkoppelen van de algoritmische veranderingen waar culturen massaal aan blootgesteld worden, is het waardevol om een poging te wagen je eraan te onttrekken.</p> <p>Een andere belangrijke categorie risico’s die nog niet aan bod is gekomen gaat over de gevaren van het gratis weggeven van je data. Elke keer als je klakkeloos cookies accepteert, en zelfs als je dat niet doet (via  <a href="https://www.consumentenbond.nl/internet-privacy/browser-fingerprinting" target="_blank" rel="nofollow">fingerprinting<sup>↗</sup></a>), verzamelen websites gegevens. Als je Gmail gebruikt, leest Google alles mee en gebruikt het in hun advertenties. Je zoekgedrag in zoekmachines, je gedrag op sociale media. Alle informatie wordt met elkaar verbonden met een paar centrale gegevens, vaak e-mailadressen die je telkens hergebruikt. Dergelijks contactgegevens zijn in legio datalekken openbaar geworden. Zo komt mijn oude gmail volgens  <a href="https://haveibeenpwned.com/" target="_blank" rel="nofollow">HaveIBeenPwned<sup>↗</sup></a> in 14 datalekken voorbij. Pogingen om je data af te schermen door bijvoorbeeld je cookie-instellingen te wijzigen helpen, maar zijn niet afdoende. Bedrijven blijven vatbaar voor datalekken, en cookieinstellingen zijn gebaseerd op vertrouwen in het betreffende bedrijf. En vertrouwen maakt kwetsbaar (in deze context).</p> <p>Want met je data wordt je op verschillende manieren gemanipuleerd om geld uit te geven, meer te betalen dan nodig was, je te verleiden om ergens tijd aan te spenderen, of om je mening te veranderen. Tenzij je zelf actie onderneemt om dat te veranderen!</p> <h2> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#ii-maar-ik-heb-toch-niets-te-verbergen" target="_self" rel>II. Maar ik heb toch niets te verbergen?</a></h2> <p>Het is vermoedelijk de meest gestelde retorische vraag in privacydiscussies, en toch heb ik er nog geen goed antwoord op gevonden. Veel lezers zullen het al met me eens zijn, anders zullen ze zich immers niet verdiept hebben in digitale soevereiniteit, maar toch wil ik er graag een antwoord op formuleren. Om twijfelaars te overtuigen, en om anderen de munitie aan te bieden om weerstand te bieden aan dit fenomeen.</p> <p>Het geniepige van de vraag is dat ze het debat vernauwt en reduceert tot een enkele kwestie: het belang van privacy om criminele activiteiten te verbergen. Belang hechten aan privacy wordt daarmee gelijkgesteld aan ‘voornemens zijn om iets crimineels te doen’. Terwijl privacy veel breder is dan dat, maar daardoor ook moeilijk definieerbaar wordt. Privacy kan bijvoorbeeld gaan over een situatie waarin iemand een geheim van je deelt zonder je toestemming, maar ook over situaties waarin iemand niets nieuws over je leert, maar je bijvoorbeeld bespiedt of volgt zonder je medeweten.</p> <p>Daniel Solove vergelijkt het ontbreken van privacy met Franz Kafka’s boek ‘Het proces’, waarin de hoofdpersoon gearresteerd wordt zonder te weten waarom, en waarbij een mysterieus ambtenarenbestel een dossier over hem heeft aangelegd op basis waarvan hem iets ten laste wordt gelegd, zonder dat de hoofdpersoon er ooit achterkomt wát precies <span><button><sup> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fn-2" target="_self" rel>2</a></sup></button>.<span><span>2<span></span></span><span>Solove, D. J. (2011, May 15). Why privacy matters even if you have “nothing to hide.” <em>The Chronicle of Higher Education</em>.  <a href="https://koenraijer.com/archive/solove_2011.pdf" target="_self" rel>https://www.chronicle.com/article/why-privacy-matters-even-if-you-have-nothing-to-hide/<sup>PDF</sup></a></span><span><span></span><span>↖</span></span></span></span> Ik moest meteen aan de toeslagenaffaire denken toen ik dit las. Er blijkt zelfs een boek geschreven te zijn dat ‘Kafka in de rechtsstaat’ heet over precies dit onderwerp. Solove geeft de voorkeur aan Kafka boven Orwell’s 1984, omdat de discussie volgens hem te veel over <em>surveillance</em> gaat, en te weinig over informatieverwerking. Als je je data weggeeft dan geef je controle uit handen, aan het overheidsapparaat of aan commerciële algoritmes die ondoorzichtig en ondoorgrondelijk opereren.</p> <p>Onbegrensde informatieverwerking heeft verschillende nadelen. Aggregatie bijvoorbeeld, waarin stukjes schijnbaar onschuldige informatie samengevoegd worden zodat ze informatie onthullen die je liever privé had gehouden. Of exclusie, bijvoorbeeld doordat staten in het kader van de nationale veiligheid geen inzage geven in de databases met persoonsgegevens die ze onderhouden. Wil je dat de staat een dergelijk alleenrecht over je heeft? Daarnaast is data inherent reductionistisch, het reduceert een individu tot een verzameling gegevens, en schetst daarmee vaak een beperkt of vervormd beeld van de werkelijkheid.</p> <p>Protest aantekenen stuit vaak op bureaucratische onverschilligheid en een gebrek aan verantwoordingsplicht. En privacy erodeert doorgaans langzaam, stapje voor stapje lever je steeds meer in. Terugkrijgen is vaak lastig. Privacy gaat dus over regie houden, en over machtsverhoudingen tussen het individu en het systeem. Daarbij is de ‘maar ik heb toch niets te verbergen’-houding koren op de molen van datzelfde systeem. Het veronderstelt een soort misplaatst en naïef vertrouwen in een goede uitkomst, mits we braaf ons lot in de handen van Vadertje Staat blijven leggen.</p> <p>Ik stel daarom voor dat iedereen die door de staat of door een bedrijf wordt gevraagd informatie te verschaffen een uitgangspositie van argwaan betracht, en zichzelf dit afvraagt: waarom hebben ze dit nodig, wat doen ze ermee, en wie heeft er nog meer toegang toe?</p> <h2> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#iii-een-europees-perspectief-op-privacy-en-technologie" target="_self" rel>III. Een Europees perspectief op privacy en technologie</a></h2> <p>In maart 2025 betaalde ik nog nietsvermoedend een godsvermogen voor een iPhone 16. Niet lang daarna zette Trump de relatie met Europa op scherp met zijn handelsoorlog en voortdurende dreigementen om uit de NAVO te stappen. Ineens werd ik onzeker over de vanzelfsprekendheid waarmee ik al die tijd Amerikaanse techproducten afnam. Wat als er ineens importtarieven op iPhones zouden komen? Hoe veel meer geld ben ik bereid om voor een iPhone te betalen? Wat als Apple van zijn privacyvriendelijke koers afstapt? Is Apple nu eigenlijk wel te vertrouwen? Al mijn backups, clouddiensten, allemaal afhankelijk van Apple. Mijn onbehagen bij mijn afhankelijkheid groeide. <em>Buy European</em> klonk ineens zo gek nog niet.</p> <p>Toen besloot de Europese Unie (EU) in de zomer van 2025 ineens om toch het beruchte <em>Chat Control</em> te agenderen. Ik schrok me rot: alle privécommunicatie in de EU zou door AI verplicht gescand worden op kindermisbruikmateriaal. Omdat AI dat niet foutloos kan, moeten alle fout-positieven – pikante kiekjes met je partner, je kinderen in een pierebadje – door EU-ambtenaren gecontroleerd worden. Hoe kon de EU, die met de AVG (GDPR in het Engels) juist <em>bescherming</em> van digitale rechten zo hoog in het vaandel had, nu deze wet voorstellen? Ik was vol ongeloof. Mijn vertrouwen in de EU werd aan het wankelen gebracht en voor het eerst in mijn leven ontwaakte er iets activistisch in me. Ik stuurde berichtjes naar vrienden en familie, en nam contact op met europarlementariërs via  <a href="https://fightchatcontrol.eu/" target="_blank" rel="nofollow">https://fightchatcontrol.eu/<sup>↗</sup></a>. Inmiddels is <em>Chat Control</em> na veel politiek gepingpong in een aangepaste vorm aangenomen door de Europese Raad<span><button><sup> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fn-3" target="_self" rel>3</a></sup></button>.<span><span>3<span></span></span><span>European Commission. (2025). <em>Proposal for a Regulation of the European Parliament and of the Council amending Regulation (EU) 2021/1232 as regards the extension of its period of application</em> (COM(2025) 797 final).  <a href="https://ec.europa.eu/transparency/documents-register/detail?ref=COM(2025)797&amp;lang=en" target="_blank" rel="nofollow">https://ec.europa.eu/transparency/documents-register/detail?ref=COM(2025)797&amp;lang=en<sup>↗</sup></a></span><span><span></span><span>↖</span></span></span></span> Het scannen van foto- en videomateriaal is nu verplicht in hoog-risicogevallen. Michel Portier uit terecht de zorg dat alle situaties waarin nu sprake is van <em>end-to-end encryption</em> als hoog risico aangemerkt zullen worden<span><button><sup> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fn-4" target="_self" rel>4</a></sup></button>.<span><span>4<span></span></span><span>Michel Portier. (2025, 15 november). Chat Control: Via achterdeur doorheen gedrukt? Geen complot maar beleid | Michel Portier (Nr. 2122) [Podcastaflevering]. In De Nieuwe Wereld. Stichting De Nieuwe Wereld.  <a href="https://open.spotify.com/episode/1QVQ1viHAbvBzWp8Sp0wyQ" target="_blank" rel="nofollow">https://open.spotify.com/episode/1QVQ1viHAbvBzWp8Sp0wyQ<sup>↗</sup></a></span><span><span></span><span>↖</span></span></span></span> Daar komt nog bij dat het scannen van tekstberichten om <em>grooming</em> te voorkomen nu ook onder de wetgeving valt. Geen enkel bericht is nog veilig.</p> <p>Chat Control past helaas in een bredere trend van méér surveillance en mínder online anonimiteit. Binnen de EU gaat het om initiatieven zoals de  <a href="https://www.rijksoverheid.nl/onderwerpen/financien-europese-unie/digitale-euro" target="_blank" rel="nofollow">digitale euro<sup>↗</sup></a> en de  <a href="https://www.digitaleoverheid.nl/overzicht-van-alle-onderwerpen/identiteit/id-wallet/" target="_blank" rel="nofollow">Europese digitale identiteit (eID)<sup>↗</sup></a>. Buiten de EU gaat het bijvoorbeeld om de  <a href="https://www.bbc.com/news/articles/c17n9k54qz2o" target="_blank" rel="nofollow">Online Safety Act<sup>↗</sup></a> in het Verenigd Koninkrijk. Ongepaste websites zoals pornografie hebben een identificatieplicht en vragen voortaan om je identiteitskaart en een filmpje van je gezicht. En ook in Australië geldt inmiddels een identificatieplicht die 16-minners van sociale media moet weren. In Nederland heerst een vergelijkbaar sentiment: “Bijna twee op de drie Nederlanders (63 procent) zijn inmiddels voor een verbod op sociale media onder de 16 jaar. Vorig jaar was dat nog 57 procent” <span><button><sup> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fn-5" target="_self" rel>5</a></sup></button>.<span><span>5<span></span></span><span>Bogosavac, N. (2026, 23 januari). <em>Steun voor socialemediaverbod voor jongeren groeit, vooral onder gen Z</em>. NOS Nieuws.  <a href="https://nos.nl/artikel/2599319-steun-voor-socialemediaverbod-voor-jongeren-groeit-vooral-onder-gen-z" target="_blank" rel="nofollow">https://nos.nl/artikel/2599319-steun-voor-socialemediaverbod-voor-jongeren-groeit-vooral-onder-gen-z<sup>↗</sup></a></span><span><span></span><span>↖</span></span></span></span></p> <p>Nu sta ik zeker niet onsympathiek tegenover de wens om iets te doen aan de schadelijke effecten van sociale media. Ik ben alleen geen voorstander van verplichte leeftijdsverificatie voor iedereen. De veiligheidsrisico’s wegen daarin wat mij betreft niet op tegen de voordelen. In plaats daarvan zou ik voorstellen om op andere manieren sociale media minder parasitair en verslavend te maken. Er zijn namelijk meer dan genoeg manieren om schade door sociale media aan te pakken zonder massasurveillance. Zo heeft  <a href="https://www.bitsoffreedom.nl/" target="_blank" rel="nofollow">Bits of Freedom<sup>↗</sup></a> recent een prachtige overwinning behaald in de rechtszaal waardoor Meta werd gedwongen om een chronologische tijdlijn aan gebruikers aan te bieden <span><button><sup> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fn-6" target="_self" rel>6</a></sup></button>.<span><span>6<span></span></span><span>De Wild, M. (2026, 2 februari). <em>Liveblog hoger beroep Meta 26 januari</em>. Bits of Freedom.  <a href="https://www.bitsoffreedom.nl/2026/02/02/liveblog-hoger-beroep-meta-26-januari/" target="_blank" rel="nofollow">https://www.bitsoffreedom.nl/2026/02/02/liveblog-hoger-beroep-meta-26-januari/<sup>↗</sup></a></span><span><span></span><span>↖</span></span></span></span> En zo zijn er nog talloze andere designpatronen – ook <em>dark patterns</em> genoemd – die ons op slinkse wijze proberen te manipuleren <span><button><sup> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fn-7" target="_self" rel>7</a></sup></button>.<span><span>7<span></span></span><span>Ye, X. (2025). Dark Patterns and Addictive Designs. <em>Weizenbaum Journal of the Digital Society</em>, <em>5</em>(3).  <a href="https://koenraijer.com/archive/ye_2025.pdf" target="_self" rel>https://doi.org/10.34669/wi.wjds/5.3.2<sup>PDF</sup></a></span><span><span></span><span>↖</span></span></span></span> Een <em>age gate</em> is een soort kanon dat veronderstelt dat enkel kinderen behoed moeten worden voor dit soort manipulatie, terwijl volwassenen net zo min bestand zijn tegen alle slimme koppen die ons beloningssysteem proberen te <em>hacken</em>.</p> <p>Hoe dan ook, de huidige trend in Europa is zorgelijk, en het sentiment lijkt steeds meer af te stevenen op de leeftijdsbeperking als noodzakelijke maatregel. Ik maak me geen illusies, maar ik ga wel alles in het werk stellen om door de mazen van dit soort maatregelen te glippen. En de beste manier om daar op te anticiperen is door zo onafhankelijk mogelijk te worden van derden.</p> <h2> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#iv-aan-de-slag-met-digitale-soevereiniteit" target="_self" rel>IV. Aan de slag met digitale soevereiniteit</a></h2> <div><div><span>Zelf aan de slag</span></div><div><p></p> <ol><li>Welke diensten gebruik ik?</li> <li>Welke eigenschappen moet een goed alternatief aan voldoen?</li> <li>Kies ik voor beheerde diensten of ga ik <em>self-hosten</em>?</li> <li>Wat ben ik bereid te betalen?</li></ol></div></div> <p>Ik besloot dus om zo veel mogelijk zelf te gaan regelen. De eerste vraag is dan: voor welke dienst wil ik een alternatief? Om die vraag te beantwoorden maakte ik een lijstje van diensten die ik gebruik, grofweg geordend naar de gevoeligheid van de informatie die erop staat. Zoals velen kwam ik op een lijstje uit waar dingen als bankzaken, foto’s, bestanden, berichtenapps, etc. op staan.</p> <p>De volgende vraag is meteen veel lastiger: waar moet het alternatief aan voldoen? Ik bedacht zelf de volgende eisen: veilig, privé, en open-source<span><button><sup> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fn-9" target="_self" rel>9</a></sup></button>.<span><span>9<span></span></span><span><strong>Open-source</strong> houdt in dat de broncode openbaar is, en door anderen gecontroleerd, verbeterd en overgenomen mag worden. Zo kan bijvoorbeeld worden gecontroleerd of er geen achterdeurtjes in de code zitten. Vaak is er een bepaalde mate van democratisering in de richting waar een project op gaat, en mocht je je niet in die richting kunnen vinden, dan kun je het project ook <em>forken</em> en er je eigen draai aan geven!</span><span><span></span><span>↖</span></span></span></span> Met één sterke voorkeur: draaiend op computers in de EU, en het liefst in mijn eigendom.</p> <p>Maar het landschap van privacyvriendelijke alternatieven kent vele smaken. De smaak die bij je past verschilt naargelang je behoefte aan avontuur of gemak, en je mate van digitale geletterdheid. De juiste keuze is voor iedereen anders.</p> <h3> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#beheerde-alternatieven" target="_self" rel>Beheerde alternatieven</a></h3> <p>Dit is de meest toegankelijke optie. Ze vereist geen of weinig technische kennis en de kleinste tijdsinvestering. In de kern gaat het om overstappen van een doorgaans gratis <em>big tech</em> optie naar een doorgaans betaalde en bij voorkeur <em>open source</em> versie van hetzelfde product. Je vertrouwt hier alsnog op derden, maar je betaalt ze met geld in plaats van met aandacht. Zij ontzorgen je door de technische kant voor je te regelen. Het liefst neem je een dienst die de veiligheid van hun product en dus jouw data ook door een onafhankelijke club laat controleren middels een veiligheidsaudit of  <a href="https://nl.wikipedia.org/wiki/Penetratietest" target="_blank" rel="nofollow">pentesten<sup>W</sup></a>. En als het een Europees bedrijf betreft, dan word je beschermd door Europese privacywetgeving.  <a href="https://www.privacyguides.org/en/" target="_blank" rel="nofollow">Privacy Guides<sup>↗</sup></a> is een fantastische website met zeer gedetailleerde informatie over privacyrespecterende diensten, die ook veel uitlegt over de criteria die gehanteerd worden. Op  <a href="https://openalternative.co/" target="_blank" rel="nofollow">Open Alternative<sup>↗</sup></a> kun je je huidige <em>big tech</em> dienst invullen om er een open-source alternatief voor te vinden. Kijk daarbij naar eigenschappen die je belangrijk vindt. Vraag desnoods een AI research tool om een rapport te schrijven over de verschillen<span><button><sup> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fn-10" target="_self" rel>10</a></sup></button>.<span><span>10<span></span></span><span><strong>Dit geldt natuurlijk voor alles hier</strong>: kom je er niet uit, vraag een Large Language Model (LLM) om je te helpen. Met een beetje gezond verstand zul je merken dat je een heel eind komt.</span><span><span></span><span>↖</span></span></span></span></p> <p>Nadat je een goed alternatief hebt gevonden, moet je die natuurlijk eerst uitproberen. Zelfs met de beste uitleg weet je nog niet of software bij je past totdat je het zelf geprobeerd hebt. Welke functionaliteit van de oude app vind je belangrijk? Heb je een alternatief naar tevredenheid getest? Exporteer dan je data bij de oude dienst en importeer deze bij de nieuwe dienst. Bij veel diensten zit deze optie diep verborgen in de instellingen, en zo niet, dan zijn er vaak andere mensen die er met omwegen toch een oplossing voor hebben gevonden.</p> <h3> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#self-hosted-alternatieven" target="_self" rel>Self-hosted alternatieven</a></h3> <p>Voor volledige vrijheid zul je echter los moeten komen van derden die “de achterkant” van de software voor je beheren. Die achterkant heet een <em>server</em>: een computer die altijd aanstaat en waar een <em>client</em> zoals een telefoon of laptop verbinding mee kan maken. Met een eigen server heb je volledige controle en vrijheid over de software die je gebruikt. Tegelijkertijd ben je volledig verantwoordelijk als er iets fout gaat en draag je zorg voor je eigen beveiliging. Er is dus niemand die je ontzorgt, maar er is ook niemand die iets voor je beslist.</p> <p>Zelf besloot ik om te gaan voor “self-hosted, tenzij”. De tenzij kan dan zijn: tenzij het me technisch de pet te boven gaat, tenzij het niet om belangrijke data gaat, of tenzij afhankelijkheid niet zo kwetsbaar maakt. Zoals ik eerder al noemde, gaat e-mail <em>self-hosten</em> me de pet te boven. Daarvoor blijf ik dus een bedrijf inhuren. Wat betreft muziek en videomateriaal weegt de benodigde infrastructuur en opslagruimte (een heleboel) niet op tegen mijn belang bij onafhankelijkheid van partijen als Spotify of Netflix. Vooral voor diensten die persoonlijke, unieke diensten bewaren, besloot ik mijn eigen server te gebruiken.</p> <h3> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#hardware-kopen-of-huren" target="_self" rel>Hardware kopen of huren</a></h3> <p>Een andere overweging die bij het onderhouden van je eigen server komt kijken gaat over de hardware. Je kunt een PC aanschaffen, zoals een  <a href="https://docs.google.com/spreadsheets/u/0/d/1SWqLJ6tGmYHzqGaa4RZs54iw7C1uLcTU_rLTRHTOzaA/htmlview#gid=1856484951" target="_blank" rel="nofollow">goedkope mini-PC<sup>↗</sup></a> of een Raspberry Pi die bij je thuis staat om als server te dienen. Maar er zijn ook genoeg partijen die serverruimte ‘in de cloud’ verhuren. Het voordeel van een <em>home server</em> is dat je niet afhankelijk bent van derden, en dat je bepaalde diensten kunt draaien die niet kunnen op een gehuurde server. Ik moet in het bijzonder aan twee categorieën denken. De eerste categorie is die van de DNS servers die bij je thuis alle advertenties, dus ook die op slimme apparaten zoals TV’s, kunnen blokkeren, met name  <a href="https://pi-hole.net/" target="_blank" rel="nofollow">Pi-Hole<sup>↗</sup></a> of  <a href="https://adguard.com/en/adguard-home/overview.html" target="_blank" rel="nofollow">AdGuard Home<sup>↗</sup></a>. De andere categorie is die van de smart home software, met name  <a href="https://www.home-assistant.io/" target="_blank" rel="nofollow">Home Assistant<sup>↗</sup></a>. Het nadeel van een <em>home server</em> en het voordeel van een gehuurde server, is dat je data niet verloren gaan als je huis afbrandt. Bovendien ben je niet verantwoordelijk voor het onderhouden van je hardware, en is de drempel om te beginnen met <em>self-hosting</em> veel lager. In plaats van een PC van honderden euro’s, neem je een abonnement van een paar euro per maand waar je ook zo weer vanaf bent. Ik koos zelf voor een gehuurde server bij  <a href="https://www.hetzner.com/" target="_blank" rel="nofollow">Hetzner<sup>↗</sup></a>, een grote Duitse aanbieder van clouddiensten met een competitieve prijs. Met  <a href="https://tweakers.net/reviews/14138/van-120-naar-460-euro-hoe-de-ai-hype-de-prijs-van-ddr5-laat-exploderen.html" target="_blank" rel="nofollow">de huidige stormloop op werkgeheugen<sup>↗</sup></a> zal dat voorlopig nog wel even zo blijven.</p> <h3> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#centralisatie-en-risicospreiding" target="_self" rel>Centralisatie en risicospreiding</a></h3> <p> <a href="https://berthub.eu/articles/posts/dashboard-amerikaanse-afhankelijkheden/" target="_blank" rel="nofollow">De meeste mensen gebruiken Microsoft 365 op hun werk<sup>↗</sup></a>, en voor privégebruik zie ik om me heen steeds vaker dat mensen in eerste instantie naar Google Drive reiken. Beide bedrijven bieden volledige <em>suites</em> aan, digitale softwarepakketten die zoveel mogelijk behoeftes willen vervullen. Het is natuurlijk erg handig als alles met elkaar communiceert en op dezelfde plek staat. Maar je raakt ook verstrikt in het web van dat gemak. Want wat als je de agenda niet meer prettig vindt? Wat als het betreffende bedrijf hun prijzen verhoogt? Wat als ze je data verkopen? Daarom adviseer ik in principe tegen gecentraliseerde privacyvriendelijke alternatieven. De meest populaire optie daarvoor is op het moment het Zwitserse  <a href="https://proton.me/" target="_blank" rel="nofollow">Proton<sup>↗</sup></a>. Hoewel Proton een legitieme optie is, raad ik af om volledig over te stappen op Proton. Het is beter om je risico’s te spreiden tussen verschillende bedrijven, zodat je als individu <em>wendbaar</em> blijft. Want  <a href="https://en.wikipedia.org/wiki/Enshittification" target="_blank" rel="nofollow">enshittification<sup>W</sup></a> is onvermijdelijk.</p> <h3> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#digitale-zelfbescherming" target="_self" rel>Digitale zelfbescherming</a></h3> <p>Het is oké om soms in deze  <a href="https://www.thelancet.com/journals/lanpub/article/PIIS2468-2667(25)00049-0/fulltext" target="_blank" rel="nofollow">obesogene<sup>↗</sup></a> omgeving toe te geven aan een hamburger van de fastfoodketen met de gele M. Op dezelfde manier mag je ook weleens vervallen in een Youtube <em>binge</em>. Ik heb dagen dat ik moe ben en weinig zelfbeheersing heb, en bijna dwangmatig op elk leeg moment mijn telefoon pak. Op andere dagen doe ik dat niet en laat ik mijn koptelefoon in mijn tas. Het is niet mogelijk, niet nodig, en niet wenselijk om je volledig af te wenden van dit soort technologie. Maar wat als je wat extra ondersteuning nodig hebt om er weerstand aan te bieden? Omdat een andere activiteit je meer voldoening brengt, je dichter bij een doel brengt, of je laat verbinden met de mensen om je heen?</p> <p>Daarvoor probeerde ik legio hulpmiddelen. Denk aan  <a href="https://discussions.apple.com/thread/251489838?sortBy=rank" target="_blank" rel="nofollow">Apple’s app limits<sup>↗</sup></a>, of aan dure betaalde diensten zoals OneSec of Opal. Al deze opties zette ik na verloop van tijd uit of wist ik te omzeilen. Andere mensen stellen voor om over te stappen op een <em>dumb phone</em>, maar dat vind ik persoonlijk toch iets te  <a href="https://nl.wikipedia.org/wiki/Ascese" target="_blank" rel="nofollow">ascetisch<sup>W</sup></a>.</p> <p>Zelf gebruik ik nog maar één vorm van digitale zelfbescherming: de <em>fysieke blokkade</em>. Daarmee bedoel ik een blokkade die alleen met een fysieke, plaatsgebonden handeling ongedaan gemaakt kan worden. Door bijvoorbeeld een QR-code of  <a href="https://nl.wikipedia.org/wiki/Near-field_communication" target="_blank" rel="nofollow">NFC-chip<sup>W</sup></a> te scannen, die alleen thuis op je koelkast hangt. Je blokkeert een aantal apps die je niet wil gebruiken, en je moet eerst langs je koelkast om ze weer te deblokkeren. Er zijn een aantal dure aanbieders van deze functionaliteit, waar je een aantal tientjes betaalt voor een ge-3D-printe NFC-chip met een kostprijs van een paar cent. In plaats daarvan raad ik  <a href="https://www.foqos.app/" target="_blank" rel="nofollow">Foqos.app<sup>↗</sup></a> aan (alleen voor iOS). Volledig open-source en gratis, met de meest uitgebreide functionaliteit van alle apps. Ik gebruik zelf twee modi, afhankelijk van hoe <em>offline</em> ik wil zijn. De ene is mijn alledaagse modus, die YouTube blokkeert maar me bijvoorbeeld wel toestaat om op internet te gaan. De andere is de <em>dumb phone</em> modus, waarmee ik alleen bij essentiële apps zoals bellen, berichten sturen, en navigatie kan.</p> <h2> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#v-verdieping-beheerde-alternatieven" target="_self" rel>V. Verdieping: beheerde alternatieven</a></h2> <div><div><span>Geen commerciële belangen</span></div><div><p>Hoewel dit stuk soms aan een goedkoop blogartikel doet denken, zitten er geen affiliate links in en verdien ik er dus ook geen geld aan.</p></div></div> <h3> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#e-mail" target="_self" rel>E-mail</a></h3> <p>Zoals ik eerder al heb genoemd, is het voor de meeste mensen niet verstandig of haalbaar om je eigen e-mailserver aan te houden. Dat betekent dus dat je afhankelijk bent en blijft van een derde partij. E-mail is naast je 06-nummer een van de belangrijkste manieren waarop mensen of instanties je identificeren of contact met je op kunnen nemen. Het is dus belangrijk dat je e-mailadres hetzelfde blijft, en ik begrijp de weerstand die mensen voelen bij het wisselen van e-mailadres. Tegelijkertijd is het dus ook belangrijk dat je weerbaar bent, want zo’n centraal punt in je digitale leven uit handen geven maakt kwetsbaar. Helaas zitten veel mensen vast aan <code>@gmail</code>-, <code>@hotmail</code>- of <code>@icloud</code>-adressen.</p> <p>De eerste stap om een e-mailadres te hebben dat onafhankelijk is van welke provider dan ook, is het aanschaffen van je eigen domeinnaam. Dat kan goedkoop en veilig bij de Zwitserse aanbieder  <a href="https://infomaniak.com/" target="_blank" rel="nofollow">Infomaniak<sup>↗</sup></a>. Als je een domeinnaam bezit, bezit je ook elk mailadres dat eindigt op <code>@&lt;domeinnaam&gt;</code>. Zo bezit ik bijvoorbeeld alle e-mailadressen die eindigen op <code>@koenraijer.com</code>. Als ik besluit om over te stappen van e-mailprovider, dan kan ik mijn primaire mailadres dus meenemen. Zo ben je wendbaar zonder dat je er veel nadelen van ondervindt. En vrij om de verschillende opties te verkennen.</p> <p>Ik koos uiteindelijk voor het Mail Plus abonnement van  <a href="https://proton.me/mail" target="_blank" rel="nofollow">Proton Mail<sup>↗</sup></a>. Daarvoor probeerde ik  <a href="https://tuta.com/nl" target="_blank" rel="nofollow">Tuta Mail<sup>↗</sup></a> (Duits bedrijf, slechte mobiele app),  <a href="https://www.startmail.com/" target="_blank" rel="nofollow">StartMail<sup>↗</sup></a> (niks mis mee, maar beviel me gewoon niet),  <a href="https://fastmail.com" target="_blank" rel="nofollow">FastMail<sup>↗</sup></a> (fantastische software, maar als Australisch bedrijf slecht in privacy) en  <a href="https://soverin.nl/" target="_blank" rel="nofollow">Soverin<sup>↗</sup></a> (Nederlands, vast goed, maar bij mij hing iets vast waardoor ik overstapte).</p> <p>Naast een mailprovider is het raadzaam om <strong>e-mailaliassen</strong> te gebruiken om je echte e-mailadres te verbergen. Want als je gehecht bent aan je e-mail, dan wil je het liefst dat je inbox niet vervuild raakt met spamberichten. Hoewel spamfilters de afgelopen jaren erg goed zijn geworden, is dit probleem met de opkomst van LLMs  <a href="https://www.techradar.com/pro/ai-arms-race-the-evolving-battle-between-email-spam-and-spam-filters" target="_blank" rel="nofollow">opnieuw relevant geworden<sup>↗</sup></a>. Het is dus zaak om je e-mailadres goed af te schermen, en om niet overal je e-mailadres in te vullen. Maar wat als je toch gebruik wil maken van een website of dienst die je mail vraagt? Daarvoor zijn er e-mailaliassen.</p> <p>Het werkt zo: je maakt een dummy e-mail aan zoals ” <a href="mailto:margin-going-uncle@duck.com" target="_blank" rel="noopener noreferrer nofollow">margin-going-uncle@duck.com<sup>@</sup></a>”, dat alle mail doorstuurt naar je echte mailadres. Dat heeft naast privacy nog een tweede voordeel: als je spam krijgt blokkeer je gewoon het dummy mailadres. Het creëren van mailaliassen is geïntegreerd in veel wachtwoordmanagers. Net zoals je wachtwoorden willekeurig kunt genereren, kun je dus ook mailaliassen willekeurig genereren. Ik gebruik de gratis  <a href="https://search.brave.com/search?q=duckduckgo+mail+alias+api+key&amp;source=web&amp;summary=1&amp;conversation=e282847ce0cdcba6ff68de" target="_blank" rel="nofollow">DuckDuckGo alias service<sup>↗</sup></a>. Voor Proton gebruikers met het duurdere abonnement is  <a href="https://proton.me/blog/proton-and-simplelogin-join-forces" target="_blank" rel="nofollow">Simple Login<sup>↗</sup></a> geïntegreerd in Proton Pass. Afgelopen week nog werd ik geraakt door  <a href="https://nos.nl/artikel/2602162-gestolen-data-bij-odido-zijn-goud-waard-voor-criminelen" target="_blank" rel="nofollow">het grootste datalek in de Nederlandse geschiedenis<sup>↗</sup></a>, maar omdat ik mijn account een e-mailalias gebruikte, is mijn data veel minder bruikbaar voor hackers.</p> <h3> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#wachtwoorden" target="_self" rel>Wachtwoorden</a></h3> <p>Naast e-mail is een belangrijk thema: wachtwoorden. Ik zie vaak dat mensen In plaats van het verspreid opslaan van wachtwoorden in browsers op verschillende plekken, is het aan te raden om één centrale wachtwoordmanager te gebruiken die je vervolgens aan al die browsers toevoegt. De beste optie hierbij is vanzelfsprekend  <a href="https://bitwarden.com/" target="_blank" rel="nofollow">Bitwarden<sup>↗</sup></a>. Bitwarden is gratis, open-source en wordt voortdurend door externe partijen gecontroleerd <span><button><sup> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fn-11" target="_self" rel>11</a></sup></button>.<span><span>11<span></span></span><span> <a href="https://bitwarden.com/nl-nl/help/security-faqs/" target="_blank" rel="nofollow">https://bitwarden.com/nl-nl/help/security-faqs/<sup>↗</sup></a></span><span><span></span><span>↖</span></span></span></span> Download de Bitwarden app ook op je telefoon en stel hem daar in als de wachtwoordenmanager. De sleutel tot je Bitwardenkluis is je hoofdwachtwoord. Dat moet je uit je hoofd leren. Als dat niet kan of lukt kun je het op een briefje ergens in een fysieke kluis stoppen, maar dat heeft niet de voorkeur. Ik raad je dus af om je wachtwoorden in de browser op te slaan, omdat je dan afhankelijk bent van een bepaalde soort browser, en omdat wachtwoorden nooit de <em>core business</em> van een browser zijn.</p> <h3> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#advertenties-en-tracking-inclusief-browsers" target="_self" rel>Advertenties en tracking (inclusief browsers)</a></h3> <p>Niemand wil advertenties zien, en met een paar keer klikken gelukkig hoeft dat vandaag de dag ook niet. Ik gebruik al jaren overal <em>ad blockers</em>, en ik kan me een internet met advertenties bijna niet meer voorstellen.</p> <p>Voor een vrij complete aanpak zul je je op verschillende manieren moeten wapenen, door middel van:</p> <ol><li>je keuze van webbrowser,</li> <li>extensies in diezelfde webbrowser,</li> <li>de zoekmachine die je gebruikt, en</li> <li>door het gebruik van een DNS filter, waarmee op netwerkniveau je internetgebruik ontdaan wordt van advertenties en verkeerde websites.</li></ol> <p>Er is gelukkig een groot aanbod aan privacyvriendelijke webbrowsers. Ik koos uiteindelijk voor  <a href="https://brave.com/nl/" target="_blank" rel="nofollow">Brave<sup>↗</sup></a> met  <a href="https://brave.com/nl/search/" target="_blank" rel="nofollow">Brave Search<sup>↗</sup></a> als zoekmachine. Daarvoor gebruikte ik een tijd  <a href="https://librewolf.net/" target="_blank" rel="nofollow">LibreWolf<sup>↗</sup></a>, en er bestaan nog meer goede opties, zoals  <a href="https://mullvad.net/en/browser" target="_blank" rel="nofollow">Mullvad Browser<sup>↗</sup></a>. Het voordeel van Brave is dat het uiteindelijk op Chrome gebaseerd is, en dus erg goed werkt, maar dan zonder dat je bespioneerd wordt. Ook de iOS app van Brave is erg compleet. Als browserextensies zijn  <a href="https://ublockorigin.com/" target="_blank" rel="nofollow">uBlock Origin (Lite)<sup>↗</sup></a> en I <a href="https://chromewebstore.google.com/detail/i-still-dont-care-about-c/edibdbjcniadpccecjdfdjjppcpchdlm" target="_blank" rel="nofollow">still don’t care about cookies<sup>↗</sup></a> onmisbaar om advertenties en cookie popups te verwijderen. Een DNS filter vereist ten slotte iets meer uitleg. DNS is een essentieel onderdeel van het internet. Het is een soort adresboek dat vertaalt tussen IP-adressen en websites. Iedereen moet dus gebruik maken van een DNS-dienst. Als je kies voor een DNS-dienst zoals  <a href="https://nextdns.io/" target="_blank" rel="nofollow">NextDNS<sup>↗</sup></a> wordt bovendien allerlei narigheid uit je internetverkeer gefilterd. Het is gratis en gemakkelijk te installeren op al je apparaten. Het is ook mogelijk om dit helemaal zelf te regelen, door bijvoorbeeld  <a href="https://pi-hole.net/" target="_blank" rel="nofollow">Pi-Hole<sup>↗</sup></a> of  <a href="https://adguard.com/en/adguard-home/overview.html" target="_blank" rel="nofollow">AdGuard Home<sup>↗</sup></a> op een server te installeren. Ik heb daar vanwege het gemak (nog) niet voor gekozen.</p> <h3> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#financiën" target="_self" rel>Financiën</a></h3> <p>Ons financiële systeem is in grote mate gecentraliseerd. Banken kunnen omvallen, cashgeld verliest terrein, en cryptomunten staan vooral op enkele grote cryptobeurzen. Wie vertrouw je informatie over je transacties toe, en wie niet? Welke informatie krijgen en bewaren betrokken partijen eigenlijk over je transacties? Hoe verklein je de risico’s die je loopt? Twee eigenschappen zijn het belangrijkst bij het beoordelen van de anonimiteit van betaalmethodes: privacy van de bank, en privacy van de verkoper.</p> <p>Er zijn 2 methodes die anonimiteit naar zowel de bank als de verkoper garanderen: cash en cadeaukaarten, beiden zijn tegenwoordig sterk gelimiteerd.</p> <p>Met andere woorden: <strong>cash is king</strong>. Het is de enige manier waarop <strong>niemand</strong> weet hoe je je geld uitgeeft, de bank noch de verkopende partij. Sinds 1 januari 2026 kun je in Nederland alleen nog voor aankopen van minder dan €3000,- met cash betalen<span><button><sup> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fn-13" target="_self" rel>13</a></sup></button>.<span><span>13<span></span></span><span>Rijksoverheid. (n.d.). <em>Verbod op contante betalingen vanaf € 3.000</em>.  <a href="https://www.rijksoverheid.nl/onderwerpen/financiele-sector/verbod-contante-betalingen-van-3000-euro" target="_blank" rel="nofollow">https://www.rijksoverheid.nl/onderwerpen/financiele-sector/verbod-contante-betalingen-van-3000-euro<sup>↗</sup></a></span><span><span></span><span>↖</span></span></span></span> Bovendien zullen veel mensen vinden dat cash onhandig of traag is. Cash wordt bovendien op  <a href="https://www.hartvannederland.nl/economie/geld/artikelen/steeds-minder-cash-geld-winkel-bioscoop-apotheek" target="_blank" rel="nofollow">steeds minder plekken<sup>↗</sup></a> in Nederland geaccepteerd.</p> <p>Cadeaukaarten, of waardebonnen, zijn naast cash de enige andere manier om in Nederland volledig anoniem te betalen, onder voorwaarde dat ze gekocht zijn met cash. Cadeaukaarten die je met cash koopt zijn op dit moment de enige manier om online anonieme aankopen te doen. De  <a href="https://www.rijksoverheid.nl/onderwerpen/financiele-sector/aanpak-witwassen-en-financiering-terrorisme/veelgestelde-vragen-wwft" target="_blank" rel="nofollow">Wwft<sup>↗</sup></a> limiteert de aankoop ervan echter op €150, en de online transactielimiet op slechts €50.</p> <p>Cryptomunten zijn een andere veelgehoorde optie die op het eerste oog privé <em>klinkt</em>, maar het eigenlijk bijna niet meer is. Door steeds strengere wetgeving zijn cryptobeurzen namelijk verplicht hun  <a href="https://en.wikipedia.org/wiki/Know_your_customer" target="_blank" rel="nofollow">klanten te identificeren<sup>W</sup></a> en om zich te houden aan de Wwft. Omdat de blockchain kort door de bocht een <em>openbaar kasboek</em> is, kunnen cryptotransacties zo bijna altijd teruggevoerd worden tot het individu dat oorspronkelijk zijn  <a href="https://en.wikipedia.org/wiki/Fiat_money" target="_blank" rel="nofollow">fiatgeld<sup>W</sup></a> voor crypto inruilde.</p> <p>Los van de privacy van cryptobetalingen, is een ander probleem het bewaren van je cryptomunten. Het is raadzaam om een offline cryptowallet te kopen. Zo ben je niet afhankelijk van de grote gecentraliseerde cryptobeurzen. Zo zit  <a href="https://en.wikipedia.org/wiki/Bankruptcy_of_FTX" target="_blank" rel="nofollow">het faillissement van FTX<sup>W</sup></a>, onder leiding van de beruchte schurk Sam Bankman-Fried, me nog vers in het geheugen. Ik heb recent de Trezor Model One gekocht voor een paar tientjes.</p> <table><thead><tr><th>Methode</th> <th>Bank weet ervan</th> <th>Verkoper ook</th></tr></thead> <tbody><tr><td><span>Cash</span></td> <td><span>Nee (alleen afschrift)</span></td> <td><span>Nee</span></td></tr> <tr><td><span>Cadeaukaart</span></td> <td><span>Nee (gekocht met cash)</span></td> <td><span>Nee</span></td></tr> <tr><td><span>Crypto (direct)</span></td> <td><span>Ja (sinds nieuwe wetgeving)</span></td> <td><span>Nee</span></td></tr> <tr><td><span>Credit card voor eenmalig gebruik</span></td> <td><span>Ja</span></td> <td><span>Nee</span></td></tr> <tr><td><span>Apple Pay</span></td> <td><span>Ja</span></td> <td><span>Nee</span></td></tr> <tr><td><span>Credit card of pinpas (debit card)</span></td> <td><span>Ja</span></td> <td><span>Ja</span></td></tr> <tr><td><span>PayPal</span></td> <td><span>Ja (+ aankoop)</span></td> <td><span>Ja</span></td></tr> <tr><td></td> <td></td> <td></td></tr></tbody></table> <figcaption>Tabel 1. Overzicht van de anonimiteit van verschillende betaalmethodes in Nederland.</figcaption> <p>Oké, leuk, maar ‘waar blijft dat praktische advies?’ hoor ik je denken. Veel mensen betalen immers vooral met hun telefoon, met contactloos betalen of via een webshop. Wat zijn dan nog je opties?</p> <p>Heb je een iPhone, gebruik dan liever Apple Pay dan iDeal (of Wero). Apple belooft  <a href="https://support.apple.com/en-us/101554#:~:text=Apple%20doesn't%20store%20the,be%20tied%20back%20to%20you." target="_blank" rel="nofollow">geen transactiegegevens te bewaren<sup>↗</sup></a>, en geeft  <a href="https://support.apple.com/en-us/101554#:~:text=Again%2C%20neither%20Apple%20nor%20your%20device%20sends%20your%20actual%20payment%20card%20number" target="_blank" rel="nofollow">geen persoonsgegevens aan de verkoper<sup>↗</sup></a> . iDeal is in feite hetzelfde als een normale Europese overschrijving (SEPA), waarbij je naam en rekeningnummer verplicht meegestuurd worden met je geld, dat direct op de rekening van de ontvangende partij arriveert. Hou er wel rekening mee dat je met Apple Pay afhankelijk blijft van een Amerikaans technologiebedrijf, en die liegen nog wel eens. Als je een Android telefoon hebt is Google Pay absoluut af te raden, omdat ze je betaalgegevens analyseren en doorverkopen voor marketingdoeleinden <span><button><sup> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fn-14" target="_self" rel>14</a></sup></button>.<span><span>14<span></span></span><span>Consumentenbond. (z.d.). <em>Stop met Google Pay</em>. Geraadpleegd op 17 februari 2026, van  <a href="https://www.consumentenbond.nl/acties-claims/acties/stop-met-google-pay" target="_blank" rel="nofollow">https://www.consumentenbond.nl/acties-claims/acties/stop-met-google-pay<sup>↗</sup></a></span><span><span></span><span>↖</span></span></span></span> In dat geval kun je beter kiezen voor eenmalige credit cards, bijvoorbeeld van Revolut.</p> <p>Volledige financiële privacy is dus voorbehouden aan fysieke transacties onder de €3000 en digitale transacties onder de €50. Voor privacy naar de verkoper toe, zijn er gelukkig meer opties!</p>  <figcaption>Afbeelding 1. Stroomschema voor hoe je zo anoniem mogelijk kunt betalen in Nederland</figcaption> <h3> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#twijfelgevallen" target="_self" rel>Twijfelgevallen</a></h3> <p>Wanneer is het niet nodig om voor een privacyvriendelijk alternatief te kiezen? Dat hangt af van wat <em>jij</em> belangrijk vindt.</p> <p>Voor mij persoonlijk luister ik niet naar voldoende muziek om op een alternatief voor Spotify over te stappen. Bovendien is muziek geen persoonlijke informatie, en is het geen informatie die anders verloren zou gaan. Maar als je autonomie van artiesten belangrijk vindt, zou je ervoor kunnen kiezen om over te stappen op platforms zoals Bandcamp.</p> <p>Op gebied van taalmodellen en kunstmatige intelligentie gaat de ontwikkeling van de software die de modellen als het ware verpakt en de functionaliteit uitbreidt, zo snel, dat alternatieve, self-hosted interfaces te weinig functionaliteit gaven. Bovendien waren mijn API-kosten uiteindelijk hoger dan de prijs van een maandabonnement was geweest. Ik ben hier niet tevreden over, en hou privacyvriendelijke opties zoals  <a href="https://lumo.proton.me/" target="_blank" rel="nofollow">Lumo AI<sup>↗</sup></a> (van Proton) of  <a href="https://confer.to/" target="_blank" rel="nofollow">Confer<sup>↗</sup></a> (van de maker van Signal).</p> <p>Berichtendiensten zijn de afgelopen jaren regelmatig in het nieuws geweest. Met name  <a href="https://signal.org/nl/" target="_blank" rel="nofollow">Signal<sup>↗</sup></a> heeft meerdere golven gekend waarin mensen elkaar motiveerden om over te stappen. Vanwege  <a href="https://en.wikipedia.org/wiki/Network_effect" target="_blank" rel="nofollow">netwerkeffecten<sup>W</sup></a> blijkt het vrij moeilijk om Whatsapp achter te laten. Continu wisselen tussen berichtenapps is vervelend. Om te voorkomen dat je terugvalt in Whatsappgebruik is er  <a href="https://www.beeper.com/" target="_blank" rel="nofollow">Beeper<sup>↗</sup></a>, dat een overzicht biedt van alle berichtendiensten die je gebruikt.</p> <p>Privacyvriendelijke alternatieven voor kaartenapps zijn allemaal slechter dan Google Maps. Mijn meest recente experiment in de wereld van kaartenapps is  <a href="https://www.magicearth.com/" target="_blank" rel="nofollow">Magic Earth<sup>↗</sup></a>, een Nederlands Google Maps alternatief dat je privacy respecteert. Het is tot nu toe het beste Google Maps alternatief, heeft een fietsmodus, en gebruikt actuele verkeersdata. En als je niet anders kunt of je bent ontzettend fan van Apple kun je ook nog altijd Apple Maps gebruiken.</p> <p>De richting waarin het wegen van de voor- en nadelen van een “beter” alternatief uitvalt, is dus geheel afhankelijk van je wensen, financiën, normen en waarden, etc.</p> <h2> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#vi-self-hosting" target="_self" rel>VI. Self-hosting</a></h2> <p>In dit hoofdstuk leg ik uit wat <em>self-hosting</em> inhoudt, of jij het ook moet gaan doen, en hoe mijn daadwerkelijke server er grofweg uitziet. Niet in te veel detail, want  <a href="https://nl.wikipedia.org/wiki/Security_through_obscurity" target="_blank" rel="nofollow">security through obscurity<sup>W</sup></a>. Dat doe ik aan de hand van een restaurantmetafoor die gedurende het hele stuk terugkomt.</p> <h3> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#wat-is-self-hosten" target="_self" rel>Wat is self-hosten?</a></h3> <p>Software heeft een voorkant en een achterkant. Sta me toe de metafoor van een restaurant te gebruiken. Als je gaat uit eten, zit je aan een tafeltje, waar de ober uiteindelijk je gerecht naartoe brengt. Dat is de voorkant, de <em>frontend</em>. Maar je gerecht wordt natuurlijk niet zomaar tevoorschijn getoverd: de obers komen uit een keuken, waar het eten bereid wordt, en waar verse producten aangeleverd worden, en zo verder. Dat is de achterkant, de <em>backend</em>. Moderne apps werken doorgaans niet met een <em>open keuken</em>, we hebben geen idee wat ze daar allemaal uitspoken. We moeten ze op hun blauwe ogen geloven dat ze niet in ons eten gespuugd hebben. En we kunnen alleen kiezen wat er op het menu staat. Wat als het menu verandert? Wat als dat sappige biefstuk een droge schoenlap wordt? In de echte wereld kun je dan besluiten om naar een ander restaurant te gaan. In de digitale wereld niet. Hier loopt de vergelijking mank. Want in de digitale wereld ben je vaak afhankelijk van het product wat je gebruikt. Al je data staat bij hen. Je bent gewend aan de functionaliteit. Er zijn vaak geen goede alternatieven die binnen handbereik zijn. En dat weet het bedrijf. Daarom kunnen ze doen wat ze willen. Met hun prijzen, met je data. Want je kunt nergens anders naartoe.</p> <p>Om toch weer even terug naar het restaurant te gaan: de ‘open keuken’ is analoog aan <em>open-source</em>. Bij een open keuken kun je precies in de gaten houden hoe je eten bereid wordt. In theorie zou je het gerecht thuis na kunnen maken. En als je iets niet lekker vindt, dan kun je erachter komen tijdens welke stap het mis ging. Als ze de prijzen verhogen, zou je met hun recept naar een ander restaurant kunnen gaan.</p> <p>Je zou ook nóg een stapje verder kunnen gaan. Stel je voor dat je met dat recept in de hand een stukje keuken huurt in een nieuw soort openbaar, gedeeld restaurant, waar mensen dan aan de slag gaan om je recept voor je te maken. Dat is wat  <a href="https://en.wikipedia.org/wiki/Self-hosting_(network)" target="_blank" rel="nofollow">self-hosting<sup>W</sup></a> is. Je zit niet alleen in het restaurant, je overziet je eigen restaurant, en als iets je niet zint, dan pas je het aan.</p> <p>Self-hosten geeft dus maximale controle over zowel de frontend als de backend van je software. Over alle beslissingen die over jouw data en over je software genomen wordt kun je een veto uitspreken. Maar dat wil gelukkig niet zeggen dat je ook alles zelf hoeft te doen.</p> <p>Want er zijn levendige en zeer actieve gemeenschappen van software die je kunt self-hosten. Die gemeenschappen variëren van volledig draaiend op vrijwilligers, tot bedrijven die hun product gratis aanbieden voor <em>self-hosters</em>, tot bedrijven die geld vragen om hun software te mogen self-hosten. Ik raad je aan om deze  <a href="https://github.com/awesome-selfhosted/awesome-selfhosted" target="_blank" rel="nofollow">zeer uitgebreide lijst van software die je kunt self-hosten<sup>GH</sup></a> eens te bekijken om een idee te krijgen. Je hoeft de software dus zeker niet zelf te maken!</p> <p>Dat neemt alleen niet weg dat self-hosten ook grote verantwoordelijkheid schept. Want wat als je medewerkers de deur vergeten af te sluiten ‘s avonds, of je ouderwetse slot kan gemakkelijk geforceerd worden, of je hebt geen camera’s opgehangen? Dan is het makkelijk inbreken. Ook dat hoef je gelukkig niet allemaal zelf te verzinnen, maar je blijft er wel verantwoordelijk voor.</p> <h3> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#moet-ik-gaan-self-hosten" target="_self" rel>Moet ik gaan self-hosten?</a></h3> <p>Dat hangt van je antwoord op een aantal vragen af.</p> <p><strong>Kun je redelijk programmeren?</strong> Zoals ik al zei moet je in staat zijn om je eigen <em>system administrator</em> te zijn. Je moet in de basis begrijpen dat je via de <em>terminal</em> toegang hebt tot de gehele computer. Je moet instructies kunnen volgen om dingen te installeren. Je moet iets weten van syntax, foutmeldingen, en problemen oplossen. Ik moet hier wel bij zeggen dat je met kunstmatige intelligentie een heel eind komt.</p> <p><strong>Vind je zelfstandigheid belangrijker dan gemak?</strong> Het is nu eenmaal zo dat een <em>gehoste</em> versie van een bepaalde app altijd minder moeite kost dan de versie die je <em>selfhost</em>. Bovendien kunnen er dingen stuk gaan, en kan het zo zijn dat je een paar uur vastloopt op het installeren van een bepaalde <em>feature</em>.</p> <p><strong>Durf je het aan?</strong> Self-hosten is een risico. Een risico dat het je niet lukt en dat je een paar uur van je leven verspild hebt (hoewel je dan wel iets geleerd hebt). Een risico dat je je data kwijtraakt (dus maak altijd  <a href="https://www.backblaze.com/blog/the-3-2-1-backup-strategy/" target="_blank" rel="nofollow">voldoende backups<sup>↗</sup></a>!). Zelfs een risico dat je data gestolen wordt.</p> <p><strong>Lijkt het je leuk?</strong> Je hebt volledig de touwtjes in handen om je digitale leven zelf in te richten. Je leert spelenderwijs hoe computers met elkaar communiceren en hoe de <em>backend</em> van software die je je hele leven al gebruikt eigenlijk werkt.</p> <p>Als je antwoord op al deze vragen ja is, dan is self-hosten misschien wel iets voor jou.</p> <h3> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#een-overzicht-van-mijn-server" target="_self" rel>Een overzicht van mijn server</a></h3> <p>Mijn server huur ik bij een Duits bedrijf dat Hetzner heet. De server heeft 8 GB werkgeheugen (RAM) met 1 terabyte aan opslag. Het geheel kost me ongeveer 10 euro per maand. Dat is vergelijkbaar met de kosten bij cloudproviders zoals Apple of Google. De server draait op het besturingssysteem Ubuntu, een versie van Linux. Op die server loopt software die <strong>Docker</strong> heet, en met Docker creëer je containers. Containers zijn geïsoleerde eilandjes waarin een app of service draait. <strong>socket-proxy</strong> zorgt dat containers niet meer dan nodig met elkaar kunnen communiceren. Het geheel is te vinden via een domeinnaam die op mijn naam geregistreerd staat, en alle apps hebben hun eigen subdomein, bijvoorbeeld: <code>restaurant.nl/mise-en-place</code>. Bij de voordeur staat <strong>Traefik</strong>, een dienst die bezoekers die bij <code>restaurant.nl/mise-en-place</code> aankloppen, doorstuurt naar de betreffende ruimte. Die categorie software heet een <em>reverse proxy</em>. De achterdeur is gebarricadeerd door een <strong>firewall</strong>. Natuurlijk mag niet elke bezoeker naar elk subdomein. <strong>Authelia</strong> vraagt bezoekers om hun gebruikersnaam en wachtwoord, inclusief tweefactorauthenticatie. In werkelijkheid ben ik de enige bezoeker. Als bezoekers verdacht gedrag vertonen, doordat ze er onbetrouwbaar uitzien (ze bezoeken vanuit een verdacht IP-adres), of doordat ze verdachte dingen doen (zoals meerdere keren het verkeerde wachtwoord invoeren), dan is er altijd nog <strong>Crowdsec</strong>: een soort uitsmijter en beveiliger, die voortdurend alle activiteit op mijn server in de gaten houdt. Om ervoor te zorgen dat ik op de hoogte ben als er iets mis gaat, monitort <strong>Beszel</strong> voortdurend hoe hard de server moet werken, of de schijf vol is, of alle apps online zijn. Als dat het geval is, dan krijg ik via <strong>ntfy</strong> een berichtje op mijn telefoon. En tot slot zorg <strong>Wireguard</strong> ervoor dat… En nu wordt de restaurantanalogie uitdagend. Stel je voor dat het restaurant ondergronds is, en alleen te bereiken is via een tunnel vanuit je eigen kelder. Anderen weten niet eens van het bestaan van het restaurant af. Wireguard helpt om een VPN-tunnel te creëren, waarmee je je website van het openbare internet af kunt halen. Als anderen dan naar het adres van de app toegaan, lijkt het alsof het om een niet-bestaande website gaat.</p> <p>Tot dusver de <em>overhead</em>. Want uiteindelijk gaat dit alles er om dat de kernapplicaties veilig en wel hun werk kunnen doen.</p> <h3> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#kernapplicaties" target="_self" rel>Kernapplicaties</a></h3> <p>Hier volgt een overzicht van de belangrijkste applicaties die mijn digitale leven op dit moment vormgeven:</p> <ul><li> <a href="https://manual.seafile.com/latest/" target="_blank" rel="nofollow">Seafile<sup>↗</sup></a>. Deze app bevat al mijn bestanden, synchroniseert deze met mijn laptop, en vormt de achterkant van de PDFs van wetenschappelijke studies die ik in Zotero heb verzameld (via WebDAV).</li> <li> <a href="https://immich.app/" target="_blank" rel="nofollow">Immich<sup>↗</sup></a>. Dit is mijn fotoapp die automatisch de foto’s die ik met mijn iPhone maak upload naar mijn server en ze via een mobiele app en webapp beschikbaar maakt om doorheen te kijken en zoeken. Ik ben groot fan van de semantische zoekopties en de gezichtsherkenning. Het geheel doet zeker niet onder voor Apple Photos.</li> <li> <a href="https://github.com/dani-garcia/vaultwarden" target="_blank" rel="nofollow">Vaultwarden<sup>GH</sup></a>. Deze open-source implementatie van Bitwarden is de meestgebruikte self-hosted variant van Bitwarden. Het is een volledige implementatie van de app, en werkt met de reguliere Bitwarden mobiele en webapps.</li> <li> <a href="https://syncthing.net/" target="_blank" rel="nofollow">Syncthing<sup>↗</sup></a>. Deze app doet aan real-time synchronisatie van mijn  <a href="https://obsidian.md/" target="_blank" rel="nofollow">Obsidian<sup>↗</sup></a> Vault (notitieapp) tussen mijn laptop, server en telefoon.</li> <li> <a href="https://github.com/tchapi/davis" target="_blank" rel="nofollow">Davis<sup>GH</sup></a>. Deze app is de bron waar mijn kalender, contacten en herinneringen in staan. Ik kan gewoon op mijn apparaten inloggen bij de Apple Calendar, Contacts en Reminders app, maar de gegevens heb ik zelf in beheer.</li> <li> <a href="https://about.gitea.com/" target="_blank" rel="nofollow">Gitea<sup>↗</sup></a>. Als je programmeert, dan ken je Github, een <em>gehoste</em> implementatie van de meestgebruikte open-source software voor versiebeheer van software:  <a href="https://nl.wikipedia.org/wiki/Git_(software)" target="_blank" rel="nofollow">Git<sup>W</sup></a>. Gitea werkt vergelijkbaar als Github, maar draait volledig op mijn eigen server. Hiermee hou ik versies van alle software op de server bij, zodat ik altijd terug kan keren naar eerdere versies als er iets mis ging. Ook de website waarop je dit leest wordt gepubliceerd via mijn eigen Gitea <em>instance</em>.</li> <li> <a href="https://freshrss.org/index.html" target="_blank" rel="nofollow">FreshRSS<sup>↗</sup></a>. RSS is een manier waarmee je op de hoogte kunt blijven van je favoriete publicaties, zoals de  <a href="https://nos.nl/feeds" target="_blank" rel="nofollow">NOS<sup>↗</sup></a>, of  <a href="https://www.volkskrant.nl/voorpagina/rss.xml" target="_blank" rel="nofollow">de Volkskrant<sup>↗</sup></a>, of  <a href="https://hnrss.github.io/" target="_blank" rel="nofollow">HackerNews<sup>↗</sup></a>, zelfs Youtubekanalen hebben een RSS-feed. Die kun je allemaal samenvoegen in een RSS-lezer, die al die abonnementen voor je samenvoegt tot een enkele <em>feed</em>. Dat gebeurt zonder dat iemand bij kan houden wat je leest of waar je op geabonneerd bent.</li> <li> <a href="https://github.com/glanceapp/glance" target="_blank" rel="nofollow">Glance<sup>GH</sup></a>. Dit is de startpagina van mijn server. Het portaal waar alles samenkomt. Hier staan links naar mijn apps, andere veelgebruikte links, en de laatste berichten uit de RSS-feeds waar ik op geabonneerd ben.</li></ul> <p>Zoek je meer inspiratie of staat je toepassing hier niet tussen? Kijk dan eens in  <a href="https://github.com/awesome-selfhosted/awesome-selfhosted" target="_blank" rel="nofollow">deze lijst<sup>GH</sup></a>. Wil je echt zelf aan de slag? Dan kun je een eerste stukje beveiliging van je server afkijken van  <a href="https://github.com/buildplan/du_setup" target="_blank" rel="nofollow">hier<sup>GH</sup></a>.</p> <h3> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#mijn-volledige-set-up" target="_self" rel>Mijn volledige set-up</a></h3> <p>Hieronder heb ik een volledig overzicht uitgeschreven van de diensten die ik eerst gebruikte en waar ik nu op overgestapt ben.</p> <table><thead><tr><th>Categorie</th> <th>Van</th> <th>Naar</th></tr></thead> <tbody><tr><td><span>Server</span></td> <td><span>-</span></td> <td><span> <a href="https://hetzner.com/" target="_blank" rel="nofollow">Hetzner<sup>↗</sup></a> virtual private server (VPS) met 8GB RAM en 80GB SSD</span></td></tr> <tr><td><span>Domeinnaamregistratie</span></td> <td><span>Cloudflare (big tech uit de VS)</span></td> <td><span> <a href="https://www.infomaniak.com/" target="_blank" rel="nofollow">Infomaniak<sup>↗</sup></a> (Zwitsers privacyvriendelijk bedrijf)</span></td></tr> <tr><td><span>DNS (Domain name service)</span></td> <td><span>Cloudflare</span></td> <td><span> <a href="https://desec.io/" target="_blank" rel="nofollow">deSEC<sup>↗</sup></a>. Duitse non-profit, gratis)</span></td></tr> <tr><td><span>CDN (Content delivery network)</span></td> <td><span>Cloudflare</span></td> <td><span>geen (niet nodig voor een individuele website). Ik overweeg Bunny CDN, maar zie nu geen noodzaak.</span></td></tr> <tr><td><span>Cloudopslag</span></td> <td><span>iCloud 200GB</span></td> <td><span>Hetzner Storage Box (1TB)</span></td></tr> <tr><td><span>Bestanden</span></td> <td><span>iCloud</span></td> <td><span>SeaFile (VPS)</span></td></tr> <tr><td><span>Kalender</span></td> <td><span>Apple Calendar</span></td> <td><span>Davis (VPS)</span></td></tr> <tr><td><span>Contacten</span></td> <td><span>Apple Contacts</span></td> <td><span>Davis (VPS)</span></td></tr> <tr><td><span>Herinneringen</span></td> <td><span>Apple Reminders</span></td> <td><span>Davis (VPS)</span></td></tr> <tr><td><span>Mail</span></td> <td><span>iCloud Mail</span></td> <td><span> <a href="https://proton.me/nl" target="_blank" rel="nofollow">Proton<sup>↗</sup></a> Mail</span></td></tr> <tr><td><span>Mailaliassen</span></td> <td><span>-</span></td> <td><span>DuckDuckGo aliases (free)</span></td></tr> <tr><td><span>Synchronisatie van notities</span></td> <td><span>Obsidian Sync</span></td> <td><span>SyncThing (VPS)</span></td></tr> <tr><td><span>Browser</span></td> <td><span>Safari</span></td> <td><span>Brave (privacyvriendelijk)</span></td></tr> <tr><td><span>Zoekmachine</span></td> <td><span>Google</span></td> <td><span>Brave Search / DuckDuckGo</span></td></tr> <tr><td><span>eBooks</span></td> <td><span>Apple Books</span></td> <td><span> <a href="https://www.zotero.org/" target="_blank" rel="nofollow">Zotero<sup>↗</sup></a> (gratis en open-source, ondersteunt eBooks)</span></td></tr> <tr><td><span>Muziek</span></td> <td><span>Spotify</span></td> <td><span>-</span></td></tr> <tr><td><span>Wetenschappelijke papers</span></td> <td><span>Zotero Sync</span></td> <td><span>Seafile WebDAV</span></td></tr> <tr><td><span>MacOS search</span></td> <td><span>Raycast</span></td> <td><span>Spotlight</span></td></tr> <tr><td><span>Navigatie</span></td> <td><span>Google Maps</span></td> <td><span> <a href="https://www.magicearth.com/" target="_blank" rel="nofollow">Magic Earth<sup>↗</sup></a></span></td></tr> <tr><td><span>Wachtwoorden</span></td> <td><span>Bitwarden</span></td> <td><span>Vaultwarden (VPS, <em>self-hosted</em> versie van Bitwarden)</span></td></tr> <tr><td><span>Foto’s</span></td> <td><span>Apple Photos</span></td> <td><span>Immich (VPS)</span></td></tr> <tr><td><span>Audiotranscriptie</span></td> <td><span>-</span></td> <td><span>Handy (FOSS, MacOS) of  <a href="https://spokenly.app/" target="_blank" rel="nofollow">Spokenly<sup>↗</sup></a> (iOS / MacOS) met lokale modellen</span></td></tr> <tr><td><span>VPN</span></td> <td><span>-</span></td> <td><span> <a href="https://surfshark.com/" target="_blank" rel="nofollow">SurfShark<sup>↗</sup></a> (Nederlands) of Mullvad VPN</span></td></tr> <tr><td><span>Berichten</span></td> <td><span>-</span></td> <td><span> <a href="https://www.beeper.com/download" target="_blank" rel="nofollow">Beeper<sup>↗</sup></a> (voorkeur voor Signal)</span></td></tr> <tr><td><span>DNS</span></td> <td><span>-</span></td> <td><span> <a href="https://nextdns.io/nl" target="_blank" rel="nofollow">NextDNS<sup>↗</sup></a> (iedereen aan te bevelen, filtert je internetverkeer)</span></td></tr> <tr><td><span>Betalingen (in volgorde van voorkeur)</span></td> <td><span>-</span></td> <td><span>cash, Revolut throwaway, Apple Pay, iDeal, credit card, debit card, Paypal</span></td></tr> <tr><td><span>Nieuwsbrieven</span></td> <td><span>e-mail</span></td> <td><span>FreshRSS (VPS)</span></td></tr> <tr><td><span>Bestanden versturen</span></td> <td><span>WeTransfer</span></td> <td><span> <a href="https://send.vis.ee/" target="_blank" rel="nofollow">Send<sup>↗</sup></a></span></td></tr> <tr><td><span>Cryptomunten</span></td> <td><span>BitVavo</span></td> <td><span> <a href="https://trezor.io/trezor-model-one" target="_blank" rel="nofollow">Trezor Model One<sup>↗</sup></a></span></td></tr></tbody></table> <figcaption>Tabel 2. Volledig overzicht van alle diensten waar ik naartoe ben overgestapt, privacyvriendelijk dan wel op mijn eigen server.</figcaption> <h2> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#viii-samenvatting-en-conclusie" target="_self" rel>VIII. Samenvatting en conclusie</a></h2> <p>Dit essay legt uit dat  <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#ii-maar-ik-heb-toch-niets-te-verbergen" target="_self" rel>‘maar ik heb toch niets te verbergen?’ niet volstaat</a> als argument om geen regie te hoeven nemen over je digitale leven. Want er staat veel op het spel. Mensen zijn niet toegerust om weerstand te bieden tegen de manipulatieve, schadelijke, en gevaarlijke technologie die, gedreven door commerciële belangen, steeds meer van onze tijd, informatie en geld opslokt. En niet alleen bedrijven, maar  <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#iii-een-europees-perspectief-op-privacy-en-technologie" target="_self" rel>ook overheden</a> stellen alles in het werk om controle te krijgen over onze identiteit en onze uitgaven. Gelukkig is het gemakkelijker dan je denkt om de teugels weer in handen te nemen.</p> <p>Voor de gemiddelde lezer zit de meeste winst erin om  <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#v-verdieping-beheerde-alternatieven" target="_self" rel>app voor app te wisselen</a> naar een betaald, privacyvriendelijk, en bij voorkeur open-source alternatief. En voor technisch onderlegde mensen met een grote behoefte aan autonomie is er de wereld van het  <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#vi-self-hosting" target="_self" rel>self-hosten</a>.</p> <p>Want als het product gratis is, ben jij het product, en dat moet je niet willen. Het opgeven van je privacy komt eerder voort uit moedeloosheid dan uit onverschilligheid. Daarom zou ik de schouderophalende cynicus willen vragen om op zoek te gaan naar de teleurgestelde idealist die in ieder van ons schuilt.</p> <div><hr><h6>Bibliography &amp; Footnotes</h6> <ol><li>Humprecht, E., Amsler, M., Esser, F., &amp; Van Aelst, P. (2024). Emotionalized Social Media Environments: How Alternative News Media and Populist Actors Drive Angry Reactions. <em>Political Communication</em>, <em>41</em>(4), 559–587.  <a href="https://koenraijer.com/archive/humprecht_2024.pdf" target="_self" rel>https://doi.org/10.1080/10584609.2024.2350416<sup>PDF</sup></a> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fnref-8" target="_self" rel>↩</a></li> <li>Seetharaman, D. (2025, April 16). Zuckerberg says Meta’s share of time people spend on social media declined. <em>The Information</em>.  <a href="https://www.theinformation.com/articles/zuckerberg-says-metas-share-time-people-spend-social-media-declined" target="_blank" rel="nofollow">https://www.theinformation.com/articles/zuckerberg-says-metas-share-time-people-spend-social-media-declined<sup>↗</sup></a> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fnref-1" target="_self" rel>↩</a></li> <li>Solove, D. J. (2011, May 15). Why privacy matters even if you have “nothing to hide.” <em>The Chronicle of Higher Education</em>.  <a href="https://koenraijer.com/archive/solove_2011.pdf" target="_self" rel>https://www.chronicle.com/article/why-privacy-matters-even-if-you-have-nothing-to-hide/<sup>PDF</sup></a> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fnref-2" target="_self" rel>↩</a></li> <li>European Commission. (2025). <em>Proposal for a Regulation of the European Parliament and of the Council amending Regulation (EU) 2021/1232 as regards the extension of its period of application</em> (COM(2025) 797 final).  <a href="https://ec.europa.eu/transparency/documents-register/detail?ref=COM(2025)797&amp;lang=en" target="_blank" rel="nofollow">https://ec.europa.eu/transparency/documents-register/detail?ref=COM(2025)797&amp;lang=en<sup>↗</sup></a> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fnref-3" target="_self" rel>↩</a></li> <li>Michel Portier. (2025, 15 november). Chat Control: Via achterdeur doorheen gedrukt? Geen complot maar beleid | Michel Portier (Nr. 2122) [Podcastaflevering]. In De Nieuwe Wereld. Stichting De Nieuwe Wereld.  <a href="https://open.spotify.com/episode/1QVQ1viHAbvBzWp8Sp0wyQ" target="_blank" rel="nofollow">https://open.spotify.com/episode/1QVQ1viHAbvBzWp8Sp0wyQ<sup>↗</sup></a> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fnref-4" target="_self" rel>↩</a></li> <li>Bogosavac, N. (2026, 23 januari). <em>Steun voor socialemediaverbod voor jongeren groeit, vooral onder gen Z</em>. NOS Nieuws.  <a href="https://nos.nl/artikel/2599319-steun-voor-socialemediaverbod-voor-jongeren-groeit-vooral-onder-gen-z" target="_blank" rel="nofollow">https://nos.nl/artikel/2599319-steun-voor-socialemediaverbod-voor-jongeren-groeit-vooral-onder-gen-z<sup>↗</sup></a> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fnref-5" target="_self" rel>↩</a></li> <li>De Wild, M. (2026, 2 februari). <em>Liveblog hoger beroep Meta 26 januari</em>. Bits of Freedom.  <a href="https://www.bitsoffreedom.nl/2026/02/02/liveblog-hoger-beroep-meta-26-januari/" target="_blank" rel="nofollow">https://www.bitsoffreedom.nl/2026/02/02/liveblog-hoger-beroep-meta-26-januari/<sup>↗</sup></a> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fnref-6" target="_self" rel>↩</a></li> <li>Ye, X. (2025). Dark Patterns and Addictive Designs. <em>Weizenbaum Journal of the Digital Society</em>, <em>5</em>(3).  <a href="https://koenraijer.com/archive/ye_2025.pdf" target="_self" rel>https://doi.org/10.34669/wi.wjds/5.3.2<sup>PDF</sup></a> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fnref-7" target="_self" rel>↩</a></li> <li><strong>Open-source</strong> houdt in dat de broncode openbaar is, en door anderen gecontroleerd, verbeterd en overgenomen mag worden. Zo kan bijvoorbeeld worden gecontroleerd of er geen achterdeurtjes in de code zitten. Vaak is er een bepaalde mate van democratisering in de richting waar een project op gaat, en mocht je je niet in die richting kunnen vinden, dan kun je het project ook <em>forken</em> en er je eigen draai aan geven! <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fnref-9" target="_self" rel>↩</a></li> <li><strong>Dit geldt natuurlijk voor alles hier</strong>: kom je er niet uit, vraag een Large Language Model (LLM) om je te helpen. Met een beetje gezond verstand zul je merken dat je een heel eind komt. <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fnref-10" target="_self" rel>↩</a></li> <li> <a href="https://bitwarden.com/nl-nl/help/security-faqs/" target="_blank" rel="nofollow">https://bitwarden.com/nl-nl/help/security-faqs/<sup>↗</sup></a> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fnref-11" target="_self" rel>↩</a></li> <li>Rijksoverheid. (n.d.). <em>Verbod op contante betalingen vanaf € 3.000</em>.  <a href="https://www.rijksoverheid.nl/onderwerpen/financiele-sector/verbod-contante-betalingen-van-3000-euro" target="_blank" rel="nofollow">https://www.rijksoverheid.nl/onderwerpen/financiele-sector/verbod-contante-betalingen-van-3000-euro<sup>↗</sup></a> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fnref-13" target="_self" rel>↩</a></li> <li>Consumentenbond. (z.d.). <em>Stop met Google Pay</em>. Geraadpleegd op 17 februari 2026, van  <a href="https://www.consumentenbond.nl/acties-claims/acties/stop-met-google-pay" target="_blank" rel="nofollow">https://www.consumentenbond.nl/acties-claims/acties/stop-met-google-pay<sup>↗</sup></a> <a href="https://koenraijer.com/individuele-digitale-soevereiniteit#fnref-14" target="_self" rel>↩</a></li></ol></div>]]></content:encoded>
            <category><![CDATA[Dutch]]></category>
            <category><![CDATA[Tinkering]]></category>
        </item>
        <item>
            <title><![CDATA[Tinkering with the PineTime smartwatch]]></title>
            <link>https://koenraijer.com/pinetime</link>
            <guid isPermaLink="true">https://koenraijer.com/pinetime</guid>
            <pubDate>Sun, 16 Feb 2025 00:00:00 GMT</pubDate>
            <atom:updated>2025-02-16T00:00:00.000Z</atom:updated>
            <dc:creator><![CDATA[Koen Raijer]]></dc:creator>
            <description><![CDATA[Learn how to edit the InfiniTime firmware and flash it to the PineTime using the NRFConnect app for iOS and Android. Perfect for beginners interested in tinkering with their PineTime.]]></description>
            <content:encoded><![CDATA[<p>My  <a href="https://pine64eu.com/product/pinetime-smartwatch-sealed/" target="_blank" rel="nofollow">PineTime<sup>↗</sup></a> arrived on the 14th of February, 2025. The PineTime is a light-weight smartwatch equipped with a photoplethysmography (PPG) sensor and an accelerometer. It’s cheap, does not sell your data, and it’s fully open-source. Owners can modify its hardware and software at will. This post will outline procedures, links, tips and snippets for tinkering with InfiniTime (PineTime’s default  <a href="https://en.wikipedia.org/wiki/Firmware" target="_blank" rel="nofollow">firmware<sup>W</sup></a>).</p> <p> </p><div><figure><img src="https://koenraijer.com/posts/pinetime/pinetime_on_wrist.jpeg" alt="The PineTime on-wrist" title="The PineTime on-wrist"> <figcaption>The PineTime on-wrist</figcaption></figure></div> <h2> <a href="https://koenraijer.com/pinetime#editing-the-firmware" target="_self" rel>Editing the firmware</a></h2> <p>Explains how we can start editing InfiniTime.</p> <ol><li>Fork the  <a href="https://github.com/InfiniTimeOrg/InfiniTime" target="_blank" rel="nofollow">InfiniTime repository<sup>GH</sup></a>. This will create a copy of the repository in our own Github account.</li> <li>Go to the new fork, mine lives at  <a href="https://github.com/koenraijer/InfiniTime" target="_blank" rel="nofollow">https://github.com/koenraijer/InfiniTime<sup>GH</sup></a>, yours will live at <code>https://github.com/[USERNAME]/InfiniTime</code>.</li> <li>Edit a file in the repository and commit your changes. For example, to change the stopwatch app, go to  <a href="https://github.com/koenraijer/InfiniTime/blob/main/src/displayapp/screens/StopWatch.cpp" target="_blank" rel="nofollow"><code>InfiniTime/src/displayapp/screens/StopWatch.cpp</code><sup>GH</sup></a>.</li> <li>Every time we commit a change to our fork, the source code is automatically converted by a GitHub Action ( <a href="https://github.com/koenraijer/InfiniTime/blob/main/.github/workflows/main.yml" target="_blank" rel="nofollow">my fork’s version<sup>GH</sup></a>).</li></ol> <p>Github also tracks updates we make to our fork, and also allows us to <strong>pull</strong> updates from the original PineTime repository and apply them to our fork.</p> <p>This allows us to:</p> <ul><li>Submit a pull request if we’ve made a useful update. If our pull request is accepted, our changes become part of the official project. This is how open source projects are maintained and improved.</li> <li>Update our local version with the official project so we don’t miss out on other people’s contributions.</li></ul> <h2> <a href="https://koenraijer.com/pinetime#flashing-our-custom-firmware" target="_self" rel>Flashing our custom firmware</a></h2> <p>This explains how to apply edits made to our InfiniTime fork and update our PineTime with them. The process of reprogramming firmware is known as <strong>flashing</strong>. It involves the writing of new firmware onto the device’s internal memory. Flashing is perfectly possible with a <strong>sealed</strong> PineTime. We’ll be using the NRFConnect app to flash our custom firmware to the PineTime over BlueTooth.</p> <ol><li>On our phone, download the NRFConnect app ( <a href="https://apps.apple.com/gb/app/nrf-connect-for-mobile/id1054362403" target="_blank" rel="nofollow">App Store<sup>↗</sup></a>,  <a href="https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&amp;hl=en&amp;gl=US" target="_blank" rel="nofollow">Google Play<sup>↗</sup></a>).</li> <li>Now we need one of the files built by the action that ran after we committed our change. We can follow the next steps on our phone or on our computer, but we must have access to the downloaded file on our phone.</li> <li>In our fork, go to the <em>Actions</em> tab. We should see something like this:</li></ol> <p> </p><div><figure><img src="https://koenraijer.com/posts/pinetime/actions1.png" alt title> </figure></div> <ol><li>This means that the <code>CI</code> action ran successfully (this is the action linked to previously). Let’s click on the run.</li></ol> <p> </p><div><figure><img src="https://koenraijer.com/posts/pinetime/actions2.png" alt title> </figure></div> <ol><li>At the bottom of the screen, we’ll see a list of <strong>artifacts</strong>. These are the files created by the action. We need the <code>InfiniTime DFU main</code> file. Let’s click on the download icon to the right. The file should be called <code>InfiniTime DFU main.zip</code>.</li></ol> <p> </p><div><figure><img src="https://koenraijer.com/posts/pinetime/artifacts.png" alt title> </figure></div> <ol><li>On our phone, open the NRFConnect app. In the <em>Scanner</em> tab, look for “InfiniTime”. Click on <em>Connect</em>. If it’s not there, make sure the PineTime is not connected to a companion app.</li></ol> <p> </p><div><figure><img src="https://koenraijer.com/posts/pinetime/nrfconnect1.jpeg" alt title> </figure></div> <ol><li>Now click on <em>Open Document Picker</em> and select the <code>InfiniTime DFU main.zip</code> file on our phone.</li></ol> <p> </p><div><figure><img src="https://koenraijer.com/posts/pinetime/nrfconnect2.jpeg" alt title> </figure></div> <ol><li>Let’s scroll down until a <em>Start</em> button appears and click on it.</li></ol> <p> </p><div><figure><img src="https://koenraijer.com/posts/pinetime/nrfconnect3.jpeg" alt title> </figure></div> <ol><li>The file will now be uploaded to your PineTime over BlueTooth, as indicated by the progress indicator on the app.</li></ol> <p> </p><div><figure><img src="https://koenraijer.com/posts/pinetime/nrfconnect4.jpeg" alt title> </figure></div> <ol><li>The PineTime will now show that it’s updating.</li></ol> <p> </p><div><figure><img src="https://koenraijer.com/posts/pinetime/firmware_update.jpeg" alt title> </figure></div> <h2> <a href="https://koenraijer.com/pinetime#links-and-resources" target="_self" rel>Links and resources</a></h2> <ul><li> <a href="https://wiki.pine64.org/index.php/PineTime" target="_blank" rel="nofollow">Manufacturer’s Wiki page<sup>↗</sup></a></li> <li> <a href="https://lupyuen.github.io/pinetime-rust-mynewt/articles/cloud" target="_blank" rel="nofollow">Article: Build PineTime Firmware in the Cloud with GitHub Actions (dated, still useful)<sup>↗</sup></a></li> <li> <a href="https://blog.pankajraghav.com/2021/04/03/PINETIME-STOPCLOCK.html" target="_blank" rel="nofollow">Article: Creating a stopwatch in Pinetime<sup>↗</sup></a></li></ul>]]></content:encoded>
            <category><![CDATA[Tinkering]]></category>
        </item>
        <item>
            <title><![CDATA[Mental disorders as symptom networks]]></title>
            <link>https://koenraijer.com/network-theory</link>
            <guid isPermaLink="true">https://koenraijer.com/network-theory</guid>
            <pubDate>Mon, 09 Dec 2024 00:00:00 GMT</pubDate>
            <atom:updated>2026-01-27T00:00:00.000Z</atom:updated>
            <dc:creator><![CDATA[Koen Raijer]]></dc:creator>
            <description><![CDATA[Introduction to a network-based view on psychopathology inspired by Eiko Fried.]]></description>
            <content:encoded><![CDATA[<p>Network theory offers a fundamental shift in how we understand mental disorders: rather than viewing them as discrete conditions with invisible underlying causes, it conceptualizes them as ever-changing networks of interacting symptoms, emotions, behaviors and traits <span><button><sup> <a href="https://koenraijer.com/network-theory#fn-1" target="_self" rel>1</a></sup></button>.<span><span>1<span></span></span><span>Reeves, J. W., &amp; Fisher, A. J. (2020). <em>An examination of idiographic networks of posttraumatic stress disorder symptoms</em>.  <a href="https://doi.org/10.1002/jts.22491" target="_blank" rel="nofollow">https://doi.org/10.1002/jts.22491<sup>↗</sup></a></span><span><span></span><span>↖</span></span></span></span> It is both a departure from and an extension to the ‘common cause’ model (also known as the latent disease model). In the common cause model, which underlies classification systems like DSM-5 and ICD-10, symptoms are viewed as mere consequences of an underlying disorder — like depression or anxiety — without causal relationships between symptoms. This has shaped psychiatry and psychology ever since the conception of the DSM-III in 1980 <span><button><sup> <a href="https://koenraijer.com/network-theory#fn-2" target="_self" rel>2</a></sup></button>.<span><span>2<span></span></span><span>Borgogna, N. C., Owen, T., &amp; Aita, S. L. (2024). The absurdity of the latent disease model in mental health: 10,130,814 ways to have a DSM-5-TR psychological disorder. <em>Journal of Mental Health</em>, <em>33</em>(4), 451–459.  <a href="https://doi.org/10.1080/09638237.2023.2278107" target="_blank" rel="nofollow">https://doi.org/10.1080/09638237.2023.2278107<sup>↗</sup></a></span><span><span></span><span>↖</span></span></span></span> Network theory, in contrast, proposes that mental disorders are macroscopic states that emerge from a complex web of causal interactions between symptoms, situated in a person, situated in the world. Symptoms aren’t mere consequences of the disorder, <em>they constitute it</em> <span><button><sup> <a href="https://koenraijer.com/network-theory#fn-3" target="_self" rel>3</a></sup></button>.<span><span>3<span></span></span><span>Roefs, A., Fried, E. I., Kindt, M., Martijn, C., Elzinga, B., Evers, A. W. M., Wiers, R. W., Borsboom, D., &amp; Jansen, A. (2022). A new science of mental disorders: Using personalised, transdiagnostic, dynamical systems to understand, model, diagnose and treat psychopathology. <em>Behaviour Research and Therapy</em>, <em>153</em>, 104096.  <a href="https://doi.org/10.1016/j.brat.2022.104096" target="_blank" rel="nofollow">https://doi.org/10.1016/j.brat.2022.104096<sup>↗</sup></a></span><span><span></span><span>↖</span></span></span></span></p> <p>As a discipline, network theory is far from new. It can be situated in a much broader field known as  <a href="https://en.wikipedia.org/wiki/Complex_system" target="_blank" rel="nofollow">complexity science<sup>W</sup></a>, which has crossed paths with cognitive neuroscience, ecology, sociology, economics, computer science, epidemiology, and more. The study of complex systems has taken many forms throughout the 20th century: from  <a href="https://en.wikipedia.org/wiki/Game_theory" target="_blank" rel="nofollow">game theory<sup>W</sup></a>, to  <a href="https://en.wikipedia.org/wiki/Cybernetics" target="_blank" rel="nofollow">cybernetics<sup>W</sup></a>, to  <a href="https://en.wikipedia.org/wiki/Chaos_theory" target="_blank" rel="nofollow">chaos theory<sup>W</sup></a>, all the way to modern  <a href="https://en.wikipedia.org/wiki/Systems_biology" target="_blank" rel="nofollow">systems biology<sup>W</sup></a> and network science. And mental health care professionals aren’t entirely unfamiliar with complex systems thinking either - conceptual models that are widely used in clinical practice, such as the  <a href="https://en.wikipedia.org/wiki/Biopsychosocial_model" target="_blank" rel="nofollow">biopsychosocial model<sup>W</sup></a> and the  <a href="https://en.wikipedia.org/wiki/Diathesis%E2%80%93stress_model" target="_blank" rel="nofollow">diathesis-stress model<sup>W</sup></a>, already emphasize the interplay between different factors in mental health. What network theory adds is a mathematical framework that transforms these abstract ideas into testable models, opening up new possibilities for understanding and treating mental disorders.</p> <p>In this post, I’ll explain how viewing mental disorders as networks of interacting symptoms challenges traditional models of psychopathology. Because complexity writing turns into word salad really quickly, I sought to use diagrams to support the text. In a future post, I plan on demonstrating these concepts with real data analysis.</p> <h2> <a href="https://koenraijer.com/network-theory#the-common-cause-model-in-medicine" target="_self" rel>The ‘Common Cause’ Model in Medicine</a></h2> <p>The ‘common cause’ model has its origins in medicine. It is based on the idea that symptoms are clues for an underlying disease and it’s also known as the <em>latent cause model</em>. Take the example of someone who has cancer. They may lose weight and feel tired because they have a tumor that consumes all their energy. In similar fashion, they are in pain because they have a tumor that puts pressure on surrounding tissues. The pain may have some effect on their energy levels, but it’s mostly the tumor causing both. The tumor’s existence is indisputable. We know it exists because imaging or pathology confirmed it. If the patient receives chemotherapy and their symptoms wane, but medical imaging shows that the tumor is still there, albeit smaller, they are still said to have cancer. The latent cause is still present.</p>  <h2> <a href="https://koenraijer.com/network-theory#the-common-cause-model-in-psychopathology" target="_self" rel>The ‘Common Cause’ Model in Psychopathology</a></h2> <p>Widely used classification systems like the DSM-V or ICD-10 are also grounded in the ‘common cause’ model. They assume that symptoms are manifestations of an unobserved construct such as major depressive disorder, generalized anxiety disorder, or post-traumatic stress disorder. To qualify for such a disorder, someone might need to have “5 out of 9 symptoms”. The exact symptoms are interchangeable, and interactions among symptoms are irrelevant. Symptoms are mere consequences of the ‘common cause’ that don’t possess any causal power themselves. Let’s take a look at post-traumatic stress disorder (PTSD) to see how that works out in practice.</p>  <p>In this view, PTSD is conceptualized as a “thing” that is there, which gives rise to all of the above symptoms. These symptoms are mere clues that hint at the presence of PTSD as their shared underlying cause. It is well-known that people usually have more than one classification. It is not hard to model how multiple classifications are purported to interact within the common cause model. We can safely ignore the symptoms.</p>  <p>Let’s go back to our ‘common cause’ view of PTSD. Parallel to the person with <em>cancer</em>, our client has also received treatment in the form of therapy. They report not having had any meaningful symptoms for the past month. Can we still say they have PTSD?</p>  <p>The answer is no. At least not currently. Of course, they may be more susceptible than others to have symptoms return, but there is no basis on which to say they currently have PTSD. Without symptoms, there is no disorder. <em>Symptoms do not reflect a mental disorder: they constitute it.</em></p> <p>This reveals a major flaw in the common cause model: if PTSD is only there if the symptoms are, then PTSD cannot be the cause of the symptoms. A cause must exist independently of its effects - it cannot be defined by the presence of those effects. The common cause model thus contains circular logic: it claims PTSD causes the symptoms, yet PTSD is defined by the presence of those very symptoms.</p> <p>And that’s not the only problem with the common cause model for psychopathology. Decades of research into the origins of mental disorders have not found causal mechanisms that justify the existence of ‘common causes’. In addition, real people cannot be confined to the rigid categories that classification systems impose, to the point where more than half of clients have received two or more classifications at a time <span><button><sup> <a href="https://koenraijer.com/network-theory#fn-4" target="_self" rel>4</a></sup></button>.<span><span>4<span></span></span><span>Cramer, A. O. J., Waldorp, L. J., van der Maas, H. L. J., &amp; Borsboom, D. (2010). Comorbidity: A network perspective. Behavioral and Brain Sciences, 33, 137–193.  <a href="https://doi.org/10.1017/s0140525x09991567" target="_blank" rel="nofollow">https://doi.org/10.1017/s0140525x09991567<sup>↗</sup></a></span><span><span></span><span>↖</span></span></span></span></p> <p>People have written extensively about the shortcomings of traditional categorical classification systems, and for risk of repeating what others have already said better, I think it is time to discuss why symptoms deserve a more prominent role.</p> <p>The common cause view does not account for several facts that are seen as self-evident by many: (1) symptoms can cause other symptoms, (2) symptoms change over time, (3) symptoms don’t care about classifications.</p> <p>In reality, symptoms occur in self-reinforcing patterns and cycles.</p>  <p>We don’t need a common cause to explain what is happening here. We can just let symptoms cause other symptoms. The resulting self-sustaining entity is enough to serve as a basis for understanding psychopathology.</p> <h2> <a href="https://koenraijer.com/network-theory#understanding-mental-disorders-as-networks" target="_self" rel>Understanding mental disorders as networks</a></h2> <h3> <a href="https://koenraijer.com/network-theory#basic-terminology" target="_self" rel>Basic terminology</a></h3> <p>To make the move from vicious cycles to full-blown networks, it is time to introduce some terminology.</p>  <p><strong>Nodes</strong>, or elements, can be symptoms, emotions, behaviors, or traits. Nodes are causal agents that influence other nodes.</p> <p><strong>Edges</strong> are connections between nodes, that take the form of <em>lines</em>.</p> <p>An edge always has at least these two properties:</p> <ol><li>a strength, indicated by the edge’s width or thickness, and</li> <li>a <span>positive</span> or <span>negative</span> <em>valence</em>.</li></ol> <p>Optionally, edges can have a third property: <em>direction</em>, as indicated by the arrowhead. Whether a node is directional depends on the type of network (more on that in the next bit).</p> <p><strong>Path</strong>: any trajectory along a graph.</p> <p><strong>Cluster</strong>: a group of nodes that are more densely connected than other parts in the graph.</p> <p><strong>Graph</strong>: a different name for a network, commonly used in mathematics.</p> <h3> <a href="https://koenraijer.com/network-theory#contemporaneous-vs-temporal-networks" target="_self" rel>Contemporaneous vs. Temporal networks</a></h3> <p>At this point, it is important to introduce the distinction between <em>temporal</em> networks and <em>contemporaneous</em> networks.</p> <p>Contemporaneous means as much as “at the same time”. To construct a contemporaneous network, we look for co-occurrence patterns between pairs of symptoms within each data point. If two symptoms frequently occur together, they are correlated and we draw an edge between them. This leads to <em>undirected</em> edges, because although these patterns may be robust, we don’t know which symptom causes which.</p> <p>In contrast, temporal networks are all about patterns of change over time. Instead of looking for co-occurrence patterns within each data point, we look for co-occurrence patterns from one data point to the next. If one symptom repeatedly happens before another, we can say they are temporally related. Because time is a one-way street, we can draw an arrow from the first to the second symptom. This leads to <em>directed</em> edges, indicating the passage of time (it does not imply causality). Usually, temporal networks use a so-called <em>lag</em> of 1, meaning we look at the relationship between symptoms at time t and t+1. A lag of 2 would mean we look at the relationship between symptoms at time t and t+2.</p> <div><div> <button type="button">Contemporaneous</button>  <button type="button">Temporal</button></div> <div><table><caption>Highlighting co-occurrence of Insomnia and Fatigue (same time point)</caption>  <thead><tr><th>Person</th> <th>Insomnia</th> <th>Fatigue</th> <th>Anxiety</th> <th>Sadness</th></tr></thead> <tbody><tr><td>P1</td> <td>1 </td> <td>1 </td> <td>1 </td> <td>0 </td> </tr><tr><td>P2</td> <td>1 </td> <td>1 </td> <td>0 </td> <td>0 </td> </tr><tr><td>P3</td> <td>0 </td> <td>0 </td> <td>1 </td> <td>1 </td> </tr><tr><td>P4</td> <td>1 </td> <td>1 </td> <td>1 </td> <td>0 </td> </tr><tr><td>P5</td> <td>0 </td> <td>0 </td> <td>0 </td> <td>1 </td> </tr><tr><td>P6</td> <td>1 </td> <td>1 </td> <td>0 </td> <td>0 </td> </tr></tbody></table></div></div> <p>In this example, we can see clear co-occurrence patterns:</p> <ul><li>Insomnia and Fatigue frequently occur together (P1, P2, P4, P6)</li> <li>Anxiety and Sadness sometimes co-occur (P3)</li> <li>Some people have multiple symptoms (P1, P4)</li> <li>Others have single symptoms (P5)</li></ul> <p>These patterns would result in stronger edges between frequently co-occurring symptoms (like Insomnia-Fatigue) in the network.
For example, a negative edge between “social support” and “depression” nodes might indicate that higher levels of social support tend to reduce depressive symptoms. Conversely, a strong positive edge between “insomnia” and “fatigue” nodes would suggest that increased insomnia is likely to lead to increased fatigue.</p>  <h2> <a href="https://koenraijer.com/network-theory#a-toy-network-model-for-ptsd" target="_self" rel>A toy network model for PTSD</a></h2> <p>Remember the ‘common cause’ model that showed PTSD, substance use and emotion dysregulation?</p>  <p>Let’s see if we can conceive of an imaginary network model for similar constructs, without relying on the notion of common causes.</p>  <p>All symptoms are now causal agents that can influence each other. Some edges are positive, meaning they lead to more of the node they point to, some are negative. Some have strong effects, some weak. Some are bidirectional (e.g. insomnia and alcohol use), others are in a positive feedback loop with themselves (e.g., negative affect).</p>  <p>The network is not a solitary entity, it is part of the broader set of cognitions, feelings and behaviours that occur within that person. In addition, that person is situated within a social context. All elements that aren’t part of the psychopathology network, but influence it nonetheless, is called the <strong>external field</strong>.</p> <p>Although we aren’t fans of discrete categories, we create structure for ourselves by assigning symptoms to broad <em>transdiagnostic</em> clusters: trauma, substance use, and emotion dysregulation. Notice that they are allowed to overlap with each other.</p>  <p>So far we have only discussed psychological symptoms, but it is possible to include the entire  <a href="https://en.wikipedia.org/wiki/Biopsychosocial_model" target="_blank" rel="nofollow">biopsychosocial model<sup>W</sup></a>. The way to do this is heavily dependent on your philosophical point of departure. Some have proposed that, since psychological factors arise out of biological factors, a network should really have multiple layers <span><button><sup> <a href="https://koenraijer.com/network-theory#fn-5" target="_self" rel>5</a></sup></button>.<span><span>5<span></span></span><span>Riese, H., &amp; Wichers, M. (2021). Comment on: Eronen MI (2019). The levels problem in psychopathology. <em>Psychological Medicine</em>, <em>51</em>(3), 525–526.  <a href="https://doi.org/10.1017/S0033291719003623" target="_blank" rel="nofollow">https://doi.org/10.1017/S0033291719003623<sup>↗</sup></a></span><span><span></span><span>↖</span></span></span></span></p> <div><div></div> <div></div></div> <p>Perhaps you expected vertical arrows to connect the two layers, that that be an erroneous simplification of reality. The biological level and the psychological level are like different levels of resolution. Zoom out from the biological level and psychological factors arise. Their relation is not simple and linear. What you observe on the psychological level has arisen out of the biological level. They are  <a href="https://en.wikipedia.org/wiki/Emergence" target="_blank" rel="nofollow">emergent<sup>W</sup></a> phenomena of the lower, biological level. Conversely, psychological phenomena can influence biological factors.</p> <p>Network theory can co-exist with the ‘common cause’ model. For example, one could imagine positioning insecure attachment during early childhood as an overarching element that exerts an influence on most elements in a network. Or personality style, such as being high in trait neuroticism. Or, in the case of highly genetically determined disorders such as psychotic disorders, a positive family history or known genetic abnormalities. These would all be part of the external field.</p>  <p>This brings us to a very important aspect of network theory: <strong>time</strong>. All networks that we have seen so far are snapshots of either an (imaginary) point in time, or they could be averaged over a period of time. If we would capture how our network changed over the course of seconds, minutes, weeks, years, we would see edges and nodes appear and disappear, get stronger then wean into nothingness. Some clusters would be more stable than others. Suicidal thoughts are known to vary a lot. One day someone may be actively contemplating suicide, the next day they may be wholly distracted from the topic. Other parts of the network tend to be more stable.</p> <p>Mental disorders are, by definition, <strong>stable states of dynamic networks</strong>. This means they are good at resisting perturbations from outside the network. Otherwise they wouldn’t have still been there.</p>  <p>In fact, therapy could be conceptualized as an external field element that sets out to <em>perturb</em> the mental disorder’s stable state.</p> <p>But behold, even if a stressor is removed, because life changed or perhaps because of therapy, it may not mean the network can return to a healthy state. That may be the case if the alternative state is so resilient as to persist even in absence of the stressor that caused it. This principle is known as <strong>hysteresis</strong>.</p>  <p>Shown above is a <em>hysteresis loop</em> along the course of someone’s lifetime. On the x-axis sits <em>symptom severity</em>, as the average of the severity of all the symptom’s this person is experiencing. On the y-axis is the level of <em>psychosocial stress</em> the person is going through. Tracing the line, we start at birth. Perhaps prenatal stressors influence the symptom severity at this point. Perhaps things went wrong with attachment. Soon enough, we arrive in early childhood, where they experience several adverse events (e.g., the death of a parent, abuse), leading to a further increase in symptom severity. At some point as an adult, they start going to therapy. A while later, they find a partner and a stable family life. After some years, symptom severity starts decreasing for the first time in their life. This is where <em>hysteresis</em> comes in, because the trajectory the line follows is <em>a different one from the path it took to get there</em>. We cannot simply trace the line backwards to zero.</p> <p>This has several important clinical implications. It helps explain:</p> <ol><li>Why change takes time, even after removing stressors;</li> <li>Why maintaining recovery is often harder than achieving it initially;</li> <li>Why treatment should focus on building new stable patterns of functioning rather than just removing stressors.</li></ol> <p>In any case, I hope you’ve learned a thing or two. It was a first attempt at doing something more visual, and even slightly interactive!</p> <h2> <a href="https://koenraijer.com/network-theory#further-reading" target="_self" rel>Further reading</a></h2> <ul><li> <a href="https://www.youtube.com/watch?v=u7KWrzCNr7A" target="_blank" rel="nofollow">Eiko Fried YouTube lecture<sup>↗</sup></a></li> <li> <a href="https://koenraijer.com/archive/olthof_2020.pdf" target="_self" rel>Olthof’s 2020 paper<sup>PDF</sup></a></li> <li> <a href="https://koenraijer.com/archive/favela_2020.pdf" target="_self" rel>Favela Cognitive science as complexity science<sup>PDF</sup></a></li></ul> <div><hr><h6>Bibliography &amp; Footnotes</h6> <ol><li>Reeves, J. W., &amp; Fisher, A. J. (2020). <em>An examination of idiographic networks of posttraumatic stress disorder symptoms</em>.  <a href="https://doi.org/10.1002/jts.22491" target="_blank" rel="nofollow">https://doi.org/10.1002/jts.22491<sup>↗</sup></a> <a href="https://koenraijer.com/network-theory#fnref-1" target="_self" rel>↩</a></li> <li>Borgogna, N. C., Owen, T., &amp; Aita, S. L. (2024). The absurdity of the latent disease model in mental health: 10,130,814 ways to have a DSM-5-TR psychological disorder. <em>Journal of Mental Health</em>, <em>33</em>(4), 451–459.  <a href="https://doi.org/10.1080/09638237.2023.2278107" target="_blank" rel="nofollow">https://doi.org/10.1080/09638237.2023.2278107<sup>↗</sup></a> <a href="https://koenraijer.com/network-theory#fnref-2" target="_self" rel>↩</a></li> <li>Roefs, A., Fried, E. I., Kindt, M., Martijn, C., Elzinga, B., Evers, A. W. M., Wiers, R. W., Borsboom, D., &amp; Jansen, A. (2022). A new science of mental disorders: Using personalised, transdiagnostic, dynamical systems to understand, model, diagnose and treat psychopathology. <em>Behaviour Research and Therapy</em>, <em>153</em>, 104096.  <a href="https://doi.org/10.1016/j.brat.2022.104096" target="_blank" rel="nofollow">https://doi.org/10.1016/j.brat.2022.104096<sup>↗</sup></a> <a href="https://koenraijer.com/network-theory#fnref-3" target="_self" rel>↩</a></li> <li>Cramer, A. O. J., Waldorp, L. J., van der Maas, H. L. J., &amp; Borsboom, D. (2010). Comorbidity: A network perspective. Behavioral and Brain Sciences, 33, 137–193.  <a href="https://doi.org/10.1017/s0140525x09991567" target="_blank" rel="nofollow">https://doi.org/10.1017/s0140525x09991567<sup>↗</sup></a> <a href="https://koenraijer.com/network-theory#fnref-4" target="_self" rel>↩</a></li> <li>Riese, H., &amp; Wichers, M. (2021). Comment on: Eronen MI (2019). The levels problem in psychopathology. <em>Psychological Medicine</em>, <em>51</em>(3), 525–526.  <a href="https://doi.org/10.1017/S0033291719003623" target="_blank" rel="nofollow">https://doi.org/10.1017/S0033291719003623<sup>↗</sup></a> <a href="https://koenraijer.com/network-theory#fnref-5" target="_self" rel>↩</a></li></ol></div>]]></content:encoded>
            <category><![CDATA[Research]]></category>
        </item>
        <item>
            <title><![CDATA[Thoughts on falsificationism]]></title>
            <link>https://koenraijer.com/falsificationism</link>
            <guid isPermaLink="true">https://koenraijer.com/falsificationism</guid>
            <pubDate>Sat, 30 Nov 2024 00:00:00 GMT</pubDate>
            <atom:updated>2025-02-15T00:00:00.000Z</atom:updated>
            <dc:creator><![CDATA[Koen Raijer]]></dc:creator>
            <description><![CDATA[Me misunderstanding falsificationism, a Gwern quote, the philosopause, and more.]]></description>
            <content:encoded><![CDATA[<p>On several occasions, I’ve come close to comprehending falsificationism - Popper’s principle that <em>scientific</em> theories should be disprovable through empirical testing. In the Popperian sense, scientists try to falsify (disprove) hypotheses rather than prove them true. A theory that withstands attempts at falsification is considered good, but paradoxically, a theory that cannot be falsified at all is problematic - at least in empirical science.</p> <p>Unfalsifiable theories are for philosophers. It is very alluring for scientists to take the unfalsifiable turn - the metaphysical turn. Eminent scientists turning to philosophical topics is a recurring theme. I remember Karl Friston talking about this in a podcast, calling it the <em> <a href="https://en.wiktionary.org/wiki/philosopause" target="_blank" rel="nofollow">philosopause<sup>W</sup></a></em> - a contraction of philosophy and menopause. I can imagine how eminent scientists finally muster up the courage to speak on themes they have been thinking about for decades, but felt they couldn’t speak on because it’s not considerede proper science. In its worst manifestation, such ventures may lead to what is known as  <a href="https://en.wikipedia.org/wiki/Nobel_disease" target="_blank" rel="nofollow">Nobel disease<sup>W</sup></a> (the link shows countless interesting examples). In its best manifestation, scientists write amazing books where they finally think freely, and we get the unconstrained version of decades of unscientific thoughts. The reason why scientists find it hard to resist the desire to take the metaphysical turn bears some resemblance to my own struggle with the topic of falsification. Perhaps falsificationism just doesn’t come naturally to humans, in the same way that expert-level physicists are unable to develop an intuitive understanding of Newtonian mechanics.</p> <p>In trying to understand falsificationism more deeply, and perhaps develop some intuition around it, I created a flashcard about the contemporary response to falsificationism. What it says is that: (a) scientists seem to make truth claims all of the time, and (b) the hypotheses that scientists seek to falsify are found using theoretical frameworks that rest on information that they have often come to accept through uncritical assumption. Now, this is probably the tenth time seeing this flashcard, but only now have I begun to disagree with it. Theoretical frameworks can just as well be grounded on thoroughly researched and as of yet unfalsified hypotheses. At the same time, I realise that these critics may not be referring to the hypotheses themselves, but rather to the way they are purported to interact with each other within the framework. Can all implicit hypotheses underlying a theoretical framework be falsified? This question becomes even more intriguing when considering how scientific knowledge is actually generated in practice, as illustrated by this observation by Gwern Branwen’s when he appeared on the Dwarkesh Podcast:</p> <blockquote><p>I think another issue is that they shared the basic error that I was making about algorithms being more important than compute. This was in part due to a systematic falsification of the actual origins of ideas in the research literature. Papers don’t tell you where the ideas come from in a truthful manner. They just tell you a nice sounding story about how it was discovered. They don’t tell you how it’s actually being discovered. So even if you appreciate the role of trial and error and compute power in your own experiment as a researcher, you probably just think, oh, I got lucky that way. My experience is unrepresentative. Over in the next lab, there they do things by the power of thought and deep insight. <span><button><sup> <a href="https://koenraijer.com/falsificationism#fn-1" target="_self" rel>1</a></sup></button><span><span>1<span></span></span><span>Dwarkesh Patel (13-11-2024). Gwern Branwen - How an Anonymous Researcher Predicted AI’s Trajectory. 18:05.  <a href="https://www.dwarkeshpatel.com/p/gwern-branwen" target="_blank" rel="nofollow">https://www.dwarkeshpatel.com/p/gwern-branwen<sup>↗</sup></a></span><span><span></span><span>↖</span></span></span></span></p></blockquote> <p>It’s an interesting observation on the day-to-day reality of doing science. People generally just stumble upon truths through repetition and slow accumulation of related facts. It ties into the topic of this post in two ways: (1) it uses falsification in a peculiar and confusing way, and (2) it shows that science is humane. With falsification, he seems to mean misrepresentation or wrongful, rather than the scientific disproval of hypotheses. And on science, he is saying that the way everyone writes articles is in a way that uses some leeway in hiding the messy, trial-and-error nature of scientific discovery. Instead, papers present a polished narrative that obscures the actual process, potentially leading researchers to underestimate the importance of factors like computational power and overestimate the role of pure insight. This ‘falsification’ in scientific literature contributes to a skewed perception of how breakthroughs occur, perpetuating the myth of linear, insight-driven progress rather than acknowledging the often chaotic and resource-dependent reality of scientific advancement. Perhaps that is just another example of how our very human tendencies leak through into everything we do, from conducting science to understanding falsification. And perhaps, I’ve learnt a little better what falsificationism means.</p> <div><hr><h6>Bibliography &amp; Footnotes</h6> <ol><li>Dwarkesh Patel (13-11-2024). Gwern Branwen - How an Anonymous Researcher Predicted AI’s Trajectory. 18:05.  <a href="https://www.dwarkeshpatel.com/p/gwern-branwen" target="_blank" rel="nofollow">https://www.dwarkeshpatel.com/p/gwern-branwen<sup>↗</sup></a> <a href="https://koenraijer.com/falsificationism#fnref-1" target="_self" rel>↩</a></li></ol></div>]]></content:encoded>
            <category><![CDATA[Research]]></category>
        </item>
        <item>
            <title><![CDATA[Literature review automation]]></title>
            <link>https://koenraijer.com/literature-review</link>
            <guid isPermaLink="true">https://koenraijer.com/literature-review</guid>
            <pubDate>Fri, 20 Sep 2024 00:00:00 GMT</pubDate>
            <atom:updated>2024-12-22T00:00:00.000Z</atom:updated>
            <dc:creator><![CDATA[Koen Raijer]]></dc:creator>
            <description><![CDATA[A practical guide to conducting literature reviews in 2025, showing how to use PRISMA, OSF, ASReview, Zotero, and Google Drive to streamline research workflows. Learn how to handle everything from preregistration and search strategies to automated screening and data extraction, with tips for reducing errors and maintaining quality. Written for researchers working on systematic or scoping reviews, with detailed setup instructions and real examples from firsthand experience.]]></description>
            <content:encoded><![CDATA[<p>Here’s my blueprint for tackling a second literature review in 2025, having learned from past mistakes so you won’t have to! The approach is heavy on tools, high on automation, and emphasises minimising the potential for human error. I value open-science principles, and prefer open-source software. I try to adhere to the <em>four-eyes principle</em>, which says that all work should be done twice, independently of each other. This includes: peer reviewing the search strategy, title and abstract screening, full-text screening and data extraction. I also try limiting copy-pasting actions as much as possible, because every time you copy-paste, you can introduce an error. The most important tools and frameworks I used are:  <a href="https://www.prisma-statement.org/" target="_blank" rel="nofollow">PRISMA<sup>↗</sup></a>,  <a href="https://osf.io/" target="_blank" rel="nofollow">OSF<sup>↗</sup></a>,  <a href="https://asreview.nl/" target="_blank" rel="nofollow">ASReview<sup>↗</sup></a>,  <a href="https://www.zotero.org/" target="_blank" rel="nofollow">Zotero<sup>↗</sup></a>, and  <a href="https://drive.google.com/" target="_blank" rel="nofollow">Google Drive<sup>↗</sup></a>. While you may not agree with all of my points, the take-away is that it is important to thoroughly plan your workflow before you start.</p> <h3> <a href="https://koenraijer.com/literature-review#tools--frameworks" target="_self" rel>Tools &amp; Frameworks</a></h3> <ul><li> <a href="https://www.prisma-statement.org/" target="_blank" rel="nofollow">PRISMA<sup>↗</sup></a>. PRISMA guidelines help you write clear and complete systematic reviews, meta-analyses, and also scoping reviews (see  <a href="https://www.prisma-statement.org/scoping" target="_blank" rel="nofollow">PRISMA-ScR<sup>↗</sup></a>) by providing a structured reporting framework.</li> <li> <a href="https://osf.io/" target="_blank" rel="nofollow">OSF<sup>↗</sup></a>. The Open Science Framework is a free and open-source platform for preregistering research, project management, and much more. A commonly used alternative is  <a href="https://www.crd.york.ac.uk/PROSPERO/" target="_blank" rel="nofollow">PROSPERO<sup>↗</sup></a> (systematic reviews and meta-analyses only).</li> <li> <a href="https://asreview.nl/" target="_blank" rel="nofollow">ASReview<sup>↗</sup></a>. ASReview is an open-source software tool that accelerates literature reviewing using machine learning to prioritise and screen the scientific literature efficiently. I saved about 75% of time using ASReview.</li> <li> <a href="https://www.zotero.org/" target="_blank" rel="nofollow">Zotero<sup>↗</sup></a>. A free and open-source reference manager with loads of useful features. Similar in purpose to EndNote. Its PDF retrieval functionality regularly finds 70-80% of PDFs with the click of a button. Shared libraries make collaboration easy, allowing multiple people to annotate and discuss PDFs asynchronously. It also has a good duplicate detection feature.</li> <li> <a href="https://drive.google.com/" target="_blank" rel="nofollow">Google Drive<sup>↗</sup></a>. Don’t go working in offline Excel spreadsheets that you share over email. There is an alternative!</li></ul> <h3> <a href="https://koenraijer.com/literature-review#research-plan" target="_self" rel>Research Plan</a></h3> <p>The first thing you write and discuss with your team, the <strong>research plan</strong> is a high-level document intended for structuring your thoughts in the preparatory phase.</p> <p>I would include the following headings:</p> <ul><li>Research Question &amp; Review Methodology,</li> <li>Background &amp; Motivation,</li> <li>Literature Databases of Interest,</li> <li>Eligibility Criteria,</li> <li>Timeline.</li></ul> <p>It is important that you search the literature for existing reviews, immediately after you formulated the <em>research question</em>. If a review has already been done, ask yourself whether enough has changed since then to justify doing another one.</p> <p>The <em>databases</em> I searched were: PubMed, CINAHL, Embase Ovid, Scopus and ACM Digital Library. Decide which one will be your primary database. It is most convenient to choose the database that you’re most comfortable with. You’ll use it to construct the initial search query, which will then be translated into the other databases. Decide whether you’re going to peer review your search strategy (see  <a href="https://koenraijer.com/literature-review#literature-search" target="_self" rel>Literature Search</a>).</p> <p>Define <em>inclusion and exclusion criteria</em> based on your research question, but also think of things like publication language, publication year, being peer-reviewed, and publication types you might not want to include (e.g., conference papers).</p> <p>Decide whether you’re going to <em>preregister</em> your review, and on which platform. One benefit is the fact that you’ll be able to cite it on grant applications or resumés, even when it’s far from being finished. I preregistered  <a href="https://doi.org/10.17605/OSF.IO/CR5F8" target="_blank" rel="nofollow">my scoping review<sup>↗</sup></a> on OSF.</p> <p>Construct a <em>timeline</em> for when you’ll want to have the protocol finished and published, when you want to start screening, etc. A review requires a significa
nt time investment for all collaborators. Reaching agreement on the timeline will reduce the chance of delays.</p> <h3> <a href="https://koenraijer.com/literature-review#protocol" target="_self" rel>Protocol</a></h3> <p>This is a document that outlines the entire procedure of conducting the review, in as much detail as possible. If you decided to preregister your review, this is the document you’ll upload there. Its structure depends on the review methodology. I wrote a scoping review, and used  <a href="https://osf.io/fkxev" target="_blank" rel="nofollow">this protocol<sup>↗</sup></a> as an example. I might be stating the obvious here, but the protocol should be written and published before you actually do the literature search.</p> <p>The rest of this post was written with two goals in mind:</p> <ol><li>To help you guide the writing of your protocol;</li> <li>To give advice for the actual execution part of the review.</li></ol> <hr> <h2> <a href="https://koenraijer.com/literature-review#literature-search" target="_self" rel>Literature Search</a></h2> <p>The first thing you’ll want to do is perfect the search query for your primary database: the index query. That means seeking agreement among collaborators <em>before you translate the index query to the language of other databases</em>. Only when the index query is perfect, you start the translation process. At this point, you might want to involve your university library for advice on your literature search ( <a href="https://library.maastrichtuniversity.nl/research/research-essentials/literature-search-systematic-reviews/" target="_blank" rel="nofollow">UM Library support<sup>↗</sup></a>). In deciding how broad or narrow you want to search the literature, the number of hits is often an important contributing factor. If you decide to  <a href="https://koenraijer.com/literature-review#title-and-abstract-screening-with-asreview" target="_self" rel>screen titles and abstracts with ASReview</a>, it is helpful to realise that the proportion of time you save increases with the number of hits. In my case, 63% remained unseen with 1339 total hits. With more references, this can increase to 92% <span><button><sup> <a href="https://koenraijer.com/literature-review#fn-1" target="_self" rel>1</a></sup></button>.<span><span>1<span></span></span><span>van de Schoot, R., de Bruin, J., Schram, R. <em>et al.</em> An open source machine learning framework for efficient and transparent systematic reviews. <em>Nat Mach Intell</em> <strong>3</strong>, 125–133 (2021).  <a href="https://doi.org/10.1038/s42256-020-00287-7" target="_blank" rel="nofollow">https://doi.org/10.1038/s42256-020-00287-7<sup>↗</sup></a></span><span><span></span><span>↖</span></span></span></span></p> <p>Translation of search queries is tedious and error-prone. There are many differences between databases. For example, they use different <em>controlled vocabularies</em>. Examples of controlled vocabularies are MeSH terms in PubMed/MedLine, EMTREE in Embase, and Headings in CINAHL. These do not match one-to-one. There is a  <a href="https://sr-accelerator.com/#/polyglot" target="_blank" rel="nofollow">translation tool<sup>↗</sup></a> for search queries, but I cannot account for its accuracy because I only found out about it after having translated my queries. I found  <a href="https://guides.library.utoronto.ca/c.php?g=577919&amp;p=4305874" target="_blank" rel="nofollow">this guide<sup>↗</sup></a> especially useful for navigating these different databases. For peer reviewing the search strategy, I used the PRESS (Peer Review of Electronic Search Strategies) guidelines ( <a href="https://ars.els-cdn.com/content/image/1-s2.0-S0895435616000585-mmc1.docx" target="_blank" rel="nofollow">direct link to the checklist<sup>↗</sup></a>).</p> <h2> <a href="https://koenraijer.com/literature-review#exporting-and-deduplicating-references" target="_self" rel>Exporting and Deduplicating References</a></h2> <p>You should now have all your search queries executed and lined up. Assuming you’ve got Zotero downloaded and installed, the next step is exporting your search queries. Generally speaking, the <code>RIS</code> format is a good file format.  <a href="https://osf.io/3nsep" target="_blank" rel="nofollow">Here<sup>↗</sup></a> is a guide on exporting references from different databases for use in Zotero.</p> <p>After you have your different queries imported into Zotero, you’ll want to remove duplicate references. Because there is a lot of overlap between databases, there will be many. Zotero identifies possible duplicates automatically for you, but it remains up to you to decide which one you’ll keep. I used  <a href="https://osf.io/yh3xe" target="_blank" rel="nofollow">this guide on deduplication in Zotero<sup>↗</sup></a>. <em>Always keep the reference with the abstract</em>, otherwise, keep the reference with most metadata. Having the abstract will make your life much easier during title and abstract screening.</p> <p>Deduplication reduced the number of references with 60% for me. You should now have a single Zotero collection with all of your references in one place.</p> <h2> <a href="https://koenraijer.com/literature-review#the-importance-of-calibration" target="_self" rel>The Importance of Calibration</a></h2> <p>Calibration involves strategic planning of checkpoints where you meet and discuss disagreements between collaborators. Disagreements can occur in any step along the way that is done twice, which is most of the steps. Such disagreements are unavoidable, and discussing them can reveal implicit assumptions about the review’s aim that can be scrutinised <em>en groupe</em> during calibration sessions. The overall goal of calibration is to align the perspectives of collaborators. This must happen in any review at the end of each step. However, ironing out teething problems at the <em>start</em> of a step can save you a lot of time (at the expense of  <a href="https://koenraijer.com/literature-review#collaboration-and-blinding" target="_self" rel>some degree of blinding</a>).</p> <p>Some ways in which calibration can benefit your review:</p> <ul><li>Reveal unclear phrasing of eligibility criteria;</li> <li>Force you to motivate eligibility criteria in light of the review’s aim;</li> <li>Align different interpretations of eligibility criteria among collaborators;</li> <li>Discuss categorical ambiguity (also known as the boundary problem), e.g., does a particular edge case fall just inside or just outside of an eligibility criterium?</li></ul> <p>Implementing calibration can be done in many different ways. I will first outline some general principles I would adhere to, and then describe the way I did it.</p> <p>General principles:</p> <ul><li>Calibration should be part of each step where you go over many references. It should be part of: title and abstract screening, full-text screening, and data extraction.</li> <li>Spend as little time as possible not being calibrated with collaborators. Calibration should be planned early on in a given step, so enough references remain for processing, for you to benefit from the calibration.</li> <li>Calibration should not be done <em>too early</em> in a given step, because you must also have <em>caught</em> enough disagreements for you to discuss during the calibration session.</li> <li>Before calibration, screeners should be blinded to each other’s decisions. After screening, disagreements are discussed and consensus is reached for those references. Until the next calibration session, screeners should again be blinded to each other’s decisions.</li></ul> <p>This is how I implemented calibration in my review:</p> <ul><li>During title and abstract screening, I asked all collaborators to look at 15 titles and abstracts and decide on whether they would want to keep them or not, and why. We then discussed disagreements and made a shared final decision. These 15 decisions then served as <em>prior knowledge</em> for  <a href="https://koenraijer.com/literature-review#title-and-abstract-screening-with-asreview" target="_self" rel>ASReview</a>. We calibrated again at the end of title and abstract screening, the specifics of which are different than other calibrations for reasons specific to ASReview <span><button><sup> <a href="https://koenraijer.com/literature-review#fn-2" target="_self" rel>2</a></sup></button>.<span><span>2<span></span></span><span>This is described in more detail in  <a href="https://koenraijer.com/literature-review#title-and-abstract-screening-with-asreview" target="_self" rel>Title and Abstract Screening with ASReview</a>. Whereas other calibrations involve only references that screeners disagree on, the calibration that occurred after completing title and abstract screening with ASReview also involves references that <em>one screener included while the other did not see the reference before</em>. This occurs because the active learning algorithm in ASReview learns differently based on your earlier choices.</span><span><span></span><span>↖</span></span></span></span></li> <li>During full-text screening, both screeners looked at 30 full-texts. Before continuing with the rest of full-text screening, disagreements were discussed and resolved. At the end of full-text screening, another calibration session resolved all disagreements that had arisen since the last session.</li> <li>During data extraction, both screeners performed data extraction for 15 references. Disagreements were then resolved. At the end of data extraction, all new disagreements were resolved again.</li></ul> <p>The exact numbers are arbitrary, and are only shown to serve as an example.</p> <p>Each calibration session involves detailed discussion about disagreements. Sometimes, it took two sessions to resolve all disagreements. To respect the time your collaborators invest in your review, it is important to prepare for these sessions. Highlight disagreements. Read through disagreements and form an opinion about them. Resolve minor disagreements where you agreed with the other screener’s viewpoint.</p> <p>Note that calibration sessions may lead to new insights, that may or may not require you to revise previous steps. This is normal. Don’t cut corners, just redo those steps. Quality trumps speed.</p> <h3> <a href="https://koenraijer.com/literature-review#collaboration-and-blinding" target="_self" rel>Collaboration and Blinding</a></h3> <p>There is a trade-off between collaboration and blinding. The more you collaborate — by calibrating your interpretation of the eligibility criteria, or by seeing other people’s highlights and comments in PDF files — the less blinded you are to the other screener’s viewpoint. This may hamper your ability to independently assess a reference’s relevance. On the other hand, eligibility criteria can be ambiguous and edge cases are unavoidable. Reaching some consensus on their interpretation before doing the bulk of the work can lead to more consistency and shared understanding. This can save you a lot of time and effort. I believe that this calibration method does not substantially compromise blinding. Screeners are blind to each other’s decision unless they are calibrating, after which any decision on a reference’s relevance is final.</p> <h2> <a href="https://koenraijer.com/literature-review#making-your-life-easier-for-full-text-screening" target="_self" rel>Making Your Life Easier For Full-Text Screening</a></h2> <p>Before jumping into the full-text screening, there are several things I’d do in my next review at this point. All of them will make your life easier at a later step in the process, automate something for you, and reduce the probability of making mistakes.</p> <h3> <a href="https://koenraijer.com/literature-review#enabling-direct-urls-to-pdfs" target="_self" rel>Enabling Direct URLs to PDFs</a></h3> <p>Bear with me. During full-text screening, you’ll be using a Google Drive spreadsheet to write down whether you think a given reference should be included or excluded. To do that, you’ll need easy access to the PDF. The following advice will enable you to click on a link in Google Drive that opens the associated PDF in a shared Zotero Library. It is worth your effort.</p> <h4> <a href="https://koenraijer.com/literature-review#modifying-the-ris-export" target="_self" rel>Modifying the <code>.ris</code> Export</a></h4> <p>You’ll need to modify the way Zotero exports references in the <code>.ris</code> format. What this modification will do, is add the Zotero Item Key, a unique identifier used by Zotero, to each reference in your <code>.ris</code> export file. This will enable you to construct a URL that will take you to the PDF during full-text screening.</p> <ul><li> <a href="https://www.zotero.org/support/zotero_data" target="_blank" rel="nofollow">Locate the Zotero data directory<sup>↗</sup></a> on your computer. This can be found in different locations depending on your operating system.</li> <li>Inside the Zotero data directory, there is a folder named <code>translators</code>. Locate the file names <code>RIS.js</code>. <em>Duplicate it in some safe location in case something goes wrong</em>.</li> <li>Download the modified <code>RIS.js</code> file  <a href="https://gist.github.com/koenraijer/5e3a220e559e59a50489ea7e947a5f46" target="_blank" rel="nofollow">here<sup>GH</sup></a>. I’ve added a single line to the original file: <code>if (item.key) addTag(&#39;LB&#39;, item.key)</code>.</li> <li>Delete the original <code>RIS.js</code> file. Paste the downloaded <code>RIS.js</code> inside the <code>translators</code> folder.</li> <li>Restart Zotero.</li> <li>Verify that it worked by exporting any collection to the <code>.ris</code> file format: right-click on a collection <span><span><span></span><span><span><span></span><span>→</span></span></span></span></span> Export Collection … <span><span><span></span><span><span><span></span><span>→</span></span></span></span></span> Choose <code>RIS</code> as Format <span><span><span></span><span><span><span></span><span>→</span></span></span></span></span> click OK. Save the file.</li> <li>Open the file in a text editor. Press cmd + F (ctrl + F on Windows) and search for “LB”. You should now find that each entry inside the <code>.ris</code> file has a line that goes like “LB - 6YLDRSR4”. That code is what we’ll need later on to locate our PDFs.</li></ul> <h4> <a href="https://koenraijer.com/literature-review#setting-up-a-group-library" target="_self" rel>Setting Up a Group Library</a></h4> <p>Setting up a group library will enable every collaborator to open the same URL to a PDF. Go to  <a href="https://www.zotero.org/groups/" target="_blank" rel="nofollow">Zotero Groups<sup>↗</sup></a> <span><span><span></span><span><span><span></span><span>→</span></span></span></span></span> Click <code>Create a New Group</code> <span><span><span></span><span><span><span></span><span>→</span></span></span></span></span> Choose a name and choose the <code>Private Membership</code> option <span><span><span></span><span><span><span></span><span>→</span></span></span></span></span> Invite collaborators and ensure they have accepted the invitation. Verify that the group was created correctly by having each collaborator check whether the group has appeared in the left sidebar in their local Zotero set-up. The final step involves moving the collection with all the deduplicated references into the newly created group.</p> <h3> <a href="https://koenraijer.com/literature-review#taking-good-care-of-the-eligibility-criteria" target="_self" rel>Taking Good Care of the Eligibility Criteria</a></h3> <p>All collaborators should by now agree on the eligibility criteria. We need to store these in a safe place. If you’ve made a group library, that is probably the best place to store them. So, create a new collection in the group library, and call it <code>Criteria</code>. Open it, and then click on the yellow notepad with small green plus sign in the middle at the top of the interface. Click <code>New Standalone Note</code>. Paste your criteria in there as a numbered list.</p> <p>Some other tips on the eligibility criteria:</p> <ul><li>Rephrase them as exclusion criteria. This is because all you will do during full-text screening is exclude references.</li> <li>Add an identifier that doesn’t depend on a numbered list. That is because, during calibration sessions, some criteria may go, others may merge. This changes the numbering of your list. That’s why you need an additional identifier. I added shorthands for my criteria to the Zotero note as identifiers (e.g., <code>diagnosis</code> or `no_peer_review).</li> <li>Note that the PRISMA guidelines tell you to log the reasons for excluding references in the full-text screening, but not during the title and abstract screening.</li></ul> <h3> <a href="https://koenraijer.com/literature-review#title-and-abstract-screening-with-asreview" target="_self" rel>Title and Abstract Screening with ASReview</a></h3> <p>At this point, it is important to decide whether you’re going to use ASReview. Watch  <a href="https://www.youtube.com/watch?v=k-a2SCq-LtA." target="_blank" rel="nofollow">this 2 minute video<sup>↗</sup></a> to get a general idea of how it works. Read their  <a href="https://www.nature.com/articles/s42256-020-00287-7" target="_blank" rel="nofollow">Nature publication<sup>↗</sup></a> for a more detailed overview. I shaved off 63% of all references using ASReview. That means 63% less work. Using ASReview is fundamentally different from traditional literature reviewing. Make sure you and your collaborators are aware of its advantages and disadvantages before proceeding. If you decide against using ASReview, I recommend looking into other tools such as  <a href="https://www.rayyan.ai/" target="_blank" rel="nofollow">Rayyan<sup>↗</sup></a> or  <a href="https://www.covidence.org/" target="_blank" rel="nofollow">Covidence<sup>↗</sup></a>.</p> <p>There are some important things to consider before using ASReview. First, you won’t see all references. Instead, an algorithm uses machine learning to sort your references, presenting the ones it considers most relevant to your review at the top. You stop screening after you reach a pre-defined stopping criterion. My stopping criterion was: having screened 50 consecutive irrelevant references. This number may be higher for larger datasets. See  <a href="https://github.com/asreview/asreview/discussions/557" target="_blank" rel="nofollow">this GitHub thread<sup>GH</sup></a> for a discussion on how to stop screening. Second, collaboration is a little difficult to figure out at first, but it worked fine in the end.  <a href="https://asreview.nl/blog/seven-ways-to-integrate-asreview/#multiple" target="_blank" rel="nofollow">This blog post<sup>↗</sup></a> outlines ways of integrating ASReview when you have multiple reviewers. This is  <a href="https://www.zotero.org/groups/4597652/asreview_public/collections/IWU8ATMK/tags/multiple_screeners/collection" target="_blank" rel="nofollow">a list of publications that used ASReview with multiple screeners<sup>↗</sup></a>. In my case, the job of second screener was shared among three collaborators, which increased the complexity considerably. These three collaborators ended up screening in turns for a specified amount of time, until the stopping criterion was met. They would export the project file and pass it on to the next one. Third, resolving disagreements on references between first and second screeners in ASReview is a bit of a hassle. It involves merging two data files (<code>.csv</code> or <code>.xlsx</code>). Look at points 6 and 7 to get an idea of how you could do this.</p> <p>I am very happy I used ASReview. It’s a very interesting tool, it has an easy-to-learn user interface, and it saves you a lot of time at very little cost. To understand exactly how to use ASReview, please refer to  <a href="https://asreview.readthedocs.io/en/latest/about.html" target="_blank" rel="nofollow">the documentation<sup>↗</sup></a>. Any advice given beyond this point will be supplementary to the ASReview documentation.</p> <p>An overview of how I would use ASReview the second time:</p> <ol><li>Install and open ASReview Lab. Take a look around.</li> <li>Take a small number of references (I used 15) and decide whether they are to be included or excluded. Have other collaborators review them, too. Then meet for a calibration session, and resolve any disagreements. Write the final decision down somewhere. These will be used as <em>prior knowledge</em> for ASReview.</li> <li>Export your references from Zotero in the <code>.ris</code> file format. This ensures you will be able to get your references back into Zotero without doing any coding. Although this may not be necessary, there appear to be only upsides to doing it this way.</li> <li>Create a new ASReview project, load your <code>.ris</code> file, and add the prior knowledge you agreed upon.</li> <li>Export the ASReview project for use by the second screener(s), choose the <code>Project</code> option. Rename it by appending something like <code>_2nd</code>. This file can be imported by collaborators and enables them to continue where the previous person stopped.</li> <li>Have both the first and second screeners review references until the stopping criterion has been met. At this point you can do two things. You can go over the titles and abstracts with a different active learning algorithm. With more prior knowledge (you have screened many references by now), you can train a more complex algorithm (e.g. <em>BERT</em>) that can find relevant references based on subtler cues. This is what ASReview advises you to do, and is what I would do the second time around. If you decide against this or have already gone through the process multiple times, continue to step 7.</li> <li>Have both screeners export both the <code>Project</code> files and the <code>Dataset</code> file with both labelled and unlabelled records. Use the <code>.csv</code> format or the <code>.xlsx</code> format if you don’t want to re-import your references. Store these files away neatly for future reference. Realise that separate screeners might not have screened all the same articles. That is because the algorithm learns from each subsequent decision, which is likely to differ considerably between screeners. That’s why the two datasets will have references you agree on, references you disagree on, references that only the first screener saw, and references that only the second screener saw.</li> <li>Do a calibration session to discuss references you disagree on, references that only the first screener saw, and references that only the second screener saw. The way I went about that is by writing a Python script, but there are ways to  <a href="https://www.exceldemy.com/merge-datasets-in-excel/" target="_blank" rel="nofollow">merge these datasets in Excel<sup>↗</sup></a>.</li> <li>Duplicate your dataset, and retain only the references that you agree to include. These will be used for the full-text screening.</li></ol> <h2> <a href="https://koenraijer.com/literature-review#full-text-screening-in-google-drive-and-zotero" target="_self" rel>Full-Text Screening in Google Drive and Zotero</a></h2> <p>You should now have a list of references in Excel that are ready for the full-text screening phase. If you decided to make your life easier for full-text screening, now is the time to reap the fruits of your labour. Verify that the Excel file contains a column named <code>label</code> that has the item key that we added to the <code>.ris</code> export.</p> <h3> <a href="https://koenraijer.com/literature-review#setting-up-urls-to-pdfs-in-google-drive" target="_self" rel>Setting up URLs to PDFs in Google Drive</a></h3> <p>This is how I would set-up for full-text screening:</p> <ul><li>Upload the Excel file to Google Drive.</li> <li>Go to  <a href="https://www.zotero.org/groups" target="_blank" rel="nofollow">Zotero Groups<sup>↗</sup></a> and open your newly made group library by clicking <code>Group Library</code>. Navigate to any random reference and look at the URL. It should be of this format: <code>https://www.zotero.org/groups/&lt;some_group_identifier&gt;/&lt;name_of_your_group&gt;/items/&lt;item_key_you_added_to_the_RIS_export&gt;/library</code>. We are going to recreate this URL based on the item key that is in the <code>label</code> column.</li> <li>Create a new column, call it <code>pdflink</code>. In the first row, add this text:</li></ul> <pre><code><span class="line"><span>="https://www.zotero.org/groups/&#x3C;some_random_identifier>/&#x3C;name_of_your_group>/collections/&#x3C;some_collection_identifier/items/" &#x26; A1 &#x26; "/collection"</span></span></code></pre> <ul><li>This assumes that the <code>label</code> column is the first column. If it is not, replace <code>A</code> with the correct column’s letter or simply move the <code>label</code> column to the first position.</li> <li>To repeat this formula for all the other rows automatically; select the cell, and pull down on the blue dot in the bottom-right corner of the cell.</li></ul> <p>What this does it create a URL that leads you to the correct PDF (assuming there is one).</p> <h3> <a href="https://koenraijer.com/literature-review#modifying-the-google-drive" target="_self" rel>Modifying the Google Drive</a></h3> <p>Before you can start screening, you need to add columns to your spreadsheet that assign references to screeners, allow logging screeners’ decision (include or exclude), allow logging reasons for exclusion and additional comments for discussion. In the spirit of <em>blinding</em>, it may be wise to duplicate the spreadsheet, or at least duplicate the sheet in the same spreadsheet, so that screener’s cannot see the other’s decisions.</p> <p>These are the columns I would add to the first (spread)sheet:</p> <ul><li><code>1st_screener</code> - initials of the first screener for these references;</li> <li><code>1st_included</code> - whether the first screener wants to include the reference (<code>TRUE</code> or <code>FALSE</code>)</li> <li><code>1st_criterion</code> - the reason the first screener may want to exclude the reference;</li> <li><code>1st_comments</code>;</li></ul> <p>And to the second (spread)sheet:</p> <ul><li><code>2nd_screener</code> - initials of the second screener for these references;</li> <li><code>2nd_included</code> - whether the second screener wants to include the reference (<code>TRUE</code> or <code>FALSE</code>);</li> <li><code>2nd_criterion</code> - the reason the second screener may want to exclude the reference;</li> <li><code>2nd_comments</code>;</li></ul> <p>With these comments in place, calibration simply involves filtering columns for rows where there is disagreement (in Google Drive: select all cells <span><span><span></span><span><span><span></span><span>→</span></span></span></span></span> <code>Data</code> <span><span><span></span><span><span><span></span><span>→</span></span></span></span></span> <code>Create a filter</code>).</p> <h3> <a href="https://koenraijer.com/literature-review#discussing-pdf-highlighting" target="_self" rel>Discussing PDF highlighting</a></h3> <p>As I briefly mentioned in  <a href="https://koenraijer.com/literature-review#collaboration-and-blinding" target="_self" rel>Collaboration and Blinding</a>, seeing other people’s highlights and comments in PDF files is subject to what I just coined as the <em>calibration-blinding trade-off</em>. As such, it may be wise to agree on some kind of highlighting policy. The benefit of seeing other people’s PDF highlights is that information that collaborators found helpful is likely to be helpful to you, too. However, if collaborators write extensive comments on their reasons for including or excluding some reference, you compromise blinding. So, prohibiting comments may be an appropriate middle ground.</p> <h2> <a href="https://koenraijer.com/literature-review#data-extraction" target="_self" rel>Data Extraction</a></h2> <p>Data extraction requires a data extraction table. Each row will be a paper. Each column is a piece of information that you’ll need. This is highly dependent on the question you’re trying to answer, but some things may come in handy in most cases:</p> <ul><li>Metadata: these can be copied from the full-text screening spreadsheet. Make sure to include the <code>label</code> and <code>pdflink</code> columns;</li> <li>Descriptives of the sample: sample size, mean age, age SD, percent male, percent female;</li> <li>Quality appraisal: generally required for systematic reviews, not for scoping reviews;</li> <li>Diagnostic instrument.</li></ul> <p>It might also be useful to search OSF for data extraction tables other studies used. Realise that data extraction is probably the most labour-intensive of all, and definitely the most labour-intensive step <em>per study</em>. You don’t want to forget any columns, because going over all studies again will be very burdensome. At the same time, you don’t want to be collecting information you won’t need for the review. Sadly, data extraction is still manual labor.</p> <div><hr><h6>Bibliography &amp; Footnotes</h6> <ol><li>van de Schoot, R., de Bruin, J., Schram, R. <em>et al.</em> An open source machine learning framework for efficient and transparent systematic reviews. <em>Nat Mach Intell</em> <strong>3</strong>, 125–133 (2021).  <a href="https://doi.org/10.1038/s42256-020-00287-7" target="_blank" rel="nofollow">https://doi.org/10.1038/s42256-020-00287-7<sup>↗</sup></a> <a href="https://koenraijer.com/literature-review#fnref-1" target="_self" rel>↩</a></li> <li>This is described in more detail in  <a href="https://koenraijer.com/literature-review#title-and-abstract-screening-with-asreview" target="_self" rel>Title and Abstract Screening with ASReview</a>. Whereas other calibrations involve only references that screeners disagree on, the calibration that occurred after completing title and abstract screening with ASReview also involves references that <em>one screener included while the other did not see the reference before</em>. This occurs because the active learning algorithm in ASReview learns differently based on your earlier choices. <a href="https://koenraijer.com/literature-review#fnref-2" target="_self" rel>↩</a></li></ol></div>]]></content:encoded>
            <category><![CDATA[Research]]></category>
        </item>
        <item>
            <title><![CDATA[Experience sampling self-experimentation]]></title>
            <link>https://koenraijer.com/experience-sampling</link>
            <guid isPermaLink="true">https://koenraijer.com/experience-sampling</guid>
            <pubDate>Sat, 01 Jun 2024 00:00:00 GMT</pubDate>
            <atom:updated>2024-06-06T00:00:00.000Z</atom:updated>
            <dc:creator><![CDATA[Koen Raijer]]></dc:creator>
            <description><![CDATA[I tracked my emotions using the circumplex model of affect for three months, multiple times a day. In this post, I will share how I chose the right tool for the job, what questions I asked myself and why, challenges I encountered, and potential improvements I discovered.]]></description>
            <content:encoded><![CDATA[<p>For the past three months, I’ve consistently tracked my emotions multiple times a day. My aim was to explore a method known as experience sampling, which focuses on real-time, real-life data collection of mental states. In this post, I will give a short introduction on experience sampling and its merits, considerations in choosing a tool and a theoretical model, and I talk in depth about some fascinating difficulties and challenges I encountered along the way.</p> <h2> <a href="https://koenraijer.com/experience-sampling#introduction-to-experience-sampling" target="_self" rel>Introduction to Experience Sampling</a></h2> <p>Experience sampling is a common method in psychological research for collecting real-time information as people go about their daily lives. What it looks like in practical terms, is that you may be asked to enter some information into an app several times a day about what’s going on inside your head at that particular moment. It may not seem like much, but experience sampling is surprisingly powerful. Because even with super cool techniques for looking at brains, like functional MRI, you can (most likely) never avoid <em>asking</em> people about what is happening in their mind’s eye. In mental health care, we often collect information using surveys that ask people how they felt over a certain period. “How often did you feel depressed in the last two weeks?” is a question we may ask to gauge someone’s mood. But if they’re feeling especially down on the day they complete the survey, they may unintentionally paint a bleaker picture of their mood than what was true for that period. In addition, we don’t learn anything of how their mood developed over the course of that period: whether they usually feel depressed in the mornings, whether it has been getting worse, or whether there is a pattern that repeats itself. With experience sampling, you ask someone how they are feeling several times a day over a longer period of time. Instead of just one data point, you now have dozens of them. The resolution has just been 20x’ed. Such detailed data can reveal valuable trends and patterns that can teach us much more about an individual’s state than a single measurement can.</p> <p>Experience sampling does not only hold promise in mental health care and research. There is also a lot to be learned by individuals about themselves. One such group is the  <a href="https://quantifiedself.com/" target="_blank" rel="nofollow">Quantified Self<sup>↗</sup></a> community, who are dedicated to self-tracking to improve their lives. I have come across them on various internet dwellings, and again recently while doing a literature search for a review article I am writing. If I am to do research involving experience sampling, it seems natural for me to do some self-experimentation. So, I decided to pick my own emotions as a target, because a) I have them all the time, and b) it is generally useful to be more aware of them. Before I could start, I had to decide on two important prerequisites: a good app, and a good theoretical model for emotions.</p> <h2> <a href="https://koenraijer.com/experience-sampling#choosing-an-approach" target="_self" rel>Choosing an approach</a></h2> <h3> <a href="https://koenraijer.com/experience-sampling#choosing-an-app" target="_self" rel>Choosing an app</a></h3> <p>In the not so distant past, experience sampling was done using paper diaries. Later, <em>Personal Digital Assistants</em> like the  <a href="https://en.wikipedia.org/wiki/Palm_Tungsten" target="_blank" rel="nofollow">Palm Tungsten<sup>W</sup></a> were used, and nowadays, we use mobile apps. The landscape for experience sampling, or mood tracking, as such apps are usually called when intended for consumers, is filled with a myriad of tools that, unfortunately, often fall short in important ways. Most apps (on iOS) for mood tracking are too opinionated (like those focussed on gratitude journalling), too restricted, cluttered with useless features, costly (with monthly subscription fees), or careless with sensitive personal data. So, in the spirit of free and open-source software, I scoured this  <a href="https://github.com/dkhamsing/open-source-ios-apps" target="_blank" rel="nofollow">GitHub list of open-source iOS apps<sup>GH</sup></a> and found rTracker: “A generic, customizable personal data tracker”. Right up my alley.  <a href="https://janerob.com/rTracker/rTracker/iPhone/pages/rTracker-main.html" target="_blank" rel="nofollow">rTracker<sup>↗</sup></a> promised me ultimate freedom to design my experience sampling survey exactly as I want, and it delivered (<em>this is not an ad!</em>). A big shoutout to the app’s author Rob Miller, who has kindly and swiftly responded to my request for more data sharing options.</p> <h3> <a href="https://koenraijer.com/experience-sampling#choosing-a-model" target="_self" rel>Choosing a model</a></h3> <p>The next question is: how do I capture my emotions? Which questions do I want to ask myself? Answering these questions requires a model. A good model must be valid, meaning it must capture my true emotional state accurately and precisely. It must also be fast. I felt that capturing my emotional state should not take more than a minute, ideally less. It must also be interpretable. Models for emotions can generally be divided into two groups: those biased towards categories and those biased towards dimensions. Categorical models recognise certain core emotions - like happiness, sadness, fear and anger - and require people to determine which of these best matches how they’re feeling. Dimensional models locate emotions as points in an <em>n</em>-dimensional space. Those dimensions represent important properties that all possible emotional states share. Together, those dimensions are theorised to define, and distinguish between, most emotional states.</p> <p>A common dimensional model is the <strong>circumplex model of affect</strong>. It proposes that emotions lie in a two-dimensional space defined by arousal (high or low) and valence (positive or negative). The arousal axis’ range goes from being asleep, calm, or drained - to being awake, stimulated, or energised. The valence axis is related to whether an emotional state is positive or negative, i.e., good or bad. For example, <em>excitement</em> is high arousal and positive valence, while <em>sadness</em> is low arousal and negative valence. Now, the circumplex model has been around a long time (since 1980) and stands out for its simplicity <span><button><sup> <a href="https://koenraijer.com/experience-sampling#fn-1" target="_self" rel>1</a></sup></button>.<span><span>1<span></span></span><span>Posner, J., Russell, J. A., &amp; Peterson, B. S. (2005). The circumplex model of affect: An integrative approach to affective neuroscience, cognitive development, and psychopathology. <em>Development and Psychopathology</em>, <em>17</em>(3), 715–734.  <a href="https://doi.org/10.1017/S0954579405050340" target="_blank" rel="nofollow">https://doi.org/10.1017/S0954579405050340<sup>↗</sup></a></span><span><span></span><span>↖</span></span></span></span> As a requirement, a good dimensional model should be able to accomodate and differentiate between emotions used in categorical models. The circumplex model seems seems capable at doing this, with most core emotions occupying distinct spots around the valence-arousal circle (Figure 1).</p> <p> </p><div><figure><img src="https://koenraijer.com/circumplexmodel.jpg" alt="Figure 1. A graphical representation of the circumplex model of affect" title="Figure 1. A graphical representation of the circumplex model of affect"> <figcaption>Figure 1. A graphical representation of the circumplex model of affect</figcaption></figure></div> <p>The Positive And Negative Affect Schedule, or PANAS, is another emotion model that measures 20 emotions — 10 positive and 10 negative. A big advantage of the PANAS over the circumplex model is that it recognises that positive and negative emotions can co-exist independently of another, instead of being on a single <em>valence</em> axis. However, having to fill out 20 dimensions of the PANAS made me opt for the circumplex model, mostly for the sake of simplicity and speed.</p> <h3> <a href="https://koenraijer.com/experience-sampling#setting-up-rtracker" target="_self" rel>Setting up rTracker</a></h3> <p>A final important design consideration is which scale to use for the valence-arousal axes. I opted for a 7-point discrete scale ranging from -3 to 3 (including 0) for both axes. I added two extra items: influences, and comments (Figure 2). Influences are meant to represent factors I think influence my mood. Comments can be anything; from further explaining my emotions to giving feedback on the experience sampling process. I set rTracker to remind me three times during the day between 08:00 and 22:00, with at least 1 hour between reminders.</p> <p> </p><div><figure><img src="https://koenraijer.com/rtracker.jpeg" alt="Figure 2. My mood tracker as set up in rTracker" title="Figure 2. My mood tracker as set up in rTracker"> <figcaption>Figure 2. My mood tracker as set up in rTracker</figcaption></figure></div> <h2> <a href="https://koenraijer.com/experience-sampling#observations" target="_self" rel>Observations</a></h2> <p>I started tracking in March. It is now June, roughly three months later, and I feel like I’ve had enough exposure to write about it. I won’t show any actual data, although I’m thinking of ways to present it that I feel comfortable with. Rather, I want to use the occasion to write about the things I noticed about this particular experience sampling approach. Some things are specific to the circumplex model, some things generalise to experience sampling or self-tracking at large.</p> <h3> <a href="https://koenraijer.com/experience-sampling#which-is-the-emotion" target="_self" rel>Which is the emotion?</a></h3> <p>One of the first things I noticed was how difficult it is to know which part of conscious experience <em>is</em> the emotion. Both the valence and the arousal axes appear problematic, but in different ways. For the arousal axis, I have noticed that basic bodily functions like general energy level, hunger, and sleep deprivation interfere heavily with it. If I feel restless, it may be that I’m mostly hungry. Should that count as high arousal? What if I feel tired and anxious at the same time? Which one takes precedence? In a similar vein, feeling emotionally drained and feeling tired are two phenomena that are easily conflated. For the valence axis, thoughts superimposed on the experienced emotion often complicate its interpretation. For example, I may feel deep satisfaction after an intense workout despite serious physical discomfort (e.g., feeling nauseated). At the same time, I may feel some anxiety in the back of my mind because of an unrelated problem at work or in the family. It seems like several separate systems (e.g., cortical, limbic, subcortical) together manifest themselves in conscious experience in ways that resemble experienced emotions in different ways. The degree to which these can be disentangled by conscious thought appears to differ depending on the system from which the interference arises. For the valence axis, interference appears to arise mostly from cortical systems. My theory is that, because interference already comes in the shape of thoughts, which are more interpretable, it is easier to disentangle them from the experienced emotion. For the arousal axis, the problem seems more persistent. Interference comes in the shape of sensations felt in the body or in the head, that are less cognitive and thus harder to disentangle from feelings of arousal, which are highly similar in their presentation.</p> <p>A second problem with the arousal axis is that it not only appears to have a value, but also a location in the body. Experienced emotion is <strong>embodied</strong>. Regardless of the theory of emotion you prefer, it seems hard to deny that emotions coincide with bodily sensations of tension or stress (whatever you want to call it). Intense arousal in one part of the body may reflect a different emotion than intense arousal in another part of the body.</p> <p>The next section will expand on the effect of observation (i.e., reflection), a prerequisite for tracking, on the nature of the emotion itself.</p> <h3> <a href="https://koenraijer.com/experience-sampling#schrödingers-cat" target="_self" rel>Schrödinger’s Cat</a></h3> <p>The act of observing can change the nature of the emotion. For example, I’ve had moments where I’d feel energised and alert, but as soon as I started thinking about what to track, that very act seemed to tip the scale towards a negative valence feeling, perhaps best described as tense or anxious. On other occasions where I’d feel contented, becoming aware could increase the intensity of the feeling. Which factors appear to determine this effect? Well, it seems that emotions with high absolute arousal values often have their valence negatively impacted by observation. Observation can change slightly pleasant, high absolute arousal states to slightly unpleasant. For low absolute arousal states, it seems that observation is more likely to make valence move in either direction.</p> <p>If observation impacts the emotion, it raises the question: should we log the emotion we felt before or during the tracking? If we log the emotion from before the tracking, we may introduce noise in the form of latency (i.e., time between the emotion and the tracking), but logging the emotion we feel during the tracking reduces its accuracy (i.e., validity) because the act of observation can change the emotion in a way that is a) unpredictable, and b) not what we are looking to measure. In research, people often use the terms <em>random error</em> and <em>systematic error</em>. Random error refers to variation in the data that arises from small, random fluctuations, such as the noise introduced by the reduced immediacy of an emotion when logging it after it has changed to something different. Systematic error, on the other hand, refers to predictable inaccuracies introduced by factors like the act of observation changing the emotion. Which do we minimise at the expense of the other here? I am inclined to minimise systematic error, because it’s unpredictable, and because we measure very often, random error is likely to average out over time <span><button><sup> <a href="https://koenraijer.com/experience-sampling#fn-2" target="_self" rel>2</a></sup></button>.<span><span>2<span></span></span><span>Admittedly, looking back at the pre-tracking emotion could just as well be influenced by memory bias that favours the current emotion, so the error may not be entirely random.</span><span><span></span><span>↖</span></span></span></span></p> <h3> <a href="https://koenraijer.com/experience-sampling#fooling-yourself" target="_self" rel>Fooling Yourself</a></h3> <p>Sometimes I’d be in the presence of someone, who was looking over my shoulder while I got a notification. The watchful eye of someone whose emotions you’re mindful of is likely to distort the answers you give, consciously or unconsciously. I distinctly remember one occasion, where I felt quite drained after a long day at work. My partner was watching over my shoulder, and I realised I was downplaying how low of an arousal state I was actually in. Perhaps partly to not disrupt her mood or create concern, but also because I was unconsciously replacing the difficult question of how I was feeling that day, with the easier question of how I usually feel in their presence. It is easy to draw an analogy here to the duality of Kahneman’s <em>system 1</em> and <em>system 2</em> <span><button><sup> <a href="https://koenraijer.com/experience-sampling#fn-3" target="_self" rel>3</a></sup></button>.<span><span>3<span></span></span><span>Kahneman, D. (2011). <em>Thinking, fast and slow.</em> Farrar, Straus and Giroux.</span><span><span></span><span>↖</span></span></span></span> System 1, our fast, automatic, and intuitive mode, often overrides system 2, which is slower, more deliberate, and analytical. In this case, in the presence of my partner, system 1 facilitated a quick, simplified response by defaulting to a familiar pattern of behaviour. Instead of engaging system 2 to consciously assess my true emotional state, I substituted the more complex question of my actual feelings with the easier, habitual response dictated by system 1. This substitution, though less accurate, offered a socially acceptable answer that avoided potential discomfort or concern. It is easy to see how this distortion could be much larger when there is dissatisfaction in a relationship.</p> <p>I’ve noticed similar effects when being alone. Especially when in a high absolute arousal / low absolute valence state, which as I described, appears to be more unstable, I started to anticipate the apparent negative effect of observation, and logged the emotion in a more favourable way to prevent tipping the scale towards negative.</p> <p>Only after reading a study by Ida-Marie Arendt and colleagues, who calls these <strong>metacognitive beliefs</strong>, did I become able to give words to this phenomenon. She writes the following:</p> <blockquote><p>Self-report risks capturing metacognitive beliefs about the symptom rather than the phenomenon itself <span><button><sup> <a href="https://koenraijer.com/experience-sampling#fn-4" target="_self" rel>4</a></sup></button><span><span>4<span></span></span><span>Arendt, I.-M. T. P., Riisager, L. H. G., Larsen, J. E., Christiansen, T. B., &amp; Moeller, S. B. (2021). Distinguishing between rumination and intrusive memories in PTSD using a wearable self-tracking instrument: A proof-of-concept case study. <em>The Cognitive Behaviour Therapist</em>, <em>14</em>, e15.  <a href="https://doi.org/10.1017/S1754470X2100012X" target="_blank" rel="nofollow">https://doi.org/10.1017/S1754470X2100012X<sup>↗</sup></a></span><span><span></span><span>↖</span></span></span></span></p></blockquote> <p>Instead of answering the question of how I was feeling at that moment in time (<em>the phenomenon itself</em>), I would answer a different question (the answer to which is the <em>metacognitive belief</em>).</p> <p>Some examples of questions that ask for metacognitive beliefs instead of the phenomenon itself:</p> <ul><li>How do I want to feel right now?</li> <li>What should I log to prevent feeling worse?</li> <li>How do I usually feel in a similar situation?</li> <li>How am I supposed to feel right now?</li></ul> <p>The last one, “how am I supposed to feel right now?”, seems particularly hard to spot, especially when pressed for time. I do believe that you can get better at spotting obvious metacognitive beliefs, but solving the issue seems pretty slippery. How do we know that we aren’t replacing a metacognitive belief by a less obvious one? Do we ever stop fooling ourselves?</p> <p> </p><div><figure><img src="https://koenraijer.com/astronaut_with_gun_meme.jpg" alt="Figure 3. The meme known as 'Wait, It's All Ohio? Always Has Been', which I believe describes the slippery nature of identifying metacognitive beliefs pretty accurately." title="Figure 3. The meme known as 'Wait, It's All Ohio? Always Has Been', which I believe describes the slippery nature of identifying metacognitive beliefs pretty accurately."> <figcaption>Figure 3. The meme known as 'Wait, It's All Ohio? Always Has Been', which I believe describes the slippery nature of identifying metacognitive beliefs pretty accurately.</figcaption></figure></div> <p>Although it is easy to fall prey to this issue of apparent  <a href="https://en.wikipedia.org/wiki/Infinite_regress" target="_blank" rel="nofollow">infinite regress<sup>W</sup></a>, it may still be worth our time to find ways to reduce the impact of metacognitive beliefs on the phenomenon of interest. The impact of each subsequent self-assessment may not be equal, leading to some sort of <em>convergent</em> infinite regress. Regardless, the possibility of self-knowledge is an interesting topic. I’ve enjoyed reading through this Standford overview on phenomenological approaches to self-consciousness ( <a href="https://plato.stanford.edu/entries/self-consciousness-phenomenological/" target="_blank" rel="nofollow">link<sup>↗</sup></a>). The thing that caught my attention is the position that reflection — the interpretation of lived experience within yourself — involves both a gain and a loss. The interpretation alters and distorts the lived experience, but it may also add valuable information to it.</p> <h3> <a href="https://koenraijer.com/experience-sampling#models-be-modelling" target="_self" rel>Models be modelling</a></h3> <p>The circumplex model is intuitive to understand, and as I describe above, it appears to accommodate many of the core emotions quite well (see Figure 1). But that does not mean that locating specific <em>experienced</em> emotions within the model is straightforward. An accurate model does not need to be easy to use. In fact, my version of the circumplex model turned out to be quite difficult to use for several reasons. Firstly, with scales ranging from -3 to 3, the space in which emotions can be localised is small and has low resolution. Distinguishing between one emotion and an entirely different one can be as subtle as choosing between a 1 or a 2 on a single sub-scale. Secondly, a previous tracking will often linger in your head, leading you to ask: is my current emotion higher or lower in valence or arousal? If you want to remain consistent with previous tracking, answering this question can significantly restrain the usable part of the answer space. Thirdly, the ease of use of this model, which may be used by anyone, depends on its intuitiveness. Most people, I suspect (myself included), conceptualise emotions as categories, not as points on the 2D valence-arousal grid. This is best seen in the way we speak about emotions. We categorise them. We say: “I am angry”, not “I am heavily aroused in a negative way”. If mapping the categories to the axes is not obvious, the data can become confusing and inaccurate.</p> <h2> <a href="https://koenraijer.com/experience-sampling#summary--conclusion" target="_self" rel>Summary &amp; Conclusion</a></h2> <p>In summary, there are several challenges with sampling experienced emotions using the circumplex model of affect. There is the problem of disentangling apparently cortical and subcortical influences on experienced emotion, which cause trouble interpreting both the valence and arousal axis in distinct ways. An additional problem for the arousal axis is the fact that it is usually felt somewhere in the body, something that the circumplex model does not account for. Then there is the unpredictable influence of the act of observation, or reflection, on the experienced emotion. Finally, self-deception for social or ego reasons can interfere with our ability to <em>know</em> our own emotions.</p> <h2> <a href="https://koenraijer.com/experience-sampling#whats-next" target="_self" rel>What’s next</a></h2> <p>The next self-experiment (that is within arm’s reach), is probably going to involve using a less fast, but properly validated model for tracking experienced emotions. I’m curious how much of a difference such a model will make. The I-PANAS-SF (<em>International</em> PANAS <em>Short Form</em>) seems to be a promising candidate for this <span><button><sup> <a href="https://koenraijer.com/experience-sampling#fn-5" target="_self" rel>5</a></sup></button>.<span><span>5<span></span></span><span>Thompson, E. R. (2007). Development and Validation of an Internationally Reliable Short-Form of the Positive and Negative Affect Schedule (PANAS). <em>Journal of Cross-Cultural Psychology</em>, <em>38</em>(2), 227–242.  <a href="https://doi.org/10.1177/0022022106297301" target="_blank" rel="nofollow">https://doi.org/10.1177/0022022106297301<sup>↗</sup></a></span><span><span></span><span>↖</span></span></span></span> It has 10 items, 5 positive and 5 negative in valence. I suspect that, although this seems 5x as long, it isn’t going to take 5x as long to fill in. In time, I’ll learn to recognise items that are relevant to my current state faster and faster.</p> <p>It may be that trying to tackle self-deception in reflection is akin to peeling an unending onion, where, as we zoom in, problems just proliferate endlessly like some fractal tree structure. Still, if the importance of layers shows a decreasing trend, where the impact of earlier layers proves larger than that of subsequent layers, the process can still lead to meaningful improvements in real life.</p> <p>Needless to say, I am by no means an expert in this field and it is to be expected that parts of this post are naive or uninformed. If you know of any sources I might find interesting to read, please let me know!</p> <div><hr><h6>Bibliography &amp; Footnotes</h6> <ol><li>Posner, J., Russell, J. A., &amp; Peterson, B. S. (2005). The circumplex model of affect: An integrative approach to affective neuroscience, cognitive development, and psychopathology. <em>Development and Psychopathology</em>, <em>17</em>(3), 715–734.  <a href="https://doi.org/10.1017/S0954579405050340" target="_blank" rel="nofollow">https://doi.org/10.1017/S0954579405050340<sup>↗</sup></a> <a href="https://koenraijer.com/experience-sampling#fnref-1" target="_self" rel>↩</a></li> <li>Admittedly, looking back at the pre-tracking emotion could just as well be influenced by memory bias that favours the current emotion, so the error may not be entirely random. <a href="https://koenraijer.com/experience-sampling#fnref-2" target="_self" rel>↩</a></li> <li>Kahneman, D. (2011). <em>Thinking, fast and slow.</em> Farrar, Straus and Giroux. <a href="https://koenraijer.com/experience-sampling#fnref-3" target="_self" rel>↩</a></li> <li>Arendt, I.-M. T. P., Riisager, L. H. G., Larsen, J. E., Christiansen, T. B., &amp; Moeller, S. B. (2021). Distinguishing between rumination and intrusive memories in PTSD using a wearable self-tracking instrument: A proof-of-concept case study. <em>The Cognitive Behaviour Therapist</em>, <em>14</em>, e15.  <a href="https://doi.org/10.1017/S1754470X2100012X" target="_blank" rel="nofollow">https://doi.org/10.1017/S1754470X2100012X<sup>↗</sup></a> <a href="https://koenraijer.com/experience-sampling#fnref-4" target="_self" rel>↩</a></li> <li>Thompson, E. R. (2007). Development and Validation of an Internationally Reliable Short-Form of the Positive and Negative Affect Schedule (PANAS). <em>Journal of Cross-Cultural Psychology</em>, <em>38</em>(2), 227–242.  <a href="https://doi.org/10.1177/0022022106297301" target="_blank" rel="nofollow">https://doi.org/10.1177/0022022106297301<sup>↗</sup></a> <a href="https://koenraijer.com/experience-sampling#fnref-5" target="_self" rel>↩</a></li></ol></div>]]></content:encoded>
            <category><![CDATA[Self-experimentation]]></category>
            <category><![CDATA[Research]]></category>
        </item>
        <item>
            <title><![CDATA[arXivCollector]]></title>
            <link>https://koenraijer.com/arxivcollector</link>
            <guid isPermaLink="true">https://koenraijer.com/arxivcollector</guid>
            <pubDate>Sat, 04 May 2024 00:00:00 GMT</pubDate>
            
            <dc:creator><![CDATA[Koen Raijer]]></dc:creator>
            <description><![CDATA[Export arXiv searches as neatly formatted BibTex files.]]></description>
            <content:encoded><![CDATA[<p>If you’re an avid user of arXiv for finding academic papers, you know that their website does not allow you to export your search results. Such exportation is vital for literature reviewing. That’s where <strong>arXivCollector</strong> comes in handy. This tool allows you to export your arXiv searches as neatly formatted BibTex files for easy importation into popular scientific reference managers like Zotero or EndNote.</p> <h3> <a href="https://koenraijer.com/arxivcollector#key-features" target="_self" rel>Key Features</a></h3> <ul><li><strong>Ease of use:</strong> you don’t need to be good at coding to use arXivCollector. All you need is to have Python installed on your PC.</li> <li><strong>Rich metadata:</strong> the export file includes DOIs and direct links to article PDFs.</li> <li><strong>Multiple formatting options:</strong> Choose between exporting your references as BibTex files or csv files.</li></ul> <h3> <a href="https://koenraijer.com/arxivcollector#installation" target="_self" rel>Installation</a></h3> <ol><li><strong>Python Installation</strong>: Ensure you have Python installed on your system.</li> <li><strong>Clone the Repository</strong>: Run the command <code>git clone https://github.com/koenraijer/arxivcollector.git</code> in your terminal.</li> <li><strong>Navigating the Repository</strong>: Move into the cloned repository directory by running <code>cd path/to/arxivcollector</code>.</li></ol> <h3> <a href="https://koenraijer.com/arxivcollector#getting-started" target="_self" rel>Getting Started</a></h3> <p>You can use <strong>arXivCollector</strong> in two ways:</p> <ul><li><strong>Via Python Script</strong>: Import the <code>arXivCollector()</code> class and run the provided Python code.</li> <li><strong>From Command Line</strong>: Execute the <code>arxivcollector.py</code> script with the search URL and desired title.</li></ul> <h3> <a href="https://koenraijer.com/arxivcollector#special-thanks" target="_self" rel>Special Thanks</a></h3> <p>A shoutout to Fatima et al., whose work inspired the development of <strong>arXivCollector</strong>. You can check out their paper  <a href="https://doi.org/10.1016/j.infsof.2023.107251" target="_blank" rel="nofollow">here<sup>↗</sup></a>.</p> <h3> <a href="https://koenraijer.com/arxivcollector#api-overview" target="_self" rel>API Overview</a></h3> <p>The <code>arXivCollector</code> class is the core component responsible for collecting and saving arXiv metadata. For detailed usage instructions and API documentation, please refer to the  <a href="https://github.com/koenraijer/arxivcollector" target="_blank" rel="nofollow">official repository<sup>GH</sup></a>.</p> <p>Happy referencing!</p>]]></content:encoded>
            <category><![CDATA[Research]]></category>
            <category><![CDATA[Tinkering]]></category>
        </item>
        <item>
            <title><![CDATA[Recensie: Het duizend eilanden experiment]]></title>
            <link>https://koenraijer.com/boekrecensie-het-duizend-eilanden-experiment</link>
            <guid isPermaLink="true">https://koenraijer.com/boekrecensie-het-duizend-eilanden-experiment</guid>
            <pubDate>Sun, 07 Jan 2024 00:00:00 GMT</pubDate>
            
            <dc:creator><![CDATA[Koen Raijer]]></dc:creator>
            <description><![CDATA[Een boekrecensie van Frank van Dongens sciencefictionroman: Het duizend eilanden experiment.]]></description>
            <content:encoded><![CDATA[<div><div><span>Correspondentie met de auteur</span></div><div><p>De auteur heeft gereageerd op deze recensie. Dat heeft tot een korte briefwisseling geleid. Zijn reactie getuigt van een bewonderenswaardige durf om zich kwetsbaar op te stellen en te luisteren naar kritiek, zelfs als die iets betreft waar hij zijn ziel en zaligheid in heeft gelegd. Omdat ik niet zijn toestemming heb om zijn reactie te publiceren, zal ik dat ook niet doen. Ik wil de auteur bedanken, en ik moedig iedereen aan om zijn boeken te lezen en om zelf ook een mening te vormen.</p></div></div> <p><em> <a href="https://www.bol.com/nl/nl/p/ontdekking-van-de-mens-1-het-duizend-eilanden-experiment/9300000047861060/?s2a=&amp;bltgh=hoFsbQc0Yjss36Fs5ShBUQ.2_36_37.38.FeatureOptionButton#productTitle" target="_blank" rel="nofollow">Het duizend eilanden experiment<sup>↗</sup></a></em> van Frank van Dongen is een Nederlandse scifiroman waarin genationaliseerde social mediagiganten een wereldwijd aandachtsmonopolie op het met automatische medicatie-implantaten in toom gehouden volk hebben. Elke vorm van zelfexpressie – een eigen zaak hebben, een feestje houden, er überhaupt ideeën op nahouden – wordt ontmoedigd of is verboden. Met de magische connectie tussen de hoofdpersoon en zijn eeneiige tweelingbroer ontvouwt zich een mysterieuze verhaallijn op een andere planeet, waarbij de dreiging van intelligent buitenaards leven als een rode draad door het verhaal blijft lopen.</p> <p>In dit boek komen in de eerste plaats <em>veel</em> verschillende sciencefictionthema’s aan bod. Een aantal daarvan zijn klassiekers: de expansie van de mensheid tussen de sterren, een dreigende alieninvasie, en de Frankenstein-achtige experimenten van Jack, de hoofdpersoon. Tegelijkertijd behandelt de schrijver ook meer eigentijdse thema’s. Zoals SoNet, het almachtige staatsmediabedrijf, dat de levens van de massa’s volledig in hun greep heeft, en ze dag en nacht voedt met VR-amusement en VR-porno. We zijn er nog ver van verwijderd, en toch voel ik (en ik ben niet de enige) een vergelijkbaar gevoel van vervreemding en versplintering ten gevolge van de digitalisering van ons sociale leven. En ook een vergelijkbare strijd om me daartegen te weren, als Jack zegt dat hij zich “met fysieke maatregelen tegen de verleidingen van SoNet moet beschermen, om te voorkomen dat hij er in momenten van zwakte en verlangen weer aan toegeeft”.
Een ander geslaagd thema is de <em>brain-computer interface</em>. Met name de fictieve psychische gevolgen daarvan zijn mooi beschreven en stemmen me tot nadenken. De schrijver schetst hoe voor kinderen bij wie externe geheugenimplantaten geïmplanteerd zijn, de grens tussen dat wat van hen en dat wat van het implantaat is, vervaagt. De kinderen weten niet meer waar zijzelf eindigen, en waar hun digitale verlengstuk begint. Dat deed me denken aan de waan die sommige mensen met een psychose krijgen: de beïnvloedingswaan. Daarbij raken mensen ervan overtuigd dat iets dat buiten hun ligt, zoals een satelliet, hun bestuurt. We noemen dat ook wel een probleem met de <em>zelfafgrenzing</em>. De beïnvloedingswaan wordt op die manier een technologische realiteit. Op deze manier passeren nog een aantal thema’s de revue, en vaak lukt het om hele complexe en actuele problemen op een verhalende en begrijpelijke manier aan de man te brengen. Dat is bewonderenswaardig en leuk om te lezen, maar er kleven ook een aantal nadelen aan.</p> <p>Zo lijkt de schrijver een sterke drang te hebben om de lezer iets bij te brengen. Om dat te bereiken bevat het boek regelmatig langdradige, lezing-achtige monologen, die met momenten didactisch overkomen. Regelmatig lezen gesprekken tussen personages daardoor meer als opgeknipte monologen, dan als echte dialogen. Bovendien wordt het taalgebruik in zulke passages gekenmerkt door droge opsommingen die aan beleidsdocumenten doen denken. Dit soort ellenlange “onderdelen, aspecten, vormen, maten, en soorten” opsommingen vervelen gauw. De schrijver wekt die indruk niet alleen met zijn schrijfwijze, maar ook met de eentonigheid van de wereldvisie die de personages in hun monologen tentoonspreiden.
De personages zijn niet alleen overtuigd van hun superieure intelligentie, maar ook van hun morele superioriteit ten opzichte van het aan <em>AI-generated</em> amusement verslaafde klootjesvolk. Dat valt te begrijpen voor de <em>private school kids</em> waarmee Jack omgaat, maar bij Jack, die toch een man van het volk was, voelt het misplaatst. De elite die zichzelf zo graag schouderklopjes geeft ontbreekt het bovendien aan een vermogen tot zelfreflectie. Zo beschrijft Valery op enig moment hoe haar werkverslaafde moeder nooit tijd voor haar had, en zegt op de volgende pagina dat zij “opgroeiden in een oase van aandacht en verzorging van de intellectuele en politieke elite”, terwijl Jack “rondzwierf in de geestdodende krochten van het laagste volk”. De <em>savior complex</em> om de mensheid te redden, waarvan de hoofdpersonen stuk voor stuk doordrongen zijn, blijkt niet zo nobel wanneer blijkt dat ze vooral van plan zijn <em>zichzelf</em> van de ondergang te redden. En dan heb ik het nog niet gehad over de opvallend ouderwetse manier waarop in dit boek naar man-vrouwverhoudingen wordt gekeken. Daarbij doen vrouwen vaak denken aan tamme hertjes, terwijl mannen, die in positieve zin als “seksuele roofdieren” worden beschreven, “wel even” jacht op ze zullen maken.</p> <p>Hoewel het dit boek op een laagdrempelige manier lukt om moeilijke, niet onrealistische toekomstscenario’s uit te leggen, tiert de klassistische, ouderwetse wereldvisie die de personages erop nahouden welig in dit boek. Ik denk dat mijn behoefte om de morele houding van de fictieve personages in dit boek te bekritiseren dan ook ontstaat omdat de indruk gewekt wordt dat het hier vooral de schrijver zélf is die op de bühne staat.</p>]]></content:encoded>
            <category><![CDATA[Dutch]]></category>
            <category><![CDATA[Books]]></category>
        </item>
        <item>
            <title><![CDATA[From Pocketbook notes to markdown]]></title>
            <link>https://koenraijer.com/pocketbook-to-obsidian</link>
            <guid isPermaLink="true">https://koenraijer.com/pocketbook-to-obsidian</guid>
            <pubDate>Thu, 04 Jan 2024 00:00:00 GMT</pubDate>
            
            <dc:creator><![CDATA[Koen Raijer]]></dc:creator>
            <description><![CDATA[This post uses a simple script based on BeautifulSoup to convert Pocketbook notes, which are in HTML format, to Obsidian-flavoured markdown with YAML frontmatter.]]></description>
            <content:encoded><![CDATA[<p>I currently do most of my reading on a <strong>Pocketbook Era</strong> e-reader. It allows highlights, definitions of words and notes to be exported in HTML format. In order to be able to store my book notes in Obsidian without any manual formatting, I wrote a Python script that converts the HTML into Obsidian-flavoured markdown, and also fills out some YAML frontmatter fields for you.</p> <p>The <code>&lt;body&gt;</code> tag of the input file has the following structure:</p> <pre><code><span class="line"><span>&#x3C;</span><span>div</span><span>></span></span>
<span class="line"><span>	&#x3C;</span><span>h1</span><span>>2024-01-04 14:43:11 - De Eeuw Van Mijn Vader&#x3C;/</span><span>h1</span><span>></span></span>
<span class="line"><span>&#x3C;/</span><span>div</span><span>></span></span>
<span class="line"><span>&#x3C;</span><span>div</span><span>></span></span>
<span class="line"><span>	&#x3C;</span><span>span</span><span>>Mak, Geert&#x3C;/</span><span>span</span><span>></span></span>
<span class="line"><span>&#x3C;/</span><span>div</span><span>></span></span>
<span class="line"><span>&#x3C;</span><span>div</span><span>></span></span>
<span class="line"><span>	&#x3C;</span><span>p</span><span>>70&#x3C;/</span><span>p</span><span>></span></span>
<span class="line"><span>	&#x3C;</span><span>div</span><span>></span></span>
<span class="line"><span>		&#x3C;</span><span>p</span><span>>De zomers waren vol toogdagen ...&#x3C;/</span><span>p</span><span>></span></span>
<span class="line"><span>	&#x3C;/</span><span>div</span><span>></span></span>
<span class="line"><span>&#x3C;/</span><span>div</span><span>></span></span></code></pre> <p>The output file looks something like this:</p> <pre><code><span class="line"><span>---</span></span>
<span class="line"><span>tags:</span></span>
<span class="line"><span>  -</span><span> book</span></span>
<span class="line"><span>  -</span><span> reference</span></span>
<span class="line"><span>  -</span><span> unprocessed</span></span>
<span class="line"><span>author: Geert Mak</span></span>
<span class="line"><span>title: De Eeuw Van Mijn Vader</span></span>
<span class="line"><span>isbn:</span></span>
<span class="line"><span>date: 2024-01-04</span></span>
<span class="line"><span>zettel:</span></span>
<span class="line"><span>---</span></span>
<span class="line"></span>
<span class="line"><span>> De zomers waren vol toogdagen ... (page 70)</span></span></code></pre> <h2> <a href="https://koenraijer.com/pocketbook-to-obsidian#using-python-and-installing-dependencies" target="_self" rel>Using Python and installing dependencies</a></h2> <p>PC’s with MacOS come with Python by default, for Windows users I’m not so sure.
I used  <a href="https://beautiful-soup-4.readthedocs.io/en/latest/" target="_blank" rel="nofollow">BeautifulSoup<sup>↗</sup></a> to parse the HTML and extract relevant pieces of information from it. If you want maximum ease-of-use (rather than using the script from within a <code>conda</code> environment, for example), install the package globally by opening a terminal and pasting: <code>pip install beautifulsoup4</code>.</p> <h2> <a href="https://koenraijer.com/pocketbook-to-obsidian#overview-of-what-the-script-will-do" target="_self" rel>Overview of what the script will do</a></h2> <p>The script is going to be run from the command-line. We are going to name it <code>pocketbook_to_md.py</code> and it is going to require 2 arguments. The first argument will be the location of the HTML input file, the second argument will be the output folder for where our converted markdown file should go.</p> <p>Executing the script will involve running this command in your terminal: <code>python3 pocketbook_to_md.py input.html path/to/output_folder</code>.</p> <h2> <a href="https://koenraijer.com/pocketbook-to-obsidian#capturing-the-data-from-the-html" target="_self" rel>Capturing the data from the HTML</a></h2> <p>Let’s define our imports:</p> <ul><li><code>sys</code> allows us to capture the parameters we pass on the command-line by exposing the <code>sys.argv</code> method.</li> <li><code>os</code> allows us to construct the path for the <code>output_file</code>.</li> <li><code>bs4</code> allows us to parse (i.e., read and understand programmatically) the HTML.</li></ul> <pre><code><span class="line"><span>import</span><span> sys</span></span>
<span class="line"><span>import</span><span> os</span></span>
<span class="line"><span>from</span><span> bs4 </span><span>import</span><span> BeautifulSoup</span></span></code></pre> <p>Next, we define our main function, which takes as its arguments <code>input_file</code> and <code>output_folder</code>. We define a list <code>bookmarks</code> which will contain a list of dictionaries where each dictionary represents a bookmark. We also define a dictionary <code>metadata</code>, which will contain the metadata for the book our notes were exported from (title, author, date).</p> <pre><code><span class="line"><span>def</span><span> main</span><span>(input_file, output_folder):</span></span>
<span class="line"><span>    bookmarks </span><span>=</span><span> []</span></span>
<span class="line"><span>    metadata </span><span>=</span><span> &#123;&#125;</span></span></code></pre> <p>Continuing from where we left off, we open the input file and read its contents into a string <code>html</code>. We then create a BeautifulSoup object <code>soup</code> from this string, which allows us to parse the HTML.</p> <pre><code><span class="line"><span>with</span><span> open</span><span>(input_file) </span><span>as</span><span> f:</span></span>
<span class="line"><span>    html </span><span>=</span><span> f.read()</span></span>
<span class="line"><span>    soup </span><span>=</span><span> BeautifulSoup(html, </span><span>'html.parser'</span><span>)</span></span></code></pre> <p>We extract the body of the HTML document into <code>body</code>. We then extract the title and date from the first heading in the body, and the author from the first span. We reverse the author’s name (since it’s given in the format “last name, first name”) and join it in a single string of the format ““. We add all three to the <code>metadata</code> dictionary.</p> <pre><code><span class="line"><span>body </span><span>=</span><span> soup.body</span></span>
<span class="line"><span>title_date </span><span>=</span><span> body.h1.contents[</span><span>0</span><span>].split(</span><span>" - "</span><span>)</span></span>
<span class="line"><span>metadata[</span><span>"title"</span><span>] </span><span>=</span><span> title_date[</span><span>1</span><span>]</span></span>
<span class="line"><span>metadata[</span><span>"date"</span><span>] </span><span>=</span><span> title_date[</span><span>0</span><span>].split(</span><span>" "</span><span>)[</span><span>0</span><span>]</span></span>
<span class="line"><span>author </span><span>=</span><span> body.span.contents[</span><span>0</span><span>].split(</span><span>", "</span><span>)</span></span>
<span class="line"><span>author.reverse()</span></span>
<span class="line"><span>metadata[</span><span>"author"</span><span>] </span><span>=</span><span> " "</span><span>.join(author)</span></span></code></pre> <p>Next, we capture all <code>div</code> elements with the class “bookmark” where an id is present (this excludes the <code>div</code>’s with metadata), and store them in <code>bookmarks_html</code>. For each bookmark, we create a dictionary with the page number, text, and note (if it exists), and append this dictionary to the <code>bookmarks</code> list.</p> <pre><code><span class="line"><span>bm_html </span><span>=</span><span> soup.find_all(</span><span>"div"</span><span>, </span><span>"bookmark"</span><span>, </span><span>id</span><span>=</span><span>True</span><span>)</span></span>
<span class="line"><span>for</span><span> bm </span><span>in</span><span> bm_html:</span></span>
<span class="line"><span>    bm_dict </span><span>=</span><span> &#123;&#125;</span></span>
<span class="line"><span>    bm_html[</span><span>"page"</span><span>] </span><span>=</span></span>
<span class="line"><span>    bm.find_all(</span><span>"p"</span><span>, </span><span>"bm-page"</span><span>)[</span><span>0</span><span>].contents[</span><span>0</span><span>]</span></span>
<span class="line"><span>    bm_html[</span><span>"text"</span><span>] </span><span>=</span></span>
<span class="line"><span>    bm.find_all(</span><span>"div"</span><span>, </span><span>"bm-text"</span><span>)[</span><span>0</span><span>].p.contents[</span><span>0</span><span>]</span></span>
<span class="line"><span>    bm_html[</span><span>"note"</span><span>] </span><span>=</span></span>
<span class="line"><span>    bm.find_all(</span><span>"div"</span><span>, </span><span>"bm-note"</span><span>)[</span><span>0</span><span>].p.contents[</span><span>0</span><span>]</span></span>
<span class="line"><span>    if</span><span> bm.find_all(</span><span>"div"</span><span>, </span><span>"bm-note"</span><span>)</span></span>
<span class="line"><span>    else</span><span> ""</span></span>
<span class="line"><span>    bm.append(bm_dict)</span></span></code></pre> <h2> <a href="https://koenraijer.com/pocketbook-to-obsidian#translating-the-data-to-markdown" target="_self" rel>Translating the data to markdown</a></h2> <p>We start by creating a header for the markdown file, which will contain the metadata in YAML format. With <code>header = header.replace(&quot;\n&quot;, &quot;&quot;, 1)</code>, we remove the first newline character from the header, because a multiline string within <code>&quot;&quot;&quot;</code> will have a leading empty line that we don’t need.</p> <pre><code><span class="line"><span>header </span><span>=</span><span> f</span><span>"""</span></span>
<span class="line"><span>---</span></span>
<span class="line"><span>tags:</span></span>
<span class="line"><span>    - book</span></span>
<span class="line"><span>    - reference</span></span>
<span class="line"><span>    - unprocessed</span></span>
<span class="line"><span>author: </span><span>&#123;</span><span>metadata[</span><span>"author"</span><span>]</span><span>&#125;</span></span>
<span class="line"><span>title: </span><span>&#123;</span><span>metadata[</span><span>"title"</span><span>]</span><span>&#125;</span></span>
<span class="line"><span>isbn:</span></span>
<span class="line"><span>date: </span><span>&#123;</span><span>metadata[</span><span>"date"</span><span>]</span><span>&#125;</span></span>
<span class="line"><span>zettel:</span></span>
<span class="line"><span>--- </span><span>&#92;n</span></span>
<span class="line"><span>"""</span></span>
<span class="line"><span>header </span><span>=</span><span> header.replace(</span><span>"</span><span>&#92;n</span><span>"</span><span>, </span><span>""</span><span>, </span><span>1</span><span>)</span></span></code></pre> <p>Finally, we open the output file (which is named after the book title and located in the output folder) and write the header and bookmarks to it. Each bookmark is formatted as a blockquote with the highlighted text, the page number in parentheses, and the note (if it exists) on a new line as a list item.</p> <pre><code><span class="line"><span>out </span><span>=</span><span> os.path.join(folder_out, </span><span>f</span><span>"</span><span>&#123;</span><span>metadata[</span><span>'title'</span><span>]</span><span>&#125;</span><span>.md"</span><span>)</span></span>
<span class="line"><span>with</span><span> open</span><span>(out, </span><span>"w"</span><span>) </span><span>as</span><span> f:</span></span>
<span class="line"><span>    f.write(header)</span></span>
<span class="line"><span>    for</span><span> bm </span><span>in</span><span> bookmarks:</span></span>
<span class="line"><span>        f.write(</span></span>
<span class="line"><span>            f</span><span>'> </span><span>&#123;</span><span>bm[</span><span>"text"</span><span>]</span><span>&#125;</span></span>
<span class="line"><span>            (page &#123;bm[</span><span>"page"</span><span>]&#125;)</span></span>
<span class="line"><span>            &#123;newline </span><span>+</span><span> "-"</span><span> if</span><span> bm[</span><span>"note"</span><span>] </span><span>else</span><span> ""</span><span>&#125;</span></span>
<span class="line"><span>            &#123;bm[</span><span>"note"</span><span>]&#125; </span><span>n&#92;n'</span></span>
<span class="line"><span>        )</span></span></code></pre> <p>Our function is finished now and ready for use!</p> <h2> <a href="https://koenraijer.com/pocketbook-to-obsidian#calling-the-function-with-the-correct-parameters" target="_self" rel>Calling the function with the correct parameters</a></h2> <p>We have a few things left to do:</p> <ul><li>Call the function</li> <li>Make the script understand that it should take <code>input_file</code> and <code>output_folder</code> from the arguments passed along with its execution from the command-line.</li></ul> <p>Remember that using the script on the command-line will ook like this: <code>python3 pocketbook_to_md.py input.html path/to/output_folder</code>.</p> <p>First, we’ll need to check that the script is being run directly (not imported as a module). If that is the case, the Python interpreter will set <code>__name__</code> equal to <code>__main__</code> (don’t ask me why). If it is, we check if the number of arguments passed to the script is less than 2 (only the script’s name). If it is, we throw an error message “Usage: python script.py <input_file><output_folder:>”, which already alludes to the intended use. Namely, if only 2 arguments are passed, the output_folder is assumed to be the folder from which the function is called. We check for this by adding another if clause for when there are fewer than 3 arguments. In all other situations, we take the 2nd and 3rd arguments to be <code>input_file</code> and<code>output_folder</code>, respectively. We then call the <code>main</code> function with these arguments.</output_folder:></input_file></p> <pre><code><span class="line"><span>if</span><span> __name__</span><span> ==</span><span> "__main__"</span><span>:</span></span>
<span class="line"><span>    if</span><span> len</span><span>(sys.argv) </span><span>&#x3C;</span><span> 2</span><span>:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"""</span></span>
<span class="line"><span>                Usage:</span></span>
<span class="line"><span>                python script.py</span></span>
<span class="line"><span>                &#x3C;input_file></span></span>
<span class="line"><span>                &#x3C;output_folder: optional></span></span>
<span class="line"><span>            """</span><span>)</span></span>
<span class="line"><span>        sys.exit(</span><span>1</span><span>)</span></span>
<span class="line"><span>    if</span><span> len</span><span>(sys.argv) </span><span>&#x3C;</span><span> 3</span><span>:</span></span>
<span class="line"><span>        input_file </span><span>=</span><span> sys.argv[</span><span>1</span><span>]</span></span>
<span class="line"><span>        output_folder </span><span>=</span><span> os.getcwd()</span></span>
<span class="line"><span>    else</span><span>:</span></span>
<span class="line"><span>        input_file </span><span>=</span><span> sys.argv[</span><span>1</span><span>]</span></span>
<span class="line"><span>        output_folder </span><span>=</span><span> sys.argv[</span><span>2</span><span>]</span></span>
<span class="line"><span>    main(input_file, output_folder)</span></span></code></pre> <p>That’s all the code we need. In order to use it, save the code as <code>pocketbook_to_md.py</code> and execute it from the command-line!</p> <h2> <a href="https://koenraijer.com/pocketbook-to-obsidian#full-code" target="_self" rel>Full code</a></h2> <pre><code><span class="line"><span>import</span><span> sys</span></span>
<span class="line"><span>import</span><span> os</span></span>
<span class="line"><span>from</span><span> bs4 </span><span>import</span><span> BeautifulSoup</span></span>
<span class="line"></span>
<span class="line"><span>def</span><span> main</span><span>(input_file, output_folder):</span></span>
<span class="line"><span>    bookmarks </span><span>=</span><span> []</span></span>
<span class="line"><span>    metadata </span><span>=</span><span> &#123;&#125;</span></span>
<span class="line"></span>
<span class="line"><span>    with</span><span> open</span><span>(input_file) </span><span>as</span><span> f:</span></span>
<span class="line"><span>        html </span><span>=</span><span> f.read()</span></span>
<span class="line"><span>        soup </span><span>=</span><span> BeautifulSoup(html, </span><span>'html.parser'</span><span>)</span></span>
<span class="line"><span>        body </span><span>=</span><span> soup.body</span></span>
<span class="line"><span>        title_date </span><span>=</span><span> body.h1.contents[</span><span>0</span><span>].split(</span><span>" - "</span><span>)</span></span>
<span class="line"><span>        metadata[</span><span>"title"</span><span>] </span><span>=</span><span> title_date[</span><span>1</span><span>]</span></span>
<span class="line"><span>        metadata[</span><span>"date"</span><span>] </span><span>=</span><span> title_date[</span><span>0</span><span>].split(</span><span>" "</span><span>)[</span><span>0</span><span>]</span></span>
<span class="line"><span>        author </span><span>=</span><span> body.span.contents[</span><span>0</span><span>].split(</span><span>", "</span><span>)</span></span>
<span class="line"><span>        author.reverse()</span></span>
<span class="line"><span>        metadata[</span><span>"author"</span><span>] </span><span>=</span><span> " "</span><span>.join(author)</span></span>
<span class="line"><span>        bookmarks_html </span><span>=</span><span> soup.find_all(</span><span>"div"</span><span>, </span><span>"bookmark"</span><span>, </span><span>id</span><span>=</span><span>True</span><span>)</span></span>
<span class="line"><span>        for</span><span> bookmark </span><span>in</span><span> bookmarks_html:</span></span>
<span class="line"><span>            bookmark_dict </span><span>=</span><span> &#123;&#125;</span></span>
<span class="line"><span>            bookmark_dict[</span><span>"page"</span><span>] </span><span>=</span><span> bookmark.find_all(</span><span>"p"</span><span>, </span><span>"bm-page"</span><span>)[</span><span>0</span><span>].contents[</span><span>0</span><span>]</span></span>
<span class="line"><span>            bookmark_dict[</span><span>"text"</span><span>] </span><span>=</span><span> bookmark.find_all(</span><span>"div"</span><span>, </span><span>"bm-text"</span><span>)[</span><span>0</span><span>].p.contents[</span><span>0</span><span>]</span></span>
<span class="line"><span>            bookmark_dict[</span><span>"note"</span><span>] </span><span>=</span><span> bookmark.find_all(</span><span>"div"</span><span>, </span><span>"bm-note"</span><span>)[</span><span>0</span><span>].p.contents[</span><span>0</span><span>] </span><span>if</span><span> bookmark.find_all(</span><span>"div"</span><span>, </span><span>"bm-note"</span><span>) </span><span>else</span><span> ""</span></span>
<span class="line"><span>            bookmarks.append(bookmark_dict)</span></span>
<span class="line"></span>
<span class="line"><span>    header </span><span>=</span><span> f</span><span>"""---</span><span>&#92;n</span></span>
<span class="line"><span>tags:</span></span>
<span class="line"><span>    - book</span></span>
<span class="line"><span>    - reference</span></span>
<span class="line"><span>    - unprocessed</span></span>
<span class="line"><span>author: </span><span>&#123;</span><span>metadata[</span><span>"author"</span><span>]</span><span>&#125;</span></span>
<span class="line"><span>title: </span><span>&#123;</span><span>metadata[</span><span>"title"</span><span>]</span><span>&#125;</span></span>
<span class="line"><span>isbn:</span></span>
<span class="line"><span>date: </span><span>&#123;</span><span>metadata[</span><span>"date"</span><span>]</span><span>&#125;</span></span>
<span class="line"><span>zettel:</span></span>
<span class="line"><span>---</span><span>&#92;n&#92;n</span><span>"""</span></span>
<span class="line"><span>    # Replace first &#92;n with ""</span></span>
<span class="line"><span>    header </span><span>=</span><span> header.replace(</span><span>"</span><span>&#92;n</span><span>"</span><span>, </span><span>""</span><span>, </span><span>1</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>    newline </span><span>=</span><span> "</span><span>&#92;n</span><span>"</span></span>
<span class="line"></span>
<span class="line"><span>    output_file </span><span>=</span><span> os.path.join(output_folder, </span><span>f</span><span>"</span><span>&#123;</span><span>metadata[</span><span>'title'</span><span>]</span><span>&#125;</span><span>.md"</span><span>)</span></span>
<span class="line"><span>    with</span><span> open</span><span>(output_file, </span><span>"w"</span><span>) </span><span>as</span><span> f:</span></span>
<span class="line"><span>        f.write(header)</span></span>
<span class="line"><span>        for</span><span> bookmark </span><span>in</span><span> bookmarks:</span></span>
<span class="line"><span>            f.write(</span><span>f</span><span>'> </span><span>&#123;</span><span>bookmark[</span><span>"text"</span><span>]</span><span>&#125;</span><span> (page </span><span>&#123;</span><span>bookmark[</span><span>"page"</span><span>]</span><span>&#125;</span><span>)</span><span>&#123;</span><span>newline </span><span>+</span><span> "-"</span><span> if</span><span> bookmark[</span><span>"note"</span><span>] </span><span>else</span><span> ""</span><span>&#125;</span><span> &#123;</span><span>bookmark[</span><span>"note"</span><span>]</span><span>&#125;</span><span> &#92;n&#92;n</span><span>'</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>if</span><span> __name__</span><span> ==</span><span> "__main__"</span><span>:</span></span>
<span class="line"><span>    if</span><span> len</span><span>(sys.argv) </span><span>&#x3C;</span><span> 2</span><span>:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"Usage: python script.py &#x3C;input_file> &#x3C;output_folder: optional>"</span><span>)</span></span>
<span class="line"><span>        sys.exit(</span><span>1</span><span>)</span></span>
<span class="line"><span>    if</span><span> len</span><span>(sys.argv) </span><span>&#x3C;</span><span> 3</span><span>:</span></span>
<span class="line"><span>        input_file </span><span>=</span><span> sys.argv[</span><span>1</span><span>]</span></span>
<span class="line"><span>        output_folder </span><span>=</span><span> os.getcwd()</span></span>
<span class="line"><span>    else</span><span>:</span></span>
<span class="line"><span>        input_file </span><span>=</span><span> sys.argv[</span><span>1</span><span>]</span></span>
<span class="line"><span>        output_folder </span><span>=</span><span> sys.argv[</span><span>2</span><span>]</span></span>
<span class="line"><span>    main(input_file, output_folder)</span></span></code></pre> <h3> <a href="https://koenraijer.com/pocketbook-to-obsidian#usage" target="_self" rel>Usage</a></h3> <p><code>python3 pocketbook_to_md.py input.html path/to/output_folder</code></p>]]></content:encoded>
            <category><![CDATA[Tinkering]]></category>
        </item>
        <item>
            <title><![CDATA[DIY Anki Remote for iPhone]]></title>
            <link>https://koenraijer.com/anki-remote</link>
            <guid isPermaLink="true">https://koenraijer.com/anki-remote</guid>
            <pubDate>Sun, 10 Dec 2023 00:00:00 GMT</pubDate>
            
            <dc:creator><![CDATA[Koen Raijer]]></dc:creator>
            <description><![CDATA[Setting up an Anki Remote using nothing but your iPhone (only for iOS)]]></description>
            <content:encoded><![CDATA[<p>This is a quick tip for those wanting to use Anki while being AFK (away from keyboard). It works for iPhone/Mac and uses the Remote+ app ( <a href="https://apps.apple.com/us/app/remote-mouse-keyboard/id629019487?itsct=apps_box_badge&amp;itscg=30200" target="_blank" rel="nofollow">App Store link<sup>↗</sup></a>), which is free but requires premium functionality, costing €8,- or so for lifetime subscription. For many people, this is likely the superior option to something like the Anki Remote, which costs $36 and does not ship to Europe.</p> <p>The final result should look something like this:
 </p><div><figure><img src="https://koenraijer.com/anki-remote.jpeg" alt="A custom keypad can be used to create buttons for most relevant keys, effectively creating your own, highly customisable Anki remote." title="A custom keypad can be used to create buttons for most relevant keys, effectively creating your own, highly customisable Anki remote."> <figcaption>A custom keypad can be used to create buttons for most relevant keys, effectively creating your own, highly customisable Anki remote.</figcaption></figure></div> <p>To create the Anki remote:</p> <ol><li>Install the Remote+ app and the Mac OS helper program.</li> <li>Open the app, go to the keypad section (press ▶️ in bottom menu).</li> <li>Click the menu button (top right) and then “Create”.</li> <li>Insert 4 buttons, one for each answer option in Anki, and assign them the numbers [1, 2, 3, 4] (or whatever hotkeys you have assigned to them, I believe these are the default).</li> <li>Insert a button at the bottom, assigned to the space key (which reveals answers in Anki). <em>Optional:</em> make the button larger by creating another button and joining them together.</li> <li>Add the Anki icon as its logo by using the Anki app as the source for the icon, or by inserting it from iCloud (assuming you don’t have the iOS app and you have downloaded the logo).</li></ol> <h2> <a href="https://koenraijer.com/anki-remote#background" target="_self" rel>Background</a></h2> <p>Ever since selling my TV, I’ve been using this app to control my PC monitor while sitting on the couch. Combined with a wall mount that turns 180 degrees, it has turned my PC monitor into a multifunctional marvel. At the same time, I’m a fervent Anki user, having reviewed ~20,000 flash cards in 2023. I enjoy combining my flashcard reviews with chores - thinking and doing pair very well - but without a remote of some kind, I had to always walk back to the keyboard to a response. A quick Google search yields the Anki Remote, but that seemed like an overkill. An extra device that requires batteries, that might break, and that I can lose.</p> <p>Hopefully the article is of help!</p>]]></content:encoded>
            <category><![CDATA[Tinkering]]></category>
        </item>
        <item>
            <title><![CDATA[Practical Weight Training Guide]]></title>
            <link>https://koenraijer.com/weight-training</link>
            <guid isPermaLink="true">https://koenraijer.com/weight-training</guid>
            <pubDate>Sun, 06 Aug 2023 00:00:00 GMT</pubDate>
            <atom:updated>2025-02-16T00:00:00.000Z</atom:updated>
            <dc:creator><![CDATA[Koen Raijer]]></dc:creator>
            <description><![CDATA[A flexible and efficient, science-based full-body weight training program for busy people who seek long-term health, based on my own training experience, medical background, and knowledge of scientific literature.]]></description>
            <content:encoded><![CDATA[<p>This is a guide on how to structure your weight training. I’m not sure why I, with all of the stuff that’s already out there, decided to write this. I guess I just wanted to put my own thoughts on paper. I’ve been doing weight training for a good decade now. I started at around 15 years old, and I’m 26 now. New cities, busy schedules, commitments, fun life stuff. And all the while I trained quasi-consistently, usually several times a week. Sometimes once or twice, oftentimes three or four times. I’ve consumed a lot of fitness advice in that time, and I think I’ve internalized most of the good stuff. So, drawing from my experience, I hope this guide helps those who want to take their training seriously while balancing it with work and life commitments. Even if you don’t intend on using this program, think about how you currently manage your physical fitness. Try to seek something that fits neatly with your lifestyle. Don’t go all in on some way-over-the-top program. Instead, pick something reasonable, easy to follow and effective. The best fitness program is the one you keep doing!</p> <h2> <a href="https://koenraijer.com/weight-training#introduction" target="_self" rel>Introduction</a></h2> <p>It can be really hard to sift through all the bullshit in the world of weight training. In fact, there’s a whole market for people saying they have gotten rid of all the bullshit, just for you, and then they sell you <em>their own</em> bullshit. At a discount, if you’re lucky.</p> <p>The thing is: much of the online fitness advice is given by full-time fitness influencers, and it’s geared towards full-time fitness influencers. Work-out 6 times a week <em>every</em> week, never eat anything unhealthy, <del>do roids</del>. Try doing that while balancing <strong>important</strong> things: study, work, kids, friends and family. You won’t be able to stick to it, and frankly, you probably shouldn’t want to (unless you <em>really</em>, <em>really</em> do want to prioritize fitness).</p> <p>What I’ve tried to do is go through my mind and write down the things I do that work. I have tried to be as transparent as I can be about the reasons for doing something.</p> <p>Some general comments on this program:</p> <ul><li>It is catered to my own lifestyle; and I’m <del>studying</del> working and doing lots of stuff other than weight training;</li> <li>It is opinionated, and there’s stuff in here you could disagree with. Take the stuff you <em>do</em> like and use it in your own training.</li> <li>I’m a man, and my exercise choice has been influenced by it. Still, there’s no reason women can’t use it.</li> <li>It assumes you know how to perform the exercises with good technique and assumes you know how to search the internet for help if you don’t.</li> <li>It requires intrinsic motivation to push yourself <em>enough</em>. Be strict and honest about your schedule, the effort you’re putting in, and where your priorities lie.</li></ul> <h2> <a href="https://koenraijer.com/weight-training#core-principles" target="_self" rel>Core Principles</a></h2> <p>I think there are four principle the program adheres to:</p> <ul><li><strong>Flexible</strong>. It must work with every schedule. Skipping a day shouldn’t be disastrous (I’m looking at you bro split). You should be able to plug and play with exercises, switch things up, keep yourself engaged.</li> <li><strong>Simple</strong>. Don’t do weight tracking. If you train more than once every fortnight, you’ll remember what weight you did last time. The exercise selection is limited, with a small selection of high quality exercises to choose from.</li> <li><strong>Efficient</strong>. Don’t be in the gym for hours. Minimize passive resting by doing supersets or accessories. This saves time and helps with cardiovascular fitness as an added bonus.</li> <li><strong>Safe</strong>. The goal is to minimize injury-risk and maximize long-term efficiency. Always a day of recovery, full body workouts, efficient warm-ups, injury prevention, and more.</li></ul> <div><div><span>Long-term efficiency</span></div><div><p>If you don’t get injured, you don’t lose progress. Consistency in the long-term is more important than hitting that rep, or doing that extra set. If it doesn’t feel right, or the technique is failing, <em>stop</em>. That rep is not important in the long-term. Slow and steady wins the race.</p></div></div> <h2> <a href="https://koenraijer.com/weight-training#training-intensity" target="_self" rel>Training intensity</a></h2> <p>Intensity is defined as weight x volume, where volume is sets x repetitions. If I did 3 sets of 12 in squats with 80 kg, the intensity amounts to <span><span><span></span><span><span><span></span><span>80</span><span></span><span>×</span><span></span></span><span><span></span><span>(</span><span>3</span><span></span><span>×</span><span></span></span><span><span></span><span>12</span><span>)</span><span></span><span>=</span><span></span></span><span><span></span><span>2880</span></span></span></span></span>. Basically, it’s the total amount of weight you lift. Keep this value relatively constant over work-outs. No need to calculate it, but be mindful of the work you put in and the way your body reacts. Don’t do two highly taxing squat workouts in close succession. If you’ve done a lot of lower back work, don’t also be going heavy on rows. Common sense stuff.</p> <p>The reason not to be doing this is because you’ll feel lethargic the next day, or feel nauseated after the workout, and that is just not fun. It’s also not sustainable, and it’s risky because your technique will suffer, leaving you vulnerable to injuries.</p> <p>There’s a certain sweet spot where you’re maximizing progress without getting injured. It takes time figuring out where yours is.</p> <h2> <a href="https://koenraijer.com/weight-training#training-frequency" target="_self" rel>Training Frequency</a></h2> <p>There’s a large body of research roughly saying that Muscle Protein Synthesis peaks at 24 hours and declines after 48 hours. This is one of the biggest reasons advocating full-body training, instead of body part splits. After a 2 days, not much is happening anymore in your muscles in terms of progress. If you’re doing the bro split and only train chest on mondays, you’re losing out on a lot of progress. If my schedule allows out, I leave only one day in between workouts.</p> <p>Active recovery is encouraged on rest days. Go do cardio like cycling, walking, running or swimming. Go outside and touch grass, take someone you like with you.</p> <div><div><span>Isn’t training the same muscles several times a week too much?</span></div><div><p>No, because we only do one compound exercise per muscle group, and we vary the rep ranges each session. That’s very different from completely wrecking your pecs on chest day.</p></div></div> <h2> <a href="https://koenraijer.com/weight-training#picking-a-rep-range" target="_self" rel>Picking a rep range</a></h2> <p>Periodization is a systematic way to organize your training variables over time. The traditional method, linear periodization, keeps you in one rep range for weeks before changing. A more dynamic approach, <em>daily undulating periodization</em>, varies your rep ranges between workouts. In practice, this mean you can just switch it up. If you feel like doing a set of 5, go for it. If you want to feel the pump, go for a set of 12. If the effort is there, the outcome is likely to be similar compared to if you had stuck to a certain rep range for weeks on end.</p> <p> </p><div><figure><img src="https://koenraijer.com/reps-per-set.png" alt="General overview of the properties you target with different rep ranges." title="General overview of the properties you target with different rep ranges."> <figcaption>General overview of the properties you target with different rep ranges.</figcaption></figure></div>
Daily undulating periodization makes intuitive sense because different rep ranges target different types of muscle fibers (fast twitch, slow twitch, etc.). If you train for strength on Monday, your muscle fibers optimized for hypertrophy will need less recovery on Wednesday. <h2> <a href="https://koenraijer.com/weight-training#how-hard-should-you-train" target="_self" rel>How hard should you train?</a></h2> <p>This is a very important part of progressing with weight training. You’re there to put in an effort. There won’t be improvement otherwise. Be focussed on the exercise your doing. Pay attention. Mind-muscle connection is real. Have rituals before you go under the squat bar. Be determined to finish the set. But beware, don’t ever go beyond <em>technical failure</em>. Even if it means setting a PR. We’ve all seen the guy doing their final reps on bench press, the guy’s arms are contorted in strange angles, elbows flared out, and the spotter is basically doing barbell curls. Don’t be that guy.</p> <h2> <a href="https://koenraijer.com/weight-training#technique-tips" target="_self" rel>Technique tips</a></h2> <ul><li>Having proper technique is vital for injury prevention and training effectiveness. It’s a continuous learning process. I very often repeat several cues in my head when I do an exercise. I might be thinking “glutes up, big chest” while doing good mornings. Videotape yourself, especially on stuff like squats. Check in with your butt wink now and then!</li> <li>Breathing is important, too. It’s nice to have your breathing sync up with your set. Breathe in, hold, do a rep, breath out.</li> <li>No need to do underhand barbell rows. High risk of bicep tendon tear. Probably, not a hard no-no, but still, be warned (I removed several ‘hard no-no’s’ because they weren’t that hard).</li></ul> <h2> <a href="https://koenraijer.com/weight-training#time-savers" target="_self" rel>Time savers</a></h2> <p><strong>Supersetting</strong>. I really like supersetting multiple muscle groups that don’t interfere with each other. Think pull-ups and dips, curls and tricep extensions, hanging leg raises and leg extensions. Instead of doing nothing for 3 minutes, you do a set of the other exercise. It keeps your heart rate up and helps with cardiovascular fitness, and it feels more athletic, too. And it would literally save 50% of your time if all you did were supersets.</p> <p><strong>Myo-reps</strong>. Did you know that the final reps in a set are most effective? What if you could do final reps more of the time? That’s what myo-reps are for. It’s pretty simple. First you do your regular set, leave no more than 1-2 reps in the tank. Wait 15 seconds, do another set, leaving no more than 1 rep in the tank. Wait 15 seconds again, and repeat. Try and finish and exercise with a set followed by 4 sets of myo-reps and see if you like it. Some suitable exercises: pull-ups, dips, push-ups, biceps and triceps</p> <p><strong>Ladders</strong>. I’ve found ladders to be most suitable for pull-ups, but I’ve used them for other bodyweight exercises like push-ups, too. It works by doing a rep, waiting for a fixed amount of time (I pick something between 10 s and 30 s), then doing two reps, waiting, doing three reps, and so forth, until you fail. That’s one ladder. Now, instead of resting, you wait and immediately start at one rep for then next ladder. I often find myself doing 5 ladders of pull-ups with 15 s rest.</p> <p><strong>Just do abs</strong>. Seriously, there’s always a bar free somewhere. Go do some hanging leg raises while your chest and tris are recovering.</p> <h2> <a href="https://koenraijer.com/weight-training#exercise-choice" target="_self" rel>Exercise choice</a></h2> <p>I’ve compiled a list of exercises organized roughly per muscle group. The list is highly opinionated, and there are more good exercises out there, but if you don’t have a list like this in your head, it’s probably a good place to start.</p> <p>Each full-body training, you’ll pick one exercise from each major muscle group, and as many accessories as you feel like (or have time for).</p> <p>Some thoughts:</p> <ul><li>Alternate horizontal and vertical pulls and pushes between workouts.</li> <li>Train your hamstrings using <em>both</em> straight-legged and knee-bending exercises.</li></ul> <h3> <a href="https://koenraijer.com/weight-training#main-movements" target="_self" rel>Main movements</a></h3> <p>Back (horizontal and vertical pulls)</p> <ul><li>Pull-ups/chin-ups (weighted, regular, rings)</li> <li>Lat pulldown (single-arm, double cable)</li> <li>Pendlay row (barbell)</li> <li>Incline bench row</li></ul> <p>Shoulders and chest (horizontal and vertical pushing):</p> <ul><li>Dips (weighted, regular)</li> <li>Military press (standing, seated)</li> <li>Landmine press (kneeling, standing)</li> <li>Incline dumbbell press</li> <li>Barbell bench press</li></ul> <p>Quadriceps and hip extensors (lower push):</p> <ul><li>Bulgarian split squats</li> <li>Walking dumbbell lunges</li> <li>Barbell back squat</li></ul> <p>Hamstrings and glutes (lower pull):</p> <ul><li>Romanian deadlift (barbell, dumbbells)</li> <li>Good morning (standing, seated)</li> <li>Machine leg curls</li> <li>Back extensions on the Roman chair</li></ul> <p>Abs and core:</p> <ul><li>Hanging leg raises (straight leg, side bends, toe to bar)</li> <li>Cable crunches (don’t be afraid to go heavy)</li></ul> <p>Calves:</p> <ul><li>Cycling</li> <li>Machine calf extension</li> <li>Smith machine calf raises</li></ul> <p>Accessories:</p> <ul><li>Face pulls</li> <li>Rear delt rows</li> <li>Curls (on the seated incline bench, preacher curls, hammer curls)</li> <li>Skull-crushers</li> <li>Cable tricep pushdown</li></ul> <h2> <a href="https://koenraijer.com/weight-training#putting-it-all-together" target="_self" rel>Putting it all together</a></h2> <p>Train every other day for about an hour. Don’t sit around when in between sets; use supersets, myo-reps or ladders to  <a href="https://koenraijer.com/weight-training#time-savers" target="_self" rel>save time</a>. Train hard, until near-failure, but never to technical failure. Pick one  <a href="https://koenraijer.com/weight-training#exercise-choice" target="_self" rel>exercise</a> per major muscle group and 1-2 accessories. Switch up the rep schemes and exercises. Go outside and move on days you don’t train.</p> <h2> <a href="https://koenraijer.com/weight-training#example-programs" target="_self" rel>Example programs</a></h2> <p>These are some example programs I’ve used in the past. I currently use the 2 alternating 30-minute full-body workouts.</p> <h3> <a href="https://koenraijer.com/weight-training#2-alternating-30-minute-full-body-workouts" target="_self" rel>2 alternating 30-minute full-body workouts</a></h3> <p><strong>Workout CQ (chest/quad-focussed):</strong></p> <ol><li>Chin-ups 8-12 reps. → start 2 min. timer</li> <li>Dips 12-15 reps.</li> <li>Chin-ups 8-12 reps. → 4x 15 sec. myoreps</li> <li>Dips 12-15 reps. → 4 x 15 sec. myoreps</li> <li>Squats warming up (no rest): 8x 40 kg; 5x 50 kg → start 1:30 min. timer</li> <li>HLRs 12 reps.</li> <li>Squats 60 kg 10 reps. → start 2 min. timer</li> <li>HLRs 12 reps.</li> <li>Squats 60 kg 10 reps.</li> <li>Lateral raises 8 kg 12-15 reps. → start 1:30 min. timer</li> <li>Lateral raises 8 kg 12-15 reps. → 4x 15 sec. myoreps</li></ol> <p><strong>Workout SH (shoulders/hamstring-focussed):</strong></p> <ol><li>Cable rows 12 reps. → start 2 min. timer</li> <li>Landmine press 12 reps. per side</li> <li>Cable rows 8-12 reps. → 4x 15 sec. myoreps</li> <li>Landmine press 12 reps. per side → 4 x 15 sec. myoreps</li> <li>Good mornings warming up (no rest): 12 reps. with empty bar; 5 reps. with 40 kg → start 1:30 min. timer</li> <li>HLRs 12 reps.</li> <li>Good mornings 50 kg 10 reps. → start 2 min. timer</li> <li>HLRs 12 reps.</li> <li>Good mornings 50 kg 10 reps.</li> <li>Skullcrushers warming up (no rest): 5 reps. with 5 kg per side; 5 reps. with 7.5 kg per side.</li> <li>2x: Incline DB curls 12 reps. with 12 kg. → skullcrushers 12 reps. with 10 kg per side</li></ol> <h3> <a href="https://koenraijer.com/weight-training#1-hour-full-body-ab" target="_self" rel>1-hour full-body A/B</a></h3> <p><strong>A:</strong></p> <ol><li>Handstand practice</li> <li>Weighted pull ups: 3 sets of 6-10 reps</li> <li>Pike push ups: 3 sets of 8-12 reps</li> <li>Barbell lunges: 3 sets of 10-12 reps</li> <li>Superset:
<ol><li>Bodyweight rows: 3 sets of 10-12 reps</li> <li>Push-ups: 3 sets of 15-20 reps</li></ol></li></ol> <p><strong>B:</strong></p> <ol><li>Handstand practice</li> <li>Superset:
<ol><li>Pull ups</li> <li>RDLs / Good mornings</li></ol></li> <li>Superset:
<ol><li>Weighted dips</li> <li>Hanging leg raises</li></ol></li> <li>Superset:
<ol><li>Face pulls</li> <li>Lateral raises</li></ol></li> <li>Core compression routine</li></ol> <h3> <a href="https://koenraijer.com/weight-training#4-day-upper-lower-split" target="_self" rel>4-day upper-lower split</a></h3> <p><strong>Upper 1</strong></p> <ul><li>Weighted pull-ups</li> <li>Weighted dips</li> <li>Barbell rows</li> <li>Shoulder press</li> <li>Abs</li> <li>Accessory</li></ul> <p><strong>Lower 1</strong></p> <ul><li>Leg press</li> <li>Good mornings</li> <li>Hamstring curls</li> <li>Leg extensions</li> <li>Calves</li></ul> <p><strong>Upper 2</strong></p> <ul><li>Pull up pyramid (20s)</li> <li>Bench press</li> <li>Cable rows</li> <li>Shoulder press</li> <li>Abs</li> <li>Accessory</li></ul> <p><strong>Lower 2</strong></p> <ul><li>Squats</li> <li>RDLs</li> <li>Leg extensions</li> <li>Hamstring curls</li> <li>Calves</li> <li>Abs</li></ul> <h2> <a href="https://koenraijer.com/weight-training#a-final-word-of-advice" target="_self" rel>A final word of advice</a></h2> <p>It’s impossible to stick to your program <em>all of the time</em>. There will be times, perhaps weeks on end, where you’re unmotivated. That’s normal. You haven’t lost your gains. Just go back and pick up where you left off. It’s not a major failure, nor a character flaw, and it’s definitely not a reason to stop. Stopping and starting is part of working out.</p> <p>Of course, weight training is in constant tension with a fulfilling social and family life, good sleep, a healthy diet, a fulfilling career. It’s a constant act of considering the trade-offs and balancing it all.</p>]]></content:encoded>
            <category><![CDATA[Health]]></category>
        </item>
        <item>
            <title><![CDATA[Zotero-Obsidian Quick Copy]]></title>
            <link>https://koenraijer.com/zotero-obsidian-quick-copy</link>
            <guid isPermaLink="true">https://koenraijer.com/zotero-obsidian-quick-copy</guid>
            <pubDate>Sat, 31 Dec 2022 00:00:00 GMT</pubDate>
            
            <dc:creator><![CDATA[Koen Raijer]]></dc:creator>
            <description><![CDATA[External translator to improve integration between Obsidian and Zotero.]]></description>
            <content:encoded><![CDATA[<p>This piece of code allows you to create an Obsidian link which links directly to a reference inside Zotero, simply by dragging the reference into a note. If you’re processing research or simply want to reference a study in one of your notes, this is is helpful in speeding up the process.</p> <p><figure><div><video playsinline loop title="Video showing the Zotero-Obsidian Quick Copy in action."><source src="https://koenraijer.com/zotero-obsidian.m4v" type="video/mp4"><track></video> <button> </button></div> <figcaption>Video showing the Zotero-Obsidian Quick Copy in action.</figcaption></figure></p> <p><strong>Note:</strong> the code was adapted from another external translator made by Florian Wessling, which can be found  <a href="https://gist.githubusercontent.com/ColdDevil/9992718/raw/71c385e68866fd55490f13c729156ae916eee12c/zotselect-link_full.js" target="_blank" rel="nofollow">here<sup>↗</sup></a>.</p> <p>Some other resources for writing Zotero translators:</p> <ul><li> <a href="https://www.zotero.org/support/dev/translators/coding" target="_blank" rel="nofollow">dev:translators:coding [Zotero Documentation]<sup>↗</sup></a></li> <li> <a href="https://www.zotero.org/support/dev/translators/functions" target="_blank" rel="nofollow">dev:translators:functions [Zotero Documentation]<sup>↗</sup></a></li> <li> <a href="https://www.zotero.org/support/kb/item_types_and_fields" target="_blank" rel="nofollow">kb:item types and fields [Zotero Documentation]<sup>↗</sup></a></li></ul> <p>Save the code as a <code>.js</code> file at <code>/Users/YOURNAME/Zotero/translators</code>.</p> <pre><code><span class="line"><span>&#123;</span></span>
<span class="line"><span>    "translatorID"</span><span>:</span><span>"f1ff9f87-3531-4db2-8cbc-7025872812f5"</span><span>,</span></span>
<span class="line"><span>    "translatorType"</span><span>:</span><span>2</span><span>,</span></span>
<span class="line"><span>    "label"</span><span>:</span><span>"Zotero-Obsidian Quick Copy"</span><span>,</span></span>
<span class="line"><span>    "creator"</span><span>:</span><span>"Koen Raijer"</span><span>,</span></span>
<span class="line"><span>    "target"</span><span>:</span><span>"txt"</span><span>,</span></span>
<span class="line"><span>    "minVersion"</span><span>:</span><span>"2.0"</span><span>,</span></span>
<span class="line"><span>    "maxVersion"</span><span>:</span><span>""</span><span>,</span></span>
<span class="line"><span>    "priority"</span><span>:</span><span>200</span><span>,</span></span>
<span class="line"><span>    "inRepository"</span><span>:</span><span>false</span><span>,</span></span>
<span class="line"><span>    "displayOptions"</span><span>:&#123;</span><span>"exportCharset"</span><span>:</span><span>"UTF-8"</span><span>&#125;,</span></span>
<span class="line"><span>    "lastUpdated"</span><span>:</span><span>"2022-12-26 12:23:32"</span></span>
<span class="line"><span>    &#125;</span></span>
<span class="line"></span>
<span class="line"><span>    // Save at: /Users/YOURNAME/Zotero/translators</span></span>
<span class="line"></span>
<span class="line"><span>    function</span><span> doExport</span><span>() &#123;</span></span>
<span class="line"><span>        var</span><span> output </span><span>=</span><span> ""</span><span>;</span></span>
<span class="line"></span>
<span class="line"><span>        var</span><span> item;</span></span>
<span class="line"><span>        while</span><span>(item </span><span>=</span><span> Zotero.</span><span>nextItem</span><span>()) &#123;</span></span>
<span class="line"><span>            // title and link</span></span>
<span class="line"><span>            var</span><span> selectLink </span><span>=</span><span> "zotero://select/items/"</span><span>;</span></span>
<span class="line"><span>            var</span><span> library_id </span><span>=</span><span> item.libraryID </span><span>?</span><span> item.libraryID </span><span>:</span><span> 0</span><span>;</span></span>
<span class="line"><span>            selectLink </span><span>+=</span><span> library_id </span><span>+</span><span> "_"</span><span> +</span><span> item.key;</span></span>
<span class="line"><span>            // output += "&#x26;quot;&#x3C;a href="" + selectLink + "">" + item.title + "&#x3C;/a>&#x26;quot;"; // &#x26;ldquo; &#x26;rdquo;</span></span>
<span class="line"></span>
<span class="line"><span>            var</span><span> addition </span><span>=</span><span> ""</span><span>;</span></span>
<span class="line"></span>
<span class="line"><span>            // authors</span></span>
<span class="line"><span>            var</span><span> author </span><span>=</span><span> ""</span><span>;</span></span>
<span class="line"><span>            if</span><span> (item.creators </span><span>!==</span><span> undefined</span><span>) &#123;</span></span>
<span class="line"><span>                for</span><span> (</span><span>var</span><span> a </span><span>=</span><span> 0</span><span>; a </span><span>&#x3C;</span><span> 1</span><span>; a</span><span>++</span><span>) &#123;</span></span>
<span class="line"><span>                    if</span><span> (item.creators[a][</span><span>"creatorType"</span><span>] </span><span>==</span><span> "author"</span><span>) &#123;</span></span>
<span class="line"><span>                        author </span><span>+=</span><span> item.creators[a][</span><span>"lastName"</span><span>]; </span><span>// + ", " + item.creators[a]["firstName"];</span></span>
<span class="line"><span>                    &#125;</span></span>
<span class="line"><span>                &#125;</span></span>
<span class="line"><span>                addition </span><span>+=</span><span> author;</span></span>
<span class="line"><span>            &#125; </span><span>else</span><span> &#123;</span></span>
<span class="line"><span>                addition </span><span>+=</span><span> "noauthor"</span></span>
<span class="line"><span>            &#125;</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span>            // date</span></span>
<span class="line"><span>            if</span><span> (item.date </span><span>!==</span><span> undefined</span><span> &#x26;&#x26;</span><span> item.date.</span><span>length</span><span> ></span><span> 0</span><span>) &#123;</span></span>
<span class="line"><span>                addition </span><span>+=</span><span> ", "</span><span> +</span><span> item.date.</span><span>substring</span><span>(</span><span>0</span><span>,</span><span>4</span><span>);</span></span>
<span class="line"><span>            &#125; </span><span>else</span><span> &#123;</span></span>
<span class="line"><span>                addition </span><span>+=</span><span> ", nodate"</span><span>;</span></span>
<span class="line"><span>            &#125;</span></span>
<span class="line"></span>
<span class="line"><span>            if</span><span> (addition.</span><span>length</span><span> ></span><span> 0</span><span>) &#123;</span></span>
<span class="line"><span>                output </span><span>+=</span><span> "(["</span><span> +</span><span> addition </span><span>+</span><span> "]("</span><span> +</span><span> selectLink </span><span>+</span><span> "))"</span><span>;</span></span>
<span class="line"><span>            &#125; </span><span>else</span><span> &#123;</span></span>
<span class="line"><span>                output </span><span>+=</span><span> "([zotlink]("</span><span> +</span><span> selectLink </span><span>+</span><span> ")"</span><span>;</span></span>
<span class="line"><span>            &#125;</span></span>
<span class="line"></span>
<span class="line"><span>            Zotero.</span><span>debug</span><span>(item);</span></span>
<span class="line"><span>        &#125;</span></span>
<span class="line"></span>
<span class="line"><span>        Zotero.</span><span>write</span><span>(output);</span></span>
<span class="line"><span>&#125;</span></span></code></pre> <p> <a href="https://raw.githubusercontent.com/koenraijer/Zotero-Obsidian-Quick-Copy/main/Zotero-Obsidian-Quick-Copy" target="_blank" rel="nofollow">Link to Github<sup>↗</sup></a></p>]]></content:encoded>
            <category><![CDATA[Tinkering]]></category>
        </item>
        <item>
            <title><![CDATA[Three Months in a South African Public Hospital]]></title>
            <link>https://koenraijer.com/south-africa</link>
            <guid isPermaLink="true">https://koenraijer.com/south-africa</guid>
            <pubDate>Mon, 14 Nov 2022 00:00:00 GMT</pubDate>
            
            <dc:creator><![CDATA[Koen Raijer]]></dc:creator>
            <description><![CDATA[I spent three months working in a rural hospital in Limpopo, the poorest province of South Africa.]]></description>
            <content:encoded><![CDATA[<p>I spent three months doing an elective rotation, working in a rural hospital in Limpopo, the poorest province of South Africa. It has been so many things to me: fascinating, humbling, beautiful, relaxing; but also depressing, tough and humbling.</p> <p>The beautiful part: I got to live on a farm on a game reserve with all kinds of non-deadly animals like giraffes, zebras, wildebeests and impalas roaming around freely. On our first day, our host welcomed us with a bowl of homegrown passion fruits, and told us we could pick fresh veggies and fruits from the garden if we needed any. On my twilight runs it was not uncommon for a giraffe to be staring at me while the sun set behind the northern Drakensberg mountains. It was nice and warm, and we had a beautiful garden with a swimming pool. On the weekends, we would drive into Kruger for safari, or into the mountains for stunning hikes past canyons, waterfalls and wild rivers. I spent the last two weeks solo in a hostel in Cape Town, exploring its beautiful mountains and coastal regions.</p> <p>This is in stark contrast to the hospital we worked it, which is understaffed, under resourced; as well as troubled by litigation, work refusal, and bureaucracy.</p> <p>At some point, two weeks in, we ran out of all syringes but the 2 ml ones. Now, 2 ml of blood is just enough to fill two tubes of blood. If you need more than that, you have to place an iv cannula and let the blood drip from the iv tubing into the blood tubes. Instead of a syringe, you’re also wasting tubing and an iv cannula for someone who doesn’t need. Besides, there’s way more exposure to contaminated material. Similarly, we ran out of non-sterile gloves many times, leading us to use a pack of sterile gloves every time. The X-ray machine broke in my second week and did not get fixed for the rest of my time there. That means everyone who came after 1 o’ clock, which is when the last patient transport left for X-rays at another hospital, would need to wait until the next day. An “urgent” CT scan took at least a week. That means we couldn’t treat someone with a suspected stroke because we had no way of knowing whether the patient had a brain bleed or an ischemic stroke. An ischemic stroke is when a blood clot prevents blood from carrying oxygen to the brain cells.</p> <p>The hospital’s clinical manager estimated that <strong>half</strong> of the hospital budget was spent on lawsuits. That percentage has been climbing steadily for years. The destructive cycle is obvious: the more money spent on lawsuits, the less money spent on healthcare, the worse healthcare gets. How does that happen? Well, a good example is the filing system. When a patient has an appointment at the hospital, they will fetch their medical file in the morning, and wait until the file ends up on the doctor’s desk. This can take hours, so patients end up taking their files home to save time. That’s illegal, so the hospital gets fined 75,000 ZAR for every file they lose. Lawyers know this, so they will request a bunch of files, and then sue if the file is not there. A visible consequence of this were the broken windows and the defunct air-conditioning. A direct result of the 2000 ZAR (100 euros) annual hospital maintenance budget. Generally, things looked and felt like they were about to break. Most patients’ would be shivering in their beds, their main complaint always being the cold.</p> <p>Now, before getting into work refusal, a little background on the way rural hospitals get staffed. After medical school, South African doctors have two years of compulsory but paid internships, where they work in all specialties. Then they do their community service, where they are placed in a rural public hospital to work for one year. These doctors carried the majority of the work load in my hospital. Aside from them, there are also medical officers, MOs for short. They have permanent contracts and in theory, they are responsible for their departments. In practice, many of them show up at 9:30 and leave by 11:00 on a given day. One time, a nurse entered our room asking where doctor so-and-so went. A patient complained because the doctor left the room without saying where they went two hours ago. They didn’t come back for the rest of the day.</p> <p>This is infuriating, and that doctor is a piece of trash from my point of view. At the same time, it’s hard to say what twenty years in that hospital would do to <em>my</em> morale. Regardless, it increases the workload on the community service doctors, who are already burdened beyond their skillset because there is no supervision. The hospital has no medical specialists, so the community service doctors do most of the surgeries, including the anesthesia. As if that’s not enough, the referral system is so clogged that you can’t really refer patients to more specialized hospitals. That means they have to take care of very complex patients for which they don’t have the expertise. This inevitably leads to mistakes. I have seen them be troubled by such mistakes, and the burnout rates among them are high. It’s an unfair load they shouldn’t have to carry.</p> <p>Lastly, a ridiculous example of how bureaucracy is causing deaths every day. At some point, my colleague took part in a resuscitation, and she asked where she could get an AED. “There’s no AED”, the doctor responded. Later, we learned there were plenty of AEDs in the hospital. They were brand new and donated by some philantrope about a year ago. To this day, they have been locked away in some storage room, because someone has not signed them off.</p> <p>I cannot even begin to untangle the complexities that shape modern South Africa. The remnants of Apartheid, which only ended in 1994 when Nelson Mandela became president, are present everywhere. I don’t have the knowledge to place these anecdotes in the right context, but I know they are inseparable from it. My visit to the Apartheid museum and my stay in this country has led me to think a great deal about the privileges I have and I am grateful for that, with a tinge of guilt.</p> <p>My stay has taught me many things, notably the taste of impala testicle and how to change a tire. I have grown tremendously and I have returned more relaxed and more self-reliant. I have also learned that I may not be the person to live and work abroad, far away from my family and friends. I’m not too good at keeping in touch so I need those people near me. In addition, I was admitted to a master’s program in data science earlier this year 🎉. I remember programming a simple stock calculator in Python during COVID. I did that out of sheer boredom and look where it took me. So I put med school on hold until may and I have dived into this new adventure in Tilburg. Currently, I am engulfed by a challenging course on computational statistics, very different and very exciting!!</p>]]></content:encoded>
            <category><![CDATA[Personal]]></category>
            <category><![CDATA[Psychiatry & psychology]]></category>
        </item>
        <item>
            <title><![CDATA[Motivational Interviewing]]></title>
            <link>https://koenraijer.com/motivational-interviewing</link>
            <guid isPermaLink="true">https://koenraijer.com/motivational-interviewing</guid>
            <pubDate>Wed, 06 Apr 2022 00:00:00 GMT</pubDate>
            <atom:updated>2026-02-09T00:00:00.000Z</atom:updated>
            <dc:creator><![CDATA[Koen Raijer]]></dc:creator>
            <description><![CDATA[A brief guide to creating sustainable behavioral change.]]></description>
            <content:encoded><![CDATA[<p>Want your patient to shake a drug habit, stick to a diet, or muster the courage to finally make that change? Or perhaps you’re a manager, and your employee is at risk for dismissal. How do you create sustainable behaviour change?</p> <p>You could tell them why you think they should change, and then ask them to do so. This approach will often <em>appear</em> succesful. People say they agree to change, but will often fall back into old habits. That’s because they’re not convinced of change <em>themselves</em>. External motivation is not enough for sustainable change.</p> <p>The key to sustainable behavior change is to find that small, ambivalent spark in someone’s heart that knows they should change, and turn that into a raging fire. Motivational Interviewing helps you do that.<span><button><sup> <a href="https://koenraijer.com/motivational-interviewing#fn-1" target="_self" rel>1</a></sup></button><span><span>1<span></span></span><span>Miller, W. R., &amp; Rollnick, S. (2013). Motivational interviewing: Helping people change. Guilford press.</span><span><span></span><span>↖</span></span></span></span></p> <h2> <a href="https://koenraijer.com/motivational-interviewing#what-is-motivational-interviewing" target="_self" rel>What is Motivational Interviewing?</a></h2> <p>Motivational Interviewing is a counseling method developed by Miller &amp; Rodnick, two clinical psychologists, in 1983. It promotes collaboration not confrontation, and aims to evoke someone’s own thoughts and ideas, instead of imposing your perspective on them. It emphasizes autonomy, and empowers people to take responsibility for their own actions.</p> <h2> <a href="https://koenraijer.com/motivational-interviewing#key-principles" target="_self" rel>Key principles</a></h2> <p>Motivational interviewing defines four key principles:</p> <ol><li>Express empathy by trying to see the world as they see it.</li> <li>Support self-efficacy by highlighting previous successes and strengths they already have.</li> <li>Roll with resistance, avoid confrontation and prevent arguments. Dance with them, rather than wrestle.</li> <li>Develop discrepancy between the current situation and their values and goals.</li></ol> <h2> <a href="https://koenraijer.com/motivational-interviewing#strategies" target="_self" rel>Strategies</a></h2> <p>To achieve those four principles, it lists four key strategies.</p> <ol><li>Open ended questions</li> <li><em>Affirmations</em> help reframe behavior and concerns as positive qualities.</li> <li><em>Reflections</em> help express empathy and develop discrepancy by strategically mentioning information.</li> <li><em>Summaries</em> do the same thing, while also providing a way to structure a conversation and prevent resistance.</li></ol> <p>The strategies can be remembered using the acronym <em>OARS</em>.</p> <h2> <a href="https://koenraijer.com/motivational-interviewing#change-talk" target="_self" rel>Change talk</a></h2> <p>A central skill in motivational interviewing is <em>listening for signs of change talk</em>. These are subtle signs that indicate a willingness to change. They are divided into <em>preparatory signs</em> and <em>signs of implementation</em>.</p> <h3> <a href="https://koenraijer.com/motivational-interviewing#preparatory-signs" target="_self" rel>Preparatory signs</a></h3> <ul><li>Desire. I want to change.</li> <li>Ability. I can change.</li> <li>Reason. It’s important to change.</li> <li>Need. I should change.</li></ul> <h3> <a href="https://koenraijer.com/motivational-interviewing#signs-of-implementation" target="_self" rel>Signs of implementation</a></h3> <ul><li>Commitment. I will make changes.</li> <li>Activation. I am ready to change.</li> <li>Taking steps. I am taking specific actions to change.</li></ul> <p>The signs of change talk can be remembered using the acronym <em>DARN-CAT</em>.</p> <h2> <a href="https://koenraijer.com/motivational-interviewing#open-ended-questions-you-can-steal" target="_self" rel>Open-ended questions you can steal</a></h2> <p>The whole point of motivational interviewing is to <strong>elicit change talk</strong>.
To do so, you must ask questions to which the answer is likely to be change talk.</p> <p>Then, you elaborate:</p> <ul><li>“In what ways?”</li> <li>“Tell me more?”</li> <li>“What does that look like?”</li> <li>“When was the last time that happened?”</li></ul> <p>Other questions are about developing discrepancy between where they are now and where they want to be:</p> <ul><li>“What are the pros and cons of staying the same? And what are the pros and cons of changing?”</li> <li>“What are the good things and the not so good things of <em>target behavior?</em>”</li> <li>“How were things better or different before the target behavior emerged?”</li> <li>“If you were 100% successful in making the changes you want, what would be different?”</li> <li>“What are the worst things that might happen if you don’t make this change?”
<ul><li>“What are the best things that might happen if you do make this change?”</li></ul></li></ul> <p>Yet other questions try to make behavior more <em>intentional</em> and <em>goal-directed</em>:</p> <ul><li>“How would you like your life to be five years from now?”</li> <li>“On a scale from 1 to 10, how important is it to you to change the <em>target behavior</em>?
<ul><li>Why are you at <code>__</code> and not at <code>__</code> (a lower number than stated)?</li> <li>What might happen that you could move to __ (a higher number)?”</li></ul></li> <li>“What are your goals and values?” (consider using a card sort activity)
<ul><li>“How does continuing to do <em>target behavior</em> fit in with your goals and values?”</li></ul></li></ul> <div><hr><h6>Bibliography &amp; Footnotes</h6> <ol><li>Miller, W. R., &amp; Rollnick, S. (2013). Motivational interviewing: Helping people change. Guilford press. <a href="https://koenraijer.com/motivational-interviewing#fnref-1" target="_self" rel>↩</a></li></ol></div>]]></content:encoded>
            <category><![CDATA[Psychiatry & psychology]]></category>
        </item>
        <item>
            <title><![CDATA[Zijn alle zwarte scenario's gelijk?]]></title>
            <link>https://koenraijer.com/zwarte-scenario</link>
            <guid isPermaLink="true">https://koenraijer.com/zwarte-scenario</guid>
            <pubDate>Mon, 29 Mar 2021 00:00:00 GMT</pubDate>
            
            <dc:creator><![CDATA[Koen Raijer]]></dc:creator>
            <description><![CDATA[Door maatregelen om de ziekenhuiszorg te ontlasten stroomt de jeugd-ggz over, terwijl ic’s bij absolute schaarste voorrang geven aan kinderen. Die eenzijdige focus op ic-bezetting is onrechtvaardig.]]></description>
            <content:encoded><![CDATA[<div><div><span>Originele artikel op Medisch Contact</span></div><div><p>Dit bericht werd oorspronkelijk gepubliceerd als ingezonden reactie op Medisch Contact. Het bericht is  <a href="https://www.medischcontact.nl/opinie/reacties/ingezonden-reactie/zijn-alle-zwarte-scenarios-gelijk" target="_blank" rel="nofollow">hier<sup>↗</sup></a> te lezen.</p></div></div> <p>Door maatregelen om de ziekenhuiszorg te ontlasten stroomt de jeugd-ggz over, terwijl ic’s bij absolute schaarste voorrang geven aan kinderen. Die eenzijdige focus op ic-bezetting is onrechtvaardig.</p> <p>Met een gemiddelde bezetting van 86 procent op crisisafdelingen, kun je de situatie in de jeugd-ggz met recht een zwart scenario noemen <span><button><sup> <a href="https://koenraijer.com/zwarte-scenario#fn-1" target="_self" rel>1</a></sup></button>.<span><span>1<span></span></span><span> <a href="https://koenraijer.com/archive/210310-Rapport-uitvraag-acute-jeugd-ggz-DEF1.pdf" target="_self" rel>De Nederlandse ggz, 10-03-2021. Publieksrapportage uitvraag acute jeugd-ggz (PDF)<sup>PDF</sup></a></span><span><span></span><span>↖</span></span></span></span> Dit structurele probleem is het afgelopen jaar door aanhoudende coronamaatregelen in een stroomversnelling beland. Een uitgebreid drieluik dat in NRC is verschenen, schetst treffend de pijnlijke situaties die daardoor is ontstaan <span><button><sup> <a href="https://koenraijer.com/zwarte-scenario#fn-2" target="_self" rel>2</a></sup></button>.<span><span>2<span></span></span><span> <a href="https://www.nrc.nl/nieuws/2021/03/23/de-laatste-plek-is-s-ochtends-al-vergeven-a4036983" target="_blank" rel="nofollow">Van der Poel, R. (2021, 23 maart). ‘Bij de ggz-spoedpoli is voor de lunch de laatste plek al vergeven’. NRC<sup>↗</sup></a></span><span><span></span><span>↖</span></span></span></span></p> <p>Tegelijkertijd nemen we al meer dan een jaar ingrijpende maatregelen om de ziekenhuiszorg te ontlasten. We willen immers niet in het zwarte scenario belanden. Mocht dat onverhoopt wel gebeuren, dan is er het Draaiboek Triage op basis van niet-medische criteria <span><button><sup> <a href="https://koenraijer.com/zwarte-scenario#fn-3" target="_self" rel>3</a></sup></button>.<span><span>3<span></span></span><span> <a href="https://koenraijer.com/archive/draaiboek-triage-op-basis-van-niet-medische-overwegingen-voor-ic-opname-ten-tijde-van-fase-3-in-de-covid-19-pandemie.pdf" target="_self" rel>Draaiboek triage op basis van niet-medische criteria.<sup>PDF</sup></a></span><span><span></span><span>↖</span></span></span></span> Bij een gebrek aan ic-bedden, waarbij geen duidelijk verschil in overlevingskans is tussen patiënten, krijgt de jongere patiënt de voorkeur. Daarbij baseert men zich op het <em>fair innings</em>-argument: mensen moeten de kans krijgen om zoveel mogelijk levensfases te doorlopen – een idee dat breed wordt gedragen in de medische gemeenschap. Totdat de klacht psychisch van aard is.</p> <p>Want terwijl we bij de voordeur een streng deurbeleid voeren, stroomt de zorg via de achterdeur over. Maar het ene zwarte scenario is het andere niet, zou je kunnen stellen. Er is namelijk een eenduidiger verband tussen ic-capaciteit en sterfte, dan tussen ggz-capaciteit en sterfte. Toch is de manier waarop we beide belangen nu wegen, niet in de geest van het <em>fair innings</em>-argument. Daar kunnen we op twee manieren veranderen. Voeg de bezetting in de ggz toe aan het coronadashboard, en neem een vertegenwoordiger van de ggz op in het OMT. Zorg is immers meer dan ziekenhuiszorg.</p> <div><hr><h6>Bibliography &amp; Footnotes</h6> <ol><li> <a href="https://koenraijer.com/archive/210310-Rapport-uitvraag-acute-jeugd-ggz-DEF1.pdf" target="_self" rel>De Nederlandse ggz, 10-03-2021. Publieksrapportage uitvraag acute jeugd-ggz (PDF)<sup>PDF</sup></a> <a href="https://koenraijer.com/zwarte-scenario#fnref-1" target="_self" rel>↩</a></li> <li> <a href="https://www.nrc.nl/nieuws/2021/03/23/de-laatste-plek-is-s-ochtends-al-vergeven-a4036983" target="_blank" rel="nofollow">Van der Poel, R. (2021, 23 maart). ‘Bij de ggz-spoedpoli is voor de lunch de laatste plek al vergeven’. NRC<sup>↗</sup></a> <a href="https://koenraijer.com/zwarte-scenario#fnref-2" target="_self" rel>↩</a></li> <li> <a href="https://koenraijer.com/archive/draaiboek-triage-op-basis-van-niet-medische-overwegingen-voor-ic-opname-ten-tijde-van-fase-3-in-de-covid-19-pandemie.pdf" target="_self" rel>Draaiboek triage op basis van niet-medische criteria.<sup>PDF</sup></a> <a href="https://koenraijer.com/zwarte-scenario#fnref-3" target="_self" rel>↩</a></li></ol></div>]]></content:encoded>
            <category><![CDATA[Dutch]]></category>
        </item>
</channel>
</rss>