Things I've built.
Projects
-
2023-2026
moOS — 32-bit x86 operating system that runs Doom
A 32-bit x86 operating system written from scratch in C and assembly. It boots with its own two-stage bootloader or with Limine, and runs preemptively scheduled ring-3 ELF programs from a FAT16 disk with long file names, each in its own 64 MB paged address space with its own FPU state, talking to the kernel through checked int 0x80 system calls. The scheduler switches at runtime between round robin, fixed-priority real time with named mutexes and priority inheritance, and earliest deadline first for periodic tasks that count their missed deadlines. On top sits a user-space shell with pipes, redirection, job control, history and tab completion, a standard C library I wrote for it — and, built against that libc and drawn through VGA mode 13h, Doom. The same libc is enough for tcc, the Tiny C Compiler, which I ported so moOS compiles and links C programs on itself, a hello world in about 200 ms. A QEMU test suite drives the shell, builds programs with tcc on moOS and checks the disk image with fsck.fat afterwards.
moOS now boots into a desktop in the style of Apple II DeskTop, drawn on the 640x480 black and white VGA mode 11h with a PS/2 mouse driver (and QEMU's vmmouse for absolute positions) underneath: draggable folder windows, a trash, a calculator and a clock, a text editor with vim bindings, and shell windows that run the shell over pipes. I built the kernel side for it — the graphics mode, the mouse drivers and the system calls — and used AI to implement the desktop itself. With the editor, a shell window and tcc, you can write, compile and run C without leaving moOS.
bootloader → kernel bring-up, in order -
2026 · in development
tangle — why is this package in my Yocto image?
A Rust tool, with a CLI and an egui desktop GUI, for exploring BitBake dependency graphs. It bundles a Yocto build's task-depends.dot, image manifest, pkgdata, licences and variables into one archive, then answers questions about it: why a package is in the image (the shortest build-time or runtime path), what would leave with it if it were dropped, what changed between two builds, which recipes and tasks bound the build time, why tasks reran instead of coming from sstate, and where a variable or PACKAGECONFIG option got its value. A check mode fails CI when a banned package is installed. The parsers and queries live in a core crate with no I/O, so the CLI and GUI share the same code.
In development, for personal use for now.
-
2024-2025
pp — Linux runtime analysis & debugging tool
A Linux process instrumentation and debugging tool in modern C++23. Using ptrace it attaches to a running process to read and write its memory, search and replace byte patterns, change region permissions, and inspect threads and registers, resolving functions by parsing the target's ELF symbol tables by hand. It disassembles with Capstone and — the part I'm most pleased with — injects a shared library into a live process by resolving dlopen inside the target's own libc and calling it from under ptrace, so the loader maps the library and runs its constructors as if the process had asked for it. It was my bachelor's thesis, and the project I'd point to first.
pp inject <pid> <library.so>, step by step -
2024-2025
ftv — hide an encrypted file inside a video
"File to video": a C++23 tool that hides an encrypted file inside an ordinary-looking video. The password goes through Argon2id with a random salt, and the file's name and contents are encrypted with AES-256-GCM through OpenSSL's EVP API. The ciphertext is then split into Reed-Solomon (255, 223) codewords and interleaved, so damage to part of a frame, or a whole frame, is spread thinly across every codeword and repaired. Behind a header with its own parity, every bit becomes a black or white square of 1–8 px written into frames with OpenCV — bigger squares hold less per frame but survive lossy compression better. Decrypting detects the block size, repairs errors and decrypts; a wrong password or unrepairable damage is reported, never silently ignored. My most cryptography-heavy project.
ftv encrypt <file> -o <video> -k <key> -
2024-2026
cutils — C23 containers and allocators
A C utility library written in C23 with embedded targets in mind: no heap required, every size calculation overflow-checked, and each module can be left out of the build. It covers a vector, linked list, red-black-tree map with range queries, open-addressing hashmap, ring-buffer queue, binary-heap priority queue, stack, bitset, a growable string with printf-style formatting, and an expected type for errors. Every container takes a pluggable allocator interface — with arena, fixed-block pool, and static-pool allocators provided — alongside a millisecond clock with a swappable time source for bare metal. The library I reach for whenever I write C.
one interface, three backends, no heap required -
2024
gnss-imu-fusion — GPS + IMU position estimation
Position estimation and short-term prediction for a Raspberry Pi 4 carrying a u-blox MAX-M10S GNSS receiver and an Xsens MTi-630 IMU. It parses NMEA sentences and Xbus/MTData2 packets by hand, projects fixes into UTM metres, and fuses 1 Hz GPS with 100 Hz acceleration in a Kalman filter: every IMU sample predicts the state forward, every GPS fix corrects it, and fixes that disagree too much are rejected by a chi-square gate. A Gazebo simulation drives a vehicle through a figure-eight and scores a "ghost" predicted one second ahead against the true pose — with 1.5 m of GPS noise it lands within 0.69 m on average, against 2.09 m for the raw fix extrapolated the same way.
two sensors, one queue, one filter -
2023
darkroom — image processing library in C
A small image processing library in C with a command-line tool on top, depending on nothing beyond the C standard library and libm. It reads and writes 24-bit BMP files by hand and implements colour operations, box and Gaussian blur, sharpening and unsharp masking, Sobel, Prewitt, Scharr and Laplacian edge detection, emboss, and bilinear resize, crop, flip and rotate — all built on a general convolution routine that takes any odd-sized kernel. A small command-line tool chains these operations on top.
one convolution routine, any odd-sized kernel -
2023
jet_fighter — Atari 2600 game in 6507 assembly
A playable Jet Fighter clone written entirely in 8-bit 6507 assembly, running within the Atari 2600's 128 bytes of RAM. Assembled with dasm and tested on the Stella emulator — an exercise in doing a lot with almost nothing.
-
2023-2024
web_crawler — multi-threaded web crawler
A multi-threaded web crawler with a WPF desktop interface. Up to ten concurrent workers crawl outward from a root URL — depth-first or breadth-first, chosen by swapping the frontier data structure — record every discovered URL in SQL Server, and export to CSV. A companion Python script renders the crawl as an interactive graph. An earlier project from my second bachelor year; I'd build parts of it differently now, and it lives here for breadth.
up to ten spiders, one swappable frontier -
2022-2023
food_classification_website — food recognition from a photo
A web app that identifies a dish from a photo across the 101 categories of the Food-101 dataset, using an EfficientNet model fine-tuned in PyTorch and served through a Django site with image upload, prediction results, and a history of past predictions. Built with a friend during an Erasmus+ exchange at AGH Krakow — a good example of getting a trained model off the notebook and into something people can actually use.
photo → tensor → EfficientNet → top-5