I wanted to use Android on Linux, so I searched the web and found https://waydro.id/.
Instead of running in some kind of virtual machine, it seems to run Android slightly more natively on Linux (I really don't know how any of this works).
Here is a small adventure at trying to install it:
$ sudoaptinstallcurl ca-certificates
$ curl-s https://repo.waydro.id |sudobash
$ sudoaptinstall waydroid
$ waydroid init
[11:27:05] Failed to load binder driver
[11:27:05] modprobe: FATAL: Module binder_linux not found in directory /lib/modules/6.13.0-061300-generic
[11:27:05] ERROR: Binder node"binder"for waydroid not found
[11:27:05] See also: https://github.com/waydroid
I don't really know what this error meant, but after searching, it seemed that Waydroid needed "wayland" and I was using X (which are both Desktop thingies which make pixels appear on the screen). I read things about Pop!_OS not having something necessary installed in the kernel, but I could use "DKMS", meaning Dynamic Kernel Module Support. So I tried installing what I'd found links to with:
git clone https://github.com/choff/anbox-modules
cd anbox-modules && ./INSTALL.sh
now when I ran waydroid init it worked, but then I got nothing. I wasn't really sure what I was supposed to be doing to "open" it now that it was "init"'d. So I deleted all I could with
git clone https://github.com/n1lby73/waydroid-installer
cd waydroid-installer
sudobash install_script.sh
The script didn't complete, and complained about modules not installing, specifically that lxd-client could not be installed.
Looking at the script I saw it was trying to run apt install lxd-client but running that myself, it seemed that it didn't exist:
$ sudoaptinstall lxd-client
E: Unable to locate package lxd-client
After searching, it seems lxd-client provides a command lxc, so I looked for how to install lxc, and found it was possible via snap. I've not really used snap before and people have complained about it (about filesize and automatic updates), so I was wary to install it, but I did with:
I removed lxd-client from the install script and re-ran it, and it seemed to work OK. It said it installed a "Wayland" desktop option on my login page if I rebooted.
Opening waydroid
So I rebooted, and on the login screen selected "Pop on Wayland" (I'm still not fully sure what this X/Wayland thing is), and tried starting Waydroid.
…installed some apps and filled one of my screens with a big Android display.
I found the APKs on either F-Droid, which just has them available for download (sweet) or by searching the web and downloading them from sketchy sites.
It seems to work well!
I suppose there's a lot you can do with Waydroid, if you want. I don't think I want.
In some ways, this is an example of the involved-nature of installing things on Linux.
I've toyed for a while with microcontrollers, and only really used Arduino/C/C++. Sometimes, I've heard talk of MicroPython, but I've never tried it out.
Until today!
I had a little experiment, and it seems promising. I might have a larger experiment soon (maybe try to retry some of my hardware hacking).
I'll share here my initial experiments! I'm running on a Linux computer, on Pop!_OS.
# install files and virtual environmentmkdir-p /git/micropython
cd /git/micropython
python -m venv env. env/bin/activate
pip install esptool
# download firmware
$ ls
ESP8266_GENERIC-20241129-v1.24.1.bin
# at this point I plugged in the ESP but it was not recognised# after looking at `tail -f /var/log/syslog`, I saw that `brltty`# was doing something spooky. I remembered having this issue before,# and that `brltty` was something to help Braille readers. As I don't# need that, I...# disabled brlttysudo systemctl stop brltty.service
sudo systemctl mask brltty.service
sudo systemctl disable brltty.service
sudo systemctl restart
# now I could see the ESP as a USB device
$ lsusb
$ ls /dev/ |grep"ttyUSB"
ttyUSB0
# flash ESP
esptool.py --port /dev/ttyUSB0 erase_flash
esptool.py --port /dev/ttyUSB0 --baud1000000 write_flash --flash_size=4MB -fm dio 0 ESP8266_GENERIC-20241129-v1.24.1.bin
That's it installed! Now, using the guides above I found I needed a terminal emulator, so I used picocom. And, to reach the pinnacles of complexity, tried turning the inbuilt LED on and off.
sudoaptinstall picocom
picocom /dev/ttyUSB0 -b115200>>> from machine import Pin
>>> p = Pin(2, Pin.OUT)>>> p.off()>>> p.on()
It works! Neat! The REPL (Read-Evaluate-Print-Loop) is really nice to quickly debug with. Perhaps nicer than the "waiting-for-20-seconds-for-your-C-code-to-flash-onto-the-device".
I also tried connecting to WiFi and using the Web-REPL, so you can execute Python commands over the air! With...
>>>import network
>>> wlan = network.WLAN(network.WLAN.IF_STA)>>> wlan.active(True)>>> wlan.scan()>>> wlan.isconnected()>>> wlan.connect("ssid", "key")>>># wait a bit>>> wlan.isconnected()>>># or use function from https://docs.micropython.org/en/latest/esp8266/quickref.html#networking
Then you can configure webrepl with:
>>>import webrepl_setup
…and it will print out an IP that you can connect to and use the REPL from your browser! Very nice.
What I haven't tried yet is using boot.py. From what I know it will execute on every reset of the ESP, so basically is how you "program" it, but a lot quicker, since you just place a file on the filesystem.
I was screwing around on YouTube, and ended up watching a few videos about Rust. Actually, these ones: the first, leading to the second, leading to the third.
These videos are all by noboilerplate, and I got only 1:08 minutes into the third video before I decided to try out Rust myself.
For a long time I've been meaning to make an identicon (think: default pixelated profile picture for GitHub/etc) using Lua, after seeing a friend's identicon implementations in several language. I think, as they do, that making an identicon generator is a very fun and contained way to start experimenting with a new language - you get involved with random numbers, arrays, string formatting, loops, and maybe more.
Anyway, I still haven't made one in Lua, but I did make these three in Rust.
Installing Rust
Installing Rust was super easy, I just used the command from https://rustup.rs/.
Installing VSCodium extensions
Well, first I installed using sudo apt install cargo, but then the VSCodium extension I installed (Rust) suggested I should use rustup, so I uninstalled cargo and used rustup.
Then, I also found out that the VSCodium extension was deprecated in favour of the rust-analyzer extension, so I installed that one instead. I also installed CodeLLDB to allow debugging.
Running Rust
After installing Cargo, I ran cargo and it complained about a missing Cargo.toml, so I guessed I could run…
cargo init
…to create this, and it worked! Neat. It also showed a nice link to the documentation for Cargo.toml. I still haven't opened the Cargo.toml file. Anyway, cargo init also created a "hello world" script:
fnmain(){println!("Hello, world!");}
…which I could run with cargo run…
$ cargo run
Hello, world!
At this point, I got stuck in trying to make the above identicons. I (naturally) came across a few stumbling blocks, but the errors that the compiler provides were quite nice, so I got along OK.
Here's the final code I ended up with (feel free to tell me that several sections are "bad" or "not Rust-y")
userand::prelude::*;constWIDTH:usize=15;constHEIGHT:usize=15;constSQUARE_SIZE:usize=50;constSVG_WIDTH:usize=WIDTH*SQUARE_SIZE;constSVG_HEIGHT:usize=HEIGHT*SQUARE_SIZE;fnmain(){letmut rng =rand::rng();// generate one half of the identicon// let mut arr: [[bool; 0]; 0] = [];letmut arr:Vec<Vec<bool>>=vec![];for r in0..HEIGHT{let empty_arr:Vec<bool>=vec![];
arr.push(empty_arr);for _c in0..((WIDTH+1)/2){let random_val = rng.random_bool(0.5);
arr[r].push(random_val);}}// print the SVGprintln!("<svg version='1.1'
viewbox='0 0 {} {}'
xmlns='http://www.w3.org/2000/svg'>",SVG_WIDTH,SVG_HEIGHT);println!("<rect width='{}' height='{}' fill='black' />",SVG_WIDTH,SVG_HEIGHT);for r in0..arr.len(){let arr_first = arr.first();letmut cols =0;ifletSome(arr_first)= arr_first {
cols = arr_first.len();}for c in0..cols {let xleft = c *SQUARE_SIZE;let xright =SVG_WIDTH- xleft -SQUARE_SIZE;let y = r *SQUARE_SIZE;let filled = arr[r][c];letmut colour ="none";if filled {
colour ="red";}println!("<rect width='50' height='50' fill='{}' x='{}' y='{}' />",
colour, xleft, y
);println!("<rect width='50' height='50' fill='{}' x='{}' y='{}' />",
colour, xright, y
);}}println!(r#"</svg>"#);}
Sticking points
Two things that I got a bit stuck with were:
Not declaring loads of variables
I wasn't sure how to do a lot of things "in-line", and ended up declaring lots of variables, making the code quite verbose. For example, to push an empty vector to another vector I ended up doing (above) this…
let empty_arr:Vec<bool>=vec![];
arr.push(empty_arr);
…which I'm sure could be done in one line somehow. I don't know how.
Finding the length of an Option
To get the length of an embedded Vec (vector), I wanted to run arr.first().len() in some way, but arr.first() is either a vector or None (i.e., an optional/Option). I wanted to do something like:
if arr.first().is_none(){let cols =0;}else{let cols = arr.first().len();}
…assuming that the compiler would realise that in the else section, arr.first() was not None, but it didn't. I don't know enough to figure out a way of doing this.
It's combined from train journeys, ferry journeys, and bus journeys.
Train data
I got the train routing data in .gpx format from https://brouter.damsy.net/, selecting the "Rail" profile in the dropdown. Then, I clicked close to the stations I went to/from/past, got a nice map that looked alright, and exported it.
Bus data
I also used https://brouter.damsy.net/ for this, after I'd found it was good for trains. I just selected one of the "Car" profiles, and set my waypoints, and exported it in the same way.
Ferry data
This was different, as ferries don't use roads or train tracks [citation needed]. But! They are documented well on mapping services. So, I found the route I wanted on https://www.openstreetmap.org/ (OSM) (e.g., the Liepãja to Travemünde Ferry) by using the little questionmark "query feature" button, then opened it on https://overpass-turbo.eu/ (a website for querying OSM data) by writing the query (with the correct feature ID):
way(128069455); out geom;
Then, I can click "Export" to get the .gpx (or other format) data out.
Combining
I spent a long time trying to figure out how to combine .gpx files with ogrmerge.
However, I couldn't figure it out. .gpx is confusing, and everyone who uses it seems to use GUI tools like arcgis or qgis, while I prefer to be able to do things with a command, which I can then repeat in future.
In the end, I converted the files to .geojson (my one true love) with ogr2ogr file111.geojson file111.gpx tracks for each file, and then combined them. Handily, I'd already written a note about combining .geojson files! I wish I stuck in .geojson the whole time. .gpx gives me headaches.
The End
That's it!
I could then load the combined file into https://geojson.io/ to check all was well (it was, I expected I might have to "reverse" some paths to be "forwards"), and I uploaded it to a new GitHub repository, https://github.com/alifeee/europe-trips/.
I also laser cut a mini Europe with a line for the trip on the map, as a gift for my lover :]
It does many, many things, but I mainly use it to click links and browser between webpages without using a mouse.
With it installed, I can visit a webpage like:
Celeste is a 2018 platform game https://en.wikipedia.org/wiki/Platform_game…
…developed and published by Indie studio Maddy Makes Games https://en.wikipedia.org/wiki/Maddy_Makes_Games.
The player controls Madeline, a young woman with anxiety and depression who endeavors to…
…climb Celeste Mountain https://en.wikipedia.org/wiki/Mount_Celeste.
During her climb, she encounters several characters, including a personification of her self-doubt named Badeline, who attempts to stop her from reaching the mountain's summit.
…press f, and all the clickable links are highlighted with letters (here "a", "s", and "d"). I can then press these letters to "click" the corresponding links.
Celeste is a 2018 platform game https://en.wikipedia.org/wiki/Platform_game…
a
…developed and published by Indie studio Maddy Makes Games https://en.wikipedia.org/wiki/Maddy_Makes_Games.
s
The player controls Madeline, a young woman with anxiety and depression who endeavors to…
…climb Celeste Mountain https://en.wikipedia.org/wiki/Mount_Celeste.
d
During her climb, she encounters several characters, including a personification of her self-doubt named Badeline, who attempts to stop her from reaching the mountain's summit.
It is super neat.
It has a lot of other features that I don't use; lots of them are based on Vim keybindings (which I don't use). But, the things I do use are:
f to highlight all clickable elements and links, then the corresponding highlights to click them
i which is the same as f but only for inputs like text forms
gu (go up one subdirectory) or gs (go to page source) or g# (go to page without hashlink) to modify the URL
ya to highlight all links on the page, and the shown keys copy the links
zv to select an element, to copy it with CTRL+V (this enters Vim cursor/select mode, which I've not used, so mainly just confuses me)
Sometimes Surfingkeys interferes with the keybindings or JavaScript of a website, and makes it weird. These times, I turn it off with Alt + s.
I'm interested in easy ways to see change. Trying to compare the old and new webpages by eye is hard, which leads me to text-diffing. I can copy the contents of the website to a file and compare them that way. Let's. I did a similar thing a while ago with computer benchmarks.
I manually create two files by copying the interesting bits of the webpage, called 1 and 2 (because who has time for .txt extensions). Then, I can run:
The latter command turns each into HTML by turning + lines into <ins> ("insert"), - into <del> ("delete"), and removing leading spaces on other lines. Then, I can whack the output into a simple HTML template:
<!DOCTYPEhtml><html><head><style>body{background: black;color: white;}pre{padding: 1rem;}del{text-decoration: none;color: red;}ins{text-decoration: none;color: green;}</style></head><body><pre>
diff goes here...
<del>del lines will be red</del><ins>ins lines will be green</ins></pre></body></html>
The final output is something like this (personal information removed. don't doxx me.)
Energy rating
D
Valid until
05 February 2025
05 February 2035
Property type
Mid-terrace house
Total floor area
130 square metres
123 square metres
This property’s energy rating is D. It has the potential to be C.
This property’s energy rating is D. It has the potential to be B.
Features in this property
Window Fully double glazed Good
Roof Pitched, no insulation (assumed) Very poor
Roof Roof room(s), no insulation (assumed) Very poor
Roof Roof room(s), insulated (assumed) Good
Lighting Low energy lighting in 64% of fixed outlets Good
Lighting Low energy lighting in all fixed outlets Very good
Secondary heating None N/A
Primary energy use
The primary energy use for this property per year is 303 kilowatt hours per square metre (kWh/m2).
The primary energy use for this property per year is 252 kilowatt hours per square metre (kWh/m2).
Good job on us for having 100% low energy lighting fixtures, I guess...
Really, this is a complicated way to simplify something. I like simple things, so I like this.
I replaced some things. I didn't manage to replace everything. Change is, and should be, incremental.
Here is a list, mostly copied from my notes, of what I replaced, and what I didn't. The title of each item is verbatim copied from my notes, and I have added context underneath each.
I replaced my Google Drive usage with a weird setup where I use Syncthing to sync several folders between my devices, and to share large files I either upload them to my server (bad advice, technical knowledge needed), or I upload them to Wormhole where they get deleted after 24 hours. I don't have much need to share files for a long time, but I'd consider Nextcloud.
Photos -> ???
I thought about this a lot, but Google Photos is too good for me. Maybe another day.
Calendar -> ???
I installed Tasks and Fossify Calendar. I tried to use them, but in the end, Google Calendar won out, and I still use it.
Keep -> ???
I didn't really replace keep, I just started using it less. I put most of my notes in Obsidian, but I still have it installed. Sometimes, when I want to take a really quick note, I'll put it in there.
Maps -> OpenStreetMap
I still use Google Maps, but I've been using OpenStreetMap more recently, and while interrailing last month, I mainly used OsmAnd because of its great offline maps. Day-to-day, I still use Google Maps, because it has most-or-every business, and websites, and opening times, which OSM tries but just doesn't (yet…) have the data for.
I found Fossify who make "generic apps" for Android like the gallery, file explorer, contacts, calendar, messages, notes, etc. I haven't used many of them, apart from the file explorer, which I like.
Facebook
Facebook -> delete it
my suggested replacement here was "delete it". I haven't. Sometimes I open it for "mindless phone downtime", but I have a 5 minute daily app timer on it, so not for long.
Instagram -> PixelFed
I tried to import my Instagram export into Pixelfed, but it wouldn't work when I deleted my DMs from the files (as these are not needed to import only posts). I raised an issue, and left it at that. Since then, PixelFed has gotten quite a lot more popular. I haven't tried again recently, but I find the main developer of PixelFed a little weird on Mastodon. That means nothing, but… I just haven't tried again.
Messenger/WhatsApp -> Signal
I am slowly convincing friends and group chats to move to Signal. It goes well.
Microsoft
OneDrive -> Cryptpad/Nextcloud or Syncthing
see Google Drive above. I have also stopped using OneDrive.
That site is good. This was probably the biggest switch in this list. I installed Linux in increments, first on my PC, then on my laptop, then on my Gaming PC, which ends up with Steam's Proton able to play anything I could have played on Windows! I'm loving it. I have Pop!_OS, backed up in a custom way.
GitHub -> sourcehut, codeberg, gitlab, etc
I haven't started on this one, even though I should. I have so many things on GitHub, and I feel as if I create a new repository every week. Combine that with all the GitHub actions I use, and I say rightfully that Microsoft has me. It's not what I want, but it's what I have.
I looked into this one a lot, and talked to a few people I knew on Mastodon for advice. Ultimately, I discovered people's opinions and experiences that it was neat, but there were enough compatibility problems to be annoying. Particularly, that banking apps would semi-regularly break on non-stock-Android OSes, and that the banking app companies would say "we don't care". I use a very digital banking app where I only keep between £0 and £50 on my card, and it would be very annoying for me to not shuffle money around easily. I already have boneless Wednesday. I did enjoy installing LineageOS on an old phone though.
The rest
Notion -> Obsidian
Notion is classic lock-in. It was also a place where I had a lot of notes. I made an export, downloaded Obsidian (which, sadly, is still not open source - but your notes are simply text files, so I hazard if it were to go weird, there would be many Open Source pop-ups, or I could use VSCodium, etc.), and imported my export. It worked pretty well. Most files had double spaces where I only had single in Notion, and the databases ended up pretty weird (as loads of flat files), which made my Notion spider diagram look super weird. Anyway, I love Obsidian now. I sync my vault between my devices with Syncthing, and when there are editing conflicts, I use a great plugin.
Several months ago I was removed from a Spotify Family plan that I was on, so stopping my Spotify usage was pretty easy. I didn't resubscribe, and I mainly listen to the radio now (BBC Radio 6 Music ! the best station !). Sometimes, I miss being able to choose what I'm listening to. I tried to get SoundCloud, but it didn't have as much music on as I wanted (or it was restricted to a "super Pro" version). However, I do want it back. I might re-subscribe soon.
to be honest, mine wasn't an evil corporation, I just wanted a new one (I was using 123-reg and it's super annoying to configure my DNS settings). It was difficult to web-search for this, and I ended up using Porkbun, which isn't even on the list above.
email
Format-break. I spent a long time looking at options, and ended up finding a bunch. Here was a list I had:
I wanted to use a custom domain (alifeee.net), I wanted to use wildcard domains (anyone@alifeee.net), I wanted to use maybe a few custom domains (alfierenn.dev), I wanted to use IMAP and SMTP (so I could view my emails with Thunderbird). Turns out those requirements were restrictive to make a lot of the above list bad options, which left me Proton or Mailbox.org.
There was a problem with Proton which I can't remember, so I am using Mailbox.org. I like it. Free your email.
The End
I started the push maybe six months ago. Maybe I did OK, maybe I didn't. But, I certainly made some changes, and I think that's good.
Why not take a look at https://switching.software/ and think about whether you are fine with the number of tentacles that American Big-Tech companies have in your life.
I had an old Android phone I didn't use, and a lover who wanted to use Ankidecks without paying £30 for the Apple version. The Android version is an open source app.
What I'd looked at before
A while ago I looked into installing GrapheneOS or CalyxOS on my Android phone, which is a Google Pixel something, but after researching, found there could be problems with banking apps and other "secure apps", and I decided it wasn't worth the pain.
But, I still wanted to see what it was like, so I looked into installing something that wasn't Android onto my old phone, a Samsung A70. Neither GrapheneOS, nor CalyxOS, nor LineageOS supported the device, which was a bit annoying. One of the greatest uses for me for open source, freeing OSes, seems to be installing them on old software to give it more life (see: Linux), but I suppose these are for different audiences (people who already have a really expensive phone and can afford to now also have privacy).
What guides to follow
After a bit more searching the web, I found an unofficial build for the A70, so I started installing! The process took a while, and I mainly:
...which is a lot of steps, including a lot of strange words. But, probably doable. From here, I describe all the "annoying little specific things I had to do":
I do a lot of this with thermal printers and web servers and... yeah. Here, I make "Samsung phones" (USB devices that have a vendor ID of 04e8) writable by anyone (0666) and owned by the plugdev group (and also add myself to that group).
One thing I find every time with groups is that if you add yourself to one, you aren't in it until you restart the device. Not wanting to restart my PC with all my tabs open, I usually run sudo su alifeee in a terminal and then the "new" user has the group.
install "recovery image"
I'm still not sure what a recovery image is, but I now describe it as "a thing that lets you install other things (OSes)". I had to enable "OEM Unlocking" in the Android developer settings, reboot the device holding all the buttons, then choose "unlock device".
It didn't work (odin said there was an error), and after some advice from the web, I booted to Android, turned on WiFi, and tried again, and it worked. Strange. Then I ran:
$ ./odin4 -a recovery.img.tar -d /dev/bus/usb/001/017
Check file: recovery.img.tar
/dev/bus/usb/001/017
Setup Connection
initializeConnection
Receive PIT Info
success getpit
Upload Binaries
recovery.img
vbmeta.img
Close Connection
install LineageOS
At this point, when I restarted the phone, I had a neat recovery thing with some buttons, that reminded me of SpaceTeam or Space Trader. I clicked apply update > apply from ADB and then uploaded LineageOS and Google Apps with:
$ adb -d sideload lineage-21.0-20241031-UNOFFICIAL-a70q.zip
Total xfer: 1.00x
$ adb -d sideload MindTheGapps-14.0.0-arm64-20250203_200051.zip
Total xfer: 1.00x
…then "reboot system now", and I'm in!
I installed F-Droid, a FLOSS app store, and then AuroraStore, which is a mirror (or something) of the Google Play Store, so you can install Google Apps with it.
the end
I skipped about 3 hours of screwing around, trying to run things, running the wrong things, finding advice on the Internet, discarding advice from the Internet, and otherwise encountering unexpected things. Computing.
But, it was an OK process. Not as fun as when I cracked a Wii. But a (much more usable) neat LineageOS phone as a result.
I wanted to know which hackspaces published their membership prices using SpaceAPI, and what those rates were. Here are a few bash scripts to do just that:
# get the directory of SpaceAPIsmkdir-p ~/temp/spaceapi/spaces
cd ~/temp/spaceapi
curl"https://directory.spaceapi.io/"| jq > directory.json
# save (as many as possible of) SpaceAPIs to local computertot=0;got=0whileread double;dotot=$(($tot+1))name=$(echo"${double}"|awk -F';''{print $1}');url=$(echo"${double}"|awk -F';''{print $2}');fn=$(echo"${name}"|sed's+/+-+g')echo"saving '${name}' - <${url}> to ./spaces/${fn}.json";# skip unless manually deleted if[-f"./spaces/${fn}.json"];thenecho"already saved!"got=$(($got+1))continuefi# get, skipping if HTTP status >= 400curl-L-s--fail --max-time 5"${url}"-o"./spaces/${fn}.json"||continueecho"fetched! maybe it's bad :S"got=$(($got+1))done<<<$(cat directory.json | jq -r'to_entries | .[] | (.key + ";" + .value)')echo"done, got ${got} of ${tot} files, $(($tot-$got)) failed with HTTP status >= 400"# some JSON files are malformed (i.e., not JSON) - just remove themforfilein spaces/*.json;docat"${file}"| jq > /dev/null
if[["${?}"-ne0]];thenecho"${file} does not parse as JSON... removing it..."rm"${file}"fidone# loop every JSON file, and nicely output any that have a .membership_plans objectforfilein spaces/*.json;doplans=$(cat"${file}"| jq '.membership_plans?')[["${plans}"=="null"]]&&continueecho"${file}"# echo "${plans}" | jq -cecho"${plans}"| jq -r'.[] | (.currency_symbol + (.value|tostring) + " " + .currency + " " + .billing_interval + " for " + .name + " (" + .description + ")")'echo""done
The output of this final loop looks like:
...
spaces/CCC Basel.json
20 CHF monthly for Minimal ()
40 CHF monthly for Recommended ()
60 CHF monthly for Root ()
...
spaces/RevSpace.json
32 EUR monthly for regular ()
20 EUR monthly for junior ()
19.84 EUR monthly for multi2 ()
13.37 EUR monthly for multi3 ()
...
spaces/Sheffield Hackspace.json
£6 GBP monthly for normal membership (regularly attend any of the several open evenings a week)
£21 GBP monthly for keyholder membership (come and go as you please)
...
see full output
spaces/CCC Basel.json
20 CHF monthly for Minimal ()
40 CHF monthly for Recommended ()
60 CHF monthly for Root ()
spaces/ChaosStuff.json
120 EUR yearly for Regular Membership (For people with a regular income)
40 EUR yearly for Student Membership (For pupils and students)
40 EUR yearly for Supporting Membership (For people who want to use the space to work on projects, but don't want to have voting rights an a general assembly.)
1 EUR yearly for Starving Hacker (For people, who cannot afford the membership. Please get in touch with us, before applying.)
spaces/dezentrale.json
16 EUR monthly for Reduced membership ()
32 EUR monthly for Regular membership ()
42 EUR monthly for Nerd membership ()
64 EUR monthly for Nerd membership ()
128 EUR monthly for Nerd membership ()
spaces/Entropia.json
25 EUR yearly for Regular Members (Normale Mitglieder gem. https://entropia.de/Satzung_des_Vereins_Entropia_e.V.#Beitragsordnung)
19 EUR yearly for Members of CCC e.V. (Mitglieder des CCC e.V. gem. https://entropia.de/Satzung_des_Vereins_Entropia_e.V.#Beitragsordnung)
15 EUR yearly for Reduced Fee Members (Schüler, Studenten, Auszubildende und Menschen mit geringem Einkommen gem. https://entropia.de/Satzung_des_Vereins_Entropia_e.V.#Beitragsordnung)
6 EUR yearly for Sustaining Membership (Fördermitglieder gem. https://entropia.de/Satzung_des_Vereins_Entropia_e.V.#Beitragsordnung)
spaces/Hacker Embassy.json
100 USD monthly for Membership ()
spaces/Hackerspace.Gent.json
25 EUR monthly for regular (discount rates and yearly invoice also available)
spaces/Hack Manhattan.json
110 USD monthly for Normal Membership (Membership dues go directly to rent, utilities, and the occasional equipment purchase.)
55 USD monthly for Starving Hacker Membership (Membership dues go directly to rent, utilities, and the occasional equipment purchase. This plan is intended for student/unemployed hackers.)
spaces/Hal9k.json
450 DKK other for Normal membership (Billing is once per quarter)
225 DKK other for Student membership (Billing is once per quarter)
spaces/Leigh Hackspace.json
24 GBP monthly for Member (Our standard membership that allows usage of the hackspace facilities.)
30 GBP monthly for Member+ (Standard membership with an additional donation.)
18 GBP monthly for Concession (A subsidised membership for pensioners, students, and low income earners.)
40 GBP monthly for Family (A discounted family membership for two adults and two children.)
5 GBP daily for Day Pass (Access to the hackspace's facilities for a day.)
5 GBP monthly for Patron (Support the hackspace without being a member.)
spaces/LeineLab.json
120 EUR yearly for Ordentliche Mitgliedschaft ()
30 EUR yearly for Ermäßigte Mitgliedschaft ()
336 EUR yearly for Ordentliche Mitgliedschaft + Werkstatt ()
120 EUR yearly for Ermäßigte Mitgliedschaft + Werkstatt ()
spaces/<name>space Gera.json
spaces/Nerdberg.json
35 EUR monthly for Vollmitgliedschaft (Normal fee, if it is to much for you, contact the leading board, we'll find a solution.)
15 EUR monthly for Fördermitgliedschaft ()
spaces/NYC Resistor.json
115 USD monthly for standard ()
75 USD monthly for teaching ()
spaces/Odenwilusenz.json
0 CHF yearly for Besucher ()
120 CHF yearly for Mitglied ()
480 CHF yearly for Superuser ()
1200 CHF yearly for Co-Worker ()
spaces/RevSpace.json
32 EUR monthly for regular ()
20 EUR monthly for junior ()
19.84 EUR monthly for multi2 ()
13.37 EUR monthly for multi3 ()
spaces/Sheffield Hackspace.json
£6 GBP monthly for normal membership (regularly attend any of the several open evenings a week)
£21 GBP monthly for keyholder membership (come and go as you please)
spaces/TkkrLab.json
30 EUR monthly for Normal member (Member of TkkrLab (https://tkkrlab.nl/deelnemer-worden/))
15 EUR monthly for Student member (Member of TkkrLab, discount for students (https://tkkrlab.nl/deelnemer-worden/))
15 EUR monthly for Student member (Junior member of TkkrLab, discount for people aged 16 or 17 (https://tkkrlab.nl/deelnemer-worden/))
spaces/-usr-space.json
I think a couple have weird names like <name>space or /dev/tal which screw with my script. Oh well, it's for you to improve.
Overall, not that many spaces have published their prices to SpaceAPI. Also, the ones in the US look really expensive. As ever, a good price probably depends on context (size/city/location/etc).
Perhaps I can convince some other spaces to put their membership prices in their SpaceAPI...