I do my side projects mainly for fun/usefulness, and hope you find the same feeling too in some of the following projects.


A dive-in post | Github | PyPI | Docs

RoboMasterPy is a Python library and framework for RoboMaster EP, a DJI educational robot. The framework deals with video streaming, push and event, provides a high-level interface for controlling and communication. You can build your controlling logic basing on it.

With help of tools like OpenCV, I made some work that might interest you.

O’RLY Cover Generator

Try it online | Github | Fun Examples

O’RLY Cover Generator is a parody book cover generator, implemented in Golang and Vue.js, supporting a wide range of languages including CJK.

I started O’RLY for three reasons:

  • Fun;
  • Pioneer like’s does not support languages other than English;
  • I saw little Go’s projects on graphics and typesetting, so it’s worth a try.


Try it online | Github

BlueLox is a tree-walking interpreter implemented in Golang for Lox.

Lox is a programing language by Robert Nystrom, introduced in his wonderful book Crafting Interpreters, where he constructs a Java version interpreter(jlox) line by line, with detailed tutorial, brilliant illustrations and a full pack of jokes about breakfast.



A Toy Gitlab CI Runner backed by Firecracker MicroVM, implementing a subset of functionality of Gitlab Runner as experiments and demonstration.

For Example, Tart can run its own CI job, in which its unit tests are executed and its binary got compiled.


  • Fun!
  • Uses Firecracker and /dev/kvm. Every job runs in a “microVM” that boots under 2 seconds. Tart might be the first example to combine Gitlab runner and Firecracker
  • The codebase is relatively small at around 2000 lines(empty lines included) and the core functionality of Gitlab Runner is implemented: polling jobs, execution in isolation environment, submition of job state and logs

Golang gzip Middleware

Github |

A dull gzip middleware for Gin and net/http.

A gzip middleware is so common, fundamental and dull in almost every web framework that I thought implementing one should be easy. However, there are actually some details need to be taken care of:

  • does the client support decompression?
  • which kinds of contents should be compressed? by MIME or file extension?
  • is the stream compressed already?
  • how many bytes is it meaningful to do compression?
  • which gzip level to take?
  • how to decide the payload size when streaming?

I learned a lot when implementing this project.

Golang Etherscan API client

Github |

Go bindings to the API, with nearly Full implementation(accounts, transactions, tokens, contracts, blocks, stats), full network support(Mainnet, Ropsten, Kovan, Rinkby, Tobalaba), and only depending on standard library.

It gets listed in Etherscan Docs.


See Github.