← back to services

live · service

GTOPlaybook

홀덤 GTO 차트를 한 손에. 2~9인 테이블, 7bb / 15bb / 25bb 스택 깊이, 모든 포지션의 RFI · 3bet · BB/SB 디펜스 의사결정 그래프 — 거기에 핸드 분석기와 팟 계산기까지.

Flutter Provider Firebase Auth Node.js TypeScript Express PostgreSQL i18n (ko · en)

서비스 소개

GTOPlaybook 은 홀덤 토너먼트 / 캐시 게임에서 의사결정의 기준이 되는 GTO(Game Theory Optimal) 차트를 모바일에서 한 손으로 다룰 수 있게 만드는 학습 도구입니다. 포지션 · 스택 · 상황을 고르면 그에 맞는 레인지 그리드를 보여주고, 사용자가 들고 있는 핸드를 입력하면 그 자리에서 권장 액션을 알려줍니다.

앱은 Flutter, 서버는 Node.js + TypeScript + Express + PostgreSQL. 차트 데이터는 서버에서 시드 데이터로 관리하고, 앱은 한국어 / 영어 양쪽으로 제공됩니다. 인증은 Firebase Auth (Google Sign-In) 위에 자체 세션을 얹는 구조입니다.

Architecture

한 대의 VPS 위에 컨테이너로 묶은 일반적인 구성. 차트 데이터는 서버 시드로 관리하고, 클라이언트는 캐싱 + 캘리브레이션 형태로 받아옵니다.

/ client iOS app Flutter · Provider Android app Flutter · Provider https · gto.jiny.shop / edge Nginx · reverse proxy TLS · CORS · 정적 admin web / app Express + TypeScript 차트 시드 · 핸드 분석 · 인증 (express-session) · admin / data & ext PostgreSQL 사용자 · 세션 · GTO 시드 · 문의 Firebase Auth Google Sign-In single VPS · Docker

Behind the scenes

만들면서 가장 까다로웠던 두 가지 — 정확한 GTO 데이터를 시드 단계에서 잡는 일, 그리고 그걸 모바일 한 화면에 압축해 보여주는 일.

  1. 01

    코드보다 데이터가 더 어렵다

    GTO 차트는 한 줄로 표현하면 단순합니다 — "어떤 손패를 어떤 액션으로 가야 하는가". 그런데 그 단순한 표가 포지션 × 스택 깊이 × 상황(RFI / 3bet / 4bet / BB defend / SB defend / vs3bet) × 플레이어 수의 곱으로 폭발합니다. 처음 시드를 채울 때는 그럴듯해 보여도, 막상 기능을 켜놓고 살펴보면 — 15bb push/fold 에서 QTs 가 빠져있고, HJ 25bb RFI 에서 99 가 누락되고, 15bb BB defend 3bet 에서 AA / KK 가 빠져있는 식의 디테일이 줄줄이 발견됐습니다. v1.0.0 출시 직후의 작업 절반은 차트 데이터를 줄 단위로 다시 검수하는 일이었고, 결국은 "GTO 정확도 보강" 커밋 시리즈를 한 라운드 굴리고서야 어느 정도 닫혔습니다. 앱의 가치가 코드가 아니라 데이터 자체에 있는 종류의 프로젝트라는 걸 — 만들면서 새삼 배웠습니다.

  2. 02

    169칸을 모바일 한 화면에

    13×13 의 핸드 매트릭스(169칸)를 책상 위 모니터가 아닌 손바닥만 한 화면에 — 게다가 색상 / 비율 / 액션 라벨까지 — 한눈에 들어오게 풀어내는 게 또 다른 도전이었습니다. 처음엔 그리드가 빽빽해서 셀 하나하나의 색이 어떤 액션을 의미하는지 헷갈렸고, "Mixed" 액션은 한 셀에 두세 색이 들어가야 해서 더 복잡했습니다. 결국 simple mode 와 detail mode 를 따로 두고, 자주 쓰는 정보(액션 우선순위)는 색으로, 디테일(비율)은 탭 후 패널로 풀어내는 식으로 절충했습니다. 데이터의 정확도를 잡는 일이 바닥에서의 일이라면, 이 일은 천장에서의 일 — 모바일이라는 좁은 천장 아래에 정보를 어떻게 끼워 맞출지의 문제였습니다.

Screenshots

카드를 누르면 큰 이미지로 볼 수 있습니다.

More

지나온 버전과 앞으로 들어갈 항목을 별도 페이지에서 확인할 수 있습니다.