Everything started with QBasic

From QBasic in 8th grade to full-stack software developer at a multi-million-dollar company.

Find me on
Blue Microsoft QBasic 1.0 editor with a recreated number guessing program shown in the editor.
High schoolLiceu Passos Manuel

Learning what happens inside

At Liceu Passos Manuel, my IT professional course taught me the theory behind the code: how programs are structured, how data moves through them, and why they behave the way they do.

42 Lisboa

Where code became my responsibility

42 has no teachers or lectures. You receive a project brief, build it in C, and put it through a demanding evaluation. Peers try to break it, automated tests check it, and any memory leak or crash means failure. Every project I submitted passed.

42 LisboaProject-based, peer-evaluated software engineering school.
  • Peer evaluated

    Fellow students read the code, run it, and try to break it. Then the automated grader does the same.

  • Zero leaks

    One leaked byte under Valgrind and the project fails. No exceptions.

  • Zero crashes

    Segfaults, undefined behaviour, and bad inputs all count as a fail.

  • Strict norm

    25-line functions, 5 functions per file, and no forbidden calls.

Shipped through this process:cub3D · minishell · so-long · philosophers · push-swap · libft · get_next_line · ft_printf

A 600 × 600 map
broke the recursion.

A Cub3D map must be fully enclosed by walls. A common check is recursive flood fill: start at the player, visit every neighbour, and fail if the search reaches the outside. On a large map, that can produce hundreds of thousands of nested calls and overflow the stack before the check finishes.

My fix: don't walk the map. Check each floor tile once against its neighbours. If any of them is outside, the map is open. Constant memory, one pass, same answer.

See Cub3D

Look at every floor tile once. If any of its 8 neighbours is outside the map, the map is open. No recursion, no stack, one pass.

wallfloorvoid (outside)touches void
No tile touches the void. Map accepted.
Same result, constant memory. This is the check I shipped in Cub3D.
$ valgrind --leak-check=full ./minishell
==4242== HEAP SUMMARY:
==4242==   in use at exit: 0 bytes in 0 blocks
==4242== All heap blocks were freed -- no leaks are possible
  • cub3D0 bytes lost
  • minishell0 bytes lost
  • so-long0 bytes lost
  • philosophers0 bytes lost
  • push-swap0 bytes lost
Every project above had to pass Valgrind with zero bytes lost.

Getting to
zero leaks.

Valgrind cleanNo crashes5 projects

At 42, every project is checked with Valgrind during evaluation. One leaked byte, a double free, or a crash on bad input is enough to fail. In minishell, I tracked down roughly a hundred leaks in execution, pipes, redirections, and signal handling before the report came back clean.

That work changed how I write C. I decide who owns each allocation, where it is freed, and how the program cleans up when something goes wrong.

Read the minishell case study
My own time

Learning the web with a jokes app.

Outside the curriculum, I built a jokes app to teach myself the web stack. It uses a Rails API with SQLite and a React client. I set up the database, routing, and deployment as part of the same project.

ReactRails APISQLite
GET /jokes/random

Why did the developer go broke? They used up all their cache.

200 · application/json
This demo uses a local sample response.
Aug – Aug 20256 months · LMSI - Engineering, S.A.

Six months working on internal software.

During my six-month internship at LMSI - Engineering, S.A., I worked on internal management software used by more than 100 people each day. My work included AI agents, an AI-assisted deployment flow, and dozens of smaller fixes based on user feedback. It was my first experience maintaining software people used in their daily work.

100+daily users
3highlights
6months
90%less manual deploy work
01 / 03

AI agents

I built AI assistants for repetitive tasks in the management software.

LMSI - Engineering, S.A. · internal management software · Feb 2025 – Aug 2025.
Now

Still building.

I'm building webserv, an HTTP/1.1 server written in C++ from raw sockets: non-blocking I/O, request parsing, static files, CGI, and an nginx-style configuration. Alongside it, I'm working through 42's C++ module track. I'm open to full-stack and backend roles in Lisbon or remote.

webservC++ 98 · HTTP server · In progress
$ curl -i http://localhost:8080/
HTTP/1.1 200 OK
Server: webserv
Content-Type: text/html
Content-Length: 128
  • poll()-driven non-blocking I/O
  • HTTP/1.1 request parsing
  • GET, POST, DELETE
  • Static files and directory listing
  • CGI execution
  • nginx-style config file
Open the repository
Selected work

The work
behind the story.

Full project archive

01Cub3D

C · MiniLibX
An illustrative raycast corridor.
Turn
A live raycaster that turns wall distance into wall height using one ray per column. This is an illustration, not a project screenshot.

A raycasting engine in the style of Wolfenstein 3D, built with Vasco. My part was parsing and map validation, including the boundary check that replaced recursive flood fill on large maps.

Completed · Zero leaksRepository

02minishell

C · Unix processes
minishellIllustrative session
minishell $ printf 'learn\nbuild\n' | wc -l
2
minishell $ export SUBJECT=ownership
minishell $ echo "$SUBJECT"
ownership
minishell $ printf 'still building' > notes.txt
minishell $ cat notes.txt
still building
minishell $ 

A Unix shell, built with Guilherme. I handled execution, pipes, redirections, signals, and memory cleanup. Evaluated leak-free under Valgrind.

Collaborative · Zero leaksRepository

03so-long

C · MiniLibX
Moves: 0Collectibles: 0/3Exit locked
map.ber · what the parser reads
1111111111
1P00100C01
1010100101
10C0000101
1011100C01
1000E00001
1111111111
P player · C collectible · E exit · 1 wall. The map must be closed, rectangular, and every C and the E reachable from P.

A small tile-based game. Map validation, reachability, rendering, and a game loop.

Completed · 100/125Repository

04philosophers

C · pthreads

Five minds.
Five forks.

The dining philosophers problem: five threads share five forks (mutexes). To eat, a philosopher needs the fork on each side. Then they sleep, then think, then try again. Anyone who goes time_to_die ms without eating dies, and the program must notice within 10 ms.

  • ring fills as hunger grows
  • holding two forks, eating
  • faded, sleeping
  • died
$ ./philo 5 800 200 200

Output appears here: <ms> <id> <event>
Press a button to run.
Arguments are philosophers, time_to_die, time_to_eat, time_to_sleep in ms. Played at ⅓ speed.
Portrait credits

Socrates: Eric Gaba, CC BY-SA 2.5. Plato: Wellcome Collection, CC BY 4.0. Aristotle: Ktrepas, CC0. Epicurus: ChrisO, public domain. Zeno: historical engraving, public domain. View sources

Five threads share a table, forks, and time. Mutexes coordinate access without data races.

Concurrency · No racesRepository

05push-swap

C · Algorithms
Five unique integers. Range 1–50. Illustrative ordering.

Sorting integers through a constrained set of stack operations in as few moves as possible.

AlgorithmsRepository

06Jokes app

Rails · React · SQLite
ReactRails APISQLite
GET /jokes/random

Why did the developer go broke? They used up all their cache.

200 · application/json
This demo uses a local sample response.

A Rails API and a React client for creating, browsing, and requesting jokes.

Side project · Full stackRepository

C++, one module at a time.

42's C++ track is a sequence of peer-evaluated exercises with the same strict norm and zero-leak requirement as the C projects. I completed modules 00–04, covering classes, references, operator overloading, inheritance, and subtype polymorphism. I now use those concepts in webserv, the HTTP server above.

  1. Module 00Namespaces, classes, member functions, static and const
  2. Module 01Memory allocation, pointers to members, references
  3. Module 02Ad-hoc polymorphism, operator overloading, Orthodox Canonical Form
  4. Module 03Inheritance
  5. Module 04Subtype polymorphism, abstract classes, interfaces

More foundations and guided builds Browse the archive