[{"data":1,"prerenderedAt":227},["ShallowReactive",2],{"ui-en":3,"projects-en":33},{"id":4,"about":5,"buttons":7,"extension":15,"footer":16,"locale":18,"locales":19,"meta":21,"nav":22,"projects":27,"stem":29,"theme":30,"__hash__":32},"ui\u002Fen\u002Fui.yml",{"title":6},"About Me",{"readMore":8,"contactMe":9,"myPortfolio":10,"sendMessage":11,"sendAnother":12,"backToProjects":13,"visitSite":14},"Read more","Contact me","My portfolio","Send Message","Send another","Back to projects","Visit site","yml",{"credits":17},"Built with Nuxt UI & Three.js","en",{"switcher":20},"Language",{},{"home":23,"projects":24,"about":25,"contacts":26},"Home","Projects","About","Contacts",{"title":24,"description":28},"Some of the projects I've worked on.","en\u002Fui",{"switcher":31},"Theme switcher","2dPGTmy-SMzSmf915uxGZbA3fi-tz2fEgSwUnPdMgkQ",[34,94,133,164,187,209],{"id":35,"title":36,"body":37,"date":38,"description":39,"extension":15,"image":40,"locale":18,"meta":41,"navigation":42,"path":43,"sections":44,"seo":72,"stem":73,"tags":74,"url":92,"__hash__":93},"projects\u002Fen\u002Fprojects\u002Fnumerology.yml","Numerology — Esoteric Numbers",null,"2025","A full-stack numerology platform with 25+ calculation types, personalised PDF reports, Stripe payments, AI-powered translations across 65+ language variants, and an integrated blog CMS.","\u002Fimages\u002Fprojects\u002Fnumerology.png",{},true,"\u002Fprojects\u002Fnumerology",[45,48,51,54,57,60,63,66,69],{"title":46,"content":47},"Overview","Esoteric Numbers is a comprehensive numerology platform where users can calculate over 25 distinct numerology metrics for free, purchase detailed PDF reports, explore compatibility charts, and read a multilingual blog. The entire calculation engine exists in two parallel implementations — a TypeScript library for instant client-side results and a Python mirror for server-side PDF generation.",{"title":49,"content":50},"Numerology Calculations","The platform supports 25+ calculation types across several categories. Name-based calculations include Expression, Motivation, Desires, Equilibrium, and Proper Name numbers using Pythagorean letter-to-number mapping. Birthday-based calculations cover Destiny (Life Path), Personality, Personal Year\u002FMonth\u002FDay, and Universal Day numbers. Cycle-based analysis provides Life Periods with age boundaries, four Pinnacles with precise transition ages, and four Challenges. The Pythagorean Grid analysis generates a 3x3 Lo Shu Square revealing Karmic Lessons, Karmic Duties, Focus Numbers, and eight Arrows of Pythagoras (Determination, Spirituality, Intellect, Emotional Balance, Practicality, Planner, Will, Activity). Additional features include Letter Transits and Essence tracking, Palindrome Date finding, and specialty calculators for house numbers, baby names, wedding dates, and weekly forecasts.",{"title":52,"content":53},"Compatibility System","The compatibility module offers both basic and advanced analysis. Basic compatibility covers 66 unique pair combinations (numbers 1-9 plus master numbers 11 and 22) rated for intimate and business compatibility. Advanced compatibility uses a 0-100 scoring system based on five weighted factors: ruling harmony (25 points), plane harmony (20 points), arrow interaction (20 points), soul urge harmony (20 points), and outer expression harmony (15 points). Each of the 66 pairs has a dedicated SEO-optimised page.",{"title":55,"content":56},"Report Generation Pipeline","When a user purchases a report, a secure checkout session is created. Upon payment confirmation, a report is queued for generation. An asynchronous task runs all numerology calculations, renders a styled HTML template, and converts it to a professional PDF via a dedicated microservice. The finished report is stored securely and a download link is emailed to the user. Reports support template versioning and upgrade flows, with automated recovery for failed generations.",{"title":58,"content":59},"Internationalisation","The platform supports 65+ language and region variants across 68 locale files, including 8 English variants, 6 Spanish variants, CJK languages, Middle Eastern scripts, South Asian languages, and more. The English source file alone contains approximately 4,700 translation keys. Translations are managed through a custom Django i18n app that syncs source text to the database, translates via Ollama (a self-hosted LLM) with CJK-specific token limits and regional hints, and exports back to JSON. The frontend uses lazy loading for non-source locales.",{"title":61,"content":62},"Data Security","All personally identifiable information is encrypted at rest, including user names, birthdays, and email addresses. Hashed lookups are used for fields that need to be searchable without exposing the underlying data. The platform implements 2FA (TOTP) for user accounts and rate-limiting on sensitive endpoints.",{"title":64,"content":65},"Backend Architecture","The Django backend is organised into modular apps covering accounts and authentication, report generation, payment processing, a full blog CMS with rich-text editing and AI-powered content generation, a translation management system, activity audit logging, infrastructure monitoring, and a contact form. Each module is designed for separation of concerns and independent scalability.",{"title":67,"content":68},"Frontend","The Nuxt 3 frontend features 70+ pages, 63 Vue components, and 30 composables. Key areas include the free calculator with dedicated pages for each calculation type, number meaning pages, compatibility pair pages, a secure checkout flow, a user dashboard with saved profiles, a blog with rich-text editing, and a staff admin panel for content and translation management.",{"title":70,"content":71},"Infrastructure","Production runs via Docker Compose with multiple containerised services including a reverse proxy with TLS, the database with connection pooling, a cache layer, the application server, asynchronous task workers with a scheduler, a task monitoring dashboard, a PDF generation microservice, and a secure tunnel for public access. Monitoring includes error tracking, analytics, and a custom health-check system with uptime dashboards.",{"title":36,"description":39},"en\u002Fprojects\u002Fnumerology",[75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91],"Nuxt","NuxtUI","Vue.js","TypeScript","Django","FastAPI","Python","GraphQL","PostgreSQL","Redis","Celery","Docker","Stripe","Tres.js","Three.js","Ollama","Cloudflare","https:\u002F\u002Fwww.esotericnumbers.com","fMGs7BT6yC6AFK0VmmhwK6OysRDTAGKZU6dJRI8qiWo",{"id":95,"title":96,"body":37,"date":38,"description":97,"extension":15,"image":98,"locale":18,"meta":99,"navigation":42,"path":100,"sections":101,"seo":124,"stem":125,"tags":126,"url":37,"__hash__":132},"projects\u002Fen\u002Fprojects\u002Fsensors.yml","Environmental Monitoring Platform","A Raspberry Pi 5-powered environmental monitoring and health tracking system with five hardware sensors, real-time air quality dashboards, and an integrated medication inventory manager.","\u002Fimages\u002Fprojects\u002Fsensors.png",{},"\u002Fprojects\u002Fsensors",[102,104,107,110,113,116,119,121],{"title":46,"content":103},"A full-stack environmental monitoring system running on a Raspberry Pi 5 that captures real-time temperature, humidity, pressure, CO2, TVOC, and particulate matter data from five hardware sensors. All readings are stored in PostgreSQL, exposed via a GraphQL API, and displayed through a bilingual (English\u002FPortuguese) web dashboard. A medication and wellbeing tracking module is deeply integrated, linking subjective health feelings to objective environmental data.",{"title":105,"content":106},"Connected Sensors","Five sensors are connected via I2C bus and UART serial. The BME280 measures temperature, humidity, and atmospheric pressure. The SCD41 provides direct NDIR CO2 readings along with temperature and humidity. The ENS160 + AHT21 combo measures Air Quality Index, Total Volatile Organic Compounds (TVOC), and equivalent CO2 — the ENS160 receives temperature\u002Fhumidity compensation from the AHT21 before reading. Two particulate matter sensors (PMS5003 and PMS7003) measure PM1.0, PM2.5, and PM10 concentrations in micrograms per cubic metre.",{"title":108,"content":109},"Data Collection","APScheduler runs as a dedicated process, triggering sensor reading jobs at regular intervals. Jobs are staggered with jitter to avoid I2C bus collisions. Each job includes database safety mechanisms and runs within atomic transactions. Sensor reads execute in separate threads with timeouts to prevent scheduler blocking, and cached sensor connections are automatically re-created on failure.",{"title":111,"content":112},"Dashboard","The main dashboard displays environmental metrics in colour-coded threshold cards. BME280 data appears as three individual cards for temperature, humidity, and pressure. Air quality is shown in dual-comparison cards contrasting PMS5003 vs PMS7003 readings for PM1.0, PM2.5, and PM10. Below the real-time values, the dashboard presents daily, weekly, and monthly PM averages. Every card is colour-coded from green (good) through yellow, orange, red, to purple (hazardous) based on EPA-aligned threshold ranges.",{"title":114,"content":115},"Thresholds and Alerts","Comprehensive threshold ranges are defined for all metrics. Temperature uses a blue-to-red scale (cold below 16C, comfortable 20-24C, hot above 28C). Humidity is green at 30-60%, concerning above 80%. PM2.5 follows EPA ranges: good (0-12), moderate (12.1-35.4), unhealthy for sensitive groups (35.5-55.4), unhealthy (55.5-150.4), and hazardous (150.5+). CO2 thresholds range from good (0-600 ppm) to hazardous (1500+ ppm). AQI follows the UBA 1-5 scale. Even subjective feelings have thresholds, enabling visual correlation between wellbeing and air quality.",{"title":117,"content":118},"Medication Tracking","A full pharmacy-grade inventory system is integrated alongside environmental monitoring. Users can manage medications with name, brand, route of administration (oral, topical, inhalation, etc.), form (tablet, capsule, liquid, etc.), strength, and free-text tags. Each medication can have multiple tracked ingredients. The package inventory system tracks lot numbers, expiry dates, total and remaining units, acquisition cost, and reorder thresholds with low-stock alerts. Medication intakes are linked to wellbeing entries, enabling correlation between medications taken and subjective health feelings on a 1-10 scale.",{"title":67,"content":120},"The Nuxt 3 frontend (SSR disabled, SPA mode) has 14 pages including the main dashboard, feeling\u002Fwellbeing history log, full medication CRUD management with inventory, individual sensor log pages for each of the five sensors, a combined log view, and about\u002Fcontact pages. Eight components handle threshold display cards, dual-sensor comparisons, and modal forms for medications, packages, and wellbeing entries. Seven composables manage dashboard metrics, threshold resolution, feeling emoji mapping, medication\u002Fintake\u002Fwellbeing CRUD, and inventory calculations.",{"title":122,"content":123},"Deployment","Two deployment modes are supported. Docker Compose orchestrates the database, Django backend, APScheduler process, and the Nuxt frontend as containerised services, with the backend container configured for direct hardware access to the sensor buses. Alternatively, systemd services can run natively on Raspberry Pi OS. The system is accessible over a private VPN network.",{"title":96,"description":97},"en\u002Fprojects\u002Fsensors",[75,76,79,82,83,86,81,127,128,129,130,131],"Raspberry Pi","APScheduler","Soldering","Hardware Integration","Self-hosting","n5jPFBzn4U1tamjW-pAF1BUWp197rJbAxLwGsinoskI",{"id":134,"title":135,"body":37,"date":136,"description":137,"extension":15,"image":138,"locale":18,"meta":139,"navigation":42,"path":140,"sections":141,"seo":156,"stem":157,"tags":158,"url":37,"__hash__":163},"projects\u002Fen\u002Fprojects\u002Fpersonal-site-v1.yml","Personal Website v1","2022 ","A modern personal website built with Next.js and JavaScript, featuring a responsive design, smooth animations, and seamless user experience.","\u002Fimages\u002Fprojects\u002Fwebsite-v1.png",{},"\u002Fprojects\u002Fpersonal-website-v1",[142,144,147,150,153],{"title":46,"content":143},"This project was my first personal website, built to establish an online presence and showcase my work. It features a clean, modern design with a focus on usability and performance. The site includes sections for my portfolio, and contact information, all built with a responsive layout that adapts to different screen sizes.",{"title":145,"content":146},"Design and User Experience","The design of the website emphasizes simplicity and clarity, with a minimalist aesthetic that allows the content to shine. Smooth animations and transitions enhance the user experience, creating a dynamic and engaging interface. The navigation is intuitive, allowing visitors to easily explore the different sections of the site.",{"title":148,"content":149},"Technical Implementation","The website was built using Next.js, a powerful framework for building server-side rendered applications with React. The frontend is developed in JavaScript, with a focus on creating reusable components and maintaining a clean codebase. Node.js was used for the backend, handling form submissions and other server-side logic. Three.js was integrated to create interactive 3D elements, adding a unique visual flair to the site.",{"title":151,"content":152},"Performance and Optimization","Performance was a key consideration throughout the development process. The site is optimized for fast load times, with efficient code splitting and lazy loading of resources. Images and assets are optimized for web delivery, ensuring a smooth experience even on slower connections.",{"title":154,"content":155},"Conclusion","Overall, this project served as a valuable learning experience and a platform to experiment with modern web development technologies. It laid the foundation for future iterations of my personal website, where I plan to incorporate more advanced features and further refine the design and user experience. Right now the website is offline, but the codebase is available on GitHub for reference and future development. And this website that you are currently visiting is the second iteration, built with Nuxt 3 and TypeScript, with a focus on improved performance, internationalisation, and a more dynamic content structure.",{"title":135,"description":137},"en\u002Fprojects\u002Fpersonal-site-v1",[159,160,161,89,162],"Next.js","JavaScript","Node.js","Netlify","uqQ9LsTJF52_kdJ6PnN3PCZN0h8MgyBnnCW8LykSttE",{"id":165,"title":166,"body":37,"date":167,"description":168,"extension":15,"image":169,"locale":18,"meta":170,"navigation":42,"path":171,"sections":172,"seo":181,"stem":182,"tags":183,"url":37,"__hash__":186},"projects\u002Fen\u002Fprojects\u002Fcurrency-converter.yml","Currency Converter","2022","A real-time currency converter that fetches exchange rates from an API and converts currencies instantly.","\u002Fimages\u002Fprojects\u002FcurrencyConverter-thumbnail.png",{},"\u002Fprojects\u002Fcurrency-converter",[173,175,178],{"title":46,"content":174},"A web application built during my learning journey that allows users to convert between currencies in real time. It fetches live exchange rates from the ExchangeRatesAPI and performs bidirectional conversions.",{"title":176,"content":177},"How It Works","Users select a source and target currency from dropdown menus and enter an amount. The app fetches the latest exchange rates and calculates the conversion instantly. The interface supports bidirectional conversion — changing either the from or to amount updates the other.",{"title":179,"content":180},"Technologies","Built with Next.js and React.js for the frontend, Chakra UI for the component library and styling, and SWR for data fetching. The currency data comes from the ExchangeRatesAPI.",{"title":166,"description":168},"en\u002Fprojects\u002Fcurrency-converter",[161,159,184,185],"React.js","Chakra UI","siiOrZJ_mbFp4SOCFEYQrC3dmAxMgzp5SLhXL5FzIFs",{"id":188,"title":189,"body":37,"date":190,"description":191,"extension":15,"image":192,"locale":18,"meta":193,"navigation":42,"path":194,"sections":195,"seo":203,"stem":204,"tags":205,"url":37,"__hash__":208},"projects\u002Fen\u002Fprojects\u002Fgarconet.yml","Garçonet","2021","A restaurant management web app for ordering and managing food services, built as a team project during the Bytes4Future bootcamp.","\u002Fimages\u002Fprojects\u002Fgarconet-thumbnail.png",{},"\u002Fprojects\u002Fgarconet",[196,198,201],{"title":46,"content":197},"Garconet is a restaurant ordering and management system developed as a team project by three people during the Bytes4Future bootcamp. It allows restaurant staff to manage orders, menus and table assignments.",{"title":199,"content":200},"My Role","As part of a three-person team, I contributed to both the frontend and backend development. We followed agile practices, dividing features among the team and integrating our work through Git.",{"title":179,"content":202},"Built with the MERN stack — MongoDB for the database, Express.js as the backend framework, React.js for the frontend interface, and Node.js as the runtime. The project taught me full-stack development in a collaborative environment.",{"title":189,"description":191},"en\u002Fprojects\u002Fgarconet",[206,207,184,161],"MongoDB","Express.js","PRetcJOp0HYAzWZrcXNduY9aG53MRYHr3rWgE6bmgTk",{"id":210,"title":211,"body":37,"date":190,"description":212,"extension":15,"image":213,"locale":18,"meta":214,"navigation":42,"path":215,"sections":216,"seo":223,"stem":224,"tags":225,"url":37,"__hash__":226},"projects\u002Fen\u002Fprojects\u002Fpokejoker.yml","Pokejoker","A Pokemon trivia quiz game inspired by \"Who Wants to Be a Millionaire\", built as a team project during the Bytes4Future bootcamp.","\u002Fimages\u002Fprojects\u002Fpokejoker-thumbnail.png",{},"\u002Fprojects\u002Fpokejoker",[217,219,221],{"title":46,"content":218},"Pokejoker is a fun trivia quiz game centred around Pokemon. Inspired by the format of 'Who Wants to Be a Millionaire', players answer increasingly difficult questions about the Pokemon universe to progress through levels.",{"title":199,"content":220},"Built as a team project by three people during the Bytes4Future bootcamp. I contributed to the game logic, question database and frontend interface. This project combined my passion for Pokemon with my growing development skills.",{"title":179,"content":222},"Built with the MERN stack — MongoDB stores the question bank and player scores, Express.js handles the API, React.js powers the interactive game interface, and Node.js runs the server.",{"title":211,"description":212},"en\u002Fprojects\u002Fpokejoker",[206,207,184,161],"7yZZPYlztsQ6LO8bnZNP15IiY20nh9et8r3nmSv3o2Q",1776208731719]