Personal website of Rodrigo Mady β portfolio, skills, talks and contact.
Built with Express.js, Pug templates and i18next for multilingual support (English and Portuguese).
- Runtime: Node.js
- Framework: Express 4
- Template Engine: Pug 3
- i18n: i18next (with browser language detection)
- Database: MySQL / Sequelize (optional)
- Testing: Mocha + NYC (coverage) + Supertest
rmady/
βββ index.js # Entry point β Express server setup
βββ langoptions.js # i18next language detection config
βββ ecosystem.config.js # PM2 process config (production)
βββ app/
β βββ routes.js # Route definitions
β βββ controllers/
β βββ HomeController.js
βββ locales/
β βββ en.json # English translations
β βββ pt.json # Portuguese translations
βββ public/
β βββ views/ # Pug templates
β βββ css/
β βββ js/
β βββ images/
β βββ fonts/
βββ .github/
βββ workflows/
βββ deploy.yml # GitHub Actions auto-deploy
| Path | Page |
|---|---|
/ |
Home |
/skills |
Skills |
/portfolio |
Portfolio |
/talks |
Talks |
/trema |
Trema |
/contact |
Contact |
- Node.js 18+ (managed via NVM)
# Install dependencies
npm install
# Start development server (with auto-reload via nodemon)
npm startThe server runs at http://localhost:3002.
npm testThe site is deployed to a DigitalOcean Droplet running Debian + Nginx + PM2.
ssh deploy@YOUR_DROPLET_IP
cd /var/www/sites/rmady
git pull origin main
npm ci --production
pm2 restart rmadyPushes to main trigger a GitHub Actions workflow that deploys via SSH automatically. Requires two repository secrets:
DROPLET_IPβ Droplet IP addressSSH_PRIVATE_KEYβ SSH private key for thedeployuser
The site auto-detects the user's language from (in order):
?lang=query parameteri18nextcookieAccept-Languageheader
Supported languages: English (en) and Portuguese (pt). Falls back to English.
GPL-3.0 β see LICENSE.



