Curriculum Vitae
of Rich Folsom of London (the “Subject”)
Recitals
- The Subject is part technology lawyer and part legal technologist, building technology to improve legal services and providing legal services for technology, data and regulated environments.
- This instrument is a record, not a solicitation. It is not an application for employment and should not be read as one.
Definitions
- “Subject” means Rich Folsom, admitted as a solicitor of the Senior Courts of England and Wales in 2010;
- “Products” means the software applications listed in Schedule 1, further details of which appear at fo.ls/shipping.
Professional engagements
- Since 2024, the Subject has been Partner of Simmons & Simmons LLP. Advises on data in the era of artificial intelligence: data licensing, rights in the training of AI models, and the commercial and regulatory architecture in which data and compute are combined.
- Conceived and delivered STRIDE, a digital regulation tracker published by the firm and relied on by in-house legal teams across jurisdictions. (simmons-simmons.com)
- From 2021 to 2024, the Subject was Partner of Deloitte LLP. A commercial technology partner in Deloitte Legal, advising data-intensive businesses on cloud computing, big data and artificial intelligence, and on managing the risks that accompany them.
- Led the firm's responses to major government consultations on technology policy, including the Law Commission's digital assets consultation. (justice.gov.uk)
- Hired, trained and led a team of lawyers practising in these sectors.
- Product owner of the software-as-a-service tools that complement the legal practice, including data-rights management and open-source permissioning.
- From 2010 to 2021, the Subject was Associate, later Partner of Kemp Little LLP. Practised as a solicitor, latterly a partner, in the commercial technology department of a technology boutique, advising on the purchase and sale of software, data and services, particularly for new technologies and regulated environments.
- Helped develop the practice to a 'Band 1' ranking for technology law.
- Conceived, launched and operated Four Corners Intelligence, a product for organising, categorising and analysing contract portfolios, recognised at the FT Innovative Lawyers Awards and continued within Deloitte. (archive.org)
- From 2017 to 2021, the Subject was Founder & CEO of Kemp Little Technology Limited. The company through which the firm's legal-technology products were developed and operated; sold to Deloitte together with Kemp Little LLP.
- From 2008 to 2010, the Subject was Trainee Solicitor of Field Fisher Waterhouse LLP. Completed a training contract and was admitted as a solicitor of the Senior Courts of England and Wales in 2010.
- Since 2024, the Subject has been Partner of Simmons & Simmons LLP. Advises on data in the era of artificial intelligence: data licensing, rights in the training of AI models, and the commercial and regulatory architecture in which data and compute are combined.
Education
- The Subject holds an MA in Natural Sciences from Queens' College, University of Cambridge (2002 to 2005), classified II.i.
- The Subject holds an LLB in Law from Nottingham Law School (2005 to 2007), classified Commendation.
Appointments
- Since 2025, the Subject has been Visiting Professor, The City Law School, City St George's, University of London.
- Since 2026, the Subject has been Member, LegalTech Board, Society for Computers and Law.
Awards
- The Subject won the “Innovation in the business of law: Technology” award at the FT Innovative Lawyers Awards 2019, for Four Corners Intelligence.
Expertise
- The Subject's areas of expertise are: Technology law; Legal technology; Data licensing; AI regulation; Contract automation; Open data.
Interests
- The Subject has run, cycled and skied since 1987, and lifted weights since 1997; played water polo and rugby from 1995 to 2015; and, in years reported to have been more fun, taught skiing.
Products
- The Subject conceived, built and shipped the Products listed in Schedule 1.
- The Products are offered as evidence of the claims above. Each may be inspected at the address given in Schedule 1, or at fo.ls/shipping.
Precedence
- This Curriculum Vitae is also published as a traditional summary, as its typed source, and in machine-readable forms. If the forms differ, the traditional summary prevails; this instrument and the other forms defer to it.
Notices
- Notices to the Subject may be sent to rich@fo.ls.
- The Subject also maintains profiles at twitter.com/prisonblues, github.com/prisonblues and www.linkedin.com/in/richfolsom.
Schedule 1 — The Products
- STRIDE — A tracker of draft and enacted digital regulation across jurisdictions in real time, covering artificial intelligence, data, platforms, cyber and crypto. stride.simmons-simmons.com
- Four Corners Intelligence — A product for organising, categorising and analysing contract portfolios, winner at the FT Innovative Lawyers Awards 2019; originated at Kemp Little and continued within Deloitte. web.archive.org/web/20191206031301/kl-legal.tech/4corners
- AI Collider — A visual diagnostic tool for comparing positions on artificial intelligence, each mapped across 72 dimensions and rendered as colour-coded grids. aicollider.org
- AI Contract.ing — The Society for Computers and Law's template contractual clauses for the EU AI Act, published in filterable and reusable form. aicontract.ing
Personal and family projects are omitted from this Schedule; the traditional summary and fo.ls/shipping list everything.
This instrument was compiled from source, type-checked and executed on the date of its last build.
Signed by
Rich Folsom
Solicitor of the Senior Courts of England and Wales
Last built the 8th day of August 2026
The source of this instrument is signed with the ssh-ed25519 key SHA256:fOFFWjg8DJLjDwQ65hnbbHjWkoSAySHGGnteJuZsHG4 (signature)
Rich Folsom
Part technology lawyer, part legal technologist. I build technology to improve legal services, and provide legal services for technology, data and regulated environments.
rich@fo.ls · fo.ls · London
The definitive form of this CV. A lawyer's version, a technologist's version, and machine-oriented versions (JSON, Markdown) are also available; each defers to this summary if they differ.
Experience
Partner, Simmons & Simmons LLP 2024–present
Data in the AI era: data licensing, AI training rights, and the commercial and regulatory plumbing where data meets compute.
- Built and shipped STRIDE, the firm's real-time digital regulation tracker — in-house teams use it instead of a quarterly PDF round-up. (simmons-simmons.com)
Partner, Deloitte LLP 2021–2024
Commercial technology partner in Deloitte Legal — cloud, big data and AI advice for businesses whose product is mostly data.
- Led Deloitte's responses to major tech-policy consultations, including the Law Commission's digital assets paper. (justice.gov.uk)
- Hired, trained and ran a team of lawyers in these sectors.
- Product-owned the practice's SaaS tools: data-rights management and open-source permissioning.
Associate, later Partner, Kemp Little LLP 2010–2021
Helping clients buy and sell software, data and services at a tech boutique — mostly new tech and regulated industries.
- Helped build the practice into Band 1 for technology law.
- Built and ran Four Corners Intelligence — a contract-portfolio analysis product that won an FT Innovative Lawyers award and later followed the practice into Deloitte. (archive.org)
Founder & CEO, Kemp Little Technology Limited 2017–2021
The company behind the firm's legal-tech products — sold to Deloitte alongside the firm itself.
Trainee Solicitor, Field Fisher Waterhouse LLP 2008–2010
Training contract. Admitted as a solicitor in 2010.
Appointments
Visiting Professor, The City Law School, City St George's, University of London 2025–present
Member, LegalTech Board, Society for Computers and Law 2026–present
Education
MA Natural Sciences (II.i), Queens' College, University of Cambridge 2002–2005
LLB Law (Commendation), Nottingham Law School 2005–2007
Admitted as a solicitor, England & Wales 2010
Awards
Innovation in the business of law: Technology, FT Innovative Lawyers Awards 2019 — for Four Corners Intelligence
Expertise
Technology law · Legal technology · Data licensing · AI regulation · Contract automation · Open data
Things I have shipped
- STRIDE — Real-time tracker of digital regulation across jurisdictions — AI, data, platforms, cyber, crypto.
- Four Corners Intelligence — Contract-portfolio analysis — every important clause of every contract, organised and instantly reportable. Won an FT Innovative Lawyers award in 2019.
- AI Collider — Compare AI stances — corporate, regulatory, technical — as colour-coded grids across 72 dimensions.
- AI Contract.ing — Turned SCL's 60-page PDF of EU AI Act clauses into a filterable site with swappable defined terms and drafting options.
- Magic Story Club — AI bedtime stories, personalised to the child you describe.
- Operation GoGoGo — Kitchen-TV dashboard that gets three kids out the door — RAG status and a countdown to departure.
- LessIsMortgage — Side-by-side mortgage scenarios — fixed vs tracker, terms, overpayment strategies — with the full financial picture.
- GoodKnight — Over-the-board chess for Kindle, with Stockfish pointing out pins, forks and skewers mid-game.
More at fo.ls/shipping.
Interests
Running, cycling and skiing since 1987; lifting since 1997. Water polo and rugby, 1995–2015. I taught skiing, back when I was fun.
Last updated 8 August 2026.
The typed source of the full Curriculum Vitae — every version is compiled from it, and it type-checks (tsc --noEmit) on every deploy: if it does not compile, the CV does not ship. If the forms differ, the traditional summary prevails.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
/**
* cv.ts — Rich Folsom, curriculum vitae.
*
* RECITALS
*
* (A) The Subject is part technology lawyer, part legal technologist.
* This is a record, not an application: it does not solicit
* employment, and no inference of candidacy is intended.
* (B) This module is the sole source of the facts asserted at
* https://fo.ls/cv/. The legal instrument on that page is compiled
* from these exports; this file is displayed verbatim as the
* engineering mode. One document, two stages of the same build.
* (C) Narrative claims carry two registers. The claim is invariant; only
* the mode moves. A claim present in one register and absent from
* the other is a bug. (Names, dates and titles have no register to
* move.)
* (D) "tsc --noEmit" gates the deploy. If this file does not type-check,
* the CV does not ship.
* (E) Nothing here needs editing merely because time has passed:
* currency is derived from the absence of "to", and no ages are
* stored.
* (F) Precedence runs the Creative Commons way, inverted as a
* plain-English lawyer would have it: if the forms differ, the
* traditional summary prevails. This file and the instrument defer
* to it.
*/
/* -------------------------------------------------------------------
* Clause 1 — Definitions. The vocabulary, fixed before it is used.
* ------------------------------------------------------------------- */
/** One fact, two modes: legal is third-person and formal; eng is first-person and active. */
export interface Register {
legal: string
eng: string
}
/** A claim with evidence: the url is where a sceptical reader checks it. */
export interface Highlight extends Register {
url?: string
}
export interface Engagement {
org: string
url?: string
role: string
from: string // ISO year
to?: string // absent means current
brief: Register
highlights?: readonly Highlight[]
}
export interface Education {
institution: string
url?: string
area: string
degree: string
classification: string
from: string
to: string
}
export interface Appointment {
org: string
url?: string
role: string
from: string
to?: string
}
/** All facts, no mode: an award reads the same in every register. */
export interface Award {
title: string
awarder: string
year: string
work: string // the thing it recognised
}
/** The bulk detail lives in Schedule 1; the evidence lives at /shipping/.
* Only "professional" products appear in the legal instrument; the other
* versions list everything. */
export interface Product {
name: string
url: string
kind: "professional" | "personal"
summary: Register
}
/* -------------------------------------------------------------------
* Clause 2 — Operative provisions. What is actually asserted.
* ------------------------------------------------------------------- */
export const summary: Register = {
legal:
"The Subject is part technology lawyer and part legal technologist, " +
"building technology to improve legal services and providing legal " +
"services for technology, data and regulated environments.",
eng:
"Part technology lawyer, part legal technologist. I build technology to " +
"improve legal services, and provide legal services for technology, data " +
"and regulated environments.",
}
export const engagements: readonly Engagement[] = [
{
org: "Simmons & Simmons LLP",
url: "https://www.simmons-simmons.com",
role: "Partner",
from: "2024",
brief: {
legal:
"Advises on data in the era of artificial intelligence: data " +
"licensing, rights in the training of AI models, and the " +
"commercial and regulatory architecture in which data and " +
"compute are combined.",
eng:
"Data in the AI era: data licensing, AI training rights, and the " +
"commercial and regulatory plumbing where data meets compute.",
},
highlights: [
{
legal:
"Conceived and delivered STRIDE, a digital regulation tracker " +
"published by the firm and relied on by in-house legal teams " +
"across jurisdictions.",
eng:
"Built and shipped STRIDE, the firm's real-time digital " +
"regulation tracker — in-house teams use it instead of a " +
"quarterly PDF round-up.",
url: "https://stride.simmons-simmons.com",
},
],
},
{
org: "Deloitte LLP",
url: "https://www.deloitte.co.uk",
role: "Partner",
from: "2021",
to: "2024",
brief: {
legal:
"A commercial technology partner in Deloitte Legal, advising " +
"data-intensive businesses on cloud computing, big data and " +
"artificial intelligence, and on managing the risks that " +
"accompany them.",
eng:
"Commercial technology partner in Deloitte Legal — cloud, big " +
"data and AI advice for businesses whose product is mostly data.",
},
highlights: [
{
legal:
"Led the firm's responses to major government consultations on " +
"technology policy, including the Law Commission's digital " +
"assets consultation.",
eng:
"Led Deloitte's responses to major tech-policy consultations, " +
"including the Law Commission's digital assets paper.",
url: "https://cdn.websitebuilder.service.justice.gov.uk/uploads/sites/54/2025/12/Digital-assets-collated-consultation-responses.pdf#page=446",
},
{
legal:
"Hired, trained and led a team of lawyers practising in these " +
"sectors.",
eng: "Hired, trained and ran a team of lawyers in these sectors.",
},
{
legal:
"Product owner of the software-as-a-service tools that " +
"complement the legal practice, including data-rights " +
"management and open-source permissioning.",
eng:
"Product-owned the practice's SaaS tools: data-rights management " +
"and open-source permissioning.",
},
],
},
{
org: "Kemp Little LLP",
role: "Associate, later Partner",
from: "2010",
to: "2021",
brief: {
legal:
"Practised as a solicitor, latterly a partner, in the commercial " +
"technology department of a technology boutique, advising on the " +
"purchase and sale of software, data and services, particularly " +
"for new technologies and regulated environments.",
eng:
"Helping clients buy and sell software, data and services at a " +
"tech boutique — mostly new tech and regulated industries.",
},
highlights: [
{
legal:
"Helped develop the practice to a 'Band 1' ranking for " +
"technology law.",
eng: "Helped build the practice into Band 1 for technology law.",
},
{
legal:
"Conceived, launched and operated Four Corners Intelligence, a " +
"product for organising, categorising and analysing contract " +
"portfolios, recognised at the FT Innovative Lawyers Awards " +
"and continued within Deloitte.",
eng:
"Built and ran Four Corners Intelligence — a contract-portfolio " +
"analysis product that won an FT Innovative Lawyers award and " +
"later followed the practice into Deloitte.",
url: "https://web.archive.org/web/20191206031301/https://www.kl-legal.tech/4corners",
},
],
},
{
org: "Kemp Little Technology Limited",
role: "Founder & CEO",
from: "2017",
to: "2021",
brief: {
legal:
"The company through which the firm's legal-technology products " +
"were developed and operated; sold to Deloitte together with " +
"Kemp Little LLP.",
eng:
"The company behind the firm's legal-tech products — sold to " +
"Deloitte alongside the firm itself.",
},
},
{
org: "Field Fisher Waterhouse LLP",
url: "https://www.fieldfisher.com",
role: "Trainee Solicitor",
from: "2008",
to: "2010",
brief: {
legal:
"Completed a training contract and was admitted as a solicitor " +
"of the Senior Courts of England and Wales in 2010.",
eng: "Training contract. Admitted as a solicitor in 2010.",
},
},
]
export const education: readonly Education[] = [
{
institution: "Queens' College, University of Cambridge",
url: "https://www.queens.cam.ac.uk",
area: "Natural Sciences",
degree: "MA",
classification: "II.i",
from: "2002",
to: "2005",
},
{
institution: "Nottingham Law School",
url: "https://www.ntu.ac.uk",
area: "Law",
degree: "LLB",
classification: "Commendation",
from: "2005",
to: "2007",
},
]
export const appointments: readonly Appointment[] = [
{
org: "The City Law School, City St George's, University of London",
url: "https://www.citystgeorges.ac.uk",
role: "Visiting Professor",
from: "2025",
},
{
org: "Society for Computers and Law",
url: "https://www.scl.org",
role: "Member, LegalTech Board",
from: "2026",
},
]
export const awards: readonly Award[] = [
{
title: "Innovation in the business of law: Technology",
awarder: "FT Innovative Lawyers Awards",
year: "2019",
work: "Four Corners Intelligence",
},
]
/** What the Subject does when not lawyering or shipping. */
export interface Activity {
name: string
from: string
to?: string // absent means current, as everywhere else in this file
}
export interface Interests extends Register {
activities: readonly Activity[]
}
export const interests: Interests = {
legal:
"The Subject has run, cycled and skied since 1987, and lifted " +
"weights since 1997; played water polo and rugby from 1995 to 2015; " +
"and, in years reported to have been more fun, taught skiing.",
eng:
"Running, cycling and skiing since 1987; lifting since 1997. Water " +
"polo and rugby, 1995–2015. I taught skiing, back when I was fun.",
activities: [
{ name: "Running", from: "1987" },
{ name: "Cycling", from: "1987" },
{ name: "Skiing", from: "1987" },
{ name: "Weightlifting", from: "1997" },
{ name: "Water polo", from: "1995", to: "2015" },
{ name: "Rugby", from: "1995", to: "2015" },
],
}
export const expertise: readonly string[] = [
"Technology law",
"Legal technology",
"Data licensing",
"AI regulation",
"Contract automation",
"Open data",
]
/* -------------------------------------------------------------------
* Schedule 1 — The Products. The evidence is at https://fo.ls/shipping/.
* ------------------------------------------------------------------- */
export const products: readonly Product[] = [
{
name: "STRIDE",
url: "https://stride.simmons-simmons.com",
kind: "professional",
summary: {
legal:
"A tracker of draft and enacted digital regulation across " +
"jurisdictions in real time, covering artificial intelligence, " +
"data, platforms, cyber and crypto.",
eng:
"Real-time tracker of digital regulation across jurisdictions — " +
"AI, data, platforms, cyber, crypto.",
},
},
{
name: "Four Corners Intelligence",
url: "https://web.archive.org/web/20191206031301/https://www.kl-legal.tech/4corners",
kind: "professional",
summary: {
legal:
"A product for organising, categorising and analysing contract " +
"portfolios, winner at the FT Innovative Lawyers Awards 2019; " +
"originated at Kemp Little and continued within Deloitte.",
eng:
"Contract-portfolio analysis — every important clause of every " +
"contract, organised and instantly reportable. Won an FT " +
"Innovative Lawyers award in 2019.",
},
},
{
name: "AI Collider",
url: "https://aicollider.org",
kind: "professional",
summary: {
legal:
"A visual diagnostic tool for comparing positions on artificial " +
"intelligence, each mapped across 72 dimensions and rendered as " +
"colour-coded grids.",
eng:
"Compare AI stances — corporate, regulatory, technical — as " +
"colour-coded grids across 72 dimensions.",
},
},
{
name: "AI Contract.ing",
url: "https://www.aicontract.ing",
kind: "professional",
summary: {
legal:
"The Society for Computers and Law's template contractual clauses " +
"for the EU AI Act, published in filterable and reusable form.",
eng:
"Turned SCL's 60-page PDF of EU AI Act clauses into a filterable " +
"site with swappable defined terms and drafting options.",
},
},
{
name: "Magic Story Club",
url: "https://magicstory.club",
kind: "personal",
summary: {
legal:
"A generator of personalised children's stories, each written " +
"for the particular child described to it.",
eng: "AI bedtime stories, personalised to the child you describe.",
},
},
{
name: "Operation GoGoGo",
url: "https://operationgogogo.com",
kind: "personal",
summary: {
legal:
"A household dashboard for running the morning school routine " +
"to a fixed deadline.",
eng:
"Kitchen-TV dashboard that gets three kids out the door — RAG " +
"status and a countdown to departure.",
},
},
{
name: "LessIsMortgage",
url: "https://lessismortgage.com",
kind: "personal",
summary: {
legal:
"A mortgage comparison calculator for evaluating alternative " +
"scenarios side by side.",
eng:
"Side-by-side mortgage scenarios — fixed vs tracker, terms, " +
"overpayment strategies — with the full financial picture.",
},
},
{
name: "GoodKnight",
url: "https://goodknight.app",
kind: "personal",
summary: {
legal:
"A chess application for the Kindle e-reader, with a Stockfish " +
"backend that surfaces tactical patterns during play.",
eng:
"Over-the-board chess for Kindle, with Stockfish pointing out " +
"pins, forks and skewers mid-game.",
},
},
]
/* -------------------------------------------------------------------
* Execution block — the signature that makes it binding.
* ------------------------------------------------------------------- */
export default {
name: "Rich Folsom",
qualification: "Solicitor of the Senior Courts of England and Wales",
admitted: "2010",
location: "London",
email: "rich@fo.ls",
url: "https://fo.ls",
evidence: "https://fo.ls/shipping/",
profiles: [
"https://twitter.com/prisonblues",
"https://github.com/prisonblues",
"https://www.linkedin.com/in/richfolsom",
],
} as const
commit be69678 · 2026-08-08T11:15:34+01:00 · this file is signed: SHA256:fOFFWjg8DJLjDwQ65hnbbHjWkoSAySHGGnteJuZsHG4 (.sig)
The source above is inert on its own. This is the compiler that makes it a CV: it type-checks the source, signs it, and emits every version of this page.
bin/build-cv.mjs — click to expand
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
#!/usr/bin/env node
/**
* Compile the CV from its typed source.
*
* _includes/cv.ts is the single source of truth for every fact on /cv/.
* This script:
* 1. type-checks it (tsc --noEmit) — if the source does not compile,
* the CV does not ship;
* 2. imports it (Node strips the types natively) and emits:
* _data/cv.json — data + JSON-LD, rendered by Liquid into the page
* cv.json — JSON Resume (https://jsonresume.org/schema/),
* copied verbatim into the build output
*
* Both outputs are deterministic and checked in, so `jekyll serve` works
* without Node. bin/deploy.sh reruns this before every build.
*
* This script also publishes itself: a copy lands in _includes/ so the
* Code pane on /cv/ can display the compiler beneath the source it
* compiles, and the raw file is served at /build-cv.mjs.
*/
import { execFileSync } from "node:child_process"
import { existsSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs"
import { homedir } from "node:os"
import { fileURLToPath } from "node:url"
import path from "node:path"
import Ajv from "ajv-draft-04"
const repo = path.dirname(path.dirname(fileURLToPath(import.meta.url)))
const source = path.join(repo, "_includes", "cv.ts")
execFileSync(
path.join(repo, "node_modules", ".bin", "tsc"),
["--noEmit", "--strict", "--target", "es2022", "--module", "esnext", source],
{ stdio: "inherit" },
)
// Provenance: when the source last changed (git), and a real signature over
// it (ssh-ed25519, deterministic). Verifiers fetch /cv.ts, /cv.ts.sig and
// /cv.pub. Best-effort — a missing key or repo must not break the build.
const SIGNING_KEY = path.join(homedir(), ".ssh", "cv_signing_ed25519")
const provenance = {
algorithm: "ssh-ed25519",
commit: null,
commitDate: null,
dirty: false, // uncommitted changes to the source — rendered as `<hash>*`
fingerprint: null,
signed: false,
signatureUrl: "/cv.ts.sig",
publicKeyUrl: "/cv.pub",
}
try {
// A dirty working copy still gets a stamp, starred in the usual way —
// `abc1234*` — so the page never claims a commit it doesn't match.
provenance.dirty = Boolean(
execFileSync("git", ["status", "--porcelain", "--", source], {
cwd: repo,
encoding: "utf-8",
}).trim(),
)
const out = execFileSync(
"git",
["log", "-1", "--format=%H%n%cI", "--", source],
{ cwd: repo, encoding: "utf-8" },
).trim()
if (out) {
const [hash, date] = out.split("\n")
provenance.commit = hash
provenance.commitDate = date
}
if (provenance.dirty) {
console.warn("warning: cv.ts has uncommitted changes — commit stamp starred")
}
} catch {
/* not a git repo, or git unavailable — leave commit null */
}
try {
if (!existsSync(SIGNING_KEY)) throw new Error("no key at ~/.ssh/cv_signing_ed25519")
const pubkey = readFileSync(`${SIGNING_KEY}.pub`, "utf-8").trim()
const [type, key, principal] = pubkey.split(/\s+/)
if (!type || !key || !principal) throw new Error("unparseable public key")
execFileSync("ssh-keygen", ["-Y", "sign", "-f", SIGNING_KEY, "-n", "file", source])
renameSync(`${source}.sig`, path.join(repo, "cv.ts.sig"))
writeFileSync(
path.join(repo, "cv.pub"),
`# Verify: ssh-keygen -Y verify -f cv.pub -I ${principal} -n file -s cv.ts.sig < cv.ts\n${principal} ${type} ${key}\n`,
)
provenance.fingerprint = execFileSync("ssh-keygen", ["-lf", `${SIGNING_KEY}.pub`], {
encoding: "utf-8",
}).split(/\s+/)[1]
provenance.signed = true
console.log(`signed cv.ts (${provenance.fingerprint})`)
} catch (err) {
// A stale signature over changed content is worse than none: remove it.
rmSync(path.join(repo, "cv.ts.sig"), { force: true })
rmSync(path.join(repo, "cv.pub"), { force: true })
console.warn(`warning: cv.ts not signed (${err.message}) — signature artifacts removed`)
}
const cv = await import(source)
const person = cv.default
const personId = `${person.url}/#person`
// GitHub contribution calendar, rendered to inline SVG at build time so the
// page embeds nothing external. Best-effort: on any failure, reuse whatever
// the previous build fetched rather than breaking the deploy.
// GitHub's dark-mode palette — the graph lives on the dashboard's dark panel
const GH_LEVELS = ["#37474b", "#0e4429", "#006d32", "#26a641", "#39d353"]
async function fetchContributions(user) {
const res = await fetch(`https://github.com/users/${user}/contributions`)
if (!res.ok) throw new Error(`GitHub returned ${res.status}`)
const html = await res.text()
// Scraped values are validated before they touch our SVG: dates must be
// ISO dates, levels are clamped to the palette range.
const days = (html.match(/<td[^>]+ContributionCalendar-day[^>]*>/g) ?? [])
.map((tag) => ({
date: tag.match(/data-date="(\d{4}-\d{2}-\d{2})"/)?.[1],
level: Math.min(4, Math.max(0, Number(tag.match(/data-level="(\d)"/)?.[1] ?? 0))),
}))
.filter((d) => d.date)
.sort((a, b) => a.date.localeCompare(b.date))
if (!days.length) throw new Error("no contribution days parsed")
const total = html.match(/([\d,]+)\s+contributions?\s+in the last year/)?.[1]
const cell = 10
const step = 13
const firstDow = new Date(`${days[0].date}T00:00:00Z`).getUTCDay()
const rects = days.map((d, i) => {
const slot = firstDow + i
const x = Math.floor(slot / 7) * step
const y = (slot % 7) * step
return `<rect x="${x}" y="${y}" width="${cell}" height="${cell}" rx="2" fill="${GH_LEVELS[d.level]}"><title>${d.date}</title></rect>`
})
const weeks = Math.ceil((firstDow + days.length) / 7)
const w = weeks * step - (step - cell)
const h = 7 * step - (step - cell)
return {
user,
total: total ?? null,
fetched: days[days.length - 1].date,
svg:
`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${w} ${h}" ` +
`role="img" aria-label="GitHub contribution calendar for ${user}` +
`${total ? `: ${total} contributions in the last year` : ""}">` +
rects.join("") +
"</svg>",
}
}
const githubUser = person.profiles
.find((p) => p.includes("github.com"))
?.split("/")
.pop()
let contributions = null
try {
contributions = await fetchContributions(githubUser)
console.log(
`fetched GitHub contributions for ${githubUser} (${contributions.total ?? "?"} in the last year)`,
)
} catch (err) {
try {
contributions =
JSON.parse(readFileSync(path.join(repo, "_data", "cv.json"), "utf-8"))
.contributions ?? null
} catch {
contributions = null
}
console.warn(
`warning: could not fetch GitHub contributions (${err.message}); ` +
(contributions ? "reusing previous data" : "omitting the graph"),
)
}
const jsonld = {
"@context": "https://schema.org",
"@graph": [
{
"@type": "Person",
"@id": personId,
name: person.name,
url: `${person.url}/`,
mainEntityOfPage: `${person.url}/cv/`,
description: cv.summary.legal,
jobTitle: `${cv.engagements[0].role}, ${cv.engagements[0].org}`,
worksFor: {
"@type": "Organization",
name: cv.engagements[0].org,
...(cv.engagements[0].url ? { url: cv.engagements[0].url } : {}),
},
hasOccupation: {
"@type": "Occupation",
name: "Technology lawyer and legal technologist",
},
hasCredential: {
"@type": "EducationalOccupationalCredential",
credentialCategory: "Professional qualification",
name: person.qualification,
},
alumniOf: cv.education.map((e) => ({
"@type": "CollegeOrUniversity",
name: e.institution,
...(e.url ? { url: e.url } : {}),
})),
affiliation: cv.appointments.map((a) => ({
"@type": "Organization",
name: a.org,
...(a.url ? { url: a.url } : {}),
})),
award: cv.awards.map(
(a) => `${a.title} — ${a.awarder} ${a.year}, for ${a.work}`,
),
knowsAbout: [...cv.expertise],
email: `mailto:${person.email}`,
address: { "@type": "PostalAddress", addressLocality: person.location },
sameAs: [...person.profiles],
},
...cv.products.map((p) => ({
"@type": "SoftwareApplication",
name: p.name,
url: p.url,
description: p.summary.legal,
author: { "@id": personId },
})),
],
}
// Short display label for an evidence link: "stride.simmons-simmons.com"
// becomes "simmons-simmons.com", "web.archive.org" becomes "archive.org",
// deep gov/ac hosts collapse to "justice.gov.uk" / "cam.ac.uk".
const hostFor = (url) => {
if (!url) return undefined
const host = new URL(url).hostname.replace(/^www\./, "")
const parts = host.split(".")
const secondLevel = parts[parts.length - 2]
const keep =
parts[parts.length - 1] === "uk" &&
["co", "gov", "ac", "org", "net"].includes(secondLevel)
? 3
: 2
return parts.slice(-keep).join(".")
}
const profileFor = (url) => {
const network = url.includes("github")
? "GitHub"
: url.includes("linkedin")
? "LinkedIn"
: "Twitter"
return { network, username: url.split("/").pop(), url }
}
const jsonResume = {
$schema:
"https://raw.githubusercontent.com/jsonresume/resume-schema/v1.0.0/schema.json",
basics: {
name: person.name,
label: "Technology lawyer and legal technologist",
email: person.email,
url: `${person.url}/`,
summary: cv.summary.eng,
location: { city: person.location, countryCode: "GB" },
profiles: person.profiles.map(profileFor),
},
work: [
...cv.engagements.map((e) => ({
name: e.org,
...(e.url ? { url: e.url } : {}),
position: e.role,
startDate: e.from,
...(e.to ? { endDate: e.to } : {}),
summary: e.brief.eng,
...(e.highlights ? { highlights: e.highlights.map((h) => h.eng) } : {}),
})),
],
// Appointments (visiting professorship, board membership) — JSON Resume
// has no "appointments" section; volunteer is its slot for honorary roles.
volunteer: cv.appointments.map((a) => ({
organization: a.org,
...(a.url ? { url: a.url } : {}),
position: a.role,
startDate: a.from,
...(a.to ? { endDate: a.to } : {}),
})),
education: cv.education.map((e) => ({
institution: e.institution,
...(e.url ? { url: e.url } : {}),
area: e.area,
studyType: e.degree,
score: e.classification,
startDate: e.from,
endDate: e.to,
})),
awards: cv.awards.map((a) => ({
title: a.title,
date: a.year,
awarder: a.awarder,
summary: `For ${a.work}.`,
})),
skills: cv.expertise.map((name) => ({ name })),
interests: cv.interests.activities.map((a) => ({ name: a.name })),
projects: cv.products.map((p) => ({
name: p.name,
description: p.summary.eng,
url: p.url,
})),
meta: {
canonical: `${person.url}/cv.json`,
...(provenance.commitDate && !provenance.dirty
? { lastModified: provenance.commitDate }
: {}),
...(provenance.signed
? {
signature: {
of: `${person.url}/cv.ts`,
algorithm: provenance.algorithm,
fingerprint: provenance.fingerprint,
signature: `${person.url}/cv.ts.sig`,
publicKey: `${person.url}/cv.pub`,
},
}
: {}),
},
}
// The generated JSON Resume must actually validate, not just claim to —
// the $schema field is declarative. Fail the build on a mismatch.
const ajv = new Ajv({ strict: false, validateFormats: false })
const schema = JSON.parse(
readFileSync(path.join(repo, "bin", "jsonresume-schema.json"), "utf-8"),
)
if (!ajv.validate(schema, jsonResume)) {
console.error("cv.json does not validate against the JSON Resume schema:")
console.error(ajv.errorsText(ajv.errors, { separator: "\n" }))
process.exit(1)
}
console.log("cv.json validates against JSON Resume v1.0.0")
const data = {
_generated:
"GENERATED FILE — do not edit. Source: _includes/cv.ts, compiler: bin/build-cv.mjs.",
summary: cv.summary,
engagements: cv.engagements.map((e) => ({
...e,
highlights: e.highlights?.map((h) => ({ ...h, host: hostFor(h.url) })),
})),
education: cv.education,
appointments: cv.appointments,
awards: cv.awards,
expertise: cv.expertise,
interests: cv.interests,
products: cv.products,
execution: person,
provenance,
contributions,
jsonld,
}
// Markdown version — the traditional summary in plain text, for machines
// and for anyone who wants the CV as a file. Published at /cv.md.
const range = (from, to) => `${from}–${to ?? "present"}`
const markdown = [
`# ${person.name}`,
"",
cv.summary.eng,
"",
`${person.email} · ${person.url} · ${person.location}`,
"",
"## Experience",
...cv.engagements.flatMap((e) => [
"",
`### ${e.role}, ${e.org} (${range(e.from, e.to)})`,
"",
e.brief.eng,
...(e.highlights ?? []).map(
(h) => `- ${h.eng}${h.url ? ` (${h.url})` : ""}`,
),
]),
"",
"## Appointments",
"",
...cv.appointments.map((a) => `- ${a.role}, ${a.org} (${range(a.from, a.to)})`),
"",
"## Education",
"",
...cv.education.map(
(e) =>
`- ${e.degree} ${e.area} (${e.classification}), ${e.institution} (${e.from}–${e.to})`,
),
`- Admitted as a solicitor of the Senior Courts of England and Wales, ${person.admitted}`,
"",
"## Awards",
"",
...cv.awards.map(
(a) => `- ${a.title}, ${a.awarder} ${a.year} — for ${a.work}`,
),
"",
"## Expertise",
"",
cv.expertise.join(" · "),
"",
"## Things I have shipped",
"",
...cv.products.map((p) => `- [${p.name}](${p.url}) — ${p.summary.eng}`),
"",
"## Interests",
"",
cv.interests.eng,
"",
`More at ${person.evidence} · If versions differ, the summary at ${person.url}/cv/ prevails.`,
"",
"---",
"",
[
provenance.signed
? `Signed ${provenance.algorithm} ${provenance.fingerprint} — verify ${person.url}/cv.ts against ${person.url}/cv.ts.sig with ${person.url}/cv.pub`
: null,
provenance.commit
? `Source commit ${provenance.commit.slice(0, 7)}${provenance.dirty ? "*" : ""} · ${provenance.commitDate}`
: null,
]
.filter(Boolean)
.join(" · "),
"",
].join("\n")
const emit = (file, value) => {
writeFileSync(path.join(repo, file), JSON.stringify(value, null, 2) + "\n")
console.log(`wrote ${file}`)
}
emit(path.join("_data", "cv.json"), data)
emit("cv.json", jsonResume)
// Copies in _includes so the Data and Text panes can display the files
emit(path.join("_includes", "cv.json"), jsonResume)
writeFileSync(path.join(repo, "_includes", "cv.md"), markdown)
console.log("wrote _includes/cv.md")
// The compiler publishes itself alongside its output
writeFileSync(
path.join(repo, "_includes", "build-cv.mjs"),
readFileSync(fileURLToPath(import.meta.url)),
)
console.log("wrote _includes/build-cv.mjs")
The CV as data, conforming to the JSON Resume schema so third-party tools can consume it. Served plain at /cv.json. If the forms differ, the traditional summary prevails.
{
"$schema": "https://raw.githubusercontent.com/jsonresume/resume-schema/v1.0.0/schema.json",
"basics": {
"name": "Rich Folsom",
"label": "Technology lawyer and legal technologist",
"email": "rich@fo.ls",
"url": "https://fo.ls/",
"summary": "Part technology lawyer, part legal technologist. I build technology to improve legal services, and provide legal services for technology, data and regulated environments.",
"location": {
"city": "London",
"countryCode": "GB"
},
"profiles": [
{
"network": "Twitter",
"username": "prisonblues",
"url": "https://twitter.com/prisonblues"
},
{
"network": "GitHub",
"username": "prisonblues",
"url": "https://github.com/prisonblues"
},
{
"network": "LinkedIn",
"username": "richfolsom",
"url": "https://www.linkedin.com/in/richfolsom"
}
]
},
"work": [
{
"name": "Simmons & Simmons LLP",
"url": "https://www.simmons-simmons.com",
"position": "Partner",
"startDate": "2024",
"summary": "Data in the AI era: data licensing, AI training rights, and the commercial and regulatory plumbing where data meets compute.",
"highlights": [
"Built and shipped STRIDE, the firm's real-time digital regulation tracker — in-house teams use it instead of a quarterly PDF round-up."
]
},
{
"name": "Deloitte LLP",
"url": "https://www.deloitte.co.uk",
"position": "Partner",
"startDate": "2021",
"endDate": "2024",
"summary": "Commercial technology partner in Deloitte Legal — cloud, big data and AI advice for businesses whose product is mostly data.",
"highlights": [
"Led Deloitte's responses to major tech-policy consultations, including the Law Commission's digital assets paper.",
"Hired, trained and ran a team of lawyers in these sectors.",
"Product-owned the practice's SaaS tools: data-rights management and open-source permissioning."
]
},
{
"name": "Kemp Little LLP",
"position": "Associate, later Partner",
"startDate": "2010",
"endDate": "2021",
"summary": "Helping clients buy and sell software, data and services at a tech boutique — mostly new tech and regulated industries.",
"highlights": [
"Helped build the practice into Band 1 for technology law.",
"Built and ran Four Corners Intelligence — a contract-portfolio analysis product that won an FT Innovative Lawyers award and later followed the practice into Deloitte."
]
},
{
"name": "Kemp Little Technology Limited",
"position": "Founder & CEO",
"startDate": "2017",
"endDate": "2021",
"summary": "The company behind the firm's legal-tech products — sold to Deloitte alongside the firm itself."
},
{
"name": "Field Fisher Waterhouse LLP",
"url": "https://www.fieldfisher.com",
"position": "Trainee Solicitor",
"startDate": "2008",
"endDate": "2010",
"summary": "Training contract. Admitted as a solicitor in 2010."
}
],
"volunteer": [
{
"organization": "The City Law School, City St George's, University of London",
"url": "https://www.citystgeorges.ac.uk",
"position": "Visiting Professor",
"startDate": "2025"
},
{
"organization": "Society for Computers and Law",
"url": "https://www.scl.org",
"position": "Member, LegalTech Board",
"startDate": "2026"
}
],
"education": [
{
"institution": "Queens' College, University of Cambridge",
"url": "https://www.queens.cam.ac.uk",
"area": "Natural Sciences",
"studyType": "MA",
"score": "II.i",
"startDate": "2002",
"endDate": "2005"
},
{
"institution": "Nottingham Law School",
"url": "https://www.ntu.ac.uk",
"area": "Law",
"studyType": "LLB",
"score": "Commendation",
"startDate": "2005",
"endDate": "2007"
}
],
"awards": [
{
"title": "Innovation in the business of law: Technology",
"date": "2019",
"awarder": "FT Innovative Lawyers Awards",
"summary": "For Four Corners Intelligence."
}
],
"skills": [
{
"name": "Technology law"
},
{
"name": "Legal technology"
},
{
"name": "Data licensing"
},
{
"name": "AI regulation"
},
{
"name": "Contract automation"
},
{
"name": "Open data"
}
],
"interests": [
{
"name": "Running"
},
{
"name": "Cycling"
},
{
"name": "Skiing"
},
{
"name": "Weightlifting"
},
{
"name": "Water polo"
},
{
"name": "Rugby"
}
],
"projects": [
{
"name": "STRIDE",
"description": "Real-time tracker of digital regulation across jurisdictions — AI, data, platforms, cyber, crypto.",
"url": "https://stride.simmons-simmons.com"
},
{
"name": "Four Corners Intelligence",
"description": "Contract-portfolio analysis — every important clause of every contract, organised and instantly reportable. Won an FT Innovative Lawyers award in 2019.",
"url": "https://web.archive.org/web/20191206031301/https://www.kl-legal.tech/4corners"
},
{
"name": "AI Collider",
"description": "Compare AI stances — corporate, regulatory, technical — as colour-coded grids across 72 dimensions.",
"url": "https://aicollider.org"
},
{
"name": "AI Contract.ing",
"description": "Turned SCL's 60-page PDF of EU AI Act clauses into a filterable site with swappable defined terms and drafting options.",
"url": "https://www.aicontract.ing"
},
{
"name": "Magic Story Club",
"description": "AI bedtime stories, personalised to the child you describe.",
"url": "https://magicstory.club"
},
{
"name": "Operation GoGoGo",
"description": "Kitchen-TV dashboard that gets three kids out the door — RAG status and a countdown to departure.",
"url": "https://operationgogogo.com"
},
{
"name": "LessIsMortgage",
"description": "Side-by-side mortgage scenarios — fixed vs tracker, terms, overpayment strategies — with the full financial picture.",
"url": "https://lessismortgage.com"
},
{
"name": "GoodKnight",
"description": "Over-the-board chess for Kindle, with Stockfish pointing out pins, forks and skewers mid-game.",
"url": "https://goodknight.app"
}
],
"meta": {
"canonical": "https://fo.ls/cv.json",
"lastModified": "2026-08-08T11:15:34+01:00",
"signature": {
"of": "https://fo.ls/cv.ts",
"algorithm": "ssh-ed25519",
"fingerprint": "SHA256:fOFFWjg8DJLjDwQ65hnbbHjWkoSAySHGGnteJuZsHG4",
"signature": "https://fo.ls/cv.ts.sig",
"publicKey": "https://fo.ls/cv.pub"
}
}
}The CV as plain Markdown — for pasting, piping and feeding to language models. Served plain at /cv.md. If the forms differ, the traditional summary prevails.
# Rich Folsom
Part technology lawyer, part legal technologist. I build technology to improve legal services, and provide legal services for technology, data and regulated environments.
rich@fo.ls · https://fo.ls · London
## Experience
### Partner, Simmons & Simmons LLP (2024–present)
Data in the AI era: data licensing, AI training rights, and the commercial and regulatory plumbing where data meets compute.
- Built and shipped STRIDE, the firm's real-time digital regulation tracker — in-house teams use it instead of a quarterly PDF round-up. (https://stride.simmons-simmons.com)
### Partner, Deloitte LLP (2021–2024)
Commercial technology partner in Deloitte Legal — cloud, big data and AI advice for businesses whose product is mostly data.
- Led Deloitte's responses to major tech-policy consultations, including the Law Commission's digital assets paper. (https://cdn.websitebuilder.service.justice.gov.uk/uploads/sites/54/2025/12/Digital-assets-collated-consultation-responses.pdf#page=446)
- Hired, trained and ran a team of lawyers in these sectors.
- Product-owned the practice's SaaS tools: data-rights management and open-source permissioning.
### Associate, later Partner, Kemp Little LLP (2010–2021)
Helping clients buy and sell software, data and services at a tech boutique — mostly new tech and regulated industries.
- Helped build the practice into Band 1 for technology law.
- Built and ran Four Corners Intelligence — a contract-portfolio analysis product that won an FT Innovative Lawyers award and later followed the practice into Deloitte. (https://web.archive.org/web/20191206031301/https://www.kl-legal.tech/4corners)
### Founder & CEO, Kemp Little Technology Limited (2017–2021)
The company behind the firm's legal-tech products — sold to Deloitte alongside the firm itself.
### Trainee Solicitor, Field Fisher Waterhouse LLP (2008–2010)
Training contract. Admitted as a solicitor in 2010.
## Appointments
- Visiting Professor, The City Law School, City St George's, University of London (2025–present)
- Member, LegalTech Board, Society for Computers and Law (2026–present)
## Education
- MA Natural Sciences (II.i), Queens' College, University of Cambridge (2002–2005)
- LLB Law (Commendation), Nottingham Law School (2005–2007)
- Admitted as a solicitor of the Senior Courts of England and Wales, 2010
## Awards
- Innovation in the business of law: Technology, FT Innovative Lawyers Awards 2019 — for Four Corners Intelligence
## Expertise
Technology law · Legal technology · Data licensing · AI regulation · Contract automation · Open data
## Things I have shipped
- [STRIDE](https://stride.simmons-simmons.com) — Real-time tracker of digital regulation across jurisdictions — AI, data, platforms, cyber, crypto.
- [Four Corners Intelligence](https://web.archive.org/web/20191206031301/https://www.kl-legal.tech/4corners) — Contract-portfolio analysis — every important clause of every contract, organised and instantly reportable. Won an FT Innovative Lawyers award in 2019.
- [AI Collider](https://aicollider.org) — Compare AI stances — corporate, regulatory, technical — as colour-coded grids across 72 dimensions.
- [AI Contract.ing](https://www.aicontract.ing) — Turned SCL's 60-page PDF of EU AI Act clauses into a filterable site with swappable defined terms and drafting options.
- [Magic Story Club](https://magicstory.club) — AI bedtime stories, personalised to the child you describe.
- [Operation GoGoGo](https://operationgogogo.com) — Kitchen-TV dashboard that gets three kids out the door — RAG status and a countdown to departure.
- [LessIsMortgage](https://lessismortgage.com) — Side-by-side mortgage scenarios — fixed vs tracker, terms, overpayment strategies — with the full financial picture.
- [GoodKnight](https://goodknight.app) — Over-the-board chess for Kindle, with Stockfish pointing out pins, forks and skewers mid-game.
## Interests
Running, cycling and skiing since 1987; lifting since 1997. Water polo and rugby, 1995–2015. I taught skiing, back when I was fun.
More at https://fo.ls/shipping/ · If versions differ, the summary at https://fo.ls/cv/ prevails.
---
Signed ssh-ed25519 SHA256:fOFFWjg8DJLjDwQ65hnbbHjWkoSAySHGGnteJuZsHG4 — verify https://fo.ls/cv.ts against https://fo.ls/cv.ts.sig with https://fo.ls/cv.pub · Source commit be69678 · 2026-08-08T11:15:34+01:00