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
#0632026-10-28BLOG
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 28
, 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: [ ]
}
#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: [ ]
}
#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" ]
}
#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: [ ]
}
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: [ ]
}
#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: [ ]
}
#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: [ ]
}
#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" ]
}
#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: [ ]
}
#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: [ ]
}
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: [ ]
}
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: [ ]
}
#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: [ ]
}
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: [ ]
}
#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: [ ]
}
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" ]
}
#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" } ]
}
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: [ ]
}
#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" ]
}
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: [ ]
}
#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 }