‹ Back

Craft · Programming

Things I’ve
built.

Tools, engines and experiments. Some of them I made for people to use. Some I made just to find out how the thing works underneath.

There's a lot more on my GitHub, opens in a new tab.

  1. The Nock home: “Let Nock find your next customer” in large type, over a field where you drop your own domain and the row of tools it delivers into.The four of us at Hotmilk, PUCPR’s innovation ecosystem, in front of the painted wall.

    Nock

    • Next.js
    • Node.js
    • SQL
    • GEO

    B2B lead enrichment for the Brazilian market: it finds the decision-makers inside a company, enriches the contacts, runs the sequences and drops the opportunities straight into a CRM. I work across the product, and I built the blog to be accessible in a way most marketing sites are not: 99 on Lighthouse, typefaces that are kinder to dyslexic readers, and it works end to end with a screen reader.

  2. The Easy Read page: an empty box for the original text on the left, the simplified version on the right, and a reading-level scale from very easy to legalese underneath.A dense court notice on the left and its rewrite on the right, broken into short sentences and bullet points under the headings “What you need to do” and “What can happen”.

    Easy Read

    • React
    • TypeScript
    • Express
    • Claude API

    Rewrites contracts, medication leaflets and court rulings in plain language, at whatever reading level you pick, from 1st grade to university. More than half of Brazilian adults can’t fully read the paperwork that decides their lives. That is a writing problem, not a thinking one. No sign-up, nothing stored, and it reads the result out loud.

  3. The home of this site: the word PORTFOLIO in large type behind the 3D ring, stopped on the Craft face, reflected on the floor.

    Portfolio

    • Astro
    • Three.js
    • GSAP
    • Lenis

    AI helped write some parts of this one.

    This site. The home is a 3D ring you spin with the scroll, and every face opens a section through a transition that is one image cut apart in one document and put back together in the next. No UI framework and no client router. Just the browser doing what it already knows how to do.

  4. Grimoire booting in green phosphor type: “Getting the rinnegan…”, “Loading Mjölnir…”, then a prompt offering to enter or create a grimoire.A list of games returned by the listByCategory command, followed by the grimoire growing ruder at every repeat of a command that does not exist.

    Grimoire

    • Node.js
    • Express
    • Supabase

    Keep track of anything your own way: books, songs, ideas, spells. No forms, no menus, no drop-downs. You type and the grimoire answers. It boots like an old machine, types back letter by letter, and gets ruder the more commands you get wrong.

  5. The Meta No Data home: “Remova os metadados das suas fotos” in large type, next to a map of Brazil drawn out of characters, and the promise underneath that the files never leave your device.The app working on a queue of five photos: the selected one shows 187 metadata fields found and 187 marked for removal, with the pixels left untouched.

    Meta No Data

    • TypeScript
    • Web Workers
    • Vite

    AI helped write some parts of this one.

    Converts HEIC photos and strips out location, device and date before you share them. Everything happens in the browser: no upload, no account, no server. The files never leave your device. I built it because my own phone kept handing me photos I couldn’t open anywhere.

  6. The Elder Watch dashboard: a fall monitor chart where the line of ordinary movement around 1 g drops to 0.6 and then spikes past 2.4, which is the fall, above a list of scheduled reminders for blood pressure medication and lunch.The device itself, in its cardboard case, strapped with a belt to a life-size panda plush standing in for the person wearing it.

    Elder Watch

    • ESP32
    • MPU6050
    • C++
    • Telegram

    A device that stays with an elderly person and messages the family on Telegram when something happens. It knows a fall by its shape: the split second of free fall, then the impact. It also works as a panic button and a medication reminder. How long someone lies there before anyone notices is often what turns a scare into something serious.

  7. Ghosty running in the Android emulator beside its Kotlin source: the vault screen, with a red Emergency button that only answers if held down.The same app showing what everyone else sees, a working calculator, with the first-run hint that typing 1984 opens the setup.

    Ghosty

    • Kotlin
    • Jetpack Compose
    • Android

    AI helped write some parts of this one.

    A personal-safety app that looks and works like a real calculator, icon included. A hidden code opens a vault or fires a silent alert with location and recording; a second, duress code opens a convincing decoy vault for anyone forcing you to unlock it. A red panic button gives away the very thing it’s supposed to hide, so the disguise is the whole idea.

  8. The simulation running: two red cars on a dark highway, one well ahead of the other, with elapsed time, both speeds and the gap between them along the bottom edge.The setup screen: a card per car, each taking a 3D model file, a base acceleration and a starting speed, with a Rodar button below the pair.

    project_cars

    • Python
    • PySide6
    • PyVista
    • VTK

    Two 3D cars nose to tail on a straight, to see where the slipstream gain actually comes from when the cars aren’t the same size. Nothing is hand-written: drag uses the frontal area measured off the uploaded mesh, each face is colored by how hard it fights the air, and the car behind only gets relief for the part of it that fits inside the leader’s wake.

  9. All the Lynx Engine does so far, and on purpose: its own window open on a flat green field, with one sprite sitting in the middle of it.

    Lynx Engine

    • C++20
    • OpenGL
    • SDL2
    • GLAD

    A game engine built from nothing to find out what actually happens underneath a game: how a character moves, how an image reaches the screen, how time is controlled. It’s early on purpose. So far it is a window, an OpenGL context and a loop that answers the system, and that is fine: I’m doing this for the walk, not the destination.

  10. The StudySync home: the word “Sync.” over a photograph of a vaulted library reading room, with the two ways in, Instituição and Aluno, in the top corner.A subject inside StudySync, Matemática I, with its general forum open: a box to write a message, a field to attach a PDF, and buttons to show the members or switch to the admin forum.The team that built StudySync, with the professor, after presenting it in the classroom where it was marked.

    StudySync

    • PHP
    • MySQL
    • JavaScript

    One place for students to talk, instead of one group per subject scattered across Discord, Telegram and WhatsApp. Colleges post openings, students from the same institution see them, and a forum holds everything else.

  11. The test run in the terminal, section by section: pushBack, popBack, at() refusing index 99 with “Index out of range”, operator[], a size of 3 against a capacity of 4, and a copy that leaves the original untouched.

    MyVector

    • C++17
    • CMake

    std::vector rebuilt from scratch, no STL: raw pointers, manual allocation, 2x growth, deep copy, RAII, and a range-for that actually works. Written to understand what the container is doing while you’re not looking.

  12. The fill running: an outline drawing of Pikachu on white, painted yellow from a single seed pixel, the colour spreading until it fills the body and stops at the lines that close it.

    Flood Fill

    • Java

    The flood fill algorithm with the Queue and the Stack written by hand. It fills a PNG from a single seed pixel and saves every step as a frame, so you can watch the same image get painted two very different ways depending on which structure is holding the pixels.

  13. The Batalha Pokémon window choosing a fighter: nine sprites in a grid, Charmander in the middle inside the selection frame.A battle underway on a grass field, Charmander against Seel with an HP bar above each, and Flamethrower, Scratch, Rage and Slash to choose from underneath.

    Pokémon Interactive Game

    • Python
    • Pygame
    • CustomTkinter
    • Pandas

    A Pokémon battle game with a full graphical interface, built in pairs for an algorithmic reasoning course. Live data from the PokéAPI, animations in Pygame, music all the way through, and a secret hidden somewhere in it.

  14. The Amandita Gem in the game: two of them dropped on the grass in a birch forest, pale lilac with a pink streak, above a hotbar holding four stacks of the gem.

    Amandita Mod

    • Java
    • Minecraft Forge
    • Gradle

    A Minecraft mod for 1.21, built on Forge, that adds a new gem to the game: the Amandita Gem. I drew its pixel art and wrote the Java that registers it, gives it a name and a model, and puts it in the creative Ingredients tab, where it stacks to 64 like any other ingredient.

  15. The Python do Zero roadmap: forty videos across colour-coded modules, with Controle de Fluxo opened to show its four lessons: if, while, for, and a guessing game as the project that closes it.

    Python do Zero Roadmap

    • HTML
    • CSS
    • JavaScript

    AI helped write some parts of this one.

    The map for Python do Zero, the complete Python series on my YouTube channel. The whole path on one page, in order, so nobody learning it has to guess what comes next.

  16. A terminal answering from a plain directory: “sum 2 2” returns 4, “mult 2 2” returns 4, “sub 4 6” returns −2. Each one is a separate program the shell found on its own.

    cli-calculator

    • C

    Four operations, four small C programs, installed where the terminal can find them. Type “sum 2 2” anywhere and get 4. Small on purpose: it’s about compiling, installing, and making a program answer from any directory.