Tom Ashworth
Notes, mostly.
Hi, I'm Tom. I write here about engineering, AI, and the work of building software. More about me, or say hello.
-
10 Apr 2026
litprompt: a markdown preprocessor for LLM prompts
A little tool that strips comments and resolves imports in markdown prompt files
-
24 Mar 2026
Phantom notifications from mise in iTerm
Why mise triggers empty macOS notifications on every cd in iTerm2, traced to its terminal_progress OSC escape sequences, with a one-line config fix to disable them.
-
11 Feb 2026
How I rebuilt a game from my childhood using Claude as my engineering team
Robot Battle in the browser, with a new programming language...
-
08 Jan 2026
Notes on my AI tools + workflow
Vanilla Claude and custom plugins...
-
02 Dec 2025
Meet your new QA: Claude for Chrome
Claude variants become best friends
-
01 Dec 2025
Learning from Claude Code’s own plugins
What can we learn from Anthropic’s own engineers prompt and structure agentic workflows?
-
01 Aug 2025
Hiring Claude
Going full intravenous AI in open-source
-
06 Jul 2025
Quacks, psychics and LLMs
I finished work at Natcap on 3rd July — more on that here. With a summer of free time ahead of me, it’s time to make some trouble…
-
03 May 2025
Rethinking the Pareto principle
The traditional usage of the 80/20 rule needs a rethink, from oversimplification to powerful learning tool.
-
16 Jun 2020
Book notes: The Little Book of Beyond Budgeting
Notes on Steve Morlidge's Little Book of Beyond Budgeting, covering why annual budgeting fails, Ashby's Law of Requisite Variety, and how to replace it with continuous targets, forecasts and devolved teams.
-
23 Mar 2020
Monte Carlo analysis for product development
Using probabilistic techniques for exploring data and modelling outcomes
-
24 Feb 2020
Product management reading list
A short annotated list of books, articles and tweets that shaped my thinking on product management, including Shape Up, Good Strategy/Bad Strategy and Humble Inquiry.
-
08 Jul 2018
Project lead
I wrote a guide to help my team's Project Leads. It might be useful for you too.
-
10 Feb 2018
Notes on launching GraphQL at Twitter
What have we learned in a year of GraphQL at Twitter?
-
22 Jan 2018
Notes on building CLI applications in Rust
Working notes on migrating Twitter's Bash CLI tools to Rust, listing the existing Bash capabilities to replace, useful crates, and the trade-offs against using Python.
-
28 Jun 2017
Point the way
Why a tech lead creates more value by pairing, reviewing and mapping out the team's possible next steps than by diving in to write the code themselves.
-
07 Apr 2017
Two little libraries
Introducing if-expression and try-expression, two small JavaScript libraries that turn if and try-catch-finally statements into expressions that always return a value.
-
26 Sep 2016
Flight.js in 2016
How the TweetDeck team evolved Flight.js since 2014, borrowing React and Redux ideas for state, child components, RxJS data flow and connected components, and why they stuck with Flight over a rewrite.
-
03 Sep 2016
Some ways to think about state
Tracing a path from class-based mutable state through Python's self to pure functions, showing how an ordinary instance method becomes a Redux-style reducer that is reusable and testable.
-
20 Jul 2016
Technical lead
Roles and responsibilities of a Tech Lead
-
27 Jun 2016
Building a search query parser
Building TweetDeck's open-source Twitter search query parser in JavaScript, using a PEG grammar and Canopy to convert queries to an AST and back, with notes on stringification and reversible-parsing tests.
-
03 Jun 2016
Frontend reading list
A curated list of favourite talks and articles on architecture, HTML/CSS, tools, distributed systems and professional practice, featuring Rich Hickey, David Nolen and others.
-
19 May 2016
The impossible toolchain?
A short wishlist for a frontend toolchain with reliable type inference, clean interop, distributable types and debuggable sourcemaps, lamenting that no current option delivers it.
-
17 May 2016
Physical and mental exertion
A short personal note on drawing motivation in tough coding sessions by comparing the struggle to hard physical exercise, wondering if others think the same way.
-
07 Dec 2015
Distributed systems reading list
An annotated reading list of books, papers, talks and blogs on distributed systems, from Kleppmann and Aphyr to Lamport's clocks paper.
-
25 Nov 2015
Promise & fetch cancellation
Argues that request cancellation does not belong in the Promise spec, drawing on the fetch and es-discuss debates to show why fetch needs its own primitives instead.
-
12 May 2015
Technical debt
Lessons from a six-month TweetDeck technical-debt project on identifying debt, deciding what to pay off, weighing refactor versus rewrite, and the people side of touching legacy code.
-
24 Mar 2015
Type-checked pseudo-code
Why prototyping problems in Haskell first works as type-checked pseudo-code, using its type system as a forcing function to clarify thinking before writing real code.
-
03 Dec 2014
Concerning separation
A defence of keeping presentation logic alongside templates, as React does, arguing that view logic and markup are one concern and that splitting them lowers cohesion.
-
29 Oct 2014
Elm: building native modules
How to write Elm native modules in plain JavaScript by hooking into the compiler's Elm.Native namespace, with a clear warning that it's an unsupported hack.
-
31 Aug 2014
CSP and transducers in JavaScript
A from-first-principles build of core.async-style channels and composable transducers in JavaScript, then wiring them together to filter and map DOM events.
-
01 Mar 2014
How we use Twitter Flight in TweetDeck
Patterns from running nearly 200 Twitter Flight components in TweetDeck, covering component types, mixins, nested teardown, and event namespacing conventions.
-
24 Feb 2014
Rebase you interactively for great good
A worked walkthrough of git's interactive rebase, using edit, squash and commit splitting to tidy a messy commit history before pushing.
-
13 Feb 2014
Default to technology
A reminder that build it and they will come is false: find customers and understand their problem first, and reach for technology only once you can deliver value.
-
04 Dec 2013
codebar
A first evening coaching at codebar, the London meetup running free programming sessions for women and others under-represented in tech, and why its strong turnout matters.
-
18 Oct 2013
Avoid lots of arguments
Why functions taking many positional arguments are a refactoring smell, and how an options object (and Promises) makes calls clearer and order-independent.
-
24 Apr 2013
casper: helpers and handlers for Express
Introduces casper, a small library of helpers and handlers for building JSONP APIs in Express, with database callbacks and body checks, filters and whitelists.
-
24 Apr 2013
distra: static server & reverse proxy
Introduces distra, a Node CLI tool that serves static files and reverse-proxies local servers under friendly hostnames, managing your hosts file automatically.
-
11 Apr 2013
Keeping open-source secrets
Practical ways to keep API keys and config out of an open-source repo, comparing gitignored files, private forks, environment variables and a fallback chain that supports all of them.
-
02 Feb 2013
Respond
A short argument that responsive design should mean more than screen size: the web could adapt to a user's location, mood, behaviour and context, not just their device.
-
20 Dec 2012
Useful JS: snippets
A handful of everyday JavaScript snippets for logging arguments, binding this in setTimeout, filtering and mapping arrays, and setting default function arguments.
-
18 Dec 2012
A year to remember
A personal recap of 2012: starting and leaving a CS degree, building frittr, working at Buffer and on App.net apps, and landing a dream job at Left Logic.
-
17 Nov 2012
Code sketching
A technique of sketching throwaway code snippets to design intuitive, consistent module interfaces, treating developer experience much like a designer treats user experience.
-
16 Nov 2012
Useful JS: curry and bind
What currying (partial application) is and why it's useful, building a curry function from scratch and showing how ES5's bind handles both this-binding and argument fixing.
-
13 Nov 2012
Components & the Shadow DOM
Exploring the Shadow DOM and the emerging web component model, with a hands-on experiment turning a story list into an encapsulated widget in Chrome Canary.
-
08 Nov 2012
Collaboration
Drawing on human evolution and ant colonies to argue that contributing to open source has outsized impact, backed by data showing roughly 1.3% of users contribute to major projects.
-
05 Nov 2012
A git workflow
A personal git workflow based on GitHub Flow: a deployable master, frequent cheap branches, pull-request reviews, and a feature/fix/task/try naming convention.
-
02 Nov 2012
Useful JS: call & apply
How JavaScript's call and apply work and differ, with practical uses like converting arguments to an array and a worked pub/sub example.
-
02 Oct 2012
A quick intro to TypeScript
A first look at TypeScript, covering installation and how object types (interfaces) and function types let you catch errors before running your JavaScript.
-
24 Sep 2012
How I'd steal your passwords
A proof-of-concept walkthrough of how a browser extension could silently keylog passwords and intercept form data, as a warning about trusting what you install.
-
22 Aug 2012
YRS and broken education
After mentoring kids at Young Rewired State, a critique of results-led schooling as a conveyor belt and a case for self-directed, internet-enabled learning.
-
22 Jul 2012
JavaScript app hosting on S3
A trick for hosting client-side JavaScript apps on Amazon S3 by pointing the index and 404 pages at the same file, faking a directory structure from the request URI.
-
11 Jul 2012
How to write safer JavaScript
Quick techniques for safer JavaScript: avoiding global variables, wrapping code in self-executing functions, the leading-semicolon guard, and protecting against a redefined undefined.
-
06 Jul 2012
Quality & code
An argument that developers should take pride in well-documented, tested, readable code rather than valuing code that merely works, especially in open source.
-
03 Jul 2012
Grid, set and match
A walkthrough of a personal site redesign, using Gridset for a compound grid alongside Jekyll, LESS and in-browser design with JS Bin.
-
02 Jul 2012
Radio silence
A short personal note on how turning off Growl desktop notifications removed constant interruptions and restored focus.
-
03 May 2012
Design for the web
A reflection on what makes designing for the web distinct: conveying structured information and, uniquely, designing the hyperlinked pathways between pieces of it.
-
01 May 2012
CSS triangles + animations = pie chart spinner
Building a circular countdown spinner in pure CSS using the triangle border trick, radial-gradient masks and Webkit keyframe animations, including a layered mask-on-mask hack.
-
28 Mar 2012
Consumption addiction
A personal reflection, prompted by an Extra Credits episode, on breaking an addiction to consuming online content in order to become a creator rather than a consumer.
-
27 Mar 2012
Responsive workflow
A walk through a responsive design workflow, from six-up sketching and typography with Modular Scale and Typecast to fluid layouts and breakpoints where the design actually breaks.
-
24 Mar 2012
The hard stuff
A short opinion piece asking why startups chase social and sharing instead of harder problems, floating ideas in publishing, education and printers.