Hi, I'm Harry! I am a student in the Faculty of Information Engineering at the Chinese University of Hong Kong. I love learning computer science, video game programming, and anything about a computer.
๐ Beginner's mindset and curiosity
๐จ High capability and adaptability
- Make indie games
- Learn more hardware knowledge
- HTML5
- CSS3
- Javascript
- Python
- C/C++
- Rust
- Java
- Pascal
- Minesweeper in Pascal
- Telegram/discord bots
- Elevator Simulator
- A Monopoly-like game written in Rust with Godot engine
Coding with command blocks is awesome:
The portfolio at the repository root is a SvelteKit static site. The contact form posts JSON to ${PUBLIC_BACKEND_URL}/api/contact.
Set both required public build-time values in the tracked root .env before starting, building, or deploying; a blank or missing value fails the frontend build. The root .env is used by the GitHub Pages build. The contact backend is maintained in the separate private furinobu/portfolio-backend repository; its .env stays private on the VPS.
PUBLIC_BACKEND_URL=https://api.example.com \
PUBLIC_TURNSTILE_SITE_KEY=your-site-key \
npm run buildThe GitHub Pages workflow reads the tracked root .env directly. Do not expose the server-side Turnstile secret in the static site.
npm install
npm run dev
npm run buildFor a project GitHub Pages deployment, build with its repository path:
BASE_PATH=/your-repository-name npm run buildThe generated static site is in build/. static/.nojekyll is included for direct GitHub Pages uploads.



