Portfolio
Flagship
Mappa
Compile-time mapping that stays Native AOT friendly, readable, and reusable.
A C# source generator that emits plain mapping code between types — similar in spirit to AutoMapper, but the work happens at compile time. Attributes configure the mapper without changing source or target types; missing nested maps are generated for you. Methods can live on any partial class, including static types and extension methods. Companion packages cover Google.Protobuf well-known types and MongoDB BSON. Recent releases add IQueryable projection, polymorphic mapping, reference and cycle handling, and dependency-injection registration.
Libraries
Comment TODO Analyzer
TODOs without a ticket number rot; this makes the format a compiler rule.
A Roslyn analyzer that requires every TODO comment to follow the same shape. Built-in formats are GitHub (TODO [#33] This needs to be handled.), Jira (TODO [COMMON-1234] This needs to be handled!), and plain (TODO: Should we handle this?), or a custom regex from .editorconfig. Optional rules fail the build on any leftover TODO (TA0002) or on a list of task IDs you want closed (TA0003).
PrettyCode.StringBuilder
Generated source is easier to debug when indent and directives nest and unwind themselves.
A StringBuilder wrapper for emitting formatted source. Disposable scopes handle indentation, curly-brace blocks, #pragma warning, #nullable, and #region, and restore the previous state when the scope ends.
Compilers & Interpreters
EML
Math expressions down to a two-opcode stack IR, then run or emit JS and C.
An Ada compiler and interpreter for EML (All elementary functions from a single operator), a tiny language built around eml(x, y) = exp(x) − ln(y) over complex numbers. Front ends cover math source (.mxeml), nested trees (.teml), textual stack IR (.eml), and packed binary (.beml). Pipelines preprocess, tokenize, parse, compile, and run; compile targets include .eml / .beml IR, browser JavaScript (math.js), and C (long double complex, plus a library form with a companion header). Built with Alire.
Turing machine emulators
One Turing-machine interpreter, many languages, so the idioms are comparable.
The same Turing machine interpreter written in C#, Python, C++, Go, Pascal, Ada, C, D, and Rust. Shared PowerShell scripts check toolchains, build, run a substitute-machine sample, and test every language the same way.
Brainfuck interpreters
The same cross-language exercise for a tiny language, including Erlang.
A Brainfuck interpreter in C#, Python, C++, Go, Pascal, Ada, C, D, Rust, and Erlang. The same Check / Build / Test scripts as the Turing suite, plus a hello-world runner.
Web
stefano.ie
Same Jekyll site, now living at a domain that is just my first name.
This page, now at stefano.ie. A Jekyll site on GitHub Pages: YAML-driven career, projects, and media lists, an SVG sprite, dark / light / system theme, and a GitHub Actions build on Jekyll 4 so plugins like the sitemap, redirects, cached includes, and pagination can run.
Games
Blocchi
Learn Rust and Bevy’s ECS by implementing Tetris.
Fifteen
A small C++ and SDL2 sliding-tile puzzle to practise native game setup.
Tic-tac-toe
The same kind of small game, this time to learn Ada and SDL2 bindings.
Tic-tac-toe in Ada with SDL2, built with Alire.
Connect Four
A Go and SDL2 take on the same “learn the stack by shipping a game” idea.
Connect Four in Go using veandco/go-sdl2.