A self hoster’s guide to port forwarding and SSH tunnels

Self hosting with NAT and port forwarding and dynamic DNS is kinda fragile. I’ve been using a very cheap cloud-hosted nginx VPS to forward traffic to my self-hosted servers and it works nicely.

But tonight I set up a ssh tunnel that punches out from my server skipping the NAT, forwarding, and DNS stuff entirely. It’ll dial home from anywhere there’s network so I could even take my server to the park and it should work over 5g.

I just think that’s neat.

I’ve tried to explain a bit of my thinking, and a loose guide for how to set this up yourself. These instructions are for someone who’s vaguely familiar with nginx and ssh.

  1. How it usually works
  2. A more resilient port forwarding over ssh
  3. How to set up an nginx proxy to forward to your self hosted server
  4. How to forward ports to your self-hosted server over SSH
  5. How to set up a persistent SSH tunnel/port forward with systemd
  6. My observations using SSH tunneling

How it usually works

A typical port forwarding scenario opens ports on each device. When all the right ports are open, traffic flows all the way through from the internet to my self hosted server.

A traditional port forwarding scenario requires dyndns to upate the dynamic IP, as well as forwarding of ports through each device until it reaches the self-hosted server.

In my example, I have a nginx server on a cheap VPS in the cloud that handles forwarding. That VPS looks up my home IP address using a dynamic DNS service, then forwards traffic on port 80 to that IP. In turn my router is configured to forward traffic from port 80 on to the self hosted server on my network.

It works well, but that’s a lot of configuration:

  1. Firstly I need direct access to the ‘net from my ISP, whereas today most ISPs put you behind a carrier grade NAT by default.
  2. If my IP changes, there’s an outage while we wait for the DNS to update.
  3. If my router gets factory reset or replaced with a new one, I need to configure port forwarding again.
  4. Similarly, the router is in charge of assigning IPs on my LAN, so I need to ensure my self hosted server has a static IP.

A more resilient port forwarding over SSH

We can cut out all the router and dynamic DNS config by reversing the flow of traffic. Instead of opening ports to allow traffic into my network, I can configure my self-hosted server to connect out to the nginx server and open a port over SSH

You could also use a VPN, but I chose SSH because it works with zero config.

A self-hosted server creates a ssh tunnel to the remote server and routes traffic that way, without DynDNS or router configuration.

In this diagram, the self-hosted server makes a connection to the nginx server in the cloud via SSH. That ssh connection creates a tunnel that opens port 8080 on the nginx server, which forwards traffic to port 80 on the self hosted server. Nginx is then configured to forward traffic to http://localhost:8080, rather than port 80 on my router.

So the router doesn’t require any configuration, the cloud-hosted VPS server only needs to be configured once, and the dynamic dns server isn’t needed because the self-hosted server can create a direct tunnel to itself from wherever it is.

The huge benefit of this zero-config approach is I can move my self-hosted server to another network entirely and it will dial back into the nginx server and continue to work as normal.


How to set up a nginx server to forward to a self-hosted server

Putting an nginx server in front of your self-hosted stuff is a good idea because it reduces your exposure to scary internet risks slightly, and can also be used as a caching layer to cut down on bandwidth use.

In these examples, I’m forwarding traffic to localhost:8080 and 443 and will set up a SSH tunnel to forward that traffic later.

There are two ways to set up forwarding:

As a regular nginx caching proxy:

This is a good option when you want to utilise caching. However you’ll need to set up your letsencrypt certificates on the server.

server {
  server_name myserver.au
  location / {
    proxy_pass http://localhost:8080/;
    proxy_buffering off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port $server_port;
  }
}

As a socket forwarding proxy

This option doesn’t proxy http traffic, it just forwards packets directly.

stream {
        server{
                listen 110.1.1.58:443;
                proxy_pass localhost:8080;

        }
        server {
                listen 110.1.1.58:80;
                proxy_pass localhost:8443;
        }
}

This method is easier for something like Coolify that deals with virtualhosts and ssl for you, but the downside is that there’s no caching, we can’t add an x-forwarded-for header, and it eats up an entire IP address. You can’t mix a socket forward with a regular proxy-pass.


How to forward ports to your self hosted server

First, generate SSH keys on your self-hosted server, and allow logins from your self hosted server to your nginx server. DigitalOcean has a guide to setting up ssh keys.

You can verify this is working by running ssh root@myNginxServer.au on your self hosted server and seeing it log in automatically without a password.

Then test your port forwarding with the following command:

ssh root@myNginxServer.au -R 8080:127.0.0.1:80 -R 8443:127.0.0.1:443

The -R argument opens port 8080 on the remote server, and forwards all traffic to port 80 on the local server. I’ve included two forwards in this command, for both http and https. The 127.0.0.1 address binds traffic to localhost, so only the local machine can forward traffic on these ports, but you could open it to the whole world with 0.0.0.0.


How to set up a persistent SSH tunnel/port forward with systemd

Then, create a systemd service to maintain the tunnel.

I borrowed these instructions from Jay Ta’ala’s notes and customised them to suit:

sudo vim /etc/systemd/system/ssh-tunnel-persistent.service

And paste:

[Unit]
Description=Expose local ports 80/443 on remote port 8080/8443
After=network.target
 
[Service]
Restart=on-failure
RestartSec=5
ExecStart=/usr/bin/ssh -NTC -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -R 8080:127.0.0.1:80 -R 8443:127.0.0.1:443 root@myNginxServer.au
 
[Install]
WantedBy=multi-user.target

You can then start the systemd service/ssh tunnel with:

# reload changes from disk after you edited them
sudo systemctl daemon-reload

# enable the service on system boot
sudo systemctl enable ssh-tunnel-persistent.service 

# start the tunnel
sudo systemctl start ssh-tunnel-persistent.service

My observations using SSH tunneling

If all is working, those steps should now be forwarding traffic to your self hosted server.

Initially this was difficult to set up because the vagueness of the docs for whether to use -L or -R, but once it was running it seems fine.

The systemd service works well for maintaining the connection and restarting it when it drops. I can reboot my nginx proxy and see the tunnel reestablish shortly afterward. My high level understanding is that when the tunnel breaks after ServerAliveInterval=60 seconds, the ssh command will realise the connection has dropped and terminate, then systemd restarts the service ad infinitum.

You can adjust the ssh command to suit. There’s probably not much point enabling compression because the traffic is likely to already be compressed. But you could tweak the timeouts to your preference.

Gaia, West Village, Brisbane Festival 2022

A twilight shot of a grassy square, an old gentrified factory building in the background, and a giant illuminated planet earth suspended in the air. South America and Africa are visible. There are people admiring underneath.

I went to West Village to check out the artwork Gaia for Brisbane Festival, by artist Luke Jerram.

An intimate encounter with our home planet.

Gaia acts as a mirror, a journey of discovery, and a warning. The viewer may experience a new perspective, a sense that societies of the Earth are all interconnected as well as the realisation that we have a responsibility to one another, to preserve, to protect.

It wasn’t much to look at during the day, so I went to do my shopping while the sun set. At dusk it was illuminated against the sunset sky and just incredible to look at. I spent ages checking it out from all angles, trying to get the best photo along with everyone else.

Measuring 7 metres in diameter, Gaia is the second in a series of three awe-inspiring large-scale installations by Luke Jerram at West Village. 

Here is your chance to see the Earth as if from space; an incredibly beautiful and precious place. An ecosystem we urgently need to look after — our only home.

The Brisbane Festival program lists three separate planets that are rotated out throughout the festival.

I missed seeing the moon at the beginning of the festival, but tomorrow the giant Earth will be swapped out for a simulacrum of Mars.

Created in partnership with the Natural Environment Research Council (NERC), Bluedot and The UK Association for Science and Discovery Centres. With supporting partners Culture Liverpool and Liverpool Cathedral.

I logged on to Flickr for the first time in years to upload this photo, but my account is limited because I need to pay.

But one of the last photos I uploaded caught my eye. Taken on December 22, 2017, the construction of the controversial West Village complex where the installation now sits. What a change.

A concrete building site. A two story historic factory sits in front of three massive, blocky towers under construction.

My gear: how I vlog

People often (once) ask me what I use to create my videos. It’s been a bunch of different stuff over the years, but I think I’ve settled on a good setup.

TLDR: I reckon a good camera and a tripod/selfie stick is pretty much all ya need.

Sony ZV-1 Camera

This thing is amazing and I wish it existed when I started. It’s essentially the latest in Sony’s RX100 compact point & shoot line, but tailored for video. So it’s a massive sensor, zoom lens, integrated stereo mic and 4k recording in a tiny 300 gram package.

This isn’t the perfect camera. The stabilisation isn’t very good and the highest level crops in and makes the image less sharp, so I generally turn it off and take care with the framing. It also caps out at 30fps, so none of that sweet slow mo b-roll. Finally it records in h264 rather than h265, which is fine but the video takes up at least double the space.

But the image quality is stellar and I love it and I’m very happy.

Tripod/selfie stick

It’s easy to giggle at the sheer vanity of a selfie stick, but I am a vlogger after all!

The ones I’ve found the most utility from are essentially mini tripods. They combine a tripod base, telescopic pole, and standard screw thread (1/4-20 UNC) so I can mount pretty much anything from a microphone, my phone, camera or GoPro and stick it in place.

I’ve taken some variation of these around the world, from the windy cliffs of Lisbon to the window in Iceland trying to catch a glimpse of the northern lights.

The BK15 on the left is much more sturdy than the BK10 on the right. These days it’s my mic mount

I’m on my second one now, the Benro BK15 Selfie Stick & Mini Tripod w/Bluetooth Remote. I don’t use the remote, ever. But the stick is sturdy, doesn’t move from wherever you stuck it.

The BK10 started to flex on me after a few years, but the BK15 is the next generation and feels a lot more solid.

Pixel 6 (phone cam)

I was a big believer in using my phone to vlog. I can whip my phone out of my pocket and be recording in seconds. But the quality isn’t there.

I bought into the Apple hype and trialled a 12 Pro Max and it produced such god-awful video that I never released the vlog, destroyed the evidence*, and returned the iPhone for a refund.

I ended up getting the Pixel 6 which apparently uses some form of software HDR while recording video, but I wish I could turn it off because often the sky is blown out to a deep blue colour while the rest of the picture is heavily compressed and mushy looking. The stabilisation is super janky, and I’ve seen the stock standard stabe warp the image. AND I’ve noticed dropped frames in videos at 60fps. If you’re interested you can see all of this in action on my Australian Christmas video which is shot entirely on the Pixel 6.

I’m being hard on the video because it’s a selling point and it’s truly not good enough. I’ve had much better results out of Filmic Pro because it doesn’t use all the Pixel magic, but that’s slower and requires a lot more care to get a good shot.

But I digress! I use my phone from time to time when I don’t have my camera on hand. It’s not amazing quality, but it does alright.

GoPros for B-Roll

I also used a couple of GoPros, the Hero 7 is currently my main wide angle/action/time lapse camera. You can see it in action a fair bit on my Macleay Island video. I have a chest strap which I use on the bike, as well as a standard 1/4-20 UNC mount that I can use on the tripod. The built in mic is not great at all, so I mostly use it for b-roll and time lapses.

I also have a GoPro HERO5 Session which is a tiny baby, but only barely does 4k so I mostly use that for time lapses as well.

The GoPro Session 5 and Hero 7. The 7 is inside an Ulanzi cage on a small handle.

In the pic you can see the Ulanzi cage which holds the microphone adapter for the GoPro. I originally wanted to use this as a handheld vlog cam, and it might still be good for that on hikes and things because of the incredible stabilisation. But I haven’t really found myself using it and I wish the GoPro just came with a damn 3.5mm jack.

Other gear

  • Zhiyun Crane – I picked this up second hand on ebay but I hardly used it because it’s big and chunky and super slow to set up. But I used it recently at Botanica and I think I’m getting a feel for it. It’s great to stabilise the ZV1 when there’s a lot of movement, but I think it’s a special occasions kind of thing.
  • Zoom H1n – this is an excellent microphone. I’ve mostly been using it as my video conferencing WFH mic lately, but it’s a fantastic stereo mic which I use to capture ambience and sound floor for my videos. Or at least, that’s the intention, it runs flat really quickly on rechargeable batteries so I haven’t used it as much as I’d like.
  • Rode VideoMicro – a little shotgun mic I can mount on my camera. It’s good for talking-to-camera vlog style shots because it isolates my voice. But it’s only mono and I haven’t worked out the best way to integrate it with my workflow. Most of the time the built in ZV1 mic is more versatile.
  • DJI Mini 3 Pro – This is a new addition. There was one shot I desperately wanted to get in my Gympie vlog which was an epic drone shot of the Mary Valley Rattler crossing Deep Creek. I didn’t get that shot, but I did get the Mini 3 when it was released shortly after. I’m excited to play with it more.
Imagine this, except as a sweeping panoramic drone shot. “Gympie Mary Valley Heritage Steam Train” by Thirumurugan P is licensed under CC BY-ND 2.0.

Davinci Resolve video editor

I switched to Mac in 2017 in part because video editing on Linux is an absolute nightmare.

I started out with iMovie which I used for all of my vlogs up until 2020. My first real full Davinci vid was last year’s Brisbane Festival roundup, which took a VERY long time to pull together while I learned how stuff works. Quite ambitious.

But I think I’ve gotten a lot better and faster at it.

Davinci Resolve edit window showing the media pool, effects, inspector, timeline, and a proto of me giggling at the noodle markets.

There’s not a lot of other software I use, but in the past I’ve used Krisp to recover bad audio, and I’m generally a fan of youtube-dl to rip old youtube vids of mine, ffmpeg to occasionally perform some repairs on a video, or Handbrake for tweaking the encoding. I also use rev.com for better or worse when I’m in a hurry and don’t feel like doing my own captions.

Honorary mention Pixel 2 XL (retired, 2018-2021)

This was my primary vlog cam for pretty much the entire time I was overseas. This was an awesome little unit. It couldn’t do much, but it was my first 4k camera and it’s what started everything!

One little gadget I used to take everywhere was the Windblocker. That thing saved my audio on countless occasions and if you’re vlogging with a phone I can’t recommend it enough.

After three and a half years, this thing was so battered around that I upgraded to the Pixel 6 on release day and gave this one away for free on Gumtree to a gentleman who seemed to really appreciate it.

A Pixel 2 XL on a bright background. It's showing the welcome screen after being factory reset. There are cracks all over the screen.

That’s about it

What’s your video set up look like? Is there anything I’m missing? Shoot me an email!

Remote work from the gay pub

Friday lunch at the Wickham, Brisbane’s local gay pub, is one of my favourite new traditions.

I’ve been intending to go on Fridays because it’s a great spot, there’s plenty of places to work, and it helps keep the lights on at a place that’s important to me. This is where I’ve met a lot of my friends, done a lot of growing as a person, and really it’s a nice spot to be.

It’s been wet, and I’ve had other commitments so I’ve only been twice in the past month but each time it’s been great.

Last night my friend R arrived after work and we stuck around for a few drinks which turned into a bottle of wine back at my place, where he stayed on the couch for the night (he lives on an island, it’s a trek).

For a person who “doesn’t drink” I have a low grade hangover this morning. Coffee is brewing now.

This is part of how I’ve been getting a bit more experimental with how I’m approaching remote work in a pandemic world. There’s a bunch of picnic shelters down by the river that I’ve been working at from time to time, and the local coffee shop has pretty good outdoor seating. Depending on my meeting load it’s not always possible to do, but I think it’s important to get out and be a part of the world.

The IPCC have shown us what needs to happen, so why isn’t this the climate election?

I’ve been struggling with the election. How are we avoiding the elephant in the room?

  • ✅ We’ve committed to 1.5 degrees of global heating by 2050
  • 🤔 To hit that we must peak carbon emissions in the next 3 years
  • 👉 Even if we SUCCEED, 99% of coral reefs still die
  • ❌ Labor and the Coalition really don’t have a plan?

This is an emergency.


We can fix this. But we must do it now. We must decarbonise. And we have to GUARANTEE coal and gas workers security, a chance to be part of that transformation.

Labor has some semblance of a plan, but also accepted half a million dollars in donations from fossil fuel interests last year, as well as committed to allowing new oil and gas extraction which would undo everything.

The central message of the IPCC report is clear: despite affordable renewable energy solutions being available now, governments and businesses are failing to act. Global greenhouse gas emissions must peak by 2025 and halve by 2030 to limit warming to 1.5 degrees.

The IPCC said the dramatic reductions in the cost of wind, solar and battery storage technologies over the last decade meant they were already commercially viable and would be the key to decarbonising most of the world’s energy systems.

“It’s now or never”: new IPCC report issues warning to governments to speed up renewables transition – Climate Council

So while I’m buoyed by the possibility of a change in government, we must make this election count. It feels very much like our last chance.

Vote Compass has already told us that more Australians mentioned climate change as their number one issue than any other topic.

So I’ll be voting Greens and preferencing progressive parties to hold whichever govt to that standard. I think it’s the most powerful change I can make right now

If you’re not sure where to start, here’s a guide to parties & candidates in the election who’ve committed to actually doing something. It’s not everything, but imo it’s a good starting point.

Traffic light election guide. Vote climate one. Make climate the winner.

The other important thing to remember is even if your local member is an asshole, you can still vote for change in the senate


I lay awake some nights catatonic with the thought of what’s coming for us, and fuck, what’s already here.

But there is hope. We have a path forward in the IPCC report, we have most of the technology we need, and we just need to make it happen NOW. No more excuses.

Here’s the best summary I’ve found on what comes next ❤️


Update: climate won 😭

I think Scott Ludlam, former Green put it best:

'holy shitballs', tweeted at 9:37 on election night.

The Liberals were wiped out by a wave of Greens and climate-focused independents. There’s a lot of analysis, but ultimately this is a really hopeful result.

On election night the ABC ran this graphic, saying the number 1 concern for voters was climate change. Just makes you wonder why, in the face of it all, it was completely missing in the media campaign.

A TV on the wall showing the Australia Votes coverage with the caption 'Australians said climate change is the no. 1 concern at this election`. The graphic shows 25% of Aussies ranked it number 1, followed by 16% who said economy.

The easiest way to validate email in React

Email validation is one of those things conventional frontend wisdom says to steer clear of, because:

  1. the endless complexity in how email works and
  2. because even if an email looks valid, it might not exist on the remote server.

This is backend territory.

However.

We can hijack the browser’s built-in email validation in <input type="email"> fields to give the user a better experience.


CSS validation

At the simplest, <input type="email"> fields expose :valid and :invalid pseudo selectors.

We can change the style of our inputs when the email is invalid:

input:invalid{
  border-color: red;
}

Nice. Zero lines of Javascript. This is by far the best way to do form validation in the year ${year}.


Plain Javascript email validation

The constraints validation API exposes all of this same built-in browser validation to Javascript.

To check if your email is valid in plain JS:

const emailField = document.querySelector('.myEmailInput');
const isValid = emailField.validity ? !emailField.validity.typeMismatch : true;

This works in all the latest browsers and falls back to true in those that don’t support the API.


React email validation hook

Lol just kidding, you don’t need a hook. Check this out:

const [emailIsValid, setEmailIsValid] = useState(false);

return <input
  type="email"
  onChange={e => setEmailIsValid(e.target.validity ? !e.target.validity.typeMismatch : true)}
  />

We can use the same native JS dom API to check the validity of the field as the user types.

This is by far the fastest way to validate email in react, requires almost no code, and kicks all the responsibility back to the browser to deal with the hard problems.


More form validation

Email validation is hard, and all browsers have slightly different validation functions.

But for all the complexity of email validation, it’s best to trust the browser vendor implementation because it’s the one that’s been tested on the 4+ billion internet users out there.

For further reading, MDN has great docs for validating forms in native CSS and Javascript code.

You should also inspect the e.target.validity object for clues to what else you can validate using native browser functions.

It’s a brave new world, friends.

Brisbane floods

Thursday

I saw a tweet earlier today along the lines of “I don’t like living in interesting times”, and I thought it was amusing. Referring to the alleged Chinese curse which from memory I don’t think is real, but is very clever nonetheless, “may you live in interesting times”.

Sometimes an idea will get stuck in my head, a wordplay usually, and repeat over and over until I put it into the world. Throughout the pandemic my little brainworm is a similar corruption, “you may live in interesting times”.

Among other world disasters, the one a little closer to home right now is the effects of La Niña on East coast Australia. Earlier this year the Bruce Highway was washed away by flooding near Tiaro, and just yesterday a freight train derailed on the north coast line when the track washed away. We’ve had a lot of rain.

Yesterday the ABC made passing reference to the Brisbane River catchment, which put me on edge. My place is in a low lying area and while I think technically it’s above the council’s flood level, I don’t especially want to risk it. I was pretty annoyed that it was mentioned in a single article with no follow up at all, so I suppose we’re probably not going to flood? I’m sure I’d know about it.

It’s been on my mind because I was planning to visit my parents this weekend, the weekend of my birthday. But between the rail catastrophe and breathless news reports advising people not to travel, I’m sort of thinking I’ll stay in after all.

Anyway, I’m doing fine. Just really aware of the emergency fatigue that’s probably got everyone to some degree.

So I’m sitting outside in the dark wearing trakky daks, hanging out with my plants. There’s the white noise of raindrops hitting the leaves in the garden and pattering down onto the courtyard. A streetlight across the road lights up the sheets of rain as they blow past. And occasionally a car will drive by and make the cosiest wet asphalt sound you can imagine.

I do like the rain.

It’s cosy.

Gezellig.

Reminds me of the summer storms in my childhood home, beating down on a tin roof so hard you could barely hear each other talk. Looking out the window at a wall of water while being inside, safe and dry.

We may live in interesting times, but at least there’s comfort in the familiar. I don’t know if I’m going to see my parents tomorrow, I suppose I’ll have to make that call to the QR support line. In the meantime, no point worrying right?


Friday

A screenshot of the message from QR travel: QJ11 Tilt Train 25 Feb is cancelled with no alternate arrangements. Another notification forecasts rain.

The train line is still out. Now the highway is out.

Deep Creek (ironic name, it was a trickle when I was there) has gone over the highway. This kinda blows my mind.

I know Gympie floods, I read as much when I visited last year. All the riverside infrastructure is concrete and brutalist to survive the water going over it.

At Alford Park, there’s a massive great flood marker showing where all the historic floods have reached. Pretty scary stuff.

Anyway, it’s just weird because that road bridge is SO high I would never have expected it to go under. At least that’s the decision made for me.

Undearneath the Bruce Highway bridge. It's suuuuper tall. There's old wooden foundations from what I can only assume is the old bridge.

Saturday


Sunday

I hardly slept last night. I kept waking up to check the river wasn’t lapping at my door. It wasn’t, but that just meant it hadn’t happened yet.

Tae lost power. She’s in a low-lying part of the neighbourhood. She came over to charge up all her bits and bobs and we watched TV and chatted for a bit. I fell asleep and slept for what felt like hours.

The rain still hasn’t stopped, so Tae decided to just make a run for it. I got drenched just opening the gate to let her out. I can’t imagine what it would be like riding in that.

The forecast is looking pretty grim, but the flooding is supposed to coincide with high tide tomorrow at about 8.


Monday


Tuesday

By the time I got up the street was already completely cleared. You wouldn’t have known it had flooded if it wasn’t for the people cleaning out the businesses that were inundated.

I was expecting to get out with my shovel picking up trash. But Peter told me the RCC Builders from the construction sites were all out cleaning up the streets in the early hours. I suppose it benefits them not tracking mud everywhere, but it’s such a nice thing to do. I’m very grateful.

The river is down about five steps at the end of my street. Enough to clear water from most of the streets around here.

Looking down a staircase into water and slick brown mud. There's still trees submerged, poking out of the river

I went for a little walk down Duncan Street way. I don’t know what to call that little precinct of West End but it’s the built up area, as opposed to the gritty sort of partially industrial area I live in. There were a lot of pumps running to pull water out of basements, and some that were completely full to the top.

Peter’s was full to the top.

He told me the building manager was here for the ’11 floods, and the painstaking lengths they had to go to to clean out the mud and debris from two levels of basements. I think the mud army can probably help, but it’s going to be days before that water clears.

His lift was out, and the emergency stairs led to deep water, so we had to climb a ladder from the lobby to get to the stairs, to get to his apartment. It’s the penultimate floor, which is ordinarily lovely, but absolutely destroyed me. I’ve been working on my cardio fitness, but apparently there’s still a ways to go.

I had my first hot shower in 2 days, and left a powerbank to charge, just in case. I also guzzled all the water in his jug because, as I realised later, I was super dehydrated from not taking care of myself the previous days.


It’s Tuesday afternoon and I’m surprised to find I still have ice cubes. Most of them are stuck together, swimming in a puddle in the bottom of the ice cream container where I store them. But there’s a few separate blocks. I scoop em out and put them in my glass of warm cola.

Later that afternoon Peter, the ghost of Adam, and I went to a town hall organised by Jonathan Sri and Amy McMahon, council and state representatives, respectively.

There was a free sausage sizzle and people sitting around powerboards charging their devices. Real disaster vibes, but I think folks were largely okay.

Jonno and Amy on the mic, next to a portable loudspeaker.

It was a useful meeting. But the message I got was that while the flood waters are still up and there’s not a lot we can do until they go down. I get the feeling everyone just wants to do something but we can really only wait until we know more.

As I was walking home past the gym I noticed the lights were on.

“Great” I thought, I can go there for a warm shower.

Then I realised the lights were on in my building too.

There were people milling around the street outside one a that was still dark. A lady was gesticulating at the utility closet that had been beeping for two days straight, so I went over and offered to let them charge their stuff at mine. Her kid proudly told me how they’d been using candles and a lantern, it was cute.

There’s a kind of survivor’s guilt in all this, I try not to indulge too much. I lost power for a couple of days, and the basement that I never use got flooded with 30cm of water. That’s nothing, right?

But then I realise I’ve been amped up on stress for the past week, I’ve lost the contents of my fridge and freezer, my backpack and a pair of shoes are ruined because they just couldn’t dry out, I’ve got loads of washing strewn all in the laundry because they asked us to conserve water before the power went out, I have a sunburn and a caffeine withdrawal headache because I regularly forgot to feed or water myself while everything else was going on.

I don’t need to feel guilty because I got my damn power back.


Wednesday

The dishwasher and washing machine are humming away. I appreciate the breeze from the fan. It’s 31 and partly cloudy. Humidity is cloying. But we’ll work things out.

Ten years of Brisbane CityCycle – love letter, hate mail, eulogy

One of the better ways to explore a new city is by bike, because you can take as much time as you like to stop wherever something catches your eye.

As the owner of a not very well maintained biking website, I had a particular affinity for the Brisbane CityCycle scheme. CityCycle was the much maligned pet project of our milkshake duck of a former lord mayor to install a physical station-based bike hire scheme throughout the city, with the small catch that JCDecaux got to install advertising billboards throughout the suburbs as well.

Glenelg St / Merivale St CityCycle Station. A pylon with a screen and buttons, with yellow Lipton bikes spread off to the horizon.

CityCycle and Me

I had a bit of a love hate relationship with the scheme. For starters, Australia’s mandatory helmet law meant that a bike share scheme really required a helmet share scheme. Initially the council expected you to BYO helmet, which I think showed a complete lack of foresight or perhaps care. Eventually they relented and left helmets with the bikes.

But ick factor aside (apparently studies showed sharing helmets was fine) a lot of the time you’d arrive at a station to find no hardhats around anyway. So you had to run the risk of getting caught by police, or just walk.

I remember one night coming home from Toowong via ferry. There were no hats at the Orleigh Park station so I took the risk: after all what are the chances? A block away from home and the police pulled me over, lights and all. I was let off with a warning but I had to walk the the bike the rest of the way.

The CityCycle bike handlebars read "Important notice: it is a legal requirement to wear an approved helmet at all times whilst cycling"

Beyond that, the payment system was way more complex than it needed to be, the bikes themselves were SO heavy, in the beginning the system closed at 10pm, and a lack of sensible places to ride at the time turned off a lot of people.

Despite all this, it was a great little scheme. The free 30 minute window meant if you timed things right you could pretty much ride all day without paying a cent, so it was a really great way to explore the city on the cheap.

And I think just having the bikes around town was good promotion for a sustainable and healthy transport option. Puts a spark of an idea in your mind.


The network

Being a river city, the Brisbane CityCycle network followed the ol’ brown snake from Newstead down to St Lucia.

Stations were dotted around the river and by railway stations, so you were never too far away from one, provided you didn’t stray out the network.

I took this screenshot from the map on the Brisbane Council site, but I don’t think it’s comprehensive because I know for a fact there was a Citycycle station up the street from my place which isn’t listed here. Alas.

A map of Brisbane with Citycycle stations listed. Mainly clustered around the CBD and New Farm.

The online subscription required a credit card and sent an email with an account number to plug in at the kiosk at each station. The website was painful to use because it wasn’t optimised for mobile, and each person had to sign up individually. So if I knew I was going out with friends sometimes I’d create a couple of burner subscriptions we could all use without having to sign up.

A day pass on the scheme used to cost $2.00 and usage was billed in 30 min blocks. The first 30 minutes was free, the next two blocks were $2, and subsequent blocks were $5, capped at $48/day. Slightly confusing.

But there was no penalty for checking a bike back in before the 30 minutes expired. So the trick was to check in before your 30 minutes was up, wait a moment for the system to reset, then check it back out again for another free thirty minutes. You could hire a bike for effectively the whole day as long as you checked it back in periodically, for a grand total of $2.00.

A CityCycle PDF containing the link code to unlock the bike. Extremely not optimised for mobile.

But once you were going there were no limits*!

I remember once I’d organised to ride with some friends but my own bike was broken. So I checked out one of the trusty yellow workhorses and cycled the heavy bloody thing along our route, and the only complaints were from everyone else that I was going too slow. I cycled way outside the coverage zone that day and I don’t remember how much that one cost, so it can’t have been too bad.

I also have a friend who legendarily rode a CityCycle up Mount Coot-Tha. A few people did over the years. I could never.

The ride took me fifty-seven minutes, end-to-end. Forty-eight of those were spent riding, most of the balance was waiting at the Hale St West construction site and refilling my water bottle at the top. What’s sort of cool is that when a did a similar ride a few months ago, it took me forty-four minutes. That was slightly more circuitous, going around the graveyard but skipping the initial Planetarium climb, but the point remains that despite a CityCycle bike’s weight and positioning, it doesn’t really make that much of a difference. Nevertheless, the uphill segment of my ride did take the record for the slowest front-side Mt Coot-tha ascent.

Mt Coot-tha on a CityCycle, Thom, 2011

The downfall of the dock

The French style docked bike hire schemes were really a product of their time. In the late 2010s dockless bikes were trialled around the world with kinda horrifying results (the scale of waste in this photoset of abandoned and illegal bike share bikes in China for example is truly mind boggling).

A purple Beam scooter parked smack in the middle of the footpath. Some people are just the worst hey?

But Bird and Lime changed the game with dockless escooter hire, launching in Brisbane in late 2018.

Despite not sticking around to see their work pay off, it really ushered in the era of micromobility for the masses. These days you can now find a Beam or Neuron scooter parked across the footpath on pretty much any city street, and the app-based signup is leagues easier to use. I still love my bike, but sometimes you can’t beat a scoot for the perspiration-free convenience.

In late 2021 the CityCycle stations finally began to disappear, one by one turning into car parks, scooter drops, or reverting back to footpath. The one thing that didn’t disappear though? Those JCDecaux billboards. Funny that.

An old Citycycle parking spot turned into motorbike parking. A small billboard says "have a Bris-better day out on e0-bikes and e-scooters across out bikeways"

Council has converted former CityCycle spaces on the footpath to e-mobility parking hubs. We are also continuing to investigate the future use of former on-road CityCycle spaces, including converting these spaces to other parking options where possible.

Works to decommission and remove each of the CityCycle stations included: saw-cutting, jack-hammering and core drilling to pull apart elements of the station, removal of the existing material around the station, reinstatement of the site area to match existing surfaces (as close as practical).

CityCycle decommissioning, BCC 2021

While CityCycle is gone, the pandemic and rise of the scoots means there’s even more people than ever looking to active transport to get around.

There’s still plenty left to do, but eleven years of council focus on cycling infrastructure has given us an increasingly comprehensive cycling and scooting network. It’s obvious that this is the best way to get around, and it’s great news that from here there’s only going to be more focus on making it possible.


That’s about it. If you’re interested in more, my vlog about the Brisbane Festival includes an art installation where the remaining CityCycle bikes were turned into sculpture.

Alternatively this 2018 era vlog about the Night Noodle Markets includes riding a CityCycle into the city montage to meet up with friends. A different era.

“I’m quitting the internet,” or a social media strategy for a better you

I’ve been avoiding the news. Not that I’m trying to be less informed, but my multiple times a day habit of checking for updates wasn’t doing my head any favours. There’s just not that much information I need to know.

For the past few months I’ve been coming round on the idea that Twitter is having the same effect on me.

A grungey black & white Twitter bird over the text repeatedly asking 'what's happening'

Back in the early days of the pandemic a mutual snapped at me for posting a terrified prediction of what’s to come. Yes, the cascade of political bullshit led us right to where we are today. But the thought stuck with me and I’ve been a lot more careful about what and how I post. Because truly what good is sending my anxiety out into the world when all is going to do is multiply?

So lately I’ve been trying to bring back the old Twitter. Posting nice things only: photos, experiences, memories. Trying my damnedest to turn the tide back to that rose tinted place that I enjoyed all those years ago. An old friend messaged me to tell me that they appreciate it, which honestly was the wildest thing because I never explicitly said what I was doing, they just picked up on the vibe. But at the same time they confessed that they’re burnt out on social media and don’t post any more. I get it.

Occasionally I’ll post something I’m passionate about: climate solutions, LGBTQ rights, or a combination of the two, usually in the form of encouraging we get rid of our corrupt, trumpian government. Those ones land the hardest, and it seems it’s more often my friends who miss the point and hassle me about them. Maybe I’m not as eloquent as I thought? Or maybe people are tired and that’s how it manifests.

Positive vibes only. Advocate for good.

Another dear friend posted recently, “this place is toxic and we all have Stockholm syndrome. I promise you it’ll be okay if you step away, even for a little” and it’s pretty fair.

I have a muted word list that scrolls almost the length of the universe, from politicians to Dutch words, tired memes, covid terms, crypto, a bunch of keywords from my own industry, and some commonly used smarmy phrases that are generally up to no good. “Allow me to explain”, “buckle up”, “thread 🧵”.

The one thing that gets me though is the fomo. I appreciate the phrase “extremely online”, because yeah that’s me. Extremely. Same as I’ll check the news multiple times a day, I’ll check the tweets constantly. Rather than spend a second with my own thoughts, I’d much prefer to immerse myself in others. I’ve always said I prefer the Twitter app because there’s something inherently sticky about it: it feels good and makes me happy. That’s by design, but it’s the sugar high before the crash rather than a genuine fulfilling enjoyment. Someone liked the post you retweeted!

But ultimately this is where my friends are, I don’t want to step away completely. But I do want to cut back and try to mitigate some of the worst effects. So there’s two things I want to try:

  1. Only check it once a day. Maybe on my lunch break? Sometime I can enjoy it, without losing the entire day to it.
  2. Sit with my thoughts. Organise them in other ways. Keep a journal.

This blog post actually sprung out of number two. Initially it was going to be a series of bullet points in Google Keep. Some new year’s rulin’s. But I realised that’s not the only way to compose my thoughts, and this kinda serves as one of those “I’m quitting social media” posts that I usually think kind of feel like a cry for help hah.

I have no idea if I will be able to keep this up, and I’m sure my thinking on it will evolve. But it genuinely feels like a really positive thing right now so I’m keen to give it a go.

I’m miserable but I’m fine

This is a bit of a rant. Please skip it if you don’t want to feel worse.

The Omicron variant is tearing through Australia’s workforce, from health care and child care, to agriculture and manufacturing, to transportation and logistics, to emergency services.

The result is an unprecedented, and preventable, economic catastrophe. This catastrophe was visited upon us by leaders — NSW Premier Dominic Perrotet and Prime Minister Scott Morrison in particular — on the grounds they were protecting the economy. Like a mafia kingpin extorting money, this is the kind of “protection” that can kill you.

Jim Stanford @ The Conversation

It’s been a bit of a time. But not at all unexpected.

When we followed Morrison’s “plan” to open everything up for Christmas right as Omicron was tearing through the population vaccinated and unvaccinated alike it reminded me a lot of watching Europe slowly fall. Cases popped up in Italy then Germany then the south of the Netherlands, getting closer and closer while governments did sweet fuck all. Catastrophise much?

Merry Christmas I guess.

Mt Tibrogargan out the train window

I took the train to visit my parents over the holidays. It was a calculated decision: go early in the spike or not at all.

A few weeks earlier I’d grabbed a handful of RATs in preparation for things to come (who would have thought they’d become like hen’s teeth) so I was feeling okay about the risk. But on the train, despite being law, a majority of folks and one staff member just took their masks off once we were underway.

It reminded me a lot of the repatriation flight back from Europe: twenty five hours and eighteen thousand kilometers in a metal tube heading into the unknown. No idea whether the air I’m breathing will be what kills me. A resolve to mask up and sleep the entire journey until hunger overrides everything and I slip the mask off for long enough to scarf down the little airplane meal while trying not to breathe.

Christmas was fine. I spent a couple of days working from the side deck which was somewhat optimistic considering the temperatures were hitting the mid 30s. But truly my parents live in a wonderful place and I really appreciated the greenery. It sort of inspired me to fix up my own courtyard in the new year.

A laptop and water bottle on a table, looking out over a garden

I’d made a personal resolution to vlog my christmas, and given my Sony camera just stopped working I had to do it on my phone. For some reason the Sony had an exhausted battery & wouldn’t charge using the cable I took with me, but it sprung right back to life when I got home.

The vlog was kind of interesting because excluding a few medicated moments I was a wreck for the entire holidays. I wasn’t really happy with the video, it was a bit disjointed and the quality wasn’t up to my standards. But people seemed to enjoy it, and I was surprised by how many different bits folks picked out as their favourites. So in the end even though I was too caught up in my own stuff, recording the little moments to tell a larger story kinda worked. Note to self.

Because of the massive rise in case numbers, rather than catching the train my folks drove me home. They stayed a night at my place before visiting every single family member within three generations.

Since then, like seemingly the majority of Brisbane, I’ve been on lockdown lite. It’s not that places are closed as much as there just aren’t any places I want to go right now. So I’m laying low, just waiting for the next thing. Surviving.

But like seemingly the majority of the world I’ve also been fixing up my little corner of it. I already installed screens last year so I can keep the insects out and naturally cool my apartment. At the end of this month my proper curtains are being installed. I finally got around to putting up some cute fairy lights, and when the outdoor chairs I had my eye on went on sale Ben convinced me to unload my wallet and get em. So after about 6 months this place is really turning into home. It’s my little oasis. I couldn’t be happier.

An outdoor patio, with two garden chairs and LOTS of plants

So to speak. It’s been a slog. I feel like Australia is now in the throes of that first wave most of the rest of the world experienced in 2020 and it’s really shown what we’re made of. There’s no protein (let alone meat) in the supermarkets, the ones that are even still open. Test and trace collapsed within days, and fucking Smirko do-nothing Morrison is looking to win the next election despite presiding over the entire shitshow. It’s rough watching all this stuff that we knew was going to happen, yet somehow nobody planned for, all the while having to just plug on and keep working like everything’s fine.

I’ll be honest the thing that’s kept me going for most of the year is making to-do lists. Simple things that I can pick up to break myself out of the absolute listlessness that’s underscored this latest wave. That, and I finally fixed my bike so I’ve been enjoying riding after work. Bike rides are on my list.

Bikeway, the go between bridge, the Brisbane Skyland in the background. On the left there's street art on a column for the coronation drive overpass, painted with geometric symbols and a pair of drag queen eyes.

When Dad was here he mentioned the tap water tasted disgusting, so I ordered a water filter jug along with some other items I needed from Kmart. When the water I’d been hoarding in the fridge ran out I realised that yeah, it does taste disgusting. The ABC says it’s because of rainfall and algae, natural and harmless. But my first thought went back to that article at the start of the pandemic outlining that probably a week into our supply chain failing we’d lose water treatment. Catastrophise much? But the jug arrived and while I’ve never much been one for filtered water, that first sip was heaven.

So this is what back to normal looks like I suppose. I’ve been trying to plan what my future looks like from here, but there’s not a lot to look forward to at the moment. New curtains at the end of the month? Everything else is just treading water and remembering to breathe.