Most of what is here started because I wanted to use it myself. Right now that means Arena of Valor tooling: crawling the official and community sources, normalising them into one open dataset, and serving it from a static site that needs no backend.
The ticks above are not decoration. There is one for every record in that dataset.
Heroes, items, arcana, summoner spells, badges and game modes as plain JSON — no API key, no rate limit, and no scraping on your side. Rebuilt weekly from the official Garena site and the Arena of Valor Fandom wiki by the crawlers in the repo.
const heroes = await fetch(
'https://cdn.jsdelivr.net/gh/MLuc24/lien-quan-data@main/data/heroes.json'
).then((r) => r.json())
const airi = heroes.find((h) => h.slug === 'airi')
// stats, skills, skins, prices, lore, suggested builds, balance historyEvery record traces back to a published source. Where a source has nothing, the field is left out rather than guessed — the gaps are part of the data. A static wiki reading from this dataset is the next piece; it is still private while the interface settles.
| Project | What it is | Stack |
|---|---|---|
| Repix.art | NanoEdit image editor | TypeScript |
| AppTet | Seasonal e-commerce app built for Tết | TypeScript |
| Social-media-app | Full-stack social app, .NET Core API + JS client | C# · .NET |
| Warehouse-backend · frontend | Warehouse management, split API and UI | C# · TypeScript |
| Train_Ticket_Be · FE | Online train ticket booking | TypeScript |
I work across JavaScript and TypeScript on the web side and C# / .NET on the service side, so most of these exist as a matching pair of repositories rather than one monolith.





