
Following our successful POC with Rama for analytics, we evolved the stack into a generic, reusable platform called Hibou (French for "owl", known for their excellent eyesight).
The goal was to transform our client-specific implementation into a business-agnostic analytics suite that can serve multiple clients with different data requirements.

I am currently working on a project that aims at moving our gaming platform stat aggregation and visualization project to a new stack.
We have an event-driven system that produces lots of events in multiple kafka topics. Our current solution to aggregate stats and visualize them in dashboards is the setup Apache Druid + Imply.
As a Clojure-focused company, we decided to experiment with a new architecture: Rama + in-house full-stack Clojure Visualization tool.

I worked on a recommender system stack that suggests user-based challenges to Golden Island's players. Golden Island is a card/board game platforms that offers a dozen of games including Pǎo Dé Kuài (跑得快), Dou dizhu (鬥地主), Mahjong etc.
Some game operators are already creating props (challenges) that are personalized in the sense that they apply only to a subset of users (game, levels, coin balance etc) in response to a subset of events (game, bet size etc).
The end goal was to ease the job of game operators by taking care of when to recommend challenges and to whom, so the game operators can focus on the what the challenges could be and have constant performance feedback.
The recommender is made of Clojure applications deployed in PODs in AWS EKS that consume events from kafka topics and produces props (personalized challenges) to a dedicated kafka topic. It uses Datomic as storage solution. The app can query multiple recommender engines to perform A/B testing, meaning that we can run 2 recommenders at once and compare their performance.

This portfolio was implemented with ClojureScript. It is a Single Page Application that leverages reagent, a minimalistic interface between ClojureScript and React.
For frontend management, re-frame is used. To compile the cljs code and perform hot reloading, I used figwheel-main.
The routing is done with reitit.
The markdown content is converted into hiccup (a clojure-friendly markup) and the post/vignette configurations use standard YAML frontmatter which is validated at compile time with a malli schema.
Light/dark mode and code block syntax highlighted are supported.
The app is deployed on Netlify via GitHub Actions every time a branch is merged to master. Build artifacts are generated during CI/CD and are not committed to the repository.


flybot.sg is an open-source full-stack Clojure web-app that allows company’s employees to write posts to showcase their open-source libraries, their contributions and all technical knowledge that could interest the functional programming community. HRs can also post job offers. Admins can edit any piece of content in any pages as the whole content can be written in Markdown.
The purpose of this project was to demonstrate how the lasagna stack (flybot-sg/lasagna-pull and robertluo/fun-map) could ease the web development experience for any Clojure developers.

I worked on integrating the Magic Compiler and its tooling to Flybot's development workflow.
Magic is an open-source bootstrapped compiler written in Clojure that takes Clojure code as input and produces dotnet assemblies (.dll) as output. The dlls produced by Magic can be run in the Game engine Unity which Flybot uses for their card game UIs. The goal was to be able to compile our backend Clojure APIs to dlls so we can used that logic in Unity directly.
Working closely with the author of the Magic compiler Ramsey Nasser, I helped improving the tooling around the Magic compiler so it integrates well with our workflow Clojure Backend/Unity Frontend. I notably simplified the way a clojure project and its dependencies are compiled to dlls, packed to NuGet, deployed to online repos and finally imported to Unity.

At Flybot, I had the opportunity to create popular Asian Card Games APIs in Clojure.
I developed the backend of games such as Pǎo Dé Kuài (跑得快) and Big two (锄大地) which are climbing card games.
I also worked on a Library we called MetaGame that allows us to compose several Pǎo Dé Kuài or Big two games (or a mix of both). By composing games, I mean to play a few rounds of them up to a certain score for instance. This composition is generic enough to even allow us to make tournaments out of the underlying games.

