Portfolio
Things I shipped, and the posts that prove it
Almost everything I build starts with something annoying me. Then I fix it, put the code on GitHub and write a post about it, so most of what's here comes with a receipt: a live site, a repo, or a write-up on this blog. The day jobs are here too, minus the internal stuff I can't share.
- years building for the web, since 2007
- 19
- projects on this page
- 21
- blog posts, each one in English and Portuguese
- 104
Rarely just one thing at a time
There was almost always a day job, a business and a side project running at the same time. Some years, also a trip to E3.
Scroll sideways to see all of it.
Day jobs
My own business
Side projects
Writing & games press
The big ones

What annoyed me: Paying a monthly fee to log a squat.
Musclog
2024 to todayAn offline-first workout and nutrition tracker. No servers, no account, no subscription. It's my main open-source product, on Google Play and on the web from the same codebase.
- React Native and Expo Router, with WatermelonDB on top of SQLite on Android and LokiJS on the web.
- Real food databases (USDA and Open Food Facts), barcode scanning, and OCR for nutrition labels.
- Weight, body fat and nutrition encrypted at rest, with a key that never leaves the device.
- Ported to a real Game Boy Color cartridge in C with GBDK-2020: no floats, no malloc, 517 foods packed into ROM banks.
- Counts barbell reps from a €20 Bluetooth sensor with a random forest exported to plain JavaScript, published as a work in progress.
- React Native
- Expo
- TypeScript
- WatermelonDB
- SQLite
- C
On the blog:

What annoyed me: A blog is a lot of clicking and reading.
pablo.gg, the game
2021A top-down RPG version of this blog. It started as a Konami Code easter egg and escalated into a Phaser and React template with a dialog box drawn over the canvas.
- Phaser 3
- React
- grid-engine
- Tiled
On the blog:

What annoyed me: Tailoring my resume for every job listing.
Resume Builder
2018 to todayBuilds a resume from a spreadsheet or from a form generated out of the JSON Resume schema. A recruiter found the repo, asked if I knew React, and that's how I ended up in the Netherlands.
- The form is generated recursively from the JSON Schema, so a schema change needs no code change.
- Download links are base64 data URIs, so exporting needs no server.
- Still the tool I use for my own resume, years later.
- React
- Gatsby
- Formik
- JSON Schema
- Material UI
On the blog:

What annoyed me: Knowing nothing about making games.
Super Ollie vs Pebble Corp
2020 to 2021A Phaser 3 skate platformer where the villain is a corporation trying to ban skateboarding. It's not finished, but every step of it is documented in 23 public devlogs.
- Game rules live in Tiled tile and object properties, and colliders, triggers and AI paths are generated from them at runtime.
- Rewrote the enemy AI from per-frame tile probes to colliders calculated once, because the first version didn't scale.
- Wrote my own build tooling: sprite atlas generation, tileset extrusion, and a Webpack transform that inlines Tiled tilesets.
- Ladders, monkey bars, moving platforms, checkpoints, weather, translations and a mobile build with on-screen controls.
- Phaser 3
- JavaScript
- Tiled
- Webpack
- Cordova
On the blog:

What annoyed me: Finding a place to rent in Amsterdam.
Home Finder
2022 to 2023Free rental alerts for seven Dutch real estate websites, built because paying for alerts in the middle of a housing crisis made me angry.
- GitHub Actions does the scraping every hour, a Google Form does the signup and a Google Sheet is the database.
- The infrastructure costs €0, on purpose: the free tier was the architecture.
- Started as
funda-scraper, my own Puppeteer and Telegram script from when I was looking for a place.
- Node.js
- Puppeteer
- GitHub Actions
- Google Sheets
- Gatsby
On the blog:
Everything else
- Apps2008 to today
pablo.gg
This blog, which costs $0 to host. Comments come from a Google Form, search runs offline in the browser, every post is also a static JSON file, and Medium imports get their code as gists.
- Next.js
- React
- Tailwind CSS
- GitHub Actions
- GitHub Pages
- E-commerce2025
GameShop
A Magento 2 extension that turns my store into a retro RPG shop, shopkeeper and menus included, on top of custom REST endpoints.
- Magento 2
- PHP
- Vue.js
- Tailwind CSS
- E-commerce2024
Magento short description autofill
One click in the Magento admin and AI writes the product description, with OpenAI or Gemini and a configurable system prompt.
- Magento 2
- PHP
- OpenAI
- Gemini
- Tools & automation2024
manga-converter
Flips manga pages so they read from left to right. easyOCR finds the text, PIL and NumPy cut it out, mirror the page and put the text back.
- Python
- easyOCR
- PIL
- NumPy
- Tools & automation2024
Side-project hours tracker
A Node.js script that estimates how many hours I've spent on a side project from its git history. I regretted running it.
- Node.js
- simple-git
- Tools & automation2023
Instagram Reels on autopilot
Node.js scripts that post Reels through the Graph API, generate their thumbnails, and have GPT write coding tutorials as JSON with function calling.
- Node.js
- OpenAI
- ffmpeg
- Instagram Graph API
- Tools & automation2023
google-fit-telegram
Pulls 30 days of weight, body fat and nutrition from the Google Fitness API, works out my real TDEE and sends it to Telegram every day. Runs on a GitHub Actions cron, no server.
- Node.js
- Google Fitness API
- Telegram Bot API
- GitHub Actions
- Tools & automation2021
code-video-creator
Turns code snippets into videos that type themselves out, by recording a React page in Puppeteer at 1920x1080.
- Node.js
- Puppeteer
- React
- Prism
- Games2021
Space Train Trader
My GMTK Game Jam 2021 entry, made with a team in 48 hours. Trade. In space. On a train!
- Game jam
- JavaScript
- Tools & automation2020
Gatsby starters and JAMStack tools
Starters pulled out of this blog's old Gatsby build, plus a URL shortener with no backend.
- Gatsby
- React
- Material UI
- Apps2017
Contract Builder
Built for a lawyer friend who was spending an hour per contract. Now it takes her less than five minutes.
- Vue.js
- JavaScript
- E-commerce2017
Magento Chatbot
Connects a Magento store to chat apps so people can browse and buy through chat, with wit.ai working out what the shopper meant. My most popular repo for years.
- PHP
- Magento
- wit.ai
- Chatbots
- E-commerce2016
Shop Botifier
Won VanHackathon 2016 with Team WeRules: a Telegram bot that creates a dedicated Shopify store bot for each merchant, on demand.
- Python
- Telegram Bot API
- Shopify API
Where I've worked
Zenkai Zone
January 2025 to todayFounder, and everything else · Netherlands
My store for collectibles and retro games, started in January 2025. Same deal as the first time around: one person, so the code, the products, the photos and the packing are all mine.
- Runs on Magento 2, with my own extensions on top of it, like the retro RPG shop page.
- Wrote about how pricing works in the collectibles world, from the seller side.
- Magento 2
- PHP
- Vue.js
- Tailwind CSS
Fingerboard Supply
January 2025 to todayFounder, and everything else · Netherlands
A fingerboard store, started in January 2025. It's the FingerStore idea again, this time from Europe and with fifteen years more of knowing what I'm doing.
Studocu
May 2018 to todayFull-stack developer · Amsterdam, Netherlands
A study platform used by students all over the world. I joined as the 5th developer and stayed while it grew into a much bigger engineering team.
- My first task was migrating the frontend from CoffeeScript to JSX. Later it went to TypeScript and React 18, and I was the one willing to touch the Webpack config.
- Moved pages from the Laravel monolith into Next.js one by one, with gradual cookie-based releases and a way back to Laravel if something broke.
- Made Laravel and Next.js read and write the same encrypted session cookies by reimplementing Laravel's AES-256-CBC and HMAC format with the Web Crypto API.
- On the engineering on-call rotation since 2022, and migrated error reporting from Bugsnag to Sentry across both apps behind a feature flag.
- Owned A/B tests end to end: build them, read the results, decide, then delete the losing variant.
- Ran the frontend guild from 2021 and did technical interviews that helped hire around 10 people.
- React
- Next.js
- TypeScript
- Laravel
- PHP
- Kubernetes
- Sentry
On the blog:
Muxi
2016 to April 2018Software developer · Brazil
Software for payment terminals, in a JavaScript-like language running on a native C runtime. Most of it for Cielo, the company's biggest client.
- Delivered two Cielo certifications, sitting with their QA team in São Paulo, and shipped through a staged rollout to a fleet of up to 8 million terminals.
- Tech lead on the Cielo Look and Feel redesign, owning the whole UI.
- Built ISO-8583-Breaker, which became the company's official debugging tool, and a font tool that generates terminal bitmap fonts from a font file.
- Took Bitcoin payments on terminals from a proof of concept shown in Las Vegas to a product, and became its product owner.
- JavaScript
- C
- ISO 8583
- React Native
FingerStore & NanoBoards
October 2010 to 2020Founder, and everything else · Brazil
Brazilian fingerboarders had no shop at all, so I made one. It ran for a decade and I did all of it alone: code, imports, photos, packing, support and the community.
- Launched the first fingerboard e-commerce in Brazil on Magento 1.4, about three months from idea to live store.
- Created NanoBoards in 2012, my own brand, with graphics licensed from big Brazilian skate brands, and exported it to the US and Europe.
- Custom Magento theme and modules, a multi-store setup, a build-your-own-setup configurator, and a version upgrade every year for five years.
- Accepted Bitcoin from 2014, long before that was normal for a small shop.
- Magento
- PHP
- PagSeguro
- Mercado Pago
Freelance
2010 to 2015Web developer · Brazil
Other people's websites, at the same time as my own store. Mostly WordPress.
- Custom WordPress themes and plugins, including WooCommerce work.
- Shopify API integrations for clients.
- WordPress
- WooCommerce
- PHP
- Shopify API
First jobs
2007 to 2010Intern, then web developer · Brazil
Two weeks cleaning up restaurant data in Dreamweaver in 2007, then my first real programming job in C# and .NET, then a few months of hotel websites at a WordPress agency.
- Built a realtor website with an admin area for listing properties.
- Built a directory of local taxi drivers with a profile page each, made to rank on Google. It did.
- C#
- .NET
- WordPress
- PHP
Prizes, articles and press badges
- 2024
Sharing encrypted Laravel cookies with Next.js
Article on the Studocu Tech blog about making both apps share one session.
- 2022
Studocu hackathon, 1st place
A GPT-3 chatbot inside the document viewer that answered questions about the document you were reading, before ChatGPT came out.
- 2021
Studocu hackathon, 3rd place
Third place in the company hackathon, which I entered most years.
- 2016
VanHackathon winner
Won with Team WeRules and Shop Botifier, a Telegram bot factory for Shopify stores.
- 2012
Games press, as "Pablo Pirata"
Covered E3 in Los Angeles for Brazilian outlets and planned the trip for the team, later Gamescom and Summer Game Fest 2023. Unpaid, on top of the day job.
Got something annoying that needs fixing?
Tell me about it. The contact form goes straight to my inbox, and the code for most of what's above is on GitHub.