./src/routes/+page.svelte
<script lang="ts">
import { getProfile } from "#lib/profile.remote.ts";
import { START, step, type Phase, type Role } from "#lib/domain.ts";
const profile = await getProfile();
const [current, ...past] = profile.roles;
let phase = $state<Phase>(START);
const next = $derived(step(profile.loop, phase));
$effect(() => {
const then = next;
if (then === undefined) return;
const t = setTimeout(() => (phase = then), 4000);
return () => clearTimeout(t);
});
</script>
{#snippet tenure({ role, org, from, to }: Role)}
<li>{role} at {org}, {from} to {to ?? "now"}</li>
{/snippet}
<h1>{profile.name} is a {profile.desc}</h1>
{#if profile.species === "goblin"}
<p>now: {phase}</p>
<p>next: {next}</p>
<p>and after rebuilding? {profile.loop.rebuilding}</p>
{:else}
<p>now: {phase}</p>
<p>next: {next ?? "nothing. they shipped."}</p>
{/if}
<ul>
{@render tenure(current)}
{#each past as role (`${role.org}/${role.role}/${role.from}`)}
{@render tenure(role)}
{/each}
</ul>
./src/lib/profile.remote.ts
import { prerender } from "$app/server";
import { describe } from "#lib/describe.ts";
import type { AnyProfile } from "#lib/domain.ts";
import { jason } from "#db/facts.ts";
export const getProfile = prerender(async (): Promise<AnyProfile> => describe(jason));
./src/lib/describe.ts
import { LOOP, type AnyProfile, type Being, type Profile } from "./domain.ts";
import { roles } from "#db/facts.ts";
function isJason(being: Being): being is Being & { readonly name: "Jason" } {
return being.name === "Jason";
}
export function describe(being: Being & { readonly name: "Jason" }): Profile<"goblin">;
export function describe(being: Being): Profile<"human">;
export function describe(being: Being): AnyProfile {
if (isJason(being)) {
return {
...being,
species: "goblin",
desc: "neurodivergent anarchosocialist goblin",
roles: roles.jason,
loop: LOOP.goblin,
};
}
return {
...being,
species: "human",
desc: "pro fullstack dev",
roles: roles.anyone,
loop: LOOP.human,
};
}
./src/lib/domain.ts
// ---- primitives
type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
type Month = `0${Exclude<Digit, 0>}` | "10" | "11" | "12";
export type YearMonth = `${number}-${Month}`;
export type Handle = `@${string}`;
// ---- roles
interface Tenure {
readonly org: Handle;
readonly role: string;
readonly level?: string;
readonly from: YearMonth;
}
export type CurrentRole = Tenure & { readonly to?: never };
export type PastRole = Tenure & { readonly to: YearMonth };
export type Role = CurrentRole | PastRole;
export type Timeline = readonly [CurrentRole, ...PastRole[]];
// ---- species
export type Species = "human" | "goblin";
type Adjective<S extends Species> = S extends "goblin"
? "neurodivergent" | "anarchosocialist"
: "pro" | "fullstack";
type Noun<S extends Species> = S extends "goblin" ? "goblin" : "dev";
type Pair<A extends string, B extends string = A> = A extends unknown
? `${A} ${Exclude<B, A>}`
: never;
export type Desc<S extends Species> = `${Pair<Adjective<S>>} ${Noun<S>}`;
export interface Being {
readonly name: string;
readonly handle: Handle;
readonly stack: readonly string[];
}
// ---- the loop
export type Phase =
| "fixing a small thing"
| "questioning the foundations"
| "rebuilding"
| "shipped";
export const LOOP = {
goblin: {
"fixing a small thing": "questioning the foundations",
"questioning the foundations": "rebuilding",
rebuilding: "fixing a small thing",
},
human: {
"fixing a small thing": "shipped",
},
} as const satisfies { readonly [S in Species]: { readonly [P in Phase]?: Phase } };
export const START = "fixing a small thing" satisfies Phase;
export type Machine<S extends Species> = (typeof LOOP)[S];
export const step = (machine: Partial<Record<Phase, Phase>>, phase: Phase) => machine[phase];
export type Next<S extends Species, P extends Phase> = P extends keyof Machine<S>
? Machine<S>[P]
: never;
// ---- profile
export interface Profile<S extends Species = Species> extends Being {
readonly species: S;
readonly desc: Desc<S>;
readonly roles: Timeline;
readonly loop: Machine<S>;
}
export type AnyProfile = { [S in Species]: Profile<S> }[Species];
./db/facts.ts
import type { Being, Timeline } from "#lib/domain.ts";
export const jason = {
name: "Jason",
handle: "@JasonWarrenUK",
stack: ["svelte", "bun", "go", "python", "claude"],
} as const satisfies Being;
export const roles = {
jason: [
{ org: "@TandemCreativeDev", role: "developer", from: "2026-06" },
{ org: "@foundersandcoders", role: "apprentice dev", level: "mid/senior (shhh)", from: "2025-01", to: "2026-06" },
{ org: "@foundersandcoders", role: "L6 AI apprenticeship mentor", from: "2025-01", to: "2026-06" },
{ org: "@FAC-31", role: "facilitator", from: "2025-02", to: "2025-07" },
{ org: "@foundersandcoders", role: "dev", from: "2024-09", to: "2025-01" },
{ org: "@fac30", role: "grad", from: "2024-09", to: "2024-12" },
{ org: "@FAC29A", role: "grad", from: "2023-09", to: "2023-11" },
],
anyone: [
{ org: "@techStartUp", role: "innovation engineer", from: "2024-01" },
],
} as const satisfies { readonly [who: string]: Timeline };
./src/lib/describe.test.ts
import { suite, test, expect, expectTypeOf } from "vitest";
import { describe } from "./describe.ts";
import { jason } from "#db/facts.ts";
import type { Profile } from "./domain.ts";
suite("the compiler knows", () => {
test("jason is a goblin", () => {
const profile = describe(jason);
expectTypeOf(profile).toEqualTypeOf<Profile<"goblin">>();
expect(profile.desc).toBe("neurodivergent anarchosocialist goblin");
});
test("everyone else is a professional", () => {
const profile = describe({ name: "Dave", handle: "@dave", stack: ["react"] });
expectTypeOf(profile).toEqualTypeOf<Profile<"human">>();
expect(profile.loop["fixing a small thing"]).toBe("shipped");
});
test("there is no promotion out of goblin", () => {
// @ts-expect-error Type '"goblin"' is not assignable to type '"human"'
const pro: Profile<"human"> = describe(jason);
expect(pro.species).toBe("goblin");
});
});
On Fire Right Now
what's eating my evenings
| Name | Description | Links | |
|---|---|---|---|
| ๐๏ธ | Urheimat | lead a people across the ages, then watch future scholars try to reconstruct what you actually believed | site / repo |
| ๐ | CHIRPdb | ingest maritime incident reports & serve them as a structured API | docs / org |
| ๐งญ | Drift | a CLI that fingerprints every repo a portfolio claims, plus the SvelteKit site it keeps honest | site / repo |
| โ๏ธ | The Work | write a thesis in one night whilst staving off existential angst | site / repo |
| ๐น | Goblin Mode | three goblins in a trenchcoat pretending to be a senior developer: Claude Code config shaped by ADHD, friction & spite | repo |
| ๐บ๏ธ | Historia | watch Britain's kingdoms shift across an animated map from 300 to 1066 CE | site / repo |
Receipts
shipped, used by actual humans
| Name | Description | Team | Year | Links |
|---|---|---|---|---|
| Iris | turn messy learner CSVs into validated ILR submissions that the ESFA will actually accept | 2026 | repo | |
| Michelle Guy | a site for an acting coach who deserves better than a Squarespace template | 2026 | site / repo | |
| Schema Forge | read XSD files & validate, map & generate the XML they describe | 2026 | npm / repo | |
| FAC Internal Platform | the internal engine that keeps Founders and Coders running: API, apps & workers | @Jaz-spec, @izaakrogan & @sofer | 2026 | |
| Guardrails | strip the PII out of your prompts before they ever reach an LLM | Ahmed Shatat, @mohmmadAyesh & Erica Gasparini | 2026 | org |
| Workwise | turn static accessibility surveys into dynamic evolving conversations | @AlexVOiceover | 2025 | repo |
| Things We Do | track your mood & build a personal toolkit for getting through the day | @jackcasstlesjones, @maxitect & @gurtatiLND | 2024 | repo |
| Sakura | a colour palette app where you can ask for "dark reddish purple" & it knows what you mean | @jackcasstlesjones & @JoshCodedit | 2024 | server / client |
Unreplied Texts
the code exists; I walked away
| Name | Description | Links | |
|---|---|---|---|
| ๐ | Wyrd | a terminal productivity system on a flat-file property graph: tasks, notes, habits & budgets, all connected | repo |
| ๐๏ธ | Those Who Came Before | try to understand a vanished culture by interpreting procedurally generated artefacts | site / repo |
| ๐ฃ๏ธ | The Tongue | grow a proto-language, then watch it drift, spread & fracture into daughter tongues | site / repo |
| ๐ก๏ธ | Bronze Remembers | a turn-based tactics RPG with a legacy spine, built in Godot | repo |
| โณ | Grand Chronicle | taking someone who witnessed a historical event & see what else they lived through | site / repo |
| ๐ง | Cogni | map your cognitive style across 17 compasses & find the dev methodology that fits | repo |
| ๐ณ | Kitchen Gremlin | replace Paprika with something that does meal plans & shopping lists properly | repo |
| ๐ค | Rhea | an LLM-powered assistant for democratic/peer-led learning cohorts | repo |
| โ๏ธ | Flyt | duel a Norseman through ritual insult poetry & defend your honour in verse | site / repo |
| ๐ฎ | Sparker | track observations about SEN students over time & surface the patterns a facilitator might miss | repo |
| ๐งต | Beacons | turn freeform journaling into a graph you can actually navigate & act on | server / client |
Odd Socks
toys, experiments & things built for one person
| Name | Links | Team | Year |
|---|---|---|---|
| Quiz Night | repo | 2026 | |
| Reach | site / repo | 2026 | |
| Explainers | site / repo | 2026 | |
| Tallywhack | repo | 2026 | |
| The World I'd Build You | site / repo | 2026 | |
| Grumble | site / repo | 2026 | |
| Top Girls | site / repo | 2026 | |
| Code Arcana | repo | 2026 | |
| Rimewarden | repo | 2026 | |
| Baby Names | repo | 2026 | |
| Sith Maker | repo | 2026 | |
| Nihilistic Onboarder | repo | 2025 | |
| Hat Recommender | repo | 2025 | |
| Psyche | repo | @Jaz-spec | 2025 |
| Commons Traybake | repo | @Jaz-spec, @nchua3012 & @JosephPotashnik | 2025 |
| ReDoT | repo | @JosephPotashnik & @FortyTwoFortyTwo | 2025 |
| The Forgotten One | repo | 2025 | |
| Petulant God | repo | 2023 | |
| Melonhead | itch.io | 2022 | |
| Prisms | itch.io / repo | 2021 | |
| My Brothers, Counting | itch.io | 2020 |
How Does It Behave?
- I'm looking to collaborate on useless-yet-interesting linguistics utilities & neurodivergent revolutionary digital infrastructure
- I'm looking for help with basic life skills
- Also I started by bimbling about with ink stories
- I wroted a book: here it is
What Is It Doing?
Daily drivers: TypeScript, Svelte, Bun & Python. I also build the agent tooling that the AI works inside: skills, hooks, subagents & orchestration workflows for Claude Code (see Goblin Mode).
I'm currently seriously learning about...
- Go (Bubbletea & friends, via Wyrd)
- Godot & GDScript (via Bronze Remembers)
- pgvector & semantic search (via CHIRPdb)
I'm also dabbling with...
- Obsidian plugins
- Docker



