See More on GitHub

Want to see what I’ve been working on recently? Check out my GitHub!

🪵☁️ logseq-raindrop

In 2022, I created logseq-raindrop, a plugin for the Logseq note-taking app that syncs your bookmarks and annotations into your Logseq graph.

A screenshot of Logseq with the logseq-raindrop plugin window open. A Raindrop, with its highlights, has been imported into Logseq as a new page.

logseq-raindrop provides a window for importing Raindrop bookmarks and their annotations into Logseq one-at-a-time.

logseq-raindrop is written in TypeScript. Plugins run as iframes within the Logseq app, so the UI is built using Svelte.

In 2023, I began an overhaul of how the plugin works. First, by abstracting the Logseq API behind a façade (which allowed me to write a mock Logseq client for testing), and then by adding new functionality to support syncing all bookmarks to a single page. This is similar to how Omnivore’s Logseq plugin works, and was heavily requested by users.

I continue to chip away at logseq-raindrop, and I’m excited to see where it goes. I have a sense that what I’ve been building is much more than one plugin; I’ve started to think of it as a library for building connections between read-it-later apps and note-taking tools. Why have one plugin for and one for Pocket, when you could have one plugin that supports both? Or even just support a generic API for syncing bookmarks and annotations?

Of course, I best be careful — talk like this is dangerously close to Readwise’s product.

Last updated June 10, 2023.

🌊 bsflw/harbour

I created harbour to act as a proxy so that Git can use Keybase to sign git commits, instead of using GnuPG2.

It’s written in Go, and is mostly a straightforward proxy — Git calls harbour, Harbour talks to Keybase, translates back to something Git will accept. Getting Git to accept the responses was the most difficult part, as I generally had to reverse engineer the “accepted values” for different requests.

Not long after I started working on the project, Keybase was acquired by Zoom. I have no interest in trusting my secrets to a company that has proven to have a poor track record with security, so I stopped using Keybase and archived the project.

However, I’m glad I had the chance to work with Git’s internals. It was a fun challenge to translate the responses from Keybase into something Git would accept. This project, in part, was what led me to explore some other version control projects, including Gitless and jj.

Last updated June 10, 2023.

🔗 shorturl & domainator-nim

Inspired by an article I read about the Nim programming language, I decided to rewrite my existing Python project domainator in Nim as domainator-nim.

domainator generates a list of valid domain names that you could register that, using subdomains or paths, contains the string you provide. It’s automated domain hacking.

For example, if you wanted to sell a product alled “Chuckles”, you might know that “” is a valid domain. However, you could instead register “” and redirect your traffic to the /les path, giving you “” as the homepage. domainator generates a number of these domains for you. It’s a silly project, but a fun way to learn about Nim.

After working on domainator-nim, I decided to try rewriting @xmonader’s Day 7 of Nim days, which I called shorturl.

shorturl is like any other URL-shortening service, except — since it was intended to be a learning project — it has the fatal flow that all of the URLs are entirely in-memory.

Last updated June 10, 2023.