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.
-- Rendered values use Site.Model.Event and Change.
stateAt t = foldl apply origin <<< through t
#0692026-10-15BLOG
Build worlds worth visiting
Post "build-worlds-worth-visiting"+
My colleague (and the brilliant) LB shared Ben James's article on aliveness with me - which is excellent and well worth a read - and his point about deliberately choosing to create things together got me thinking about what's happening in the software world right now.
{ id: "build-worlds-worth-visiting"
, when: Day 2026 10 15
, kind: Post
, title: "Build worlds worth visiting"
, note: "My colleague (and the brilliant) LB shared Ben James's article on aliveness with me - which is excellent and well worth a read - and his point about deliberately choosing to create things together got me thinking about what's happening in the software world right now."
, url: (Just "/blog/build-worlds-worth-visiting/")
, video: Nothing
, changes: [ ]
}
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: [ ]
}
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: [ ]
}
#0662026IDEA
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: [ ]
}
#0652025-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" ]
}
#0642025-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: [ ]
}
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: [ ]
}
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: [ ]
}
#0612024-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: [ ]
}
#0602024-04-30BLOG
Future of Commerce
Post "future-of-commerce"+
The future of payments is inextricably linked to the future of commerce, recognizing that no matter how critical the payments industry might be, it fundamentally exists to facilitate the flow of value between parties engaged in commercial activity. The payments industry exists solely to serve commerce; people buying stuff from people selling stuff. The impact of AI on commerce are undeniable, and its a simple exercise to look at our own experiences to see how this may play out. Taking myself to the shops to buy groceries is necessary because there are a bunch of human decisions that need to be made during this process. What do I want to eat? What am I allergic to? What are my health goals? What do my children eat? When is the right time to try out something new? Its super complicated and there is no heuristic system capable of doing this for me, and so between my wife and I we need to solve this problem on a daily basis using our innate human decision making skills. As a result, we invest a significant portion of our valuable time in this task. While some may find the act of shopping, cooking, and experimenting with food exciting, for most of the world, it remains a chore that's difficult to outsource without significant compromises in terms of money, health, or time.
{ id: "future-of-commerce"
, when: Day 2024 4 30
, kind: Post
, title: "Future of Commerce"
, note: "The future of payments is inextricably linked to the future of commerce, recognizing that no matter how critical the payments industry might be, it fundamentally exists to facilitate the flow of value between parties engaged in commercial activity. The payments industry exists solely to serve commerce; people buying stuff from people selling stuff. The impact of AI on commerce are undeniable, and its a simple exercise to look at our own experiences to see how this may play out. Taking myself to the shops to buy groceries is necessary because there are a bunch of human decisions that need to be made during this process. What do I want to eat? What am I allergic to? What are my health goals? What do my children eat? When is the right time to try out something new? Its super complicated and there is no heuristic system capable of doing this for me, and so between my wife and I we need to solve this problem on a daily basis using our innate human decision making skills. As a result, we invest a significant portion of our valuable time in this task. While some may find the act of shopping, cooking, and experimenting with food exciting, for most of the world, it remains a chore that's difficult to outsource without significant compromises in terms of money, health, or time."
, url: (Just "/blog/future-of-commerce/")
, video: Nothing
, changes: [ ]
}
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: [ ]
}
#0582024SHIP
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" ]
}
#0572023-10-27BLOG
Distributed FRP: taking the pattern to the backend
Post "distributed-frp"+
The Functional Reactive Programming pattern gained popularity through a tiny little web language called Elm; and because it was so good it was quickly copied and integrated into more popular frameworks such as React & Angular through libraries such as RxJS, Flux and Redux. Its probably safe to say that you're using one of these technologies right now, they are so pervasive.
{ id: "distributed-frp"
, when: Day 2023 10 27
, kind: Post
, title: "Distributed FRP: taking the pattern to the backend"
, note: "The Functional Reactive Programming pattern gained popularity through a tiny little web language called Elm; and because it was so good it was quickly copied and integrated into more popular frameworks such as React & Angular through libraries such as RxJS, Flux and Redux. Its probably safe to say that you're using one of these technologies right now, they are so pervasive."
, url: (Just "/blog/distributed-frp/")
, video: Nothing
, changes: [ ]
}
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: [ ]
}
#0552023-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: [ ]
}
I had the priviledge of attending some cool talks on GPT-3 at the Startup Village in Amsterdam last week. I won't name-and-shame but there were three speakers who gave their personal take on the opportunities and challenges posed by this technology and while some of the discussions were very technical, their bottom line was that GPT-3 is just a fancy word generator—not necessarily any more disruptive than predictive-text software.
{ id: "so-long-and-thanks-for-all-the-tokens"
, when: Day 2023 3 15
, kind: Post
, title: "So Long And Thanks For All The Tokens"
, note: "I had the priviledge of attending some cool talks on GPT-3 at the Startup Village in Amsterdam last week. I won't name-and-shame but there were three speakers who gave their personal take on the opportunities and challenges posed by this technology and while some of the discussions were very technical, their bottom line was that GPT-3 is just a fancy word generator—not necessarily any more disruptive than predictive-text software."
, url: (Just "/blog/so-long-and-thanks-for-all-the-tokens/")
, video: Nothing
, changes: [ ]
}
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: [ ]
}
#0502022-11SHIP
Slap.cat
Peer-to-peer payments MVP accepting card payments and paying out to individuals, built with React and Rust. Commercial modelling led to a pivot towards bank partnerships.
{ id: "slap-cat"
, when: Month 2022 11
, kind: Ship
, title: "Slap.cat"
, note: "Peer-to-peer payments MVP accepting card payments and paying out to individuals, built with React and Rust. Commercial modelling led to a pivot towards bank partnerships."
, url: Nothing
, video: Nothing
, changes: [ ]
}
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: [ ]
}
#0472022-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: [ ]
}
Research into internet collectables on NEAR, with prototype Rust smart contracts and a PureScript front-end. Explored zero-knowledge proofs for collection links; later used to distribute Labs newsletter covers.
{ id: "unlockables"
, when: Month 2022 3
, kind: Idea
, title: "Unlockables"
, note: "Research into internet collectables on NEAR, with prototype Rust smart contracts and a PureScript front-end. Explored zero-knowledge proofs for collection links; later used to distribute Labs newsletter covers."
, url: Nothing
, video: Nothing
, changes: [ ]
}
#0452022-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: [ ]
}
#0442022SHIP
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: [ ]
}
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: [ ]
}
{ 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" ]
}
#0392021ROLE
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" } ]
}
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: [ ]
}
#0352020SHIP
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" ]
}
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: [ ]
}
#0332020SHIP
The Kraken
A WebRTC platformer for remote collaboration, built with Tjaard to make online meetings more playful.
{ id: "the-kraken"
, when: Year 2020
, kind: Ship
, title: "The Kraken"
, note: "A WebRTC platformer for remote collaboration, built with Tjaard to make online meetings more playful."
, url: Nothing
, video: Nothing
, changes: [ ]
}
#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: [ ]
}
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: [ ]
}
#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: [ ]
}
#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: [ ]
}
#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: [ ]
}
#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" ]
}
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: [ ]
}
#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: [ ]
}
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: [ ]
}
{ 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: [ ]
}
{ 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: [ ]
}
#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" ]
}
#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: [ ]
}
#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: [ ]
}
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" ]
}
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" ]
}
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" ]
}
#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" ]
}
#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#" ]
}
#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" ]
}
#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: [ ]
}
#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: [ ]
}
#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: [ ]
}
#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: [ ]
}
#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" ]
}
#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" ]
}
#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.
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.
factsCustomer #27 { contact = Email }
Order #104
customer = #27
items = [{ subtotal = 80 }]
total = 80
paid = 80
refunded = 0
status = ShippedShipment #63
order = #104
dispatchedAt = 24Sep
deliveredAt = Nothingtools
trackParcel :: OrderId -> Tracking
notify :: CustomerId -> Message -> Receipt
refund :: OrderId -> Amount -> Receiptvalidate knowledge
every Order.customer references Customer
every Shipment.order references Order
for each Order
total == sum (items.map subtotal)
0 <= refunded <= paid
when status == Shipped
exists Shipmentwhere order == id
when status == Delivered
exists Shipmentwhere order == id
and deliveredAt >= dispatchedAt
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.
orders = fold apply events
apply (OrderPlaced id items) =
insert id { items, status = Open }
apply (OrderPacked id) =
update id { status = Packed }
apply (OrderDelivered id) =
update id { status = Delivered }