Making my own numbers stations


Last weekend, I got to run a game of Monster of the Week for some friends. It was the first time in a while, and knowing our luck it will probably be a while yet until the next one. Something in me decided to go big, and I found myself doing more preparation than I’ve done for any game in a very, very long time.

I made my own numbers stations.

You can listen to the bits I gave to the players here: link.


The audio was accompanied by an encoded journal, which I made a fumbled attempt at weathering, and handed to the group towards the start of the game.


After playing an initial radio broadcast from my computer, I handed over an iPad with the page above loaded up, along with a pair of headphones, so that the players could browse and decode at their own pace.

The conceit being, of course, that something is sending out these cryptic radio signals, and the mysterious figure that dropped this notebook was somehow related.


Luckily for me, play worked out pretty much how I anticipated: one player (the team’s hacker) assumed the role of the decoder, while the other players went around gathering clues. I used their rolls towards Investigate the Mystery and Read a Bad Situation feed back into clues about the code itself, which the players then relayed back to the person doing the decoding. The decoder then finished a page, relayed its contents to the rest of the group, and they used that information to inform where to go investigate next.

It all culminated in the party taking turns wielding a giant magical sword against a seven-headed alien child that had been manipulating catholic imagery for centuries, and narrowly avoiding an apocalypse-initiating explosion. So, you know, pretty typical stuff.

Building the thing

The stations operate under the idea that somewhere in the world (a notebook, in this case), you have at last one key and a variety of codes. The station reads off numbers that line up with a code, and when the number from the code is subtracted from the number from the station, you get a result that lines up to one of the keys.

In my game, I used four different keys, and had the station call out both the key and page number at the start of each transmission.

To quickly create the various keys, I wrote a bit of javascript that ran in my browser’s console (though you could easily improve on it aesthetically if you wanted):

const createCypher = () => {
  var cypher = [];
  while(cypher.length < 26){
    var c = Math.floor(Math.random()*100);
    if(cypher.indexOf(c) === -1){

I repeated that function until I had four arrays of 26 numbers, and plopped those into an object. I also made sure to have an array with each letter of the alphabet, like this:

const alphabet = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];
const cyphers = {
  'man': [4, 56, 82, 11, 0, 35, 85, 73, 14, 98, 80, 32, 43, 57, 21, 88, 78, 45, 19, 83, 66, 97, 89, 72, 12, 86],
  'lion': [62, 11, 40, 58, 78, 49, 21, 94, 87, 77, 96, 95, 7, 6, 27, 34, 83, 26, 5, 33, 72, 70, 91, 8, 42, 98],
  'calf': [97, 48, 86, 10, 53, 54, 65, 69, 80, 58, 23, 38, 71, 55, 24, 88, 79, 82, 12, 64, 34, 57, 8, 42, 41, 77],
  'eagle': [33, 32, 8, 79, 12, 45, 38, 64, 15, 39, 19, 89, 14, 58, 37, 18, 30, 24, 20, 91, 2, 53, 86, 98, 36, 28]

The array names correspond with the keys that I wrote into the physical book, they could really be anything (they don’t even have to be named, technically).

Finally, I wrote out each of the passages that I wanted to encode in all-caps strings, assigned a key to each string, and plugged them into this function to create the final ciphers:

const encodeText = (input, cypher) => {
  var cypher = cyphers[cypher];
  var input = input.replace(/[^\w]/g,'').toUpperCase().split('');
  var result = [];
  var code = [];
  var audio = [];
  for(var i = 0; i < input.length; i++){
    var p = alphabet.indexOf(input[i]);
    var a = Math.floor(Math.random()*125);
    var c = a - cypher[p];

The final result here is that I have the text that goes to our audio, the code that I write into the notebook, the result of audio-code which should match up with the key that I entered, and the text, which is what I put in. I suppose, looking back at it now, I could have had this function double-check my work by subtracting each item in code from the corresponding item in audio, then grabbing the correct letter from alphabet according to the key, but alas. I was in a hurry.

Creating the stations

To create the audio, I dropped the “audio” variable into a TextEdit document, and used Apple’s Automator program to create a folder workflow, which takes incoming text files, and uses the “Text to Speech” feature to get an MP3 of a voice reading the numbers, along with my text stating the key and page number, four times.

I finished it off by dropping these into Audacity along with a downloaded clip of radio noise, and a vaguely creepy version of the Doxology. Well, it was vaguely creepy in context, anyway. You could recreate the voice on a PC by using the Narrator feature, and recording the output directly into Audacity.

I uploaded the files all at once to a page on this site, which you have a link to at the top of the page, and used a bit of CSS to hide the usual Squarespace header and links.

Future adjustments

In the end, I found it was a pretty effective, if labour-intensive, way to help tell the story I was trying to tell. If I were to do it again, I’d definitely use a different music sample (think something along the lines of Stranger Things 3), and I’d have someone do a live read of the numbers, rather than relying on the computer (which I felt read a bit fast).