A pure symbolic stack language ā all syntax is punctuation, no alphanumeric keywords.
An esoteric language with lunar/poetic syntax that compiles to C, featuring strong typing and imperative programming constructs.
An esoteric stack-based language that compiles to C via a Python compiler, using only numbers and punctuation.
Use atproto to write a record because you can
Ewan's personal package monorepo ā language-agnostic workspace with TypeScript, Rust, and Python packages.
An early Python experiment ā unmaintained and kept for historical interest.
Automatically update your Bluesky avatar (and banner) every hour based on the time of day.
Generate 24 sky-gradient images (one per hour) for use as Bluesky avatars or banners.
A Bluesky bot that generates and posts Markov chain text based on a source account's posts. Unmaintained.
An AI-powered Bluesky bot that uses a local Ollama model to generate posts in the style of a source account.
A Mastodon bot that generates and posts Markov chain text based on a source account. Unmaintained.
A Python script that converts a string of text into a pixel art image with per-character colours. Unmaintained.
Python tool for analysing .docx files and generating essays using a local Ollama model ā now part of the @ewanc26/pkgs monorepo.
I recently came back to an idea I started playing with back in January: sticking a game into the Jupyter notebook interface. The key problem to solve here is that, while Jupyter is designed to run the code you see and explain it, for game purposes I want the code to do the opposite: control the interface itself (and do so while being at least lightly obfuscated from the user). Adding, Running, and Removing Cells With IPyLab IPyLab has been a great (and really fun) tool for this purpose. You c
There are a lot of tutorials out there for running a gunicorn server on systemd, but I wasn't able to find one that actually told me how to do so in selinux. Since I'd never used selinux before, this relatively simple task turned into hours of trial and error, but my loss is your gain. YMMV dependent on how custom your selinux setup is, but this worked for me: Assuming your project is in /www/myproject: /www/myproject/gunicorn_config.py: bind = 'unix:/run/gunicorn.sock' worker_class = 'sync'
I've slowly been getting more familiar with uv and the broader new school of python packaging ecosystems (sorry, I used virtualenv for a long time, it does the job fine), and one of the most exciting things to me is its use of dependency groups in a pyproject.toml file: finally, a non-janky way to use different packages in different environments. However, I think its documentation leaves a bit to be desired on this front, so I wrote down a few commands I find myself using regularly. To add a pa
It's Friday, my dudes. It has been an extremely long week in the world and for me, so here's some links I enjoyed this week. Despair-Driven Development - Makes the argument for despair as a driver for positive change, since action gives you respite from it. My personal experience of despair in the workplace has not been that it makes me more productive, but I guess I have occasionally been motivated to do things out of sheer spite. Worth considering. Dither Me This - Fun little web dithering t
This is documented piecemeal elsewhere, but I ran into enough small issues as a WSL user that it seemed worth writing up, and while django-vite is a cool tool I think it assumes a lot of domain knowledge that new users may not have. Though I've been a fan of the HTMX minimal dependencies philosophy for a while, I am accepting the necessity of having some degree of JavaScript build pipeline: even if you're keeping all your logic on the back-end, there are plenty of things it's preferable to be a
I've been playing around with the idea of using Jupyter notebooks as a narrative game interface for a while, and finally got around to doing some prototyping this week. One thing I really wanted to do was require users to run code cells in Jupyter to unlock story beats: Jupyter notebooks are usually presented as a step-by-step tutorial, which is perfectly fine if you're trying to teach someone how to run a linear regression in sklearn but less so if you're trying to build suspense over the cours
Code needs structure output