# Work & Writing

I write these to work out what I think, and most of the projects are things I wanted to use myself, so they sit together here.

Start here

1. [Home Lab Raspberry Pi recovery architecture](/work/home-lab)
2. [GPUShare Self-hosted GPU sharing platform](/work/gpu-share)
3. [Malware Classifier Backdoors Academic classifier robustness study](/work/malware-classifier-backdoors)
4. [Grid Diffusion AD Diffusion-based fault detection study](/work/grid-diffusion-ad)

## 2026

- [View case study](/work/personal-language-corpus)

  ### [Personal Language Corpus](/work/personal-language-corpus)

  A small corpus built from my own transcripts and exports, with provenance attached so an observation can be traced back to the passage behind it.

  - Python
  - Research
  - Writing tools

- [View case study](/work/the-city)

  ### [The City](/work/the-city)

  I saw [AI Office](https://sael.net/ai-office) showing Claude Code agents as robots at desks, and wanted something that fitted the way I work. In The City, each project folder is a building and each team has a floor of robots, so I can see which ones need me.

  - AI
  - Architecture
  - UX design

  [Source code](https://github.com/Slaymish/theCity)

- [View case study](/work/typed-diff-questions)

  ### [Typed Diff Questions](/work/typed-diff-questions)

  A narrow question about a diff can be scored, where a whole code review can't. This was a test of whether a bank of typed questions gives a usable signal.

  - AI
  - Developer tools
  - Research

- [View case study](/work/conversational-timing-lab)

  ### [Conversational Timing Lab](/work/conversational-timing-lab)

  I wanted to know whether a pause means somebody has finished or is just thinking, so I built a lab around that difference.

  - Machine learning
  - Research
  - Voice

  [Source code](https://github.com/Slaymish/conversational-timing-lab)

- [View case study](/work/sprint-coach)

  ### [Sprint Coach](/work/sprint-coach)

  Nathan’s coaching business grew by word of mouth. His first website needed to show athletes and parents who they would be training with, and make the next step easy.

  - Front-end development
  - UX design

- [View case study](/work/wake-on-join-minecraft)

  ### [Wake-on-Join Minecraft](/work/wake-on-join-minecraft)

  A Paper server for a few friends that sleeps when nobody's playing and wakes when somebody tries to join.

  - Automation
  - Cloud infrastructure
  - Games

  [Source code](https://github.com/Slaymish/YayMinecraftServer)

- [View case study](/work/brontehf)

  ### [BrontëHF](/work/brontehf)

  Brontë brought the design. I built the portfolio around it, with the project content in a CMS so they could keep updating it themselves.

  - Front-end development

- [View case study](/work/you-inc)

  ### [You Inc](/work/you-inc)

  I wanted one view of what I own, owe, earn and spend. I built You Inc around a ledger, then took the accounts and billing back out so people could run it on their own machine.

  - Architecture
  - Data pipelines
  - Finance
  - Front-end development
  - Self-hosted
  - UX design

  [Source code](https://github.com/Slaymish/YouInc)

- [View case study](/work/otto)

  ### [Otto](/work/otto)

  Otto is a voice and text assistant for the Mac, built as a Swift app on top of the voice-os project.

  - AI
  - macOS
  - Swift
  - Voice

  [Source code](https://github.com/Slaymish/Otto)

- [View case study](/work/lumen)

  ### [Lumen](/work/lumen)

  Lumen connects an Obsidian vault to a local research backend, so related notes surface while you write and reports come out of what's already there.

  - AI
  - Obsidian
  - Python

  [Source code](https://github.com/Slaymish/Lumen)

- [View case study](/work/synod)

  ### [Synod](/work/synod)

  Synod reads your journal through a set of value agents and writes their disagreements back into the vault as a bulletin.

  - AI
  - Obsidian
  - TypeScript

  [Source code](https://github.com/Slaymish/Synod)

- [View case study](/work/flat-power-calculator)

  ### [Flat Power Calculator](/work/flat-power-calculator)

  The flat power bill, minus the server's share, split five ways. The person whose machine runs all day pays for it.

  - Automation
  - Finance
  - TypeScript

  [Source code](https://github.com/Slaymish/PowerCalculator)

- - [26 March 2026 Writing](/posts/splitting-the-stack-and-making-setup-actually-work)
    ### [Splitting GPUShare into two services](/posts/splitting-the-stack-and-making-setup-actually-work)
    [I split GPUShare’s accounts from the hardware services, then found the installer still pointed at a service I’d removed.](/posts/splitting-the-stack-and-making-setup-actually-work)
    [- AI- Architecture- Economics- Self-hosted](/posts/splitting-the-stack-and-making-setup-actually-work)

- [Read the story](/work/gpu-share)

  ### [GPUShare](/work/gpu-share)

  My desktop GPU sits idle most of the day. I built a way for friends to share it for local AI and rendering, with the limits of a home machine visible.

  - AI
  - Architecture
  - Economics
  - Front-end development
  - Self-hosted
  - UX design

  [Source code](https://github.com/Slaymish/GPUShare)

- - [21 March 2026 Writing](/posts/building-a-private-ai-server-for-friends)
    ### [Sharing my GPU with friends](/posts/building-a-private-ai-server-for-friends)
    [I built GPUShare around my desktop GPU. The accounts, routing and cost estimates ended up needing as much explanation as the hardware.](/posts/building-a-private-ai-server-for-friends)
    [- AI- Architecture- Economics- Self-hosted](/posts/building-a-private-ai-server-for-friends)

- [View case study](/work/drop-eta)

  ### [DropETA](/work/drop-eta)

  DropETA plans a run of deliveries and shows what adding one more stop does to the rest.

  - Product design
  - Transport
  - TypeScript

- - [8 February 2026 Writing Report](/reports/grid-diffusion-anomaly-detection)
    ### [Anomaly (Out-of-Distribution) Detection for Electrical Distribution Networks using Discrete Diffusion Methods](/reports/grid-diffusion-anomaly-detection)
    [The paper behind Grid Diffusion AD: discrete diffusion over quantised magnetic-field windows, trained on normal data only, scored against a false-alarm budget. The best configuration separated faults from normal weakly, and the paper reports that instead of rounding it up.](/reports/grid-diffusion-anomaly-detection)
    [- AI- Machine learning- Research- Time series](/reports/grid-diffusion-anomaly-detection)

- - [20 January 2026 Writing](/posts/healthagent-apple-health-data-ingestion-and-insights)
    ### [Putting my Apple Health data in one place](/posts/healthagent-apple-health-data-ingestion-and-insights)
    [I brought my nutrition and activity data out of Apple Health and into Postgres, so I could compare the daily and weekly trends.](/posts/healthagent-apple-health-data-ingestion-and-insights)
    [- AI- Architecture- Data pipelines](/posts/healthagent-apple-health-data-ingestion-and-insights)

- [View case study](/work/health-agent)

  ### [HealthAgent](/work/health-agent)

  My nutrition and activity lived in different apps. I brought their Apple Health exports together so I could see the trends in one place.

  - AI
  - Architecture
  - Data pipelines
  - Front-end development

  [Source code](https://github.com/Slaymish/HealthAgent)

- [View case study](/work/metlink-departures-display)

  ### [Metlink Departures Display](/work/metlink-departures-display)

  I got tired of opening my phone at the same stop every morning, so the next two buses now sit on a small sign by the door.

  - Automation
  - Python
  - Transport

  [Source code](https://github.com/Slaymish/metlink-departures-display)

## 2025

- [View case study](/work/piano-improvisation-helper)

  ### [Piano Improvisation Helper](/work/piano-improvisation-helper)

  A small app for the moment you want to play along with a song and don't know what key it's in.

  - Audio
  - Music
  - TypeScript

  [Source code](https://github.com/Slaymish/PianoImprovisationHelper)

- [View case study](/work/bedroom-layout-designer)

  ### [Bedroom Layout Designer](/work/bedroom-layout-designer)

  A room planner for checking whether a layout actually fits, with the room, furniture and openings all on the same scale.

  - Product design
  - TypeScript
  - Web development

  [Source code](https://github.com/Slaymish/BedroomLayoutDesigner)

- [View case study](/work/groovebox)

  ### [GrooveBox](/work/groovebox)

  A beat sequencer played with the computer keyboard, with patterns that can change while the loop runs.

  - Audio
  - Music
  - Python

  [Source code](https://github.com/Slaymish/GrooveBox)

- [View case study](/work/bank-to-sheets-sync)

  ### [Bank-to-Sheets Sync](/work/bank-to-sheets-sync)

  A small service that keeps settled BNZ transactions in a Google Sheet, so the budget formulas already in the sheet have current data.

  - Automation
  - Finance
  - Python

  [Source code](https://github.com/Slaymish/akahu-sheets-sync)

- [View case study](/work/grid-diffusion-ad)

  ### [Grid Diffusion AD](/work/grid-diffusion-ad)

  Diffusion models trained on normal magnetic-field signals, scored on whether they notice a fault they've never seen.

  - AI
  - Machine learning
  - Research
  - Time series

- [View case study](/work/ando-sim)

  ### [AndoSim](/work/ando-sim)

  AndoSim puts the cubic barrier contact method from a 2024 paper inside Blender, so cloth and shell contacts can be simulated and looked at in the scene.

  - Blender
  - C++
  - Graphics
  - Simulation

  [Source code](https://github.com/Slaymish/AndoSim)

- [View case study](/work/cowrie-honeypot-analysis)

  ### [Cowrie Honeypot Analysis](/work/cowrie-honeypot-analysis)

  480,998 events from a Cowrie honeypot, and the question was what they actually show.

  - Python
  - Research
  - Security

- - [21 August 2025 Writing Report](/reports/home-lab-architectural-study)
    ### [Home Lab Architectural Study](/reports/home-lab-architectural-study)
    [I ran public and private services on a Raspberry Pi 4, then tested the restore playbook. This report covers the constraints, the service layout and that recovery test.](/reports/home-lab-architectural-study)
    [- Architecture- Self-hosted](/reports/home-lab-architectural-study)

- [Read the write-up](/work/home-lab)

  ### [Home Lab](/work/home-lab)

  What would happen if I lost the machine running my home services? I built a small server around that question, then tested a full recovery.

  - Architecture
  - Self-hosted

- [View case study](/work/pinterest-aesthetic-analysis)

  ### [Pinterest Aesthetic Analysis](/work/pinterest-aesthetic-analysis)

  I used CLIP embeddings to group the images on a Pinterest board, then kept the snapshots so one month's themes could be compared with the next.

  - AI
  - Computer vision
  - Python

  [Source code](https://github.com/Slaymish/PinterestBoardEmbedding)

- [View case study](/work/piano-waveform-visualiser)

  ### [Piano Waveform Visualiser](/work/piano-waveform-visualiser)

  A C++ keyboard where the keys you hold change both the sound and the waveform drawn beside it.

  - Audio
  - C++
  - Music

  [Source code](https://github.com/Slaymish/PianoVisualiser)

- - [9 June 2025 Writing Report](/reports/wildfire-analysis-with-pyspark)
    ### [Wildfire Analysis with PySpark](/reports/wildfire-analysis-with-pyspark)
    [I used PySpark to train and compare models on 1.88 million US wildfire records. The report covers the features, training runs and what happened when I weighted the rare classes.](/reports/wildfire-analysis-with-pyspark)
    [- AI- Data pipelines](/reports/wildfire-analysis-with-pyspark)

- [View case study](/work/wildfire-pyspark)

  ### [Wildfire PySpark](/work/wildfire-pyspark)

  I worked with 1.88 million US wildfire records for a university project, and got into how a model could look accurate while missing the larger fires.

  - AI
  - Data pipelines

- [View case study](/work/transit-sync)

  ### [TransitSync](/work/transit-sync)

  TransitSync took the next event in my calendar, worked out how to get there, and told me when to leave.

  - APIs
  - Python
  - Transport

  [Source code](https://github.com/Slaymish/transitsync-routing)

- [View case study](/work/sentient-environment-explorer)

  ### [Sentient Environment Explorer](/work/sentient-environment-explorer)

  A small grid world where an agent has to find food and avoid hazards, and a neural learner works out which moves to repeat.

  - Machine learning
  - Python
  - Simulation

- [View case study](/work/malware-classifier-backdoors)

  ### [Malware Classifier Backdoors](/work/malware-classifier-backdoors)

  A study of what happens to a malware classifier when the training data is poisoned, keeping the clean detection rate beside the attack success rate.

  - Machine learning
  - Research
  - Security

## 2024

- [View case study](/work/music-genre-classification)

  ### [Music Genre Classification](/work/music-genre-classification)

  Ten genres, 5,000 tracks each, and a pipeline that spent more time on the features than on the classifier.

  - Machine learning
  - Music
  - Research

  [Source code](https://github.com/Slaymish/Musicical-Genre-Classifier)

- [View case study](/work/geometry-shader-study)

  ### [Geometry and Shader Study](/work/geometry-shader-study)

  Coursework on where generated geometry and shader inputs meet in a real-time renderer.

  - C++
  - Graphics
  - Rendering

  [Source code](https://github.com/Slaymish/CGRA350-Assignment-1)

- [View case study](/work/floor-plan-importer)

  ### [Floor-plan Importer](/work/floor-plan-importer)

  A Blender add-on that reads floor-plan data and builds the geometry, so the plan is still editable as a scene afterwards.

  - Blender
  - Graphics
  - Python

  [Source code](https://github.com/Slaymish/blender-addon)

- [View case study](/work/path-tracing-study)

  ### [Path Tracing Study](/work/path-tracing-study)

  A C++ path tracer from graphics coursework, worked through the assignment stages and then a grid-based sampling variant on top.

  - C++
  - Graphics
  - Rendering

- [View case study](/work/boids-simulation)

  ### [Boids Simulation](/work/boids-simulation)

  Each boid only looks at its neighbours and the obstacles close to it, and the flock is what falls out of those rules.

  - C++
  - Graphics
  - Simulation

  [Source code](https://github.com/Slaymish/CGRA354_Framework_A3)

- [View case study](/work/birthday-gallery)

  ### [Birthday Gallery](/work/birthday-gallery)

  A birthday gallery for my dad, with family photographs arranged in a small 3D space you can walk through in the browser.

  - Graphics
  - Three.js
  - Web development

- [View case study](/work/spotify-playlist-demographics)

  ### [Spotify Playlist Demographics](/work/spotify-playlist-demographics)

  A playlist, its artists, and whatever their Wikipedia pages would say about them, turned into charts.

  - APIs
  - Music
  - Python

  [Source code](https://github.com/Slaymish/Spotify-Demographics-Analyzer)

## 2023

- [View case study](/work/finlay-lani-wedding)

  ### [Finlay and Lani's wedding website](/work/finlay-lani-wedding)

  A wedding site for Finlay and Lani: the details, an RSVP form, and a view where they could see who was coming.

  - Firebase
  - Vue
  - Web development

  [Source code](https://github.com/Slaymish/WeddingWebsite)

- [View case study](/work/parametric-bookshelf)

  ### [Parametric Bookshelf](/work/parametric-bookshelf)

  A bookshelf built in geometry nodes, kept as a blend file you can drop into an asset library.

  - Blender
  - Graphics
  - Procedural design

  [Source code](https://github.com/Slaymish/BlenderBookShelf)

- [View case study](/work/cookie-cat)

  ### [Cookie Cat](/work/cookie-cat)

  A university game project in Godot, where you jump a level that keeps generating, collect cookies, and spend them on lives and jump upgrades.

  - Games
  - Godot
  - Procedural design

- [View case study](/work/3d-spanning-trees)

  ### [3D Spanning Trees](/work/3d-spanning-trees)

  I was treating meshes as graphs, and deleting the faces off an OBJ leaves the edges, which is enough to run Kruskal's algorithm on.

  - Blender
  - Graphics
  - Java

  [Source code](https://github.com/Slaymish/3dSpanningTrees)

- [View case study](/work/l-system-generator)

  ### [L-system Generator](/work/l-system-generator)

  An L-system editor: write the rules, set the angle and the iteration count, and watch a turtle turn the string into geometry.

  - Blender
  - Graphics
  - Java

  [Source code](https://github.com/Slaymish/LSystemGenerator)

- [View case study](/work/articulate-ai)

  ### [ArticulateAI](/work/articulate-ai)

  One of my early voice experiments: record a clip, transcribe it with Whisper, send the transcript to GPT with a prompt, and optionally speak the reply.

  - AI
  - Python
  - Voice

  [Source code](https://github.com/Slaymish/ArticulateAI)

- [View case study](/work/wellington-transport-network)

  ### [Wellington Transport Network](/work/wellington-transport-network)

  Wellington's public transport as a graph, with route search and the stops whose removal would split the network.

  - Algorithms
  - Java
  - Transport

## 2022

- [View case study](/work/watzon)

  ### [Watzon](/work/watzon)

  A Discord bot for the OCE Echo VR community, which pulled league data into the server so nobody had to open a website for it.

  - Community tools
  - Games
  - Java

  [Source code](https://github.com/Slaymish/Watzon)

## 2021

- [View case study](/work/echo-stats-finder)

  ### [Echo Stats Finder](/work/echo-stats-finder)

  Silveridge and I built a desktop tool for looking up the Echo VR players you're in a match with, and their league records.

  - Community tools
  - Games
  - Python

  [Source code](https://github.com/Slaymish/EchoStatsFinder)

## [Codex usage optimiser](/work/codex-usage)

Estimate Codex subscription costs and preview a usage report.

## Have something you’d like me to build?

[Book a call ](https://cal.com/hamishburke/30min)<hamishapps@gmail.com>
