{"version":"https:\/\/jsonfeed.org\/version\/1.1","description":"Thoughts and opinions of a teenager from the Netherlands.","title":"Robin's Blog","items":[{"id":"https:\/\/geheimesite.nl\/blog\/ai-education","title":"AI in educational contexts","url":"https:\/\/geheimesite.nl\/blog\/ai-education","content_html":"<div><section class=\"box\">\n  <p>This is my argumentative essay for the writing assignment of 6VWO. Although I&#8217;ve already written about this topic <a href=\"https:\/\/geheimesite.nl\/blog\/gpt\">at<\/a> <a href=\"https:\/\/geheimesite.nl\/blog\/gpt-again\">length<\/a> on this blog, I wanted to upload this anyway. I&#8217;m proud, and I think it also introduces some fresh perspectives.<\/p>\n  <p>Anyway, enjoy!<\/p>\n<\/section>\n<p>A little more than two years ago, ChatGPT was released to the general public (Schulman et al., 2022). Since then, the chatbot has skyrocketed in popularity, being particularly popular among students. In the U.S., 26% of teens aged 13 to 17 use it for their schoolwork, as reported by Sidoti et al. (2025). Furthermore, according to a survey conducted among the students and personnel of Utrecht University, 80% of students have tried the chatbot at least once, with 31% of students reporting they use it several times a week (Hesselink, 2024). The introduction and rapid growth of this new technology raises questions regarding its ethics and use in educational contexts. The use of generative AI in high school should be banned entirely, as it is unreliable, untrustworthy and forms a severe threat for the development of cognitive abilities.<\/p>\n<p>Foremost, generative AI is unreliable and biased. Contrary to popular belief, ChatGPT does not search for information on the web for you. The technology underpinning the chatbot is GPT (short for Generative Pretrained Transformer), a large autoregressive language model (LLM). Language models like these function by predicting the likelihood of a word occurring, given the preceding context of its training data and the prompt written by the user (Bender et al., 2021). This is comparable to the autocomplete widely available on iPhone keyboards, but on a much larger scale. This means that inherently, output generated by a language model cannot be trusted to be factually correct, as they are only &#8220;haphazardly stitching together sequences of linguistic forms, according to probabilistic information on how they combine.&#8221; (Bender et al., 2021). In essence, all a language model does is guess the &#8216;correct&#8217; answer to a question based on probabilities observed in its training data. This also means chatbots like ChatGPT are unable to properly credit sources. Furthermore, models such as GPT are trained on vast datasets derived from the web. The size of these datasets enables them to fluently construct sentences, but also causes numerous &#8220;stereotypical and derogatory associations along gender, race, ethnicity, and disability status&#8221; (Bender et al., 2021) to be hardwired into the model, as the models are trained on unfiltered data including hate speech, fake news and other misinformation. Thus, output generated by these models is both unreliable and biased and should therefore not be used in educational contexts.<\/p>\n<p>Moreover, the use of chatbots capable of generating entire high school essays forms a severe threat to the development of cognitive abilities. According to Klimova (2012), writing is vital in the development of a range of cognitive functions, as it teaches students to plan ahead, set objectives and think of structure. It trains critical thinking by analyzing sources for their credibility. It forces you to think clearly and synthesize your thoughts into meaningful writing. Furthermore, writing also practices other important language skills, like listening, reading and speaking (Klimova, 2012). If generative AI were more widely adopted in schools, this would pose a great risk to the acquisition of writing skills, and thereby the development of these crucial cognitive abilities.<\/p>\n<p>One could argue that by utilizing language models on a smaller scale, it could have a profoundly positive effect on the development of writing skills. For example, they could be used as a tool to paraphrase sentences, easily find synonyms or help tidy up the structure of an essay. Certainly, using generative AI as a\u00a0writing tool, similar to how we already use dictionaries and spell check for writing and calculators for mathematics, could be a great way to implement the use of language models at school. However, this would assume that students have the discipline to use generative AI as a tool, rather than a cheat code. To illustrate this, we could look at a different demographic. According to the survey previously mentioned, around 19% of teachers at Utrecht University utilize ChatGPT for creating teaching materials, and a staggering 7% use it in their grading (Hesselink, 2024). As explained, language models like GPT function by probabilistic principles (Bender et al., 2021) and therefore, by definition, cannot logically reason. This makes them completely unfit for grading students. Furthermore, teaching materials should be of high quality, as students see them as an objective source of truth; biased and unreliable output has no place in that. University teachers should be capable of recognizing the downsides of using advanced text prediction algorithms to grade their students or generate teaching materials, yet they are apparently unable to make the right call. If university teachers choose short-term benefits over quality, we cannot reasonably expect high school students to make a disciplined decision regarding this technology.<\/p>\n<p>In conclusion, language models underpinning chatbots like ChatGPT are based on text prediction algorithms that generate text based on probabilistic principles. This means output generated by generative AI is unreliable, cannot cite sources, and cannot be guaranteed to be factually correct. Encoded misinformation from the web makes these models biased. Furthermore, using language models as a cheat code poses a severe threat to the development of cognitive abilities. And while the impact of language models on the development of writing skills could be profoundly positive when utilized as a tool, we cannot expect students to make that disciplined decision. Therefore, the use of generative AI in educational settings such as high school should be completely banned.<\/p>\n<footer>\n  <h2 class=\"refs\">Reference list<\/h2>\n  \n<p>\nBender, E. M., Gebru, T., McMillan-Major, A., &amp; Shmitchell, S.\n(2021). On the dangers of stochastic parrots: Can language models be too\nbig? <i>Proceedings of the 2021 ACM Conference on Fairness,\nAccountability, and Transparency<\/i>, 610\u2013623. <a\nhref=\"https:\/\/doi.org\/10.1145\/3442188.3445922\">https:\/\/doi.org\/10.1145\/3442188.3445922<\/a>\n<\/p>\n<p>\nHesselink, I. (2024, April 15). <i>Nearly four in ten students use\nChatGPT often<\/i>. <a\nhref=\"https:\/\/dub.uu.nl\/en\/news\/nearly-four-ten-students-use-chatgpt-often\">https:\/\/dub.uu.nl\/en\/news\/nearly-four-ten-students-use-chatgpt-often<\/a>\n<\/p>\n<p>\nKlimova, B. F. (2021). The importance of writing. <i>Paripex-Indian\nJournal of Research<\/i>, <i>2<\/i>(1), 9\u201311. <a\nhref=\"https:\/\/doi.org\/10.15373\/22501991\/JAN2013\/4\">https:\/\/doi.org\/10.15373\/22501991\/JAN2013\/4<\/a>\n<\/p>\n<p>\nSchulman, J., Zoph, B., Kim, C., Hilton, J., Menick, J., Weng, J., &amp;\nHesse, C. (2022, November 20). <i>Introducing ChatGPT<\/i>. <a\nhref=\"https:\/\/openai.com\/index\/chatgpt\">https:\/\/openai.com\/index\/chatgpt<\/a>\n(<a href=\"OpenAI\">archived<\/a>)\n<\/p>\n<p>\nSidoti, O., Park, E., &amp; Gottfried, J. (2025, January 21). <i>About\na quarter of <span>U.S.<\/span> Teens have used <span>ChatGPT<\/span> for\nschoolwork \u2013 double the share in 2023<\/i>. <a\nhref=\"https:\/\/www.pewresearch.org\/short-reads\/2025\/01\/15\/about-a-quarter-of-us-teens-have-used-chatgpt-for-schoolwork-double-the-share-in-2023\/\">https:\/\/www.pewresearch.org\/short-reads\/2025\/01\/15\/about-a-quarter-of-us-teens-have-used-chatgpt-for-schoolwork-double-the-share-in-2023\/<\/a>\n<\/p>\n\n<\/footer><\/div>","date_published":"2025-03-19T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/gpt-once-more","title":"Disconnect in the Education System","url":"https:\/\/geheimesite.nl\/blog\/gpt-once-more","content_html":"<div><p>I think the rising popularity of ChatGPT for writing reports and &#8216;research&#8217; logs raises questions about the methods used in our education system. Students en masse are resorting to AI tools to generate them, because frankly, writing reports is tedious, repetitive, and uninspiring; it completely drains the fun out of any course. And I seriously doubt teachers enjoy marking them either. The widespread use of LLMs for these kinds of assignments may not be the problem that needs to be fixed. It might just be a symptom of a larger issue with our education system: an obsession with measurable progress and attaining results.<\/p>\n<p>There is a deeper disconnect here\u2013. These kinds of assignments fail to truly engage students to think about the subject, and focus on a measurable result instead. Furthermore, they completely drain all the fun out of the course. There is no room for creativity, exploration, and curiosity. We forgot that learning can be fun. No wonder students would rather have a computer do it.<\/p><\/div>","date_published":"2024-11-13T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/gpt-again","title":"Generative AI as a writing tool","url":"https:\/\/geheimesite.nl\/blog\/gpt-again","content_html":"<div><section class=\"box\">\n<p>This post is a revised version of <a href=\"https:\/\/geheimesite.nl\/blog\/gpt\"><cite>The role of generative AI in writing<\/cite><\/a>. However, since writing it, <a href=\"https:\/\/geheimesite.nl\/blog\/ai-education\">I might have kinda maybe sortof changed my mind<\/a>.<\/p>\n<p>Ehh, people change \u00af\\_(\u30c4)\\_\/\u00af<\/p>\n<\/section>\n<p>A little more than two years ago, ChatGPT was officially launched. With it, the general public finally got access to OpenAI&#8217;s brand new GPT-3 model that had been in development for the preceding years. The technology underpinning the model is GPT, a kind of neural network trained on textual patterns and capable of reproducing them with high accuracy. Basically, your iPhone&#8217;s keyboard autocomplete on steroids. What followed was a cycle in which many LLMs were trained and refined in rapid succession by the giants from Silicon Valley.<\/p>\n<p>At the time of writing, GPT-4o is the latest and greatest model available, and the website is particularly popular among students, who utilize it for writing assignments in high school and college. As a tool. Or, <em>realistically<\/em>, letting it generate the entire essay for them.<\/p>\n<p>This has many teachers rightfully concerned. Because&#8212;<em>surprise!<\/em>&#8212; those assignments are not merely meant as a means of bullying students. They are, in fact, vital practice for developing writing skills. Turns out, that if a computer does all the hard work <em>for you<\/em>, making homework isn&#8217;t nearly as effective as it could be in developing those skills. So really, by using ChatGPT or similar LLM-based tools to do your work for you, you&#8217;re denying yourself a chance to improve your writing.<\/p>\n<p>Schools have therefore decided that &#8216;AI bad&#8217;. Since its introduction in 2022, I&#8217;ve repeatedly heard teachers call for a complete ban on using the technology, calling it plagiarism and fraud. However, like everything, the matter is more nuanced than a binary &#8216;good&#8217; or &#8216;bad&#8217;. As an example, let&#8217;s imagine a hammer. It can be used to construct things, or, on the other hand, it can also be used as a weapon of destruction. The effect of a technology is defined by its use.<\/p>\n<p>About that: LLMs are&#8212;mistakenly&#8212;mainly used to generate text. I&#8217;ve eerily quickly developed an eye for AI-generated prose; it&#8217;s mediocre, dull, repetitive, and overly academic and formal. Moreover, despite numerous attempts to prevent it, models <em>still<\/em> hallucinate fairly often.<\/p>\n<p>Hallucination is a behavior exhibited by generative AI models when they run out of tokens or encounter prompts not covered by their training data. In these situations, the model cannot accurately predict the next word (remember, it&#8217;s autocomplete on steroids). Instead, they just <em>make something up<\/em> that sounds plausible. This means that nothing generated by these models can be trusted to be factually correct.<\/p>\n<p>Instead, generative AI is way more powerful as a tool to manipulate and transform language. As Linus wrote a while back:<\/p>\n<blockquote cite=\"https:\/\/thesephist.com\/posts\/latent\/\">\n  <p>\n    Not &#8220;computers can complete text prompts, now what?&#8221; but\n    &#8220;computers can understand language, now what?&#8221;\n  <\/p>\n<\/blockquote>\n<p>The AI models are unable to understand what they are writing about. They are only selecting words that sound plausible given the context of their training data and the prompt. They cannot reason, they cannot search for information, and they cannot solve complex problems. But they do know language. That&#8217;s where their strength lies. Not the ability to generate okay-sounding high school essays, but their ability to understand and transform language. Use it to your advantage.<\/p>\n<p>Instead of prompting &#8220;generate an argumentative essay on the role of religion in public schools&#8221;, we should prompt things like &#8220;rewrite this paragraph to be more academic&#8221; or &#8220;can you show me alternatives to this sentence?&#8221;<\/p>\n<p>I cannot stress this enough. <em>Generative AI is not a source<\/em>. It&#8217;s a tool to manipulate language. It&#8217;s not a tool to look up information, and never will be. A neural network can, by definition, never return the sources from which it got certain information. Never.<\/p>\n<p>However, even if we were to completely ban the use of generative AI at school, enforcing a ban like that will prove harder and harder the further models like GPT evolve. Detection software of any kind is always flaky; prone to false positives and negatives. Besides, it probably won&#8217;t restrain students from using models like them, be it in more sneaky ways. The only possible scenario will be a cat-and-mouse game where the AI and detection software will both become increasingly better at fooling one another.<\/p>\n<p>With every upcoming technology, there is a period where society readjusts to its introduction; rules and customs may need to be changed, and things will need to settle into a new normal. We do not have a time machine, we cannot <em>uninvent<\/em> large autoregressive language models. The technology exists now; either fight it or embrace it.<\/p>\n<p>Therefore, I propose we teach AI literacy in high school and college. Teach students about the risks and benefits of using generative models as a writing tool. Not a cheat code. Not a search engine. A writing tool.<\/p>\n<p>Handing in work not written by you is plagiarism. You still have to write yourself. However, using an LLM for checking grammar, paraphrasing sentences, reordering paragraphs, finding the right words and unblocking you creatively is not cheating. For some people, language is a huge barrier to getting their ideas down on paper. If a tool can help them do that more effectively, the use of that tool should be encouraged, not banned. In short, you do the thinking, and the computer helps you with the stylistics. It&#8217;s not unlike other tools we&#8217;re already using, such as spellcheck, dictionaries, calculators, translators and the thesaurus.<\/p>\n<p>ChatGPT and similar models are not a threat to writing. Instead, they are merely new tools that can&#8212;if utilized correctly&#8212;further improve our writing. Use them wisely.<\/p>\n<p><small>*this post was written by me, but edited and <a href=\"https:\/\/languagetool.org\">checked for grammar mistakes<\/a> using AI.<\/small><\/p><\/div>","date_published":"2024-11-12T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/dream-browser","title":"The Next Stage of the Web Browser","url":"https:\/\/geheimesite.nl\/blog\/dream-browser","content_html":"<div><p>In his post <a href=\"https:\/\/bandukwala.me\/on-compositional-window-management\/\"><cite>On compositional window management<\/cite><\/a> Alexander Bandukwala explores ways in which window managers could be improved. I can&#8217;t help but draw parallels to modern web browsers. Applications reimplement the window managers due to the limited feature set. Websites reimplement the web browser in the same way.<\/p>\n<p><a href=\"https:\/\/geheimesite.nl\/blog\/web-sdk\">I complained<\/a> in the past, that I want the browser to be <em>just a document reader<\/em>. But let&#8217;s face it; it&#8217;s not. It&#8217;s really just an SDK. But even for an SDK, it&#8217;s pretty bad.<\/p>\n<p>Websites keep reimplementing the browser using JS, because the browser <em>sucks<\/em>. Despite all their fancy advertising and redesigns, browser haven&#8217;t really evolved for the last decade. Yea, they&#8217;ve implemented a bunch more ridiculous Javascript APIs, but what real added value do they provide to the end-user?<\/p>\n<p>Here&#8217;s some things I&#8217;d want in my browser:<\/p>\n<ul>\n<li>\n<p>You know all those cookie popups everywhere? What if they were just part of the browser? Currently, every website is allowed to save cookies by default. There&#8217;s nothing preventing a website from saving cookies anyway when you tap the tiny &#8220;no&#8221; button. What if we reverse that? Whenever a website tries to save cookies, the browser displays a standard popup with a clear &#8220;no&#8221; button that actually <em>denies the cookies<\/em>.<\/p>\n<\/li>\n<li>\n<p>You know how websites have those complicated menus? Yea, what if my browser just scraped their <code>sitemap.xml<\/code> and compiled a convient index of the site for me?<\/p>\n<\/li>\n<li>\n<p>And while we&#8217;re at it, why not render a table of contents for every page? You know, those things Wikipedia and numerous other sites are now inserting into their HTML, because our document readers&#8212;oh sorry, I meant universal SDKs&#8212;still don&#8217;t have this feature?<\/p>\n<\/li>\n<li>\n<p>You know how links you&#8217;ve already visited turn purple (unless the website overrides it). What if we would indicate the target location of the link in a similar way? Links to other pages on the same site would stay as-is, but outgoing links would get some kind of extra indication. Also, it would be nice to know the page size of the target page upfront, especially on metered connections.<\/p>\n<\/li>\n<li>\n<p>Also <a href=\"https:\/\/geheimesite.nl\/blog\/hotfox\">bringing back RSS discovery and subscriptions<\/a> <em>properly<\/em> would be pretty nice!<\/p>\n<\/li>\n<li>\n<p>Having publishing built into the browser would truly democratize the Web. Instead of the convoluted form-based UIs we could have a simple HTML editor builtin that could publish using <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Methods\/PUT\">HTTP PUT<\/a> if the target server supports it.<\/p>\n<\/li>\n<li>\n<p>Imagine if supporting writers and other creative people was built-in to the Web? A browser-native button to send the author of the page\/media element a few bucks would allow creators to passively earn money by creating cool stuff. Maybe we could put <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Status\/402\">HTTP 402<\/a> <i>Payment Required<\/i> to good use?<\/p>\n<\/li>\n<li>\n<p>And finally, how about actually useful building blocks for applications, instead of this JS+form madness we have now? The idea of building up the interface using a markup language such as HTML or XML is very good, but what if we could also utilize OS-native components in our designs?<\/p>\n<\/li>\n<\/ul>\n<p>Could somebody at Google or Mozilla maybe pretty please make (some of) this reality? \/hj<\/p><\/div>","date_published":"2024-05-31T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/surf-dont-search","title":"Surf, don't search","url":"https:\/\/geheimesite.nl\/blog\/surf-dont-search","content_html":"<div><p>You&#8217;re using the internet wrong. That&#8217;s quite a statement, isn&#8217;t it?<\/p>\n<!--\n  A few months ago, I introduced my sister to [RSS](\/rss).\n  She seemed to like the idea, but she kept asking one question, over\n  and over. \"How do I find things to follow?\"\n\n  Excellent question! How *do* you find interesting things on the\n  Web? The anwser? Browse it; follow links; surf around.\n-->\n<p>The power of the Web is its hyperlinked nature. It&#8217;s a <em>web<\/em>, not just a repository. Yet we&#8217;re increasingly <em>searching<\/em> everything on monolithic search engines like Google. That&#8217;s bad. For one, it limits you to a very small portion of the Web&#8212;and it&#8217;s not <a href=\"https:\/\/geheimesite.nl\/blog\/love-hate\">the best part either<\/a>.<\/p>\n<p>But also: our brain works by association:<\/p>\n<blockquote cite=\"https:\/\/thesephist.com\/posts\/nav\/\">\n  <p>\n    When I get stuck on a really hard problem, whether it&#8217;s some\n    impossible bug in my code or my sofa not fitting through my front\n    door on moving day, I close my eyes and \u2026 think really hard.\n    Somewhere behind my shut eyelids and confused eyeballs, things are\n    happening. Electricity is flowing through the vat of brain-stuff and\n    spindly wires that somehow make up my thought process, and for a few\n    seconds, they just kind of do their thing. Until, if I&#8217;m lucky, an\n    answer pops into my head a few moments later.\n  <\/p>\n  <p>\n    One of my favorite questions to ponder these days has been: when I&#8217;m\n    thinking or remembering, just in that moment when my eyes are closed\n    and I&#8217;m sending all that extra energy to my brain, what&#8217;s really\n    happening? There are no hard drives to spin into place in my brain.\n    What&#8217;s taking up all that time? It&#8217;s easy to wave your hands and say\n    \u201cit&#8217;s just computing\u201d or whatever, the way you expect slow computers\n    under load to be. But often when I&#8217;m heads-down thinking, I&#8217;m not\n    crunching numbers or solving logic puzzles in my head. I&#8217;m not\n    really sure what I&#8217;m doing, but it usually feels like just staring\n    into the void and hoping for some idea to pop into my mind.\n  <\/p>\n  <blockquote cite=\"https:\/\/theatlantic.com\/magazine\/archive\/1945\/07\/as-we-may-think\/303881\/\">\n    <p>\n      The human mind [&#8230;] operates by association. With one item in its\n      grasp, it snaps instantly to the next that is suggested by the\n      association of thoughts, in accordance with some intricate web of\n      trails carried by the cells of the brain. It has other\n      characteristics, of course; trails that are not frequently\n      followed are prone to fade, items are not fully permanent, memory\n      is transitory. Yet the speed of action, the intricacy of trails,\n      the detail of mental pictures, is awe-inspiring beyond all else in\n      nature.\n    <\/p>\n  <\/blockquote>\n  <p>\n    If we imagine the repository of ideas and memories in a mind as a\n    kind of tangled web of ideas, \u201cthinking\u201d definitely involves\n    traversing and scrambling across this web somehow, with some intent.\n    The more obvious, trivial thoughts are the associations that are\n    immediate and close by, and the more insightful thoughts may be\n    jumps between ideas that are only loosely connected, or only\n    connected by second- or third-degree leaps in association.\n  <\/p>\n<\/blockquote>\n<p>The most valuable aspect of the Web is the ability to travese sources in this way. By using a search bar you&#8217;re missing this crucial aspect of the Web.<\/p><\/div>","date_published":"2024-05-29T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/web-sdk","title":"The Web is the everything protocol","url":"https:\/\/geheimesite.nl\/blog\/web-sdk","content_html":"<div><p>I love building websites; I also <a href=\"https:\/\/geheimesite.nl\/blog\/love-hate\">hate the Web.<\/a><\/p>\n<p>I like the concept of the Web: interlinked documents with optional embedded media. Just pages of text with images and videos here and there. Think books but with interactive elements. The Web was meant to be that: a great document reader.<\/p>\n<p>Yet we&#8217;re increasingly treating it as an SDK of some sort. A Universal Application Development ToolKit. Further and further emulating native applications using JavaScript APIs.<\/p>\n<p>Just look at the ridiculous scope of these Javascript APIs: WebBattery, WebBluetooth, WebGamepad, WebVibration, WebVR, WebMIDI, WebUSB, WebDRM, and WebXR. What&#8217;s all this <em>stuff<\/em> needed for? Yea, it makes sense for a Universal Application Development ToolKit, but it&#8217;s absolutely absurd to implement in a document reader:<\/p>\n<blockquote cite=\"https:\/\/geminiprotocol.net\/docs\/faq.gmi#15-what-kind-of-timeless-user-experience\">\n  <p>\n    [On gemini there&#8217;s] absolutely no question of accidentally ending up\n    [on] a shady [website] which starts using your computer to mine\n    cryptocurrency for somebody else, because what kind of insane person\n    would design document reading software where that&#8217;s a thing that\n    could possibly happen under any circumstances?\n  <\/p>\n<\/blockquote>\n<p>The Web platform is so insanely overscoped, that it&#8217;s difficult to even begin to understand:<\/p>\n<blockquote cite=\"https:\/\/drewdevault.com\/2020\/03\/18\/Reckless-limitless-scope.html\">\n  <p>\n    The total word count of the W3C specification catalogue is 114\n    million words at the time of writing. If you added the combined word\n    counts of the C11, C++17, UEFI, USB 3.2, and POSIX specifications,\n    all 8,754 published RFCs, and the combined word counts of everything\n    on Wikipedia&#8217;s list of longest novels, you would be 12 million words\n    short of the W3C specifications.\n  <\/p>\n  <p>Web browsers are responsible for more than 8,000 CVEs.<\/p>\n<\/blockquote>\n<p>It&#8217;s easy to see why it played out like this. Nowadays, every computer has a Web browser, which means a web app has perfect cross-platform compatibility at virtually no cost.<\/p>\n<p>Worse, the Web browser is becoming <a href=\"https:\/\/blog.cjeller.site\/browser-as-os\">a standalone OS of its own<\/a>. Google&#8217;s literally made their browser their OS&#8212;and it worked! To end users, the browser <em>is<\/em> the OS. It&#8217;s the first thing they open when starting their computer. What little &#8220;desktop&#8221; applications they install are often built with Electron, which is just running a browser engine without the browser <abbr title=\"Chrome is an alternative term for UI\">chrome<\/abbr>.<\/p>\n<p>Yet again, it&#8217;s not remarkable that it played out like this:<\/p>\n<blockquote cite=\"https:\/\/developers.slashdot.org\/story\/18\/12\/09\/0941247\/electron-and-the-decline-of-native-apps\">\n  <p>\n    To paraphrase Churchill, Electron is the worst architecture for\n    desktop applications, except for all the other ones that have been\n    tried.\n  <\/p>\n<\/blockquote>\n<p>My problem with the Web is that it&#8217;s trying to be two very different things&#8212;and failing at both:<\/p>\n<ul>\n<li>\n<p>An <abbr title=\"Software Development Toolkit\">SDK<\/abbr>, a platform for developing and shipping applications. Javascript is an absolutely <a href=\"https:\/\/jsfuck.com\">horrible<\/a> <a href=\"https:\/\/old.reddit.com\/r\/AskProgramming\/comments\/lwc3gj\/why_a_lot_of_software_engineers_say_javascript_is\/\">language<\/a>. For many advanced applications, the JS bundle is so big&#8212;looking at you, Google Earth, that the poor Chromebooks at school straight up crash; the only way to bring them back to life is a hard reboot. Furthermore, <a href=\"https:\/\/kryogenix.org\/code\/browser\/everyonehasjs.html\">not everyone can run Javascript<\/a>. So far for compatibility.<\/p>\n<\/li>\n<li>\n<p>A good document reader&#8212;don&#8217;t tell me you think <a href=\"https:\/\/geheimesite.nl\/blog\/love-hate\">this nightmare fuel<\/a> is decent.<\/p>\n<\/li>\n<\/ul>\n<p>The Web tries to be everything. It&#8217;s a shopping centre, a workplace, a cafe, a chatroom, a game engine. I just want it to be a good document reader.<\/p>\n<p>Building a single all-encompassing standard&#8212;an everything protocol&#8212;was a mistake.<\/p>\n<p>We have standalone protocols for those things, you know. We have FTP and network shares for file sharing, IRC and XMPP for chatting, SMTP and DMARC for email, and RSS for syndicating creative work to audiences.<\/p>\n<p>And if we don&#8217;t have protocols for the things the Web is trying&#8212;and failing&#8212;to do, maybe, just maybe, we should build them.<\/p><\/div>","date_published":"2024-05-27T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/love-hate","title":"love, hate","url":"https:\/\/geheimesite.nl\/blog\/love-hate","content_html":"<div><p>This lyric from Olivia O&#8217;Brien&#8217;s song <cite>hate u love u<\/cite> summarizes my relationship with the Web almost perfectly:<\/p>\n<blockquote cite=\"https:\/\/open.spotify.com\/track\/6ATgDc6e4sPn84hvJsAmPt\">\n  <p>\n    I hate you, I love you<br>\n    I hate that I love you\n  <\/p>\n  <p>\n    Don&#8217;t want to, but I can&#8217;t put<br>\n    nobody else above you\n  <\/p>\n<\/blockquote>\n<p>Cause, as a developer, I l\u00f3ve the Web. The web browser is a blank canvas that can be used to build virtually anything. HTML, CSS, Javascript&#8212;the languages used to build websites&#8212;are easy to grasp but at the same time extremely powerful and versatile. There are APIs for literally anything I&#8217;d want to build. And unlike low-level languages such as C and Rust, a website doesn&#8217;t make me to deal with a complicated toolchain; I don&#8217;t need to think about complex cross-compilation, memory allocation, dynamic linkers or glibc. I simply upload my HTML files to my server using <code>rsync<\/code>, and it automagically Just Works\u2122.<\/p>\n<p>However, as a consumer, I absolutely detest the Web. It feels like it&#8217;s turned from a wild, collaborative, global creative space into something akin to a shopping mall. It&#8217;s just <a href=\"https:\/\/how-i-experience-web-today.com\">straight up depressing<\/a>.<\/p>\n<p>Everyone&#8217;s talking about <em>monetization<\/em><sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/love-hate#fn-1\" id=\"fnref-1\" data-footnote-ref>1<\/a><\/sup>, <em>growth hacking<\/em>, <em>ad-revenue<\/em>. Everywhere I go, I&#8217;m met with pages full of plausible sounding AI-generated SEO-optimized nonsense. I get asked to accept these <em>delicious<\/em> cookies, to sign up for the newsletter, and to create a (<em>free!!<\/em>) account. Also: <em>this content is better in the app<\/em>! And we&#8217;re <em>announcing our next-gen AI-powered blockchain startup, check it out!<\/em> All while some completely unrelated video starts autoplaying in the background. And that&#8217;s without even talking about the ads.<\/p>\n<p>These websites are not built for you <em>to read<\/em>, they are designed for <em>extracting value from your visit<\/em>. Desperately trying to squeeze every last drop of data out of you, before youinevitably close the tab.<\/p>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p>Note about monetization: It&#8217;s not that I think creative people shouldn&#8217;t be fairly compensated. Of course they should. But this isn&#8217;t about them. This is about a cultural shift that turns the Web into a business platform. If you make something&#8212;art, music, film&#8212;and put it online for others to see, but also request to be compensated for your work, that&#8217;s totally fair. But what we&#8217;re seeing now is companies hijacking the Web, replacing genuine people writing making real things, with SEO-optimized clickbait meant to make money quick. <a href=\"https:\/\/geheimesite.nl\/blog\/love-hate#fnref-1\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"1\" aria-label=\"Back to reference 1\">\u21a9<\/a><\/p>\n<\/li>\n<\/ol>\n<\/section><\/div>","date_published":"2024-05-26T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/rss-club","title":"The RSS Club","url":"https:\/\/geheimesite.nl\/blog\/rss-club","content_html":"<div><p>I&#8217;m setting up RSS-only posts on my site, inspired by Dave Rupert&#8217;s <a href=\"https:\/\/daverupert.com\/rss-club\/\">RSS Club<\/a>, a &#8216;secret society&#8217; consisting of individuals that publish some of their posts exlusively using the ancient peer-to-peer syndication protocol named <a href=\"https:\/\/geheimesite.nl\/rss\">RSS<\/a>.<\/p>\n<p>If you&#8217;re reading this, you&#8217;ve probably found this post via my RSS feed. Congratulations, you&#8217;re considered a regular reader, and thus rewarded with extra postings now and then.<\/p>\n<p>Of course, RSS-only postings can still be directly accessed if you know the URL. But they&#8217;ll be unlisted on the index and in post archives. Public, but somewhat hidden. An open secret, if you will.<\/p>\n<p>As with any club, there are some rules:<\/p>\n<blockquote href=\"https:\/\/daverupert.com\/rss-club\/\">\n  <ul>\n    <li>1st rule of RSS Club is &#8220;Don&#8217;t Talk About RSS Club&#8221;<\/li>\n    <li>2nd rule of RSS Club is &#8220;Don&#8217;t Share on Social Media&#8221;<\/li>\n    <li>3rd rule of RSS Club is &#8220;Provide Value&#8221;<\/li>\n  <\/ul>\n  <p>Don&#8217;t talk about it. Let people find it. Make it worthwhile.<\/p>\n<\/blockquote>\n<p>RSS-only postings will generally consist of loose ideas, short updates and more personal posts. Things that I&#8217;d like to share, but not put &#8220;out there&#8221;. Lil&#8217; easter eggs for RSS enthousiasts.<\/p><\/div>","date_published":"2024-05-26T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/darlings","title":"Darlings","url":"https:\/\/geheimesite.nl\/blog\/darlings","content_html":"<div><p>The saying goes &#8220;kill your darlings&#8221;. When I have trouble fitting my writing into a cohesive whole, it&#8217;s often because I&#8217;ve tangled up multiple concepts or ideas; essentially trying&#8212;and failing&#8212;to create a coherent two out of two, although related, separate concepts&#8212;leaving them both underdeveloped.<\/p>\n<p>In those moments the best solution is to split up my text, to provide each idea the space and care it deserves.<\/p>\n<p>So maybe don&#8217;t kill the poor things. Just <em>viciously<\/em> pull them apart.<\/p><\/div>","date_published":"2024-05-25T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/challenge-accepted","title":"Challenge accepted","url":"https:\/\/geheimesite.nl\/blog\/challenge-accepted","content_html":"<div><p>A while back, I read <a href=\"https:\/\/gilest.org\/indie-easy.html\"><cite>Let&#8217;s make the indie web easier<\/cite><\/a>, and it really resonated with me.<\/p>\n<blockquote cite=\"https:\/\/gilest.org\/indie-easy.html\">\n  <p>OK, developers, I have a challenge for you.<\/p>\n  <p>\n    I&#8217;ll assume that we&#8217;re all on board with the 2024 indie web revival.\n    We all want things to get weird again, right? Yeah.\n  <\/p>\n  <p>\n    And, I&#8217;ll assume we all agree that owning your own website is a good\n    thing, and we all want more people to do it.\n  <\/p>\n  <p>\n    But here&#8217;s the thing: we need more tools for it. We need simpler\n    tools for it. And we need to make installing and using them\n    trivially simple.\n  <\/p>\n  <p>We need a whole galaxy of options.<\/p>\n  <p>\n    So that next time we say to someone: \u201cYou should own your own\n    domain, and publish on your own website,\u201d and they answer with\n    \u201cHow?\u201d, we can give an answer that&#8217;s more than just: \u201cInstall\n    Wordpress.\u201d\n  <\/p>\n  <p>\n    If we want the future web we&#8217;re all clamouring for, we need to give\n    people more options for self-hosted independence. If we seriously,\n    truly want the independent, non-enshittified personal web to\n    flourish, we need to make it easier for people to join in.\n  <\/p>\n  <p>\n    Why not build static website generators that people can just unzip,\n    upload to the shared hosting they&#8217;ve just paid for, and start using\n    via a browser?\n  <\/p>\n<\/blockquote>\n<p>Challenge accepted!<\/p>\n<p>I&#8217;m building a successor to <a href=\"https:\/\/micro.geheimesite.nl\">neopub<\/a>, my microblogging platform. It&#8217;s still in early development, but things are going great so far. It&#8217;s loosely based on the original source code of neopub&#8212;which is why its repo is hosted under the neopub namespace&#8212;, but has been rewritten from the ground up.<\/p>\n<p>Here&#8217;s the idea:<\/p>\n<p>A single-person microblogging platform written in PHP8, built on open standards. It supports <a href=\"https:\/\/microformats.org\">microformats2<\/a>, <a href=\"https:\/\/w3.org\/TR\/micropub\">micropub<\/a>, <a href=\"https:\/\/w3.org\/TR\/webmention\/\">Webmention<\/a>, pingback, various feeds, <a href=\"https:\/\/w3.org\/TR\/activitypub\/\">ActivityPub<\/a> and <a href=\"https:\/\/openheart.fyi\">OpenHeart<\/a>, along with <a href=\"https:\/\/personal-web.org\">@mentions<\/a>, which I <a href=\"https:\/\/geheimesite.nl\/mentions\">recently implemented on this site<\/a> as well. There&#8217;s going to be a very basic web interface for writing posts and uploading images. Additionally, there will also be a CLI&#8212;I&#8217;m gonna be using it myself, after all.<\/p>\n<p>To circle back to @giles&#8217;s post, I&#8217;m designing this thing to \u2728 just work \u2728, Out Of The Box\u2122. Because <a href=\"https:\/\/geheimesite.nl\/defaults\">defaults matter<\/a>. People aren&#8217;t going to bother figuring out how to setup some obscure plugin to enable some weird protocol they&#8217;ve never heard of&#8212;but they might just like it when their site automagically federates with various social media platforms and pulls in comments from each one.<\/p>\n<p>And to reemphasize his point: <em>installing this thing should be trivially simple<\/em>. It should be as simple as creating an account on Bluesky. Cause if it&#8217;s not, what&#8217;s stopping people from just switching to another content silo?\n<small>(I&#8217;m using the <a href=\"https:\/\/geheimesite.nl\/blog\/stupid-terminology\">c-word<\/a> on purpose. These corporations don&#8217;t care what you post, as long as they can make money off of it.)<\/small><\/p>\n<p>Since the platform is written in PHP, it should work on virtually all shared hosting, provided they have an up-to-date PHP installation. Installing should be as simple as drag and dropping some PHP files over FTP. To reduce friction even more, I&#8217;m using JSON files instead of an SQL database, as setting up and connecting an SQL database is often a mayor roadblock in installing a CMS, for a casual person.<\/p>\n<p>I&#8217;m also thinking about creating some sort of hosted application that integrates with a bunch of common registrars, which would guide newcomers through getting a domain name, picking a hosting plan and uploading said PHP files. Pick a domain name, pick a registrar, pick a plan, and have the service handle the rest for you.<\/p>\n<p>Anyhow.<\/p>\n<p>So far, I&#8217;ve implemented Webmention (both sending and receiving), micropub (with a media endpoint), pingback (using  <a href=\"https:\/\/webmention.io\">Webmention.io<\/a> to forward pingbacks as webmentions), and RSS, Atom, JSON feeds. However, I&#8217;m still trying to figure out how the actual fuck ActivityPub works, and the frontend is nowhere near finished.<\/p>\n<p><a href=\"https:\/\/git.dupunkto.org\/~dupunkto\/pubb\">Here&#8217;s the prototype, if you&#8217;re curious<\/a>. It doesn&#8217;t have a name yet, tho. Any suggestions?<\/p><\/div>","date_published":"2024-04-23T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/mentions","title":"@mentions","url":"https:\/\/geheimesite.nl\/blog\/mentions","content_html":"<div><p>I&#8217;ve implemented <em>@mentions<\/em> on my site, inspired by <a href=\"https:\/\/devastatia.com\">@devastatia<\/a>&#8217;s site. This allows me to tag fellow Webmasters when I write something referring to their work, hopefully starting interesting conversations.<\/p><\/div>","date_published":"2024-04-09T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/predictive-policing","title":"Predictive policing","url":"https:\/\/geheimesite.nl\/blog\/predictive-policing","content_html":"<div><p>Last week we were reading an article about predictive policing at school. These are my two cents.<\/p>\n<blockquote>\n<p>In an era of tight budgets, police departments accross the country are being asked to do more with less. To address this problem, law-enforcement agencies are increasingly turning to data and analytics to improve their ability to fight crime without substantial increase in operating cost. Known as predictive policing, these technologies and techniques empower police officers to take a more proactive approach to both preventing crime and solving open cases.<\/p>\n<p>[T]he trend toward evidence-based [predictive] policing should ultimately enhance the relationship between communities and police officers. <strong>That&#8217;s because data-driven decision making is a step away from decisions based on biases that can result in unfair discrimination.<\/strong><\/p>\n<\/blockquote>\n<p>Allow me to disagree. In computer science there&#8217;s a principle of <a href=\"https:\/\/en.wikipedia.org\/wiki\/GIGO\">&#8216;garbage in, garbage out&#8217;<\/a>:<\/p>\n<blockquote cite=\"https:\/\/en.wikipedia.org\/wiki\/GIGO\">\n  <p>\n    GIGO is the concept that flawed, biased or poor quality (&#8220;garbage&#8221;)\n    information or input produces a similar result or output.\n  <\/p>\n<\/blockquote>\n<p>Your predictive policing algorithm may be objective, but the data it&#8217;s being trained on almost certainly isn&#8217;t. So you&#8217;ve actually made it worse: decisions made by such an algorithm are as biased as decisions made by humans, but with the illusion of objectivity. You haven&#8217;t eliminated bias; you&#8217;ve now institutionalised it.<\/p>\n<details>\n  <summary>Extras<\/summary>\n  <blockquote>\n    <p>\n      The use of data, like the use of any tool, leaves openings for\n      misuse. There&#8217;s a big difference, for example, between predicting\n      where crime is most likely to occur and\n      <strong>\n        developing a list of potential future offenders without probable\n        cause,\n      <\/strong>\n      a practice that certainly raises serious ethical and legal\n      concerns.\n    <\/p>\n  <\/blockquote>\n  <p>\n    Just let me get this straight. You&#8217;re talking about creating a list\n    of suspects for <em>crimes not yet committed<\/em>. What happened to\n    the principle of &#8216;innocent until proven guilty&#8217;?\n  <\/p>\n  <p>\n    While the article mentions <em>the possibility<\/em> of misuse of\n    data for less ethical causes like this, it unfortunately doesn&#8217;t\n    explain how it&#8217;s gonna <em>prevent<\/em> data being used for these\n    purposes \u00af\\_(\u30c4)\\_\/\u00af\n  <\/p>\n<\/details><\/div>","date_published":"2024-03-30T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/0x10c","title":"Interactive end-user programming in 0x10c","url":"https:\/\/geheimesite.nl\/blog\/0x10c","content_html":"<div><p>It has been a few years since I learned about <a href=\"https:\/\/yewtu.be\/watch?v=O1aCbbeFN7E\">0x10<sup>c<\/sup><\/a> (pronounced &#8220;ten to the c&#8221;) in a documentary about Notch, the creator of Minecraft. It&#8217;s the game he built after he stepped down from his role as lead developer of Minecraft&#8212;Minecraft&#8217;s unfinished sequel.<\/p>\n<p>0x10<sup>c<\/sup> was supposed to be a space-themed sandbox game. It takes place around 281,474,976,710,656 AD, which is (you guessed it) 0x10<sup>c<\/sup> in hexidecimal notation. The game&#8217;s backstory, as told by Notch on the blog, was this:<\/p>\n<blockquote>\n<p>In a parallel universe where the space race never ended, space travel was gaining popularity amongst corporations and rich individuals.<\/p>\n<p>In 1988, a brand new deep sleep cell was released, compatible with all popular 16 bit computers. Unfortunately, it used big endian, whereas the DCPU-16 specifications called for little endian. This led to a severe bug in the included drivers, causing a requested sleep of 0x0000 0000 0000 0001 years to last for 0x0001 0000 0000 0000 years.<\/p>\n<p>It&#8217;s now the year 281 474 976 712 644 AD, and the first lost people are starting to wake up to a universe on the brink of extinction, with all remote galaxies forever lost to red shift, star formation long since ended, and massive black holes dominating the galaxy.<\/p>\n<\/blockquote>\n<p>Among other things, the game featured an emulated 16-bit computer named DCPU-16 that players could use to interact with their spaceship in various ways, and they could even extend the game with self-written programs.<\/p>\n<p>I think that&#8217;s such a neat idea: a programmable environment inside of the game. I&#8217;ve been thinking about a game with a similar in-game virtual machine. The game would be written <em>in<\/em> that very virtual machine, and exposed to the player, so that the player can interact with and change the game as the please, while they play. Full control over the mechanics and environment of game with live feedback; it opens up so many possibilities for interesting gameplay.<\/p>\n<p>Think of it like <a href=\"https:\/\/sonic-pi.net\">Sonic Pi<\/a>, but instead of composing live music, you adapt your surroundings and mutate <em>the literal laws of physics<\/em>. Creating gameplay and solving challenges by adapting the rules of the game. The game doesn&#8217;t guide the player, but the player has full control over the game.<\/p>\n<p>Unfortunately Notch abandoned 0x10<sup>c<\/sup>, he never finished or released it. I don&#8217;t know if this is how it was supposed to work. There&#8217;s very little known about the game&#8212;a lot of rumors and a few videos is all we have left. But I can&#8217;t get this idea out of my head. <em>One day I&#8217;ll make this game a reality.<\/em><\/p><\/div>","date_published":"2024-03-29T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/rules","title":"Rules","url":"https:\/\/geheimesite.nl\/blog\/rules","content_html":"<div><p><a href=\"https:\/\/blog.geheimesite.nl\/notes\/regels\/\">In the past<\/a> I&#8217;ve written about what I called &#8220;two rules for any well-functioning group&#8221;:<\/p>\n<blockquote>\n<ul>\n<li>Everyone behaves<\/li>\n<li>Everyone should have fun<\/li>\n<\/ul>\n<\/blockquote>\n<p>However, I was probably wrong. Because while small groups of people are pretty much self-organizing, as the group grows, some hierarchy is needed. In a relatively small group&#8212;everyone knows everyone&#8212;rules are generally unneeded, as people tend to behave properly due to peer pressure and social dynamics. However, the controlling effect of peer pressure breaks down in larger groups, because people are relatively anonymous. Social dynamics alone are not effective anymore, hence the need for formal rules.<\/p>\n<p>So while you can get away with my two rules for a small group, let&#8217;s say a classroom of around ~25 people, they will most definitely cause complete anarchy and chaos when applied to the entire school of around 700 students.<\/p>\n<p>I was right about one thing tho:<\/p>\n<blockquote>\n<p>If there is no basis for the rule, the rule doesn&#8217;t work, or the rule is unneeded, it should probably not be a rule.<\/p>\n<\/blockquote><\/div>","date_published":"2024-03-21T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/hotfox","title":"HotFox: RSS superpowers for Firefox","url":"https:\/\/geheimesite.nl\/blog\/hotfox","content_html":"<div><p>A few weeks ago, I ran across an old article about XUL, a XML variant developed by Mozilla for use in the Firefox interface. They killed it a few years ago in favor of HTML, once again leaving behind their tried-and-tested solutions in their ever-lasting chase to be as cool and hot as Google and its Chromium project. So, to try it out anyway, I installed <a href=\"https:\/\/palemoon.org\">Pale Moon<\/a>, a Firefox fork that has kept the traditional XUL interface in its former glory.<\/p>\n<p>Part of said traditional interface was a subscribe button that popped up in the toolbar while visiting some sites. When clicked, it showed a list of all web feeds that the site exposed. By selecting one of them, or by simply visiting the feed URL, you got this fancy feed preview with an option to subscribe to it with your favorite RSS reader.<\/p>\n<p>Why exactly did &#8220;modern&#8221; browsers remove this? When I visit an RSS feed in contemporary Firefox, I get this monstrosity:<\/p>\n<figure>\n  <img src=\"https:\/\/cdn.geheimesite.nl\/images\/blog\/rss-plain.png\" alt=\"\">\n  <figcaption>A bunch of confusing XML. Ew, that looks disgusting.<\/figcaption>\n<\/figure>\n<p>Why doesn&#8217;t the browser give me the ability to subscribe to a feed (anymore)? <a href=\"https:\/\/www.feed.style\">Why is it left for developers to figure out<\/a>, when it should obviously be the browser&#8217;s job?<\/p>\n<p>In an attempt to right this wrong once and for all, I built HotFox, a browser extension. It does two things:<\/p>\n<ul>\n<li>It adds a button to the toolbar that shows if a site exposes web feeds.<\/li>\n<li>It makes unstyled RSS feeds readable; turning the absolute mess from before into a more pleasant preview:<\/li>\n<\/ul>\n<figure>\n  <img src=\"https:\/\/cdn.geheimesite.nl\/images\/blog\/rss-fancy.png\" alt=\"\">\n  <figcaption>A pretty rendered RSS feed with suybscribe button. Phew, that&#8217;s better.<\/figcaption>\n<\/figure>\n<p>It&#8217;s available in the Mozilla Add-ons store, if you&#8217;d like to try it:<\/p>\n<p><a class=\"button\" href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/hotfox-for-rss\/\">\nDownload\n<\/a>\n<a class=\"button\" href=\"https:\/\/git.dupunkto.org\/~axcelott\/hotfox\">\nSource code\n<\/a><\/p>\n<aside class=\"box\">\n  <h2>FAQ<\/h2>\n  <dl>\n    <dt>Why the name?<\/dt>\n    <dd>\n      Fire is hot; idk it just sounded cool. There&#8217;s not really a\n      reason.\n    <\/dd>\n    <dt>\n      Why build a new extension when\n      <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/rsspreview\/\">it<\/a>\n      <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/awesome-rss\/\">already<\/a>\n      <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/want-my-rss\/\">exists<\/a>?\n    <\/dt>\n    <dd>\n      Because this seemed like a fun project to learn something about\n      developing browser extensions.\n    <\/dd>\n    <dt>Will there be a Chrome version?<\/dt>\n    <dd>\n      No. I don&#8217;t use Chrome myself;\n      <a href=\"https:\/\/geheimesite.nl\/monocultuur-op-de-browsermarkt\">\n        I don&#8217;t like Google&#8217;s attitude<\/a>.<br>\n      But kudos to them&#8212;they\n      <a href=\"https:\/\/www.ghacks.net\/2022\/08\/22\/google-chrome-is-getting-an-rss-feed-reader-on-desktop\/\">\n        got it built in.\n      <\/a>\n    <\/dd>\n    <dt>Where can I get it?<\/dt>\n    <dd>\n      On the\n      <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/hotfox-for-rss\/\">\n        Mozilla Add-ons store<\/a>.\n    <\/dd>\n  <\/dl>\n<\/aside><\/div>","date_published":"2024-03-20T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/sources","title":"Small is not scary","url":"https:\/\/geheimesite.nl\/blog\/sources","content_html":"<div><p>Since the internet went mainstream in the 90s, information has been readily available for everyone. But can it be trusted? What makes a reliable source? At school, we seem to get taught &#8216;the bigger the better&#8217;. Big news sites are generally considered trustworthy, while small and relatively unknown sites, like personal blogs<sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/sources#fn-1\" id=\"fnref-1\" data-footnote-ref>1<\/a><\/sup> or forums, are off-limits. However, in my experience, small, specialized blogs are typically better sources than those big news outlets.<\/p>\n<p>For one, random people online usually aren&#8217;t writing to please an advertiser, publisher or particular audience&#8212;they&#8217;re writing because they&#8217;re passionate about the subject. This makes a huge difference, as there is no financial incentive, no money at stake, no undisclosed incentives, no monetary gain. They don&#8217;t need to clickbait their writing; there&#8217;s no reason to maximize views. A blogger that isn&#8217;t financially dependent on their blog has no goal to track you or sell ads. They don&#8217;t <em>need anything<\/em> from their readers.<\/p>\n<p>Furthermore, articles on credible news sites are generally written by journalists, which is good. They fact-check and remain objective and neutral. But, a journalist will always be a generalist: they know a little about a lot. Bloggers, on the other hand, can be specialists and will often have a more in-depth understanding of the topic at hand. In other words: specialized blogs are usually more accurate than media coverage on the same subject. You&#8217;re probably <a href=\"https:\/\/rubenerd.com\/erwin-knolls-law-of-media-accuracy\/\">familiar with this too, if you&#8217;ve ever read some news item about your own profession<\/a>:<\/p>\n<blockquote cite=\"https:\/\/rubenerd.com\/erwin-knolls-law-of-media-accuracy\/\">\n  <p>\n    I&#8217;ve mentioned a few times how easy it is to pick apart inaccuracies\n    in media coverage on a topic you know about, and the unease that\n    sets in when you realise every topic likely has the same issues.\n  <\/p>\n<\/blockquote>\n<p>Moreover, bloggers don&#8217;t have any restrictions on their writing: they can make their articles as long, technical, and detailed as they please, not having to tailor them to a specific audience. Whereas a journalist has to make their writing accessible to a larger audience, exchanging valuable detail for readability.<\/p>\n<p>On blogs and forums, I know that what I&#8217;m reading is the authentic and personal experience of an actual person &#8212; not some corporate marketing bullshit. I&#8217;m not alone in this btw; there&#8217;s a reason people <a href=\"https:\/\/dkb.blog\/p\/google-search-is-dying\">keep appending &#8220;reddit&#8221; to the end of their searches<\/a>. Small blogs are written by <em>people<\/em>. I think that scares institutions like schools, which were created in a world where only other big institutions, like media companies and publishers, had the ability to put stuff into the world. &#8220;Oh no, actual people are now able to write and publish stuff on their own!&#8221; PANIC!<\/p>\n<p>The advent of the internet caused a huge shift in the way we find and consume information. And we love change&#8212;if we&#8217;re the one doing it. But for the rest of us, change is a threat. A threat to what is familiar. Familiar is nice. Familiar is comfortable. But that doesn&#8217;t mean familiar is good. Yet our education system keeps desperately clinging onto what it finds familiar.<\/p>\n<p>But what if we instead embrace the internet and the voices it gives to ordinary people? Maybe a more diverse and less formalised set of sources will actually be an enrichment for class. Offer us new perspectives we hadn&#8217;t thought of before.<\/p>\n<p>So, I think we should be more kind towards stuff written by people. It&#8217;s not scary; it&#8217;s just different.<\/p>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p>The blogs I talk about here are not the commercial BuzzFeed kind of blogs, but rather the things you&#8217;d find on the <a href=\"https:\/\/indieweb.org\">IndieWeb<\/a> or <a href=\"https:\/\/neustadt.fr\/essays\/the-small-web\/\">Small<\/a> <a href=\"https:\/\/www.marginalia.nu\/marginalia-search\/about\/\">Web<\/a>. <a href=\"https:\/\/geheimesite.nl\/blog\/sources#fnref-1\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"1\" aria-label=\"Back to reference 1\">\u21a9<\/a><\/p>\n<\/li>\n<\/ol>\n<\/section><\/div>","date_published":"2024-03-18T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/defaults","title":"Good Defaults","url":"https:\/\/geheimesite.nl\/blog\/defaults","content_html":"<div><p>Most documents are written in Calibri or Arial, everyone uses Google, and links on the second page of Google are rarely seen. <a href=\"https:\/\/archive.uie.com\/brainsparks\/2011\/09\/14\/do-users-change-their-settings\/\">Only 5% of users actually change the settings<\/a>.<\/p>\n<p>This is the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Default_effect\">Default Effect<\/a>&#8212;people don&#8217;t change the defaults. Therefore, whatever ships with your product, that&#8217;s what most users will use.<\/p>\n<p>An potential explanation would be <a href=\"https:\/\/en.wikipedia.org\/wiki\/Decision_fatigue\">decision fatigue<\/a>: a psychological phenomenon in which a person&#8217;s ability to make decisions deteriorates after making many decisions. Constantly making decisions is exhausting. Thus, when people are faced with multiple choices, they tend to stick to the default ones.<\/p>\n<blockquote cite=\"https:\/\/bootcamp.uxdesign.cc\/why-default-settings-matter-more-than-you-think-97af8c785edf\">\n  <p>\n    People change the defaults if the effort required to change them\n    feels less than the annoyance of sticking with them.\n  <\/p>\n<\/blockquote>\n<!-- Settings are complicated-and scary. The defaults work. Modifying them only poses the risk of breaking *something somewhere*, with no clue how to fix it. -->\n<p>Furthermore, users assume us programmers to know better. And frankly, we should. Just because we nerds like to play around with the settings doesn&#8217;t mean everyone does. And it shouldn&#8217;t be necessary either. Thus, the takeaway is: provide good defaults.<\/p><\/div>","date_published":"2024-03-15T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/dupunkto","title":"Introducing {du}punkto","url":"https:\/\/geheimesite.nl\/blog\/dupunkto","content_html":"<div><p>Last year, I posted <a href=\"https:\/\/geheimesite.nl\/thinking-about-tilde\">my thoughts on running a tilde\/pubnix<\/a>. In a nutshell, I wanted to experiment with setting up a small tilde, to learn more about Linux and the internet. And after a few months of experimenting, I finally have a system that I&#8217;m happy with. So today I&#8217;m introducing <a href=\"https:\/\/dupunkto.org\">{du}punkto<\/a>, my attempt at building <em>something<\/em>.<\/p>\n<p>In short, {du}punkto is a small group of like-minded people who are sharing a VPS. Everyone has access to the server over SSH or Mosh (handy for areas with wonky connections). The goal is to learn new things about *NIX systems, collaborate on code, experiment, and, above all, have fun. I&#8217;m co-maintaining it with <a href=\"https:\/\/dupunkto.org\/~potsjem\">Potsjem<\/a>, one of my best friends. The website isn&#8217;t finished yet, but it has a little more info, if you&#8217;re curious.<\/p>\n<p>Our server is named <code>du11<\/code>, after my web server <code>s11<\/code>, and it&#8217;s running FreeBSD 13. I opted for BSD because I like the tidy and organized folder structure, large repos, and jails functionality. It&#8217;s running a bunch of services for developing and  collaborating on software. Most notably:<\/p>\n<ul>\n<li>Web hosting for every Unix user via a <code>public_html<\/code> folder in their home directory.<\/li>\n<li>A Gitolite server with a cgit web frontend and mirroring to GitHub and Codeberg.<\/li>\n<li>FTP storage with a web portal.<\/li>\n<\/ul>\n<p>It&#8217;s also possible to run complimentary services in FreeBSD jails, like:<\/p>\n<ul>\n<li>A CardDAV and CalDAV server for me and my girlfriend.<\/li>\n<li>A Miniflux instance for personal use.<\/li>\n<\/ul>\n<p>I&#8217;m very excited about it. I&#8217;m looking forward to seeing what we&#8217;re gonna do with it further.<\/p>\n<aside class=\"box\">\n  <h2 class=\"h3\">Future plans<\/h2>\n  <ul>\n    <li>A handwritten classic Minecraft server.<\/li>\n    <li>Gopher and Gemini hosting, using <code>public_gem<\/code> and <code>public_gopher<\/code> respectively.<\/li>\n    <li>A VSCode server, similar to <a href=\"https:\/\/vscode.dev\">vscode.dev<\/a>.<\/li>\n    <li>A Matrix homeserver with Whatsapp bridging.<\/li>\n    <li>A Mastodon or Lemmy instance?<\/li>\n  <\/ul>\n<\/aside><\/div>","date_published":"2024-02-18T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/tilde","title":"Setting up my server with Gitolite, cgit and Nginx","url":"https:\/\/geheimesite.nl\/blog\/tilde","content_html":"<div><p>This weekend I reinstalled my server. It&#8217;s a cheap VPS that I&#8217;m using to host a bunch of services for myself. I&#8217;m sharing it with a few friends, and my girlfriend uses it to host her website.<\/p>\n<p>This post is both a guide to setting up a system like this, and a reference for future me, for when I&#8217;m inevitably gonna reinstall the system.<\/p>\n<h2>Preperations<\/h2>\n<p>I started off by creating a user account for myself and installing some basic utils:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\"># pkg install doas nvim bash curl wget\n<\/div><div class=\"line\" data-line=\"2\"># pw useradd axcelott\n<\/div><\/code><\/pre>\n<p>After I created my own user and granted it root privileges, I turned off root login over SSH in <code>\/etc\/ssh\/sshd_config<\/code>:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\">PermitRootLogin no\n<\/div><\/code><\/pre>\n<h2>Gitolite<\/h2>\n<p>I wanted a simple git server with a bare-bones and easily customizable web panel and powerful permission management for repos. For that, I chose to use Gitolite in combination with cgit.<\/p>\n<p>First off, install the dependencies:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\"># pkg install git gitolite\n<\/div><\/code><\/pre>\n<p>Create a <code>git<\/code> user:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\"># pw useradd git -d \/var\/git\n<\/div><div class=\"line\" data-line=\"2\"># mkdir \/var\/git\n<\/div><div class=\"line\" data-line=\"3\"># chown -R git:git \/var\/git\n<\/div><\/code><\/pre>\n<p>Gitolite identifies users by their SSH key. To install the server, you need to copy over your SSH public key for the initial admin user. In my case I created a file called <code>axcelott.pub<\/code>:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\"># su - git\n<\/div><div class=\"line\" data-line=\"2\">$ mkdir .ssh\n<\/div><div class=\"line\" data-line=\"3\">$ chmod 700 .ssh\n<\/div><div class=\"line\" data-line=\"4\">$ echo &quot;ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKb4ntyobJbcQE7YeyEX0Mi4QPs3QKatYsQ853pVwU6w robindev2019@outlook.com&quot; &gt; .ssh\/axcelott.pub\n<\/div><\/code><\/pre>\n<p>Then install gitolite using this command:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\">$ gitolite setup -pk .ssh\/axcelott.pub\n<\/div><\/code><\/pre>\n<p>This will create two new repos called <code>gitolite-admin.git<\/code> and <code>testing.git<\/code>. The admin repo will be used to store SSH public keys for users and a configuration file containing a list of repos and rules defining which users can access them.<\/p>\n<p>But before we continue, we need to change a few things in <code>.gitolite.rc<\/code>:<\/p>\n<ul>\n<li>Change <code>UMASK => 0077<\/code> to <code>UMASK => 0027<\/code><\/li>\n<li>Change <code>GIT_CONFIG_KEYS => \"\"<\/code> to <code>GIT_CONFIG_KEYS => \".*\"<\/code><\/li>\n<\/ul>\n<p>These changes are needed to make cgit work smoothly later.<\/p>\n<p>Now, clone the <code>gitolite-admin.git<\/code> repo locally:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\">$ git clone git@gitserver:gitolite-admin.git\n<\/div><div class=\"line\" data-line=\"2\">$ cd gitolite-admin\n<\/div><div class=\"line\" data-line=\"3\">$ ls\n<\/div><div class=\"line\" data-line=\"4\">conf keydir\n<\/div><\/code><\/pre>\n<p>The <code>conf<\/code> directory should include a single file: <code>gitolite.conf<\/code>. This file contains a list of all repos and who&#8217;s allowed to read and write them.<\/p>\n<p>It should look something like this:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\">repo gitolite-admin\n<\/div><div class=\"line\" data-line=\"2\">    RW+     =   charlie\n<\/div><div class=\"line\" data-line=\"3\">\n<\/div><div class=\"line\" data-line=\"4\">repo testing\n<\/div><div class=\"line\" data-line=\"5\">    RW+     =   @all\n<\/div><\/code><\/pre>\n<p>To change the config, simply edit the file and then commit and push your changes. Change it to your liking. On <code>du11<\/code>, this was the final config:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\">@admins = axcelott\n<\/div><div class=\"line\" data-line=\"2\">@users = @admins msb\n<\/div><div class=\"line\" data-line=\"3\">@public = gitweb daemon\n<\/div><div class=\"line\" data-line=\"4\">\n<\/div><div class=\"line\" data-line=\"5\"># Admin\n<\/div><div class=\"line\" data-line=\"6\">repo gitolite-admin\n<\/div><div class=\"line\" data-line=\"7\">    RW+      =   @admins\n<\/div><div class=\"line\" data-line=\"8\">\n<\/div><div class=\"line\" data-line=\"9\"># &lbrace;du&rbrace;punkto projects\n<\/div><div class=\"line\" data-line=\"10\">repo sites\/dupunkto.org\n<\/div><div class=\"line\" data-line=\"11\">    category =   sites\n<\/div><div class=\"line\" data-line=\"12\">    RW+      =   @users\n<\/div><div class=\"line\" data-line=\"13\">    R        =   @all\n<\/div><div class=\"line\" data-line=\"14\">\n<\/div><div class=\"line\" data-line=\"15\">repo oblikvo\n<\/div><div class=\"line\" data-line=\"16\">    RW+      =   @users\n<\/div><div class=\"line\" data-line=\"17\">    R        =   @all\n<\/div><div class=\"line\" data-line=\"18\">\n<\/div><div class=\"line\" data-line=\"19\">repo somtomorrow\n<\/div><div class=\"line\" data-line=\"20\">    RW+      =   @users\n<\/div><div class=\"line\" data-line=\"21\">    R        =   @all\n<\/div><div class=\"line\" data-line=\"22\">\n<\/div><div class=\"line\" data-line=\"23\">repo tools\n<\/div><div class=\"line\" data-line=\"24\">    RW+      =   @users\n<\/div><div class=\"line\" data-line=\"25\">    R        =   @all\n<\/div><div class=\"line\" data-line=\"26\">\n<\/div><div class=\"line\" data-line=\"27\">repo wiki\n<\/div><div class=\"line\" data-line=\"28\">    RW+      =   @users\n<\/div><div class=\"line\" data-line=\"29\">    R        =   @all\n<\/div><div class=\"line\" data-line=\"30\">\n<\/div><div class=\"line\" data-line=\"31\"># Public namespaces\n<\/div><div class=\"line\" data-line=\"32\">repo forks\/..*\n<\/div><div class=\"line\" data-line=\"33\">    category =   forks\n<\/div><div class=\"line\" data-line=\"34\">    C        =   @users\n<\/div><div class=\"line\" data-line=\"35\">    RW+      =   CREATOR\n<\/div><div class=\"line\" data-line=\"36\">    -        =   @public\n<\/div><div class=\"line\" data-line=\"37\">    R        =   READERS\n<\/div><div class=\"line\" data-line=\"38\">\n<\/div><div class=\"line\" data-line=\"39\"># Personal namespaces\n<\/div><div class=\"line\" data-line=\"40\">repo CREATOR\/..*\n<\/div><div class=\"line\" data-line=\"41\">    category =   personal\n<\/div><div class=\"line\" data-line=\"42\">    C        =   @users\n<\/div><div class=\"line\" data-line=\"43\">    RW+      =   CREATOR\n<\/div><div class=\"line\" data-line=\"44\">    RW       =   WRITERS\n<\/div><div class=\"line\" data-line=\"45\">    R        =   @all\n<\/div><div class=\"line\" data-line=\"46\">\n<\/div><div class=\"line\" data-line=\"47\"># Project namespaces\n<\/div><div class=\"line\" data-line=\"48\"># (operated by a single user)\n<\/div><div class=\"line\" data-line=\"49\">repo grape-lang\/..*\n<\/div><div class=\"line\" data-line=\"50\">    category =   grape-lang\n<\/div><div class=\"line\" data-line=\"51\">    C        =   axcelott\n<\/div><div class=\"line\" data-line=\"52\">    RW+      =   CREATOR\n<\/div><div class=\"line\" data-line=\"53\">    -        =   @public\n<\/div><div class=\"line\" data-line=\"54\">    R        =   READERS\n<\/div><div class=\"line\" data-line=\"55\">\n<\/div><div class=\"line\" data-line=\"56\">repo neopub\/..*\n<\/div><div class=\"line\" data-line=\"57\">    category =   neopub\n<\/div><div class=\"line\" data-line=\"58\">    C        =   axcelott\n<\/div><div class=\"line\" data-line=\"59\">    RW+      =   CREATOR\n<\/div><div class=\"line\" data-line=\"60\">    -        =   @public\n<\/div><div class=\"line\" data-line=\"61\">    R        =   READERS\n<\/div><div class=\"line\" data-line=\"62\">\n<\/div><div class=\"line\" data-line=\"63\">repo epique\/..*\n<\/div><div class=\"line\" data-line=\"64\">    C        =   axcelott\n<\/div><div class=\"line\" data-line=\"65\">    RW+      =   CREATOR\n<\/div><div class=\"line\" data-line=\"66\">    -        =   @public\n<\/div><div class=\"line\" data-line=\"67\">    R        =   READERS\n<\/div><div class=\"line\" data-line=\"68\">\n<\/div><div class=\"line\" data-line=\"69\">repo nindo\/..*\n<\/div><div class=\"line\" data-line=\"70\">    category =   nindo\n<\/div><div class=\"line\" data-line=\"71\">    C        =   axcelott\n<\/div><div class=\"line\" data-line=\"72\">    RW+      =   CREATOR\n<\/div><div class=\"line\" data-line=\"73\">    -        =   @public\n<\/div><div class=\"line\" data-line=\"74\">    R        =   READERS\n<\/div><div class=\"line\" data-line=\"75\">\n<\/div><div class=\"line\" data-line=\"76\">repo unlibrary\/..*\n<\/div><div class=\"line\" data-line=\"77\">    category =   unlibrary\n<\/div><div class=\"line\" data-line=\"78\">    C        =   axcelott\n<\/div><div class=\"line\" data-line=\"79\">    RW+      =   CREATOR\n<\/div><div class=\"line\" data-line=\"80\">    -        =   @public\n<\/div><div class=\"line\" data-line=\"81\">    R        =   READERS\n<\/div><div class=\"line\" data-line=\"82\">\n<\/div><div class=\"line\" data-line=\"83\">repo skylight\/..*\n<\/div><div class=\"line\" data-line=\"84\">    category =   skylight\n<\/div><div class=\"line\" data-line=\"85\">    C        =   axcelott\n<\/div><div class=\"line\" data-line=\"86\">    RW+      =   CREATOR\n<\/div><div class=\"line\" data-line=\"87\">    -        =   @public\n<\/div><div class=\"line\" data-line=\"88\">    R        =   READERS\n<\/div><div class=\"line\" data-line=\"89\">\n<\/div><div class=\"line\" data-line=\"90\"># Private namespaces\n<\/div><div class=\"line\" data-line=\"91\">repo sites\/..*\n<\/div><div class=\"line\" data-line=\"92\">    C        =   axcelott\n<\/div><div class=\"line\" data-line=\"93\">    RW+      =   CREATOR\n<\/div><div class=\"line\" data-line=\"94\">    -        =   @public\n<\/div><div class=\"line\" data-line=\"95\">    R        =   READERS\n<\/div><div class=\"line\" data-line=\"96\">\n<\/div><div class=\"line\" data-line=\"97\">repo meta\/..*\n<\/div><div class=\"line\" data-line=\"98\">    C        =   axcelott\n<\/div><div class=\"line\" data-line=\"99\">    RW+      =   CREATOR\n<\/div><div class=\"line\" data-line=\"100\">    -        =   @public\n<\/div><div class=\"line\" data-line=\"101\">    R        =   READERS\n<\/div><div class=\"line\" data-line=\"102\">\n<\/div><div class=\"line\" data-line=\"103\">repo legacy\/..*\n<\/div><div class=\"line\" data-line=\"104\">    category =   legacy\n<\/div><div class=\"line\" data-line=\"105\">    C        =   axcelott\n<\/div><div class=\"line\" data-line=\"106\">    RW+      =   CREATOR\n<\/div><div class=\"line\" data-line=\"107\">    -        =   @public\n<\/div><div class=\"line\" data-line=\"108\">    R        =   READERS\n<\/div><\/code><\/pre>\n<p>Similarly, you can add users by putting their SSH public key in the <code>keydir<\/code> folder and pushing the changes. In my case, I added <code>msb.pub<\/code> (since <code>axcelott.pub<\/code> was already present from installing).<\/p>\n<h3>Importing repositories<\/h3>\n<p>Importing repositories in Gitolite is very simple. Simply copy the repositories into the <code>\/var\/git\/repositories<\/code> folder. Then run the following commands:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\"># chown -R git:git \/var\/git\/repositories\n<\/div><div class=\"line\" data-line=\"2\"># chmod -R g+rX \/var\/git\/repositories\n<\/div><\/code><\/pre>\n<p>And then (as the <code>git<\/code> user):<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\">$ gitolite compile\n<\/div><div class=\"line\" data-line=\"2\">$ gitolite setup --hooks-only\n<\/div><div class=\"line\" data-line=\"3\">$ gitolite trigger POST_COMPILE\n<\/div><\/code><\/pre>\n<p>For wild repos, you need to run this command to assign the correct owner:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\">$ printf &quot;axcelott&quot; &gt; \/var\/git\/repositories\/some\/repo.git\/gl-creator\n<\/div><\/code><\/pre>\n<p>And finally, add the remaining repos to your <code>gitolite.conf<\/code> and push your changes.<\/p>\n<h2>cgit<\/h2>\n<p>For the web control panel, I chose cgit. It&#8217;s simple, fast, easily themeable and it&#8217;s easy to setup. cgit is a CGI application, so we&#8217;ll need a webserver too. I went with Nginx &#8212; not because I like it, but because Apache sucks and Caddy is a hassle to setup.<\/p>\n<p>First, install the dependencies:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\"># pkg install cgit fcgiwrap nginx py39-docutils py39-markdown py39-pygments python3 python39\n<\/div><\/code><\/pre>\n<p><code>fcgiwrap<\/code> is a little tool to make cgit, which is a CGI application, work with the FastCGI protocol that Nginx uses. I&#8217;m not good at explaining this stuff, so I&#8217;ll just quote it instead:<\/p>\n<blockquote>\n<p>Cgit, which uses code from Git, was designed to let users run a command (eg: <code>git push<\/code>) then exit, allowing our computers to reclaim the used resources between each call. Nginx uses a faster protocol (<a href=\"https:\/\/en.wikipedia.org\/wiki\/FastCGI\">FastCGI<\/a>) which calls the same program multiple times without exiting.<\/p>\n<p>However because Cgit was designed to exit after every run, it will never give back its used resources and will continue to take more, quickly exhausting all of the computer&#8217;s available resources. This is why we need <code>fcgiwrap<\/code>.<\/p>\n<\/blockquote>\n<p>To make it work, append the following to your <code>\/etc\/rc.conf<\/code>:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\">nginx_enable=&quot;YES&quot;\n<\/div><div class=\"line\" data-line=\"2\">fcgiwrap_enable=&quot;YES&quot;\n<\/div><div class=\"line\" data-line=\"3\">fcgiwrap_flags=&quot;-f&quot;\n<\/div><div class=\"line\" data-line=\"4\">fcgiwrap_user=&quot;www&quot;\n<\/div><div class=\"line\" data-line=\"5\">fcgiwrap_group=&quot;www&quot;\n<\/div><div class=\"line\" data-line=\"6\">fcgiwrap_socket_owner=&quot;www&quot;\n<\/div><div class=\"line\" data-line=\"7\">fcgiwrap_socket_group=&quot;www&quot;\n<\/div><\/code><\/pre>\n<p>Next, add a <code>server<\/code>-block to the Nginx config (<code>\/usr\/local\/etc\/nginx\/nginx.conf<\/code>), and you&#8217;re almost done:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\">server &lbrace;\n<\/div><div class=\"line\" data-line=\"2\">    listen 80;\n<\/div><div class=\"line\" data-line=\"3\">    listen [::]:80;\n<\/div><div class=\"line\" data-line=\"4\">    server_name git.dupunkto.org;\n<\/div><div class=\"line\" data-line=\"5\">\n<\/div><div class=\"line\" data-line=\"6\">    charset utf-8;\n<\/div><div class=\"line\" data-line=\"7\">\n<\/div><div class=\"line\" data-line=\"8\">    add_header Referrer-Policy &quot;no-referrer&quot;;\n<\/div><div class=\"line\" data-line=\"9\">    add_header X-Content-Type-Options &quot;nosniff&quot;;\n<\/div><div class=\"line\" data-line=\"10\">    add_header X-Frame-Options &quot;deny&quot;;\n<\/div><div class=\"line\" data-line=\"11\">    add_header Cross-Origin-Opener-Policy &quot;same-origin&quot;;\n<\/div><div class=\"line\" data-line=\"12\">    add_header Strict-Transport-Security &quot;max-age=31536000&quot;;\n<\/div><div class=\"line\" data-line=\"13\">\n<\/div><div class=\"line\" data-line=\"14\">    root \/usr\/local\/www\/cgit;\n<\/div><div class=\"line\" data-line=\"15\">    try_files $uri @cgit;\n<\/div><div class=\"line\" data-line=\"16\">\n<\/div><div class=\"line\" data-line=\"17\">    location @cgit &lbrace;\n<\/div><div class=\"line\" data-line=\"18\">        client_max_body_size 0;\n<\/div><div class=\"line\" data-line=\"19\">\n<\/div><div class=\"line\" data-line=\"20\">        include fastcgi_params;\n<\/div><div class=\"line\" data-line=\"21\">        fastcgi_param SCRIPT_FILENAME \/usr\/local\/www\/cgit\/cgit.cgi;\n<\/div><div class=\"line\" data-line=\"22\">        fastcgi_param PATH_INFO $uri;\n<\/div><div class=\"line\" data-line=\"23\">        fastcgi_param QUERY_STRING $args;\n<\/div><div class=\"line\" data-line=\"24\">        fastcgi_param HTTP_HOST $server_name;\n<\/div><div class=\"line\" data-line=\"25\">        fastcgi_pass unix:\/var\/run\/fcgiwrap\/fcgiwrap.sock;\n<\/div><div class=\"line\" data-line=\"26\">        fastcgi_read_timeout 300;\n<\/div><div class=\"line\" data-line=\"27\">    &rbrace;\n<\/div><div class=\"line\" data-line=\"28\">\n<\/div><div class=\"line\" data-line=\"29\">    error_page 500 502 503 504 \/50x.html;\n<\/div><div class=\"line\" data-line=\"30\">    location = \/50x.html &lbrace;\n<\/div><div class=\"line\" data-line=\"31\">        root \/usr\/local\/www\/nginx-dist;\n<\/div><div class=\"line\" data-line=\"32\">    &rbrace;\n<\/div><div class=\"line\" data-line=\"33\">&rbrace;\n<\/div><\/code><\/pre>\n<p>To finish off, edit the cgit config in <code>\/usr\/local\/etc\/cgitrc<\/code>:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\">root-title=&lbrace;du&rbrace;punkto \u00b7 git repositories\n<\/div><div class=\"line\" data-line=\"2\">root-desc=Improving the world, line by line\n<\/div><div class=\"line\" data-line=\"3\">\n<\/div><div class=\"line\" data-line=\"4\">virtual-root=\/\n<\/div><div class=\"line\" data-line=\"5\">css=\/custom.css\n<\/div><div class=\"line\" data-line=\"6\">favicon=\n<\/div><div class=\"line\" data-line=\"7\">logo=\n<\/div><div class=\"line\" data-line=\"8\">\n<\/div><div class=\"line\" data-line=\"9\"># Use gitolite repos\n<\/div><div class=\"line\" data-line=\"10\">enable-git-config=1\n<\/div><div class=\"line\" data-line=\"11\">remove-suffix=1\n<\/div><div class=\"line\" data-line=\"12\">section-from-path=2\n<\/div><div class=\"line\" data-line=\"13\">project-list=\/var\/git\/projects.list\n<\/div><div class=\"line\" data-line=\"14\">scan-path=\/var\/git\/repositories\n<\/div><div class=\"line\" data-line=\"15\">branch-sort=age\n<\/div><div class=\"line\" data-line=\"16\">repository-sort=age\n<\/div><div class=\"line\" data-line=\"17\">robots=noindex, nofollow\n<\/div><div class=\"line\" data-line=\"18\">\n<\/div><div class=\"line\" data-line=\"19\"># Dumb clones\n<\/div><div class=\"line\" data-line=\"20\">enable-http-clone=1\n<\/div><div class=\"line\" data-line=\"21\">clone-prefix=ssh:\/\/git@dupunkto.org https:\/\/git.dupunkto.org http:\/\/git.dupunkto.org\n<\/div><div class=\"line\" data-line=\"22\">\n<\/div><div class=\"line\" data-line=\"23\"># Enable &#39;expensive&#39; features\n<\/div><div class=\"line\" data-line=\"24\">enable-subject-links=1\n<\/div><div class=\"line\" data-line=\"25\">enable-tree-linenumbers=1\n<\/div><div class=\"line\" data-line=\"26\">enable-commit-graph=1\n<\/div><div class=\"line\" data-line=\"27\">enable-blame=1\n<\/div><div class=\"line\" data-line=\"28\">enable-log-filecount=1\n<\/div><div class=\"line\" data-line=\"29\">enable-log-linecount=1\n<\/div><div class=\"line\" data-line=\"30\">enable-git-config=1\n<\/div><div class=\"line\" data-line=\"31\">enable-index-owner=0\n<\/div><div class=\"line\" data-line=\"32\">side-by-side-diffs=1\n<\/div><div class=\"line\" data-line=\"33\">summary-branches=5\n<\/div><div class=\"line\" data-line=\"34\">\n<\/div><div class=\"line\" data-line=\"35\"># Disable repo pagination\n<\/div><div class=\"line\" data-line=\"36\">max-repo-count=1000000000\n<\/div><div class=\"line\" data-line=\"37\">\n<\/div><div class=\"line\" data-line=\"38\"># No spam please\n<\/div><div class=\"line\" data-line=\"39\">noplainemail=1\n<\/div><div class=\"line\" data-line=\"40\">\n<\/div><div class=\"line\" data-line=\"41\"># Allow downloads\n<\/div><div class=\"line\" data-line=\"42\">snapshots=tar.gz zip\n<\/div><div class=\"line\" data-line=\"43\">\n<\/div><div class=\"line\" data-line=\"44\"># Syntax highlighting &amp; READMEs\n<\/div><div class=\"line\" data-line=\"45\">source-filter=\/usr\/local\/lib\/cgit\/filters\/syntax-highlighting.py\n<\/div><div class=\"line\" data-line=\"46\">about-filter=\/usr\/local\/lib\/cgit\/filters\/about-formatting.sh\n<\/div><div class=\"line\" data-line=\"47\">readme=:README.txt\n<\/div><div class=\"line\" data-line=\"48\">readme=:README.md\n<\/div><div class=\"line\" data-line=\"49\">readme=:README\n<\/div><\/code><\/pre>\n<p>In my case, I also added some custom CSS in <code>\/usr\/local\/www\/cgit\/custom.css<\/code>:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-css\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\"><span style=\"color: #c678dd;\">@import<\/span> <span style=\"color: #61afef;\">url<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #98c379;\">&quot;cgit.css&quot;<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"2\">\n<\/div><div class=\"line\" data-line=\"3\"><span style=\"color: #7f848e;\">\/* Better fonts *\/<\/span>\n<\/div><div class=\"line\" data-line=\"4\"><span style=\"color: #abb2bf;\">:<\/span><span style=\"color: #c678dd;\">root<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"5\">        <span style=\"color: #e06c75;\">line-height<\/span><span style=\"color: #abb2bf;\">:<\/span> <span style=\"color: #d19a66;\">1.25<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"6\">        <span style=\"color: #e06c75;\">tab-size<\/span><span style=\"color: #abb2bf;\">:<\/span> <span style=\"color: #d19a66;\">4<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"7\"><span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"8\">\n<\/div><div class=\"line\" data-line=\"9\"><span style=\"color: #e06c75;\">div<\/span><span style=\"color: #abb2bf;\">#<\/span><span style=\"color: #d19a66;\">cgit<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span> <span style=\"color: #e06c75;\">font-family<\/span><span style=\"color: #abb2bf;\">:<\/span> monospace<span style=\"color: #abb2bf;\">;<\/span> <span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"10\">\n<\/div><div class=\"line\" data-line=\"11\"><span style=\"color: #7f848e;\">\/* Better layout *\/<\/span>\n<\/div><div class=\"line\" data-line=\"12\"><span style=\"color: #e06c75;\">div<\/span><span style=\"color: #abb2bf;\">#<\/span><span style=\"color: #d19a66;\">cgit<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"13\">        <span style=\"color: #e06c75;\">max-width<\/span><span style=\"color: #abb2bf;\">:<\/span> <span style=\"color: #d19a66;\">117<span style=\"color: #98c379;\">ch<\/span><\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"14\">        <span style=\"color: #e06c75;\">margin<\/span><span style=\"color: #abb2bf;\">:<\/span> <span style=\"color: #d19a66;\">0<\/span> auto<span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"15\"><span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"16\"><span style=\"color: #e06c75;\">div<\/span><span style=\"color: #abb2bf;\">#<\/span><span style=\"color: #d19a66;\">cgit<\/span> <span style=\"color: #e06c75;\">div<\/span><span style=\"color: #abb2bf;\">#<\/span><span style=\"color: #d19a66;\">summary<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"17\">        <span style=\"color: #e06c75;\">max-width<\/span><span style=\"color: #abb2bf;\">:<\/span> <span style=\"color: #d19a66;\">80<span style=\"color: #98c379;\">ch<\/span><\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"18\"><span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"19\">\n<\/div><div class=\"line\" data-line=\"20\"><span style=\"color: #7f848e;\">\/* Better header *\/<\/span>\n<\/div><div class=\"line\" data-line=\"21\"><span style=\"color: #e06c75;\">table<\/span><span style=\"color: #abb2bf;\">#<\/span><span style=\"color: #d19a66;\">header<\/span> <span style=\"color: #e06c75;\">td<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e5c07b;\">main<\/span><span style=\"color: #abb2bf;\">:<\/span><span style=\"color: #c678dd;\">has<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">a<\/span><span style=\"color: #c678dd;\">)<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"22\">        <span style=\"color: #e06c75;\">color<\/span><span style=\"color: #abb2bf;\">:<\/span> transparent<span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"23\">        <span style=\"color: #e06c75;\">font-size<\/span><span style=\"color: #abb2bf;\">:<\/span> <span style=\"color: #d19a66;\">.2<span style=\"color: #98c379;\">px<\/span><\/span> <span style=\"color: #c678dd;\">!important<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"24\"><span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"25\"><span style=\"color: #e06c75;\">table<\/span><span style=\"color: #abb2bf;\">#<\/span><span style=\"color: #d19a66;\">header<\/span> <span style=\"color: #e06c75;\">td<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e5c07b;\">main<\/span> <span style=\"color: #e06c75;\">a<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"26\">        <span style=\"color: #e06c75;\">font-size<\/span><span style=\"color: #abb2bf;\">:<\/span> <span style=\"color: #d19a66;\">2<span style=\"color: #98c379;\">rem<\/span><\/span> <span style=\"color: #c678dd;\">!important<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"27\"><span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"28\"><span style=\"color: #e06c75;\">table<\/span><span style=\"color: #abb2bf;\">#<\/span><span style=\"color: #d19a66;\">header<\/span> <span style=\"color: #e06c75;\">td<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e5c07b;\">main<\/span> <span style=\"color: #e06c75;\">a<\/span><span style=\"color: #abb2bf;\">:<\/span><span style=\"color: #c678dd;\">first-child<\/span><span style=\"color: #abb2bf;\">::<\/span><span style=\"color: #c678dd;\">after<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"29\">        <span style=\"color: #e06c75;\">content<\/span><span style=\"color: #abb2bf;\">:<\/span> <span style=\"color: #98c379;\">&quot;\/&quot;<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"30\"><span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"31\">\n<\/div><div class=\"line\" data-line=\"32\"><span style=\"color: #7f848e;\">\/* Trim repo descriptions *\/<\/span>\n<\/div><div class=\"line\" data-line=\"33\"><span style=\"color: #e06c75;\">div<\/span><span style=\"color: #abb2bf;\">#<\/span><span style=\"color: #d19a66;\">cgit<\/span> <span style=\"color: #e06c75;\">div<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e5c07b;\">content<\/span> <span style=\"color: #e06c75;\">table<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e5c07b;\">list<\/span> <span style=\"color: #e06c75;\">tr<\/span> <span style=\"color: #e06c75;\">td<\/span><span style=\"color: #abb2bf;\">:<\/span><span style=\"color: #c678dd;\">nth-child<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #d19a66;\">2<\/span><span style=\"color: #c678dd;\">)<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"34\">        <span style=\"color: #e06c75;\">max-width<\/span><span style=\"color: #abb2bf;\">:<\/span> <span style=\"color: #d19a66;\">40<span style=\"color: #98c379;\">ch<\/span><\/span> <span style=\"color: #c678dd;\">!important<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"35\">        <span style=\"color: #e06c75;\">overflow<\/span><span style=\"color: #abb2bf;\">:<\/span> hidden<span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"36\">        <span style=\"color: #e06c75;\">text-overflow<\/span><span style=\"color: #abb2bf;\">:<\/span> ellipsis<span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"37\">        <span style=\"color: #e06c75;\">text-transform<\/span><span style=\"color: #abb2bf;\">:<\/span> lowercase<span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"38\"><span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"39\">\n<\/div><div class=\"line\" data-line=\"40\"><span style=\"color: #7f848e;\">\/* Remove weird artifacts *\/<\/span>\n<\/div><div class=\"line\" data-line=\"41\"><span style=\"color: #e06c75;\">table<\/span><span style=\"color: #abb2bf;\">#<\/span><span style=\"color: #d19a66;\">header<\/span> <span style=\"color: #e06c75;\">td<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e5c07b;\">sub<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e5c07b;\">right<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"42\">        <span style=\"color: #e06c75;\">display<\/span><span style=\"color: #abb2bf;\">:<\/span> none<span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"43\"><span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"44\">\n<\/div><div class=\"line\" data-line=\"45\"><span style=\"color: #7f848e;\">\/* Remove excessive use of borders *\/<\/span>\n<\/div><div class=\"line\" data-line=\"46\"><span style=\"color: #e06c75;\">div<\/span><span style=\"color: #abb2bf;\">#<\/span><span style=\"color: #d19a66;\">cgit<\/span> <span style=\"color: #e06c75;\">table<\/span><span style=\"color: #abb2bf;\">#<\/span><span style=\"color: #d19a66;\">header<\/span> <span style=\"color: #e06c75;\">td<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e5c07b;\">sub<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"47\">        <span style=\"color: #e06c75;\">border-top<\/span><span style=\"color: #abb2bf;\">:<\/span> none<span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"48\"><span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"49\"><span style=\"color: #e06c75;\">div<\/span><span style=\"color: #abb2bf;\">#<\/span><span style=\"color: #d19a66;\">cgit<\/span> <span style=\"color: #e06c75;\">table<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e5c07b;\">tabs<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"50\">        <span style=\"color: #e06c75;\">border-bottom<\/span><span style=\"color: #abb2bf;\">:<\/span> none<span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"51\"><span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"52\"><span style=\"color: #e06c75;\">div<\/span><span style=\"color: #abb2bf;\">#<\/span><span style=\"color: #d19a66;\">cgit<\/span> <span style=\"color: #e06c75;\">div<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e5c07b;\">content<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"53\">        <span style=\"color: #e06c75;\">border-bottom<\/span><span style=\"color: #abb2bf;\">:<\/span> none<span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"54\"><span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"55\">\n<\/div><div class=\"line\" data-line=\"56\"><span style=\"color: #7f848e;\">\/* Padding on sections *\/<\/span>\n<\/div><div class=\"line\" data-line=\"57\"><span style=\"color: #e06c75;\">div<\/span><span style=\"color: #abb2bf;\">#<\/span><span style=\"color: #d19a66;\">cgit<\/span> <span style=\"color: #e06c75;\">table<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e5c07b;\">list<\/span> <span style=\"color: #e06c75;\">td<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e5c07b;\">reposection<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"58\">        <span style=\"color: #e06c75;\">padding-top<\/span><span style=\"color: #abb2bf;\">:<\/span> <span style=\"color: #d19a66;\">1.5<span style=\"color: #98c379;\">em<\/span><\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"59\"><span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"60\">\n<\/div><div class=\"line\" data-line=\"61\"><span style=\"color: #7f848e;\">\/* Neutral colors *\/<\/span>\n<\/div><div class=\"line\" data-line=\"62\"><span style=\"color: #e06c75;\">div<\/span><span style=\"color: #abb2bf;\">#<\/span><span style=\"color: #d19a66;\">cgit<\/span> <span style=\"color: #e06c75;\">table<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e5c07b;\">list<\/span> <span style=\"color: #e06c75;\">th<\/span> <span style=\"color: #e06c75;\">a<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"63\">        <span style=\"color: #e06c75;\">color<\/span><span style=\"color: #abb2bf;\">:<\/span> inherit<span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"64\"><span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"65\"><span style=\"color: #e06c75;\">div<\/span><span style=\"color: #abb2bf;\">#<\/span><span style=\"color: #d19a66;\">cgit<\/span> <span style=\"color: #e06c75;\">table<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e5c07b;\">list<\/span> <span style=\"color: #e06c75;\">tr<\/span><span style=\"color: #abb2bf;\">:<\/span><span style=\"color: #c678dd;\">nth-child<\/span><span style=\"color: #c678dd;\">(<\/span>even<span style=\"color: #c678dd;\">)<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"66\">        <span style=\"color: #e06c75;\">background<\/span><span style=\"color: #abb2bf;\">:<\/span> inherit<span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"67\"><span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"68\"><span style=\"color: #e06c75;\">div<\/span><span style=\"color: #abb2bf;\">#<\/span><span style=\"color: #d19a66;\">cgit<\/span> <span style=\"color: #e06c75;\">table<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e5c07b;\">list<\/span> <span style=\"color: #e06c75;\">tr<\/span><span style=\"color: #abb2bf;\">:<\/span><span style=\"color: #c678dd;\">hover<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"69\">        <span style=\"color: #e06c75;\">background<\/span><span style=\"color: #abb2bf;\">:<\/span> inherit<span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"70\"><span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"71\"><span style=\"color: #e06c75;\">div<\/span><span style=\"color: #abb2bf;\">#<\/span><span style=\"color: #d19a66;\">cgit<\/span> <span style=\"color: #e06c75;\">table<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e5c07b;\">list<\/span> <span style=\"color: #e06c75;\">tr<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e5c07b;\">nohover-highlight<\/span><span style=\"color: #abb2bf;\">:<\/span><span style=\"color: #c678dd;\">hover<\/span><span style=\"color: #abb2bf;\">:<\/span><span style=\"color: #c678dd;\">nth-child<\/span><span style=\"color: #c678dd;\">(<\/span>even<span style=\"color: #c678dd;\">)<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"72\">        <span style=\"color: #e06c75;\">background<\/span><span style=\"color: #abb2bf;\">:<\/span> inherit<span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"73\"><span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"74\"><span style=\"color: #e06c75;\">div<\/span><span style=\"color: #abb2bf;\">#<\/span><span style=\"color: #d19a66;\">cgit<\/span> <span style=\"color: #e06c75;\">table<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e5c07b;\">blob<\/span> <span style=\"color: #e06c75;\">td<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e5c07b;\">linenumbers<\/span> <span style=\"color: #e06c75;\">a<\/span><span style=\"color: #abb2bf;\">:<\/span><span style=\"color: #c678dd;\">target<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"75\">        <span style=\"color: #e06c75;\">color<\/span><span style=\"color: #abb2bf;\">:<\/span> goldenrod<span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"76\">        <span style=\"color: #e06c75;\">text-decoration<\/span><span style=\"color: #abb2bf;\">:<\/span> underline<span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"77\">        <span style=\"color: #e06c75;\">outline<\/span><span style=\"color: #abb2bf;\">:<\/span> none<span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"78\"><span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><\/code><\/pre>\n<h2>Webhosting<\/h2>\n<p>I wanted everyone who had access to the server to have their own little web space at <strong>dupunkto.org\/username<\/strong>, which they could manage by placing files into <code>~\/public_html<\/code>. Doing this is as simple as adding another <code>server<\/code>-block to the Nginx config.<\/p>\n<p>While I was at it, I created some directories where the files for the homepage of our site can live, and I made them writeable for everyone because I don&#8217;t have trust issues (yet):<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\"># mkdir \/usr\/local\/www\/dupunkto.org\n<\/div><div class=\"line\" data-line=\"2\"># mkdir \/usr\/local\/www\/ftp.dupunkto.org\n<\/div><div class=\"line\" data-line=\"3\"># chmow 777 \/usr\/local\/www\/dupunkto.org\n<\/div><div class=\"line\" data-line=\"4\"># chmod 777 \/usr\/local\/www\/ftp.dupunkto.org\n<\/div><\/code><\/pre>\n<p>And finally, add this to the Nginx config:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\">server &lbrace;\n<\/div><div class=\"line\" data-line=\"2\">    listen 80;\n<\/div><div class=\"line\" data-line=\"3\">    listen [::]:80;\n<\/div><div class=\"line\" data-line=\"4\">    server_name  dupunkto.org;\n<\/div><div class=\"line\" data-line=\"5\">\n<\/div><div class=\"line\" data-line=\"6\">    charset utf-8;\n<\/div><div class=\"line\" data-line=\"7\">\n<\/div><div class=\"line\" data-line=\"8\">    add_header Referrer-Policy &quot;no-referrer&quot;;\n<\/div><div class=\"line\" data-line=\"9\">    add_header X-Content-Type-Options &quot;nosniff&quot;;\n<\/div><div class=\"line\" data-line=\"10\">    add_header X-Frame-Options &quot;deny&quot;;\n<\/div><div class=\"line\" data-line=\"11\">    add_header Cross-Origin-Opener-Policy &quot;same-origin&quot;;\n<\/div><div class=\"line\" data-line=\"12\">    add_header Strict-Transport-Security &quot;max-age=31536000&quot;;\n<\/div><div class=\"line\" data-line=\"13\">    add_header Access-Control-Allow-Origin &quot;*&quot;;\n<\/div><div class=\"line\" data-line=\"14\">\n<\/div><div class=\"line\" data-line=\"15\">    location ~ ^\/~(.+?)(\/.*)?$ &lbrace;\n<\/div><div class=\"line\" data-line=\"16\">            alias \/home\/$1\/public_html$2;\n<\/div><div class=\"line\" data-line=\"17\">    &rbrace;\n<\/div><div class=\"line\" data-line=\"18\">\n<\/div><div class=\"line\" data-line=\"19\">    root   \/usr\/local\/www\/dupunkto.org;\n<\/div><div class=\"line\" data-line=\"20\">    index  index.html index.htm;\n<\/div><div class=\"line\" data-line=\"21\">\n<\/div><div class=\"line\" data-line=\"22\">    error_page 404              \/404.html;\n<\/div><div class=\"line\" data-line=\"23\">    error_page 500 502 503 504  \/500.html;\n<\/div><div class=\"line\" data-line=\"24\">&rbrace;\n<\/div><\/code><\/pre>\n<h2>FTP storage<\/h2>\n<p>I also wanted everyone to have some file storage accessible over FTP and HTTP. For that, I added another <code>server<\/code>-block to the ever-growing Nginx configuration:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\">server &lbrace;\n<\/div><div class=\"line\" data-line=\"2\">    listen 80;\n<\/div><div class=\"line\" data-line=\"3\">    listen [::]:80;\n<\/div><div class=\"line\" data-line=\"4\">    server_name  ftp.dupunkto.org;\n<\/div><div class=\"line\" data-line=\"5\">\n<\/div><div class=\"line\" data-line=\"6\">    charset utf-8;\n<\/div><div class=\"line\" data-line=\"7\">\n<\/div><div class=\"line\" data-line=\"8\">    add_header Referrer-Policy &quot;no-referrer&quot;;\n<\/div><div class=\"line\" data-line=\"9\">    add_header X-Content-Type-Options &quot;nosniff&quot;;\n<\/div><div class=\"line\" data-line=\"10\">    add_header X-Frame-Options &quot;deny&quot;;\n<\/div><div class=\"line\" data-line=\"11\">    add_header Cross-Origin-Opener-Policy &quot;same-origin&quot;;\n<\/div><div class=\"line\" data-line=\"12\">    add_header Strict-Transport-Security &quot;max-age=31536000&quot;;\n<\/div><div class=\"line\" data-line=\"13\">    add_header Access-Control-Allow-Origin &quot;*&quot;;\n<\/div><div class=\"line\" data-line=\"14\">\n<\/div><div class=\"line\" data-line=\"15\">    location ~ ^\/~(.+?)(\/.*)?$ &lbrace;\n<\/div><div class=\"line\" data-line=\"16\">            alias \/home\/$1\/public_ftp$2;\n<\/div><div class=\"line\" data-line=\"17\">            autoindex on;\n<\/div><div class=\"line\" data-line=\"18\">    &rbrace;\n<\/div><div class=\"line\" data-line=\"19\">\n<\/div><div class=\"line\" data-line=\"20\">    root   \/usr\/local\/www\/ftp.dupunkto.org;\n<\/div><div class=\"line\" data-line=\"21\">\n<\/div><div class=\"line\" data-line=\"22\">    error_page 404              \/404.html;\n<\/div><div class=\"line\" data-line=\"23\">    error_page 500 502 503 504  \/500.html;\n<\/div><div class=\"line\" data-line=\"24\">&rbrace;\n<\/div><\/code><\/pre>\n<p>I haven&#8217;t yet installed the FTP server tho. Sowwy!<\/p>\n<h2>SSL<\/h2>\n<p>While the webserver is running just fine as-is, one important thing is missing: SSL. Currently, we&#8217;re only serving plain HTTP, and not HTTPS, causing our browsers to scream at us with exagerrated warnings like &#8220;This site isn&#8217;t secure, your banking details could get stolen&#8221; etc.<\/p>\n<p>To solve this, I installed <code>certbot<\/code>, a tool to automatically install and renew SSl free Let&#8217;s Encrypt certificates:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\"># pkg install py39-certbot security\/py-certbot-nginx\n<\/div><\/code><\/pre>\n<p>Simply run this to create and install the required certificates, and voilla:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\"># certbot --nginx -d dupunkto.org -d git.dupunkto.org -d ftp.dupunkto.org\n<\/div><div class=\"line\" data-line=\"2\"># sysrc weekly_certbot_enable=&quot;YES&quot;\n<\/div><\/code><\/pre>\n<h2>Firewall<\/h2>\n<p>To secure our system, I also setup a firewall. Add the following to <code>\/etc\/rc.conf<\/code>:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\">firewall_enable=&quot;YES&quot;\n<\/div><div class=\"line\" data-line=\"2\">firewall_type=&quot;workstation&quot;\n<\/div><div class=\"line\" data-line=\"3\">firewall_myservices=&quot;ssh http https&quot;\n<\/div><div class=\"line\" data-line=\"4\">firewall_allowservices=&quot;any&quot;\n<\/div><div class=\"line\" data-line=\"5\">firewall_script=&quot;\/etc\/ipfw.rules&quot;\n<\/div><\/code><\/pre>\n<p>And then configure the firewall as desired in <code>\/etc\/ipfw.rules<\/code>:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-bash\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\"><span style=\"color: #c678dd;\">#!\/bin\/sh<\/span>\n<\/div><div class=\"line\" data-line=\"2\"><span style=\"color: #d19a66;\">IPF<\/span><span style=\"color: #56b6c2;\">=<\/span><span style=\"color: #98c379;\">&quot;ipfw -q add&quot;<\/span>\n<\/div><div class=\"line\" data-line=\"3\"><span style=\"color: #61afef;\">ipfw<\/span> <span style=\"color: #e06c75;\">-q<\/span> <span style=\"color: #e06c75;\">-f<\/span> <span style=\"color: #e06c75;\">flush<\/span>\n<\/div><div class=\"line\" data-line=\"4\">\n<\/div><div class=\"line\" data-line=\"5\"><span style=\"color: #7f848e;\">#loopback<\/span>\n<\/div><div class=\"line\" data-line=\"6\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">10<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">all<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">via<\/span> <span style=\"color: #e06c75;\">lo0<\/span>\n<\/div><div class=\"line\" data-line=\"7\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">20<\/span> <span style=\"color: #e06c75;\">deny<\/span> <span style=\"color: #e06c75;\">all<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">127.0.0.0\/8<\/span>\n<\/div><div class=\"line\" data-line=\"8\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">30<\/span> <span style=\"color: #e06c75;\">deny<\/span> <span style=\"color: #e06c75;\">all<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">127.0.0.0\/8<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span>\n<\/div><div class=\"line\" data-line=\"9\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">40<\/span> <span style=\"color: #e06c75;\">deny<\/span> <span style=\"color: #e06c75;\">tcp<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">frag<\/span>\n<\/div><div class=\"line\" data-line=\"10\">\n<\/div><div class=\"line\" data-line=\"11\"><span style=\"color: #7f848e;\"># statefull<\/span>\n<\/div><div class=\"line\" data-line=\"12\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">50<\/span> <span style=\"color: #e06c75;\">check-state<\/span>\n<\/div><div class=\"line\" data-line=\"13\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">60<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">tcp<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">established<\/span>\n<\/div><div class=\"line\" data-line=\"14\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">70<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">all<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">out<\/span> <span style=\"color: #e06c75;\">keep-state<\/span>\n<\/div><div class=\"line\" data-line=\"15\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">80<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">icmp<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span>\n<\/div><div class=\"line\" data-line=\"16\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">81<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">icmp6<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span>\n<\/div><div class=\"line\" data-line=\"17\">\n<\/div><div class=\"line\" data-line=\"18\"><span style=\"color: #7f848e;\"># open port ftp (20,21), ssh (22), mail (25)<\/span>\n<\/div><div class=\"line\" data-line=\"19\"><span style=\"color: #7f848e;\"># http (80), dns (53), https (443), mosh (60000-61000)<\/span>\n<\/div><div class=\"line\" data-line=\"20\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">110<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">tcp<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #d19a66;\">21<\/span> <span style=\"color: #e06c75;\">in<\/span>\n<\/div><div class=\"line\" data-line=\"21\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">120<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">tcp<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #d19a66;\">21<\/span> <span style=\"color: #e06c75;\">out<\/span>\n<\/div><div class=\"line\" data-line=\"22\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">130<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">tcp<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #d19a66;\">22<\/span> <span style=\"color: #e06c75;\">in<\/span>\n<\/div><div class=\"line\" data-line=\"23\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">140<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">tcp<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #d19a66;\">22<\/span> <span style=\"color: #e06c75;\">out<\/span>\n<\/div><div class=\"line\" data-line=\"24\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">150<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">tcp<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #d19a66;\">25<\/span> <span style=\"color: #e06c75;\">in<\/span>\n<\/div><div class=\"line\" data-line=\"25\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">160<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">tcp<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #d19a66;\">25<\/span> <span style=\"color: #e06c75;\">out<\/span>\n<\/div><div class=\"line\" data-line=\"26\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">170<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">udp<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #d19a66;\">53<\/span> <span style=\"color: #e06c75;\">in<\/span>\n<\/div><div class=\"line\" data-line=\"27\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">175<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">tcp<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #d19a66;\">53<\/span> <span style=\"color: #e06c75;\">in<\/span>\n<\/div><div class=\"line\" data-line=\"28\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">180<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">udp<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #d19a66;\">53<\/span> <span style=\"color: #e06c75;\">out<\/span>\n<\/div><div class=\"line\" data-line=\"29\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">185<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">tcp<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #d19a66;\">53<\/span> <span style=\"color: #e06c75;\">out<\/span>\n<\/div><div class=\"line\" data-line=\"30\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">200<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">tcp<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #d19a66;\">80<\/span> <span style=\"color: #e06c75;\">in<\/span>\n<\/div><div class=\"line\" data-line=\"31\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">210<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">tcp<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #d19a66;\">80<\/span> <span style=\"color: #e06c75;\">out<\/span>\n<\/div><div class=\"line\" data-line=\"32\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">220<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">tcp<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #d19a66;\">443<\/span> <span style=\"color: #e06c75;\">in<\/span>\n<\/div><div class=\"line\" data-line=\"33\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">230<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">tcp<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #d19a66;\">443<\/span> <span style=\"color: #e06c75;\">out<\/span>\n<\/div><div class=\"line\" data-line=\"34\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">300<\/span> <span style=\"color: #e06c75;\">allow<\/span> <span style=\"color: #e06c75;\">udp<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">60000-61000<\/span>\n<\/div><div class=\"line\" data-line=\"35\">\n<\/div><div class=\"line\" data-line=\"36\"><span style=\"color: #7f848e;\"># deny and log everything<\/span>\n<\/div><div class=\"line\" data-line=\"37\"><span style=\"color: #abb2bf;\">$<\/span><span style=\"color: #d19a66;\">IPF<\/span> <span style=\"color: #d19a66;\">500<\/span> <span style=\"color: #e06c75;\">deny<\/span> <span style=\"color: #e06c75;\">log<\/span> <span style=\"color: #e06c75;\">all<\/span> <span style=\"color: #e06c75;\">from<\/span> <span style=\"color: #e06c75;\">any<\/span> <span style=\"color: #e06c75;\">to<\/span> <span style=\"color: #e06c75;\">any<\/span>\n<\/div><\/code><\/pre>\n<p>And then finally, start the services:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\"># service start ipfw\n<\/div><div class=\"line\" data-line=\"2\"># service start fcgiwrap\n<\/div><div class=\"line\" data-line=\"3\"># service start nginx\n<\/div><\/code><\/pre>\n<h2>Conclusion<\/h2>\n<p>So that&#8217;s how I setup my server. I think this post is already way too long, so I&#8217;ll leave the CardDAV server (Radicale) and Miniflux instance for another time.<\/p>\n<p>I had a lot of fun setting this up, and I hope this post will help someone else.<\/p><\/div>","date_published":"2024-02-15T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/good-movies","title":"Movies and Limited Series","url":"https:\/\/geheimesite.nl\/blog\/good-movies","content_html":"<div><p>So lately I&#8217;ve been watching a lot of Netflix.<\/p>\n<p>Generally, I&#8217;m not the kind of person that consumes a lot of media. I&#8217;d rather make things; I find creating things way more satisfying.<\/p>\n<p>However, I got a bit burned out in terms of ideas&#8212;I didn&#8217;t know what to build&#8212; energy, and time (school am I right \u2728). So, instead I spent about 20 hours of my life staring at a screen, looking at fictional characters living their almost perfect made-up lives.<\/p>\n<p>Anyways, I really enjoyed these in particular:<\/p>\n<ul>\n<li>After<\/li>\n<li>Tick, tick\u2026 BOOM!<\/li>\n<li>Heartstopper<\/li>\n<li>Inventing Anna<\/li>\n<li>Bohemian Rhapsody<\/li>\n<li>Love, Rosie<\/li>\n<li>Friends with Benefits<\/li>\n<li>Lady Chatterley&#8217;s Lover<\/li>\n<li>The Girl Nextdoor<\/li>\n<li>Queen&#8217;s Gambit<\/li>\n<li>Don&#8217;t Look Up<\/li>\n<li>Dirty Lines<\/li>\n<li>The Social Network<\/li>\n<li>The Playlist<\/li>\n<li>The Social Dilemma<\/li>\n<li>Yesterday<\/li>\n<li>I Used to Be Famous<\/li>\n<li>We Are the Wave<\/li>\n<\/ul>\n<p>I really enjoyed the miniseries in particular; it allows the filmmaker to tell a more detailed story, yet it doesn&#8217;t require as much time (and commitment) to watch, as opposed to, for example, a 7-season-long show.<\/p>\n<p>A movie feels short when you&#8217;re used to a series. But that&#8217;s part of the appeal I think. A movie doesn&#8217;t try to suck you in, like a series does. It just tells a story.<\/p>\n<p><small>I wrote this a while back (somewhere fall last year), but I forgot to publish it. I found the draft yesterday. Also, a lot of movies listed above share one common theme: they&#8217;re all semi-related to the reproductive system; I&#8217;m a teenager, after all ;)<\/small><\/p><\/div>","date_published":"2024-02-07T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/gpt","title":"The role of generative AI in writing","url":"https:\/\/geheimesite.nl\/blog\/gpt","content_html":"<div><p>Since its introduction a little more than a year ago, we&#8217;ve been discussing ChatGPT a lot at school. It&#8217;s an interesting topic, for sure. How can it be used in school? By students or teachers? Is using AI cheating? Will it interfere with the development of writing skills or help? Should it be used at all?<\/p>\n<p>Generally, we seem to have the urge to ban upcoming technologies that radically change things. Indeed, I&#8217;ve repeatedly heard people call to ban use of generative AI, calling it plagiarism and fraud. However, like everything, the matter is more nuanced than seems to be the case at first sight. Even if we were to completely ban generative AI, enforcing a ban like that will prove harder and harder the further models like GPT evolve. Besides, it probably won&#8217;t restrain students from using models like them. Therefore, we should think about and discuss how we could properly integrate AI models into our writing.<\/p>\n<p>With that in mind, here are some of the primary takeaways after using ChatGPT on-and-off for about a year.<\/p>\n<p>ChatGPT is&#8212;mistakenly&#8212;mainly used to <em>generate<\/em> prose. However, the prose it generates is mediocre; it&#8217;s dull and repetitive. Moreover,&#8212;even tho OpenAI tries to prevent it&#8212;the model hallucinates fairly often. This means nothing it generates can be trusted to be factually correct.<\/p>\n<p>Instead, it is way more powerful as a tool to edit and transform language. As Linus wrote a while back:<\/p>\n<blockquote cite=\"https:\/\/thesephist.com\/posts\/latent\/\">\n  <p>\n    Not &#8220;computers can complete text prompts, now what?&#8221; but\n    &#8220;computers can understand language, now what?&#8221;\n  <\/p>\n<\/blockquote>\n<p>The AI models are unable to understand what they are writing about. They&#8217;re only selecting words that sound plausible given the context of their training data and the prompt. But they do know grammar, spelling, and essay structure. That&#8217;s where their strength lies. Not the ability to generate okay-sounding essays, but their ability to understand and transform language. Use it to your advantage.<\/p>\n<p>Instead of prompting &#8220;can you generate an argumentative essay on the role of religion in public schools&#8221;, we should prompt things like &#8220;can you rewrite this paragraph to be more academic&#8221; or &#8220;can you show me alternatives to this sentence&#8221;.<\/p>\n<p>ChatGPT and similar models are not a threat to writing. Instead, they are merely new tools that can&#8212;if utilized correctly&#8212;further improve our writing. The impact they will have is purely defined by how we use them.<\/p>\n<p><small>*this post was written by me, but edited and <a href=\"https:\/\/languagetool.org\">checked for grammar mistakes<\/a> using AI.<\/small><\/p>\n<details>\n  <summary>Extras<\/summary>\n  <p>Some additional notes:<\/p>\n  <ul>\n    <li>\n      LLMs are best used in combination with existing tools, like\n      <a href=\"https:\/\/jsomers.net\/blog\/dictionary\">a good dictionary<\/a>,\n      thesaurus, and spell checkers.\n    <\/li>\n    <li>\n      It&#8217;s really a bit silly to call this category of AI\n      &#8220;generative&#8221;, because (in my opinion) that&#8217;s the\n      thing they&#8217;re worst at.\n    <\/li>\n    <li>\n      While not really related to this topic, the\n      <a href=\"https:\/\/thesephist.com\/posts\/latent\/\">\n        post I quoted from Linus<\/a>\n      is great and you should definitely read it!\n    <\/li>\n  <\/ul>\n<\/details><\/div>","date_published":"2024-01-23T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/stupid-terminology","title":"Stop saying \"users\" and \"content\"","url":"https:\/\/geheimesite.nl\/blog\/stupid-terminology","content_html":"<div><p>Terminology like <em>users<\/em> and <em>content<\/em> is demeaning and hurtful.<\/p>\n<p>Artists aren&#8217;t creating <em>content<\/em> to populate our datasets&#8212;they&#8217;re creating movies, music, essays, drawings, games, paintings. Labeling a work that someone created, out of passion and love, <em>content<\/em>, is frankly disrespectful. It reduces the creative work from something beautiful to merely another piece of <em>content<\/em>, and greatly undervalues the effort and skill necessary to create it.<\/p>\n<p>Likewise, calling people <em>users<\/em>, dehumanizes them. It turns them into a mere datapoint, or worse, an asset to be exploited.<\/p>\n<blockquote>\n  <p>\n    There are only two industries that call their customers &#8220;users&#8221;:<br>\n    illegal drugs and software.\n  <\/p>\n<p>&#8212;<cite>Edward Tufte<\/cite><\/p>\n<\/blockquote>\n<p>Terms like these shift focus away from the humans in the equation. Language is the lense through which we see the world. Use it wisely.<\/p><\/div>","date_published":"2024-01-15T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/symptom-relief","title":"Banning phones is not solving anything","url":"https:\/\/geheimesite.nl\/blog\/symptom-relief","content_html":"<div><p>A few days ago, I posted some of my thoughts regarding the new mobile phone ban in high schools in the Netherlands. I want to add a few more things:<\/p>\n<p>I think the fundamental problem is not the phones themselves. Why are phones distracting? Push notifications and FOMO. <em>The phones are not the problem, social media is<\/em>. And because we failed to properly regulate social media, phones are getting banned.<\/p>\n<p>The ban is a prime example of symptom relief. The government is doing nothing to actually address the problem; all they&#8217;re doing is prohibiting the manifestation. The ban will <em>not<\/em> help students overcome their addiction. Neither is the ban preventing social media use and all the problems than come with it; students are simply going to use different devices to access their beloved Snapchat selfies.<\/p><\/div>","date_published":"2024-01-14T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/phones-banned","title":"Thoughts on the mobile phone ban","url":"https:\/\/geheimesite.nl\/blog\/phones-banned","content_html":"<div><p>Last month the Dutch government announced that from next year on mobile phones will be banned in high school. As a student who is currently in high school, I think it&#8217;s a fundamentally good development, but the media attention around it just feels wrong.<\/p>\n<p>The news is full of items of cherry-picked comments from teenagers who feel &#8220;relieved&#8221; because they &#8220;finally talk to each other&#8221;. But also teenagers who are sad because &#8220;they won&#8217;t have any memories of high school if they can&#8217;t take photos&#8221;. They present a greatly exaggerated story praising this measure the government imposed to protect the youth against themselves.<\/p>\n<p>It&#8217;s all so over the top. Contrary to popular belief, teenagers <em>do<\/em> talk to each other, even in the presence of a mobile  phone. In breaks, we play card games like Uno and Bullshit. We read books. We complain about how stupid school and homework is. You know, normal stuff. And our phones have a place too. Sometimes we play mobile games in the break, like <a href=\"https:\/\/www.evilapples.com\">Evil Apples<\/a> or <a href=\"https:\/\/garticphone.com\">Gartic Phone<\/a>. But  that&#8217;s still something we do <em>together<\/em>.<\/p>\n<p>And, yes, phones are distracting. Yes, they cause mayhem from time to time. Yes, social media is shit. I am very much aware. But all of that is also true for adults. These devices and the apps on them are made to be extremely addictive, it&#8217;s their fucking business model. It&#8217;s not just teenagers who get addicted. And it&#8217;s certainly not our fault that we get addicted. Even the people who built these apps in the first place, who know exactly how they work and what tricks are used to exploit our psychology, they still <a href=\"https:\/\/thesocialdilemma.com\">aren&#8217;t able to restrain themselves<\/a>. Adults aren&#8217;t magically immune.<\/p>\n<p>It feels like it&#8217;s a bunch of grey birds going &#8220;kids these days&#8230;&#8221;, &#8220;you can&#8217;t get off your phones, and now we&#8217;re going to take them away&#8221;, &#8220;it&#8217;s for your own good!&#8221; and then continuing to celebrate on social media. Hypocrisy at its peak.<\/p>\n<p>So yes, I think it&#8217;s great that phones have been banned in high schools. The next step would be everywhere else (and especially the parlement).<\/p>\n<details>\n  <summary>Extras<\/summary>\n  <p>Some other notes:<\/p>\n  <ul>\n    <li>\n      <p>\n        Schools spent years digitizing everything. Schedules, grades,\n        homework, study materials and more are now all exclusively\n        available in web applications. They made this move with the\n        assumption that these platforms would always be accessible for\n        students via their mobile phone (a wrong assumption by the way,\n        because this excludes students like myself that would rather\n        leave their phone at home). How are schools going to deal with\n        this?\n      <\/p>\n    <\/li>\n    <li>\n      <p>\n        How are schools going to enforce this? They&#8217;ve been burdened\n        with enough additional administrative tasks already. And what\n        even counts as a mobile phone?\n        <del>\n          Do all mobile devices count? What about my iPad? Or an old\n          iPod Touch? My DIY Raspberry Pi Zero project with a\n          rectangular touch screen? And what if it were a square\n          instead? And what about smartwatches? They can TikTok too.\n          Does every portable device with an internet connection fall\n          under this new law?\n        <\/del>\n      <\/p>\n      <p>\n        <ins>\n          Update: I read the law on rijksoverheid.nl and they include\n          &#8220;smartphones&#8221;, &#8220;tablets&#8221;, and &#8220;smartwatches&#8221;.\n          <em>However<\/em>, they do not provide a definition for these\n          terms. Disappointing.\n        <\/ins>\n      <\/p>\n    <\/li>\n  <\/ul>\n<\/details><\/div>","date_published":"2024-01-08T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/search-engine","title":"My own Search Engine..?","url":"https:\/\/geheimesite.nl\/blog\/search-engine","content_html":"<div><p>Is it just me, or have search results gotten <a href=\"https:\/\/dkb.blog\/p\/google-search-is-dying\">really<\/a> <a href=\"https:\/\/thejollyteapot.com\/2022\/02\/16\/google-search-isn-t-very-good-and-yet-still-the-best-around\">shitty<\/a>? When I search for something, the only <em>fucking<\/em> results that I get are AI generated SEO bullshit. And I&#8217;m done with it.<\/p>\n<p>I have been thinking about what I want a search engine to do. It should do basically this:<\/p>\n<ul>\n<li>\n<p>Search Wikipedia. <a href=\"https:\/\/en.wikipedia.org\/wiki\/Wikipedia:Database_download#English-language_Wikipedia\">Apparently you can download the entirety of (English) Wikipedia in just 19GB<\/a> (compressed). This is excluding any page history\/talk pages, and the dump doesn&#8217;t contain media. But still, 19GB is not that much. It expands to around 90GB, but I think that&#8217;s manageable if I run it on a local server.<\/p>\n<\/li>\n<li>\n<p>Crawl and index Stack Exchange sites. Think Stack Overflow, Server Fault, Super User, Unix & Linux, Mathematics, and Ask Ubuntu.<\/p>\n<\/li>\n<li>\n<p>Optionally record my browsing history via a browser extension. This should be optional and contain a blacklist containing domains that shouldn&#8217;t be recorded &#8212; like search pages. Results from my own browser history should be less prominent.<\/p>\n<\/li>\n<li>\n<p>Crawl websites on the small web. If you&#8217;re wondering what the heck I&#8217;m talking about, this explanation from <a href=\"https:\/\/www.marginalia.nu\/marginalia-search\">Marginalia Search<\/a> describes it pretty well:<\/p>\n<blockquote>\n<p>Remember when you used to explore the Internet, when you used to discover cool little websites made by people and it wasn\u2019t just a bunch of low effort content mill listicles and blog spam?<br>\nIn recent years, something has been simmering: Some call it the \u201cSmall Internet\u201d. I hesitate to call it a movement, that would imply a level of organization and intent that it does not possess. It\u2019s a disjointed group of like-minded people that recognize that the Internet has lost a certain je ne sais quoi, it has turned from a wild and creative space, into more of shopping mall. Where ever you go, you\u2019re prodded to subscribe to newsletters, to like and comment, to buy stuff.<\/p>\n<\/blockquote>\n<p>There&#8217;s a bunch of small indexes and search engines like this. I was planning to curate my own index, based on existing indexes. There should also be an option for people to submit sites.<\/p>\n<\/li>\n<li>\n<p>Index some prominent Linux-oriented wikis, like the Arch Wiki and Gentoo Wiki. They seem to run the same wiki software as Wikipedia, so maybe they have a download option as well?<\/p>\n<\/li>\n<li>\n<p>Searching man pages and RFCs seems cool?<\/p>\n<\/li>\n<li>\n<p>Support for bangs, like DuckDuckGo. I&#8217;d want <code>!g<\/code> for Whoogle results and <code>!y<\/code> for YouTube.<\/p>\n<\/li>\n<\/ul>\n<p>This hypothetical search engine would be mainly for personal use, but I wouldn&#8217;t mind putting it on a public domain if I were to build it.<\/p><\/div>","date_published":"2023-11-17T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/the-beginning","title":"The Beginning","url":"https:\/\/geheimesite.nl\/blog\/the-beginning","content_html":"<div><p>The dawn of the universe is a paradox. There are two ways to explain it:<\/p>\n<ul>\n<li>\n<p>The universe has a beginning. Something initiated the universe, which raises the question: how did that thing get there? And if there was no thing&#8212;the universe sprung from nothing&#8212;how can all be made from none?<\/p>\n<\/li>\n<li>\n<p>The universe has no beginning&#8212;it has always existed in some form or capacity. This seems contradictory: how can everything exist forever? All this <em>stuff<\/em> must come from somewhere, right?<\/p>\n<\/li>\n<\/ul>\n<p>Saying you know the truth of the origin of the universe is lying to yourself. Nobody knows &#8212; and nobody will ever know. We simply can&#8217;t grasp the very beginning; it&#8217;s too contradictory. It&#8217;s all-encompassing&#8212;too immense for a single human being to fathom.<\/p>\n<p>We must learn to live with the fact that we might never know the truth to some things. And I know, that&#8217;s hard. It means letting go of the little grip we have on reality. But ultimately, it&#8217;s the only real answer we have. <em>We don&#8217;t know, and that&#8217;s okay.<\/em><\/p><\/div>","date_published":"2023-11-09T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/thinking-about-tilde","title":"Thinking about running a tilde\/pubnix","url":"https:\/\/geheimesite.nl\/blog\/thinking-about-tilde","content_html":"<div><p>I&#8217;m thinking about running my own pubnix\/tilde. It would be invite-only and have a bunch of cool things:<\/p>\n<ul>\n<li>git hosting with cgit or sourcehut<\/li>\n<li>gemini hosting<\/li>\n<li>web hosting<\/li>\n<li>gopher hosting<\/li>\n<li>FTP access<\/li>\n<li>about 2GB of storage<\/li>\n<li>matrix accounts + chat portal (Hydrogen seems cool)<\/li>\n<li>internal message board\/email?<\/li>\n<li>maybe a CardDAV server?<\/li>\n<\/ul>\n<p>I think it would be a very cool opportunity to learn a bit about Linux and the internet. However, I literally have <em>no clue<\/em> how to set this up. I found this comment on Reddit:<\/p>\n<blockquote>\n<p>It happens that you&#8217;re trying to build a tilde\/pubnix? From my experience, tilde admins often give direct access to the system, but with proper permission elevation. Create a user group with limited permission (i.e. no sudo, disable specific softwares) and add their usernames to, give them a space in \/home. Secondly, disable SSH password, ask them to send you their public keys and only authenticate via public key. Finally, write a good\/strict policy but also send welcoming message. Also, you can look for further security practices, like changing default port, etc. but the key thing is proper user permission.<\/p>\n<\/blockquote>\n<p>That&#8217;s what I want. I was thinking about allowing password logins tho. I already have a VPS, which I want to reinstall to turn into this thing.<\/p>\n<p>I basically want to configure the services in a way, that they all depend on Unix accounts. That way I can create a Unix account with suitable permissions for every member, and shit should Just Work(tm).<\/p>\n<p>So, I was thinking:<\/p>\n<ul>\n<li>Exposing all git repos in <code>~\/git\/<\/code> at the URL <code>http(s):\/\/git.example.com\/~user\/<\/code> (using cgit) and <code>gemini:\/\/git.example.com\/~user\/<\/code> (using git.gmi)<\/li>\n<li>Exposing <code>~\/pub\/gem\/<\/code> at <code>gemini:\/\/example.com\/~user\/<\/code><\/li>\n<li>Exposing <code>~\/pub\/web\/<\/code> at <code>http(s):\/\/example.com\/~user\/<\/code><\/li>\n<li>Exposing <code>~\/pub\/goph\/<\/code> at <code>gopher:\/\/example.com\/~user\/<\/code><\/li>\n<li>Creating <code>@user:example.com<\/code> matrix account with the same password as Unix. Changing the Unix password will also change the matrix password and changing the password from a matrix client should not be allowed.<\/li>\n<li>Hosting Hydrogen (matrix client) at <code>https:\/\/chat.example.com<\/code><\/li>\n<li>Maybe host a CardDAV server with an account for every member, similar to what I want for matrix?<\/li>\n<li>Maybe a Lemmy instance (with mlmym as frontend), same thing with accounts.<\/li>\n<\/ul>\n<p>Any pointers on how to setup something like this? How would I handle backups? (I know I can just backup all files in every member&#8217;s home directory, but how would I handle something more complicated, like the matrix accounts?). How would I make something like this secure?<\/p>\n<section class=\"box\">\n  <p><b>Edit<\/b>: I found <a href=\"https:\/\/edwinwenink.xyz\/posts\/47-tilde_server\">a similar article by Edwin Wenink<\/a> that helps a lot, but it doesn\u2019t tell me how to do permissions, limiting home directory size and bandwidth. I guess I won\u2019t really need those (because this is gonna be <em>really<\/em> small scale), but I like the idea that someone can\u2019t just accidentally use up all bandwidth with a wrong command.<\/p>\n<\/section><\/div>","date_published":"2023-10-23T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/writing-my-own-ssg","title":"Writing my own SSG","url":"https:\/\/geheimesite.nl\/blog\/writing-my-own-ssg","content_html":"<div><p>A few days ago, I discovered the Gemini protocol. I heard about it a while back already, but I didn&#8217;t pay that much attention and failed to notice it.<\/p>\n<p>So, naturally, I was REALLY excited about this cool new toy. I downloaded about four different clients\/browsers to see which one I liked the best (it turned out to be <a href=\"https:\/\/gmi.skyjake.fi\/lagrange\/\">Lagrange<\/a>), and immediately thought about porting my website to it. Small problem however: my site is built using <a href=\"https:\/\/gohugo.io\">Hugo<\/a>.<\/p>\n<p>And I <em>love<\/em> Hugo. It&#8217;s fast. It&#8217;s easy. It&#8217;s powerful. It&#8217;s fast. Did I mention that it&#8217;s fast? However, Hugo is also really centered around HTML files. And to make matters worse, my site is really complicated. It interacts with multiple things on <code>api.geheimesite.nl<\/code>, renders RSS feeds, downloads images, does fancy resource things.<\/p>\n<p>In short, porting it over was gonna be <em>really hard<\/em>. So, instead of breaking my brain over porting my primary website, I took a look at my blog. Just like my website, my blog is built using Hugo. Because I do really like Hugo a lot. So, after a quick bit of Googling, I found out that I could <a href=\"https:\/\/sylvaindurand.org\/gemini-and-hugo\/\">add an output to Hugo<\/a>. But what would be the fun of that, eh?<\/p>\n<p>And to be honest, I&#8217;ve been wanting to build another blog for a while now. Actually, I already bought a domain for it 4 months back. Initially, I built it like a text-based system. I wrote a little PHP script that handled the HTTP <code>PUT<\/code> verb, which meant I could do cool things like this:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-plaintext\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\">curl http:\/\/example.com\/essay.txt --upload-file essay.txt -u robin:password\n<\/div><\/code><\/pre>\n<p>All files would be served as <code>text\/plain<\/code>, and hyperlinks would be added on separate lines, where you could easily copy and paste them. Sounds familiar, right?<\/p>\n<p>I also got very hyped when I found <a href=\"https:\/\/notebook.wesleyac.com\">Wesley&#8217;s notebook<\/a> a while back. It&#8217;s such a simple, sleek and beautiful website. And the cool thing is that he completely wrote the thing using POSIX-complaint shell scripts, with almost no dependencies. In addition to one of the prettiest designs I&#8217;ve seen in a while, it also has a bunch of cool features:<\/p>\n<ul>\n<li>Deep linking<\/li>\n<li>Very cool 404 page<\/li>\n<li>Images are automatically compressed<\/li>\n<li>Builtin <code>git<\/code> history with links to diffs<\/li>\n<\/ul>\n<p>So, of course, I decided to create a new blog. And not just that, I wanted to build my own static site generator, just like Wesley did. So, I spent my weekend cooking up this little project.<\/p>\n<p>How does one build a SSG, you might ask? Well, it&#8217;s actually fairly simple, because a lot of the building blocks are already out there. For my project, I chose the <a href=\"https:\/\/shopify.github.io\/liquid\/\">Liquid templating language<\/a>. Luckily, there&#8217;s already an amazing Javascript library for using Liquid out there, called <a href=\"https:\/\/liquidjs.com\">LiquidJS<\/a>. The same goes for <a href=\"https:\/\/www.npmjs.com\/package\/js-yaml\">YAML parsing<\/a> and Markdown (using <a href=\"https:\/\/github.com\/audiodude\/gemdown\">gemdown<\/a> and <a href=\"https:\/\/marked.js.org\">marked<\/a> respectively).<\/p>\n<p>Consequently, after glueing together a bunch of libraries that other people wrote, I ended up with something like this:<\/p>\n<pre class=\"athl\" style=\"color: #abb2bf; background-color: #282c34;\"><code class=\"language-javascript\" translate=\"no\" tabindex=\"0\"><div class=\"line\" data-line=\"1\"><span style=\"color: #7f848e;\">\/\/ This code snippet is greatly simplied,<\/span>\n<\/div><div class=\"line\" data-line=\"2\"><span style=\"color: #7f848e;\">\/\/ but the general flow is like this.<\/span>\n<\/div><div class=\"line\" data-line=\"3\">\n<\/div><div class=\"line\" data-line=\"4\"><span style=\"color: #c678dd;\">let<\/span> <span style=\"color: #e06c75;\">globalVariables<\/span> <span style=\"color: #56b6c2;\">=<\/span> <span style=\"color: #61afef;\">readGlobalConfigFile<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"5\">\n<\/div><div class=\"line\" data-line=\"6\"><span style=\"color: #c678dd;\">let<\/span> <span style=\"color: #e06c75;\">contentFiles<\/span> <span style=\"color: #56b6c2;\">=<\/span> \n<\/div><div class=\"line\" data-line=\"7\">  <span style=\"color: #61afef;\">getAllFilesWithExtension<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #98c379;\">&quot;.txt&quot;<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #61afef;\">map<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">mergeFrontmatterWithGlobalVariables<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"8\">\n<\/div><div class=\"line\" data-line=\"9\"><span style=\"color: #c678dd;\">for<\/span> <span style=\"color: #c678dd;\">(<\/span><span style=\"color: #c678dd;\">const<\/span> <span style=\"color: #e06c75;\">output<\/span> <span style=\"color: #c678dd;\">in<\/span> <span style=\"color: #61afef;\">directoriesIn<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #98c379;\">&quot;templates&quot;<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #c678dd;\">)<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"10\">  <span style=\"color: #c678dd;\">let<\/span> <span style=\"color: #e06c75;\">template<\/span> <span style=\"color: #56b6c2;\">=<\/span> <span style=\"color: #61afef;\">parseDefaultTemplateFor<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">output<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"11\">  <span style=\"color: #c678dd;\">let<\/span> <span style=\"color: #e06c75;\">pages<\/span> <span style=\"color: #56b6c2;\">=<\/span> <span style=\"color: #c678dd;\">[<\/span><span style=\"color: #c678dd;\">]<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"12\">\n<\/div><div class=\"line\" data-line=\"13\">  <span style=\"color: #c678dd;\">for<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">file<\/span> <span style=\"color: #c678dd;\">in<\/span> <span style=\"color: #e06c75;\">files<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #61afef;\">filter<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">f<\/span><span style=\"color: #c678dd;\">)<\/span> <span style=\"color: #56b6c2;\">=&gt;<\/span> <span style=\"color: #56b6c2;\">!<\/span><span style=\"color: #61afef;\">isIndex<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">f<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #c678dd;\">)<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"14\">    <span style=\"color: #c678dd;\">let<\/span> <span style=\"color: #e06c75;\">destPath<\/span> <span style=\"color: #56b6c2;\">=<\/span> <span style=\"color: #61afef;\">generateDestinationPath<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">file<\/span><span style=\"color: #abb2bf;\">,<\/span> <span style=\"color: #e06c75;\">path<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #61afef;\">extname<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">template<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e06c75;\">path<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"15\">    <span style=\"color: #c678dd;\">let<\/span> <span style=\"color: #e06c75;\">parsedMarkdown<\/span> <span style=\"color: #56b6c2;\">=<\/span> <span style=\"color: #61afef;\">parseMarkdown<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">template<\/span><span style=\"color: #abb2bf;\">,<\/span> <span style=\"color: #61afef;\">getContent<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">file<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"16\">    <span style=\"color: #c678dd;\">let<\/span> <span style=\"color: #e06c75;\">variables<\/span> <span style=\"color: #56b6c2;\">=<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span> <span style=\"color: #e06c75;\">url<\/span><span style=\"color: #abb2bf;\">:<\/span> <span style=\"color: #e06c75;\">destPath<\/span><span style=\"color: #abb2bf;\">,<\/span> <span style=\"color: #e06c75;\">content_rendered<\/span><span style=\"color: #abb2bf;\">:<\/span> <span style=\"color: #e06c75;\">parsedMarkdown<\/span><span style=\"color: #abb2bf;\">,<\/span> <span style=\"color: #56b6c2;\">...<\/span><span style=\"color: #e06c75;\">variables<\/span> <span style=\"color: #c678dd;\">&rbrace;<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"17\">\n<\/div><div class=\"line\" data-line=\"18\">    <span style=\"color: #e06c75;\">pages<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #61afef;\">append<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">variables<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"19\">\n<\/div><div class=\"line\" data-line=\"20\">    <span style=\"color: #c678dd;\">let<\/span> <span style=\"color: #e06c75;\">finalContent<\/span> <span style=\"color: #56b6c2;\">=<\/span> <span style=\"color: #61afef;\">renderTemplate<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">template<\/span><span style=\"color: #abb2bf;\">,<\/span> <span style=\"color: #e06c75;\">variables<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"21\">    <span style=\"color: #61afef;\">writeToFile<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">finalContent<\/span><span style=\"color: #abb2bf;\">,<\/span> <span style=\"color: #e06c75;\">output<\/span><span style=\"color: #abb2bf;\">,<\/span> <span style=\"color: #e06c75;\">destPath<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"22\">  <span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"23\">  \n<\/div><div class=\"line\" data-line=\"24\">  <span style=\"color: #c678dd;\">for<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">file<\/span> <span style=\"color: #c678dd;\">in<\/span> <span style=\"color: #e06c75;\">files<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #61afef;\">filter<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">f<\/span><span style=\"color: #c678dd;\">)<\/span> <span style=\"color: #56b6c2;\">=&gt;<\/span> <span style=\"color: #56b6c2;\">!<\/span><span style=\"color: #61afef;\">isIndex<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">f<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #c678dd;\">)<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"25\">    <span style=\"color: #c678dd;\">let<\/span> <span style=\"color: #e06c75;\">destPath<\/span> <span style=\"color: #56b6c2;\">=<\/span> <span style=\"color: #61afef;\">generateDestinationPath<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">file<\/span><span style=\"color: #abb2bf;\">,<\/span> <span style=\"color: #e06c75;\">path<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #61afef;\">extname<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">template<\/span><span style=\"color: #abb2bf;\">.<\/span><span style=\"color: #e06c75;\">path<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"26\">    <span style=\"color: #c678dd;\">let<\/span> <span style=\"color: #e06c75;\">parsedMarkdown<\/span> <span style=\"color: #56b6c2;\">=<\/span> <span style=\"color: #61afef;\">parseMarkdown<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">template<\/span><span style=\"color: #abb2bf;\">,<\/span> <span style=\"color: #61afef;\">getContent<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">file<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"27\">    <span style=\"color: #c678dd;\">let<\/span> <span style=\"color: #e06c75;\">variables<\/span> <span style=\"color: #56b6c2;\">=<\/span> <span style=\"color: #c678dd;\">&lbrace;<\/span> <span style=\"color: #e06c75;\">url<\/span><span style=\"color: #abb2bf;\">:<\/span> <span style=\"color: #e06c75;\">destPath<\/span><span style=\"color: #abb2bf;\">,<\/span> <span style=\"color: #e06c75;\">content_rendered<\/span><span style=\"color: #abb2bf;\">:<\/span> <span style=\"color: #e06c75;\">parsedMarkdown<\/span><span style=\"color: #abb2bf;\">,<\/span> <span style=\"color: #e06c75;\">pages<\/span><span style=\"color: #abb2bf;\">:<\/span> <span style=\"color: #e06c75;\">pages<\/span><span style=\"color: #abb2bf;\">,<\/span> <span style=\"color: #56b6c2;\">...<\/span><span style=\"color: #e06c75;\">variables<\/span> <span style=\"color: #c678dd;\">&rbrace;<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"28\">\n<\/div><div class=\"line\" data-line=\"29\">    <span style=\"color: #c678dd;\">let<\/span> <span style=\"color: #e06c75;\">finalContent<\/span> <span style=\"color: #56b6c2;\">=<\/span> <span style=\"color: #61afef;\">renderTemplate<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">template<\/span><span style=\"color: #abb2bf;\">,<\/span> <span style=\"color: #e06c75;\">variables<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"30\">    <span style=\"color: #61afef;\">writeToFile<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">finalContent<\/span><span style=\"color: #abb2bf;\">,<\/span> <span style=\"color: #e06c75;\">output<\/span><span style=\"color: #abb2bf;\">,<\/span> <span style=\"color: #e06c75;\">destPath<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"31\">  <span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><div class=\"line\" data-line=\"32\">\n<\/div><div class=\"line\" data-line=\"33\">  <span style=\"color: #61afef;\">copyOverStaticFiles<\/span><span style=\"color: #c678dd;\">(<\/span><span style=\"color: #e06c75;\">output<\/span><span style=\"color: #c678dd;\">)<\/span><span style=\"color: #abb2bf;\">;<\/span>\n<\/div><div class=\"line\" data-line=\"34\"><span style=\"color: #c678dd;\">&rbrace;<\/span>\n<\/div><\/code><\/pre>\n<p>Yup. It&#8217;s that simple.<\/p>\n<p>I settled on calling it <code>chop<\/code>, because I hoped it would be semi-fast (in dutch &#8220;chop chop&#8221; is a way to tell someone to speed things up).<\/p>\n<p>The initial version has these features:<\/p>\n<ul>\n<li>A global config file<\/li>\n<li>Front Matter<\/li>\n<li>Liquid templates<\/li>\n<li>Static files<\/li>\n<li>Multiple outputs (HTML, gemtext, RSS etc.)<\/li>\n<li>Smartypants punctuation<\/li>\n<li>Automatic image compression<\/li>\n<li>Render content as liquid templates\n(which allows you to use variables and partials in content)<\/li>\n<li>Prefixing relative URLs (in content).<\/li>\n<\/ul>\n<p>But I&#8217;m planning to add quite a bit more:<\/p>\n<ul>\n<li>Syntax highlighting<\/li>\n<li>Automatic hashes in filenames for CSS<\/li>\n<li>Integration with <code>git<\/code> (for file history)<\/li>\n<\/ul>\n<p>I&#8217;m not building this to be extendible or modular. Instead, this should stay a relatively simple script that just does what <em>I<\/em> want it to do. If <em>you<\/em> want to build something else, go for it!<\/p>\n<p>So yea. Writing <code>chop<\/code> was quite fun, and I&#8217;m definitely happy with the end result!<\/p>\n<p><a class=\"button\" href=\"https:\/\/git.dupunkto.org\/~axcelott\/chop\">Soure code<\/a><\/p><\/div>","date_published":"2023-10-16T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/introduction","title":"Introduction","url":"https:\/\/geheimesite.nl\/blog\/introduction","content_html":"<div><p>Hi. So, you stumbled upon my blog, cool.<\/p>\n<p>I&#8217;m a random teenager from the Netherlands, and this is my little corner of the internet.<\/p>\n<p>I post little notes about my life here. I made this site because I love minimalism and the initial idea of the web: a giant library of knowledge. This is my lil&#8217; corner of that library&#8212;as lightweight and simple as it can get. I&#8217;m not trying to scream; I&#8217;m just looking to talk.<\/p>\n<p>This blog is mostly for myself, but you can read along if you&#8217;re inclined. I&#8217;m planning to do mostly long-form casual writing. For now posts will be published exclusively on the Web, but I&#8217;m looking into Gemini and Gopher hosting.<\/p>\n<p>I&#8217;m really bad at these \u201cwelcome!!\u201d kind of posts. Sowwy!<\/p><\/div>","date_published":"2023-10-15T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/waarom-altijd-meer","title":"Waarom altijd meer?","url":"https:\/\/geheimesite.nl\/blog\/waarom-altijd-meer","content_html":"<div><p>Afgelopen jaar zat ik in de derde en moest ik mijn profielkeuze maken. Op het vwo werkt het zo dat je tot de vierde klas <em>alle<\/em> vakken krijgt, en daarna een profiel kiest met vakken waarin je examen gaat doen.<\/p>\n<p>Ik zit nu in 4 atheneum en het profiel dat ik heb gekozen is NT (Natuur en Techniek). Dat betekent dat mijn vakkenpakket bestaat uit natuurkunde, scheikunde, NLT, Duits, Nederlands, Engels, informatica en wiskunde B. Volgens sommigen is dit het &#8220;moeilijkste&#8221; pakket.<\/p>\n<p>Op de middelbare school zijn er vier profielen waar je in de bovenbouw uit kan kiezen: EM, CM, NT en NG. Doorgaans worden de N-profielen gezien als &#8220;zwaarder&#8221;, omdat ze een bepaald analytisch denkniveau vereisen, en dat niet voor iedereen is weggelegd. CM wordt juist gezien als een &#8220;pretpakket&#8221;, omdat je er geen wiskunde voor hoeft te doen. De &#8220;moeilijkheid&#8221; van een profiel is ook compleet relatief; voor mij zouden kunst en vreemde talen een veel grote uitdaging zijn dan wiskunde. Maar toch heerst er dit beeld dat NT het &#8220;beste&#8221; profiel zou zijn, en CM een &#8220;pretpakket&#8221;.<\/p>\n<p>Ook volgens mijn decaan. Vorig jaar kregen we van hem voorlichting over onze profielkeuze, waarin hij kort uitlegde wat elk profiel inhield. Hij benadrukte daarbij dat elk profiel gelijkwaardig is; een diploma met een N-profiel is niet meer of minder waard dan een diploma voor een M-profiel. Echter bleek vervolgens uit zijn hele verhaal dat hij CM maar onzin vond en het liefst ziet dat iedereen NT zou doen. (En het liefst geneeskunde of rechten als vervolgopleiding dan.)<\/p>\n<p>Ik snap dat niet. Ik snap niet dat iedereen de hele tijd maar <em>meer<\/em> en <em>hoger<\/em> wil. Ik heb persoonlijk gekozen voor NT omdat natuurkunde mijn favoriete vak is en kunst me helemaal niet ligt. Niet omdat het schijnbaar het &#8220;beste&#8221; pakket voor de &#8220;slimste&#8221; leerlingen is. Een aantal van mijn vrienden hebben voor EM en CM gekozen, hoewel ik denk dat ze prima NG of NT aan zouden kunnen; of ze daar blij van zouden worden is echter een ander verhaal. Kortom, je zou het profiel moeten kiezen dat het best bij jou en je interesses past, niet het &#8220;hoogste&#8221; dat je aankan.<\/p>\n<p>En ik zie nu hetzelfde weer gebeuren bij de voorlichting over onze studiekeuze. Want in principe leidt atheneum op tot <em>zowel<\/em> het <abbr title=\"Hoger beroepsonderwijs\">HBO<\/abbr> als het <abbr title=\"Wetenschappelijk onderwijs\">WO<\/abbr>. Maar in alle voorlichting wordt het HBO gepresenteerd als &#8220;afstromen&#8221;, of een &#8220;tussenstap op de ladder naar de universiteit&#8221;.<\/p>\n<p>Maar wat als je nou helemaal geen ambitie hebt om naar de universiteit te gaan? De universiteit is heel theoretisch. De focus ligt vooral op leren onderzoeken, en je carri\u00ebrepad na je afstuderen is vaak onduidelijk, terwijl je op de hogeschool juist echt <em>een vak<\/em> leert. Persoonlijk zou ik liever naar het HBO gaan om een docentenopleiding te volgen dan dat ik onderzoek zou gaan doen op de universiteit, en ik ken een aantal klasgenoten die daar exact hetzelfde in staan. De hogeschool is ook gewoon een &#8220;eindpunt&#8221;, net als het wetenschappelijk onderwijs. Het is niet een alleen een &#8220;tussenstap&#8221; of &#8220;plan B&#8221;.<\/p>\n<p>Mijn zusje is nu ook aan haar profielkeuze toe. Net als ik zit zij op het vwo (nu in de derde). Haar eerste keuze was NG op het vwo. CM ligt haar ook wel, maar was geen optie omdat ze een hekel heeft aan Duits&#8212;een verplicht vak in CM op vwo-niveau.<\/p>\n<p>Onze school biedt ook een speciaal vak genaamd BSM (Bewegen, Sport en Maatschappij) aan, waardoor je nu eindexamen kan doen in sport. Dit past heel goed bij Lize, want ze is van plan circusartiest of sportdocent te worden. Maar helaas is BSM uitsluitend te volgen op de havo.<\/p>\n<p>Daarom heeft ze besloten over te stappen naar de havo en daar CM te doen met BSM als keuzevak. Ik denk dat dit een hele slimme zet is, omdat ze iets gaat doen waar ze blij van wordt en dat goed bij haar past. Maar in de ogen van onze geliefde decaan gaat ze van het \u00e9\u00e9n-na-&#8220;hoogste&#8221; pakket op vwo naar het &#8220;laagste&#8221; profiel een niveau lager: paniek! En hoewel ze meerdere keren heeft aangegeven dat ze geen ambitie heeft naar de universiteit te gaan en dat ze na haar eindexamen graag iets met sport wil gaan doen, probeert hij haar toch krampachtig over te halen op het vwo te blijven. Je wil toch het &#8220;hoogste&#8221; uit jezelf halen?<\/p>\n<p>Nu is mijn vraag: Waarom altijd meer?<\/p><\/div>","date_published":"2023-04-26T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/lokalere-software","title":"Hoe kunnen we software lokaler maken?","url":"https:\/\/geheimesite.nl\/blog\/lokalere-software","content_html":"<div><p>Ik heb eerder al meerdere keren geschreven over <a href=\"https:\/\/geheimesite.nl\/blog\/social-media-wat-moeten-we-er-mee-aan\">social media<\/a>, <a href=\"red-het-internet-bouw-je-eigen-website\">het internet<\/a> en het <a href=\"https:\/\/geheimesite.nl\/blog\/belang-van-open-standaarden\">belang van open standaarden<\/a>. Toch wil ik het er nog \u00e9\u00e9n keer over hebben.<\/p>\n<p>Internetbedrijven hebben gewoonweg teveel macht. Er zijn wel goede alternatieven: denk aan Linux als alternatief voor Windows of macOS. Er zijn talloze voorbeelden van open-source software die net zo goed, al dan niet beter, is ten opzichte van propriatiery software.<\/p>\n<p>We moeten zorgen dat software, net als veel andere dingen zoals regelgeving en voedselproductie, veel lokaler wordt. Dat zou een aantal problemen oplossen: in een lokalere versie van bijvoorbeeld social media is moderation een stuk makkelijker omdat elke <em>instance<\/em><sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/lokalere-software#fn-1\" id=\"fnref-1\" data-footnote-ref>1<\/a><\/sup> niet super veel gebruikers zou hebben. Daarnaast zou je zelf kunnen kiezen wie je wel\/niet volgt waardoor er geen algoritmes (en dus geen datacollectie) meer nodig zijn. Ook zouden advertenties niet nodig zijn omdat je zelf betaalt voor de server waarop de instance staat. Daarnaast zorgen langere posts (zoals op een blog) ervoor dat je minder snel impulsieve berichten plaatst en beter nadenkt over wat je schrijft.<\/p>\n<p>Lokalere software zorgt er ook voor dat je zelf veel meer in controle bent over wat je ziet en wie je volgt. Je hebt zelf <em>eigendom over je content<\/em> en kan zelf bepalen met wie je het deelt, zonder tussenpersoon zoals Twitter of Facebook.<\/p>\n<p>En er zijn veel initiatieven die lokalere software proberen te maken.<\/p>\n<p>We hebben het <em>IndieWeb<\/em>, een tegenbeweging die is ontstaan rond dezelfde tijd dat social media mainstream werd. Hun idee\u00ebn gaan over hoe we onze eigen websites kunnen gebruiken om onze content te publiceren en die websites vervolgens met elkaar kunnen laten praten met open standaarden zoals Webmention, IndieAuth en Micropub. Je website zou de primary locatie van je content zijn (met een URL op je eigen domein zodat je altijd van host kan switchen), en je zou kopi\u00eben of links naar andere platforms te cross-posten.<\/p>\n<p>Het <em>Yesterweb<\/em> is een movement die tegen het corporate web is. Ze willen de creativiteit en experimentatie uit de begindagen terug en ze willen dat het web weer een persoonlijk karakter krijgt. Er is een gratis webhost genaamd neocities, die hetzelfde doet als geocities in de jaren 90 deed: gratis webhosting voor iedereen. Het is echt heel cool om hun directory eens door te bladeren en te zien wat mensen allemaal gemaakt hebben.<\/p>\n<p>Het <em>Fediverse<\/em> bestaat uit websites die met elkaar kunnen communiceren met behulp van het ActivityPub protocol. De meest bekende software is Mastodon, waarvan iedereen zijn eigen instance kan runnen.<\/p>\n<p>Het probleem is echter dat al deze idee\u00ebn een veel te hoge drempel om in te stappen hebben. Ze zijn gewoonweg te ingewikkeld voor &#8220;normale mensen&#8221;. En dat is niet omdat normale mensen niet slim genoeg zijn, dat is gewoonweg omdat ze er geen tijd voor hebben. En het is nou eenmaal veel makkelijker om een Twitter-account aan te maken dan om uit te vogelen hoe het IndieWeb werkt en zelf (zonder programmeerkennis) de protocollen te implementeren.<\/p>\n<p>Mastodon is enigzins een uitzondering, en sinds de overname van Twitter zie je steeds meer mensen Mastodon gebruiken. Toch is er een klein probleem: ze zitten allemaal op de Mastodon.social instance. Het hele idee van Mastodon is dat je verschillenden instances met elkaar verbindt. Doordat iedereen op dezelfde instance zit is het totaal niet lokaler geworden en zijn we gewoon bezig met het namaken van Twitter. Zoals Aral Balkan het <a href=\"https:\/\/ar.al\/2022\/11\/09\/is-the-fediverse-about-to-get-fryed-or-why-every-toot-is-also-a-potential-denial-of-service-attack\/\">zegt<\/a>:<\/p>\n<blockquote>\n<p>Today, we equate the size of mastodon.social (the instance run by Eugen) with how successful Mastodon (the software created by Eugen) is. This is very dangerous. The larger mastodon.social gets, the more it will become like Twitter.<br>\nFood for thought: The bigger mastodon.social gets, the less successful the #fediverse is.<\/p>\n<\/blockquote>\n<p>De beste manier om software lokaler te maken is door iedereen zijn eigen server te laten runnen. Dat was oorspronkelijk ook hoe het internet was ontworpen. Het idee was dat iedereen zijn eigen server zou hosten. Je zou thuis een server hebben waarop SMTP stond, waarmee je je eigen emails verstuurt met je eigen domeinnaam. Als ik thuis een server zou hosten met de domeinnaam <code>boers.nl<\/code>, dan zouden mensen mij kunnen mailen op <code>robin@boers.nl<\/code> en mijn zusje op <code>lize@boers.nl<\/code>. Of, je zou de servers met je wijk of gemeente kunnen delen (<code>robinboers@maassluis.nl<\/code> en <code>lizeboers@maassluis.nl<\/code>). In het internet zoals we dat nu kennen zitten super veel dingen ingebouwd waar we momenteel services van Big tech voor gebruiken. Chat zit ingebouwd: <a href=\"https:\/\/en.wikipedia.org\/wiki\/Internet_Relay_Chat\">IRC<\/a>. Email ook: <a href=\"https:\/\/nl.wikipedia.org\/wiki\/Simple_Mail_Transfer_Protocol\">SMTP<\/a>. Filesharing? Yup, <a href=\"https:\/\/nl.wikipedia.org\/wiki\/File_transfer_protocol\">FTP<\/a>. En dit alles kan je op je eigen server op je eigen domeinnaam runnen.<\/p>\n<p>Het probleem? Niemand wil zijn eigen server runnen. Dus de bedrijven die servers voor je runnen zijn gigantisch geworden. Denk aan Outlook en Gmail voor email. Daarnaast publiceert bijna niemand meer op zijn eigen site, maar wordt alles via social media gedaan. AWS, Azure en Google Cloud. En neem het ze eens kwalijk: het is super veel werk een server op te zetten en te onderhouden (zeker als je er geen enkele kennis van hebt). We hebben een systeem nodig dat mensen net zo makkelijk, al dan niet makkelijker, als mainstream platforms kunnen gebruiken<sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/lokalere-software#fn-2\" id=\"fnref-2\" data-footnote-ref>2<\/a><\/sup>.<\/p>\n<p>Er zijn pogingen gedaan. Mastodon was semi-effectief. We hebben echter een veel beter systeem nodig. En wij (programmeurs) zijn de enige die dat kunnen bouwen.<\/p>\n<p>Dus, iemand idee\u00ebn?<\/p>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p>Met een instance bedoel ik een lokaler georganiseerd platform dat nog steeds kan praten met de andere platforms. Ik zou bijvoorbeeld een instance kunnen hebben waarop de gebruikers van mijn wijk zouden zitten. Dan kunnen die onderling met elkaar communiceren, en daarnaast ook kunnen praten met mensen op een andere instance. Je krijgt in eerste instantie echter niet de posts van mensen van een andere instance te zien, tenzij je die mensen expliciet volgt. <a href=\"https:\/\/geheimesite.nl\/blog\/lokalere-software#fnref-1\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"1\" aria-label=\"Back to reference 1\">\u21a9<\/a><\/p>\n<\/li>\n<li id=\"fn-2\">\n<p>Als we het voor elkaar krijgen om een het hosten van een server zo makkelijk te maken als het gebruiken van een koelkast, dan is onze missie geslaagd. <a href=\"https:\/\/geheimesite.nl\/blog\/lokalere-software#fnref-2\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"2\" aria-label=\"Back to reference 2\">\u21a9<\/a><\/p>\n<\/li>\n<\/ol>\n<\/section><\/div>","date_published":"2023-03-19T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/nadenken-over-privacy","title":"Nadenken over privacy","url":"https:\/\/geheimesite.nl\/blog\/nadenken-over-privacy","content_html":"<div><p>Ik ben bezig met het lezen van <a href=\"https:\/\/www.bibliotheek.nl\/catalogus\/titel.434364606.html\/this-is-how-they-tell-me-the-world-ends\/\"><cite>This is how they tell me the world ends<\/cite><\/a>. Het gaat over hoe regeringen kritieke bugs in software (zero-days) kopen en exploiteren om toegang te krijgen tot data waar we geen toestemming voor hebben. Het zette me aan het denken over privacy en data op het internet.<\/p>\n<p>Je ziet overal ter wereld dat er steeds meer voor digitalisering gepusht wordt. Alles moet ineens via het internet gaan. Het lijkt me een nachtmerrie als straks al onze priv\u00e9-informatie op onze smartphone staat. We hebben al geen inzicht op welke data er mee wordt verzameld en door welke bedrijven deze wordt opgeslagen en verwerkt. Het lijkt me dus al helemaal een slecht idee om daar onze identiteitskaart, betaalgegevens en medische gegevens aan toe te voegen.<\/p>\n<p>Ik wil zelf kunnen bepalen welke informatie ik online zet, en alleen de data waarvan ik <em>kies<\/em> dat ik deze upload wil ik online hebben. Ik heb niks te verbergen, maar ik wil het liefst wel zelf kunnen bepalen wat ik wel en niet deel.<\/p>\n<p>Ik wil mijn eigen data beheren. Daarmee bedoel ik dat ik zelf bepaal wat ik wel en niet deel en waar en hoe het wordt opgeslagen. Ik ben al sinds 2021 bezig met het verplaatsen van mijn accounts en data naar plekken die ik zelf beheer.<\/p>\n<p>Zo maakt dit blog nu gebruik van <a href=\"https:\/\/git.dupunkto.org\/~axcelott\/chop\">Chop<\/a> en GitHub Pages. Ik heb al mijn content als Markdown files op mijn laptop staan in een Git repo. Ik kan de Git repo nu makkelijk naar een andere code forge zoals Codeberg of GitLab verplaatsen en de site bij een andere provider deployen. Ik ben daardoor niet meer afhankelijk van Blogger<sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/nadenken-over-privacy#fn-1\" id=\"fnref-1\" data-footnote-ref>1<\/a><\/sup>.<\/p>\n<p>Mijn wachtwoorden staan als GPG-versleutelde bestanden in een andere Git repo in plaats van in de Firefox password manager. Hierdoor kan ik mijn wachtwoorden makkelijk synchroniseren en heb ik zelf inzicht in hoe ze beveiligd zijn<sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/nadenken-over-privacy#fn-2\" id=\"fnref-2\" data-footnote-ref>2<\/a><\/sup>.<\/p>\n<p>Mijn email gaat primair via twee emailadressen op deze domeinnaam &#8212; geheimesite.nl. Daardoor kan ik makkelijk naar een andere provider switchen, zonder dat ik een nieuw emailadres aan al mijn contacten moet doorgeven.<\/p>\n<p>Het is niet per se dat ik Google, Microsoft en Mozilla niet vertrouw. Het punt is dat ik nu zelf bepaal welke informatie ik openbaar maak en wie er toegang tot heeft. Daarnaast ben ik ook zelf volledig in controle over de data: ik kan het verplaatsen naar een andere plek (want alles is met <a href=\"https:\/\/geheimesite.nl\/blog\/belang-van-open-standaarden\">open standaarden<\/a> opgeslagen) en bepalen wanneer het verwijderd wordt (en dan bedoel ik dus ook 100% verwijderd). En als nu mijn data gelekt wordt is het in ieder geval mijn eigen schuld.<\/p>\n<p>Ik krijg van leeftijdsgenoten vaak te horen dat ze het gek vinden dat ik zo privacybewust ben. Ze vragen dan waarom ik &#8220;zo bang ben dat mijn data gestolen wordt&#8221;. Ik denk dat het op drie dingen aankomt:<\/p>\n<ul>\n<li>Ik denk dat iedereen een fundamenteel recht op privacy heeft en ik vind dat dat beschermd moet worden.<\/li>\n<li>Ik wil digitaal onafhankelijk zijn van bedrijven die andere belangen hebben dan ik.<\/li>\n<li>Ik wil dat informatie over mij op <em>mijn<\/em> voorwaarden wordt verwerkt, niet op willekeurig veranderende voorwaarden van een Amerikaans bedrijf.<\/li>\n<li>Ik vind het leuk om zelf de technische problemen op te lossen en systemen te beheren waarin mijn data staat.<\/li>\n<\/ul>\n<p>Het gaat me dus om onafhankelijkheid en inzicht. Mensen mogen mijn priv\u00e9-informatie hebben &#8212; als ze het nodig hebben &#8212; maar ik wil wel weten hoe, waarom en door wie mijn het wordt verwerkt.<\/p>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p>Blogger heeft meerdere keren zonder duidelijke reden willekeurige blogs offline gehaald, en daar geen toelichting op gegeven. In sommige gevallen waren er geen backups, en gingen jaren aan posts verloren. <a href=\"https:\/\/geheimesite.nl\/blog\/nadenken-over-privacy#fnref-1\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"1\" aria-label=\"Back to reference 1\">\u21a9<\/a><\/p>\n<\/li>\n<li id=\"fn-2\">\n<p>Password managers zijn een groot target voor hackers, omdat ze makkelijk toegang verschaffen tot duizenden accounts. Door een selfhosted password manager te gebruiken ben je een kleiner target en kan je zelf de beveiliging beheren. <a href=\"https:\/\/geheimesite.nl\/blog\/nadenken-over-privacy#fnref-2\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"2\" aria-label=\"Back to reference 2\">\u21a9<\/a><\/p>\n<\/li>\n<\/ol>\n<\/section><\/div>","date_published":"2023-02-07T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/nft-no-fun-thanks","title":"NFT? No fun, thanks.","url":"https:\/\/geheimesite.nl\/blog\/nft-no-fun-thanks","content_html":"<div><p>Ik hoor de laatste tijd veel mensen over NFTs, crypto, <abbr title=\"decentralized apps\">dapps<\/abbr> en web3. Maar waar gaat het nou precies over, en waarom is het juist <em>niet<\/em> de oplossing? Dat ga ik kort proberen uit te leggen. Hou er rekening mee dat dit de mening is van een vijftienjarige die niet gespecialiseerd is in crypto. Neem het dus met een korreltje zout.<\/p>\n<p>Dus om te beginnen, wat is crypto? Crypto is een afkorting voor cryptography, een technologie om data te ver- en ontsleutelen. Het beveiligt bijvoorbeeld al het webverkeer over HTTPS en zorgt ervoor dat je veilig via het internet kan betalen. Waar het begrip de laatste tijd echter veel voor wordt gebruikt is als afkorting voor cryptocurrencies.<\/p>\n<p>Cryptocurrencies zijn digitale betaalmiddelen die gebruikmaken van een blockchain. Een blockchain is een manier om data op te slaan zodat deze later niet meer aangepast kan worden. Hierbij wordt dus gebruikgemaakt van cryptography. De eerste populaire cryptomunt is bitcoin. Bitcoin is bedacht als experiment voor het ontwikkelen van een alternatief geldsysteem nadat vertrouwen in het bestaande geldsysteem was verloren door de financi\u00eble crisis van 2008.<\/p>\n<p>Het probleem met Bitcoin is dat <em>het alleen een experiment was<\/em>. Daarnaast, het heeft nooit gefunctioneerd als betrouwbaar betaalmiddel. De waarde van een Bitcoin fluctueert veel te veel, en het is voor veel mensen te technisch om makkelijk te gebruiken. Geloof je me niet? Probeer jij eens je hypotheek te betalen met Bitcoin of een blikje Cola te kopen met Etherium. Tel daar bij op dat een crypto transactie vaak uren kan duren, en je hebt een onbruikbaar betaalmiddel.<\/p>\n<p>Het gevolg is dat het vooral als <a href=\"https:\/\/www.investopedia.com\/terms\/i\/investmentvehicle.asp\">Investment vehicel<\/a> gebruikt wordt: je investeert in crypto om het later voor winst te verkopen, vergelijkbaar met hoe aandelen werken. Het is dus geen realistisch alternatief voor het huidige financi\u00eble systeem en eigenlijk alleen een nieuw middel dat gebruikt kan worden door banken en speculanten.<\/p>\n<p>Omdat het alleen een financie\u00ebl instrument is en niet als daadwerkelijk betaalmiddel gebruikt kan worden ontstaat er een probleem: je hebt misschien cryptocoins die 10x zoveel waard zijn geworden, maar je kan ze nergens uitgeven. De enige manier om die waarde uit de cryptocurrency te krijgen is door het te verkopen voor &#8220;echt geld&#8221; (lees: euro&#8217;s of dollars) en dat vervolgens uit te geven.<\/p>\n<p>Dat betekent dat de enige manier om de waarde uit crypto te krijgen is door iemand anders met de cryptocoins op te zadelen. Je koopt assets zonder echte waarde in de hoop ze later te verkopen aan een ander voor meer geld. Dit noem je een <a href=\"https:\/\/en.wikipedia.org\/wiki\/Greater_fool_theory\">greater-fools scheme<\/a>.<\/p>\n<p>Crypto kan geen geld genereren. Voor elke euro die je met crypto verdient moet iemand anders dat erin gestopt hebben. Crypto zelf heeft geen waarde, de enige waarde die crypto heeft is de mogelijkheid het later te verkopen. Als dat niet lukt omdat de prijzen absurd hoog geworden zijn ben je de pineut.<\/p>\n<p>Het zou kunnen dat je nu denkt: maar dat is toch hoe aandelen ook werken? Die koop je ook in de verwachting later te kunnen verkopen tegen een hogere prijs. Maar bij een aandeel heb je in tegenstelling tot crypto ook nog daadwerkelijke waarde: je koopt een stukje bedrijf, en dat bedrijf heeft eigendommen die geld waard zijn. Dat geldt ook voor andere dingen die je kan verkopen voor een hogere prijs: bijvoorbeeld een huis of een stuk grond.<\/p>\n<p>Daarbij komt nog dat alle mensen die je proberen over te halen te investeren in crypto bijna allemaal zelf cryptocoins bezitten en dus een financie\u00ebl motief hebben om meer mensen binnen te halen: als meer mensen cryptocurrencies gebruiken worden hun coins meer waard.<\/p>\n<p>En de hele droom om een betaalmiddel te hebben dat niet via centrale organisaties (lees: banken) gaat is toch al mislukt, want door de complexiteit van crypto handelt bijna iedereen via crypto exchanges. Dat zijn een soort digitale handelplekken voor cryptocurrencies. Ze beheren je crypto wallet voor je en je maakt transacties via de exchange. Hmm, komt dat je bekend voor? Ja, dat klinkt verdacht veel als een bank.<\/p>\n<p>Al met al introduceert crypto meer problemen dan het oplost. Het is geen functionerend betaalmiddel, je handelt nog steeds via exchanges die <a href=\"https:\/\/web3isgoinggreat.com\/?theme=hack\">net iets te vaak hun gebruikers volledig scammen<\/a>, het is verschrikkelijk complex (en daardoor neemt de kans dat je gescamd wordt omdat je geen idee hebt wat je aan het doen bent toe) en het is basically een greater-fools scheme.<\/p>\n<p>En dan de olifant in de kamer: crypto gebruikt echt <em>fucking veel<\/em> energie. Bitcoin alleen gebruikte in 2021 al <a href=\"https:\/\/ccaf.io\/cbeci\/index\">meer dan 100 TWh<\/a> aan energie. Dat is meer dan het jaarlijkse energieverbruik <em>40 miljoen<\/em> (gemiddelde) gezinnen.<\/p>\n<p>Als je een jaar lang je auto niet aanraakt kan je zo&#8217;n 2.4 ton<sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/nft-no-fun-thanks#fn-1\" id=\"fnref-1\" data-footnote-ref>1<\/a><\/sup> CO<sub>2<\/sub> besparen. Als je vervolgens 5 bitcoin transacties maakt heb je dat volledig ongedaan gemaakt. Ter vergelijking: \u00e9\u00e9n bitcoin transactie verbruikt even veel energie als ongeveer een <a href=\"https:\/\/digiconomist.net\/bitcoin-energy-consumption\">miljoen VISA transacties en 80.000 uur YouTube kijken<\/a>.<\/p>\n<p>En dan hebben we het dus nog niet eens gehad over NFTs. Oh boy, here we go.<\/p>\n<p>Om te beginnen: wat is een NFT eigenlijk? NFT staat voor non-fungible token. Het is vergelijkbaar met een crypto coin, maar het belangrijke verschil is dat een crypto coin<sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/nft-no-fun-thanks#fn-2\" id=\"fnref-2\" data-footnote-ref>2<\/a><\/sup> uitwisselbaar is met elke andere coin, en een NFT niet. Dit is waar non-fungible (niet-uitwisselbaar) voor staat.<\/p>\n<p>Maar als je een NFT koopt, wat koop je dan precies? Dat is dus niet helemaal duidelijk. Juridisch gezien koop je alleen bragging-rights over het digitale kunstwerk dat aan de NFT gekoppeld zit. Je koopt geen copyright of intellectueel eigendom. Ook iedereen kan een NFT maken en er is geen enkele manier om te checken of degene die een NFT heeft gemaakt ook de originele maker van het kunstwerk is. Hierdoor komt het binnen de cryptomarkt veel voor dat mensen NFTs verkopen van kunstwerken die ze niet zelf gemaakt hebben. Wat koop je dan? Bragging-rights over het &#8220;ownen&#8221; van een kunstwerk dat ook nog eens gestolen is van de originele maker. Het enige wat je dus hebt is bewijs dat je het kon betalen: status.<\/p>\n<p>Daarbij komt dat de meeste NFTs niet eens het kunstwerk zelf bevatten, enkel een link ernaartoe. Die link is net zo vatbaar voor <a href=\"https:\/\/en.wikipedia.org\/wiki\/Link_rot\">link rot<\/a> als alle andere URLs. Heb je straks een NFT gekocht en gaat de server van de verkoper offline, zit je met een NFT die een dead link bevat.<\/p>\n<p>Ook kan iedereen die link bezoeken en een kopie van je asset maken (want om het plaatje weer te geven moet je computer het eerst downloaden, dat is namelijk hoe het internet werkt). Misschien denk je nu: maar Robin, dat lijkt toch op hoe normale kunst ook werkt? Je kan ook een kopie van de Mona Lisa kopen die door een imitatie schilder gemaakt is en het verschil bijna niet zien. Je betaalt geld voor het origineel, voor de ambacht die daar in zit.<\/p>\n<p>Hier valt de vergelijking dan wel gelijk uit elkaar. Een kopie van een digitaal kunstwerk is namelijk 100% hetzelfde als het origineel. Het lijkt er niet alleen op, het is exact hetzelfde kunstwerk. Je zou ook <a href=\"https:\/\/stackoverflow.com\/questions\/68816228\/multiple-nfts-from-the-same-source\">2 verschillende NFTs van hetzelfde plaatje kunnen maken<\/a>. Het plaatje dat de NFT representeert is niet uniek, alleen de NFT zelf. Je koopt eigenlijk alleen het bewijs dat je er geld aan besteed hebt, niet het plaatje zelf. Dus wat koop je nou eigenlijk? Precies, status.<\/p>\n<p>Gewoon de JPG kopen zou exact hetzelfde effect hebben als het kopen van een NFT. Je kan de factuur\/afschrijving op je bankrekening laten zien om te bewijzen dat je echt het kunstwerk hebt gekocht, als je dat zo graag wil. Je betaalt geld aan de kunstenaar en krijgt een link naar het plaatje dat je dan kan downloaden. TADA: je hebt een makkelijk te kopie\u00ebren plaatje (net als bij NFTs) en je kan bewijzen dat het (veel) geld waard is met je rekening afschriften. Het probleem: je kan het moeilijk doorverkopen.<\/p>\n<p>En dat is dus exact het probleem voor veel mensen. NFTs zijn een digitale kunstmarkt geworden waarbij met duizenden euro&#8217;s gesmeten wordt voor <a href=\"https:\/\/opensea.io\/assets\">&#8220;kunst&#8221;<\/a>. In de kunstwereld heb je ook kunstwerken die heel makkelijk te maken zijn, heel veel op elkaar lijken en er niet uitzien waar mensen alsnog heel veel geld voor over hebben (lees: abstracte kunst), net als bij NFTs. En ik denk dat er met de kunstwereld zelf ook best veel mis is. Het verschil is denk ik dat daar minder mensen gescamd worden vanwege een te complex systeem en we er niet ons klimaat mee om zeep helpen.<\/p>\n<p>Dus als mensen aan mij vragen hoe dat nou zit met die crypto en NFTs of zelfs voorstellen er in te investeren zeg ik: NFT? No fun, thanks!<\/p>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p>Hierbij ga ik ervan uit dat je ca. <a href=\"https:\/\/milieucentraal.nl\/klimaat-en-aarde\/klimaatverandering\/wat-is-je-co2-voetafdruk\/\">10.600km\/jaar<\/a> rijdt en 1kg CO<sub>2<\/sub> <a href=\"https:\/\/corekees.com\/news\/hoeveel-is-een-kilo-co2\/\">gelijkstaat tot 4.5km rijden<\/a>. <a href=\"https:\/\/geheimesite.nl\/blog\/nft-no-fun-thanks#fnref-1\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"1\" aria-label=\"Back to reference 1\">\u21a9<\/a><\/p>\n<\/li>\n<li id=\"fn-2\">\n<p>Er is een belangrijk verschil tussen coins en tokens: een coin representeert geld op de blockchain. Elke coin is uitwisselbaar voor een andere (fungible). Een coin heeft een bepaalde waarde, en dat is alles wat de coin doet. Het belangrijke verschil met een token (lees: NFT) is dat een token gebruik maakt van een smart contract. Een smart contract is een stukje code dat bij elke transactie wordt uitgevoerd, maar in de praktijk bevat het meestal alleen een URL naar een bestand. De token representeert dus niet een bepaalde waarde, maar een stukje data (lees: een bestand). <a href=\"https:\/\/geheimesite.nl\/blog\/nft-no-fun-thanks#fnref-2\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"2\" aria-label=\"Back to reference 2\">\u21a9<\/a><\/p>\n<\/li>\n<\/ol>\n<\/section><\/div>","date_published":"2023-01-08T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/gebrek-aan-ambitie","title":"Gebrek aan ambitie?","url":"https:\/\/geheimesite.nl\/blog\/gebrek-aan-ambitie","content_html":"<div><p>Aan het begin van dit schooljaar had ik een kennismakingsgesprek met mijn mentor. Als voorbereiding had ik twee vragenlijsten moeten invullen. Een van de vragen daarin was welke cijfers ik verwachtte op mijn kerstrapport. Ik denk dat ik redelijke schattingen had gedaan, maar mijn mentor vond dat ik niet genoeg ambitie had. Ik en mijn ouders probeerden hem duidelijk te maken dat ambitie niet te meten is met schoolcijfers en dat ik me ook buiten school nog wilde ontwikkelen. Dat ging er bij hem niet echt in.<\/p>\n<p>Ik merk dit wel vaker. Men gaat ervanuit dat kinderen altijd maar beschikbaar moeten zijn voor school en zich daarbuiten niet zelf ook nog willen ontwikkelen in hun eigen tijd, bijvoorbeeld in sport of hobby&#8217;s. Ik heb dit jaar meerdere keren van mijn docenten gehoord dat het de bedoeling is dat we elke dag tot ongeveer 16:30 bezig zouden moeten zijn met school.<\/p>\n<p>Dit stoort mij echt enorm, zeker als je kijkt naar het onderwijs zelf. Voordat ik verder ga wil ik wel graag benoemen dat ik blij ben dat we hier \u00fcberhaupt onderwijs krijgen, het is een voorrecht. Er zijn ook landen waar er gewoonweg geen onderwijs is. Toch wil ik graag wat probleempunten benoemen.<\/p>\n<p>Ten eerste cijfers. Er zijn zoveel dingen mis met cijfers. Door de ontwikkeling van iemand te meten met cijfers sla je de plank volledig mis. We proberen met allemaal meetpuntjes te kijken of iemand progressie maakt, maar in de echte ontwikkeling van iemand krijg je met cijfers geen inzicht.<\/p>\n<p>Er wordt nu dus les gegeven niet om iemand iets te leren, maar om iemand voor te bereiden op de toets. Hierdoor halen kinderen een goed cijfer voor de toets, maar leren ze niet echt iets. Neem bijvoorbeeld mijn Duits toets van vorige week: ik heb een 8.2 gehaald, maar als je me nu een van de woordjes zou vragen zou ik het echt niet meer weten. Laat staan dat ik nog weet wat in het hoofdstuk aardrijkskunde over water van vorig jaar stond. Ik kan me alleen vaag het woord &#8216;wateroorlogen&#8217; herinneren.<\/p>\n<p>Het is zo erg dat we nu aan het &#8220;leren&#8221; zijn voor de toetsen. Wat zijn we dan tijdens de rest van de lessen aan het doen? Het doel is de hele tijd de cijfers zo hoog mogelijk te maken, maar we leren van de meeste dingen vrij weinig. Vlak voor de toetsweek moeten we alle informatie uit ons hoofd leren, en na de toetsweek mag je het weer vergeten.<\/p>\n<p>Ook is het als iemand een onvoldoende krijgt niet motiverend voor dat kind. We zouden juist moeten benoemen wat er goed ging, wat er fout ging en hoe dit verbeterd kan worden. Door hier een score aan te hangen maak je het abstract. Je plaatst als het ware een laag tussen de fouten en het kind. Ze hebben niet het idee dat ze er iets aan kunnen doen, want &#8216;de docent geeft toch het cijfer?&#8217; Echt, ik hoor sommige klasgenoten zo vaak: &#8220;Echt bedankt voor dat cijfer, meneer!&#8221; zeggen.<\/p>\n<p>Ik denk dat er op scholen veel meer aandacht zou moeten zijn voor het motiveren van leerlingen om dingen te leren, zodat we ze minder hoeven aan te sporen met &#8220;maar anders krijg je een onvoldoende&#8221;<sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/gebrek-aan-ambitie#fn-1\" id=\"fnref-1\" data-footnote-ref>1<\/a><\/sup>. Dit zou er ook voor zorgen dat dingen beter blijven hangen bij mensen. Ik merk zelf altijd, en jullie ongetwijfeld ook, dat ik dingen waar ik in ge\u00efnteresseerd ben veel makkelijker en sneller leer. Ik vind het zelfs vaak nog leuk ook.<\/p>\n<p>Ik denk dat dit ook al geprobeerd wordt met bijv. practica, gastlessen en quizes. In mijn ervaring is het wel leuk, maar wordt de leerstof niet effectief overgebracht (lees: het voelt vaak een beetje als tijdverspilling). Ik denk dat we de lessen veel meer aan actualiteiten en ervaringen zouden moeten koppelen. Laat leerlingen zien waarom de leerstof relevant is, waarom het de moeite waard is om te leren<sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/gebrek-aan-ambitie#fn-2\" id=\"fnref-2\" data-footnote-ref>2<\/a><\/sup>.<\/p>\n<p>Een van de dingen die ik denk dat ook zeker moet gebeuren is dat leerlingen al veel eerder de keuze krijgen om vakken te laten vallen. Waarom zou je iemand die heel creatief is en verschrikkelijk goed kan tekenen drie jaar lang martelen met wiskunde? Grote kans dat hij na die drie jaar nooit meer met wiskunde in aanraking zal komen. Dit geldt ook voor mensen die, zoals ik, totaal geen aanleg hebben voor talen.<\/p>\n<p>Nu we het toch over talen hebben, ik denk dat het taalonderwijs ook dramatisch zou moeten worden hervormd. Ik denk dat het heel gek is dat we mensen een taal proberen aan te leren door ze woordjes en grammaticaregels uit hun hoofd te laten leren. En dat terwijl je een taal het beste leert door hem gewoon heel veel te spreken<sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/gebrek-aan-ambitie#fn-3\" id=\"fnref-3\" data-footnote-ref>3<\/a><\/sup>. De huidige lessen zijn bijna alleen gefocust op grammatica en woordenschat. Ik vind dit erg kunstmatig<sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/gebrek-aan-ambitie#fn-4\" id=\"fnref-4\" data-footnote-ref>4<\/a><\/sup> aanvoelen.<\/p>\n<p>Praktisch al het Engels dat ik spreek heb ik zelf geleerd door veel Engelse videos te kijken en online Engels te spreken. En ja, mijn Engels is niet perfect, maar ik merk dat ik net als in het Nederlands gewoon &#8220;voel&#8221; of een zin klopt of niet. Mijn woordenschat is misschien niet zo verschrikkelijk groot en beperkt tot praten over computers, maar als je een taal langer spreekt leer je de woorden die je nodig hebt vanzelf.<\/p>\n<p>Ik denk ook dat kinderen op school veel meer de kans zouden moeten krijgen om hun talenten te ontwikkelen. Hierdoor zorgen we sowieso er al voor dat ze beter meedoen met de lessen.<\/p>\n<p>En ik weet dat het onderwijs al overbelast is met teveel extra taken en dat we een lerarentekort hebben, maar misschien is de oplossing dan gewoon vrij simpel: minder school. Geef kinderen de kans om zich zelf te ontwikkelen. We zouden moeten voorkomen dat kinderen thuis gaan zitten niksen, dus denk aan het verzorgen van extra trainingen, workshops, stages, coderdojos etc.<\/p>\n<p><i>Ik ben uiteindelijk overgegaan naar 4vwo met alle vakken<sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/gebrek-aan-ambitie#fn-5\" id=\"fnref-5\" data-footnote-ref>5<\/a><\/sup> een acht of hoger. En misschien nog wel belangrijker: ik heb functioneel leren programmeren in Elixir, websites leren bouwen met Phoenix LiveView en een <a href=\"https:\/\/sharefox.eu\">werkend product<\/a> opgeleverd. Best wel ok\u00e9 voor iemand zonder ambitie toch?<\/i><\/p>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p>Let hierbij op dat het doel van school leren moet blijven. Mensen moeten nog steeds fundementale vaardigheden als taal en rekenen beheersen. <a href=\"https:\/\/geheimesite.nl\/blog\/gebrek-aan-ambitie#fnref-1\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"1\" aria-label=\"Back to reference 1\">\u21a9<\/a><\/p>\n<\/li>\n<li id=\"fn-2\">\n<p>En als dit niet lukt zou ik me serieus afvragen, waarom wordt dit onderwezen? <a href=\"https:\/\/geheimesite.nl\/blog\/gebrek-aan-ambitie#fnref-2\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"2\" aria-label=\"Back to reference 2\">\u21a9<\/a><\/p>\n<\/li>\n<li id=\"fn-3\">\n<p>En ik denk dat ik in die drie jaar VWO misschien \u00e9\u00e9n of twee keer een gesprek in het Frans heb gevoerd, en nog nooit een gesprek in het Duits. <a href=\"https:\/\/geheimesite.nl\/blog\/gebrek-aan-ambitie#fnref-3\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"3\" aria-label=\"Back to reference 3\">\u21a9<\/a><\/p>\n<\/li>\n<li id=\"fn-4\">\n<p>Bij gebrek aan een betere omschrijving. <a href=\"https:\/\/geheimesite.nl\/blog\/gebrek-aan-ambitie#fnref-4\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"4\" aria-label=\"Back to reference 4\">\u21a9<\/a><\/p>\n<\/li>\n<li id=\"fn-5\">\n<p>Ok\u00e9, behalve Nederlands dan, maar een 7.9 is praktisch een 8. <a href=\"https:\/\/geheimesite.nl\/blog\/gebrek-aan-ambitie#fnref-5\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"5\" aria-label=\"Back to reference 5\">\u21a9<\/a><\/p>\n<\/li>\n<\/ol>\n<\/section><\/div>","date_published":"2022-07-05T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/red-het-internet-bouw-je-eigen-website","title":"Red het internet, bouw je eigen website.","url":"https:\/\/geheimesite.nl\/blog\/red-het-internet-bouw-je-eigen-website","content_html":"<div><p><a href=\"https:\/\/waag.org\/nl\/hetinternetisstuk\">Het internet is stuk<\/a>. Scams, advertenties, fake news, misinformatie, verslaving, privacy schending, hatespeech, echo chambers, rascisme en discriminatie. Hoe zijn we hier terecht gekomen? Zoals ik en mijn vriend Kevin altijd bij bijna al ons geschiedenishuiswerk invullen: <em>geld macht politiek<\/em>.<\/p>\n<h2>Durfkapitaal<\/h2>\n<p>Bedrijven als <a href=\"https:\/\/www.rtlnieuws.nl\/tech\/artikel\/4808216\/uber-boekt-grootste-verlies-ooit-meer-dan-5-miljard-dollar\">Uber<\/a>, <a href=\"https:\/\/www.volkskrant.nl\/economie\/spotify-groeit-verder-maar-maakt-nog-geen-winst~b91b3f2a\/\">Spotify<\/a> en <a href=\"https:\/\/www.nu.nl\/economie\/6120928\/moederbedrijf-thuisbezorgd-blijft-ondanks-corona-verliesgevend.html\">Thuisbezorgd.nl<\/a> groeien razendsnel, maar maken al jaren verlies. Het idee is om zo snel mogelijk een zo groot mogelijk marktaandeel te krijgen. Maar hoe kan dat? Iemand moet toch de salarissen van de werknemers betalen? En de grote panden?<\/p>\n<p>Deze bedrijven kunnen alleen overleven omdat ze verschrikkelijk veel geld binnenkrijgen van investeerders met durfkapitaal. Het is alsof je een zwembadje hebt wat volledig lek is, maar daar gewoon tien tuinslangen in legt om het continue bij te vullen. Het is alsof ze monopoly spelen met infinite geld. En wat willen investeerders? Precies: <strong>winst<\/strong>.<\/p>\n<p>Het resultaat is dat je een bedrijf hebt dat als doelstelling heeft winst te maken voor de investeerders. De eigenaren van het bedrijf zijn namelijk de investeerders (want zo werken aandelen). Dit is niet alleen een probleem met bedrijven die verlies draaien, maar ook met winstgevende bedrijven als Facebook, Google en Amazon. Het is veel lucratiever om persoonlijke data van je klanten te verkopen met een gratis product dan om klanten te overtuigen van het kopen van je product.<\/p>\n<h2>De belangen van de investeerders<\/h2>\n<p>Het doel is te groeien en zoveel mogelijk winst binnen te harken. Niet om een veilig en privacybewust platform te bouwen, of een goede zoekmachine. De belangen van de bedrijven wijken af van die van de consumenten. Dit leidt tot situaties waar de gebruiker niet voorop gezet wordt. Apps en algoritmes zijn gemaakt om zo lang mogelijk je aandacht vast te houden. In deze omgeving worden de timelines en feeds overspoeld met clickbait en extreme content. Wie het hardst roept krijgt de aandacht van de gebruiker. Het tweede probleem is dat je ook alleen dingen uit je eigen <a href=\"https:\/\/yewtu.be\/watch?v=FLoR2Spftwg\">&#8220;bubbel&#8221;<\/a> hoort. Als dat over katten of lego gaat is het niet erg, maar als het over de maatschappij of politiek gaat is het een ander verhaal. Het zorgt voor verdeeldheid en conflicten.<\/p>\n<p>Social media bedrijven kunnen de algoritmes gewoon aanpassen. Het is niet heel moeilijk om ervoor te zorgen dat er geen extreme politieke content wordt aanbevolen, of dat misinformatie wordt gefilterd<sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/red-het-internet-bouw-je-eigen-website#fn-1\" id=\"fnref-1\" data-footnote-ref>1<\/a><\/sup>. Het probleem is dat het goed betaalt. Mensen houden ervan te horen wat ze leuk vinden, en dat betekent dat ze langer op je app blijven. Meer winst voor het techbedrijf, dus die zijn blij. &#8220;Waarom zouden we ons algoritme ook verbeteren als we dan minder winst zouden maken. <a href=\"https:\/\/mkorostoff.github.io\/1-pixel-wealth\/\">Het is niet alsof we het kunnen missen<\/a>.&#8221;<\/p>\n<p>Het probleem is dat al deze apps &#8220;gratis&#8221; zijn. Je ziet keer op keer dat bedrijven met een normaal bussiness model gewoon een goed, betaald, product kunnen bouwen zonder de privacy van de gebruikers te schenden of advertenties te tonen. Het wordt alleen heel moeilijk om ineens geld te gaan vragen voor een product dat altijd gratis is geweest.<\/p>\n<h2>Wie is de eigenaar van de content?<\/h2>\n<p>Sinds de opkomst van Web 2.0 en de bijbehorende <a href=\"https:\/\/indieweb.org\/silos\">silos<\/a> zetten we al onze content op gecentraliseerde platformen. We geven hiermee controle weg over onze privacy, onze identiteit, en, het belangrijkst, de <a href=\"https:\/\/indieweb.org\/permalink\">permalink<\/a>. <a href=\"https:\/\/indieweb.org\/site-deaths\">All social media is doomed to fail<\/a>. Als een platform verdwijnt is alle content, en bijbehorende culturele geschiedenis, <em>voor goed<\/em> weg.<\/p>\n<p>Als je dingen naar je eigen site post is dit probleem er niet. Met een eigen domeinnaam en een Wordpress installatie kom je al best ver. Je hebt geen centraal platform nodig. Het is veiliger en je bent zelf in beheer over welke data je wel\/niet weggeeft, en, niet onbelangrijk, je bent zelf in beheer van de permalink. Je kan naar wens van webhost of CSM switchen zonder dat de permalink stopt te werken. Probeer <a href=\"https:\/\/en.wikipedia.org\/wiki\/RSS\">RSS<\/a> te gebruiken in plaats van een <a href=\"https:\/\/indieweb.org\/silo\">silo<\/a>. Comment met <a href=\"https:\/\/indieweb.org\/webmention\">webmentions<\/a>. Deze kleine dingen helpen al een hele hoop.<\/p>\n<h2>Breng de creativiteit terug<\/h2>\n<p>Hoe vaak ben je niet op een website gekomen die ongeveer zo in elkaar zat: logo en menu bovenin, grote slogan en dan een felgekleurde knop waar ze willen dat je op klikt.<\/p>\n<p><img src=\"https:\/\/cdn.geheimesite.nl\/images\/blog\/basic-cta-webdesign-examples.jpg\" alt=\"Voorbeelden van deze layout. Het is overused.\"><\/p>\n<p>Dit is weer een symptoom van het willen geld verdienen met het internet. En ook bedrijven met betaalde producten hebben vaak dit soort pages. Het doel is om jou zo snel mogelijk op de gekleurde knop te laten klikken voor je weer wegklikt naar een andere site \u2014 en het werkt.<\/p>\n<p>Het probleem met deze standaard layout is dat het alle creativiteit uit het ontwerpproces haalt. Ja, je kan nog steeds een mooie site ontwerpen, maar je zit wel vast aan de layout. Tot op zekere hoogte geld dit ook voor social media. Je kan misschien wat kleuren aanpassen en een profielfoto of banner uploaden, maar daar houdt het ook op. Als je een eigen site hebt kan je juist die creativiteit terugbrengen die oudere websites zo kenmerkt.<\/p>\n<p>Er zijn geweldige communities ontstaan op bijvoorbeeld <a href=\"https:\/\/neocities.org\/\">Neocities<\/a>, een gratis webhost ge\u00efnspireerd door Geocities, die als missie heeft &#8220;het terugbrengen van de creativiteit en expression op het world wide web, die het zo fantastisch maakte&#8221;. Het is helemaal gratis, maar je kan ze ook sponsoren met een subscription. Het platform is volledig open-source en wordt betaald uit de inkomsten van de subscribers.<\/p>\n<p>Dit soort initiatieven zorgen ervoor dat het internet een betere plek wordt. In plaats van het belang van de investeerders plaatsen zij publieke waarden voorop. Ik raad ook aan eens te kijken naar <a href=\"https:\/\/yesterweb.org\">Yesterweb<\/a>, een beweging die zich inzet voor creativiteit en diversiteit op het internet.<\/p>\n<h2>En nu?<\/h2>\n<p>Het probleem dat ik vooral heb met de huidige staat van het internet is dat het een totale rotzooi is, maar voor veel van ons is het wel een groot deel van onze identiteit. Er is een gebrek aan regulering. Internetbedrijven worden niet voldoende verantwoordelijk gesteld voor de schade die zij aanrichten aan onze samenleving. Ik heb al eerder posts geschreven over dit onderwerp:<\/p>\n<ul>\n<li><a href=\"https:\/\/geheimesite.nl\/blog\/belang-van-open-standaarden\/\">Het belang van open standaarden<\/a><\/li>\n<li><a href=\"https:\/\/geheimesite.nl\/blog\/social-media-wat-moeten-we-er-mee-aan\">Social media, wat moeten we er mee aan?<\/a><\/li>\n<\/ul>\n<p>Maar er is ook iets wat wij als consumenten kunnen doen. Zeg nee tegen deze platformen. Red het internet en bouw je eigen website.<\/p>\n<h2>Gerelateerd<\/h2>\n<ul>\n<li><a href=\"https:\/\/waag.org\/nl\/hetinternetisstuk\">Het internet is stuk<\/a><\/li>\n<li><a href=\"https:\/\/matthiasott.com\/articles\/into-the-personal-website-verse\">Into the Personal-Website-Verse<\/a><\/li>\n<li><a href=\"https:\/\/alistapart.com\/article\/nothing-fails-like-success\/\">Nothing Fails Like Success<\/a><\/li>\n<li><a href=\"https:\/\/www.quora.com\/Who-originally-suggested-that-if-youre-not-paying-for-the-product-you-are-the-product\">Who originally suggested that &#8216;if you&#8217;re not paying for the product, you are the product&#8217;?<\/a><\/li>\n<li><a href=\"https:\/\/yewtu.be\/watch?v=X3SrZuH00GQ\">Own your content on Social Media using the IndieWeb<\/a><\/li>\n<li><a href=\"https:\/\/yewtu.be\/watch?v=HNmKO7Gr4TE\">Tantek Celik, &#8220;Why We Need the IndieWeb&#8221;,<\/a><\/li>\n<li><a href=\"https:\/\/diggingthedigital.com\/maak-je-eigen-moederschip\/\">Maak je eigen moederschip<\/a><\/li>\n<li><a href=\"https:\/\/mxb.dev\/blog\/make-free-stuff\/\">Make Free Stuff<\/a><\/li>\n<li><a href=\"https:\/\/yesterweb.org\">Yesterweb<\/a><\/li>\n<li><a href=\"https:\/\/yewtu.be\/watch?v=OFRjZtYs3wY\">Why The Web Is Such A Mess<\/a><\/li>\n<li><a href=\"https:\/\/yewtu.be\/watch?v=BxV14h0kFs0\">This Video Has 51,827,520 Views<\/a><\/li>\n<\/ul>\n<p>Als ik je heb overgehaald en je het IndieWeb wil joinen:<\/p>\n<ul>\n<li><a href=\"https:\/\/indieweb.org\/Getting_Started\">Getting Started - IndieWeb<\/a><\/li>\n<\/ul>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p>Niet als je de resources van zo&#8217;n groot internetbedrijf hebt tenminste. Het is niet bepaald makkelijk om content juist te filteren zonder gezeur te krijgen over censuur, en waar de lijn van extreme content dan ligt. Maar als ze het echt zouden willen zouden ze het kunnen doen. <a href=\"https:\/\/geheimesite.nl\/blog\/red-het-internet-bouw-je-eigen-website#fnref-1\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"1\" aria-label=\"Back to reference 1\">\u21a9<\/a><\/p>\n<\/li>\n<\/ol>\n<\/section><\/div>","date_published":"2022-05-30T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/somtoday-ziet-er-niet-uit-maar-we-kunnen-het-oplossen-met-css","title":"Somtoday verbeteren met CSS","url":"https:\/\/geheimesite.nl\/blog\/somtoday-ziet-er-niet-uit-maar-we-kunnen-het-oplossen-met-css","content_html":"<div><p>Kennen jullie Somtoday? Voor de mensen die het niet kennen: het is een leerlingvolgsysteem voor het voortgezet onderwijs. En het is toevallig ook wat mijn school, het Lyceum Schravenlant, gebruikt.<\/p>\n<p>Som is noice. Je kan er je cijfers, huiswerk en leermiddelen zien. Maar ik zie ook een aantal verbeterpuntjes. Somtoday heeft voor de docenten een uitgebreid dashboard waarin ze het huiswerk kunnen inplannen, cijfers kunnen invoeren, absenties kunnen bijhouden etc.<\/p>\n<figure>\n  <img src=\"https:\/\/cdn.geheimesite.nl\/images\/blog\/somtoday-docent.png\" alt=\"\">\n  <figcaption>Somtoday Docent: een mooie moderne Angular app<\/figcaption>\n<\/figure>\n<p>Maar leerlingen en ouders zien deze website uit het jaar 1900. Oke, dat is misschien een beetje overdreven, maar het doet me wel serieus denken aan websites uit 2000.<\/p>\n<figure>\n  <img src=\"https:\/\/cdn.geheimesite.nl\/images\/blog\/somtoday-leerling.png\" alt=\"\">\n  <figcaption>Somtoday voor leerlingen en ouders: een site die eruitziet alsof hij uit een tijdmachine komt<\/figcaption>\n<\/figure>\n<p>Er zijn heel veel dingen die me irriteren aan dit ontwerp. Om er een paar te noemen:<\/p>\n<ul>\n<li>De kleuren zijn verschrikkelijk<\/li>\n<li>De font-size is niet ideaal<\/li>\n<li>Mijn lelijke hoofd staat bovenaan<\/li>\n<li>Er is permanent een badge met het nummer 3 bij de berichtenbox, ook al het ik al mijn berichten gelezen<\/li>\n<\/ul>\n<p>Zoals mijn lezers waarschijnlijk weten ben ik een webdesign freak die weet hoe CSS werkt. Dus heb ik een userstyle geschreven die je kan installeren om het leerling\/ouderpaneel iets beter te maken. Het is gebaseerd op de look van Somtoday Docent, en ziet er zo uit:<\/p>\n<figure>\n  <img src=\"https:\/\/cdn.geheimesite.nl\/images\/blog\/somtoday-verbeterd.png\" alt=\"\">\n  <figcaption>Verbeterde versie van Somtoday voor leerlingen en ouders<\/figcaption>\n<\/figure>\n<p>Als je wil kan je mijn userstyle <a href=\"https:\/\/gist.github.com\/RobinBoers\/c95ea8c4181bcfcd9957bf730effecbb\">op mijn GitHub account<\/a> vinden.<\/p>\n<p>Userstyles kan je installeren met <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/styl-us\/\">Stylus<\/a>. Je kan in de extension mijn CSS code plakken en als het goed is zou dan je Somtoday er veel beter uit moeten zien :)<\/p>\n<p><strong>Ik hoop stiekem heel erg dat een medewerker van Somtoday dit toevallig leest. Zo ja, zou je me in contact willen brengen met de designers \/ ontwikkelaars van Som? Mijn emailadres is staat op de homepage :)<\/strong><\/p><\/div>","date_published":"2022-03-25T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/belang-van-open-standaarden","title":"Het belang van open standaarden","url":"https:\/\/geheimesite.nl\/blog\/belang-van-open-standaarden","content_html":"<div><p>Als je vroeger iets online wilde zetten had je alleen simpele HTML webpages. Je uploadde ze dan naar je eigen website of blog. Je was op je favoriete blogs geabonneerd via RSS en chatten ging via IRC. Dat zijn open standaarden voor communiceren, die door iedereen ondersteund worden.<\/p>\n<p>Maar sinds de opkomst van het zogenoemde &#8220;web 2.0&#8221; zetten we alles bij Big Tech: Facebook, Microsoft, Apple, Amazon en Google. Denk daar eens over na. Als je iemand een berichtje wil sturen, wat gebruik je dan? Whatsapp of Facebook Messenger? Als je online iets wil posten? Sommigen van mijn lezers hebben misschien een eigen blog, maar de rest zet het waarschijnlijk op Facebook, Instagram, Snapchat of TikTok. Onze feeds bestaan niet uit wat we leuk vinden, maar uit wat de bedrijven op basis van data <em>denken<\/em> dat we leuk vinden. We hebben geen enkele inzichten in de algoritmes, we weten niet hoe ze werken, wat voor content ze het meest pushen en waarom. Clickbait en misinformatie domineren. Als het platform wordt opgeheven, <a href=\"https:\/\/plus.google.com\">ik kijk naar jou Google+<\/a>, dan zijn we de content *voor goed kwijt.<\/p>\n<p>Content kan niet makkelijk tussen de platforms verplaatst worden. Er zijn geen open standaarden die iedereen ondersteund. Daardoor raken we locked in. We gebruiken allemaal nog steeds Whatsapp, omdat *iedereen Whatsapp gebruikt. Als je besluit een privacy-bewust alternatief zoals <a href=\"https:\/\/signal.org\/en\/\">Signal<\/a> te gebruiken raak je contact met je familie en vrienden kwijt.<\/p>\n<p>Blijkbaar vinden we het prima dat <em>al onze activiteit<\/em> getrackt wordt. En dat terwijl zelfstandige blogs, RSS en IRC nog steeds gewoon beschikbaar zijn. Het is duidelijk dat we blijkbaar liever het gemak van Facebook hebben. We hebben toch niets te verbergen, toch?<\/p>\n<p><a href=\"https:\/\/decorrespondent.nl\/nietsteverbergen\">We hebben <em>wel<\/em> iets te verbergen<\/a>! Onze data is van ons, en zou niet zonder onze explicitiete toestemming ergens in een datacenter moeten belanden. Wat mij frustreert is dat deze bedrijven de bewuste keuze maken om winst boven het publieke belang te plaatsen. <a href=\"https:\/\/yewtu.be\/watch?v=P_9MIU8ZueU\">Algoritmes zijn niet een soort magische AI superpower<\/a> waar we geen invloed op hebben. Algoritmes zijn gewoon een set aan instructies, net als andere computer programma&#8217;s. Misschien klinkt dit gek, maar computers hebben zegmaar dit gekke gedrag dat ze altijd <em>precies doen wat aan ze wordt opgedragen<\/em>. Een computer besluit niet ineens uit zichzelf om een bepaalde post bovenaan in je feed te zetten. Het is ingeprogrammeerd.<\/p>\n<p>Gelukkig hebben open standaarden en open-source code. Als al deze platforms open standaarden zouden gaan ondersteunen en de source code voor hun algoritmes zou vrijgeven zouden we vrij zijn om gemakkelijk van platform te switchen. We zouden ook kunnen zien hoe en op basis waarvan onze feeds worden geconstruct, deze code aanpassen en kunnen delen met anderen. We zouden alternatieve clients kunnen ontwikkelen die rekening houden met mensen, en hun gedrag niet <a href=\"https:\/\/schooltv.nl\/video\/hoe-maken-apps-ons-verslaafd-psychologische-trucs-van-facebook-instagram-en-whatsapp\/\">be\u00efnvloeden met allemaal psychologische trucs<\/a>. Daarnaast blijkt uit het success van bijvoorbeeld Red Hat, Blender, GIMP en nog veel meer open-source projecten dat je met open-source software ook gewoon geld kan verdienen. Natuurlijk, de grote techbedrijven verdienen dan wat minder, <a href=\"https:\/\/www.emerce.nl\/nieuws\/google-eindigt-2021-nettowinst-76-miljard\">maar ik denk dat ze het kunnen missen<\/a>.<\/p>\n<p>Als er geen open standaarden zouden zijn geweest zou er in de eerste plaats al geen internet zijn. Het <a href=\"https:\/\/en.wikipedia.org\/wiki\/Internet_Protocol\">internet protocol<\/a> kan gewoon iedereen gebruiken. Daarom kunnen al onze computers met elkaar praten, en kan jij nu dus deze post lezen. Ik vind het niet meer dan normaal dat de grote bedrijven die hiervan profiteren dan ook open standaarden zouden ondersteunen. Het zou veel van de huidige problemen met social media zoals verslaving, misinformatie en fake news, discriminatie, maar ook met het internet in het algemeen oplossen. Ik heb het al eerder gezegd, maar het is tijd dat deze bedrijven zelf verantwoordelijkheid nemen inplaatsvan deze bij de eindgebruikers neer te leggen.<\/p>\n<h2>Meer lezen<\/h2>\n<ul>\n<li><a href=\"https:\/\/mxb.dev\/blog\/make-free-stuff\/\">Make Free Stuff<\/a><\/li>\n<li><a href=\"https:\/\/yewtu.be\/watch?v=OFRjZtYs3wY\">Why The Web Is Such A Mess<\/a><\/li>\n<li><a href=\"https:\/\/yewtu.be\/watch?v=BxV14h0kFs0\">This Video Has 51,827,520 Views<\/a><\/li>\n<li><a href=\"https:\/\/www.bol.com\/nl\/nl\/f\/het-internet-is-stuk\/9200000115140353\/\">Het internet is stuk, maar we kunnen het repareren<\/a><\/li>\n<li><a href=\"https:\/\/www.thesocialdilemma.com\">The social dilemma<\/a><\/li>\n<\/ul><\/div>","date_published":"2022-03-08T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/een-maand-zonder-telefoon","title":"Een maand zonder telefoon.","url":"https:\/\/geheimesite.nl\/blog\/een-maand-zonder-telefoon","content_html":"<div><p>Februari was voor mij een speciale maand. Ik had mezelf namelijk gechallenged om een maand lang mijn telefoon niet te gebruiken. In deze post wil ik graag mijn ervaringen delen.<\/p>\n<p>Maar, hoe kwam ik \u00fcberhaupt op dit idee? Ik merkte dat ik de laatste tijd de iedere keer weer op mijn telefoon zat. Als ik thuis kwam, als ik wakker werd, &#8216;s avonds, op school in alle pauzes en zelfs op de wc. Daarnaast merkte ik ook dat ik het irritant vond dat er van je verwacht wordt dat je continue maar de hele tijd bereikbaar moet zijn.<\/p>\n<p>Dus, hoe ging het? Ik moet zeggen dat ik het eigenlijk wel chill vond, maar de laatste week was ik wel een beetje aan het aftellen. En tijdens de pauzes en tussenuren op school, als al mijn vrienden met zijn allen op hun smartphone een spelletje aan het spelen waren, miste ik hem wel. Maar ik vond het ook fijn om niet continue afgeleid te worden, en het zette me ook aan om andere dingen vinden om te doen als ik me verveelde. Ik heb in de eerste week drie boeken uitgelezen, alleen al in de schoolpauzes.<\/p>\n<p>Er waren wel een aantal dingen waar ik tegenaan liep. Ik zit in Schiedam op school, en ik maak altijd huiswerk met mijn beste vriend Kevin, maar bellen wordt lastig zonder telefoon. Discord dan maar, maar dat is wel een stuk minder praktisch. Ook mijn rooster staat op mijn telefoon, en mijn computer &#8216;s ochtends aanzetten was ook niet echt handig, dus ik kwam vijf keer een uur te vroeg op school vanwege uitval.<\/p>\n<p>Maar ik realiseer me nu wel dat ik prima zonder kan en naast wat \u00e9cht belangrijke comminucatie die telefoon eigenlijk niet echt zo belangrijk is. Ik heb gelijk YouTube en Reddit verwijderd<sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/een-maand-zonder-telefoon#fn-1\" id=\"fnref-1\" data-footnote-ref>1<\/a><\/sup>, en die komen waarschijnlijk niet meer terug.<\/p>\n<p>Het is eigenlijk ook wel gek dat we continue bereikbaar moeten zijn. Instant messaging is natuurlijk fijn omdat het je de mogelijkheid geeft om gesprekken te voeren over grote afstand, maar het zorgt er ook voor dat mensen verwachten dat je meteen reageert als ze je appen.<\/p>\n<p>Misschien zullen mensen zeggen dat het cheaten is om mijn laptop te gebruiken<sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/een-maand-zonder-telefoon#fn-2\" id=\"fnref-2\" data-footnote-ref>2<\/a><\/sup>. Maar dat is alsof je zegt dat het cheaten is om aardappelen te eten als je probeert niet meer te snoepen. Het doel was helemaal niet om helemaal geen apparaten te gebruiken. Ik wilde gewoon ervaren hoe het is om niet altijd bereikbaar te zijn en alternatieven manieren te moeten vinden om mijn tijd te besteden. Daarnaast vond ik het ook interessant om te zien wat het zou doen met de sociale omgang met anderen.<\/p>\n<p>Conclusie? Het was zeker een leerzame ervaring. Ik weet niet of ik het per se zou aanraden, maar als dit je inspireerd zou ik er zeker voor gaan.<\/p>\n<p>Maar wat vinden jullie van deze challenge? Zouden jullie het zelf ook willen proberen of is dat niks voor jou? Laat een reactie achter! Ik vind het hardstikke leuk om over dit soort dingen te chatten :)<\/p>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p>Misschien denk je nu: hoe zit het met Snapchat, Instagram, Facebook, TikTok, Twitter en al die andere troep? Die stonden toch al niet op mn telefoon. <a href=\"https:\/\/geheimesite.nl\/blog\/social-media-wat-moeten-we-er-mee-aan\">Ik heb namelijk nogal een hekel aan social media<\/a>. <a href=\"https:\/\/geheimesite.nl\/blog\/een-maand-zonder-telefoon#fnref-1\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"1\" aria-label=\"Back to reference 1\">\u21a9<\/a><\/p>\n<\/li>\n<li id=\"fn-2\">\n<p>Ik moet wel toevoegen dat ik mijn telefoon wel \u00e9\u00e9n keer heb gebruikt om 2FA aan te zetten voor mijn werk omdat ik anders niet meer in mijn account kon, maar daarvoor heb ik alleen de authenticator app geopend en mijn telefoon daarna gelijk uitgezet. <a href=\"https:\/\/geheimesite.nl\/blog\/een-maand-zonder-telefoon#fnref-2\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"2\" aria-label=\"Back to reference 2\">\u21a9<\/a><\/p>\n<\/li>\n<\/ol>\n<\/section><\/div>","date_published":"2022-03-04T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/monocultuur-op-de-browsermarkt","title":"Google, Chromium en een monocultuur op de browsermarkt","url":"https:\/\/geheimesite.nl\/blog\/monocultuur-op-de-browsermarkt","content_html":"<div><p>De letters die je nu leest zijn door mij getypt, naar een Blogger server gestuurd via een glasvezelverbinding, daar opgeslagen in een database en toen ik op publiceren klikte via RSS en de homepage van mijn blog verspreid naar mijn lezers.<\/p>\n<p>Grote kans dat jij nu een browser gebruikt om deze post te lezen (tenzij je een RSS app gebruikt, maar dat is maar een klein percentage van mijn lezers). Een nog grotere kans dat je dit leest via een Chromium browser. Bijna alle grote browsers (behalve Firefox<sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/monocultuur-op-de-browsermarkt#fn-1\" id=\"fnref-1\" data-footnote-ref>1<\/a><\/sup>) zijn op Chromium gebaseerd: Chrome, Microsoft Edge, Brave, Vivaldi, Samsung Internet, Opera.<\/p>\n<p>Dat is een probleem. Begrijp me niet verkeerd, Chromium is geen slechte browser. Er is een reden dat het zoveel wordt gebruikt. Het probleem is dat we \u00e9\u00e9n bedrijf de macht geven over hoe het internet werkt. Als Google een verandering wil in hoe bijv. HTML werkt, kunnen ze dat gewoon afdwingen. Als ze het doorvoeren in Chromium kunnen andere browsers er niet omheen. Zo zijn er eerder dit jaar al wijzigingen doorgevoerd in hoe JavaScript alerts werken in iframes<sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/monocultuur-op-de-browsermarkt#fn-2\" id=\"fnref-2\" data-footnote-ref>2<\/a><\/sup>.<\/p>\n<p>Browserfabrikanten van Chromium-based browsers zouden natuurlijk de wijzigingen gemaakt in Chromium kunnen terugdraaien in hun versie, maar dat betekent dat bij elke nieuwe versie van Chromium die wijziging moet worden doorgevoerd. Dat is veel werk, waar misschien bedrijven als Microsoft het budget en de tijd wel voor hebben, maar voor kleine organisaties zoals Brave en Vivaldi is dat maar de vraag. Daar komt bij dat Microsoft het misschien wel het geld niet waard vindt.<\/p>\n<p>Misschien denk je nu: maar Chromium is toch open-source. Maar het probleem is dat Google het project nog steeds leid. Tenzij er een betere fork komt (kleine kans), is het nog steeds Google die over Chromium en Blink gaat. Het probleem is naast dat we Google gezag geven over de webstandaarden ook, dat developers nog maar op \u00e9\u00e9n browser testen: Chrome. Dat betekent dat compatibility met Firefox en soms zelfs Safari<sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/monocultuur-op-de-browsermarkt#fn-3\" id=\"fnref-3\" data-footnote-ref>3<\/a><\/sup> vaak slecht tot onbruikbaar is. Zo had ik lente vorig jaar bij de online lessen het probleem dat de software van Noordhoff alleen in Chrome werkte. Dus ik een mailtje sturen naar de helpdesk, maar ik kreeg gewoon doodleuk de reactie dat ik dan maar een ondersteunde browser moest gebruiken. Blijkbaar vielen Firefox EN CHROMIUM EDGE buiten de ondersteunde browsers.<\/p>\n<p>De userbase van Firefox krimpt<sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/monocultuur-op-de-browsermarkt#fn-4\" id=\"fnref-4\" data-footnote-ref>4<\/a><\/sup>. Dat betekent dat Chromium in de nabije toekomst misschien wel n\u00f3g meer gebruikers zal krijgen. Er kan dan misschien een monocultuur ontstaan. Ik heb van mijn vader geleerd dat monoculturen slecht zijn omdat er dan dingen dood gaan. In dit geval is dat het internet zoals wij dat kennen.<\/p>\n<p>Oke, dat is misschien wat overdreven, maar je begrijpt het punt. Als we \u00e9\u00e9n bedrijf de macht geven over de internet standaarden, en dat bedrijf heeft ook nog eens belangen bij hoe het internet is ingericht lijkt mij dat geen goed idee.<\/p>\n<p>Dus, wat kan jij hieraan doen? Niet heel veel. Je zou van browser kunnen switchen, naar bijvoorbeeld Firefox. Uiteindelijk is het net als het klimaat. Als je niet in een van de grote organisaties die erover gaan zit kan je er niet heel veel aan doen, behalve je eigen kleine steentje bijdragen en andere bewust maken van het probleem.<\/p>\n<h2 class=\"refs\">Bronnen<\/h2>\n<ul>\n<li><a href=\"https:\/\/arstechnica.com\/gadgets\/2018\/12\/the-web-now-belongs-to-google-and-that-should-worry-us-all\/\">Google isn\u2019t the company that we should have handed the Web over to<\/a><\/li>\n<li><a href=\"https:\/\/groups.google.com\/a\/chromium.org\/g\/blink-dev\/c\/hTOXiBj3D6A\/m\/PVc8zwKTAwAJ?pli=1\">Intent to Remove: Cross origin subframe JS Dialogs<\/a><\/li>\n<li><a href=\"https:\/\/yewtu.be\/watch?v=P39Buvpzjaw\">Google is breaking the web to rebuild it in their own image.<\/a><\/li>\n<\/ul>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p>Je zou kunnen zeggen dat Safari ook niet op Chromium is gebaseerd, maar Safari gebruikt WebKit, dat zo nauw verwant is met Blink (de browser engine van Google) dat het niet echt een verschil maakt. Zeker als je kijkt naar hoeveel mensen Safari gebruiken tenopzichte van Chromium. <a href=\"https:\/\/geheimesite.nl\/blog\/monocultuur-op-de-browsermarkt#fnref-1\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"1\" aria-label=\"Back to reference 1\">\u21a9<\/a><\/p>\n<\/li>\n<li id=\"fn-2\">\n<p>Zie hier een StackOverflow post van andere programmeurs die er last van hadden: <a href=\"https:\/\/stackoverflow.com\/questions\/68492434\/javascript-dialogs-alert-confirm-and-prompt-in-cross-origin-iframe-does-n\">JavaScript dialogs alert(), confirm() and prompt() in cross origin iframe does not work any longer<\/a> <a href=\"https:\/\/geheimesite.nl\/blog\/monocultuur-op-de-browsermarkt#fnref-2\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"2\" aria-label=\"Back to reference 2\">\u21a9<\/a><\/p>\n<\/li>\n<li id=\"fn-3\">\n<p>Ondanks de gelijkenis met Blink en Chromium <a href=\"https:\/\/geheimesite.nl\/blog\/monocultuur-op-de-browsermarkt#fnref-3\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"3\" aria-label=\"Back to reference 3\">\u21a9<\/a><\/p>\n<\/li>\n<li id=\"fn-4\">\n<p>Een artikel over de recente problemen van Firefox: <a href=\"https:\/\/computerworld.com\/article\/3628338\/as-mozilla-talks-up-firefoxs-future-the-present-is-killing-it.html\">As Mozilla talks up Firefox\u2019s future, the present is killing it<\/a> <a href=\"https:\/\/geheimesite.nl\/blog\/monocultuur-op-de-browsermarkt#fnref-4\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"4\" aria-label=\"Back to reference 4\">\u21a9<\/a><\/p>\n<\/li>\n<\/ol>\n<\/section><\/div>","date_published":"2021-12-05T00:00:00Z"},{"id":"https:\/\/geheimesite.nl\/blog\/social-media-wat-moeten-we-er-mee-aan","title":"Social media, wat moeten we er mee aan?","url":"https:\/\/geheimesite.nl\/blog\/social-media-wat-moeten-we-er-mee-aan","content_html":"<div><p>Facebook, Google, Instagram, Snapchat, TikTok, YouTube. Wat zijn de overeenkomsten? Het zijn allemaal (onderdelen van) grote bedrijven. Ze zijn allemaal rijk groot geworden met computersoftware, en allemaal dankzij de groei van het internet. Maar vooral: ze hebben grote invloed op onze samenleving door middel van social media.<\/p>\n<p>Tien jaar geleden dachten we nog dat het een zegen was. Nu lijkt het meer op een vloek. We weten allemaal hoe verslavend het is, hoe het verdeeldheid en een verdraaid wereldbeeld veroorzaakt, hoe onze privacy wordt geschaad en hoe je in rabbitholes kan verdwijnen<sup class=\"footnote-ref\"><a href=\"https:\/\/geheimesite.nl\/blog\/social-media-wat-moeten-we-er-mee-aan#fn-1\" id=\"fnref-1\" data-footnote-ref>1<\/a><\/sup>. Toch zitten de meesten van ons alsnog de halve dag aan hun schermpje vastgelijmd.<\/p>\n<p>Dat is niet zomaar. Deze techbedrijven gebruiken allemaal psychologische trucs om ons zo lang mogelijk op hun app te houden. D\u00e1t is namelijk hoe ze geld verdienen. Als je niet voor het product betaalt, b\u00e9n je het product. Ze verkopen onze data en laten ons naar ads kijken. Er zijn momenteel een aantal problemen, die ik hiervoor al kort noemde:<\/p>\n<ul>\n<li>Het verslavende effect<\/li>\n<li>Verdraaid wereld- en zelfbeeld<\/li>\n<li>Privacy (of het gebrek daarvan eigenlijk)<\/li>\n<\/ul>\n<p>Punt een is het verslavende effect dat social media heeft. Netflix documentaire <a href=\"https:\/\/netflix.com\/nl\/title\/81254224\">the social dilemma<\/a> laat dat met een mix van drama en onderzoek heel mooi zien. Maar mooi is het natuurlijk niet. Het internet en social media zou ons tijd moeten opleveren, niet kosten. In plaats van mensen met elkaar te verbinden, zoals de Facebook homepage zegt, zitten mensen thuis op hun mobieltje te scrollen.<\/p>\n<p>Punt twee is hoe social media een verdraaid wereldbeeld of zelfbeeld kan cre\u00ebren. Als je op Facebook of YouTube zit wordt je feed zo aangepast dat je precies te zien krijgt wat jij leuk vindt. Niks mis mee toch? Gebruikers krijgen wat ze leuk vinden en het techbedrijf verdient er miljoenen aan. Maar het heeft een ongewenst bij effect. Er ontstaan zogenoemde &#8216;rabbitholes&#8217; of &#8216;echochambers&#8217;. Met deze dure woorden bedoelen we dat als je een standpunt hebt, je alleen informatie te zien krijgt die jouw standpunt ondersteunt, en de informatie die jouw mening tegenspreekt wordt weggefilterd. Mensen zijn gemaakt om hun mening bij te kunnen stellen als ze goede tegenargumenten horen. Maar op social media hoor je alleen dingen die jou in het gelijk stellen. We hebben het effect hiervan de laatste jaren kunnen zien, versterkt door de pandemie. Er ontstaat verdeeldheid in de samenleving op een moment dat we dat het minst willen.<\/p>\n<p>En nu heb ik het dus nog niet eens gehad over dat zelfbeeld wat dus niet klopt. Op social media laten mensen alleen de glamour and glow van hun leven zien. Niet de ups and downs, maar alleen de ups. Het effect hiervan is dat als je op social media kijkt, je alleen ziet hoeveel beter iedereens leven is in vergelijking met het jouwe. Ik denk dat je zelf wel kan zien waarom dat niet positief is.<\/p>\n<p>En dan het laatste punt: privacy. Je hebt er vast weleens over gehoord. Denk aan het Cambridge Analytica schandaal van Facebook uit 2018. We moeten niet willen dat grote databanken met al onze persoonsgegevens door bedrijven worden bijgehouden. Volgens <a href=\"https:\/\/en.wikipedia.org\/wiki\/Godwin%27s_law\">Godwin&#8217;s law<\/a> is elke discussie waardeloos nadat er een Hitler vergelijking wordt gemaakt, maar in dit geval vergelijk ik de bedrijven in kwestie niet direct met Hitler, dus denk ik dat het ok\u00e9 is. Maar stel nou: er komt een enge gemene regering aan de macht met slechte intenties. Een wetje erdoorheen douwen waarin staat dat de staat voor &#8216;controle&#8217; of &#8216;ter bescherming van de bevolking&#8217; inzage mag in deze database en ze hebben info over al onze priv\u00e9levens. Niet echt een prettig vooruitzicht toch?<\/p>\n<p>Het ergste is dat kinderen steeds jonger al een smartphone krijgen. Vaak zie je peuters al in de weer op iPads. Zouden we onze kinderen niet tegen deze problemen beschermen? En zo ja, waarom wel de kinderen en niet de volwassenen? Ja, volwassenen kunnen risico&#8217;s inschatten en zelf verantwoordelijkheid nemen, maar zou de verantwoordelijkheid niet moeten liggen bij de techgiganten die deze problemen in de eerste plaats veroorzaken?<\/p>\n<p>Dus, hoe kunnen we dit oplossen? We zouden als eerste stap social media onder de 13 jaar kunnen verbieden. Of in ieder geval &#8220;kinder&#8221; versies, zoals YouTube kids, waarop tracking en AI en andere nonsens is uitgeschakeld en gecheckt is of de videos geschikt zijn voor kinderen. Wat ook erg zou helpen is dingen als pull-to-refresh en infinite scroll uit te zetten. Daarnaast moeten er strengere privacy wetten komen. Ook moeten er wetten over tracking, AI, Machine Learning (ML) en verslaving van social media komen. De huidige wetboeken zijn sterk verouderd en moeten nodig worden geupdate om rekening te houden met internationale techgiganten.<\/p>\n<p>Het is natuurlijk niet erg dat bedrijven geld willen verdienen. Maar ik vind wel dat diezelfde bedrijven dan ook verantwoordelijkheid moeten nemen voor de effecten daarvan.<\/p>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p>Voor ge\u00efnteresseerden, een iet wat dramatische video over social media en de impact ervan op ons leven: <a href=\"https:\/\/yewtu.be\/watch?v=FZvee3-PEzo\">I&#8217;m worried about humanity&#8217;s future.<\/a> <a href=\"https:\/\/geheimesite.nl\/blog\/social-media-wat-moeten-we-er-mee-aan#fnref-1\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"1\" aria-label=\"Back to reference 1\">\u21a9<\/a><\/p>\n<\/li>\n<\/ol>\n<\/section><\/div>","date_published":"2021-12-05T00:00:00Z"}],"language":"en","home_page_url":"https:\/\/geheimesite.nl\/","feed_url":"https:\/\/geheimesite.nl\/feed.json","authors":[{"name":"Robin Boers","url":"mailto:webmaster@roblog.nl","avatar":"https:\/\/geheimesite.nl\/me.jpeg"}]}