Open-source work & personal projects.

Web applications + computer code.

I've written about some of my work here, in order of how I important I find the project or how much I worked on it. First one is a music player named Diffuse, and following are: a local-first toolkit ODD SDK, a “static-site-generator” library Shikensu, an electrical-wave analyser Waves, and more …


I've been working on this personal project on and off since 2012. Started out when some of my favourite music got removed from Spotify. Decided then and there that I'd start buying music and build my own music player. I uploaded my bought music to Amazon S3 and connected it to my app. Since then it's evolved into a decentralised local-first app. It's got two layers of data storage, (1) the user-data layer with your favourites, playlists, etc, and (2) the music layer. Both layers can have separate remote storages, for example, user data on Dropbox and music on Amazon S3.



Open Distributed Data

The ODD SDK is a local-first toolkit that helps developers build systems that store data in a secure, reliable, and decentralised way. The focus is on the user, providing them with sufficient authority while still being convenient.
We want our data accessible from anywhere and distributed, meaning it can live partially or fully in multiple places. Ideally, as much of this data as possible lives on user owned devices and communication of this data will be done in a decentralised, peer-to-peer fashion.

This is the main project I worked on during my time at Fission. I still work on projects related to this that use the same protocols WNFS & UCAN. One is a library that wraps the Rust/WASM implementation of WNFS, called Nest, which is something that came out of ODD. Along with these packages.


Code (fork):

Herknen (app):

Drive (app):


I was tired of always keeping up with the latest static site generators, so instead I built a library that's one level down of a static-site generator. It's sort of a static-site generator in library format, you write code to generate your website. For example, say you have a folder of markdown articles and you want to generate HTML pages for each of them. You tell Shikensu, through code, to look at your folder that contains the markdown. Then Shikensu scans the entire folder structure and you end up with a data structure that can be manipulated and then optionally written back to disk to, for example, get your HTML pages. You would then instruct Shikensu in code to render markdown, change the extension, wrap the file in a folder, etc.

Through the years I've written various iterations of this, but the basic idea is still the same. The latest iteration is written in Gren (Elm fork/dialect). The one before that was written in Haskell.

main : Shikensu.Program
main =
    -- 🚀
    Shikensu.program sequence CurrentDirectory

sequence : Shikensu.Task -> Shikensu.Task
sequence task =
        |> (Shikensu.withExtension "md")
        |> Task.andThen
                (\bundle ->
                        |> Shikensu.renameExtension "md" "html"
                        |> Shikensu.permalink "index"
                        |> Shikensu.renderContent renderMarkdown
        |> Task.andThen (Shikensu.write destination)

destination : Shikensu.Focus
destination =
    Relative ( [ "build" ])

Gren edition:

Haskell edition:


Electrical-wave analyser.



Electrical circuits explained.



A tiny app that shows a random quote from a given collection. This app will be made local-first somewhere in the future.




A tiny app that makes checklists and embeds them in the URL itself so it can be easily shared.