I am a software engineer based in Hong Kong. I hold a dual degree in computer science and business management from HKUST.
I like programming and I have been doing it for almost ten years. It's great to see things built with computers. I currently work at a startup, GitStart (YC S19), building developer tools, creating AI agents to assist in the software development lifecycle, and designing systems and applications that support developer work.
Previously, I worked at Credit Suisse on big data processing pipeline, 3D visualization of meteorology datasets in the Hong Kong Observatory, and setting up indoor autonomous robots in a local startup. I was a member of the HKUST robotics team, building software for embedded systems and controls with ROS for the ROV prototype. The reward was we won the 2019 MATE ROV World Champion!
Besides software, I am interested in astronomy, finance, Formula 1, movies and books. When I have free time, I worked on some projects on the side for fun and learning.
Things I worked on over the last few years:
This is a platform for online, real-time, turn-based, multiplayer game. Making games that my partner and I can play on phone rather than on pen and paper. You can find all games here.
There is a super hangman game we came up with that I don't think it exists out there. I plan to add more games and welcome suggestions for it :)
I came up with this idea of building a playground platform after knowing what Phoenix LiveView in Elixir is capable of doing. As long as the game is turn-based, then the playground engine can handle creating and joining rooms, initializing and running the games, storing and passing the state for all the games. Each game then defines metadata like the name, and functions that initialize the game state and handle how a move alter the game state, and finally a visual component to render the screen given the game state. The beauty is the engine doesn't need to know how each game works, and the game module doesn't need to know how the state is stored or passed around.
Underlying the engine spawn a GenServer process for each room. Any action in the room like a new move made by a player in the game sends a message to the room process. The process dispatches the move to the relevant game module that handle the actions received. When the state is updated, the process persists it to the database and publish the update with Phoenix PubSub. The LiveView page then subscribe to the topic for that room and then render the page accordingly.
This is also the first project I self-host it. It is deployed with a Docker image in a Hetzner box, with Nginx in front of it as a reverse proxy. This opens up a rabbit hole for me to explore self-hosting, having me hosting a private VPN, plausible, and other tools in a single VM.
This is a place I collect and categorize what I found interesting online. And maybe some of these are helpful to my future self and others. The Wiki contains over 1000 links, loosely categorized into almost 100 domains. Occasionally, I write blogs there too, to share some lessons learned and some thoughts. This wiki is inspired by wiki.nikiv.dev/ (sadly, most of the resources are behind a paywall now).
Right now, I particularly like the pages about astronomy, personal growth, and software design in this wiki. There are also some rabbit hole that I got into like cellular automaton, stories of counterfeit, or various write-ups and stories people publish. I am still updating the wiki, although not as frequent as I used to. Have a look, and you might find an interesting rabbit hole there!
The website is generated with Docusaurus. You may check out the files here.
This is a Cangjie input method practice tool (pronounced as Cong1 Kit3 in Cantonese). I just want one with no ads, without rarely used characters, and friendly for phones but doesn't require me to install an app. I can't find one, so I built one myself. It's not perfect, but it works.
And a friend strongly recommended me to use Elm, so I did, and I find it quite nice! I like the functional programming way of immutability and no side effects. Strong static types system with friendly and helpful error messages is also amazing. All the code are public here.
I wrote this blog about how to write a smart contract for playing rock paper scissors on blockchain fairly. Cheating is impossible despite each publicly make their move at different time.
It was originally part of an assignment in a course I took about blockchain. I added some touches and thought it would be interesting to share what I learned about designing smart contracts. I still find it interesting how computer science technologies are applied in blockchain and the design of blockchain and its applications involves game theory to ensure cooperation and integrity of the system.