Dan Q couldn’t find OK00F7 Pig City Vista

This checkin to OK00F7 Pig City Vista reflects an opencache.uk log entry. See more of Dan's cache logs.

Came by this location while doing the nearby WAG series. Was delighted to see that an OpenCache was on the route too so the geopup and I dedicated the time to a decent search. We think we found what was once the hiding place, but the cache itself was sadly nowhere to be seen.

Dan Q couldn’t find GC54DW0 WAG 11 – Panorama

This checkin to GC54DW0 WAG 11 - Panorama reflects a geocaching.com log entry. See more of Dan's cache logs.

Between nearby GC7QC7R, which acts as a spur to this series, and OK00F7, which sits on (and predates) this series, I was feeling confident of a find here… but after an extended search the geopup and I had to admit defeat. To be honest, she was willing to give up and press on immediately, having seen a muddy puddle up ahead that she wanted to play about it, and her persistent lead-pulling in that direction might have reduced both my patience and the efficacy of my search! But we found a few things that might match the hint and didn’t see success, soo… 🤷‍♂️

Dan Q found GC7QC7R Lothal

This checkin to GC7QC7R Lothal reflects a geocaching.com log entry. See more of Dan's cache logs.

As a quick diversion from the nearby WAG series, the geopup and I meandered out this way to find this cache. Once I was in the vicinity of the cache something stood out to me as unusual, so we went to pick it up… it turned out to be a chunk of wraught iron, but finding it soon pointed me in the direction of the cache. TFTC.

Dan, wearing a white t-shirt and with a red dog lead hanging over his shoulder, stands in a forest, gesturing down a path to a small French Bulldog following him.

×

Dan Q found GC610PB WAG 12 – Wroxhills Wood

This checkin to GC610PB WAG 12 - Wroxhills Wood reflects a geocaching.com log entry. See more of Dan's cache logs.

A quick and easy find: we walked straight to where the coordinates said and there it was. My phone, having been rebooted during the last leg, was now behaving much better at narrowing down a satellite fix!

These woods are really quite amazingly beautiful and serene. It’s quiet and calm here, and both the geopup and I really appreciate the excuse to have come here.

Next, it’s time for a quick diversion from the series to find nearby GC7QC7R!

Dan Q found GC54DXQ WAG 13 – Oh deer!

This checkin to GC54DXQ WAG 13 - Oh deer! reflects a geocaching.com log entry. See more of Dan's cache logs.

Took several attempts to find the correct hiding place and the poor geopup – who didn’t like the tight-knit undergrowth here except when it suited her (when she wanted to chase after a pheasant!) – eventually had to be tied to a tree while I pressed-on without her to get the cache in hand. Phew! TFTC.

A French Bulldog on a forest path pulls against her lead.

×

Dan Q couldn’t find GC78WN6 WAG 8 – Battle Farm

This checkin to GC78WN6 WAG 8 - Battle Farm reflects a geocaching.com log entry. See more of Dan's cache logs.

This was the moment when I found myself wishing that my dedicated GPSr unit was with me and working, as my phone’s GPS fix started jumping all over the place. The geopup and I made a few valiant attempts to search in the obvious places, criss-crossing our way through some quite fierce brambles as we did so, but without success. Eventually, we had to move on and chalk this one up as a DNF. I’ve no reason to believe it’s not out there somewhere, but it’ll be a job for somebody whose satellite navigation kit is playing ball.

Boot stepping into long bramble undergrowth.

×

Dan Q found GC54DF1 WAG 7 – Fuming!

This checkin to GC54DF1 WAG 7 - Fuming! reflects a geocaching.com log entry. See more of Dan's cache logs.

The geopup made herself useful for this cache, running straight to the cache location. (I suspect that some prior canine visitor may have left their mark somewhere very near to the cache, and she was more interested in smelling that than she was at helping me find the container, but I can dream of a dog who’s a useful geocaching assistant, can’t I?) TFTC.

A French Bulldog standing by a rural "gas pipeline" warning sign.

×

Dan Q posted a note for GC54DEF WAG 6 – Water Break

This checkin to GC54DEF WAG 6 - Water Break reflects a geocaching.com log entry. See more of Dan's cache logs.

Working our way through the first part of the WAG series, we unfortunately had to skip this one without an adequate search: the area was crawling with ramblers, consulting their maps and chatting with one another, and I didn’t have a good excuse to stop and search. Maybe next time!

Dan Q found GC9BYME WAG 5a

This checkin to GC9BYME WAG 5a reflects a geocaching.com log entry. See more of Dan's cache logs.

The geopup struggles to understand why I sometimes insist on stopping our walks to go and poke around in the nearby trees, and this time was no exception. The hint could refer to one of several hiding places, and like a previous cacher I worried for a moment that the hiding place might have been destroyed by some recent logging work in this area, but nope: it’s still here! It was a little more-challenging to retreieve than it perhaps was originally, though, as a pile of branches has been placed between the path and the hiding place, but we found it in the end then pushed on across the road, waving to some friendly cyclists as we did so.

Dan Q found GC8C4TE WAG 5 – Battle

This checkin to GC8C4TE WAG 5 - Battle reflects a geocaching.com log entry. See more of Dan's cache logs.

Another excellent bit of camoflage here, on what has so-far appeared to be a well-loved but well-maintained series. The geopup and I went back and forth a few times before we found the correct host, but soon had the cache in hand. TFTC.

Dan Q found GC54DD8 WAG 4 – Chiltern Way Extension

This checkin to GC54DD8 WAG 4 - Chiltern Way Extension reflects a geocaching.com log entry. See more of Dan's cache logs.

Unfortunately, my dedicated GPSr had been left turned-on after my last geocaching/geohashing/whatever expedition, and I hadn’t realised until I was just setting off this morning. I tried to charge it in the car but it didn’t take on enough battery to make it worthwhile to bring it out, so I was working from my phone (whose GPSr is… adequate… usually), and my watch (whose GPSr is good, but whose user interface for caching is pretty pants).

But luckily for this cache at least my geosense brought me to exactly the right spot, and I quickly saw something that looked out of place. Imagine my delight when I pulled on it and the cache was in my hand. Fantastic stuff, TFTC.

Dan, wearing a grey hoodie over a white t-shirt, pets Demmy, a French Bulldog.

×

Dan Q found GC54DB8 WAG 3 – Cleeve Corner

This checkin to GC54DB8 WAG 3 - Cleeve Corner reflects a geocaching.com log entry. See more of Dan's cache logs.

The time before last that I was in Goring – the first of my now-three visits – was for a birthday/garden party on 24 June 2018. My eldest – then only four years old – was getting a little bored of the grown-up conversations going on and I provided a distraction by taking her out to find GLW5FKG9 and GLW5EFV2 (the latter of which has since been archived).

I enjoyed the camoflage on this cache, but little did I know that it would be a theme throughout many of the caches in this series! FP awarded anyway, because it delighted me at the time. TFTC.

Dan Q found GC54DAM WAG 2 – Cow Hill

This checkin to GC54DAM WAG 2 - Cow Hill reflects a geocaching.com log entry. See more of Dan's cache logs.

The last time I was in Goring was on 9 June 2022, when I cycled here via Eynsham, Abingdon, and Didcot. I enjoyed a meal at at Whale Inn in Streatley, then meandered down into Goring in order to catch a tran part of the way home (I was feeling lazy). Another easy find here. TFTC.

Dan Q found GC54D9K WAG 1 – See the light

This checkin to GC54D9K WAG 1 - See the light reflects a geocaching.com log entry. See more of Dan's cache logs.

Ignoring times that I’ve passed-through, I’ve only ever visited Goring twice before. It’s time to rectify that! This morning, the dog and I drove down from Stanton Harcourt (near Witney), parked up, and begun our attempts at the first half of the WAG trail (along with a couple of others along the way).

Starting as we mean to continue, this was a very quick first find. TFTC.

Dan, wearing blue jeans and a grey hoodie, kneels alongside Demmy, a French Bulldog, on a dirt path between a forest and the wooden fences at the edge of some gardens.

×

Watch Together with WhatsApp on the side

A virtual party

This weekend, I threw a Virtual Free Fringe party for some friends. The party was under-attended, but it’s fine because I got to experiment with some tech that I’d been meaning to try.

Phootgraph of a wall-mounted television screen. On the screen, comedian Peter Buckley Hill sits with his guitar on his lap in front of an audience: the "PBH's Free Fringe" logo is on the curtain behind him. On the left of the screen a series of WhatsApp messages appear, including one showing a photo of Dan holding a can of Old Speckled Hen beer.
The Abnibbers and I have experimented with watching things together, but apart, before, but this is the first time we’ve watched stand-up comedy this way.

If you ever want to run something like this yourself1, here’s how I did it.

My goals were:

  • A web page at which any attendee could “watch together” a streaming video2,
  • A “chat” overlay, powered by a WhatsApp group3 (the friend group I was inviting were all using WhatsApp anyway, so this was an obvious choice), and
  • To do all the above cheaply or for free.
Selfie photograph of Dan, in a bar with a rooftop view of daylight out the windows in the background, looks concerned as he stares at the a frothy, bubbling flask of yellow liquid he's holding.
I’m a big fan of experiments. Contrary to this picture, though, they’re usually software experiments.

There were two parts to this project:

  1. Setting up a streaming server that everybody can connect to, and
  2. Decorating the stream with a WhatsApp channel

Setting up a streaming server

Linode offers a free trial of $100 of hosting credit over 60 days and has a ready-to-go recipe for installing Owncast, an open-source streaming server I’ve used before, so I used their recipe, opting for a 4GB dedicated server in their London datacentre: at $36/mo, there’d be no risk of running out of my free trial credit even if I failed to shut down and delete the virtual machine in good time. If you prefer the command-line, here’s the API call for that:

curl -H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-X POST -d '{
    "authorized_users": [
        "[YOUR LINODE USERNAME]"
    ],
    "backups_enabled": false,
    "booted": true,
    "image": "linode/debian10",
    "label": "owncast-eu-west",
    "private_ip": false,
    "region": "eu-west",
    "root_pass": "[YOUR ROOT PASSWORD]",
    "stackscript_data": {
        "server_hostname": "[YOUR DOMAIN NAME]",
        "email_address": "[YOUR EMAIL ADDRESS]"
    },
    "stackscript_id": 804172,
    "tags": [],
    "type": "g6-dedicated-2"
}' https://api.linode.com/v4/linode/instances

The IP address got assigned before the machine finished booting, so I had time to copy that into my DNS configuration so the domain was already pointing to the machine before it was fully running. This enabled it to get its SSL certificate set up rightaway (if not, I’d have had to finish waiting for the DNS change to propogate and then reboot it).

Out of the box, Owncast is insecure-by-default, so I wanted to jump in and change some passwords. For some reason you’re initially only able to correct this over unencrypted HTTP! I opted to take the risk on this server (which would only be alive for a few hours) and just configure it with this limitation, logging in at http://mydomain:8080/admin with the default username and password (admin / abc123), changing the credentials to something more-secure. I also tweaked the configuration in general: setting the service name, URL, disabling chat features, and so on, and generating a new stream key to replace the default one.

Now I was ready to configure OBS Studio to stream video to my new Owncast server, which would distribute it to anybody who tuned-in.

Screenshot showing OBS Studio window with Start Streaming enabled. The layers "VLC", "Abnib Logo", "WhatsApp icon", WhatsApp prompt", and "WhatsApp" are visible. Elsewhere on the screen, a WhatsApp Web view is visible, with its CSS tweaked to give it a red background, among other changes.
Next up, we need to make WhatsApp appear on the stream with a little bit of CSS hackery.

Decorating the stream

I configured OBS Studio with a “Custom…” stream service with server rtmp://mydomain:1935/live and the stream key I chose when configuring Owncast and kicked off a test stream to ensure that I could access it via https://mydomain. I added a VLC source4 to OBS and fed it a playlist of videos, and added some branding.

With that all working, I now needed a way to display the WhatsApp chat superimposed over the video.For this, I added a Window Capture source and pointed it at a Firefox window that was showing a WhatsApp Web view of the relevant channel. I added a Crop/Pad filter to trim off the unnecessary chrome.

OBS Studio screenshot showing a WhatsApp Web (Window) source tied to a Firefox window and with Crop/Pad and Chroma Key filters applied.
The same technique, of course, could be used to superimpose any web page or whatever other content you like onto a stream.

Next, I used the Firefox debugger “Style Editor” to inject some extra CSS into WhatsApp Web. The class names vary frequently, so there’s no point we re-documenting all of them here, but the essence of the changes were:

  1. Changing the chat background to a solid bright color (I used red) that can then be removed/made transparent using OBS’s Chroma Key filter. Because you have a good solid color you can turn the Similarity and Smoothness way down.
  2. Making all messages appear the same (rather than making my messages appear different from everybody else’s). To do this, I added:
    • .message-in, .message-out { align-items: flex-start !important; } to align them all to the left
    • [aria-label="You:"]::after { content: "Dan Q"; height: 15px !important; display: block; color: #00f !important; padding: 8px 0 0 8px; } to force my name to appear even on my own messages
    • [aria-label^="Open chat details for "] { display: none; } to remove people’s avatars
    • [data-testid="msg-meta"] { display: none !important; } to remove message metadata
    • A hacky bit of CSS to make the backgrounds all white and to remove the speech bubble “tails”
  3. Removing all the sending/received/read etc. icons with [data-icon] { display: none; }

I aimed where possible to exploit selectors that probably won’t change frequently, like [aria-label]s; this improves the chance that I can use the same code next time. I also manually removed “old” messages from the channel that didn’t need to be displayed on the big screen. I wasn’t able to consistently remove “X new messages” notifications, but I’ll probably try again another time, perhaps with the help of an injected userscript.

A little bit of a shame that more people didn’t get to see the results of this experiment, but I’m sure I’ll use the techniques I’ve learned on another ocassion.

Footnotes

1 Or, let’s be honest, if you’re Future Dan and you’re trying to remember how you did it in last time.

2 We were to watch a show by one of my favourite comedians Peter Buckley Hill, the man behind the Free Fringe. I’ve written about him previously… here, there, also several times in 2012 when I also helped make an official digital map of Free Fringe venues. I was especially delighted to have my photo taken with him in 2006. I might be a bit of a fanboy.

3 This could probably be adapted for any other chat system that has a web interface, so if you prefer Telegram or Slack or whatever ever, that’s fine.

4 OBS’s VLC source is just amazing: not only can you give it files, but you can give it URLs, meaning that you can set up a playlist of YouTube videos, or RTSP security camera feeds, or pretty much anything else you feel like (and have the codecs for).

× × × ×