Frontend
I write interfaces in TypeScript on React and style them with Tailwind, from websites to panels. Plain JavaScript stays where the browser is enough on its own, like on this site, which has no build step at all.
-
TypeScript
3 152 617 lines
- My main language: React frontends, Node.js and Express backends, panels and apps. Almost half of the code in my repositories is TypeScript.
-
JavaScript
144 036 lines
- Browser interactions and animations, like on this site written in plain JS. In bigger projects TypeScript takes its place.
-
TailwindCSS
- The standard in my frontends, from websites to panels.
-
React
- The base of my frontends and panels, and through React Native also the Plazer apps.
Outside the daily set: Bootstrap (responsive UI, since replaced by Tailwind), Vue (a UI framework), Angular (a frontend framework).
Backend and APIs
Most backends are Node.js with Express and Prisma. Go comes in where performance and simplicity matter, like in Plazer and the Lunatic Chess server. PHP runs the backend of this site, and Python does scripts, bots and monitoring.
-
Go
343 647 lines
- The Plazer messenger backend, the Lunatic Chess game server and smaller online games. I reach for it where performance and simplicity matter.
-
PHP
130 914 lines
- The backend of this site, an online shop on a custom micro-framework and customisation of the Pterodactyl panel.
-
Python
85 699 lines
- Scripts and automation for server work, Discord bots and a service monitoring backend.
-
Java
13 788 lines
- The statistics server behind the numbers on this site, and a booking platform in Spring Boot.
-
Node.js
- Node.js and Express backends with Prisma, behind most of my panels and websites.
-
FastAPI
- The backend of the VulCode service monitoring.
-
Laravel
- Customisation of the Pterodactyl panel, which is built on Laravel.
-
Symfony
- The Symfony components that Laravel builds on inside the Pterodactyl panel.
Outside the daily set: ASP.NET Core (.NET APIs), Flask (smaller Python services), Django (large Python web apps).
Systems and low level
Rust gets the things that have to be fast and under full control of memory: the Flaem core, the Gyred server and the vulp terminal app. Elixir on OTP keeps an eye on Flaem nodes. At the very bottom is a hobby operating system in C, with assembly startup code, that boots in QEMU.
-
Rust
1 171 412 lines
- The core of the Flaem hosting platform, the Gyred server and the vulp terminal app. I pick it where I need full control over memory and performance.
-
Elixir
105 343 lines
- The OTP-based node supervision in Flaem and an in-memory key-value server that speaks the Redis protocol.
-
C
49 346 lines
- A hobby x86_64 operating system that boots in QEMU, with its own scheduler and user mode.
-
Assembly
397 lines
- The startup code of my operating system, which switches the CPU into 64-bit mode.
Mobile apps
For phones I write native: Kotlin on Android, Swift on iOS. Kotlin also got a relational database engine of my own, and Swift a Scheme interpreter.
-
Kotlin
206 250 lines
- Native Android apps, a relational database engine of my own and a small scripting language.
-
Swift
116 812 lines
- Native iOS apps and a Scheme interpreter.
Games, modding and graphics
It started with games: C# plugins for SCP:SL servers that grew into Nebula. Today it is Lua scripts for Lunatic Chess, a voxel engine in C++, and the graphics, models and editing around what I make.
-
C#
162 872 lines
- SCP:SL plugins that grew into Nebula, a homelab dashboard in Avalonia and retro console emulators written from scratch.
-
C++
57 275 lines
- A voxel game engine with its own renderer.
-
Lua
32 053 lines
- A roguelike game with a bestiary and gear, plus the piece and map scripts in Lunatic Chess.
-
Photoshop
- Raster graphics.
-
Da
DaVinci Resolve
- Video editing.
-
Blender
- 3D modelling and rendering.
Outside the daily set: Unity (a game engine), Godot (an open source game engine), Unreal Engine (3D games).
Databases
SQLite through Prisma by default, because a smaller project needs nothing more. When a project grows, like Plazer and Flaem, PostgreSQL comes in and Redis acts as the cache. MySQL stayed from hosting panels and Pterodactyl.
-
MySQL
- The database behind the Pterodactyl panel and hosting panels.
-
SQLite
- The default database for smaller projects and panels on Prisma.
-
JSON
- The data interchange format, including between my statistics server and this site.
-
PostgreSQL
- The database behind Plazer and Flaem, when a project needs more than SQLite.
-
Redis
- The cache in Plazer and Flaem.
Outside the daily set: MongoDB (document NoSQL database), ClickHouse (real-time analytics), Cassandra (distributed, high availability).
Infrastructure and tools
Almost every service of mine runs in a container on Docker Compose, behind Nginx as the reverse proxy. I manage over a hundred repositories with Git and vulp, and write code in VS Code.
-
Git
- The foundation for working on over a hundred repositories, managed together with vulp.
-
Docker
- Almost every service of mine runs in a container, usually on Docker Compose behind Nginx.
-
Nginx
- The reverse proxy in front of every service on my servers.
-
VS Code
- My main code editor.
-
Visual Studio
- An IDE for C# and .NET.
Outside the daily set: Kubernetes (orchestration at scale), Grafana (metrics dashboards), JetBrains IDEs (JetBrains IDEs).
Out of curiosity
Languages where I built one specific thing to understand how it works inside: a key-value store in Zig, a SAT solver in Haskell, an exchange in Solidity, a language of my own in F#.
-
Dart
6 013 lines
- A spreadsheet engine with its own formula language.
-
Solidity
4 688 lines
- A decentralised exchange with liquidity pools, staking and a timelock.
-
Ruby
37 655 lines
- A web framework of my own built only on the standard library, with WebSocket support.
-
Zig
44 583 lines
- An embedded key-value store with a write-ahead log.
-
Haskell
3 609 lines
- A SAT solver with a formula parser and propositional logic tools.
-
Scala
3 133 lines
- A simple chess engine.
-
F#
3 017 lines
- A small, statically typed ML-family programming language written from scratch.