Richard Dalton

I build things and write about programming.

Freelance developer and trainer with a passion for programming, language design, and software craftsmanship. Founder of devjoy. Because if you're not enjoying software development, you're not doing it right.

Richard Dalton

Projects

Settled

Cryptographic audit logging for regulated industries

Every record is sequentially chained and anchored to a published Merkle root. Any modification, insertion, or deletion is independently detectable — without trusting the server.

Tamper-evident chain

Each entry's hash incorporates the previous, so modifying any record breaks every hash that follows.

Merkle-anchored snapshots

Periodic snapshot roots are published externally. Any inclusion can be proven in O(log n) without re-reading the full log.

Independent verification

Auditors verify proofs using only the public snapshot root — no server access, no trust required.

PathWrite

Framework-agnostic multi-step flow engine

A headless, framework-agnostic path engine for multi-step flows. Define your steps, guards, and validation as pure TypeScript. Render them in React, Vue, Angular, Svelte, SolidJS, or React Native.

Pure TypeScript logic

Define steps, guards, and validation as plain TypeScript — no DSL, no framework coupling.

Render anywhere

Works with React, Vue, Angular, Svelte, SolidJS, and React Native using the same engine.

Headless by design

Flow logic is completely decoupled from UI. Swap renderers without touching your business rules.

AuthWrite

Zero-dependency TypeScript authorization

A zero-dependency TypeScript authorization library. Define policies as plain TypeScript objects and evaluate them anywhere. Runs in Node, edge, or browser.

Zero dependencies

No bloat, no lockfile surprises. Pure TypeScript you can audit in minutes.

Runs anywhere

Evaluate policies in Node, edge runtimes, or the browser — identical behaviour across all targets.

Plain object policies

Authorization rules are ordinary TypeScript objects. No DSL, no magic, no runtime surprises.

RuleWrite

Composable business rules for TypeScript

A composable business rules library for TypeScript, inspired by the Specification Pattern. Define rules once, combine them freely, and evaluate and explain their outcomes anywhere in your application.

Specification Pattern

Compose fine-grained rules into complex conditions using and, or, and not combinators.

Define once, use everywhere

Write a rule once and combine it freely across your entire application without duplication.

Self-explaining outcomes

Rules describe why they passed or failed — useful for debugging and generating user-facing messages.

Series

F# Active Patterns

Active Patterns are one of the killer features of F#. They can be a little confusing at first. This series of posts will help you to master them.

Thinking Functionally

I wrote these posts while first learning about functional programming. The posts are simple to follow because I didn't know enough to make them complicated.

Meet The Team

Richard Dalton

Richard Dalton

Experienced Software Developer, Trainer and Mentor including three years as a bootcamp instructor. Responsible for content creation, delivering online and in-person training, bespoke software development and consulting.

Sandra O'Callaghan

Sandra O'Callaghan

A software development background that led naturally into bookkeeping and finance. Manages all of Devjoy’s finances and operations, and specialises in identifying and automating manual processes in finance. She brings a developer’s eye to a domain that still runs on too many spreadsheets.

Testimonials