I have been a happy customer of Spotify for several years now, after flirting back and forth with Apple Music, Google Play Music and the late Rdio for several years before that. We have a family subscription, which we all three use extensively, no more so than Oliver who, for many months now has been making nightly playlists to go to sleep listening to.

Spotify has recently been promoting itself as much a podcast player as a streaming music service, and Oliver has followed the lead and has accumulated a subscription list of 1500+ podcasts in Spotify.

Last night, though, he was thinking about migrating to something else for his podcast listening: he didn’t like the fact that, although the Android Spotify app sports an “episodes” tab, the desktop player for the Mac does not, which makes tracking recently-released episodes on his Mac more challenging.

Having found a possible alternative, Oliver set out to move his list of podcasts from Spotify to a new app, and was immediately faced with a task that would have extended for several days: for each of the podcasts in Spotify he was taking the title, copying and pasting it into the new app, and subscribing there. Over and over and over. When this job threatened to take over his Friday, to the exclusion of other activities, I interceded and told him that we should simply export his list of podcasts from Spotify and import it into the new app.

How naive I was.

Spotify, it turns out, is a prison for podcasts.

Spotify takes podcasting, a system that is a marvel of decentralized openness, built on the strong and flexible (and open) foundation of RSS, and locks it inside a closed, proprietary system with no way of getting data in or out. You can’t import lists of podcasts. You can’t export lists of podcasts. You can’t add your own podcasts.

Surely, I thought, given the GDPR, there must be a way of getting Oliver’s personal information–including his podcasts–out of Spotify.

And there is, in theory: if you visit your Account page in Spotify, and then navigate to Privacy, and scroll down to the bottom, you will see a section called Download your data, full of promise.

Until you read the fine print and learn that “This can take up to 30 days to complete”:

Screen shot of the Download your data section of Spotify's Privacy page

How it’s possible to create a system that takes 30 days to assemble digital data boggles the mind, and while it may live up to the letter of the GDPR, it surely defies the spirit.

What about using the Spotify API?

Although it’s not documented, there is and endpoint that exposes the list of podcasts for a user.

Here’s how you can get at it (with the caveat, detailed below, that you are wasting your time).

Go to the Web API Console for the “Get User’s Profile” endpoint and click Get Token and then copy the cURL command on the right side (I’ve redacted Oliver’s token):

Screen shot of generating a Spotify token.

If you simply paste this cURL into the Mac command line, you’ll get back your basic account information:

{
  "birthdate" : "XXXX-XX-XX",
  "country" : "CA",
  "display_name" : "Oliver Rukavina",
  "email" : "o@ruk.ca",
  "explicit_content" : {
    "filter_enabled" : false,
    "filter_locked" : false
  },
  "external_urls" : {
    "spotify" : "https://open.spotify.com/user/12154891049"
  },
  "followers" : {
    "href" : null,
    "total" : 13
  },
  "href" : "https://api.spotify.com/v1/users/12154891049",
  "id" : "12154891049",
  "images" : [ {
    "height" : null,
    "url" : "https://profile-images.scdn.co/images/userprofile/default/6a5a73861526ed7cece0ea757ab1f043277d7ebb",
    "width" : null
  } ],
  "product" : "premium",
  "type" : "user",
  "uri" : "spotify:user:12154891049"
}

If you edit this command, however, and tack shows onto the end of the URL, replacing https://api.spotify.com/v1/me with https://api.spotify.com/v1/me/shows, you’ll get back a JSON representation of your first 20 podcast subscriptions, with each one represented by an object like this:

{
    "added_at" : "2019-03-27T02:16:27Z",
    "show" : {
      "available_markets" : [ "AD", "AE", "AR", "AT", "AU", "BE", "BG", "BH", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "DZ", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "ID", "IE", "IL", "IN", "IS", "IT", "JO", "JP", "KW", "LB", "LI", "LT", "LU", "LV", "MA", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "OM", "PA", "PE", "PH", "PL", "PS", "PT", "PY", "QA", "RO", "SE", "SG", "SK", "SV", "TH", "TN", "TR", "TW", "US", "UY", "VN", "ZA" ],
      "copyrights" : [ ],
      "description" : "It's the Peter and Oliver podcast all grown up. ",
      "explicit" : false,
      "external_urls" : {
        "spotify" : "https://open.spotify.com/show/6bDdMX7OmjDG1u5ebEhNRX"
      },
      "href" : "https://api.spotify.com/v1/shows/6bDdMX7OmjDG1u5ebEhNRX",
      "id" : "6bDdMX7OmjDG1u5ebEhNRX",
      "images" : [ {
        "height" : 640,
        "url" : "https://i.scdn.co/image/8beec05386bfef3e095bcdf46aafaee112d55fdb",
        "width" : 640
      }, {
        "height" : 300,
        "url" : "https://i.scdn.co/image/4f70272b77c24c619a79486d6c88445b976151f7",
        "width" : 300
      }, {
        "height" : 64,
        "url" : "https://i.scdn.co/image/807d9151f7fa4a0ccd96c80d0c9bc265152b6012",
        "width" : 64
      } ],
      "languages" : [ "en-US" ],
      "media_type" : "audio",
      "name" : "Oliver And Peter Podcast",
      "publisher" : "Oliver Rukavina",
      "type" : "show",
      "uri" : "spotify:show:6bDdMX7OmjDG1u5ebEhNRX"
    }
}

You may be thinking “wow, this is amazing!” until you notice that nowhere in that JSON is any information that falls outside the Spotify universe: none of the standard trappings of open podcast data–the feed URL, the website, the non-Spotify-hosted artwork–are there.

And these details also aren’t there if you follow the URL in the “href” to get all the show details:

{
  "available_markets" : [ "AD", "AE", "AR", "AT", "AU", "BE", "BG", "BH", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "DZ", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "ID", "IE", "IL", "IN", "IS", "IT", "JO", "JP", "KW", "LB", "LI", "LT", "LU", "LV", "MA", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "OM", "PA", "PE", "PH", "PL", "PS", "PT", "PY", "QA", "RO", "SE", "SG", "SK", "SV", "TH", "TN", "TR", "TW", "US", "UY", "VN", "ZA" ],
  "copyrights" : [ ],
  "description" : "It's the Peter and Oliver podcast all grown up. ",
  "episodes" : {
    "href" : "https://api.spotify.com/v1/shows/6bDdMX7OmjDG1u5ebEhNRX/episodes?offset=0&limit=50",
    "items" : [ {
      "audio_preview_url" : "https://p.scdn.co/mp3-preview/1c405e3e511e5e7199a45b1de32f83e5f88c7e24",
      "description" : "This first episode is about Vancouver BC Canada ",
      "duration_ms" : 92624,
      "explicit" : false,
      "external_urls" : {
        "spotify" : "https://open.spotify.com/episode/79W2zHGuUttBOInh642kNR"
      },
      "href" : "https://api.spotify.com/v1/episodes/79W2zHGuUttBOInh642kNR",
      "id" : "79W2zHGuUttBOInh642kNR",
      "images" : [ {
        "height" : 640,
        "url" : "https://i.scdn.co/image/53b71df32a85645777ba73afa2e9e738bd788534",
        "width" : 640
      }, {
        "height" : 300,
        "url" : "https://i.scdn.co/image/2cc3d2acae39674b3c3bfdc53ae2286a692b1376",
        "width" : 300
      }, {
        "height" : 64,
        "url" : "https://i.scdn.co/image/2f6bd66373d51f8f6f62b55997539e1554a3df4a",
        "width" : 64
      } ],
      "is_externally_hosted" : false,
      "is_playable" : true,
      "language" : "en-US",
      "name" : "Oliver and Peter Podcast episode 1",
      "release_date" : "2019-03-20",
      "release_date_precision" : "day",
      "type" : "episode",
      "uri" : "spotify:episode:79W2zHGuUttBOInh642kNR"
    }, {
      "audio_preview_url" : "https://p.scdn.co/mp3-preview/1b3548d7561908fd8b4c6625e5e4d1fdbc8198bd",
      "description" : "Episode 1 is about Vancouver BC Canada  ",
      "duration_ms" : 26958,
      "explicit" : false,
      "external_urls" : {
        "spotify" : "https://open.spotify.com/episode/5bH6wVgbHQ5aCJdthQLZrk"
      },
      "href" : "https://api.spotify.com/v1/episodes/5bH6wVgbHQ5aCJdthQLZrk",
      "id" : "5bH6wVgbHQ5aCJdthQLZrk",
      "images" : [ {
        "height" : 640,
        "url" : "https://i.scdn.co/image/53b71df32a85645777ba73afa2e9e738bd788534",
        "width" : 640
      }, {
        "height" : 300,
        "url" : "https://i.scdn.co/image/2cc3d2acae39674b3c3bfdc53ae2286a692b1376",
        "width" : 300
      }, {
        "height" : 64,
        "url" : "https://i.scdn.co/image/2f6bd66373d51f8f6f62b55997539e1554a3df4a",
        "width" : 64
      } ],
      "is_externally_hosted" : false,
      "is_playable" : true,
      "language" : "en-US",
      "name" : "Oliver and Peter Podcast episode 1",
      "release_date" : "2019-03-20",
      "release_date_precision" : "day",
      "type" : "episode",
      "uri" : "spotify:episode:5bH6wVgbHQ5aCJdthQLZrk"
    } ],
    "limit" : 50,
    "next" : null,
    "offset" : 0,
    "previous" : null,
    "total" : 2
  },
  "explicit" : false,
  "external_urls" : {
    "spotify" : "https://open.spotify.com/show/6bDdMX7OmjDG1u5ebEhNRX"
  },
  "href" : "https://api.spotify.com/v1/shows/6bDdMX7OmjDG1u5ebEhNRX",
  "id" : "6bDdMX7OmjDG1u5ebEhNRX",
  "images" : [ {
    "height" : 640,
    "url" : "https://i.scdn.co/image/8beec05386bfef3e095bcdf46aafaee112d55fdb",
    "width" : 640
  }, {
    "height" : 300,
    "url" : "https://i.scdn.co/image/4f70272b77c24c619a79486d6c88445b976151f7",
    "width" : 300
  }, {
    "height" : 64,
    "url" : "https://i.scdn.co/image/807d9151f7fa4a0ccd96c80d0c9bc265152b6012",
    "width" : 64
  } ],
  "is_externally_hosted" : false,
  "languages" : [ "en-US" ],
  "media_type" : "audio",
  "name" : "Oliver And Peter Podcast",
  "publisher" : "Oliver Rukavina",
  "type" : "show",
  "uri" : "spotify:show:6bDdMX7OmjDG1u5ebEhNRX"
}

Like I said: a prison.

And there’s another problem: this is both an undocumented API call and a broken one.

In theory you should be able to specify a “limit” and an “offset” parameter to page through podcasts and retrieve them all, like:

curl -X "GET" "https://api.spotify.com/v1/me/shows?offset=0&limit=20"
curl -X "GET" "https://api.spotify.com/v1/me/shows?offset=20&limit=20"
curl -X "GET" "https://api.spotify.com/v1/me/shows?offset=40&limit=20"
curl -X "GET" "https://api.spotify.com/v1/me/shows?offset=60&limit=20"

and so on.

But that doesn’t work.

I’m able to retrieve at most 50 podcasts (out of Oliver’s 1,986 total subscriptions). And using the Spotify web player confirms this breakage, showing a scrolling list of 50 podcasts that repeats and repeats and repeats.

Because this is an undocumented, and thus unsupported API call, it’s not like I can dial 1-800-SPOTIFY to ask for help.

But I’m not willing to give up the fight, so I forge on with this crazy, destructive nuclear option, which involves working around this bug in the undocumented API by pulling the podcasts 50 at a time, saving their name and ID, and then deleting them using another undocumented API call, so that I can then get the next 50 podcasts. And so on. Until I have them all.

(Warning: if you use this code you will be unsubscribing from all your podcasts, one by one by one).

<?php

$bearer = "INSERT THE TOKEN YOU GOT FROM THE API CONSOLE HERE";

// Open a file to write the podcast names to
$fpout = fopen("allshows.tsv", 'w');

// We're getting 1,986 podcasts, 50 at a time, and
// 1986 / 50 = 40, so we loop 40 times.
for ($show = 1 ; $show <= 40 ; $show++) {

  // Get the details of 50 podcasts from the Spotify API as JSON
  $url = 'curl -s -X "GET" "https://api.spotify.com/v1/me/shows?limit=50' .
         '" -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: Bearer ' .
         $bearer .
         '"';

  $json = '';
  $fpin = popen($url, 'r');
  while(!feof($fpin)) {
    $json .= fgets($fpin, 4096);
  }
  fclose($fpin);

  // Convert the JSON into a PHP object
  $shows = json_decode($json);

  // Iterate through each of the 50 podcasts
  foreach($shows->items as $oneshow) {
    $id = $oneshow->show->id;
    $name = $oneshow->show->name;

    // Write the name and ID of the podcast into the text file opened earlier
    fwrite($fpout, $name . "\t" . $id . "\n");

    // Unsubscribe from the podcast via the Spotify API
    $url = 'curl -s -X "DELETE" "https://api.spotify.com/v1/me/shows?ids=' . $id .
           '" -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: Bearer ' .
           $bearer .
           '"';

    exec($url);
  }
}
fclose($fpout);

And even this code won’t work completely, or at least it wouldn’t work in Oliver’s case: with 905 podcasts still to extract, it simply stopped returning anything from the API call to get shows, and the web player, at this point, showed Oliver with no subscriptions at all. So perhaps the API only works for the first 1,081 podcasts?

In any case, Oliver now has a text file with 1,081 podcasts in it. Or, more accurately, the names of 1,081 podcasts in it.  But how to get the feed URLs? There’s no obvious way to do this right now, although the Listen Notes API might work. Barring that, Oliver has a lot of copying and pasting ahead of him.

In summary, let this be a warning to you: if you use Spotify as your podcast app, you are a prisoner to Spotify, and if you decide to switch to another podcast app there isn’t any way to get your data out of Spotify.

🗓️
Spotify  •  Podcasts

A delightful Prince Edward Island story from Clark. Like he writes, “This could have happened no where else.”

🗓️

I squeezed every last drop out of my electric bicycle rental this morning before returning it, heading over the bridge to Stratford, down to the shore, back to town, out for lunch, and then home. 21 km from door to door. A beautiful, sunny day for a bicycle ride.

An annotated satellite map of my bike ride to Stratford, showing my route in red and highlighting significant features.

🗓️
Evox  •  Bicycling  •  Stratford

I found my way to the YouTube channel of Kara and Nate by way of their journey on the Trans-Siberian in 2017.

Despite their increasing popularity, and thus their increasing “today’s episode is brought to you by Audible,” they’ve kept my attention as they continue their relentless life of travel.

Their latest episode, Birthday Party in Cathay Pacific First Class, is perhaps the perfect exploration of the absurdity and delight of permanent life on the road (their happenstance hookup with a trio of jetsetters is totally the kind of thing that happens to Catherine when she travels).

Ignore the promos and enjoy the unadulterated love of constant motion.

(Postscript: after arriving back in Vietnam, Kara and Nate got in a taxi to their hotel, and their taxi was involved in a collision).

🗓️
YouTube  •  Travel  •  Kara and Nate
🗓️
Craft Beer Corner  •  Upstreet  •  Beer  •  Weird

I put the rented Evox City520 electric bicycle through its paces tonight, riding out of Charlottetown on the Confederation Trail to Charlottetown Airport, and then out the Brackley Path that runs parallel to the Brackley Point Road, rejoining the trail and riding east as far as York.

Cows in York, from the Confederation Trail

The trip was 15.8 km in each direction, 31.6 km there and back. Here’s a picture of my ride, recorded as a GPX file by OsmAnd and displayed over PEI 2 meter contours.

LIDAR map showing my bike route

This is farther than I’ve ever ridden a bicycle before, and the distance was only possible (at least given my current fitness level and strength of character) because of the electric pedal assist, which I used continuously.

The Evox has 6 levels of pedal assist and an 8 speed gear system; heading downhill, with full pedal assist and in the highest gear, I was doing almost 30 km/h. My average speed, over the entire trip, was about 20 km/h.

One of the reasons I suspect I’m not a good candidate for an electric bicycle is that the heady allure of pedal assist level six, with its effortlessness and breezy speeds, is simply too great to allow me to derive a significant enough amount of fitness from the endeavour.

I got nowhere to go, really, and so I think I’d be better off sticking to the grinding effort of my trusty non-electric Palomar, sticking closer to home, and leaving batteries out of it; I think I’d end up a better person.

Which brings up another issue, the feeling of being an asshole that one experiences when you blithely pass the non-electric-riders on the trail, expending half the effort and traveling at twice the speed as they are. I’ve always had a feeling of solidarity with fellow trail riders when I’m riding unassisted, and it’s not uncommon to give a nod of the helmet or a wave of the hand when passing in the other direction; flying by on my electric jet-bike I felt like people in first class must feel when we coach passengers mope by. It wasn’t a warm feeling.

All that said, the Evoc City520 is a nice piece of kit. It’s easy to get on and off, has a low centre of gravity, and is comfortable to ride. As I mentioned earlier, it’s heavy as hell, and was a challenge to wrangle in the front door of the house to charge this evening (I think the battery is removable, but I don’t have the key to unlock it, so I had to bring the whole thing inside for the night).

Evox City 520 Bicycle

The pedal assist system is control by a simple three button toggle and a centre-mounted display:

Evox Display

The display shows speed, pedal assist level, battery level, and an odometer. I like the fact that it is integrated into the handlebar post (in the centre of the “cockpit,” as bike nerds like to say), rather than zip-tied to the handlebars like a lot of other ebike-controllers are.

Perhaps the best takeaway from this evening’s ride was the reminder of how lucky we are to have the Confederation Trail in our midst: 30 minutes from downtown Charlottetown (15 minutes on an ebike!) and you can be in the middle of the countryside, by yourself, hearing nothing but birds and tractors.

Confederation Trail east of Charlottetown toward York

I’ll do some more tooling around on the Evox tomorrow before returning it to MacQueen’s, but I think I’ve got the ebike bug out of my system for now.

🗓️
Bicycling  •  Electric Bicycle  •  Evox

When he finished high school in mid-June, Oliver transitioned to the day program at Stars for Life, an organization I believe in deeply, and from which he will derive great benefit.

The primary logistical challenge of this is that Stars for Life is located 5.5 km from our house, and I need to get Oliver there every morning and pick him up every afternoon.

Map showing route from our hour to Stars for Life.

Given that we own a car, and that I can drive, our fallback position is that I’ll simply drive him to and from.

But as we only have 12 years to become carbon neutral, it’s time to start the planning for alternatives to that, and so I’ve started out by focusing on alternative methods for the trip home.

Baseline

Heretofore I’ve driven both ways. Traffic there is usually pretty light; traffic back is slowed when encountering the mass of public servants leaving the office at 4:00 p.m., which creates some jams, but only in the Charlottetown sense of the word.

Generally I’d leave home at 3:45 p.m., arriving at Stars for life at 4:00 p.m. and arriving back home about 4:25 p.m.

  • Total Time: 40 minutes
  • Driving Distance: 11 km

Experiment One: Bus, Walk, Bus

Yesterday was the first experiment: Oliver was coming home early, and I needed to pick him up at 1:00 p.m.

I caught the 12:45 p.m. Route № 3 bus from Confederation Centre and arrived at Stars for Life exactly at 1:00 p.m.

Oliver and Ethan the Dog and I then walked down Beach Grove Road to North River Road, across North River Road to pick up the Hermitage Creek Trail, and walked along the trail to the back yard of the PEI Union of Public Sector Employees where we emerged onto University Avenue. We walked down University Avenue to the UPEI bus stop where we caught the 1:54 p.m. Route № 1 bus downtown, arriving at 2:00 p.m.

Statistics

  • Bus Fares: $6.00
  • Bus Distance: 8.6 km
  • Walking Distance: 2.8 km
  • Total Time: 75 minutes

Pros

  • Convenient bus connection, almost door-to-door on the way there, only a short wait on the way back.
  • Mostly pleasant walk along the Hermitage Creek Trail.

Cons

  • The Hermitage Creek trail has some muddy/soggy spots, and could use some maintenance.
  • Connection between the Hermitage Creek Trail and University Avenue is more “cut through a field” than an official trail.
  • Adds 35 minutes, compared to driving, to the pick up run.

Experiment Two: Bike, Bus

One of the things I was curious about is whether having an electric pedal-assist bicycle would make it more possible for me to build cycling into the trip somehow.

Oliver doesn’t have a bicycle yet, so I can only cycle to Stars for Life for the pickup, and need a way of getting the bike back home.

For today’s experiment I rented an Evox City520 electric bike from MacQueen’s for 24 hours. It wasn’t cheap, at $86 taxes-in, but it was cheaper than buying an ebike, and I plan to amortize the rental by taking it for a longer spin tonight.

I left home on foot at 3:00 p.m. heading toward Outer Limit Sports where I’d originally intended to rent the bike; along the way I phoned them to confirm they had something in stock and learned that a 24 hour rental is considered two days in their calculations, and so I’d end up spending $150 for the experiment.

So I rerouted to MacQueen’s, which has a more sensible policy, arriving at 3:20 p.m. I was in and out of MacQueen’s in 10 minutes and it took me 13 minutes to ride the 2.8 km to Stars for Life (maxing out at 30 km/h coasting down the North River Road hill down to Ellen’s Creek).

It was here that things went slightly off the rails, as the buses stopping at Stars for Life–Route № 2 going clockwise and Route № 3 going counter-clockwise–only run once an hour, and when I arrived at 3:45 p.m. the next Route № 3 bus downtown wasn’t for 45 minutes.

So we caught the 3:58 p.m. Route № 2 bus.

Getting on the bus involved a complicated ballet of son, dog, bike, and me. I tied Ethan to a stop sign while I mounted the bike on the cowcatcher and then retrieved him and Oliver and I got on, paid our fare, and sat down. It wasn’t elegant, but it worked, aided by a very patient bus driver.

We had a chance to quicken the journey when we got to the Charlottetown Mall at 4:15 p.m.–we could have transferred to Route № 1– but I wasn’t eager to repeat the ballet, so we stayed on Route № 2 for a complete clockwise-tour of Charlottetown, seeing parts of the city I didn’t know existed.

We arrived at the Grafton-Polyclinic stop at 4:45 p.m. where I repeated the ballet in reverse and we walked the block to home.

Statistics

  • Bus Fares: $4.00
  • Bus Distance: 13.6 km
  • Bicycle Rental: $86.00
  • Cycling Distance: 2.8 km
  • Total Time: 105 minutes

Pros

  • The electric bicycle was fun to ride, and made short work of the hills: it felt like nothing at all to climb the 5% grade up Beach Grove Road from Ellen’s Creek.
  • Despite the complexity of our party, we pulled off the ballet of mounting the bus without problems.

Cons

  • The electric bicycle rental was expensive (although the purchase cost would be amortized across many trips in a more permanent scheme).
  • The bike was heavy–54 pounds–and unwieldy, and so it was a lot harder to get on and off the cowcatcher than my regular bicycle.
  • Although the cowcatcher held onto the bike well, despite the pothole-ridden streets and speed bumps, I had a background fear that it would fall off and I’d be out the cost of an expensive bicycle.
  • The long bus journey home (which could be mitigated by a change in schedule that would allow a more direct return home on Route № 3).

What’s Next

There are lots more options to experiment with, including Oliver cycling (we need to figure out a trailer or basket for Ethan to make this work), repeating today’s experiment with my regular non-electric bicycle, or taking the bus there and walking all the way home.

Stay tuned; I’ll update this post as we forge on.

🗓️

I’d missed this somehow: there’s now a setting in 1Password’s Android app under Filling labelled “Auto-copy one-time passwords” that does exactly that (just as the Mac version has done for a long time):

Screen shot of 1Password showing Filling settings

If you’re using two-factor authentication (and you should be: if you’re not, look it up and figure it out, or ask someone to explain it to you), using 1Password to generate your one-time passwords is light years ahead of using a standalone app like Google Authenticator, and this feature makes it double amazing.

🗓️
Android  •  1Password  •  TFA

Niti Bhan writes about African governments blocking access to parts of the Internet, Facebook among them:

As civil society groups and others raise their voices in support for peoples disconnected the global digital economy and society today, I believe we need to be cautious about what we’re speaking up for. I would not speak up for Facebook’s rights – there’s ample evidence they’ve trampled on mine even though I’m not a registered user of their platform – nor would I support other private sector tech giants headquartered far away.

The perception that people cannot communicate with each other, nor organize rightful protests, without the use of this one company or that one is a dangerous one in a world where these companies neither care for our rights nor our privacy.

Instead, there’s an opportunity for the emergence of a plethora of independent African “anti-block” social and commercial solutions -whether SMS based or USSD based or whatever the technology specialists deem fit – that can then be supported if shut down, instead of us raising our voices in support of the Facebook Group of Companies.

There is tremendous opportunity here because we already built and have experience using a decentralized Internet and many of those who had a hand in that are still alive. It’s only been relatively recently that we’ve re-CompuServed the Internet, and it’s not too late to rediscover more robust, decentralized networks of networks.

🗓️
Internet  •  Africa  •  Design  •  Decentralization

Sneak peak of a two-colour job I just finished printing. I printed the black yesterday, the grey today. And found–as I did the first time I printed grey–that the recipe for grey is “white plus half of an infinitesimal smidge of black.” Drying today. Mailing tomorrow.

Dot D K

🗓️
Letterpress  •  Denmark  •  Type  •  Bodoni

About This Blog

Photo of Peter RukavinaI am . I am a writer, letterpress printer, and a curious person.

To learn more about me, read my /now, look at my bio, listen to audio I’ve posted, read presentations and speeches I’ve written, see things I’ve favourited elsewhere, or get in touch (peter@rukavina.net is the quickest way).

I have been writing here since May 1999: you can explore the 25+ years of blog posts in the archive.

You can subscribe to an RSS feed of posts, an RSS feed of comments, an RSS feed of favourites elsewhere, or a podcast RSS feed that just contains audio posts. You can also receive a daily digests of posts by email. I also publish an OPML blogroll.

Instagram • YouTube • Vimeo • ORCID • OpenStreetMap • Internet Archive • PEI.art • Drupal • Github.