All blogs / Society / politics / economy
Aral Balkan
Aral Balkan’s personal web site. Covers small technology as an alternative to big tech and surveillance capitalism, human rights in the digital age (cyborg rights), personhood, and democracy.
Society / politics / economyWeb developmentJavaScript / TypeScript
- Posts
- 228 from 1 Jan 2001 to 25 Jun 2025
- Posting
- now and then
- Kind
- personal blog
- Feed
- https://ar.al/index.xml
2025 2
2024 8
- Optimal automation
- Kitten Kawaii: porting a React library and Next.js web site to Kitten
- Small Web: computer science colloquium at University of Groningen
- Fedora has been shipping with a broken screen reader for nine years but the real problem is me
- Small Technology Foundation funding application for NLnet Foundation NGI Zero Core seventh call
- New Kitten features: Interactive Shell (REPL), Multi-page Settings, and backup and restore (data portability)
- Draw Together
- Streaming HTML
2023 1
2022 15
- Installing Helix Editor Language Servers
- Is the fediverse about to get Fryed? (Or, “Why every toot is also a potential denial of service attack”)
- NLnet Grant Application for Domain Rejected
- Nlnet Grant Application for Domain – First Update: Questions and Answers
- Small Is Beautiful Episode 22 Small Web Kitten Dweb Camp Braid
- Dear Linux, Privileged Ports Must Die
- Lipstick on a Pig: learning the most important lesson in design
- Make Helix Editor follow the system colour scheme
- NLnet Grant Application for Domain
- Using bound functions to unit test EcmaScript Modules
- Decentralisation begins at decentring yourself
- NodeKit extension for Codium
- Everyone Hates Facebook (but this is more than just about Facebook)
- NodeKit Update
- The web0 manifesto
2021 34
- How to send an email
- The Three Laws of Personal Devices
- Saying goodbye to an old friend
- Comet
- Ireland’s two-tier health insurance system
- The magic one-line ImageMagick 7 AppImage installer
- How to apply a chroma key using ImageMagick
- My three-month-long elementary OS 6 upgrade adventure in three parts. (Part 1: Catts)
- How to count Unicode glyphs in Vala using Gtk
- How to change the colour of the underline in gspell
- How to disable Gtk-Message warnings in your app
- Implementing dark mode in a handful of lines of CSS with CSS filters
- Omnibus GitLab Let’s Encrypt renewal error and fix
- Key Mapper: a visual tool for remapping keys (and more) on Linux
- Apple is trying to redefine what it means to violate your privacy. We must not let it.
- Fish shell
- Remote: a little module for more elegant remoting with WebSockets
- Make anything a JavaScript module using Node.js ESM Module Loaders
- Archival cascades: a practical way to not break URLs
- How to get clean analog audio from a Blue Yeti microphone into a Sony a6400 camera using a Raspberry Pi Zero
- JSDB Migrations
- Scraping the latest EU VAT rates for e-services from the European Commission’s web site with Node.js
- Using the European Commission EU VAT Number validation API with Node.js
- Hell site
- Ethics as PR (or the ‘Some Very Good People Work There!’ Fallacy)
- Using Subresource Integrity (SRI) in Vite with @small-tech/vite-plugin-sri
- Clean up the web
- Passing data from layouts to pages in SvelteKit
- Site.js starter template for vite + svelte
- npm init using
- References to methods are a JavaScript minefield
- fs-extra to fs
- Cache busting in Node.js dynamic ESM imports
- CommonJS to ESM in Node.js
2020 20
- Snowpack Hot Module Replacement (HMR) from scratch with vanilla JavaScript
- Skypack: Backdoor as a Service?
- Why I wrote 152 extra lines of code just to do the same thing (and why I’d do it again today)
- Introducing JSDB
- What if data was code?
- What is the Small Web?
- Live Stream: A web site on your phone with Site.js
- Mentoring the Eastern Partnership Civil Society Online Hackathon
- How to use the Zoom malware safely on Linux if you absolutely have to
- How Apple and Google will cure COVID-19 and how you can opt into it if you want to keep your job
- Al Jazeera Live interview on corporate and government mass surveillance in the time of COVID-19
- Apple just killed Offline Web Apps while purporting to protect your privacy: why that’s A Bad Thing and why you should care
- Fail-fast on missing required arguments in JavaScript using default values that throw
- Flying to Antwerp tomorrow to present the opening keynote at Dig It Up on Thursday
- A happy ending to the Better Blocker saga
- Apple App Review: resistance is futile!
- Apple App Review says “maybe”: the whims of trillion-dollar gatekeepers
- “Apple Says ‘No!’” and what that means for the future of Better Blocker following our move to Ireland
- Dear Apple, a little help here? How hard can it be to move our developer account to our new not-for-profit?
- In 2020 and beyond, the battle to save personhood and democracy requires a radical overhaul of mainstream technology
2019 65
- The Future of Internet Regulation at the European Parliament
- Small Technology Foundation Personal Web Prototype-01: a mobile personal web server
- Introducing @small-tech/https, a batteries-included drop-in replacement for the Node.js https module
- Site.js: now with auto updates in production
- Site.js: now with auto server reload on source code changes
- Site.js: now with live reload
- Fixing read-only file system errors after do-release-upgrade from Ubuntu 14.04 LTS to 16.04 LTS
- How to migrate from VSCode to VSCodium (the best code editor ever minus the corporate bullshit)
- The little Raspberry Pi that could (serve a web site)
- Site.js: now easier than ever to update
- Scary git-lfs “bad object” error not so scary after all
- Install git-lfs on a Raspberry Pi
- Site.js and Pi
- Build a simple chat app with Site.js
- Site.js, now also on Windows 10
- Introducing Small Technology Foundation, Site.js, and Tincan
- Small Technology at the Interactive Future Exhibition in Darmstadt
- ar.al is now running on a new server
- Have you heard about Silicon Valley’s unpaid research and development department? It’s called the EU.
- Rerun cloud-init on multipass
- Export/import issues with GitLab CE
- The Do’s and Don’ts of Tech Regulation
- Slavery 2.0 and how to avoid it: a practical guide for cyborgs
- Indie Web Server 9.1.0: Better error handling
- Indie Web Server 9.0.0: Housekeeping
- Indie Web Server 8.2.0: Cascading archives for an evergreen web
- Aral Balkan (@aral@mastodon.ar.al)
- Fixing the icon regression in Pop!_OS 19.04
- Indie Web Server 8.1.1: Reverse proxy (local mode)
- This site now runs on Indie Web Server
- Set up a live static personal web site in seconds with Indie Web Server 8.0.0
- Indie Web Server 7.1.0: Launch a live secure static site with a single command
- Indie Web Server: now with native 404 to 302 support for an evergreen web
- Custom error pages for Indie Web Server
- Upcoming talks: April
- How to trim an MP4 video without re-encoding it
- Using the Advanced Scene Switcher Plugin with manual overrides in OBS Studio
- Open Broadcaster Software Studio is amazing!
- Introducing Indie Web Server (video)
- Reclaiming your backtick/tilde key with a UK Macintosh key layout on an ANSI US Keyboard in GNOME
- Setting multiple key bindings for the same action in GNOME
- Indie Web Server
- HTTPS Server: now with seamless Let’s Encrypt support
- Upcoming talks: March
- HTTPS Server
- Nodecert
- Small Technology
- Hypha: Glossary
- Privacy is not a science, it is a human right
- On the General Architecture of the Peer Web (and the placement of the PC 2.0 era within the timeline of general computing and the greater socioeconomic context)
- Hypha Spike: Persistence 1
- Hypha Spike: Multiwriter 2
- Hypercore protocol deep dive
- Hypha Spike: Multiwriter 1
- Hypha Spike: WebRTC 1
- Hypha Spike: Diceware
- Hypha Spike: DAT 1
- I was wrong about Google and Facebook: there’s nothing wrong with them (so say we all)
- Hypha Spike: Aspect Setup 1
- The post-Web is single tenant
- Success criteria for the PC 2.0 era
- Deployment-first development
- Hypha Spike: Deployment 1
- Getting Green Recorder running on Wayland under Gnome on Ubuntu 18.10-based systems
- Al Jazeera News interview: French “tech tax”
2018 81
- Sometimes you have to stick a screwdriver in it (or how to liberate a Chromebook in ten easy steps)
- Tilingnome
- What does a private communicator look like?
- A simple Node transform stream with the new Node 10 pipeline() function
- Boogie Board: a beautiful, modern, portable take on the blackboard
- Kappa Architecture workshop
- Remember directory from last session in Tilix with zsh
- Surveillance Capitalism at the BBC
- Baby steps
- GDMR: this one simple regulation could end surveillance capitalism in the EU
- Gnomit 1.0.6
- Better Blocker 2018.2 release for macOS and iOS
- Gnomit 1.0.5
- With this amazing trick, you can stay an extra night in Paris but only if you use Linux!
- version: display Linux version information
- Gnomit 1.0.4
- Updating firmware on Dell XPS 13 With Pop!_OS 18.04
- Setting up Hiawatha web server on Ubuntu 16.04
- Better Blocker: thank you for our best week yet!
- Better Blocker for macOS Mojave
- Better Blocker for iOS 12
- Workaround for unclickable app menu bug with window.makeKeyAndOrderFront and NSApp.activate on macOS
- Responsive design got my app rejected
- Better, simpler, and more affordable
- Extended Codice Interview With Rai 1
- Better Blocker: two year review and thoughts on the future
- Get Unicode-aware length of string in JavaScript
- Gnomit Flatpak bundle
- Introducing Gnomit: a simple Git commit message editor for Gnome
- How to install the Vala Reference Manual into Devhelp using the apt package manager
- New Philosopher: How power corrupts
- Off to Denmark for Smukfest
- Getting your iCloud contacts on GNU/Linux
- Using iCloud calendars on GNU/Linux
- Multi-writer Dat could power the next Web
- How to enable the Browse Files setting in GSConnect
- Crafting a continuous-client desktop/mobile experience on Linux with GSConnect
- How to install DAT on mobile under Termux
- Workaround for npm install error on Lineageos 15.1
- Web development on a phone with Hugo and Termux
- Out of the frying pan and into the fire
- Broadcasting your phone’s screen to web browsers using Screen Stream
- Fix for “No Bluetooth Found” error after wake from sleep
- Getting started with WireGuard on Linux using AzireVPN
- Pop!_OS 18.04: the state of the art in GNU/Linux on desktop
- Camera fix for Samsung S9 (LineageOS 15.1)
- Upgrade Little Snitch Before Upgrading to Mojave Beta
- iOTA 360
- Typographical typing habits for Linux
- Open from terminal in Linux
- Enabling Better Blocker in GNOME Web
- Changes
- Adding “command not found” apt package suggestions to zsh
- Flashing stock firmware onto a Samsung Galaxy S9+ (SM-G965F) on Ubuntu 18.04 using Heimdall
- Initial git configuration
- Casino Data
- Whither ethics, New Scientist?
- Rsync Permissions and Termux
- Web+ on a Phone
- Spellcheck With Emacs on Termux
- Nginx: Remember to remove the default site
- Phones LineageOS 15.1 is officially supported on
- Refining the RSS
- Reclaiming RSS
- Are You Logging IPs Without Even Knowing?
- The Real News: Turkish Elections
- Kyriarchy
- Web
- Demonstrating Web + Dat
- We Make the City: Next Generation Cities
- We Make the City: Opening Night
- Digital Masquerade
- Working From De Waag
- Override BaseURL in Hugo Server
- Little Saigon
- Public Stack Summit
- Giddy about CSS grid
- Formatting an ISO 8601 date stamp in Hugo
- Refining the blog
- Revision history
- Hello Peer-to-Peer Web