TOMWELLS.ORG
State at 2026-10-27

2026

OCT

Tom is co-founder and technology executive (CTO) of Synthesis and Chief Disruption Officer at Araxi. Focused on type and 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: "type and 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-b6d8f9faa5a42c3d.webp" })
, shipped: 16
, posts: 12
, talks: 13
}
SEC.01

Event log

-- Rendered values use Site.Model.Event and Change.
stateAt t = foldl apply origin <<< through t
  1. #0622026-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. #0612026-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: [  ]
    }
  3. #0602026IDEA
    Agentic knowledge bases for repeatability
    With kyyn, executable knowledge bases give agents reusable knowledge and workflows, making their work more reliable and repeatable.
    { id: "agentic-knowledge-bases-for-repeatability"
    , when: Year 2026
    , kind: Idea
    , title: "Agentic knowledge bases for repeatability"
    , note: "With kyyn, executable knowledge bases give agents reusable knowledge and workflows, making their work more reliable and repeatable."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  4. #0592025-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: [ Focus "type and effect systems that keep agents inside the architecture" ]
    }
  5. #0582025-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 →
  6. #0572025-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 →
  7. #0562025SHIP
    ~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: [  ]
    }
  8. #0552024-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: [  ]
    }
  9. #0542024IDEA
    Free arrows and agentic workflows
    With haskell-agentic, workflows become typed, composable values: inspect their structure, draw them and count model calls before running them. Free arrows let the same workflow support multiple interpreters.
    { id: "free-arrows-and-agentic-workflows"
    , when: Year 2024
    , kind: Idea
    , title: "Free arrows and agentic workflows"
    , note: "With haskell-agentic, workflows become typed, composable values: inspect their structure, draw them and count model calls before running them. Free arrows let the same workflow support multiple interpreters."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  10. #0532024SHIP
    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: [ Focus "SDLC and agentic engineering at organisational scale" ]
    }
  11. #0522023-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: [  ]
    }
  12. #0512023-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: [  ]
    }
  13. #0502023-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: [  ]
    }
  14. #0492023-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 "AI developer tooling" ]
    }
  15. #0482023SHIP
    Vehicle telemetry and emergency-response platform
    Lead architect from pre-sales through delivery of a streaming ML platform for 1.6 million vehicles. MQTT, Kafka and Flink classify panic events with sub-second response to the call centre, backed by weekly retraining and champion/challenger model evaluation.
    { id: "vehicle-telemetry-emergency-response-platform"
    , when: Year 2023
    , kind: Ship
    , title: "Vehicle telemetry and emergency-response platform"
    , note: "Lead architect from pre-sales through delivery of a streaming ML platform for 1.6 million vehicles. MQTT, Kafka and Flink classify panic events with sub-second response to the call centre, backed by weekly retraining and champion/challenger model evaluation."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  16. #0472022-10-23LIFE
    Ironman 70.3 Vouliagmeni, Greece
    { id: "ironman-70-3-vouliagmeni-greece-2022"
    , when: Day 2022 10 23
    , kind: Life
    , title: "Ironman 70.3 Vouliagmeni, Greece"
    , note: ""
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  17. #0462022-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: [  ]
    }
  18. #0452022-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 →
  19. #0442022-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: [  ]
    }
  20. #0432022SHIP
    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: [  ]
    }
  21. #0422021-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" ]
    }
  22. #0412021-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: [  ]
    }
  23. #0402021-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 →
  24. #0392021ROLE
    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" ]
    }
  25. #0382021ROLE
    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" } ]
    }
  26. #0372020-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" ]
    }
  27. #0362020-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: [  ]
    }
  28. #0352020SHIP
    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: [  ]
    }
  29. #0342020SHIP
    Generative survey programming for market research
    Executable survey programs from plain-English specs on GPT-2, then GPT-3.
    { 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."
    , url: Nothing
    , video: Nothing
    , changes: [ Focus "generative AI and use-cases", Learned "Rust" ]
    }
  30. #0332020SHIP
    HALOdot: L2-certified tap-on-phone payments kernel
    Advised on product formation as part of a deliberate investment in building a payments product, with a smaller technical and architectural contribution. Now a standalone business.
    { id: "l2-certified-tap-on-phone-payments-kernel"
    , when: Year 2020
    , kind: Ship
    , title: "HALOdot: L2-certified tap-on-phone payments kernel"
    , note: "Advised on product formation as part of a deliberate investment in building a payments product, with a smaller technical and architectural contribution. Now a standalone business."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  31. #0322019-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 →
  32. #0312019-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: [  ]
    }
  33. #0302019LIFE
    Expedition Africa, 380 km
    Five days of self-supported adventure racing on Rodrigues Island, Mauritius.
    { id: "expedition-africa-380-km"
    , when: Year 2019
    , kind: Life
    , title: "Expedition Africa, 380 km"
    , note: "Five days of self-supported adventure racing on Rodrigues Island, Mauritius."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  34. #0292019IDEA
    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: "Temporal Programming"
    , note: "Extract value from an unbounded stream of events instead of querying data at rest."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  35. #0282019SHIP
    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: [  ]
    }
  36. #0272018IDEA
    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: "Inference Oriented Architecture"
    , note: "Build for producing predictions from live events, not only for training models."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  37. #0262018SHIP
    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" ]
    }
  38. #0252017-01-29LIFE
    Ironman 70.3 South Africa
    { id: "ironman-70-3-south-africa-2017"
    , when: Day 2017 1 29
    , kind: Life
    , title: "Ironman 70.3 South Africa"
    , note: ""
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  39. #0242017ROLE
    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: [  ]
    }
  40. #0232016-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 →
  41. #0222016-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 →
  42. #0212015-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 →
  43. #0202015-03-29LIFE
    Ironman South Africa
    3.8 km swim, 180 km bike, 42.2 km run.
    { id: "ironman-south-africa"
    , when: Day 2015 3 29
    , kind: Life
    , title: "Ironman South Africa"
    , note: "3.8 km swim, 180 km bike, 42.2 km run."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  44. #0192015IDEA
    Kubernetes operators and infrastructure
    Builds Kubernetes operators and CRDs, working with the Kubernetes source in Go.
    { id: "all-in-on-containers"
    , when: Year 2015
    , kind: Idea
    , title: "Kubernetes operators and infrastructure"
    , note: "Builds Kubernetes operators and CRDs, working with the Kubernetes source in Go."
    , url: Nothing
    , video: Nothing
    , changes: [ Focus "containers, Kubernetes and public cloud", Learned "Go" ]
    }
  45. #0182015SHIP
    Agricultural lender internet banking
    Architect and lead developer in a team of five, building the next generation of an agricultural lender’s internet-banking platform.
    { id: "agricultural-lender-internet-banking"
    , when: Year 2015
    , kind: Ship
    , title: "Agricultural lender internet banking"
    , note: "Architect and lead developer in a team of five, building the next generation of an agricultural lender’s internet-banking platform."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  46. #0172014-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 →
  47. #0162014-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 →
  48. #0152014-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 →
  49. #0142013-01-20LIFE
    Ironman 70.3 South Africa
    { id: "ironman-70-3-south-africa-2013"
    , when: Day 2013 1 20
    , kind: Life
    , title: "Ironman 70.3 South Africa"
    , note: ""
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  50. #0132012-04-22LIFE
    Ironman South Africa
    3.8 km swim, 180 km bike, 42.2 km run.
    { id: "first-ironman-ironman-south-africa"
    , when: Day 2012 4 22
    , kind: Life
    , title: "Ironman South Africa"
    , note: "3.8 km swim, 180 km bike, 42.2 km run."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  51. #0122012-01-22LIFE
    Ironman 70.3 South Africa
    { id: "ironman-70-3-south-africa-2012"
    , when: Day 2012 1 22
    , kind: Life
    , title: "Ironman 70.3 South Africa"
    , note: ""
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  52. #0112012IDEA
    F# in 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# in 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" ]
    }
  53. #0102012IDEA
    Functional programming with Scala
    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: "Functional programming with Scala"
    , note: "Pattern matching, Option and a workable type system, on the JVM."
    , url: Nothing
    , video: Nothing
    , changes: [ Learned "Scala" ]
    }
  54. #0092011SHIP
    Card issuer EMV scripting on HSMs
    Architect and lead developer in a team of two, building an EMV issuer scripting engine in F# on Thales nShield hardware security modules.
    { id: "card-issuer-emv-scripting"
    , when: Year 2011
    , kind: Ship
    , title: "Card issuer EMV scripting on HSMs"
    , note: "Architect and lead developer in a team of two, building an EMV issuer scripting engine in F# on Thales nShield hardware security modules."
    , url: Nothing
    , video: Nothing
    , changes: [ Learned "F#" ]
    }
  55. #0082010IDEA
    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" ]
    }
  56. #0072010SHIP
    Online banking, Mauritius
    Architect and lead developer in a team of five. Took a fully transactional, multi-currency online-banking platform from first line of code to its first live client in six months.
    { id: "mauritius-online-banking"
    , when: Year 2010
    , kind: Ship
    , title: "Online banking, Mauritius"
    , note: "Architect and lead developer in a team of five. Took a fully transactional, multi-currency online-banking platform from first line of code to its first live client in six months."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  57. #0062008SHIP
    Zero Knowledge of PIN, retail banking
    Architect and lead developer in a team of three. Became a product that secured every internet-banking customer login at a major retail bank for 14 years, until decommissioning in 2022.
    { id: "zero-knowledge-pin-retail-banking"
    , when: Year 2008
    , kind: Ship
    , title: "Zero Knowledge of PIN, retail banking"
    , note: "Architect and lead developer in a team of three. Became a product that secured every internet-banking customer login at a major retail bank for 14 years, until decommissioning in 2022."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  58. #0052006SHIP
    Single sign-on across international banking platforms
    Apache httpd and IIS/ISAPI plugins validated cookies against central authentication servers, passing identity and access rights to applications through HTTP headers. Deployed across a major bank’s international platforms for seamless customer sign-on. Productised and still running today in evolved and modern form.
    { id: "web-server-single-sign-on-platform"
    , when: Year 2006
    , kind: Ship
    , title: "Single sign-on across international banking platforms"
    , note: "Apache httpd and IIS/ISAPI plugins validated cookies against central authentication servers, passing identity and access rights to applications through HTTP headers. Deployed across a major bank’s international platforms for seamless customer sign-on. Productised and still running today in evolved and modern form."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  59. #0042005SHIP
    International fax routing over the internet
    Built for a large telecoms provider. Connected fax servers worldwide over the internet, relaying fax data to the destination country before making a local phone call for final delivery, avoiding international telephone charges.
    { id: "international-fax-least-cost-routing"
    , when: Year 2005
    , kind: Ship
    , title: "International fax routing over the internet"
    , note: "Built for a large telecoms provider. Connected fax servers worldwide over the internet, relaying fax data to the destination country before making a local phone call for final delivery, avoiding international telephone charges."
    , url: Nothing
    , video: Nothing
    , changes: [  ]
    }
  60. #0032004-11ROLE
    Joins Synthesis Software Technologies
    Five people at the start.
    { id: "co-founds-synthesis-software-technologies"
    , when: Month 2004 11
    , 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" ]
    }
  61. #0022001ROLE
    Senior Software Developer, African Defence Systems
    Military-grade fire-control and naval simulation software, built under MIL-STD-498. Primarily C, alongside C++ and Java.
    { 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. Primarily C, alongside C++ and Java."
    , 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" ]
    }
  62. #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 "Java", 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

Enable agents to build clearer architectures

Types give agents a map of the architecture. Compiler feedback guides composition within it. Explore how haskell-agentic makes that structure explicit through typed, composable workflows.

extractContract → EvidenceEFFECT · LLM
riskScanEvidence → RisksEFFECT · LLM
clauseCheckEvidence → ClausesEFFECT · LLM

Extraction produces Evidence. Both analyses accept it. Types and declared effects show the agent what each operation offers.

Workflow notation · generated from the model
extract     :: Contract → Evidence
riskScan    :: Evidence → Risks
clauseCheck :: Evidence → Clauses
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.

Event stream / Order #0428 events
4 / 8
materialised views
Order
€36
Notebooks
2
Status
Open
orderAt 3
{
  items: 2,
  status: "Open"
}
Payments
€18 paid
Outstanding
€18
Transactions
1
paymentsAt 3
{
  due: 36,
  received: 18,
  transactions: 1
}
Warehouse
10 available
On hand
12
Reserved
2
Status
Reserved
warehouseAt 3
{
  reserved: 2,
  status: "Reserved",
  stock: 12
}
Courier
Awaiting parcel
Parcels
0
Tracking
—
courierAt 3
{
  parcels: 0,
  status: "Awaiting parcel",
  tracking: "—"
}
SEC.03

Parts list

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 execution. 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 execution. 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 ↗
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 ↗