RSSAmplifier

Blog

Aral Balkan

Recent content on Aral Balkan

ar.alRSS feed ↗227 posts

Latest posts

Web Numbers

Are you ready for Web Numbers? Domains? Where we’re going, we don’t need domains! IP addresses are about to make a comeback on the web in a big (ok, small) way. What’s all this, then? As some of you might know, I’ve been working for the past six years on building a little thing I call the Small Web . The idea behind the Small Web is to make it as easy as possible to have your own web site at your…

Careless people

Facebook: they sound nice. This is not your father’s book review So, a bit of an admission: I normally don’t read stuff about Big Tech, even though I’ve been railing against it in one form or other for a little over the past decade. Why? It gets me angry. Like, really angry. I used to believe, back when I was giving dozens of talks a year about the problem – talks with titles like Free is a Lie ,…

Optimal automation

We keep seeing the following cycle in growth-based systems: A technology is introduced that improves a manual process via automation. The technology is iteratively improved, eventually reaching an optimal state of automation. Instead of stopping there 1 , due to infinite growth requirements, we move past the optimal state to excessive automation. Excessive automation can remove the positive…

Kitten Kawaii: porting a React library and Next.js web site to Kitten

Interactive embed (play with it) Kitten Kawaii is a Kitten port of React Kawaii by Miuki Miu (Elizabet Oliveira) that you can play with in the interactive embed above (also try it out in its own window/tab so you can see its responsiveness and URL-based state). I stumbled on Muiki Miu ’s (Elizabet Oliveira’s) adorable React Kawaii web site and wanted to use one of the characters in my Kitten app.…

Small Web: computer science colloquium at University of Groningen

Download the video and watch it with your favourite video player. Recording 1 of the live stream of a computer science colloquium on the Small Web I presented at the University of Groningen on June 11th, 2024. ( Transcript ) Update: I was going back and forth between calling the personal social network Place and Yarn. In the talk, I refer to it as Yarn. As I’ve been working more on it, I’ve…

Fedora has been shipping with a broken screen reader for nine years but the real problem is me

Fedora, a major Linux distribution, has been shipping with a broken screen reader for nine years 1 . This can only happen in an ableist culture. If there is one takeaway you need from this post, it’s this. Unless you’re interested in the details or the ensuing drama, you can stop reading here and you will not have missed out on much. What is a screen reader? A screen reader is a core assistive…

Small Technology Foundation funding application for NLnet Foundation NGI Zero Core seventh call

Yesterday, I spent most of the day getting Kitten ’s new interactive shell working over a socket connection (this isn’t trivial if you want your shell to display Node.js REPL’s preview completions properly ). Then, I took fifteen minutes to submit Small Technology Foundation ’s application for funding from the seventh call of the NLnet Foundation NGI Zero Core for our work on realising the Small…

New Kitten features: Interactive Shell (REPL), Multi-page Settings, and backup and restore (data portability)

Sorry, your browser doesn't support embedded videos. But that doesn’t mean you can’t watch it! You can download the video and watch it with your favourite video player. Yours truly demonstrating the new Interactive Shell (REPL), Multi-page Settings, and backup and restore (data portability) features. Links Kitten interactive shell (REPL) tutorial Streaming HTML tutorial Domain Like this? Fund us!…

Draw Together

Sorry, your browser doesn't support embedded videos. But that doesn’t mean you can’t watch it! You can download the video and watch it with your favourite video player. Let me take you step-by-step as I remake Draw Together from scratch. Draw Together is a little collaborative drawing toy I made with Kitten on Saturday night. You can play with it in the live embed above , watch the video in this…

Streaming HTML

Sorry, your browser doesn't support embedded videos. But that doesn’t mean you can’t watch it! You can download the video and watch it with your favourite video player. Building the Streaming HTML counter example. Estimated reading time: 25 minutes. Kitten has a new experimental workflow for creating web apps called Streaming HTML that I want to introduce you to today. Kitten, uniquely, enables…

End-to-end encrypted Kitten Chat

Sorry, your browser doesn't support embedded videos. But that doesn’t mean you can’t watch it! You can download Small Is Beautiful #27 directly , and watch it with your favourite video player. Small Is Beautiful (Feb, 2023): End-to-end encrypted Kitten Chat (an example peer-to-peer Small Web app using Kitten . Follow the tutorial to build it yourself from scratch or browse the source code ). In…

Installing Helix Editor Language Servers

Helix Editor using the Bash Language Server to show the symbols in the script included in this post. Helix Editor I’ve been using Helix Editor as my daily driver for web development for most of this year and – while it has some outstanding issues 1 (what doesn’t?) – I’m really enjoying it. 2 One of the issues that might trip new folks is that while it has Language Server Protocol (LSP) support,…

Is the fediverse about to get Fryed? (Or, “Why every toot is also a potential denial of service attack”)

Stephen is a big fish to fry. (I’m here all week.) Warning: the fediverse is about to get Fryed. Stephen Fry ed, that is. Following the recent takeover of Twitter by a proto-fascist billionaire man-baby, people have been fleeing 1 to the fediverse 2 . Among them are folks who, on Twitter, at least, had millions of followers like Greta Thunberg and, more recently, Stephen Fry. 3 “Well, surely…

NLnet Grant Application for Domain Rejected

On October 12th, 2022, we recevied the following form letter, informing us that our NLnet Grant Application ( original application , follow-up questions and answers ) for Domain has been rejected. Dear Aral, I'm sorry to have to inform you that your project 'Domain' (2022-08-099) unfortunately was not selected for a grant. This in no way means that we do not see the value of the work you proposed.…

Nlnet Grant Application for Domain – First Update: Questions and Answers

This is the first update to our NLnet Grant Application for Domain . You applied to the 2022-08 open call from NLnet. We have some questions regarding your project proposal Domain. Thank you for getting back to us. Please find the answers, inline, below. You requested 50000 euro, equivalent of one year of effort. Can you provide some more detail on how you arrived at this time estimate? Could you…

Small Is Beautiful Episode 22 Small Web Kitten Dweb Camp Braid

Dear Linux, Privileged Ports Must Die

Privileged ports, toffs of the Linux world. Kitten is a small web server that runs as a user-level service and would never need elevated privileges if it wasn’t for one archaic anti-security feature in Linux that dates back to the mainframe era: privileged ports. Back to the future As it was in Unix in the 1980s , so it is now, that any process that wants to bind to a port less than 1024 must have…

Lipstick on a Pig: learning the most important lesson in design

I just released a little tool called Lipstick on a Pig that helps keep the visual appearance of supported command-line applications in sync with the current light/dark mode setting (colour scheme) of your system in GNOME. But why is this tool even necessary to begin with? Let’s start at the beginning… Getting to GNOME you The GNOME display environment 1 , since version 42, implements support for…

Make Helix Editor follow the system colour scheme

Black Box adheres to the system colour scheme in GNOME. This is a niche post for those of you using a Terminal application that adheres to system light/dark mode settings 1 (like the excellent Black Box by Paulo Queiroz ) and Helix Editor . The problem is that Helix editor currently does not support separate light and dark themes or switching between them automatically when your system does. This…

NLnet Grant Application for Domain

This is my application to get NLnet funding to work on Domain as part of the User-Operated Internet Fund 1 I feel it’s important that such grant applications are made public so everyone has visibility into the process. This will allow us to collectively learn from the experience and perhaps even to improve the process itself. As such, I’ll be making my end of the process as public as possible by…

Using bound functions to unit test EcmaScript Modules

Imagine you have the following EcmaScript module you want to unit test: // untestable.js const configurationValue = 'something' export function functionToTest () { return configurationValue } The problem is you can’t test it for different values of configurationValue (which, in a real example, might be based on a runtime quality of your app). You can’t because configuration value is private to the…

Decentralisation begins at decentring yourself

My talk at the Department of Art & Media Technology, University of Southampton, on Wednesday, February 16th, 2022. This morning, I was invited to gave a talk at the Department of Art & Media Technology, University of Southampton. I was invited by Adam Procter, a long-time ally who heads up the department, as part of a new series of talks to help shape department policy on digital and networked…

NodeKit extension for Codium

NodeKit for Codium: a reluctant fork of Svelte Language Tools. This past week, I cobbled together 1 a very basic NodeKit extension for Codium . Download 📦 nodekit-for-codium-0.5.0.vsix 💡 What’s NodeKit? Watch the NodeKit video introduction to find out. Install Either drag the downloaded package to the Extensions panel of Codium or, in your terminal, run the following command from the folder you…

Everyone Hates Facebook (but this is more than just about Facebook)

“And my timelines lit up in a rare unity, the left and right, the rich and the poor, the healthy and the sick, all pleading and nodding and saying, yes, yes please, please do that.” - Adam Dalliance Well, it’s official, everybody hates Facebook . But why we hate it matters. As does what we intend to do about it. For more good reasons to hate Facebook and other people farmers, watch my talk, The…

NodeKit Update

Since the initial demo of NodeKit at last week’s Small Is Beautiful , we now actually have a nodekit command, the server now does naïve restarts on route changes, and routes are now lazily loaded the first time they’re hit. I wanted to record this before jumping down the rabbit hole of implementing some form of hot module reloading/replacement using WebSockets and MorphDOM . Like this? Fund us!…

The web0 manifesto

The web0 manifesto: a short and sweet middle finger to web3. Is it Covid or bullshit allergy? Towards the end of 2021, I started noticing more and more “articles” on “web3” cropping up, each one more grating than the last. It was as if journalists public relations hacks 1 were in a race to the death to see who could best parrot the latest right-libertarian techbro bullshit from bullshit press…

How to send an email

How to send an email by speaking SMTP interactively to an email server. (This is how email works under the hood and it’s simpler than you might think. Play the video and follow along.) Like this? Fund us! Small Technology Foundation is a tiny, independent not-for-profit. We exist in part thanks to patronage by people like you. If you share our vision and want to support our work, please become a…

The Three Laws of Personal Devices

The Universal Declaration of Cyborg Rights states that we extend our selves using digital and networked technologies and that this extended self must be protected under human rights law. As the primary means by which we extend ourselves today are through our everyday personal devices – computers, mobile phones, the so-called “Internet of Things” and “smart” homes, cars, etc. – we must enshrine the…

Saying goodbye to an old friend

How do you like them apples? We didn’t and poor Better paid the price. Trillion-dollar corporations are not your friend. This isn’t a revelation to me. I’ve been saying it for some time now. And yet, over the years, I’ve taken my share of flack for seeing Apple as a viable mainstream stopgap based on its business model. Well, that position has become untenable ever since Apple announced , got…

Comet

Comet. Wallpaper illustation by Margo de Weerdt After several months of work, Comet version 1.0 is now available to install on elementary OS 6 . Comet is one of the artefacts from my three-month-long elementary OS 6 upgrade adventure and I will be writing more about the process of creating an app according to the elementary OS guidelines – what worked, what didn’t, and what can be improved –…

Ireland’s two-tier health insurance system

Sorry, your browser does not support embedded audio. Download the recording. An excerpt from an almost ten-minute phone call with a Vhi corporate advisor. (Transcript.) Question How do you get pre-existing conditions and waiting periods waived when getting health insurance from Vhi in Ireland? Answer: You start working at a multi-billion dollar American Big Tech company like VMWare . We’re all…

The magic one-line ImageMagick 7 AppImage installer

To install ImageMagick 7 on any distribution that supports AppImage , copy and paste this one-line script into your favourite shell: bash -lic 'wget -O /tmp/magick https://download.imagemagick.org/ImageMagick/download/binaries/magick && chmod +x /tmp/magick && test \$(wget -qO- https://download.imagemagick.org/ImageMagick/download/binaries/digest.rdf | grep 'rdf:about=\'magick\'.*' -A6 | sed -rn…

How to apply a chroma key using ImageMagick

Yesterday, I wrote a short post on the fediverse with an overview of how to take a screenshot of an app with a context menu showing in elementary OS, while keeping its alpha channel and drop shadow using Krita . Today, I decided that since I want localised screenshots for Comet in the elementary OS AppCenter , I have to automate the screenshotting process (as I have 5 screenshots per language and,…

My three-month-long elementary OS 6 upgrade adventure in three parts. (Part 1: Catts)

I just upgraded my operating system from elementary OS 5 to 6. It only took me three months. The journey begins elementary OS 6 (Odin) was officially released on August 10th, 2021 . Since there is no auto-update tool, you have to back everything up, wipe your computer, and install the new operating system from scratch. It took me a few days to build up the courage to do so. On August 14th, after…

How to count Unicode glyphs in Vala using Gtk

Want to try something really scary this Halloween? Try counting the characters in a string in Vala . For example, how many characters do you think there are in the following string? var zombie = '🧟‍♀️️' ; One? You’re right! So how would you go about getting this result in Vala? Use zombie.length , did I hear you say? Oh, you poor, dear, naïve, sweet thing… '🧟‍♀️️' . length // 13 What’s that?…

How to change the colour of the underline in gspell

gspell is GNOME’s spell-checking library. When it discovers misspelld wrds , it underlines them in dark red. (Only, it can’t do wavy underlines so it does solid ones.) To change the colour, say to Dracula pink for dark mode, you set gspell_text_view.underline_color = "#ff79c6"; Haha, just kidding, you can’t. There’s a 5-year issue open to ask for an option to change the colour. Being the Henry…

How to disable Gtk-Message warnings in your app

So every elementary OS app at the moment, if you start it from Terminal, welcomes you with a variation of the following salutation: Gtk-Message: … : Failed to load module 'canberra-gtk-module' Gtk-Message: … : Failed to load module 'canberra-gtk-module' Isn’t that friendly? The journey begins… I initially thought this was a long-standing issue with Flatpak ( and I was a shady bitch about it too )…

Implementing dark mode in a handful of lines of CSS with CSS filters

I finally got round to implementing dark mode for this site (the cobbler’s children have no shoes and all that…) Here’s all the CSS I had to add: @ media ( prefers-color-scheme : dark ) { /* Invert all elements on the body while attempting to not alter the hue substantially. */ body { filter : invert ( 100 % ) hue-rotate ( 180 deg ); } /* Workarounds and optical adjustments. */ /* Firefox…

Omnibus GitLab Let’s Encrypt renewal error and fix

I moved source.small-tech.org , our self-hosted GitLab instance, to Eclips.is a few months ago and noticed today that the Let’s Encrypt certificate had failed to renew. When I looked on the server, the outdated Let’s Encrypt certificates were in /etc/gitlab/ssl as expected but, when I looked in the GitLab configuration file ( /etc/gitlab/gitlab.rb ), the Let’s Encrypt integration section was…

Key Mapper: a visual tool for remapping keys (and more) on Linux

Mapping keys has never been easier in Linux. I’m a bit particular when it comes to typing. Specifically, I like to use good typographical habits whenever possible. And, I use an external keyboard with a physical ANSI US Keyboard layout set to UK Macintosh layout on my Linux laptop 1 . So, I need to reclaim my backtick/tilde key . Previously, I used a combination of xmodmap , xev , and a .desktop…

Apple is trying to redefine what it means to violate your privacy. We must not let it.

Screeching for freedom. Illustration by Jérémie Fontana. I was there when Steve Jobs unveiled the original iPhone (ironically, I gave a talk on Flash there right after his keynote). I started making apps for iOS from day one, learned Swift while it was still in alpha and updated my code with every new version. My work has been featured by Apple on its App Store and our app, Better Blocker , has…

Fish shell

Fishing for a new shell? (Sorry.) Beautiful defaults Good design isn’t about removing the seams altogether 1 ; it’s about having beautiful defaults and layering the seams. And this is something that Fish shell absolutely nails. To be fair, I have no idea why I didn’t give it a proper shot until yesterday. I guess because Zsh, or more precisely Oh My Zsh , has been perfectly adequate. It’s not…

Remote: a little module for more elegant remoting with WebSockets

Remote 1 is a tiny ( < 50 lines of code ) module that creates a very lightweight façade over a socket connection, using convention over configuration to give you an expressive interface with which to send outgoing messages and handle incoming ones. You can use it both on the server and on the client. 2 Here’s a simple Site.js example that performs some basic arithmetic on the server and keeps a…

Make anything a JavaScript module using Node.js ESM Module Loaders

Disclaimer: you can’t load an actual bottle into Node.js (yet). I have a message in a text file called bottle.txt . Here’s how I load it into Node.js and output it to the console: import message from 'bottle.txt' message() Wait, what? How? I’m glad you asked. It’s thanks to Node.js’s experimental ESM Module Loaders feature . Here’s how you can implement this using the excellent node-esm-loader…

Archival cascades: a practical way to not break URLs

Cascades are beautiful things. This week, I reduced our DigitalOcean hosting costs for Small Technology Foundation from ~$90/month to $5/month by moving our canonical source code repositories as well as a few other servers to the complimentary hosting provided to our not-for-profit by the Eclips.is initiative by Greenhost and Open Technology Fund . As part of the move, I had to decide what to do…

How to get clean analog audio from a Blue Yeti microphone into a Sony a6400 camera using a Raspberry Pi Zero

Download the video. A live demonstration from today’s S’update. Transcript ) Clean audio = clean USB power You can connect the headphone out of a Blue Yeti microphone into the mic in of a Sony a6400 camera but the quality of the audio you get will depend on how clean the USB source powering your Blue Yeti is. In order to get analog audio into your camera from a Blue Yeti, you need to plug the Blue…

JSDB Migrations

I’m busy working on Basil , the Small Web host, and while it’s nowhere near ready to use yet, I thought I’d try my hand at writing a database migration as they will be necessary once other people start using it. Basil runs on Site.js and Site.js uses JSDB – JavaScript Database — as its database. True to its name, JSDB is 100% JavaScript, so, of course, you write your migrations in JavaScript also.…

Scraping the latest EU VAT rates for e-services from the European Commission’s web site with Node.js

So, you now know how to verify an EU VAT number with Node.js . Lucky you! (Don’t say I don’t spoil you.) But do you know what the latest VAT rates are every EU country? (Do you? Huh, do you, punk?) OK, so you can find them here . Yes, that’s an HTML page. No, I haven’t been able to find a simple JSON feed or anything. Yes, it is 2021. Example So anyway, here’s one way you can scrape it using…

Using the European Commission EU VAT Number validation API with Node.js

You may know of the VIES site where you can manually validate EU VAT numbers but did you know that the European Commission also has an API for programmatically doing this? 1 So that’s the good news. The bad news is that it’s SOAP . I’ll wait until you’re done retching… ok, feeling better? Let’s move on. Example Here’s how you consume it in Node.js: Install the soap package: npm install soap Create…

Hell site

They have a word for Twitter on the fediverse. They call it “hell site”. It’s very apt. When I first joined about 15 years ago, at the end of 2006, it was a very different place. A small, non-algorithmically curated space where you could have group chats with your friends. What I didn’t know back then was that Twitter, Inc., was a venture-capital-funded startup. It wouldn’t have mattered if I’d…