Podcast: Escaping Software Disenchantment @ Software Unscripted

Richard talks with Nikita Prokopov about some of the reasons he'd felt a sense of disenchantment with the direction of software in the past, and strategies he's developed for improving things in the future. | Continue reading


@tonsky.me | 10 days ago

New Library: Simple Router

Simple story, really. I wanted an HTTP router for Clojure that is order-independent and allows for overlapping routes. I didn’t find one, so I had to write my own. Order-Independence If your app is any big, it probably has modules. Each module defines its own routes. So how do … | Continue reading


@tonsky.me | 1 month ago

Рендеринг текста @ Podlodka

Преобразования, которые происходят с текстом для его отображения на экране | Continue reading


@tonsky.me | 1 month ago

The Absolute Minimum Every Software Developer Must Know About Unicode in 2023 (Still No Excuses!)

Twenty years ago, Joel Spolsky wrote: There Ain’t No Such Thing As Plain Text. It does not make sense to have a string without knowing what encoding it uses. You can no longer stick your head in the sand and pretend that “plain” text is ASCII. A lot has changed in 20 years. In … | Continue reading


@tonsky.me | 1 month ago

A case for ClojureScript 2.0

I was complaining the other day about the ergonomics of ClojureScript and realized an interesting thing. Quick context: Clojure is a modern Lisp. ClojureScript is a Clojure dialect that compiles to JS. From its very beginning, it relied on the Google Closure compiler in an el … | Continue reading


@tonsky.me | 5 months ago

Humble Chronicles: Managing State with Signals

After the previous post, I figured that the best way to decide on the direction for Humble UI is to make an experiment. And I did. I implemented a reactive/incremental computation engine (signals) and wrote a simple TodoMVC in it. Following are my thoughts on it. Signals The idea … | Continue reading


@tonsky.me | 6 months ago

Humble Chronicles: State Management

Recently I’ve been trying to improve state management and component API in Humble UI. For that, I’ve tried to read and compile all the possible known approaches and synthesize something from them. I haven’t decided on anything for Humble UI yet, let’s say I’m in an experimenting … | Continue reading


@tonsky.me | 7 months ago

Adventures in REPL implementation

It’s a strange thing to announce, but I wrote Clojure plugin for Sublime Text. Again. I mean, the previous version worked fine, but it had a few flaws: REPL depended on syntax highlighting (yikes!), the whole implementation was in a single file, it was hard to add REPLs. So, … | Continue reading


@tonsky.me | 8 months ago

GMTK Game Jam 2022: Dice Out

I’ve made a game! Well, a small one and in just 48 hours, but still a game. You can play it in the browser: Here are my observations. Game engine Using a game engine helps a lot. It solves a lot of problems that you don’t want to deal with in 48 hours or, probably, never. I ch … | Continue reading


@tonsky.me | 1 year ago

Ideas for Clojure Network Eval API

Jack Rusher is asking for nREPL feedback from Clojure tooling authors: After implementing an nREPL server for a new Clojure runtime, I’m begging the other tools maintainers to work with me to define an actual standard that works.🥹 Since I am also a tool maintainer AND … | Continue reading


@tonsky.me | 1 year ago

Ideas for DataScript 2

No, I am not working on second version. This is just a list of ideas based on 8 years developing DataScript and 3 years building web-applications with it full-time. Maybe you’ll find inspiration in these? Feel free to borrow anything you like! UUIDs for entity IDs Makes it easier … | Continue reading


@tonsky.me | 1 year ago

Forbidden West and the Art of Editing

Horizon: Forbidden West seems like a great game: fantastic design and art direction, great music. Only one thing falls short: cut scene editing. In this article, we’ll analyze one particular cut scene, discuss every mistake, and step by step edit a better version of it. The probl … | Continue reading


@tonsky.me | 1 year ago

Humble Chronicles: Developer Experience

Using Humble UI from the REPL | Continue reading


@tonsky.me | 1 year ago

Humble Chronicles: The Layout

Humble UI approach to layout | Continue reading


@tonsky.me | 1 year ago

Humble Chronicles: Decomposition

Overall shape of Humble UI project, a Clojure UI framework | Continue reading


@tonsky.me | 1 year ago

Sublime ❤︎ Clojure

New Sublime Text plugin for working with Clojure | Continue reading


@tonsky.me | 1 year ago

Clojure Sublimed Logo

Clojure Sublimed is a Clojure development environment for Sublime Text. | Continue reading


@tonsky.me | 1 year ago

EQL Logo

Continue reading


@tonsky.me | 1 year ago

clj-commons Logo

Continue reading


@tonsky.me | 2 years ago

Sublime Clojure Logo

Continue reading


@tonsky.me | 2 years ago

The myth of Apple-patented PPI

A non-comprehensive and opinionated guide to best monitor for programming | Continue reading


@tonsky.me | 2 years ago

Python as a build tool

Why Skija and JWM use Python instead of existing build tool | Continue reading


@tonsky.me | 2 years ago

Thoughts on Clojure UI framework

Ideas and inspirations for new Clojure framework for desktop apps | Continue reading


@tonsky.me | 2 years ago

Zig, Skia, Clojure, Geometry and the Japanese TV Show: ICFP Contest 2021

4-day coding marathon | Continue reading


@tonsky.me | 2 years ago

JWM Logo

Continue reading


@tonsky.me | 2 years ago

Building an ultimate writing machine from Sublime Text

My setup for long-form writing in Sublime Text | Continue reading


@tonsky.me | 2 years ago

Font size is useless; let’s fix it

What happens when you set fontSize: 32 in your favorite editor | Continue reading


@tonsky.me | 2 years ago

Emoji under the hood

Detailed look into all the machinery involved in rendering Emoji | Continue reading


@tonsky.me | 2 years ago

Phil Libin: Find a new way to ski

Brief transcript of What I Know podcast with Phil Libin on entrepreneurship | Continue reading


@tonsky.me | 2 years ago

DuckDuckGo logo redesign

Continue reading


@tonsky.me | 2 years ago

Macs and 4K 120Hz displays compatibility list

Macs/4K 120Hz displays compatibility list | Continue reading


@tonsky.me | 2 years ago

Graphics for JVM

Introducing Skija, Java bindings for Google graphics library, Skia | Continue reading


@tonsky.me | 3 years ago

People expect technology to suck because it actually sucks

I get at least 27 tech annoyances on a single day | Continue reading


@tonsky.me | 3 years ago

The most important feature of Sublime Text

is that it doesn’t change | Continue reading


@tonsky.me | 3 years ago

New service: UX Consulting

Continue reading


@tonsky.me | 3 years ago

Cognitect, please stop adding alpha to your namespaces

Why putting alpha in your project name does more harm than good | Continue reading


@tonsky.me | 3 years ago

Time to Upgrade Your Monitor

A non-comprehensive and opinionated guide to best monitor for programming | Continue reading


@tonsky.me | 3 years ago

Computers as I used to love them

File synchronization can be fun and painless if you don’t have to deal with corporate bullshit. | Continue reading


@tonsky.me | 3 years ago

Cleaning up the IntelliJ Idea form UI

Simple tips on fixing small details in UI | Continue reading


@tonsky.me | 3 years ago

Avoid catch-all utils namespace

Cleaning up and organizing single-file utils namespace | Continue reading


@tonsky.me | 3 years ago

Performance First

“Premature optimization being the root of all evil” is the root of all evil | Continue reading


@tonsky.me | 3 years ago

SwiftUI Defaults Considered Harmful

A few notes on SwiftUI and why UI frameworks should not try to be “smart” | Continue reading


@tonsky.me | 3 years ago

My web app died from performance bankruptcy

Chrome team breaks existing web to make Chrome perform better | Continue reading


@tonsky.me | 3 years ago

Good times create weak men

Software abstraction ladder becomes too tall and starts to fall | Continue reading


@tonsky.me | 3 years ago

Software Disenchantment

Everything is going to hell and nobody seems to care | Continue reading


@tonsky.me | 3 years ago

Medium is a poor choice for blogging

If you think about publishing an article, starting a blog or even just sharing a short rant on Medium, please consider what you’ll be putting your readers through. | Continue reading


@tonsky.me | 3 years ago

Grumpy chronicles: Pedestal and routing

Migrating a web app from Ring to Pedestal | Continue reading


@tonsky.me | 4 years ago

Grumpy chronicles: deps and uberdeps

Building uberjar from deps.edn | Continue reading


@tonsky.me | 4 years ago