Projects
Funny Projects
Vietnamese Card Board Scorer
Active

Vietnamese Card Board Scorer

"Ghi điểm Tiến Lên" - A mobile-first score tracker for Vietnamese card games like Tiến Lên. Born on the first day of Tết, built to replace paper and pen.
Tech Stack
reactReact
nextdotjsNext.js
chakrauiChakra UI
framerFramer
tailwindcssTailwind
Source CodeLive Demo
Minh-Tri Le
Minh-Tri Le
Feb 2025 · 3 min read

01Why does this project exist?

I have a lovely family of four. It was a nice day - the first day of the Lunar New Year in Vietnam, which we call Tết. We decided to play a board game called Tiến Lên, a popular card game in Vietnam. We had a lot of fun playing together.

We kept score on paper, which is very traditional, but by the end of the game we realized we had lost track of some points and it was difficult to figure out where the mistakes were. At that moment, I realized that keeping score can be quite cumbersome and distracting from the enjoyment of the game.

That's when I thought about creating an app to help us and other players easily manage and track scores. Fortunately, I had free time during the Tết holiday and decided to learn Next.js by building this idea. This project was born out of a desire to enhance our gaming experience and make it more enjoyable for everyone involved.


02Key Features

🃏
Multi-player Scoring
Track scores for 2–6 players simultaneously with a clean, real-time table.
🏆
Session History
Review past games and see who has the best win rate across sessions.
📊
Live Leaderboard
Auto-ranked leaderboard updates instantly after each round.
📱
Mobile-First Design
Built for phones - play on the coffee table without squinting at a laptop.
🎮
Game Rules Built In
Tiến Lên rules baked in; auto-calculates penalties and bonus points.
🌙
Dark Mode
Easy on the eyes for those long Tết holiday gaming sessions late at night.


04Tech Stack

Each technology was chosen deliberately. This was my first real Next.js project - the goal was to learn the framework while shipping something genuinely useful.

Next.js
App Router + server components for fast initial loads. Also great practice for learning the framework.
Chakra UI
Component library with a solid theming system. Gave me dark mode and responsive layouts nearly for free.
Framer Motion
Page transitions and micro-animations that make the app feel snappy and polished.
Tailwind CSS
Utility classes for quick layout work alongside Chakra, especially for the score table grid.

05Under the Hood

The core of the app is a score reducer that handles all game state - adding players, submitting round scores, and computing the running totals with penalty logic.

TypeScript

// Score reducer - handles round submissions function scoreReducer(state, action) { switch (action.type) { case 'SUBMIT_ROUND': { const { scores, penalty } = action.payload return { ...state, rounds: [...state.rounds, scores], totals: state.players.map((p, i) => ({ ...p, score: p.score + scores[i] - (penalty[i] ?? 0) })) } } case 'ADD_PLAYER': return { ...state, players: [...state.players, action.payload] } default: return state } }

06Project Stats

~1 week
Dev time
4
Screenshots
1
Game supported
4
Max players

07Future Work

Multi-game support
Add Xì Dzách, Phỏm, and other popular Vietnamese card games via a start-menu selector.
Session history & database
Persist session data so players can track win rates and rivalries over time.
Offline mode
PWA support so the app works without internet - important for family gatherings in rural areas.
Mobile-first layout
The current design already prioritizes mobile phones for in-game use.
Dark mode
Dark theme implemented for those late-night gaming sessions.

Try it yourself
The live demo is deployed on Vercel. Works great on mobile - just open it on your phone next time you play Tiến Lên.
Open Live DemoView Source
Read More

Pomodoro Timer

A Pomodoro timer living inside Neovim - written in pure Lua, zero dependencies, synced across sessions via IPC.

By Minh-Tri Le - Neovim Plugins

Toggle Terminal

A dependency-free Neovim plugin for a floating terminal with multi-session support - centered on screen, winbar tab bar, persistent buffers, auto-resizing on UI changes.

By Minh-Tri Le - Neovim Plugins

iBridge - IPC messaging & RPC framework

An IPC/RPC framework that bridges processes across language boundaries - a C++ server and a JavaScript client talking to each other over Unix domain sockets and Protocol Buffers, with no shared memory and no native bindings.

By Minh-Tri Le - Side Projects

Understanding MachO Binary Format

High level architecture of a Mach-O binary. Learned through implementing application support parsing iOS binary.

By Minh-Tri Le - Mar 2025
N

Subscribe to my newsletter

Get notified when I publish new posts on my blog

© 2026 Minh-Tri Le. All rights reserved.