Type
Web Application / Platform
Role
Solo Developer / Architect
Timeline
March 2026 — Present
Status
Production / Active
Domain
malec.wiki
$13/mo
Hosting
5min
Onboarding
1
Wildcard SSL
Multi-Subdomain

Tech Stack

Runtime Node.js 24 / Express.js 4.18
Infrastructure Azure App Service
CI/CD Azure DevOps Pipeline
Frontend HTML5 / CSS3 / ES6+
Config JSON-driven routing
SSL Azure Wildcard Cert
DNS Custom domain mapping
Version Control Git

Key Features

01

Intelligent Subdomain Routing

Express middleware parses hostnames and routes to person-specific content automatically. brian.m.malec.malec.wiki, bmalec.malec.wiki, brian.malec.wiki all resolve to the same portfolio.

02

Configuration-Driven

Adding a family member requires only a JSON config entry and an HTML directory. No code changes, no redeployment of the routing logic.

03

Cost Efficiency

Consolidated from multiple hosting accounts ($50+/month) to a single Azure App Service ($13/month). One wildcard SSL certificate covers all subdomains.

04

Automated CI/CD

Azure DevOps pipeline handles builds and deployments. Push to master triggers automatic deployment to production.

05

Health Monitoring

Built-in health check endpoint for Azure monitoring. Debug API endpoint for subdomain troubleshooting during development.

06

Project Documentation

Each family member can have unlimited project detail pages with consistent design templates and navigation.

Architecture

DNS
Azure DNS Wildcard Certificate Custom Domains
Load Balancer
Azure App Service SSL Termination
Application
Express.js Subdomain Middleware Static File Server
Config
people.json Route Mappings Person Registry
Content
HTML Templates Project Pages Static Assets

Subdomain Routing

The core routing middleware extracts subdomains from incoming requests and maps them to person-specific content directories using a JSON configuration file.

subdomain-middleware.js
const subdomainRouter = (config) => (req, res, next) => {
  const host = req.hostname;
  const parts = host.split('.');

  // Extract subdomain from request
  const subdomain = parts.slice(0, -2).join('.');

  // Find matching person in config
  const person = Object.values(config.people)
    .find(p => p.subdomains.includes(subdomain));

  if (person) {
    req.person = person;
    req.personPath = `/people/${person.id}`;
  }

  next();
};
← Back to Projects