TOMWELLS.ORG
State at 2026-10-26

2026

OCT

Tom is co-founder and technology executive (CTO) of Synthesis and Chief Disruption Officer at Araxi. Focused on effect systems that keep agents inside the architecture.

{ roles: [ { label: "Co-founder & Technology Executive (CTO), Synthesis", story: "co-founder and technology executive (CTO) of Synthesis" }, { label: "Chief Disruption Officer, Araxi", story: "Chief Disruption Officer at Araxi" } ]
, focus: "effect systems that keep agents inside the architecture"
, base: "Amsterdam, The Netherlands"
, languages: [ "Rust", "Haskell", "F#", "PureScript", "JavaScript", "C#", "Java", "Scala", "Elm", "Python", "C", "C++", "LiveScript", "Go" ]
, portrait: (Just { label: "2026", src: "/images/portraits/portrait-2026-45d6e77e424a50e2.png" })
, shipped: 8
, posts: 12
, talks: 13
}
SEC.01

Event log

-- Rendered values use Site.Model.Event and Change.
stateAt t = foldl apply origin <<< through t
  1. #0492026-09-30BLOG
    Agents need their own spreadsheet
    Post "agents-need-their-own-spreadsheet"+

    Agents don’t need more context. They need a workplace.

    { id: "agents-need-their-own-spreadsheet"
    , when: Day 2026 9 30
    , kind: Post
    , title: "Agents need their own spreadsheet"
    , note: "Agents don’t need more context. They need a workplace."
    , url: (Just "/blog/agents-need-their-own-spreadsheet/")
    , video: Nothing
    , changes: [  ]
    }
    Read the blog post →
  2. #0482026-03-09TALK
    Agents are architecturally blind
    Talk "talk-JaLAvoyjwoQ"+

    Effect systems turn the compiler into an architectural enforcer.

    { id: "talk-JaLAvoyjwoQ"
    , when: Day 2026 3 9
    , kind: Talk
    , title: "Agents are architecturally blind"
    , note: "Effect systems turn the compiler into an architectural enforcer."
    , url: (Just "https://www.youtube.com/watch?v=JaLAvoyjwoQ")
    , video: (Just "JaLAvoyjwoQ")
    , changes: [ Focus "effect systems that keep agents inside the architecture" ]
    }
  3. #0472025-09-29TALK
    Type safety and composition of agents
    Talk "talk-3O_OfNDFa_Q"+

    A technical session presented to my team around building better Agents through leveraging type safety & composition. Familiar ideas to to functional programmers, and now through the lense of designing Agents.

    { id: "talk-3O_OfNDFa_Q"
    , when: Day 2025 9 29
    , kind: Talk
    , title: "Type safety and composition of agents"
    , note: "A technical session presented to my team around building better Agents through leveraging type safety & composition. Familiar ideas to to functional programmers, and now through the lense of designing Agents."
    , url: (Just "https://www.youtube.com/watch?v=3O_OfNDFa_Q")
    , video: (Just "3O_OfNDFa_Q")
    , changes: [  ]
    }
  4. #0462025-09-23BLOG
    Engineering Discipline for the Agent Era
    Post "agentic-engineering-discipline"+

    As a technology leader working for a software engineering company, it's becoming increasingly obvious that we need to revamp how we approach our work given the new agentic tools at our disposal. The old methodologies don't account for the unique challenges of human-agent collaboration in code generation.

    { id: "agentic-engineering-discipline"
    , when: Day 2025 9 23
    , kind: Post
    , title: "Engineering Discipline for the Agent Era"
    , note: "As a technology leader working for a software engineering company, it's becoming increasingly obvious that we need to revamp how we approach our work given the new agentic tools at our disposal. The old methodologies don't account for the unique challenges of human-agent collaboration in code generation."
    , url: (Just "/blog/agentic-engineering-discipline/")
    , video: Nothing
    , changes: [  ]
    }
    Read the blog post →
  5. #0452025-09-02BLOG
    Smart tools, dumb design choices
    Post "json-schema-rant"+

    While learning about building Agents, MCP, etc I've come across a few patterns which tingle my spidey-sense, such as:

    { id: "json-schema-rant"
    , when: Day 2025 9 2
    , kind: Post
    , title: "Smart tools, dumb design choices"
    , note: "While learning about building Agents, MCP, etc I've come across a few patterns which tingle my spidey-sense, such as:"
    , url: (Just "/blog/json-schema-rant/")
    , video: Nothing
    , changes: [  ]
    }
    Read the blog post →
  6. #0442025SHIP
    ~80% of Synthesis delivery goes agentic
    AI and agentic engineering across client projects within eight months: process, tooling and commercial model.
    { id: "80-of-synthesis-delivery-goes-agentic"
    , when: Year 2025
    , kind: Ship
    , title: "~80% of Synthesis delivery goes agentic"
    , note: "AI and agentic engineering across client projects within eight months: process, tooling and commercial model."
    , url: Nothing
    , video: Nothing
    , changes: [ Focus "agentic engineering at organisational scale" ]
    }
  7. #0432024-10-09TALK
    A whirl around Parsec
    Talk "talk-ZqjmKpWEi0I"+

    Parsec is a swiss army knife for building parsers in haskell - it can be scary when first starting out but very simple once you get over the initial curve. In this session we take a stab at hacking our way through building a basic parser for a simple MUD like set of actions. This was an open and interactive session with a group of haskell-curious guys of various levels so we also spend some time discussion general haskell features too as questions arise!

    { id: "talk-ZqjmKpWEi0I"
    , when: Day 2024 10 9
    , kind: Talk
    , title: "A whirl around Parsec"
    , note: "Parsec is a swiss army knife for building parsers in haskell - it can be scary when first starting out but very simple once you get over the initial curve. In this session we take a stab at hacking our way through building a basic parser for a simple MUD like set of actions. This was an open and interactive session with a group of haskell-curious guys of various levels so we also spend some time discussion general haskell features too as questions arise!"
    , url: (Just "https://www.youtube.com/watch?v=ZqjmKpWEi0I")
    , video: (Just "ZqjmKpWEi0I")
    , changes: [  ]
    }
  8. #0422024SHIP
    Configuration platform rebuild, semiconductor OEM
    A business-critical system spanning the full product lifecycle, rebuilt in flight while the business kept running.
    { id: "configuration-platform-rebuild-semiconductor-oem"
    , when: Year 2024
    , kind: Ship
    , title: "Configuration platform rebuild, semiconductor OEM"
    , note: "A business-critical system spanning the full product lifecycle, rebuilt in flight while the business kept running."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  9. #0412023-08-04TALK
    So yeah, Rust
    Talk "talk-LeA10SZPxJg"+

    A nice and quick whirl-wind around the Rust programming language, and some of the features that should put it high up on your priority list of languages to learn next!

    { id: "talk-LeA10SZPxJg"
    , when: Day 2023 8 4
    , kind: Talk
    , title: "So yeah, Rust"
    , note: "A nice and quick whirl-wind around the Rust programming language, and some of the features that should put it high up on your priority list of languages to learn next!"
    , url: (Just "https://www.youtube.com/watch?v=LeA10SZPxJg")
    , video: (Just "LeA10SZPxJg")
    , changes: [  ]
    }
  10. #0402023-04-26TALK
    A vision for building AI-driven applications
    Talk "talk-9_tqXgfgE1o"+

    A fun discussion around the state of building AI-driven applications today (in the AutoGPT / BabyAGI sense) and a vision of what we could expect to see the developer experience looking like in the future.

    { id: "talk-9_tqXgfgE1o"
    , when: Day 2023 4 26
    , kind: Talk
    , title: "A vision for building AI-driven applications"
    , note: "A fun discussion around the state of building AI-driven applications today (in the AutoGPT / BabyAGI sense) and a vision of what we could expect to see the developer experience looking like in the future."
    , url: (Just "https://www.youtube.com/watch?v=9_tqXgfgE1o")
    , video: (Just "9_tqXgfgE1o")
    , changes: [  ]
    }
  11. #0392023-03-21SHIP
    { id: "galactica-gpt-4-in-your-shell"
    , when: Day 2023 3 21
    , kind: Ship
    , title: "Galactica: GPT-4 in your shell"
    , note: ""
    , url: (Just "https://galacticai.co")
    , video: Nothing
    , changes: [  ]
    }
  12. #0382023-03-02TALK
    Tom talks Rust, 5 episodes
    Talk "talk-0gOJVNH2Lzo"+
    { id: "talk-0gOJVNH2Lzo"
    , when: Day 2023 3 2
    , kind: Talk
    , title: "Tom talks Rust, 5 episodes"
    , note: ""
    , url: (Just "https://www.youtube.com/watch?v=0gOJVNH2Lzo")
    , video: (Just "0gOJVNH2Lzo")
    , changes: [ Focus "Rust and AI developer tooling", Learned "Rust" ]
    }
  13. #0372022-06-15TALK
    Learn Haskell Together: Lambda Calculus
    Talk "talk-LLO9tlNiWfg"+

    Working through the Haskell Book (haskellbook.com) - starting with Chapter 1!

    { id: "talk-LLO9tlNiWfg"
    , when: Day 2022 6 15
    , kind: Talk
    , title: "Learn Haskell Together: Lambda Calculus"
    , note: "Working through the Haskell Book (haskellbook.com) - starting with Chapter 1!"
    , url: (Just "https://www.youtube.com/watch?v=LLO9tlNiWfg")
    , video: (Just "LLO9tlNiWfg")
    , changes: [  ]
    }
  14. #0362022-03-04BLOG
    Haskell for extreme idea brainstorming
    Post "haskell_for_prototyping"+

    A friend, named Gavin, wanted me to help him with a cool chess analysis thing he was playing with - and I suggested we extreme program a prototype using haskell - it was pretty amazing to pair program with because it's so frikkin simple to describe data structures / algorithms with.

    { id: "haskell_for_prototyping"
    , when: Day 2022 3 4
    , kind: Post
    , title: "Haskell for extreme idea brainstorming"
    , note: "A friend, named Gavin, wanted me to help him with a cool chess analysis thing he was playing with - and I suggested we extreme program a prototype using haskell - it was pretty amazing to pair program with because it's so frikkin simple to describe data structures / algorithms with. "
    , url: (Just "/blog/haskell_for_prototyping/")
    , video: Nothing
    , changes: [  ]
    }
    Read the blog post →
  15. #0352022-02-04TALK
    Web3 for developers
    Talk "talk-Bh_jFToqvoU"+

    A deep dive into Web3 from first principles, understanding why it exists, what it is trying to solve, and then ending up with building a very simple Hello World smart-contract and wiring it up to a basic web application to form a complete dApp.

    { id: "talk-Bh_jFToqvoU"
    , when: Day 2022 2 4
    , kind: Talk
    , title: "Web3 for developers"
    , note: "A deep dive into Web3 from first principles, understanding why it exists, what it is trying to solve, and then ending up with building a very simple Hello World smart-contract and wiring it up to a basic web application to form a complete dApp."
    , url: (Just "https://www.youtube.com/watch?v=Bh_jFToqvoU")
    , video: (Just "Bh_jFToqvoU")
    , changes: [  ]
    }
  16. #0342022SHIP
    Container shipping systems replacement, Singapore
    The operator’s entire systems estate, from booking to port agents. Peak of ~60 engineers. Live and handed over.
    { id: "container-shipping-systems-replacement-singapore"
    , when: Year 2022
    , kind: Ship
    , title: "Container shipping systems replacement, Singapore"
    , note: "The operator’s entire systems estate, from booking to port agents. Peak of ~60 engineers. Live and handed over."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  17. #0332021-09-02TALK
    Pure FP Sessions: Intro to Elm, 5 episodes
    Talk "talk-KgKi5hVTvik"+
    { id: "talk-KgKi5hVTvik"
    , when: Day 2021 9 2
    , kind: Talk
    , title: "Pure FP Sessions: Intro to Elm, 5 episodes"
    , note: ""
    , url: (Just "https://www.youtube.com/watch?v=KgKi5hVTvik")
    , video: (Just "KgKi5hVTvik")
    , changes: [ Learned "Elm" ]
    }
  18. #0322021-06-11TALK
    Future of Banking, Synthesis Podcast
    Talk "talk-DrcHAMpoZSY"+
    { id: "talk-DrcHAMpoZSY"
    , when: Day 2021 6 11
    , kind: Talk
    , title: "Future of Banking, Synthesis Podcast"
    , note: ""
    , url: (Just "https://www.youtube.com/watch?v=DrcHAMpoZSY")
    , video: (Just "DrcHAMpoZSY")
    , changes: [  ]
    }
  19. #0312021-02-16BLOG
    Finding purity again
    Post "finding-purity-again"+

    I'm getting back into Haskell since giving up on it around 2013 - of course due to work distractions, but mainly having the wrong expectation of what it would require from my brain to wrangle the fundamentals. At the time I found the syntax easy and beautiful, the paradigm of reductive programming very natural and the ability to describe and process data structures so elegant that I was absolutely smitten going through the beginner level tutorials and scratch programs.

    { id: "finding-purity-again"
    , when: Day 2021 2 16
    , kind: Post
    , title: "Finding purity again"
    , note: "I'm getting back into Haskell since giving up on it around 2013 - of course due to work distractions, but mainly having the wrong expectation of what it would require from my brain to wrangle the fundamentals. At the time I found the syntax easy and beautiful, the paradigm of reductive programming very natural and the ability to describe and process data structures so elegant that I was absolutely smitten going through the beginner level tutorials and scratch programs."
    , url: (Just "/blog/finding-purity-again/")
    , video: Nothing
    , changes: [  ]
    }
    Read the blog post →
  20. #0302021ROLE
    Opens the Synthesis Amsterdam office
    The base for European expansion.
    { id: "opens-the-synthesis-amsterdam-office"
    , when: Year 2021
    , kind: Role
    , title: "Opens the Synthesis Amsterdam office"
    , note: "The base for European expansion."
    , url: Nothing
    , video: Nothing
    , changes: [ Base "Amsterdam, The Netherlands" ]
    }
  21. #0292021ROLE
    Chief Disruption Officer, Araxi
    Technology adviser to the group CEO; owns the technology workstream across ~10 M&A transactions.
    { id: "chief-disruption-officer-araxi"
    , when: Year 2021
    , kind: Role
    , title: "Chief Disruption Officer, Araxi"
    , note: "Technology adviser to the group CEO; owns the technology workstream across ~10 M&A transactions."
    , url: Nothing
    , video: Nothing
    , changes: [ AddRole { label: "Chief Disruption Officer, Araxi", story: "Chief Disruption Officer at Araxi" } ]
    }
  22. #0282020-11-11TALK
    Learning PureScript Together, 12 episodes
    Talk "talk-bsZvjFAf9ig"+
    { id: "talk-bsZvjFAf9ig"
    , when: Day 2020 11 11
    , kind: Talk
    , title: "Learning PureScript Together, 12 episodes"
    , note: ""
    , url: (Just "https://www.youtube.com/watch?v=bsZvjFAf9ig")
    , video: (Just "bsZvjFAf9ig")
    , changes: [ Learned "PureScript" ]
    }
  23. #0272020-05-22TALK
    Flink deep dive
    Talk "talk-_8fHV5woDtQ"+
    { id: "talk-_8fHV5woDtQ"
    , when: Day 2020 5 22
    , kind: Talk
    , title: "Flink deep dive"
    , note: ""
    , url: (Just "https://www.youtube.com/watch?v=_8fHV5woDtQ")
    , video: (Just "_8fHV5woDtQ")
    , changes: [  ]
    }
  24. #0262020SHIP
    National-scale citizen messaging platform
    200 million messages in two months during COVID-19, so millions of South Africans could apply for the Social Relief of Distress grant.
    { id: "national-scale-citizen-messaging-platform"
    , when: Year 2020
    , kind: Ship
    , title: "National-scale citizen messaging platform"
    , note: "200 million messages in two months during COVID-19, so millions of South Africans could apply for the Social Relief of Distress grant."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  25. #0252020SHIP
    Generative survey programming for market research
    Executable survey programs from plain-English specs on GPT-2, then GPT-3, two years before ChatGPT.
    { id: "generative-survey-programming-market-research"
    , when: Year 2020
    , kind: Ship
    , title: "Generative survey programming for market research"
    , note: "Executable survey programs from plain-English specs on GPT-2, then GPT-3, two years before ChatGPT."
    , url: Nothing
    , video: Nothing
    , changes: [ Focus "generative AI, two years before ChatGPT" ]
    }
  26. #0242019-05-10BLOG
    REST(ful) in peace...
    Post "restful-in-peace"+

    We obviously all love REST - and it's become the standard least-surprising choice to make when building any type of service these days, be it monolithic, microservice, web, or whatever.

    { id: "restful-in-peace"
    , when: Day 2019 5 10
    , kind: Post
    , title: "REST(ful) in peace..."
    , note: "We obviously all love REST - and it's become the standard least-surprising choice to make when building any type of service these days, be it monolithic, microservice, web, or whatever."
    , url: (Just "/blog/restful-in-peace/")
    , video: Nothing
    , changes: [  ]
    }
    Read the blog post →
  27. #0232019-05TALK
    Streaming architecture, DEVconf
    Talk "talk-yVXpa-KhbaY"+
    { id: "talk-yVXpa-KhbaY"
    , when: Month 2019 5
    , kind: Talk
    , title: "Streaming architecture, DEVconf"
    , note: ""
    , url: (Just "https://www.youtube.com/watch?v=yVXpa-KhbaY")
    , video: (Just "yVXpa-KhbaY")
    , changes: [  ]
    }
  28. #0222019LIFE
    Expedition Africa, 380 km
    Adventure racing.
    { id: "expedition-africa-380-km"
    , when: Year 2019
    , kind: Life
    , title: "Expedition Africa, 380 km"
    , note: "Adventure racing."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  29. #0212019IDEA
    Coins “Temporal Programming”
    Extract value from an unbounded stream of events instead of querying data at rest.
    { id: "coins-temporal-programming"
    , when: Year 2019
    , kind: Idea
    , title: "Coins “Temporal Programming”"
    , note: "Extract value from an unbounded stream of events instead of querying data at rest."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  30. #0202019SHIP
    Banking super-app founding architecture
    Microservices and realtime streaming on AWS. Launched in 2020 and grew to 2M+ users and 20k+ merchants.
    { id: "banking-super-app-founding-architecture"
    , when: Year 2019
    , kind: Ship
    , title: "Banking super-app founding architecture"
    , note: "Microservices and realtime streaming on AWS. Launched in 2020 and grew to 2M+ users and 20k+ merchants."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  31. #0192018IDEA
    Coins “Inference Oriented Architecture”
    Build for producing predictions from live events, not only for training models.
    { id: "coins-inference-oriented-architecture"
    , when: Year 2018
    , kind: Idea
    , title: "Coins “Inference Oriented Architecture”"
    , note: "Build for producing predictions from live events, not only for training models."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  32. #0182018SHIP
    Global insurance wellness platform
    Kubernetes, Kafka and a multi-cloud estate across 11 data centres. Still in production.
    { id: "global-insurance-wellness-platform"
    , when: Year 2018
    , kind: Ship
    , title: "Global insurance wellness platform"
    , note: "Kubernetes, Kafka and a multi-cloud estate across 11 data centres. Still in production."
    , url: Nothing
    , video: Nothing
    , changes: [ Focus "event streams and realtime inference" ]
    }
  33. #0172017ROLE
    Synthesis is acquired by Araxi
    JSE-listed, then called Capital Appreciation. Leads Synthesis through the acquisition and its integration into the group.
    { id: "synthesis-is-acquired-by-araxi"
    , when: Year 2017
    , kind: Role
    , title: "Synthesis is acquired by Araxi"
    , note: "JSE-listed, then called Capital Appreciation. Leads Synthesis through the acquisition and its integration into the group."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  34. #0162016-10-17BLOG
    What I look for in a developer
    Post "what-i-look-for-in-a-developer"+

    I interview prospective developers for my company almost every week, and over time have developed a bit of a sixth sense for sussing out talent. Here are a couple of the hallmarks that I look out for during an interview.

    { id: "what-i-look-for-in-a-developer"
    , when: Day 2016 10 17
    , kind: Post
    , title: "What I look for in a developer"
    , note: "I interview prospective developers for my company almost every week, and over time have developed a bit of a sixth sense for sussing out talent. Here are a couple of the hallmarks that I look out for during an interview."
    , url: (Just "/blog/what-i-look-for-in-a-developer/")
    , video: Nothing
    , changes: [  ]
    }
    Read the blog post →
  35. #0152016-09-25BLOG
    Intro to Fluid Infrastructure
    Post "intro-to-fluid-infrastructure"+

    I gave a small talk to a couple of smart C-level people last week around my concept of Fluid Infrastructure.

    { id: "intro-to-fluid-infrastructure"
    , when: Day 2016 9 25
    , kind: Post
    , title: "Intro to Fluid Infrastructure"
    , note: "I gave a small talk to a couple of smart C-level people last week around my concept of Fluid Infrastructure."
    , url: (Just "/blog/intro-to-fluid-infrastructure/")
    , video: Nothing
    , changes: [  ]
    }
    Read the blog post →
  36. #0142015-12-03BLOG
    Practical functional programming
    Post "practical-functional-programming"+

    I *cringe* when I see this sort of code:

    { id: "practical-functional-programming"
    , when: Day 2015 12 3
    , kind: Post
    , title: "Practical functional programming"
    , note: "I *cringe* when I see this sort of code:"
    , url: (Just "/blog/practical-functional-programming/")
    , video: Nothing
    , changes: [  ]
    }
    Read the blog post →
  37. #0132015IDEA
    All in on containers
    Bets that the future runs on fleets of containers over Kubernetes. Writes operators and CRDs, and reads the Kubernetes source in Go.
    { id: "all-in-on-containers"
    , when: Year 2015
    , kind: Idea
    , title: "All in on containers"
    , note: "Bets that the future runs on fleets of containers over Kubernetes. Writes operators and CRDs, and reads the Kubernetes source in Go."
    , url: Nothing
    , video: Nothing
    , changes: [ Focus "containers, Kubernetes and public cloud", Learned "Go" ]
    }
  38. #0122015LIFE
    Ironman South Africa
    3.8 km swim, 180 km bike, 42.2 km run.
    { id: "ironman-south-africa"
    , when: Year 2015
    , kind: Life
    , title: "Ironman South Africa"
    , note: "3.8 km swim, 180 km bike, 42.2 km run."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  39. #0112014-06-09BLOG
    Code 101: Pass by reference
    Post "code-101-pass-by-reference"+

    This is part 1 of a multi-part post on programming fundamentals. This stuff may seem fairly pedestrian to some folks, but then it's probably not targetted at you.

    { id: "code-101-pass-by-reference"
    , when: Day 2014 6 9
    , kind: Post
    , title: "Code 101: Pass by reference"
    , note: "This is part 1 of a multi-part post on programming fundamentals. This stuff may seem fairly pedestrian to some folks, but then it's probably not targetted at you."
    , url: (Just "/blog/code-101-pass-by-reference/")
    , video: Nothing
    , changes: [  ]
    }
    Read the blog post →
  40. #0102014-05-30BLOG
    LiveScript <| Rocking your world.js
    Post "livescript-rocking-your-world"+

    I presented a TechSession(tm) to my development team last week which was meant to be about LiveScript. It turned out that in order to understand what the purpose of something like LiveScript is, you need to understand the beauty-warts of JavaScript (oxymoron intended).

    { id: "livescript-rocking-your-world"
    , when: Day 2014 5 30
    , kind: Post
    , title: "LiveScript <| Rocking your world.js"
    , note: "I presented a TechSession(tm) to my development team last week which was meant to be about LiveScript. It turned out that in order to understand what the purpose of something like LiveScript is, you need to understand the beauty-warts of JavaScript (oxymoron intended)."
    , url: (Just "/blog/livescript-rocking-your-world/")
    , video: Nothing
    , changes: [ Learned "LiveScript" ]
    }
    Read the blog post →
  41. #0092014-04-15BLOG
    A word on monads
    Post "a-word-on-monads"+

    A clever guy once said that once you understand what a monad is you lose the ability to explain what it is to other people - and he's (almost) right. Monads are a weird and wonderful thing, but sometimes are easiest to understand when given an example of one.

    { id: "a-word-on-monads"
    , when: Day 2014 4 15
    , kind: Post
    , title: "A word on monads"
    , note: "A clever guy once said that once you understand what a monad is you lose the ability to explain what it is to other people - and he's (almost) right. Monads are a weird and wonderful thing, but sometimes are easiest to understand when given an example of one."
    , url: (Just "/blog/a-word-on-monads/")
    , video: Nothing
    , changes: [ Learned "Haskell" ]
    }
    Read the blog post →
  42. #0082012IDEA
    F# reaches production
    Two production projects show that functional code bases stay far more stable than imperative ones.
    { id: "fsharp-reaches-production"
    , when: Year 2012
    , kind: Idea
    , title: "F# reaches production"
    , note: "Two production projects show that functional code bases stay far more stable than imperative ones."
    , url: Nothing
    , video: Nothing
    , changes: [ Focus "functional programming in production", Learned "F#" ]
    }
  43. #0072012IDEA
    Scala opens the door to functional programming
    Pattern matching, Option and a workable type system, on the JVM.
    { id: "scala-opens-the-door-to-functional-programming"
    , when: Year 2012
    , kind: Idea
    , title: "Scala opens the door to functional programming"
    , note: "Pattern matching, Option and a workable type system, on the JVM."
    , url: Nothing
    , video: Nothing
    , changes: [ Learned "Scala" ]
    }
  44. #0062012LIFE
    First Ironman: Ironman South Africa
    3.8 km swim, 180 km bike, 42.2 km run.
    { id: "first-ironman-ironman-south-africa"
    , when: Year 2012
    , kind: Life
    , title: "First Ironman: Ironman South Africa"
    , note: "3.8 km swim, 180 km bike, 42.2 km run."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  45. #0052010IDEA
    JavaScript becomes the scripting language of choice
    Node, promises and async, written in a functional style.
    { id: "javascript-becomes-the-scripting-language-of-choice"
    , when: Year 2010
    , kind: Idea
    , title: "JavaScript becomes the scripting language of choice"
    , note: "Node, promises and async, written in a functional style."
    , url: Nothing
    , video: Nothing
    , changes: [ Learned "JavaScript" ]
    }
  46. #0042006IDEA
    Java joins the toolkit
    { id: "java-joins-the-toolkit"
    , when: Year 2006
    , kind: Idea
    , title: "Java joins the toolkit"
    , note: ""
    , url: Nothing
    , video: Nothing
    , changes: [ Learned "Java" ]
    }
  47. #0032005ROLE
    Joins Synthesis Software Technologies
    Five people at the start.
    { id: "co-founds-synthesis-software-technologies"
    , when: Year 2005
    , kind: Role
    , title: "Joins Synthesis Software Technologies"
    , note: "Five people at the start."
    , url: Nothing
    , video: Nothing
    , changes: [ SetRoles [ { label: "Co-founder & Technology Executive (CTO), Synthesis", story: "co-founder and technology executive (CTO) of Synthesis" } ], Focus "building software for banks", RetiredLanguage "Turbo Pascal", RetiredLanguage "Perl", Learned "C#", Learned "Python" ]
    }
  48. #0022001ROLE
    Senior Software Developer, African Defence Systems
    Military-grade fire-control and naval simulation software, built under MIL-STD-498.
    { id: "senior-software-developer-african-defence-systems"
    , when: Year 2001
    , kind: Role
    , title: "Senior Software Developer, African Defence Systems"
    , note: "Military-grade fire-control and naval simulation software, built under MIL-STD-498."
    , url: Nothing
    , video: Nothing
    , changes: [ SetRoles [ { label: "Senior Software Developer, ADS", story: "a senior software developer at African Defence Systems" } ], Focus "fire-control and naval simulation" ]
    }
  49. #0012000LIFE
    BSc Honours, Information Systems
    Rhodes University. Double major in Computer Science and Information Systems.
    { id: "bsc-honours-information-systems"
    , when: Year 2000
    , kind: Life
    , title: "BSc Honours, Information Systems"
    , note: "Rhodes University. Double major in Computer Science and Information Systems."
    , url: Nothing
    , video: Nothing
    , changes: [ SetRoles [ { label: "Graduate, Rhodes University", story: "an honours graduate from Rhodes University" } ], Focus "computer science and information systems", Base "Johannesburg, South Africa", Learned "C", Learned "C++", Learned "Turbo Pascal", Learned "Perl" ]
    }
SEC.02

Blueprints

Thesis 01 · Effect systems · 2026

Agents are architecturally blind

As agents write more of the code, the layers we design erode quietly: a database call here, an HTTP request there. Put side effects into the types, and the compiler enforces the architecture for agents and people alike, for the whole life of the project.

Illustrative code
-- The signature is the architecture.
summarise :: (LLM :> es, Docs :> es)
          => DocId -> Eff es Summary

-- An agent that slips an outbound HTTP call in here
-- gets a type error, not a review comment weeks later.
Thesis 02 · Agents as users · kyyn

Your next user is an agent

Most software is still designed for a person at a screen. More and more, the one calling it is an agent. kyyn is built for agents only, with nothing for a person to click: it exists to make the work agents do more efficient, more reliable and repeatable. Design for that user first.

Illustrative code
-- Who the software is for
data User = Human | Agent

-- kyyn
audience :: Array User
audience = [ Agent ]
Thesis 03 · Free arrows · haskell-agentic

See the workflow before it spends a token

An agentic workflow should be a value you can inspect before it runs: draw it, count its model calls, check where a person signs off, then run it. The same value is drawn, measured and printed by three separate interpreters.

extractEFFECT · LLM
riskScanEFFECT · LLM
clauseCheckEFFECT · LLM
judgeEFFECT · JUDGE
signOffEFFECT · HUMAN
5Steps
4Model calls
4Deep (longest path)
1Human sign-offs
Workflow notation · generated from the model
extract >>> (riskScan &&& clauseCheck) >>> judge >>> signOff
Thesis 04 · Temporal programming · 2019

Your business is a log, not a table

Most systems query data at rest. The interesting ones fold a continuous, unbounded stream of events into answers.

Illustrative code
state :: Month -> Tom
state t = foldl apply origin (takeWhile (before t) log)
SEC.03

Parts list

P/NBS-86/DECKbattlestationRustA tiled desktop built for running agents in parallel: the Deck for human attention, the Switchboard for agent-to-agent hand-off.
{ number: "BS-86/DECK"
, name: "battlestation"
, langs: ["Rust"]
, description: "A tiled desktop built for running agents in parallel: the Deck for human attention, the Switchboard for agent-to-agent hand-off."
, url: "https://github.com/drshade/battlestation"
}
Open ↗
P/NKYN-00/ORCLkyynRust · HaskellThe executable knowledge-base runtime behind agentic workflows running in production at Synthesis.
{ number: "KYN-00/ORCL"
, name: "kyyn"
, langs: ["Rust","Haskell"]
, description: "The executable knowledge-base runtime behind agentic workflows running in production at Synthesis."
, url: "https://kyyn.io"
}
Open ↗
P/NAG-λ/003agenticHaskellTyped, composable agentic workflows. A flow is a value you can inspect and draw before spending a token. On Hackage.
{ number: "AG-λ/003"
, name: "agentic"
, langs: ["Haskell"]
, description: "Typed, composable agentic workflows. A flow is a value you can inspect and draw before spending a token. On Hackage."
, url: "https://github.com/drshade/haskell-agentic"
}
Open ↗
P/NMCP-42/IOmcp-serverHaskellBuild Model Context Protocol servers from plain data types; schemas, decoding and the wire protocol are derived. On Hackage.
{ number: "MCP-42/IO"
, name: "mcp-server"
, langs: ["Haskell"]
, description: "Build Model Context Protocol servers from plain data types; schemas, decoding and the wire protocol are derived. On Hackage."
, url: "https://github.com/drshade/haskell-mcp-server"
}
Open ↗
P/NLNG-256/BABELlinguistRustGitHub’s Linguist for Rust: language detection by filename, extension, modelines and content heuristics.
{ number: "LNG-256/BABEL"
, name: "linguist"
, langs: ["Rust"]
, description: "GitHub’s Linguist for Rust: language detection by filename, extension, modelines and content heuristics."
, url: "https://github.com/drshade/linguist"
}
Open ↗