by Bren Brightwell

egg fried rice that tastes like it

you know, the stuff that costs £1.80 a serving from Dragon Castle on the corner

boil a medium sized kettle


you do

  1. toast the rice with the sesame for a bit in a big flat bottommed pan (you make my rockin world go round) with a lid
  2. crumble the stock, dash the fish sauce and relish and pour over the water. lett it sizzle on high a bit then down to medium. put the lid on
  3. ten minutes later when the rice has eaten all the water take off the lid and move the rice to one side
  4. heat up, and crack the eggs into the side of the pan the rice isn’t
  5. gradually stirr the eggs into the rice as they cook
  6. when ur hungry, season with garlic salt and pepper and eat
by Bren Brightwell

almost weeknotes 3

- i'm pretty sure i had some important stuff running on IFTTT - worth it imo
by Bren Brightwell

fortnightnotes??? 2

by Bren Brightwell

weeknotes 1

that’s it for now. see you next week

by Bren Brightwell

the asymptotes rp-1


  1. get a dev environment set up on the pi


  1. solder headers onto stack
    1. pi
    2. protohat
  2. get values reading from the encoders
  3. solder gfx hat
  4. draw values of encoders on lcd
    1. plus backlight?
  5. solder piano hat
    1. might need to solder dac hat first? depending on clearance etc
  6. show current touched keys on lcd


  1. design/research simple synth, 4 params
  2. design a ui for it
  3. build it


  1. design a sequencer
  2. build it


  1. who even knows
by Bren Brightwell

Javascript Keyword Ungolf

writing a module a week or two ago i noticed that export default async function is an awful lot of javascript keywords in a row. so, because of who i am as i person, i set out to string as many together as i could.

the rules

  1. distinct keywords from ecmascript section only
  2. has to be syntactically valid, i.e. not throw a SyntaxError
  3. has to be semantically valid, i.e. not throw any kind of runtime error
  4. keywords themselves must be separated only by whitespace. extra non-whitespace characters at the beginning or end of the statement are fine
  5. wrapping the statement in something to get you more valid keywords is a-ok
Read more…
by Bren Brightwell

Thinking in Make

Okay, but what is a makefile. Actually what is it.

Make is for running tasks

Here’s a simple makefile, as barebones as possible without it literally being an empty file:

	echo “did the thing”

Save that as makefile, and in the directory, run make do-a-thing:

⟩ make do-a-thing
echo “did the thing”
did the thing

Tell Make what to run and it runs it. Each line like do-a-thing: specifies a target, and the indented lines (which need to be indented with actual tabs, sorry space-lovers) after the name are the shell commands to run for that target.

Read more…
by Bren Brightwell

You Don't Get AMP

I’m at AMPConf in NYC, and yesterday’s panel, “AMP & The Web Platform” raised some interesting questions around AMP’s place within the web ecosystem. Watch the recording, it’s fastastic stuff, and Tim Kaldec has a great summary of the concerns raised about AMP.

But the framing of some of the questions, both in the panel and the Q&A later that afternoon, highlighted to me that some people are looking at AMP from entirely the wrong angle. I think taking a step back and looking again might help reconcile how Google and the developer community are approaching AMP.

Read more…
by Bren Brightwell

Improving Risk with a little Legacy

I’m at chez Brennan for Christmas, and we’re playing Risk again. Which means I’m trying to improve Risk again.

Risk is really, truly awful:

But! There’s a core of a good game in there. The territorial reinforcements and dice rolling mechanic are fundamentally okay! So I’d been thinking about what you could minimally change about the non-core aspects of the game.

Separately, I’ve been playing Risk Legacy with a few friends. The game is basically still Risk, but in each game you make changes to the board, to your faction, to cards, that permanently change the game. And it turns out Hasbro had also put some thought into the design of the base game. The core is the same, but there are a few changes to setup, reinforcement, and victory conditions that go a long way to addressing the problems I outlined above, especially the late-game slog.

So I thought I’d borrow a few of them for regular Risk.

And it worked! The game we played was far shorter and more tactical. Mum won, with a sneak attack on my Icelandic headquarters that nobody saw coming.

Modified Risk rules

Follow the original Risk world domination rules, plus the variant Fortifying your position. You’ll need some extra tokens to represent Headquarters and Victory Points; we used buttons.



Scoring & Winning



by Bren Brightwell


by Bren Brightwell

A Crash Course in React

This is React 101. I’m not going to cover modules, or build systems, or boilerplates, or ES2015, or hot loading, or any of that crap you don’t care about right now. Right now, you’re looking at a React app and thinking “okay, but what is it actually doing?”. We’ll start small. I’ll assume you can read Javascript.

Read more…
by Bren Brightwell

Heroku Version Infer

In the Apps team at the FT, we quite quickly ended up with 3 separate new Node apps running on Heroku, each with their own deployment pipeline and release schedule. Keeping track of what was released and fixed when was intractable. Manual version numbering was impractical. Gotta go fast.

I hit upon the idea of using something like semantic-release to automatically number our versions. We weren’t releasing npm packages, so not the thing in itself, but something based on the idea of using commit message conventions to guide version numbers. We quickly realised that semver major-minor-release was pretty much meaningless, and the idea got shelved.

A few weeks later I had a thought. A version number is nothing but a monotonically increasing sequence. It needs to increase if and only if there is a change to the code that’s running. It needs to be derivable from nothing but the source code and its Git history. Number of commits to master would fit the bill, but the number would quickly grow and become meaningless: “when was that fix released? In 2497?” “No, it’s in 2506, that’s not in production yet”.

Instead, I played around with the number of merge commits into master. It’s far less granular than gross number of commits. We have automatic deploys from master to our Heroku staging apps, and master is branch-protected on Github. That ensures that every release to staging has an associated merge, and every merge gets released. Or, put another way, the number increases if and only if there is a change to the code that’s running. It’s also comparable across environments. If production has a lower version than staging, you know exactly how many pull requests it’s behind by. If they’re the same, you know production is up to date and running the exact same code as staging.

I’ve encapsulated this in the npm package @quarterto/heroku-version-infer. It’s got a CLI designed to be run at the npm lifecycle script heroku-postbuild. It needs correct repository information in your package.json and it depends on the mostly-undocumented Heroku environment variable SOURCE_VERSION.

On its own, it just updates the version in package.json. I’ve got a suite of other tools to propagate that release version to other things that need to know about it: Github, Sentry, JIRA. They don’t depend on each other, but they do play nicely together.

We’ve been versioning like this for a couple of months now and it’s been pretty useful.

by Bren Brightwell

How to cache data from an external API in Meteor

This is the blog post I wish had existed months ago.

If you’ve been using Meteor for a while, chances are you’ve come across the fantastic blog Meteor Capture and, in particular, their two-post series How to Publish Anything. If not, I strongly recommend going and reading them both, because this is the unofficial third post in that series.

Read more…
by Bren Brightwell

"Vote Leave" just tried to steal the election

This post isn’t my usual fare. Sorry about that. But I am so fucking angry right now.

Up until this afternoon, if you googled “register to vote”, this is what you got:

That is not a link to the voter registration page. That’s an ad, placed by Vote Leave, that took you to a form on their site, with a nice big red “Register to Vote Now!” button that did nothing of the sort.

I’d love to assume this was done in good faith. I really would. I can’t think of any possible world in which this isn’t intentionally misleading. This is a major political campaign intentionally intending to disenfranchise people. This is electoral fraud.

I’d wager the very demographic that’s likely to be googling “register to vote” in the first place is the one most likely to vote “remain”, viz. 18-24-year-olds.

And they would have gotten away with it too, if it wasn’t for you meddling kids. Who knows. They still might.

That page is gone now. Who knows what damage it’s already done.

Image from Political Scrapbook

by Bren Brightwell

Lanzarote 2016