Personal Projects

Side projects.
Running in production.

A subset of things I run on my own self-hosted infrastructure, containerized, reverse-proxied, and maintained as personal projects. It's a reasonable indication of what I do when nobody's paying me to.

⚡ All services are self-hosted on personal hardware. Uptime is best-effort, not SLA-bound. Lab projects, not commercial offerings.

Featured Builds

đŸ–Ĩī¸ DaedalOS, Browser-Based Desktop Environment

A fork of Dustin Brett's DaedalOS project, a full desktop operating system experience running entirely in the browser. No install, no VM, no plugins. It boots a complete windowed environment with apps, a filesystem, and a terminal, all in a browser tab. I've hosted and customized this instance as a showcase of what's possible with modern web infrastructure, and as a demonstration of the kind of immersive, unconventional hosted experiences I can build out for client environments.

ReactWebAssemblySelf-hostedFork of DaedalOS by Dustin BrettBrowser Desktop
Visit → daedalos.jamesmorgan.ca

đŸ“ē Live Streaming Channel

A custom live TV channel built on Plex and DizqueTV. When a viewer lands on the page, the server spins up an ffmpeg process and begins rendering a live stream on-demand. The ffmpeg process terminates automatically when the viewer pauses or leaves, tracked via session state to prevent zombie processes. The channel pulls from my Plex library and schedules content through DizqueTV to simulate a broadcast experience. A good demonstration of on-demand server-side media rendering and session lifecycle management.

ffmpegPlexDizqueTVSession trackingOn-demand renderingSelf-hosted
Visit → watch.jamesmorgan.ca

Professional

📄
Portfolio

Interactive Resume

A hosted, browser-readable version of my professional resume. Structured for readability, no PDF download required.

đŸŸĸ
Monitoring

Uptime Kuma Status Page

Public-facing uptime monitoring for my self-hosted services. Real-time status checks, incident history, and response time graphs via Uptime Kuma.

Emulation Deployments

Self-hosted, cross-platform browser emulation. All three run in the browser via WebAssembly, no install, no plugins. Desktop, mobile, and tablet compatible.
đŸ—Ąī¸
N64

Ocarina of Time

Browser-based N64 emulation running Zelda: OoT. Works across all platforms and mobile without plugins or downloads.

🔗
GBA

Minish Cap

GBA emulator running Zelda: The Minish Cap fully in the browser. Works on desktop and mobile without any setup.

🍄
SNES

Super Mario World

SNES emulator running Super Mario World in the browser. No ROM hunting, no setup, load and play on any device.

đŸ•šī¸
Multi-platform

ROMM Game Library

A ROMM instance serving a full library of games accessible via browser. Multiple platforms, one self-hosted interface.

Tools & Utilities

â™Ÿī¸
Multiplayer

Chess

Self-hosted multiplayer chess. Shareable game links, real-time play, no account required.

🧜
Dev Tool

Mermaid Diagram Editor

Self-hosted Mermaid.js editor for creating infrastructure diagrams, flowcharts, and sequence diagrams. Useful for IT documentation.

🌐
Network Tool

What Is My IP

A diagnostic tool that simultaneously queries multiple IP sources, including WebRTC leak detection, to identify split-tunnelling behavior, Zscaler proxy IPs, and real vs. proxied public addresses. Useful when auditing VPN or ZTNA configurations.

☕
Utility

NoSleep

Prevents your device screen from sleeping using the Screen Wake Lock API. Handy for keeping displays active during demos, installs, or monitoring sessions without changing system settings.

đŸ–ąī¸
Debug Tool

Mouse Movement Tracker

Logs and visualizes mouse movement in real time, useful for debugging automation scripts, verifying simulated input events, or testing whether mouse activity is being correctly detected by monitoring software.

🐌
Archive

slow.com Tribute

A tribute to slow.com, the iconic site that ran for 20 years playing a single looping video. A small piece of internet history, preserved.

Community & Data

📅 Pickering Events Calendar

A fully scraped and auto-updating events calendar for the City of Pickering, Ontario. Rather than checking the city website manually, subscribe to this ICS feed directly in your calendar app, events show up automatically as they're posted. Updated regularly via scraping the official Pickering events page.

đŸ“ģ Boom 97.3 Daily Playlist Export

If you're a Boom 97.3 listener, this is a daily export of every song played the previous day, scraped and formatted as a plain text playlist. Feed it into your own automation: an iOS Shortcut, a Python script, or a service like Zapier can parse this and automatically add songs to your Spotify, Apple Music, or YouTube Music library. Updated daily.

📄 View Today's Playlist ⚡ Build an iOS Shortcut

Tip: Use an iOS Shortcut with "Get Contents of URL" → parse lines → "Add to Music Library" to auto-save songs each morning.

This all runs on my own infrastructure.

Every service here is self-hosted, containerized, reverse-proxied through NGINX, and monitored via Uptime Kuma. The stack includes TrueNAS for storage, ESXi/Proxmox for virtualization, and a mix of Docker and bare-metal deployments. This is the same kind of environment I design and manage for clients, just at a smaller scale with more room to experiment.

DockerNGINXTrueNASESXi / ProxmoxUptime KumaSelf-signed SSLHome Lab