Jan. 31, 2026

There are few situations in life which offer a win-win-win outcome at low cost and without any real down side. Publishing search data is one such situation. It's good for the people searching, it's good for the people producing, and it's good for the platform.

Three hands high-fiving

Search data means aggregated anonymous data about what people typed into the search box. For example, how often a particular word is typed, and how often it appears together with other words. Search data changes over time with trends and tastes.

When you search for something you are expressing a desire. "I want X" or "does X exist?" or "I want to know more about X". You are telling the platform what you find useful, interesting, desirable, and fundamentally valuable. It is often the case that you find out the thing does not yet exist, or it exists but not in the form, features, or aesthetics you were hoping for. Sometimes you even search because you want more like the thing that already exists. Attention is a signal.

As a producer, you try to make something people want. You want to make something people want because what people want is valuable. It's either literally profitable or it's for the popularity, attention, or kudos. It's fine to make things for other reasons of course, but you put something on a searchable platform specifically because you want more people to find and use it. The challenging thing is figuring out what to make. What do people want? Not just the particular thing or category, but also users' specific interest in differentiated details such as form, features, volume, and aesthetics. A producer wants to know all this so they can give people what they want.

Platforms want transactions. They profit by taking a cut of transactions and from the popularity and attention on the platform itself. When people get what they want the value of the platform increases, attention increases, transactions increase, and the platform profits. Platforms want more people getting what they want from producers.

When search data is open, it helps all of these groups at once.

  • Producers get a detailed, updating view of what people want.
  • Producers can then fill gaps in the market by making the things people want more of.
  • Users then get what they want (what they searched for), and more of it.
  • The platform then profits as transactions and attention increase.

Sketch of a search box

If you run a platform you can create a lot of value simply by publishing search data. If you have a search box on your thing, please think about publishing anonymous aggregated search data for it. It's a rare win-win-win situation.

Note: there are obvious privacy implications and I am not advocating for publishing raw data or low-volume searches containing personally identifiable terms. Those are problems that have already been solved by platforms publishing search data, and it is possible to publish search data that is safe and private.

Dec. 9, 2025

Jsfxr Pro is a retro 8-bit sound effects generator for game developers and musicians. It's an enhanced version of the free sound effects generator at sfxr.me. To use it, you click the generators to create different sounds like power up, explosion, laser, coin, or jump. Then you can tweak the sounds using the sliders to get the exact sounds you want.

The main Pro feature is sound packs. You can organize your sounds into packs for different projects, games and game jams. The packs sync across devices, so you can access them from your laptop, phone, or wherever.

450de22d090afd18811cec8d7ea34cad.png Jsfxr Pro has been humming along for a couple of years now since I realased it at the end of 2022. People are using it every day to generate retro sound effects. Some of them sign up and subscribe for the Pro features. It's become a happy little micro-SaaS that runs itself.

Recently I spent a few weeks hacking on some new features and the update is finally out! πŸŽ‰

New Export Formats

You can now download your sounds in a few new formats, in addition to the standard WAV format:

  • OGG - I love this versatile open format. It's great for web games and smaller file sizes.
  • MP3 - This format is everywhere. It provides universal compatibility for any project.
  • SFXR - Native .sfxr files can be imported into the original desktop sfxr program.

All formats are available for individual sound downloads as well as full pack downloads. You can customize the formats that get exported in the full pack zip download - WAV, SFXR, MP3, OGG files, or all of the above.

JSON Sound Editor

For people who want precise control over their sfxr sounds, there's now a JSON editor for the sound parameters. Click "Edit JSON" in the sound editor to view and modify the raw sound data directly. You can also copy the sound data and paste it into another session or into code if you're using the jsfxr npm library. This is great for tweaking exact values or copying sounds between projects.

Export All Your Data

You can also now download a complete backup of your account from the Account page. This includes all your sound packs, settings, and preferences in a single JSON file. I like it when platforms make it easy for me to get my data out and so I wanted this for Jsfxr Pro users too.

UI Improvements

I've added tooltips to all sliders explaining what each parameter does. Thanks to Phildo211 for the suggestion. I also made a bunch of different UI tweaks and fixes to make things snappier.

So that's all the new stuff. Note that Jsfxr Pro still doesn't collect any personal data beyond your email, which you use to login. No ads, no trackers. It's completely private forever.

Check it out at pro.sfxr.me. I hope you find it useful!

As always, if you have any feedback please do let me know. Thanks for reading. πŸ™

Oct. 30, 2025

I've been working on Eucalypt, a frontend library for building small web apps with Squint-ClojureScript. It features a Reagent-compatable-ish API. I'm not implementing the full Reagent API, just a useful subset, and so I was interested in which parts of Reagent are most used.

no r/track? -- HN User

To figure this out I used GitHub as a data source, performing searches for common patterns and counting up totals.

Raw results

--- Reagent API Usage ---
require reagent.core      7656
atom                      6269
render                    3581
require reagent.dom       1664
with-let                  1114
:dangerouslySetInnerHTML  1036
cursor                    670
track                     170
wrap                      94
track!                    65
reaction                  60
unsafe-html               16

reagent-usage-chart.svg

These numbers come with caveats. Some API calls are inherently going to occur more frequently than others in a given codebase, names may be aliased in a way I didn't consider, and these are public code-bases only. I think they give interesting ballpark numbers anyway.

You can find the scripts I used on GitHub: https://github.com/chr15m/report-reagent-api-usage

My hunch that r/atom and r/render are the critical pieces of this API seem to be correct. Other parts of the API are called less often. I think for the Eucalypt API I will focus on cursor and above and I won't implement the less-used functions. Keeping the API concise adds to the goal of the library being "small" in several ways:

  • Small artifact sizes produced.
  • Small code size of the library itself.
  • Small API.
  • Small set of concerns.

At the moment I am porting the Preact test suite over to Eucalypt. If I can get all of those tests passing I'll probably cut a version one-point-oh.

Oct. 21, 2025

Two years ago I started working on Beat Maker. I thought it would take a week or two to build. Classic programmer estimate.

Beat Maker

My goal with Beat Maker was to make the best free online drum machine on the internet. A tool that gets you going fast. Simple enough for beginners and powerful enough for serious producers. I spent a bunch of time researching existing online drum machines to figure out their issues and make sure I built something that genuinely improved on them.

Besides the standard grid based beat editor Beat Maker has some unique features:

  • Procedural sample generation. Searching through folders of samples is annoying. I wanted to improve on this so I added the ability to generate new samples with a single click, giving you an infinite supply of unique one-shot drum samples.

  • Procedural beat generation. Beat Maker can generate patterns for you as a starting point for your beat. You can then edit and tweak the beat to your liking. This is great for solving the "blank canvas" problem and giving you something good to start from.

  • Advanced export options. This is where Beat Maker really shines for producers. You can export your work as:

    • A standard WAV loop
    • Individual stems (ZIP)
    • A MIDI file
    • A ZIP file with all your samples as WAVs
    • A SoundFont (.sf2) drum kit from your generated samples
    • An Impulse Tracker (.it) file for use in trackers like Renoise, OpenMPT or a Polyend
  • Sample upload. Don't like the generated samples? You can import your favorite samples to use in your beats. Or mix-and-match with both generated and uploaded.

  • Pocket Operator/Volca sync. Beat Maker can output a sync signal on the left audio channel to sync with these hardware devices for perfect timing.

  • Per-Note FX. You can add effects like volume slide, repeat, and initial volume to individual notes for more complex drum phrases incorporating flam and roll.

  • Cross-device sync. You can use Beat Maker on your phone to jot down a quick idea while you're on the go. Everything is sync'ed so when you get back on your computer you can pull up the same beats, edit them, and export to your DAW.

  • Install to home-screen. Even though it's a web app, you can add Beat Maker to your homescreen on your phone and it will then launch full screen like a native app. This is handy for power users find themselves using Beat Maker on mobile a lot.

As an old school tracker guy, I'm particularly excited about the Impulse Tracker export mode. I was surprised to discover how many DAWs (including hardware like Polyend) can import this format. Of course, you can also pull up the original Impulse Tracker on DOSBox, or the more modern re-implementation, Schismtracker for that retro experience.

By the way, the procedural sample and beat generator features are not trained on any artists or anything like that. Beat Maker uses an algorithm I built from scratch myself.

Tech

Beat Maker is a client-side web app written in ClojureScript. I've been using ClojureScript for just over 10 years now and I'm all in on it. Once you get past the initial learning curve there is nothing like the developer experience of Clojure tooling, and the community is about the most warm, intelligent, and welcoming group as you can find on planet Earth.

I also think Clojure is particularly well suited to LLM driven development. Although it's less represented in the training data, you can make up for that with good context. It's a concise, logical, and easily validated language that puts particular emphasis on the tight feedback loops using the REPL. These are all properties that play into the strengths of LLMs. You're much less likely to get a difficult to maintain ball of spaghetti from an LLM using Clojure, than you are from other languages.

The audio engine is built on a declarative audio graph using virtual-audio-graph, inspired by React's virtual DOM diffing paradigm. That makes managing the Web Audio API much cleaner. If you're building web based audio apps I highly recommend checking out this library.

I'd love for you to try out Beat Maker and let me know what you think. Every bit of feedback is useful and helps me craft a better drum machine.

You can check out the Beat Maker online drum machine on dopeloop.ai.

Oct. 2, 2025

Announcing Eucalypt! πŸƒ

This is the story of how I replaced React & Reagent with 720 lines of slop-coded Squint-cljs and got a 10kb build size. 😹

  • I wanted to enter the js13k game jam.
  • I wanted to use "ClojureScript".
  • I wanted to use "Reagent".

Is there some way I could build a <13kb artifact to satisfy the rules with these constraints? It seemed impossible.

Solution: I forked Mr Clean and slop-coded it into compiling with Squint.

Outcome: Eucalypt is a Reagent-compatible-ish Squint-cljs library for building frontends with tiny (~10kb) artifacts.

Demos: 15kb single-file HTML artifact with demos, including a port of Reagent's TODO MVC.

Tests: 90/90 Reagent-form tests pass (don't be fooled though, see below).

Try it:

npm create eucalypt myapp  
cd myapp  
npm install  
npm run watch  
npm run build

Caveats & warnings. Experimental! If you squint hard enough it looks like Reagent, but it certainly isn't. It's very much a scrappy fiddle. "Slop-coded" means this library was built by 1. creating failing test cases 2. using various LLMs to fix the code until all tests pass. I spent literally TENS of dollars on magic computer-brain credits. πŸ’Έ I did this while concentrating on other things and I haven't spent a lot of time groking the code. If this development process makes you uncomfortable (as it makes me uncomfortable) then you should probably take care when running it.

Do not be fooled by the ✨ 90/90 passing tests ✨ - it's almost certainly bug-ridden. πŸ› It's probably not for production systems, unless yeeting slop-code onto your live server is a thing at your company. It might be appropriate for small bits of frontend, demos, or gamejam entries where size is important and your particular Reagent form happens to not segfault and delete all your files. Ok, have lawyer-proofed this enough? πŸ˜…It's not my fault it was the magic computer brain your honour!

All that said, it's pretty fun being able to write Reagent-like code and stay under the magic 14kb TCP slow-start package size. It would be great to get some human eyeballs & brains on this and clean it up, find more failing Reagent forms, add more tests etc. PRs most welcome!

Assume the code is terrible and your fix will be appreciated. Note that the goal is not a one-to-one replacement for the whole Reagent API, but the 80% most commonly used (at the moment it's just r/atom and r/render and form-1 and form-2 components). I would like it to remain under-engineered and simple.

Bonus addenda: Borkdude's LLM-generated game demos:

Plot twist: I never did finish my gamejam game. πŸ˜…

πŸ™‡β€β™‚οΈ

fry-cereal.gif