Tinkerer β¦ Software Developer β¦ Dog father πΆ
- βοΈ I'm living in sunny Madrid, Spain π
- Tech Stack:
TypeScript | Node.js | PostgreSQL | MongoDB | Next.js | React | Python | Vercel | Generative AI (text and voice) | LiveKit - Blog:
- Socials:
- β‘ Fun fact:
- My first computer was a Compaq Presario in 1995 in Ecuador β I was 8 years old. It came with Windows 3.1, but you could install Windows '95. I was amazed by the possibilities of computers and the internet (dial-up). I still cherish those memories πΉοΈπ
- βοΈ HolaBrisa - a thoughtful text and voice AI receptionist that gives every hotel guest an immediate, personal welcome.
- ποΈ SexyVoice.ai (repo) - Text to Speech and Voice cloning platform. Perfect for content creators, developers, and storytellers
Onova.co was a mobile marketplace for second-hand and sustainable clothing, "Instagram with a buy button". Alex and I first built Givebox, an app for giving things away in your local area, working remotely from Ireland and Poland. Clothing turned out to be the largest category, so we moved to Lviv, Ukraine, and went full-time on Onova. The company ran until September 2019.
Young people in Ukraine bought clothes in thrift stores and resold them on social media, a market full of scammers, with no payments, reviews or search. On Onova, buyers followed shops to build a personal feed. Sellers announced a drop, a batch of items going on sale at a set date and time. Buyers subscribed, got a notification when it opened and competed to buy. Payments went through UAPay and were held in escrow until the buyer collected the package from Nova Poshta, and Onova took a small fee from each completed order. Drop was a spin-off app built from the same codebase.
I wrote almost all of the code: about 4,500 commits between 2017 and 2020. The iOS and Android apps were one React Native codebase that built both Onova and Drop. The web apps used React and TypeScript. A set of small Node.js services ran on a single AWS Lightsail instance under pm2 and shared one MongoDB database:
server.data: the Express REST API behind the apps and web apps, covering the order flow, feed, search and drops, with about 400 testsserver.push: push notifications through Firebase Cloud Messagingserver.chat: order updates posted into buyerβseller chats on Pusher ChatKit, later Sendbird- Agenda: a MongoDB-backed job scheduler for order deadlines and notifications
- Forest Admin: the back office
- An Instagram importer: sellers linked their account, and a Google AutoML image classifier picked out posts showing items for sale and turned them into listings on their Onova shop
Details
flowchart LR
subgraph lightsail["AWS Lightsail instance"]
webapp(["webapp<br/>:3000"])
data(["server.data<br/>:4040"])
agenda{"Agenda job scheduler"}
push(["server.push"])
chatPoll(["server.chat<br/>push notif. polling"])
chatAuth(["server.chat<br/>Pusher auth REST API<br/>:8142"])
mongo[("MongoDB")]
end
fcm["Firebase Cloud Messaging"]
chatkit["Pusher ChatKit"]
backup[("MongoDB cloud backup")]
webapp --> data
data <--> mongo
data <--> agenda
agenda <--> mongo
agenda <--> push
agenda <--> chatPoll
push --> mongo
push --> fcm
chatPoll --> chatkit
chatAuth <--> chatkit
mongo --> backup
- π₯ Walnut.tv (repo) - Discover trending videos from Reddit and curated YouTube channels
- π agentcaller.io (repo) - AgentCaller.io lets your AI agent (e.g. OpenClaw) call businesses β booking a restaurant, etc.
- π― 3dvibegame.com (repo) - 3d multiplayer game where you can create any 3d object, move around and manipulate objects with text. My first game
- β½οΈ football_analysis_yolo - A Machine Learning project using YOLO and OpenCV to automate soccer match analysis, player tracking, and performance insights from live or pre-recorded video footage.







