taiphanvan.dev
WorkBlogTools
VIEN

© 2026 Phan Văn Tài

githublinkedinRSS
← /work
2025 — present·Đã ra mắt

PES Arena

Mobile app tổ chức giải đấu PES — chạy được cả khi LAN party mất wifi

Vai trò

Solo

Công nghệ

FlutterFirebaseSQLiteBLoCiOSAndroid
Bản chạy Mã nguồn

Mobile app cho dân PES tự tổ chức giải đấu — tạo group, sinh lịch round-robin, nhập tỉ số, track bảng xếp hạng, chat với crew. Online thì sync real-time qua Firebase, offline thì rớt về SQLite local — giải vẫn chạy mượt khi LAN party mất wifi giữa chừng.

Tải app: App Store · Google Play. Open source trên GitHub.

Background#

Cộng đồng PES Việt Nam hay tự tổ chức giải nhỏ — bạn bè, công ty, quán game. Workflow phổ biến: Excel kẻ bảng đấu, group chat ghi tỉ số, nhớ ai thắng ai thua qua… trí nhớ. Đông người, mất wifi giữa chừng là chương trình loạn.

PES Arena rút gọn vòng đó: tạo group → invite member → app tự sinh lịch round-robin → enter tỉ số sau mỗi trận → bảng xếp hạng tự update (W/D/L, bàn thắng, hiệu số). Free, không bắt buộc đăng ký, chạy được hoàn toàn offline.

Tech stack#

  • Flutter + Dart — một codebase cho iOS, Android và web shell. App đang dùng Flutter SDK >=3.41.0, Dart SDK >=3.10.0.
  • BLoC + Clean Architecture — feature tách theo presentation, domain, data; state management chính bằng flutter_bloc, phụ trợ bằng provider.
  • Firebase — Auth cho email/password + Google Sign-In, Firestore cho real-time tournament/group/chat, Storage cho avatar/media, Messaging cho push notification, Remote Config cho cấu hình runtime.
  • SQLite / sqflite — local database cho offline mode. Tournament data lưu trong máy nên vẫn tạo giải, nhập tỉ số, xem bảng xếp hạng khi không có mạng.
  • go_router + get_it — điều hướng declarative và dependency injection cho bloc/repository/use case.
  • fl_chart + Google Mobile Ads — chart thống kê trong app và monetization nhẹ bằng ads.
  • Fastlane + Store release flow — có cấu hình release cho Android/iOS và app đang public trên Google Play + App Store.

Challenges#

(Sẽ viết sau — bro fill phần này: cái gì khó nhất khi build, decision nào regret/đáng giá nhất.)

Lessons#

(Sẽ viết sau.)