How to livestream Around the Bay 2026 50km ride

Last year on a whim, I completed the Around the Bay 100km route. However this year I wasn’t feeling like my back and body could sustain that distance so decided on entering the 50km. A 50km ride to some people might sound like quite a distance, however once you’ve spent a little time on a bike it’s actually a fairly easy distance to accomplish. Most people can ride at 20km/h which means that as long as you can sit on a bike for 2.5 hours, a 50km ride is very doable. It’s the kind of ride I wouldn’t usually think about doing any preparation for.

Picture of me riding in around the bay with the Melbourne cityscape in the background. I’m waving to the camera

So when I signed up, I thought about ways I could do it to make it a bit more interesting, and one idea I had was attempting to livestream the entire ride. How hard could it be? Well, it resulted in what I call the “GoPro jousting stick”.

Pole connected to the handlebar of the bike and two gopros mounted on the end

Prior to making this decision, I had previously streamed a few of my work commutes since the ride along the river is so nice in the morning and evenings. This gave a me good idea of some of the challenges involved and I had already refined that setup a bit.

Streaming methods

Let’s run through some of the ways of streaming a bicycle ride:

Lazy approach

Diagram showing a bicycle. There’s a camera connected to a phone which connects via 4G to cloud, elasti twitch, then the users browser. The user is saying “mcdonalds”
It seems pretty simple, attach a camera to the bike, connect it via the app, press stream. This is actually an approach I’ve taken in the past with a GoPro. It works ok. It has some limitations though:

  • GoPro 8 (what I have in stock) - live streaming does not recover from faults, it will end the stream on connection loss. Even if the stream doesn’t end, a temporary period of low bandwidth will make it drop back to the lowest bitrate and never come back
  • No overlays to show stats like speed, heart rate or a map
  • Only supports a single camera
  • GoPro 8 do not support rotating the camera output for livestreams - this can be a problem if the camera is mounted upside down (a necessity if it’s under something)
Multi track drifting

Same as the diagram above, however there is an OBS server between the phone and the Twitch server
The other approach I’ve attempted in the past is running an Open Broadcaster Server (OBS) in a remote location (I think the pros call this a “playout server”). This allows adding an overlay to the broadcast along with multiple camera support. Multi camera support I think is useful - as its nice to see what I’m doing along with the course itself. Some issues remain and we get some new ones.

  • We still have the issue with GoPros disconnecting / reducing bitrate
  • We’ve also now doubled the amount of bandwidth required for the already limited 4G link
On bike OBS

Diagram as above however the OBS server is now OBS laptop and is on the bike
The solution I’ve had the most success with on my commutes has been running OBS locally. This has the advantage of ensuring the GoPros never “disconnect” even if the 4G connection goes down. It also allows crunching the video bitrate down prior to sending over the 4G. It’s still not perfect because it has these issues:

  • Lugging a laptop around for 50km (I probably wouldn’t have done this on the 100km)
  • Having to power and cool a laptop streaming out for the duration of the ride

This last method is the one I went with. It also allowed some flexibility in changing the config during rest stops if needed - though in hindsight this would have been better done by someone else monitoring the stream.

I think in future I would combine this method with the one above to allow someone monitoring to adjust the stream due to faults - something I can’t do while riding.

Putting it all together

With the streaming method selected, let’s look at all the components along with how they performed on the day:

My Body

Most importantly, my body plays a big part in actually completing the ride. At the start of this post I mentioned that 50km wasn’t a big deal for me (and probably for you as well). Well, in the lead up to the event I got the sickest I think I’ve ever been in my life - and on multiple occasions I thought I might need to go to the hospital. I didn’t eat for 3 days. Even today I still have a cough that isn’t going away any time soon.

Chart showing cycling distances with a blocked off section labeled sick which covers from around the 13th to 5th

So we were really going into this with minimal training. I was originally aiming for a 25 km/h pace but decided to just approach it with whatever felt comfortable on the day.

Sunblock

Before we dive into the more technical aspects, I wanted to talk about the sun. The 50km event is one of the later starting times, but even still I had to get up fairly early so that I could ride to the event, set up the stream and get going. As I would be in the sun for most of the event, the plan was to apply sunscreen before I left.

The problem is that at 6am when applying the sunscreen I was still not quite awake. I focused on a lot of areas that I typically miss or are hard to reach. Somehow I missed two very obvious and normal spots on my arms. I can confidently say that sunscreen works from this inadvertent A/B test. In hindsight I should have taken some time to reapply sunscreen at one of the rest stops.

The bike

My bike is a Polygon Path X5. This bike is very easy to ride and with the front and rear racks I’ve added, has plenty of storage possibilities for the streaming equipment. Prior to the event, I adjusted the front dérailleur to fix a long standing issue I had with the low gears rubbing. I only made this adjustment because of the long uphill section of the West Gate Bridge.

Me cycling up the westgate trying to smile at the camera

The bike held up well during the event with the exception of the rear tyre. Only fairly recently I had Schwalbe G-One RS PRO tyres installed.

I have not been impressed with these tyres. I’m not sure if it has been bad luck with debris, a bad batch of tyres, or if this range just isn’t very good for the cycling I do. This is in contrast to the Schwalbe G-One Overland 365 which I really enjoyed and found super reliable. Often in the mornings I see sealant oozing out of the sidewalls.

Inspecting tyre and showing leaking sealant

The day before the event I had a leak that the sealant was not filling very well. The tyre was holding pressure ok, so I left it overnight hoping it would seal. It mostly did, and in the morning before leaving I pumped the tyre up to full pressure.

Frame covered in sealant

It seems, however, that during the event I picked up another puncture - as referring to pictures, there was a new leaking hole, and when I got home the rear of my bike frame and front dérailleur was covered in sealant that had leaked out while riding.

The internet

Getting the stream out to Twitch requires some form of internet. The organisers had told me that “no you can’t drag a VDSL copper line behind you the entire way”. The next best thing would be 4G. We also have 5G here in Australia, but in previous testing I found that the 5G cell coverage areas are fairly small and the handoff time to 4G seems quite slow, so forcing 4G increased reliability. This will likely change in the future.

To connect to 4G I just used my mobile phone, since I would be taking it regardless. A fancy router with two modems on different networks and multipath TCP would probably improve this setup - however I wanted to keep the complexity low and remove additional devices to carry. The Telstra coverage for the event is pretty good so I turned off my second Optus SIM to prevent handover problems and to reduce battery usage.

Using my phone for data poses another problem however. Android, for some bizarre annoying reason, decided to implement client isolation for the hotspot mode, and there is no way to disable it. This prevents the GoPros from connecting to the OBS server.

To overcome this I actually used USB tethering to the laptop and configured macOS for internet sharing.

Generally, coverage was pretty good for the event with one exception that I’ll get into later in the post.

I bought a phone holder specifically for the event, with the intent that I would occasionally look at the screen for Twitch messages, however it was far too busy to move my focus to the phone, even briefly. This setup did mean running a USB cable from my bag to my phone. I might leave the phone in the bag next time.

Laptop

I decided to use my MacBook for the OBS server. It seems a little silly when I could use a Raspberry Pi, but a laptop gives me a full debugging interface that I can access along the way. It also comes with a large battery.

Prior to starting the stream I did a fresh boot and closed all the unneeded apps. By default macOS will sleep on lid close, so running this command prevents that:

sudo pmset -a disablesleep 1

The weather turned out to be a fairly warm day, so the laptop got a little bit warmer than I expected - but it still worked fine and heat didn’t become a problem. The laptop is placed in my usual pannier bag with the USB cable running up to my phone.

Pannier bag on my bike

One thing to consider with this setup, however, is that the laptop will charge the phone. This will mean that the laptop is going to discharge its battery quicker than expected, leaving you with a flat laptop and full phone at the end of the event. To combat this, I also included a power bank to charge the laptop. At the end of the event my laptop was left with 10% battery, which was a lot lower than I was expecting.

In the future I’ll consider not using a laptop.

Overlays, OBS and Twitch

Twitch screenshot showing the complete playout with stats and map overlays

Adding data like heart rate, speed, distance, and a map really makes the stream pop. I think because it gives the audience some context and detail on how you are going. This overlay is rendered on the laptop on my bike. We have the main view, selfie view, a title, social url, map and vitals.

The cameras are pretty obvious, with the quirk that one of the cameras is mounted upside down. This is corrected in OBS as the GoPro 8 cannot rotate while in streaming mode. The way I connected the cameras to OBS was using the Media Source input with the input URL set to “rtmp://0.0.0.0:8890/live/app”, input format “flv” and ffmpeg options “listen=1”. This tells ffmpeg in OBS to open a port and listen for an incoming stream.

OBS configuration options listed above

The map is provided by Garmin LiveTrack with some slight CSS tweaks to adjust its appearance. OBS lets you embed webpages and interact with them.

The vitals are little bit more complicated. These also come from LiveTrack but another option is to pull them directly from the sensors locally. I went with the LiveTrack approach as it seemed easiest. It’s not really a public API but reverse engineering it isn’t hard once you figure out the CSRF token stuff. To display it in OBS I actually just used matplotlib in Python and told OBS to capture that window. The script is hacky but you can grab it from this gist if you like.

This setup worked well, however it was a bit rigid. Tequin moderated the Twitch chat and let me know during the event when people commented or asked questions. I think it would have been preferable to stream the cameras to an OBS instance that Tequin controlled so that the stream continued with a “be back soon” message even when my internet dropped or there was technical problem.

GoPros. Sigh.

Maybe it’s not better the devil you know than the devil you don’t. I went with GoPro 8s because I had them and I knew them. However they are buggy pieces of shit. Unfortunately the test stream I did they worked perfectly so it gave me a false sense of semi-security.

To make the GoPros as easy to setup in the field as possible I made use of GoPro Labs firmware and the QR code configuration. As I was concerned that I would have to re-trigger start stream on the GoPros often, I printed that command on a sticker placed it on the back of my bike computer so it was easy to just wave it in front of the camera to restart the stream.

I did a few practice runs at home of getting everything to start, and it was a bit unreliable, but once they connected it was solid.

On the day, I burnt through all of my 30 minute setup time trying to get the GoPros to connect to the hotspot. They would connect to WiFi, go “LIVE”, then report “Connection Lost, retrying” or something to that effect. In all my testing I hadn’t ever seen them get into this state where they remained in “LIVE” but not connected.

Because of this I gave up on the OBS stream and switched to direct streaming from the main GoPro to Twitch. Because the camera was mounted upside down this meant an upside down stream with no overlay. At the first rest stop I tried the OBS setup again and it worked flawlessly.

My assumption here is that the event starting area is just saturated in 5GHz radio noise. The GoPros seem to really suck at WiFi when overloaded with RF. To back up this theory, the stream was running completely fine for the rest of the event up until I re-entered Albert Park for the finish. Interestingly both the internet dropped (Twitch stream showed broken stream icon), but when the stream returned the cameras were disconnected (and I knew this from the cameras beeping at me). It makes me wonder if there’s a signal jammer, broken device or spark gap generator near by….

I also can’t rule out that I was doing something wrong during the setup in the morning. If I were to do this again I would drop the GoPros from the setup and pickup something I could connect via USB directly. Though I’d want to make sure it had some ability to handle motion/vibration or add a gimbal.

Powering the cameras

From my previous testing with streaming my commutes I figured I get about 45 minutes of battery life. The GoPro batteries are pretty small. You can however power the GoPros via USB.

I have been playing around with using NP-F batteries as my go-to power source for projects, and decided to make use of them here as well.

NP-F power plate connected to bike

Obviously GoPros don’t have NP-F batteries, but I had picked up this Probty NP-F USB power plate things which provide various inputs and outputs for that style of battery.

3d printed mount for NP-F plate

I designed and printed a quick little adapter to mount them onto my front rack and this worked surprisingly well. Each rack is going to be different, so you can use this OpenScad model as a starting point. I used PA6-CF filament for the print.

Finally we need to connect the USB cables to the GoPro. Normally the USB connector is hidden behind the battery cover. Leaving this uncovered will cause the battery to fall out. You can buy 3rd party covers that have a USB cutout. I attempted to buy one however when it showed up it was for the wrong GoPro model.

GoPro 3d printed battery cover with USB cable connected

I ended up 3d printing my own cover as I was running out of time from I think this model.

Jousting

The next part is securing the cameras and getting good angles. In my commute streams I only use a single camera which looks forward. The easiest way for me to do this is to replace my bike light with a camera.

While this provides a decent view forward, if I did the same trick for a backwards facing camera, the angle looks horrible. So instead I wanted to move the cameras forward of the bike so the camera looking towards me is a bit more appealing and interesting. Moving the cameras to the front rack lowers the cameras too far and the selfie camera ends up with the same problem we were trying to avoid - along with having handle bars covering the field of view.

To solve this I used a Bullet Time GoPro Motorcycle & Bicycle Handlebar Mount. For some reason 360 cameras are now called “bullet time” even though thats not what “bullet time” is….

Selfie stick adapter mount with warning that the factory has torqued it

Although the handlebar adapter has a big warning that the screws have been torqued in the factory, by the end of the event I noticed I was able to easily move the mount +/- 10 degrees by hand. I did test that this was torqued before leaving - so I’m bit surprised it came loose. Something to keep in mind in the future.

Since I needed to mount two cameras I went looking for a GoPro mount double adapter style thing, before realising I could just print one.

3d printed gopro double adapter

I used this model however it required some modification as the prongs are the wrong size. I haven’t printed this one but it claims to fix this problem.

Once I got all the camera angles correct, I added a witness mark using a paint pen so that if anything shifted or changed I could return it back to the correct position. I didn’t have any issues with the camera moving angle with the exception of the final Albert Park entrance where I hopped up onto a roundabout to pass some other cyclists and get some speed into the final section. You can see the shift in this picture I took after finishing.

witness mark on the GoPro mount showing the mount has moved

Discord chat

A last minute (well last few days) addition was joining Alex’s Discord voice chat during the ride. Alex did The Classic 220km ride. I didn’t want to open mic the entire ride so I bought one of those Zello Bluetooth PTT buttons.

Close up of the PTT button

Getting this to work was harder than I expected. The button doesn’t act as a keyboard (so doesn’t work natively in Discord) but rather a custom BLE device. You need to subscribe to events from the BLE characteristic to detect changes in button states. Reverse engineering the Bluetooth part was easy, but trying to simulate a key hold down event was much harder. I tried keyboard, pynput, CGEventCreateKeyboardEvent, PyAutoGUI and other Python libraries however none worked. Well they worked - but not in Discord. Other apps detected the presses fine but Discord’s PTT detection never detected the presses.

I ended up installing Karabiner Elements which installs a virtual keyboard driver so the operating system sees what looks like a real keyboard. I modified the example code for interfacing with the driver to accept a basic command from stdin, then adjusted my python PTT code to pipe commands to that process. A gist of the code is here but it’s very hacky.

Even though the PTT system worked really well, it was never used as I switched to using Discord on my phone, due to the initial stream failure.

Checklists

This entire project has relied on checklists. I would print these out on labels and stick them to places so that I had to use/remove them before continuing. The night before, I had to make sure everything was packed and ready and batteries were charged. In the morning I needed to make sure any items that were charging were packed. The last thing I wanted was to do was something like leave my laptop at home as I wouldn’t notice until it was too late.

At the start line, I needed to start the hotspot, configure the cameras, start OBS, set sleep mode on the laptop, configure the vital/map overlays, start my HR monitor, etc…. Having a list to make sure that was all done in the correct order was important.

The result

Partial success. As mentioned above I was unable to get the stream started at the beginning of the event. I opted to fall back to direct streaming from the GoPro to Twitch, but I forgot the stream would be upside down. I had a quick break at the first rest stop to see if I could get the stream running through OBS.

This worked first go, but while doing this I accidentally stopped the Garmin activity, causing a new Live Track to be started, so stats showed the distance and map incorrectly. Additionally since I switched to Discord on my phone that meant that audio on the OBS stream wasn’t coming from my microphone and I had otherwise disabled the GoPro microphones to prevent double audio. At the second rest stop I fixed this by enabling a GoPro microphone, but this caused a bit of a one way conversation effect with the Discord users.

Regardless I’m pretty happy that I was able to get it to mostly work. As you hopefully understand, there’s a lot of moving parts to get working and with illness I didn’t really have a chance to do more testing.

Even if it didn’t work, just doing the ride is enjoyable enough. Not sure what event I’ll do next year. If its a shorter ride, I might try to stream it again. Now that I have a streaming setup that works, I can also do this on other rides, not just Around the Bay.


Around the Bay 2025 100km

If you follow my partners YouTube channel, Drop Table Adventures, you’ll be well aware that they have been entering the “Around the Bay” cycling event for several years now. Specifically “The Classic” route. This is a 220km circuit….. around the (Melbourne) bay.

This year on a bit of a whim, and within 5 days until the event I decided to buy a ticket for the 100km route. Then I checked the weather. I should have checked the weather first.

Around the bay 100km map showing the path from Albert park to Williamstown and out to Mordialloc

The 100km route leaves Albert Park, over the West Gate bridge to Williamstown, back across West Gate, follows the bay towards Mordialloc before returning to Albert Park.

A 100km ride is big for me. The last time I rode 100km was in high school. Made even more challenging in that I hadn’t trained for this. But I felt strong when I purchased the ticket.

Challenges:

  • Scoliosis - riding long distances has historically been extremely hard on my back
  • No training - I did a 40km social and slow ride about a month prior, and a 20km about 2 weeks prior
  • Still somewhat recovering from my last bike crash
  • I don’t really have much experience in group riding
  • 3 days prior I managed to give myself food poisoning (stomach related fun seems to be a reoccurring problem when I enter events it seems)
  • The 100km route requires crossing the West Gate twice - so a bit of elevation change compared to just riding the bay trail

On my side:

  • Have been keeping fairly fit, swimming, short runs
  • Competing in the commuter cup 2-3 days a week

Prep

To give myself the best shot of making the distance I stripped my bike of the lock, front and rear racks. Given the weather I left the mud guards on (more of a courtesy to other riders but seems I was alone here). With no racks, I had a small saddle bag which carried a toolkit, bacon strips, tyre levers, a tube, my phone and a pump.

For hydration and fuel I carried… an AARNet water bottle. I decided to rely on the rest stops for fuelling needs. In hindsight I probably should have packed at least a single gel.

Go

Since I had traveled with Droppy and Alex to the event, I was very early for the 100km start. This meant I found myself at the start of the pack. It’s not a race so it doesn’t matter so much, but it certainly grouped me with some riders that were probably a little bit fitter than me.

Leaving the start line I was filled with “oh god what have I gotten myself into” as I kept up with some very expensive bicycles being ridden by people that at the very least looked the part. I on the other hand was wearing a loose fitting running top and running tights with my budget gravel bike. There was some slight drizzle but it was otherwise not bad conditions to ride in. Moving speed was around 30km/hr.

Riding up the west gate bridge

Hitting the west gate though and that speed dropped right back to 16-20km/hr, but I was still keeping up with the main pack. The pack was cruising at closer to 28km/hr after the bridge which was a bit closer to what I could handle.

At 18km we hit the first rest stop - I decided to keep riding through. The pack thinned at this point but I clearly wasn’t the only one continuing through. Back over the bridge and on the other side I felt that my legs were a bit more like Jell-O™ now (40km in). Unfortunately the pack split up a bit due to traffic lights and eventually I was practically alone. At this point I was considering skipping the next stop and continue straight onto Mordialloc (70km in).

Riding along beach road, waving at camera

However at 45km logic prevailed and I realised I needed fuel and a top up of my water. So when the 50km Elwood rest stop came up I entered. At this point I found myself in an interesting situation - I was too fast to be in the casual riding groups and too slow to keep up with the serious groups. At Elwood rest stop I entered while they were practically still setting up. I think I saw two other cyclists. I was still able to grab a banana and some water. Was hoping that there would be some hydralite. Onwards!

This next section between Elwood and Mordialloc was horrible, the worst even. I’m not sure if it was just because I was low on energy or the way the elevation changes occur, but speed dropped significantly on the slight uphills. The downhills didn’t feel like they lasted for long. A couple of packs over took me here, I tried to keep up for a bit but just couldn’t. Regardless still averaging around ~25km/hr. I was riding alone for pretty much all of this section.

Arriving at Mordialloc (70km) I was sore. I knew I had to spend some time at this stop. I grabbed some crisps, trail mix, and a gel. While eating I spent some time sitting and standing to give the muscles that keep my back in check a break. Legs were feeling ok, but not strong. During this time I overheard that rain would be coming at 11am. At this point I decided that maybe, just maybe I could make it back dry.

While the Elwood/Mordialloc stretch was the hardest, the Mordialloc to finish stretch was the sorest. At 80km my back just said no. I considered stopping for a break. I felt I was close enough that I could just suffer a bit more.

Riding back towards the start, It’s looking a lot more wet

I noticed on my bike computer that my average speed was around 25.3km/hr. This shocked me a little as I went into this thinking that my speed would be closer to 20km/hr. My immediate thought was “maybe I can get 100km in under 4 hrs”. Could I keep up my pace?

No. By 90km it had lowered to 25.0km/hr. All was not lost though, the elevation flattens out and I was able to keep my speed up. Just one tiny problem. The much more casual 50km riders were now mixed in, combined with more traffic lights. The average speed kept slipping lower and lower, the rain started, and my focus became just making it back. I’m glad I made this decision - the traffic was just too busy and the interruptions too great to make it.

Riding through one of the finish archways

Coming in to Albert Park for the finishing lap, it was wet. I was cold from waiting for traffic lights. My Garmin read 99.3km. This was going to be unsatisfying. So instead of ending the ride, I quickly funneled through the finish then rode to our car. Making up the missing 700m + giving me shelter from the rain.

The pain

Surprisingly my back recovered fairly quickly. Just being off the bike was enough. My right leg however was not. Any slight twist on it when load bearing was extremely painful. I was extremely concerned that I had undone a bunch of recovery.

The next day was a relief. While there was some amount “somethings not right here” feelings, the issue had mostly gone away. Hopefully this trend continues. I generally feel like my body should feel a lot worse than it is today.

The bike

So how did the bike hold up? It was a dream with one tiny hiccup. Shifting became unreliable about 50km in. I think this is just a cable tension issue and is easily fixed, but I didn’t want to risk making it worse during the day. I figured I could just double shift then back one when it didn’t change. Could be as simple as the wheel sitting slightly differently after being reassembled post transported.

Again?

I won’t say no, but it’s unlikely. This really pushed the limits of my back, just a bit more than I feel comfortable with.

The event was extremely enjoyable. Maybe I’ll sign up for the 50km instead.

The stats

100km Time 4:07:13
Average speed 24.2 km/hr
Ascent 538 m
Passing Vehicles 204
Pedal strokes 17,992

One more thing

Remember that desire to get under 4 hours? Well, since I get to set the rules… if you look at Garmin’s recorded moving time (aka, removing all the traffic light stops) we get:

Moving time 3:59:18

JSON Repaint

JSON’s had a tough life. Before I was all that attached with the bike I didn’t exactly treat it with same the respect I do today. It was just a cheap bike to get me from point A to point B. The more I rode it the more I fell in love with it. Combined with damage from the previous owner and other general wear and tear the frame was starting to show some signs of rusting.

Paint damage on the rear dropouts

The plan was to strip the bike of paint, then respray it. This wasn’t going to happen in our apartment, however an excuse to visit Mark in Adelaide presented itself. I took the bike across the border and over the period of several weeks redid the paint work.

Prep

At this point I’d become pretty familiar with the process of removing every type of bike part on my bike. Within a few hours I had removed everything which left only the frame. If you are planning on embarking on this adventure and you are unfamiliar with removal of all your parts, get some help or do some research. Some parts can be fragile, some have reverse threads and some can be damaged if force is applied in the wrong spots. There’s also a bunch of tricks to learn for when things don’t go to plan.

An example is the quill stem - often on these bikes they become stuck. If you try to strike the stem directly you’ll likely either damage it or get it more stuck. While it doesn’t always work a good starting place is to leave the stem bolt in, but proud, then strike the bolt with a hammer - this will dislodge the wedge and hopefully allow removal of the stem.

After removing all the parts from the bike frame I decided to strip most of the paint off the bike. Now stripping the paint entirely off isn’t necessary. You only need to strip the paint back far enough for the new paint to stick, along with getting the surface finish to the quality you want it. I went for stripping it back entirely (there were a few bits I couldn’t easily get to so I just roughed these up as best I could). The reasoning for stripping back entirely was to ensure there was no hidden rust - along with removing a nasty paint run was present on the bike already.

I’m really glad I did strip it all the way back during sanding I noticed some weird pattens forming, slowed down an used a higher grit sand paper. To my surprise the red and white paint scheme wasn’t original. I had suspected this given the paint run, however I could never confirm this. I never knew the make or model of the bike and by carefully sanding back the top layer it revealed a uv damaged outline of the original branding. An Apollo Eclipse. This would have been the pink and white model. For me the bike has always been red and white, that’s now part of its history. So while I could return it to original colours, they wouldn’t be original to me.

Sanded back paint revealing pink apollo logo

Sanded back partial exposed eclipse logo

For the majority of stripping I used low grit sand paper however for the fiddly bits I restorted to wire wheel brushes on a cordless drill. Removing the paint is probably the hardest part, once its removed moving up in grit to make a smooth finish happens fairly easily. I went with the sanding approach because sand blasting seemed too expensive for this project and sanding didn’t seem like too much effort (it was a lot of work, don’t get me wrong, but it didn’t really take that long). I looked into chemical processes however youtube tutorials and reviews gave me the impression that it seemed more annoying than just sanding. Everyone has different advice on the process however I settled for about about 400 grit for the final sand working off the theory that while spray paint is thin, it still needs some roughness to the surface to stick well. I used higher grit sandpaper to touch up some parts during painting. If you want to take away anything from this blog post though, think PPE. Not just when spraying paint but when sanding. I generated so much dust when sanding back the frame.

Bike frame stripped of paint

Painting Rust

The next day with all the rust and paint sanded back I went to paint. I thought I’d be able to get away with a day of stripped bike frame in less than 20% humidity but flash rust struck. It wasn’t a big deal however, I was able to sand back the frame with high grit sandpaper again just prior to painting. I gave the frame a wipe down with some acetone to remove debris and now we were ready to paint.

Painting

I went with Rust-oleum 2X Primer and Custom Spray 5-in-1 for the paint. This was mostly because I’m familiar with how they spray and work. They probably aren’t the best choice for bike paint, however rattle cans in general aren’t good - this is because the layer of paint is so thin compared to other methods. Regardless it’s something that fit the budget, and that I could easily do.

Selfie of me in full face respirator with bike in background

I actually reached out to Rust-oleum to confirm my planned process prior to painting and they were able to provide a bunch of nice details and provide confidence. First up was priming. The Rust-oleum paints allow re-coat anytime within 1 hour and they recommend coats 15 minutes apart. I setup the forks and main frame near each other so I could do them at the same time. This allowed me to switch between each while waiting. I was able to get 4 coats onto each within the window. The usual rattle can advice applies - thin coats. Sicne the frame is so large I applied thin coats and moved around the frame, usually doing 3 coverages every time I did a coat. Priming was probably the hardest part not to get runs on I got a slight run during this and sanded it back prior to the top coats.

Bike frame that’s been sprayed with white primer

Since the bike was lacking any sort of branding, I wanted to give it some. I had a original plan for that - Crossy JSON - however since I now knew the make, model and what the original decals looked like I incorporated some of the design into my plans. There was the option of simply making some decals and slapping it onto the bike afterwards, but I really wanted to try using the decals as mask. I cut out some new decals for a mask and applied them careful. This meant that prior to the decals being applied I had to do some extra top coats in the masked off colour.

CROSSY JSON decal on transfer paper with thick horiztonal lines to replicate  the feel of the original logo

Mask applied to top tube of bicycle

Some red coats went on. The Custom 5-in-1 cans low output mode really helped prevent any runs. I got a slight run where the rear brake sits but it was easily fixed up. The tricky part however was replicating the “original” white gradient on the dropouts. I did a few practice sprays for this to get an idea of what I was doing along with masking off everything that wouldn’t be part of the gradient and in the end it turned out great - I feel like its better than the previous gradient.

Near finished frame with red, decals and gradient showing

The masked off sections were removed prior to the clear coat. This is where I learnt that my masking approach was probably wrong. A negative mask would have been easier to remove (I created a bunch of damage to the paint getting each piece off) and would have made the painting process easier. Regardless I’m happy with the results given it was my first time doing this sort of thing.

I was originally concerned about runs on the clear coat - because that could have caused disaster, however even on high output mode I couldn’t have made a run if I wanted to. I’m sure the temperature helped but I feel like the chemical composition just makes it really hard to run with that paint. One approach for painting bikes it to actually not worry about clear coats, just make the top coat as thick as possible. I however wanted the finish that the clear coat provided.

Post

Prior to reassembling the bike I decided to give its internals a blast of cavity wax. This is intended to prevent rust from the inside. An idea I picked up from Croker vs ROVER. Most of the internals have drainage holes that the applicator can be fed through.

Pre-sequel

During painting I throughly washed all the parts, rebuilt bearings and placed everything in Evaporust. The Evaporust worked a treat, however flash rust struck again leaving me to have to repeat the process for many parts. The problem is that with the rust removed, washing with water just creates the perfect surface for more rust. I think the solution to this varies per part, varying from an aciditic bath, zinc plating and painting. However for the time being I went with a light coating of WD-40 (which is apparently the original purpose of WD-40). I think if I do this again I’ll have a think about how I deal with this.

Parts cleaned after evaoprust process - they are mostly clear of rust and look very clean

I also found that many parts on my bike were broken. I ordered a replacement seat as the plastic holding it together had cracked. A spoke was broken on one of the wheels. The new spokes that I ordered were too long (they must of been the perfect size before, as the new ones were less than 2mm longer than the old) so I’ve reconfigured the wheel for a 4 cross spoke pattern.

The chain, bell, and cabling were all replaced. Along with the handlebar tape.

Finally

Finished bike leaning against tree with a view of a small lake

While the bike is mostly done now I still need to true the wheels a little better, along with draw up some of the spoke tension. I’m pretty happy with the results. There’s some bits that I messed up or could do better but for my first attempt I think I did well. It’s certainly better than when I started which is the key thing.