Logo: Squint

Squint is a light-weight dialect of ClojureScript with a compiler and standard library. “The idea is that when you squint, it still looks like CLJS”. | Continue reading


@tonsky.me | 1 month ago

Where Should Visual Programming Go?

Visual programming and textual code should co-exist next to each other, not replace one another | Continue reading


@tonsky.me | 2 months ago

Clojure macros continue to surprise me

Clojure macros have two modes: avoid them at all costs/do very basic stuff, or go absolutely crazy. Here’s the problem: I’m working on Humble UI’s component library, and I wanted to document it. While at it, I figured it could serve as an integration test as well—since I showcase … | Continue reading


@tonsky.me | 2 months ago

Local, first, forever

We explore how to build local-first sync on top of simple file storage | Continue reading


@tonsky.me | 2 months ago

Talk: Clj-reload: A smarter way to reload code @

In Clojure, we all love the REPL. We love playing with our code and seeing results applied live without ever restarting the app. But in any project, there comes a time when your state becomes more complex than a simple set of functions. Evaluating the buffer does not cut it anymo … | Continue reading


@tonsky.me | 3 months ago

Talk: Clj-reload: A smarter way to reload code @ Clojure Berlin

In Clojure, we all love the REPL. We love playing with our code and seeing results applied live without ever restarting the app. But in any project, there comes a time when your state becomes more complex than a simple set of functions. Evaluating the buffer does not cut it anymo … | Continue reading


@tonsky.me | 3 months ago

Going to the cinema is a data visualization problem

How I build a website for choosing movies | Continue reading


@tonsky.me | 4 months ago

Humble Chronicles: Shape of the Component

Looking for an ergonomic way to define components | Continue reading


@tonsky.me | 4 months ago

Humble Chronicles: The Inescapable Objects

Why we need OOP, even in Clojure | Continue reading


@tonsky.me | 4 months ago

Podcast: Компьютеры не особо рассчитаны на людей @ Думаем дальше

Илья рассказывает, как мы просрали многозадачность, а Никита ругает консольный интерфейс Гита. | Continue reading


@tonsky.me | 4 months ago

Hardest Problem in Computer Science: Centering Things

Somehow we forgot how to center rectangles and must find our way back | Continue reading


@tonsky.me | 5 months ago

Talk: Дата и время @ Podlodka

Дата и время — не самый простой домен. То зимнее-летнее время, то часовые пояса не кратны часу. А что, если не надо привязываться к часовому поясу? Еще в чате распределенной команды написали, что митинг в 5PM, так когда подключаться? Как синхронизировать время с колонией на Марсе … | Continue reading


@tonsky.me | 5 months ago

Daylight Saving Time is a perfect test for UI designer

Unique challenges that DST presents for clock/watch designers | Continue reading


@tonsky.me | 5 months ago

Logo: Clj-Reload

Clj-Reload is smarter way to reload Clojure code during development. | Continue reading


@tonsky.me | 6 months ago

JavaScript Bloat in 2024

I was a bit out of touch with modern front-end development. I also remembered articles about web bloat, how the average web page size was approaching several megabytes! So all this time I was living under impression that, for example, if the average web page size is 3 MB, then Ja … | Continue reading


@tonsky.me | 7 months ago

New Library: clj-reload

The problem Do you love interactive development? Although Clojure is set up perfectly for that, evaluating buffers one at a time can only get you so far. Once you start dealing with the state, you get data dependencies, and with them, evaluation order starts to matter, and now yo … | Continue reading


@tonsky.me | 7 months ago

In Loving Memory of Square Checkbox

This is a checkbox: It’s square, it has a checkmark inside, and its distinguishing feature is that you can select any number of them at the same time: Different operating systems rendered them differently during their evolution: macOS Sonoma (2023) OS X Mavericks (2013) OS X Le … | Continue reading


@tonsky.me | 7 months ago

Talk: Как разрабатывают Open Source и ЧТО ЭТО ТАКОЕ @ АйТиБорода

Что такое Open Source, как тут программировать и получать опыт, как зарабатывать и стоит ли вкатываться | Continue reading


@tonsky.me | 8 months ago

Logo: London Clojurians

London Clojurians is an open and friendly community that supports the adoption and practice of Clojure in any of its forms. | Continue reading


@tonsky.me | 8 months ago

Talk: Desktop GUI Made Easy @ London Clojurians

Introduction to Humble UI, a new JVM Clojure library for desktop GUI applications. Why is it needed, how is it implemented, how deep is the rabbit hole, who could it be useful to, and what can you build with it? | Continue reading


@tonsky.me | 8 months ago

Humble Chronicles: Managing State with VDOM

This post follows the implementation of VDOM for Humble UI. We look at various aspects of the problem, weigh our options, and decide on the solution. In some cases, it’s not clear how to proceed, so we just state the problem. Follow along if you are curious about how the sausage … | Continue reading


@tonsky.me | 9 months ago

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 months 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 | 11 months ago

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

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


@tonsky.me | 11 months 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 | 11 months 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 | 1 year 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 | 1 year 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 | 1 year 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 | 1 year 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 | 2 years 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 | 2 years 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 | 2 years 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 | 2 years ago

Humble Chronicles: Developer Experience

Using Humble UI from the REPL | Continue reading


@tonsky.me | 2 years ago

Humble Chronicles: The Layout

Humble UI approach to layout | Continue reading


@tonsky.me | 2 years ago

Humble Chronicles: Decomposition

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


@tonsky.me | 2 years ago

Sublime ❤︎ Clojure

New Sublime Text plugin for working with Clojure | Continue reading


@tonsky.me | 2 years ago

Clojure Sublimed Logo

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


@tonsky.me | 2 years ago

EQL Logo

Continue reading


@tonsky.me | 2 years 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 | 3 years ago

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

4-day coding marathon | Continue reading


@tonsky.me | 3 years ago

JWM Logo

Continue reading


@tonsky.me | 3 years ago

Building an ultimate writing machine from Sublime Text

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


@tonsky.me | 3 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 | 3 years ago