Projects

All projects

Sorted by recency — personal projects and open source.

4 projects

2026★ Projects

Heroes of the Song

Solo developer

A tower-defense game built with Phaser 3 and Vite across five chapters — where enemies walk and where towers can go is computed from mask images.

Five chapters, from the Liangshan uprising onward. Chapter select, HUD and result screens are HTML/CSS layered on top of the canvas; only characters, maps and projectiles go through Phaser — long text and ordinary buttons are no good inside a canvas, so each side handles what it is best at.

No hand-placed routes: purple pixels in a mask image are treated as walkable ground, pushed through a distance transform, then a shortest-path search biased toward the middle of the road samples a point every 45 pixels — enemy routes and build slots come out on their own. Adding a map takes two images.

Towers upgrade through three tiers and sell back for 60% of the gold. Sound effects run through a single table of volumes, throttles and start offsets; kills get a random pitch shift so a wave never sounds like a machine gun.

Highlights

  • Routes and build slots derived from mask images
  • Five chapters with a DOM + Canvas hybrid UI
  • Central sound scheduling: throttle, seek offset, random pitch
Phaser 3ViteJavaScriptCanvas
2026★ Projects

Portal Maze

Solo developer

A maze game for the browser — five levels of rising difficulty, with portals you jump through by pressing space.

A browser-only game built with Phaser 3 and Vite: no backend, no accounts, scores kept in the player’s own browser. Three scenes, each with one job — menu, level select and gameplay.

Mazes are generated with DFS so every run is different, then checked with BFS — the exit is always reachable, and the minimum move count comes out of the same pass, so no board is ever unsolvable. Your run only counts as a record if it beats that number.

Five levels unlock one by one, with best-move counts and the chosen skin kept in localStorage. Six solid skins plus three image ones — those were cleaned up (background removed, edges trimmed, centred, anti-aliased) in one pass by a Python script.

Highlights

  • DFS maze generation with a BFS reachability check
  • Portal targeting you can confirm or cancel at any time
  • Ships as static files — no backend, no cookies
Phaser 3ViteDFSBFS
2026★ Projects

Web FPV Viewer

Solo developer

A real-time LAN FPV tool for ESP32-CAM camera cars: live video plus pan-tilt and driving control in the browser, with a direct-connect Android app — free.

Built for the Yahboom WiFi camera module (an ESP32-CAM camera car), shipped in two editions: a Windows one you unzip and run — with a bundled exe, so Python isn’t needed — and a 58 KB Android APK that talks straight to the car’s own hotspot, without a PC in between.

The Windows proxy uses nothing but the Python standard library — no pip installs. It pulls the camera’s single MJPEG stream once and fans it out to every browser, so extra tabs and phones share the same upstream instead of fighting over it.

Reconnection backs off from 1 to 30 seconds, only the newest frame is kept and stale ones are dropped, so latency never creeps upward. The status bar shows FPS, latency and reconnect count — enough to tell a network fault from a power one.

Control rides its own TCP channel: pan-tilt sliders, a d-pad and dual-stick differential driving all live in the page, sending a heartbeat every 100 ms — the controller stops itself after 0.6 s of silence, so a dropped connection can never send it runaway. UDP discovery finds the server on the LAN without typing an address, and a mock simulator exercises the whole flow without a camera.

Highlights

  • Pure Python standard library — unzip and run, exe included
  • One upstream stream shared by every client, with auto-reconnect
  • Pan-tilt and differential control with a 0.6 s watchdog
  • UDP discovery on the LAN, plus a direct-connect Android app
PythonMJPEGsocketESP32
2026

This website

Solo developer

The site you’re looking at right now: Astro + Tailwind CSS, bilingual, written by hand.

A static site built from scratch — I wrote the components, picked the colours, added scroll animations, and wired up bilingual routing and SEO.

Every page is plain HTML generated at build time — no runtime framework, so it loads fast and deploys to any static host.

Highlights

  • Automatic Chinese / English switching
  • Dark, tech-inspired visual design
  • Pre-rendered for instant loads
AstroTailwind CSSTypeScript

Contact

Let’s build something

Want to team up on a project, swap tips, or just say hi? Drop me an email.

Email meSupport me