← 10x-lifeos.com

La Bàn Vibe-Code

Không phải một trang để đọc. Mà là cái la bàn để mỗi lần bạn biến một ý tưởng thành phần mềm hoàn chỉnh — cùng AI.
Kho tri thức 10X · từ ý tưởng đến triển khai · đúc từ 3 app thật
La Bàn · 7 chặng

Từ ý tưởng đến triển khai — bảy chặng, bảy cổng

Đây là cái la bàn. Mỗi chặng có một cổng (gate) — qua được cổng mới đi tiếp, không nhảy cóc. Bấm một chặng để mở chi tiết: mấu chốt · chỉ số · lưu ý · cổng · ví dụ thật.

G1 G2 G3 G4 G5 G6 G7 · VÒNG LẶP — APP SAU BẮT ĐẦU TỪ VẠCH XA HƠN 1Ý 2Khuôn 3Dựng 4Chữa 5Trao 6Mở 7Ngẫm
Bảy chặng · bảy cổng · một vòng lặp — bấm một chặng để mở chi tiết
Không phải một đường thẳng kiểu thác nước. Mà là một vòng lặp ngắn — chặng 7 nối ngược về chặng 1, mỗi vòng khởi động từ vạch xa hơn.
1
Ý — Bắt lấy một ý tưởng (Idea & Validation)
Không phải 'app hay để tặng'. Mà là 'MÓN này, cho NGƯỜI này có tên thật, đỡ khổ đúng CHỖ này'.
Điểm mấu chốt
Chốt ĐÚNG 1 việc (Job-To-Be-Done) + 1 người dùng đầu tiên có tên + rủi ro/ràng buộc lớn nhất — và quyết sớm 'tự xây hay FORK' một dự án mã nguồn mở khi phần lõi quá khó.
Chỉ số theo dõi
Mô tả app trong 1 câu < 20 từ ('app làm X, offline, cho người Y') Số feature v1 KHÔNG phục vụ job lõi = 0 (đúng 1 việc, tối đa 3) Bạn tự dùng thật ≥ 5 ngày/tuần trước khi cam kết xây tiếp; đã có kết luận 'tự xây hay fork' kèm lý do
Lưu ý / cái bẫy
  • Đừng 'solution hoá': job là KẾT QUẢ, không phải giải pháp (không ai muốn mũi khoan, họ muốn cái lỗ) — Christensen JTBD.
  • Đừng gom 2 job vào 1 app cho 'đáng công': 2 job = 2 sản phẩm → tách/giết ngay khi còn miễn phí.
  • Đừng lao vào tự viết phần lõi cực khó (nhận diện giọng nói, xử lý ảnh) chỉ vì 'muốn tự làm cho oai' — fork tiết kiệm hàng tháng, đổi lại phải cầm chắc phần phát hành + kiểm thử.
Cổng phải qua
CỔNG G1: Viết ra được 1 câu việc + 1 người dùng đầu tiên có tên + rủi ro lớn nhất, VÀ một kết luận 'tự xây hay fork' có lý do. Chưa viết ra → chưa được spec.
Ví dụ thật · từ 3 appVoiceFlow chọn FORK Handy (cjpais/Handy) vì tự làm STT offline quá khó — bằng chứng 'có người cần' đã nằm sẵn ở dự án gốc. Chép Lời chốt ràng buộc 'KHÔNG Python' → quyết cả stack (Tauri+Rust, audio thuần Rust) để đóng gói được Windows. Cả 3 app đều là 'gãi đúng chỗ ngứa của chính mình'.
2
Khuôn — Định hình & Viết spec (Spec-first)
Không phải tài liệu 20 trang. Mà là MỘT trang: 'xong là gì · CỐ TÌNH KHÔNG làm gì · 1 chỉ số thành công đo được' — viết TRƯỚC khi AI gõ dòng nào.
Điểm mấu chốt
Biến ý thành spec 1 trang tự-đủ (có danh sách Non-goals dài hơn danh sách 'làm') + chốt nền công nghệ MỘT lần + test rủi ro lớn nhất bằng cách rẻ nhất TRƯỚC khi build.
Chỉ số theo dõi
Spec gói ≤ 1-2 trang, đọc hết < 3 phút, kết bằng 1 bước kiểm chứng đầu-cuối Danh sách 'KHÔNG làm' ≥ danh sách 'có làm' (tối thiểu 3-5 non-goals) Giờ-để-test-rủi-ro ≤ 1 ngày; chỉ số thành công 'đo được' ('chép clip VN 10 phút < 1 phút, ≥17× realtime'), không phải 'chạy tốt'
Lưu ý / cái bẫy
  • Đừng để AI 'nhảy thẳng vào code' (Anthropic cảnh báo: dễ giải SAI vấn đề) — luôn bắt lập kế hoạch (plan mode) và duyệt bằng tiếng người trước.
  • Đừng phình thành PRD doanh nghiệp; nhưng cũng đừng build cả MVP chỉ để 'xem có chạy không' — test mọi thứ cùng lúc thì học chẳng được gì rẻ (RAT trước MVP).
  • Đừng đổi khung công nghệ giữa chừng theo cái 'xịn' hơn — năng suất đến từ làm chủ sâu MỘT stack (Tauri+Rust+WebView, cố định).
Cổng phải qua
CỔNG G2: Spec gói trong 1-2 trang, có mục 'Không làm gì' (Non-goals) + đúng 1 chỉ số thành công đo được; nền công nghệ đã chốt+ghi vào CLAUDE.md; rủi ro lớn nhất đã test bằng cách rẻ.
Ví dụ thật · từ 3 appFC-FastCapture đặt luật 'day one': một lớp platform_backend gom mọi phụ thuộc hệ điều hành về một chỗ → nhờ đó bản Intel & Windows sau này TÁI DÙNG lõi, không viết lại. Chép Lời viết 8 'hard rules' làm spec (SQLite là nguồn sự thật duy nhất cho 'xong'; ghi file text TRƯỚC rồi mới dời con trỏ tiến độ) → thành unit-test + resume-sau-crash.
3
Dựng — Build cùng Claude Code (bộ xương biết đi)
Không phải để agent làm cả app trong một phát rồi tin 'đã xong'. Mà là chẻ thành LÁT MỎNG chạy được — mỗi lát BẠN tự mắt xác nhận rồi mới qua lát sau.
Điểm mấu chốt
Dựng 'bộ xương biết đi' (lõi rủi ro, end-to-end) TRƯỚC, engine trước giao diện sau; rồi bồi từng lát nhỏ đủ-để-kể-bằng-1-câu, mỗi lát verify bằng CHẠY THẬT — agent là thợ giỏi nhưng mù màn hình của bạn.
Chỉ số theo dõi
% feature chạy đúng mỗi gate = 100% trước khi qua; mỗi thay đổi đủ nhỏ để mô tả bằng 1 câu Số lát 'agent bảo xong mà chưa chạy thật' = 0; AI sửa lại cùng một chỗ ≤ 2 lần rồi /clear + viết lại prompt Đúng 1 bản gốc (1 repo), 0 bản sao tạm, 0 chìa khóa/bí mật trong thư mục code
Lưu ý / cái bẫy
  • 'Trông đúng' KHÔNG phải verify — đừng nhận lời hứa 'xong rồi', đòi CHẠY thật (screenshot/test/tái hiện luồng). Verify API tồn tại trước khi viết (chống hallucination).
  • Vibe coding thật (nhận code mình không hiểu/không kiểm) OK cho bản nháp bỏ đi, KHÔNG cho bản tặng — code AI có ~1,7× lỗi lớn & ~2,74× lỗi bảo mật.
  • Chặn agent 'tiện tay' phình phạm vi + chặn scope-creep thầm lặng: chốt 'done', đẩy feature mới vào backlog trong CLAUDE.md.
Cổng phải qua
CỔNG G3: 'Bộ xương biết đi' chạy end-to-end trên máy mình (input→lõi→output). Sau đó mỗi lát/feature compile + happy-path đã verified bằng chạy thật trước khi qua lát kế.
Ví dụ thật · từ 3 appChép Lời chia 7 module đánh số (DB→audio→whisper→ghép→one-file→hàng đợi→UI), mỗi cái `cargo test` trước khi sang cái kế; decode thuần Rust (symphonia+rubato, không ffmpeg) → file m4a 2h10m ~4.7s. FC-FastCapture: 15 module phải import sạch trên cả macOS lẫn Windows, CI xác nhận 15/15 mỗi push; kiến trúc 'không bao giờ crash' (mọi lệnh hệ thống bọc guard).
4
Chữa — Debug & Test (ĐO, đừng ĐOÁN)
Không phải sửa theo cảm giác cho 'nó chạy trên máy tôi'. Mà là TÁI HIỆN → ĐO → sửa GỐC → chặn tái phát — và thử trên MÁY SẠCH, chip khác.
Điểm mấu chốt
Vòng debug 5 bước (Tái hiện → Cô lập → Giả thuyết → Sửa → Chặn tái phát) với Luật Sắt 'không sửa khi chưa tái hiện được'; bắt AI TỰ chứng minh nó đúng bằng bằng chứng cứng; và ghi mỗi con bug thành 1 viên gạch cho template.
Chỉ số theo dõi
Time-to-reproduce < 1 ngày; bug tái phát sau khi 'đã sửa' = 0 100% tính năng có cách tự kiểm chứng (test/build/ảnh); checklist 'thế nào là XONG' mọi mục Pass mới ship Đã thử trên máy SẠCH + nhiều loại phần cứng (chip máy bạn + phương án cho chip cũ/khác)
Lưu ý / cái bẫy
  • 'Chậm' ≠ 'hỏng': Windows 'treo' = CPU chậm (không GPU), không phải lỗi logic — giả thuyết flash-attn từng bị BÁC bằng đo. Tự bác bỏ giả thuyết của mình bằng số đo.
  • Máy mình chạy ≠ máy sạch chạy: nhiều lỗi chỉ lộ khi đóng gói (quyền, đường dẫn, chữ ký, MAX_PATH 260, chip cũ thiếu khả năng tăng tốc → sập ngay khi mở).
  • Sửa triệu chứng (ẩn thông báo lỗi) thay vì gốc = bug quay lại chỗ khác. Crash tầng C (SIGTRAP/SIGABRT) KHÔNG bắt được bằng try/except — phải CHẶN, không 'bắt'.
Cổng phải qua
CỔNG G4: Cài trên máy SẠCH chạy được, happy-path hoàn tất, 0 crash; checklist 'XONG' mọi mục Pass.
Ví dụ thật · từ 3 appChép Lời đo GPU 6s vs CPU 74s (clip 30s) thay vì đoán; battery ca biên 10/10 (0-byte, text giả mp3, emoji tên file đều graceful). VoiceFlow: bug treo khi mic không dây rớt = 'người nghe' chờ tiếng động vĩnh viễn → bắt nó cứ vài phần giây ngó lệnh + cờ 'thiết bị chết'; rồi kiểm thử ĐỐI KHÁNG bằng 'đầu óc mới'. FC-FastCapture: cdhash đổi mỗi build → mất quyền TCC → dựng chứng chỉ ký cố định để giữ quyền.
5
Trao — Launch & đóng gói để tặng
Không phải 'nó chạy trên máy tôi'. Mà là một bản cài BẤM-LÀ-CHẠY trên máy sạch của người nhận, kèm lời dặn cho người không phải dev.
Điểm mấu chốt
Đưa bản thô-nhưng-chạy tới người thật SỚM để họ làm được việc lõi mà không cần bạn chỉ; đóng gói 1-click chạy offline; ghi lại 1 quyết-định-học (đi tiếp / đổi hướng). Launch là thí nghiệm, không phải đích.
Chỉ số theo dõi
1 người dùng thật hoàn thành việc lõi mà không cần bạn hướng dẫn; install-success trên máy sạch 100% Hướng dẫn cài ≤ 5 bước cho người-không-dev; từ tải về đến dùng được < 5 phút First-run success: chạy offline, tự tải model có progress, hiện rõ backend (GPU/CPU), không 'treo' thầm
Lưu ý / cái bẫy
  • Launch ≠ finish — là thí nghiệm, quay lại phase 3-4 và lặp nhiều lần (Airbnb relaunch 3×). Cầu toàn không hạn giờ: app ship trong 2 ngày thắng app hoàn hảo vẫn đang review.
  • App chưa ký hệ điều hành → Gatekeeper 'hỏng' / SmartScreen 'nhà phát hành lạ' → PHẢI dặn trước bằng tiếng Việt (Mac: chuột phải > Open; Windows: More info > Run anyway).
  • Đóng gói xong nhớ đăng ký app với hệ thống (Spotlight/menu) kẻo người nhận không tìm thấy; và quyền hệ thống hay reset sau mỗi build → dặn trước màn xin quyền.
Cổng phải qua
CỔNG G5: 1 người dùng thật hoàn thành việc lõi mà không cần bạn hướng dẫn; bản cài đã thử trên máy/tài khoản sạch; 1 quyết-định-học đã được ghi lại.
Ví dụ thật · từ 3 appChép Lời đi v0.1.0 → v0.1.4 trong 2 ngày, mỗi bản 1 câu changelog VN ('Sửa Windows treo...', 'Thêm bản Windows GPU...'), ship unsigned cho bạn bè kèm HTML hướng dẫn cài. FC-FastCapture đóng .dmg có sẵn symlink /Applications để kéo-thả là cài; macOS dặn chuột phải > Open + 2 quyền + khởi động lại — đúng một phút là chụp được.
6
Mở — Đóng gói đa nền · Chuyển giao · Publish & Deploy
Không phải build tay từng bản rồi upload tay. Mà là ĐẨY MỘT NHÃN phiên bản → máy GitHub tự lo phần còn lại; và một link tải sống + trang đúng giọng để người lạ tự dùng.
Điểm mấu chốt
Biến phát hành thành MỘT hành động (Actions matrix build Mac/Win/Linux + ký tự-cập-nhật + tạo Release + latest.json từ 1 git tag); deploy web kỷ luật; quản danh tính ký số qua các bản. 1 mũi tên, N đích.
Chỉ số theo dõi
Số hành động thủ công để ra bản = 1 (chỉ đẩy tag, khớp version); dây chuyền xanh cả 3 hệ điều hành Time-to-deploy < 30 phút; installer nhỏ (Chép Lời 6MB dmg / 4.4MB exe, model tải khi first-run) Link tải sống (bấm từ máy lạ tải được, có version) + trang: cho ai · giải nỗi đau gì · tải ở đâu trong 1 màn cuộn + OG 1200×630
Lưu ý / cái bẫy
  • Lần đầu dựng dây chuyền THƯỜNG ĐỎ ở cả 3 hệ điều hành vì 3 lý do khác nhau — đó là bình thường, sửa từng cái, không làm lại từ đầu.
  • Catalog bẫy Windows CI học-1-lần-dùng-mãi: LIBCLANG thiếu · MAX_PATH 260 → CARGO_TARGET_DIR=C:\b · GPU/Vulkan phải TÁCH exe (0xc0000135 trên máy không GPU) · dùng native-tls không rustls · token cần scope workflow.
  • PHÂN BIỆT 2 loại ký: minisign tự-cập-nhật (MIỄN PHÍ, bắt buộc) khác Apple/Windows EV (trả phí, chỉ tắt cảnh báo) — đừng mua nhầm cái đắt. Bẫy web: tên miền 'Parked'/DNS sai + cache trả bản cũ + tên miền có gạch ngang (10x-lifeos.com gõ thiếu → NXDOMAIN).
Cổng phải qua
CỔNG G6: Installer đã kiểm trên máy người nhận sạch; mọi thay đổi mang 1 version + 1 câu changelog; 0 build/upload thủ công; dây chuyền xanh cả 3 nền; link tải sống + đường lùi (bản cũ) sẵn.
Ví dụ thật · từ 3 app3 app dùng chung MỘT matrix; Chép Lời ra 3 installer/bản (Mac dmg, Win CPU exe, Win GPU/Vulkan exe). VoiceFlow lần đầu FAIL cả 3 OS (Mac lỗi nhập chứng chỉ; khóa updater 'Wrong password'; Linux thiếu FUSE) → vá 2 vòng. Luật vàng '1 repo = 1 clone gốc'. Deploy 10x-lifeos.com bằng git push → Hostinger auto-deploy, verify HTTP 200 + một dấu mốc nội dung mới.
7
Ngẫm — Đánh giá · Kaizen & Chuẩn hóa (Templatize)
Không phải viết một trang nhật ký rồi cất. Mà là CHƯNG CẤT buổi làm thành ≥1 TEMPLATE tái dùng — thứ khiến app N+1 khởi động từ vạch xa hơn hẳn.
Điểm mấu chốt
Retro không đổ lỗi (blameless), ghi mọi bẫy không hiển nhiên vào bộ nhớ bền, và RÚT ≥1 tài sản tái dùng (skeleton / checklist / sổ bẫy / brand tokens / CI workflow) vào thư viện. Đây là điểm nối vòng về Phase 1 — giai đoạn đòn bẩy cao nhất cho người làm-lại-N-lần.
Chỉ số theo dõi
≥1 tài sản mới được templatize + ≥1 dòng bài học vào CLAUDE.md/memory SAU MỖI bản phát hành Reuse ratio tăng mỗi project (mục tiêu: zero → skeleton build-trong-CI < 1 giờ); thời gian app N < app N-1 (đường cong đi xuống) Số bẫy phải học-lại = 0 (ghi ngay khi vừa giải); CLAUDE.md không phình (không dòng nào 'bỏ đi AI vẫn đúng')
Lưu ý / cái bẫy
  • Kaizen ≠ chỉ suy ngẫm: deliverable là một TEMPLATE, không phải trang nhật ký. Không templatize được gì = phase chưa xong.
  • Đừng chưng cất khi ký ức đã nguội — làm NGAY lúc còn nóng, nhớ rõ chỗ đau. Và template phình cũng là nợ: chỉ giữ phần THẬT SỰ lặp lại, cắt mỡ định kỳ.
  • Lỗi #1: quyết start/stop/continue rồi không follow-through → biến action item thành mục backlog hạng nhất. Nguồn lỗi UI lặp = dựng từ trí nhớ thay vì COPY nguồn brand chuẩn (icons.js/brand.css chung).
Cổng phải qua
CỔNG G7: Bài học/bẫy đã ghi vào bộ nhớ bền + ≥1 tài sản mới đã được templatize. Sản phẩm #N+1 khởi động từ NHIỀU template hơn #N — nếu không thì chỉ là 'lặp lại', chưa phải 'giỏi lên'.
Ví dụ thật · từ 3 appChép Lời đẻ ra 8 tài sản tái dùng (CI matrix, design tokens navy+cam, PAT GitHub đã lưu, mẫu SQLite-notebook, hệ memory, công thức build, mẹo render HTML→PNG headless, khung 3-Gate). FC-FastCapture chưng cất 'sổ bẫy macOS' (Tool-window không thành key, quyền reset theo chữ ký, LSUIElement, Spotlight) → gỡ rủi ro cho CẢ bản Intel lẫn Windows, biến 2 lần port thành việc LẶP không phải viết lại. 'Bộ khung 10X' (brand.css + icons.js + header/footer + _mau/landing) → app mới COPY mẫu.
Nguyên tắc & Bẫy

Cách người xây sản phẩm đẳng cấp tư duy

Bên trên bảy chặng là một lớp triết lý. Nắm được lớp này thì mỗi quyết định nhỏ tự đúng hướng.

1Tái hiện2Cô lập3Giả thuyết4Sửa5Chặn tái phátLẶP TỚI KHI MƯỢT
Vòng gỡ lỗi 5 bước — Luật Sắt: KHÔNG sửa khi chưa tái hiện được. ĐO, đừng ĐOÁN.
Nguyên tắc 1
De-risk theo thứ tự — Cổng trước, App sau
Chứng minh phần RỦI RO NHẤT chạy được trước (động cơ/lõi), rồi mới bọc app, rồi mới đóng gói — chia mốc theo cổng (Gate): qua cổng nào chắc cổng đó mới đi tiếp. Nếu lõi bất khả thi, hỏi sớm 'tự xây hay FORK một dự án mã nguồn mở đã chạy tốt?' — đó là quyết định định hình lớn nhất của cả dự án (VoiceFlow fork Handy, tiết kiệm hàng tháng).
Nguyên tắc 2
Đặc tả trước — chốt 'XONG' và nhất là 'KHÔNG làm'
Viết một trang spec trước khi cho AI gõ dòng nào: một câu chuyện người dùng đầu-đến-cuối + danh sách 'KHÔNG làm' (non-goals) dài hơn danh sách làm. Prompt mơ hồ cho kết quả sai; danh sách 'KHÔNG làm' là hàng rào hữu hình nhất chống phình phạm vi. Bạn quyết 'làm cái gì', AI lo 'làm thế nào' — đó là siêu năng lực của người không code.
Nguyên tắc 3
Bước nhỏ — lát mỏng, verify từng lát
Mỗi thay đổi đủ nhỏ để kể bằng một câu; một lát → agent code → BẠN tự chạy thật, nhìn tận mắt → mới qua lát sau. Ghi mốc (commit) nhỏ, thường xuyên để luôn có đường lùi rẻ. Lỗi bắt sớm rẻ gấp 100 lần bắt muộn; nhồi nhiều yêu cầu cùng lúc làm chất lượng tụt.
Nguyên tắc 4
ĐO, đừng ĐOÁN
Sự thật đến từ phép đo, không từ cảm giác — cho mình VÀ cho AI. Bug 'treo Windows' hoá ra chỉ là CHẬM (2,5× CPU vs 17× GPU): tái hiện → bấm giờ → giả thuyết 'flash-attn' bị chính số đo bác bỏ. Nghiên cứu METR: dev tưởng mình nhanh hơn 20% với AI nhưng thực tế chậm hơn 19%. Đòi bằng chứng cứng trước khi tin bất kỳ fix nào.
Nguyên tắc 5
Không kiểm chứng được thì đừng ship — bắt AI TỰ chứng minh
Mỗi tính năng phải có ÍT NHẤT một cách tự chấm (test/build/log/ảnh chụp), AI chạy nó và TRƯNG bằng chứng — đừng nhận lời hứa 'xong rồi'. Điểm gặp nhau của mọi trường phái giỏi: đừng để con người làm vòng kiểm chứng; luôn có tín hiệu đậu/rớt tự chạy được. Dùng một AI 'đầu óc mới' review lại, nhưng chỉ soi lỗi ảnh hưởng tính đúng.
Nguyên tắc 6
Một nguồn sự thật duy nhất
App: một cuốn sổ SQLite ghi trạng thái mọi file → tắt máy mở lại chạy tiếp, không loạn. Dự án: 1 repo = 1 bản gốc duy nhất, cấm clone tạm (mỗi phiên làm ở bản khác sẽ lệch nhau, không biết bản nào thật). Đồ nặng (bản cài, mô hình) và chìa khóa bí mật để NGOÀI thư mục code.
Nguyên tắc 7
Tự động hoá phần LẶP LẠI — 1 mũi tên N đích
Một file CI (GitHub Actions matrix) → tự dựng Mac + Windows + Linux + GPU cho MỌI phiên bản, không cần máy trong tay. Việc phát hành gói thành MỘT hành động: đẩy một tag khớp version → máy tự build + ký + tạo Release. Viết 1 lần, chạy mãi mãi — nhưng biết trước: dây chuyền lần đầu THƯỜNG đỏ ở cả ba hệ điều hành, đó là bình thường, sửa từng cái.
Nguyên tắc 8
Nói bằng KẾT QUẢ, không bằng cơ chế
Với người không rành kỹ thuật (hoặc chính mình 6 tháng sau): nói 'app chạy 17× nhanh', đừng nói 'Metal flash-attn kernel'. Dùng ẩn dụ đời thường: 'bộ não' (model), 'cuốn sổ' (DB), 'chìa khoá' (private key), 'hộp khóa' (secret). Chuyển giao phải nói được tiếng người thì người nhận và AI mới cầm lái được.
Nguyên tắc 9
Làm một lần cho đàng hoàng, để lại một tài sản tái dùng
Mỗi khi làm việc gì lần thứ 2, hỏi 'làm sao để lần thứ 3 không phải làm nữa?' → biến nó thành template/script/checklist. Chứng chỉ ký cố định, lớp platform_backend gom mọi thứ phụ thuộc OS về một chỗ, sổ bẫy, design tokens — mỗi thứ khiến hai lần port thành việc LẶP chứ không phải viết lại. Ghi lại điều KHÔNG hiển nhiên (hash, path, cái bẫy) vào CLAUDE.md + memory.
Nguyên tắc 10
Ship sớm — vòng lặp ngắn, cầu toàn có hạn giờ
Đây là VÒNG LẶP ngắn lặp nhiều lần, KHÔNG phải đường thẳng kiểu thác nước. Đặt 'khẩu vị thời gian' (vd 2 tuần) cố định rồi co giãn phạm vi cho vừa. Landing sửa ~8 vòng nhỏ vài phút mỗi vòng; app ship trong 2 ngày thắng app hoàn hảo vẫn đang review. Hoàn hảo là kẻ thù của Xong.
Những cái bẫy đắt nhất

16 cái bẫy khiến bạn trả học phí

Prompts · Cách nói với AI

Thư viện prompt — dán thẳng vào Claude Code

Cho người mới. Mỗi chặng có 1–2 câu lệnh mẫu, chỗ [trong ngoặc] là chỗ bạn điền. Bấm Copy rồi dán vào Claude Code.

1 · Ý tưởng (Ý — bắt lấy một ý)
Cố vấn khó tính soi ý tưởng + gãi đúng chỗ ngứa
Mình muốn làm một app nhỏ chạy offline để [làm việc X] cho [người nhận có tên thật: vd mình / mẹ mình / bạn A]. Hãy đóng vai một cố vấn khó tính, ĐỪNG vội khen. Hỏi ngược mình từng câu: (1) ai dùng, dùng lúc nào? (2) nếu KHÔNG có app này thì họ đang xoay xở ra sao? (3) mình có tự dùng nó mỗi ngày không? Sau đó giúp mình viết lại thành đúng MỘT câu dưới 20 từ theo khuôn "món [X] này, cho [người này], đỡ khổ chỗ [Y]". Cuối cùng chốt giúp mình: tính năng LÕI đúng 1 (tối đa 3), và những thứ nên để lần sau.
→ Vì sao chạy: Ép nói tên người nhận + nỗi đau trong 1 câu trước khi gõ code — chưa gọi được tên thì đừng đụng vào code (bài học nhịp Ý).
Tự xây hay FORK — quyết định định hình lớn nhất
App mình định làm là [mô tả 1 câu]. Phần KHÓ NHẤT của nó là [vd: nhận diện giọng nói / xử lý ảnh / chụp màn hình]. Hãy trả lời mình bằng tiếng người (mình không biết code): (1) phần khó này mình cùng bạn làm nổi từ số 0 không, hay quá khó? (2) có dự án mã nguồn mở nào đã làm sẵn phần đó để mình MƯỢN KHUNG (fork) rồi Việt hóa không — kể tên vài cái? (3) so sánh hai đường tự-xây vs fork về tốc độ và độ an toàn cho người không biết code, rồi khuyên mình chọn cái nào và VÌ SAO.
→ Vì sao chạy: Hỏi 'tự xây hay fork' ngay từ đầu — VoiceFlow fork Handy tiết kiệm hàng tháng; bỏ qua câu này là bỏ qua quyết định lớn nhất của cả dự án.
2 · Spec (Khuôn — viết đặc tả)
Phỏng vấn ngược để viết SPEC.md (1 trang, có danh sách KHÔNG làm)
TRƯỚC khi viết bất kỳ dòng code nào, hãy PHỎNG VẤN NGƯỢC mình để cùng viết ra file SPEC.md — chỉ MỘT trang, đọc hết dưới 3 phút. Cần có: (1) một câu chuyện người dùng chạy suốt từ đầu đến cuối; (2) các trường hợp HỎNG cần lo ([vd: mic rớt giữa chừng, mất file, file rỗng]); (3) danh sách "KHÔNG LÀM lần này" — và danh sách này phải DÀI HƠN danh sách có làm; (4) một câu định nghĩa rõ thế nào là "XONG". Hỏi mình tới khi phủ hết mới thôi. Đừng nhảy vào code.
→ Vì sao chạy: Spec-first: prompt mơ hồ cho kết quả sai. 'KHÔNG làm' là dòng quan trọng nhất — hàng rào hữu hình nhất chống app phình ra mãi.
Chốt nền công nghệ + duyệt kế hoạch bằng plan mode
Mình cố định dùng khung [Tauri + Rust + WebView / stack của bạn] cho mọi app desktop offline — ghi giúp mình MỘT dòng vào CLAUDE.md để lần sau khỏi quyết lại. Nếu mình fork [dự án gốc], giải thích bằng tiếng người: giữ hai đường kết nối (một tới 'bản của mình' để sửa, một tới 'bản gốc' để kéo cập nhật) nghĩa là gì, và những thứ nặng (bản cài, mô hình AI) để NGOÀI thư mục code ra sao. Giờ hãy vào PLAN MODE: đọc và lập kế hoạch nhưng CHƯA sửa gì, trình bày kế hoạch bằng tiếng người để mình duyệt trước.
→ Vì sao chạy: Cố định 1 stack = bớt vô số quyết định lặp; plan mode để bạn cầm lái duyệt 'nó định làm gì' mà không cần đọc code.
3 · Build (Dựng — code cùng Claude Code)
Làm từng lát mỏng CHẠY ĐƯỢC, một câu một lát
Mình làm theo kiểu 'lát mỏng': lần này CHỈ làm đúng một thứ đủ nhỏ để mình kể bằng một câu — [vd: thêm nút bấm để bắt đầu thu âm]. Đây là phần đặc tả liên quan tới lát này: [dán đoạn spec]. Yêu cầu: giữ code ĐƠN GIẢN, có chú thích (mình kiểm bằng HÀNH VI của app chứ không đọc code); làm xong thì DỪNG lại chỉ mình cách tự chạy thử lát này để mình thấy tận mắt; rồi GHI MỐC (commit) với mô tả rõ một ý. Hai luật cứng: KHÔNG BAO GIỜ đưa chìa khóa/mật khẩu vào thư mục code; chỉ làm trên MỘT bản gốc, không tự tạo bản sao tạm.
→ Vì sao chạy: Lát nhỏ dễ kiểm, dễ lùi, ít sai; chỉ đưa phần spec liên quan (nhồi nhiều = chất lượng tụt); agent là thợ giỏi nhưng 'mù màn hình của bạn'.
Reset khi agent sửa 2 lần vẫn sai
Chỗ [tính năng Z] mình đã nhờ bạn sửa 2 lần mà vẫn chưa đúng — đây là dấu hiệu ngữ cảnh đang loạn, mình sẽ /clear. Trước khi mình reset, hãy tóm tắt NGẮN GỌN: mục tiêu đúng của [Z] là gì, hiện đang sai ở đâu, và một cách tự kiểm chứng để biết lần sau đã đúng. Mình sẽ dán bản tóm tắt này vào phiên mới sạch rồi làm lại từ đầu.
→ Vì sao chạy: Corrections-per-task > 2 = context loạn; đừng cố đấm thêm — /clear rồi viết lại prompt từ ngữ cảnh sạch.
4 · Debug (Chữa — gỡ tới khi mượt)
Tái hiện → đo → sửa GỐC (mô tả triệu chứng, đừng đoán nguyên nhân)
App đang bị [MÔ TẢ TRIỆU CHỨNG mình quan sát được, KHÔNG đoán nguyên nhân: vd &#x27;bấm Lưu là app thoát&#x27;, &#x27;thu âm xong app kẹt đang-bận mãi&#x27;]. Xảy ra khi: [các bước mình làm]. ĐỪNG vội sửa. Làm theo thứ tự: (1) cho mình cách TÁI HIỆN lỗi bằng các bước cố định; (2) bật log / ĐO để chỉ ra nguyên nhân GỐC (đo, đừng đoán); (3) sửa tận gốc chứ đừng ẩn thông báo lỗi; (4) chạy lại đúng bước gây lỗi để CHỨNG MINH đã hết; (5) ghi 1 dòng vào sổ bẫy: triệu chứng → nguyên nhân → cách chặn lần sau.
→ Vì sao chạy: 'Treo' thường là CHẬM chứ không hỏng — luôn tái hiện + đo trước khi sửa; sửa triệu chứng thì bug quay lại ở chỗ khác; mỗi bug là một viên gạch cho template.
Bắt AI TỰ chứng minh + đầu-óc-mới soi lỗi + thử máy khác
Với tính năng [tính năng], hãy cho mình một cách để TỰ kiểm chứng nó chạy đúng (viết test, hoặc build rồi chạy thử, hoặc chụp màn hình) — rồi chạy nó và TRƯNG kết quả cho mình xem. Mình không nhận 'đã xong', mình cần bằng chứng. Sau đó đóng vai một người soi lỗi ĐỘC LẬP đầu-óc-mới, CHỈ báo lỗi ảnh hưởng tính đúng/yêu cầu (đừng bắt bẻ phong cách kẻo over-engineer). Cuối cùng hỏi thẳng: app này có thể SẬP trên máy đời cũ / chip khác / Windows đường dẫn dài không? Nếu có, làm sao để bản mình phát ra chạy được cả trên máy yếu?
→ Vì sao chạy: 'Không kiểm chứng được thì đừng ship'; đòi bằng chứng chứ đừng tin 'xong rồi'; 'chạy tốt trên máy tôi' không có nghĩa chạy tốt trên máy người dùng.
5 · Đóng gói (Trao — gói để tặng, phát hành)
Một cái nhãn phiên bản → cả dây chuyền tự build; đọc lỗi khi đỏ
Mình muốn ra bản mới. Trước khi đẩy: tăng số phiên bản Ở MỌI NƠI cho khớp CHÍNH XÁC (lệch là link tải hỏng), build thử và mở app chạy tính năng lõi, test đúng lỗi vừa sửa, cập nhật CHANGELOG. Rồi mình chỉ đẩy đúng MỘT cái nhãn (git tag [vd v0.8.6]) để máy GitHub tự build Mac + Windows + Linux, tự ký cho tự-cập-nhật, tự đăng Release. LƯU Ý: dây chuyền lần đầu hay ĐỎ ở cả ba hệ điều hành vì ba lý do khác nhau — đó là bình thường. Khi đỏ, mình sẽ chụp phần báo lỗi đưa bạn; hãy đọc giúp mình lỗi đó nghĩa là gì và sửa TỪNG cái một, đừng làm lại từ đầu.
→ Vì sao chạy: Một hành động duy nhất (đẩy tag) bỏ mọi upload thủ công — nguồn sai sót lớn nhất; lần đầu đỏ là bình thường, không phải bạn làm sai.
Phân biệt HAI loại ký số + luôn giữ nút lùi
Giải thích cho mình bằng tiếng người và giúp mình làm ĐÚNG: (1) ký-cho-tự-cập-nhật (dấu niêm phong minisign — MIỄN PHÍ, BẮT BUỘC, để app cũ tin bản mới đúng là của mình) khác với (2) ký-cho-hệ-điều-hành (Apple/Windows — TRẢ PHÍ, chỉ để tắt cảnh báo lần đầu mở). Mình làm app tặng nên chọn đường miễn phí — đừng để mình mua nhầm cái đắt. Chốt giúp: khóa tự-cập-nhật phải CÓ mật khẩu. Và luôn giữ đường lùi: giữ lại bản cài cũ, nếu bản mới hỏng thì 'lùi bằng cách tiến' — ra bản vá số CAO hơn (vì app luôn chọn số lớn hơn).
→ Vì sao chạy: Đừng bị bán nhầm chứng chỉ EV đắt tiền khi chỉ cần minisign miễn phí; bản hỏng tự-cập-nhật lây sang mọi người dùng nên phải lùi được nhanh.
6 · Chuyển giao / Publish (Mở — ra thế giới)
Nút 'Báo lỗi' một chạm + hướng dẫn cài cho người không phải dev
App mình chạy offline nên không có báo-cáo-sập tự động — hãy thêm một nút 'Báo lỗi' mở sẵn email (hoặc trang issue) kèm đường dẫn file nhật ký, đây sẽ là 'giác quan' của mình. Vì mình chọn đường ký miễn phí, người dùng sẽ gặp cảnh báo lần đầu mở — viết giúp mình một trang hướng dẫn cài NGẮN ≤ 5 bước cho người KHÔNG phải dev (Mac: chuột phải > Open + cấp 2 quyền + khởi động lại; Windows: More info > Run anyway). Trước khi loan báo mình sẽ tự cài dùng thử 1-2 ngày (ăn thử món mình nấu).
→ Vì sao chạy: Kênh báo-lỗi-một-chạm thay cho báo-cáo-sập khi offline; hướng dẫn cài rõ ràng là thứ thay thế rẻ nhất cho chứng chỉ hàng trăm đô — thiếu nó người nhận bỏ cuộc ở bước đầu.
Danh tính ký số ổn định (đổi chữ ký = reset quyền) + link tải sống
Trước khi mình phát cho mọi người, kiểm hai thứ: (1) Bản mới có dùng CÙNG một chữ ký với bản người dùng đang cài không? Nếu KHÁC, cài đè sẽ khiến hệ điều hành tưởng là 'app lạ' và RESET quyền mic/trợ năng — hãy cảnh báo mình TRƯỚC và soạn hướng dẫn cấp lại quyền; đừng tự động thay app đang chạy tốt nếu bản mới sẽ reset quyền. (2) Đưa bản tải lên nơi ổn định (release có version) và cho mình một LINK TẢI SỐNG mình bấm thử từ máy lạ tải được (xác minh HTTP 200); trang giới thiệu nói rõ trong 1 màn cuộn: cho ai · giải nỗi đau gì · tải ở đâu.
→ Vì sao chạy: Đổi chữ ký ngầm khiến người dùng mất quyền mic/trợ năng — trải nghiệm rất tệ; link tải chết/không version = mất người dùng.
7 · Đúc kết (Ngẫm — chuẩn hóa & chưng cất)
Hồi cứu 15 phút → mỗi lỗi thành 1 dòng checklist lần sau
Mình vừa ship xong [app/bản]. Làm 'hồi cứu 15 phút' cùng mình: (1) cái gì GIỮ NGUYÊN được cho lần sau, cái gì vừa mất thời gian oan? (2) mỗi LỖI THẬT vừa gặp — biến thành đúng một dòng cho checklist kiểm thử lần sau (triệu chứng → cách chặn); (3) ghi các quyết định lõi và cạm bẫy vào CLAUDE.md và file memory, NGẮN GỌN thôi. Rồi rà lại CLAUDE.md giúp mình: mỗi dòng tự hỏi 'bỏ dòng này bạn có làm sai không?' — nếu không thì CẮT, đừng để nó phình.
→ Vì sao chạy: Mỗi vòng phải khiến vòng sau thông minh hơn — đó là điểm khác biệt giữa 'lặp lại' và 'giỏi lên'; CLAUDE.md phình to thì AI chìm trong nhiễu, bỏ qua nửa số quy tắc.
Chưng cất thành cặp template + checklist tái dùng
Từ buổi làm này, rút ra ÍT NHẤT một thứ tái dùng được: một bộ khung (template landing / brand.css + icons.js + header/footer), một checklist phát hành, hoặc một sổ bẫy. Cất vào thư mục mẫu dùng chung để app sau CHỈ VIỆC COPY, không dựng lại từ trí nhớ (dựng theo trí nhớ chính là nguồn của lỗi UI lặp đi lặp lại). Lần tới khi mình nói 'làm app mới theo đúng khung này', bạn sẽ bê nguyên bộ mẫu ra dùng. Cập nhật template NGAY bây giờ lúc trí nhớ còn nóng, đừng để nguội.
→ Vì sao chạy: Chuẩn hóa bằng cặp 'template + checklist': sửa 1 lần đổi mọi trang, biến hai lần port thành việc lặp không phải viết lại — đầu ra của vòng này là vạch xuất phát xa hơn cho app sau.
Case Study · 3 app thật

Ba app, một cái khuôn

Bảy chặng không phải lý thuyết — chúng rút ra từ ba app thật đã đóng gói & tặng đi. Cùng một khung 3 Cổng:

1Động cơphần KHÓ NHẤT — đo bằng số2Appbọc động cơ thành sản phẩm3Đóng góicho người thường cài
Khung 3 Cổng — chứng minh phần khó nhất chạy được TRƯỚC, rồi mới bọc app, rồi mới đóng gói · qua cổng nào chắc cổng đó

Chép Lời

high — có case-study full-stack chi tiết (BÀI HỌC FULL-STACK .md) + xác nhận chéo trong roadmap HTML; con số đo (17,4× / 2,5×) và bẫy build lấy trực tiếp từ tài liệu.
Chuyển giọng nói → văn bản tiếng Việt, 100% trên máy.
100% OfflineMac + Windows~17× realtime (GPU)Installer ~6MB
Ảnh sản phẩm Chép Lời
Nỗi đau
Chép âm thanh → chữ (transcription), chạy 100% OFFLINE, riêng tư, miễn phí — để tặng bạn bè. Định vị 'đau 1 câu': app chép lời OFFLINE, không phí, không lên cloud.
Động cơ / công nghệ
Bọc engine mã nguồn mở whisper.cpp / whisper-rs (offline, GPU Metal/Vulkan). Vỏ app: Tauri + Rust + SQLite bundled. Audio thuần Rust (symphonia + rubato) để KHÔNG cần ffmpeg. Model 'bộ não' KHÔNG nhồi vào installer (~6MB) mà tải lần đầu.
Bài học riêng
De-risk theo 3-Gate: Engine → App → Package. Chứng minh phần KHÓ NHẤT (spike động cơ) chạy được trên dữ liệu THẬT + đo bằng số TRƯỚC khi bọc UI. Cổng 1 fail thì không tốn công cổng 2-3. Đây là app đúc ra khung 3-Gate và triết lý 'một mũi tên một đích'.
Cú vấp thật
Bug 'treo Windows' hoá ra là CHẬM chứ không hỏng: tái hiện bằng cách ép chạy CPU trên Mac + bấm giờ → đo 2,5× CPU vs 17,4× GPU. Giả thuyết 'flash-attn gây treo' bị chính số đo bác bỏ → giải đúng: dùng GPU Vulkan cho Windows, giữ luôn bản CPU fallback cho máy thiếu driver. Bẫy build đa nền tảng: file rác ._* của macOS trông như file thật; lỗi 'đường dẫn > 260 ký tự' (MAX_PATH) khi build bản GPU trên Windows → sửa bằng CARGO_TARGET_DIR=C:\b.

FC-FastCapture

very high — đây là app của chính session này; xác nhận trực tiếp từ 2 file memory (fc-macos-gotchas.md, fc-published.md) với chi tiết code-level (CGEventTap, platform_backend, PyInstaller per-arch, stable cert).
Chụp màn hình + quay GIF, sửa ngay trên ảnh — macOS & Windows.
Offline / trên máymacOS (AS+Intel) + Windows5 chế độ + quay GIFMiễn phí trọn đời
Ảnh sản phẩm FC-FastCapture
Nỗi đau
Tiện ích chụp/quay màn hình macOS: đúng 5 chế độ chụp + 1 thanh nổi (floating bar), xuất ảnh/GIF. Bề mặt sản phẩm chốt ngay từ Nhịp 1 và giữ nguyên suốt build, không phình.
Động cơ / công nghệ
KHÔNG bọc AI-engine — là app PyQt6 (menu-bar) thuần Python. Chụp màn hình bằng mss; bắt cửa sổ qua Quartz CGWindowList (macOS) / EnumWindows+PrintWindow (Windows). Hotkey toàn cục bằng Quartz CGEventTap trên main run loop. Đóng gói bằng PyInstaller → .app + .dmg (macOS) và .exe --onefile (Windows).
Bài học riêng
Đặt LUẬT KIẾN TRÚC 'day one': một lớp platform_backend gom mọi phụ thuộc hệ điều hành về MỘT chỗ. Nhờ quyết định đó mà 3 nền tảng (Apple Silicon + Intel + Windows) TÁI DÙNG lõi, port thành việc lặp thay vì viết lại (verified 15/15 module import sạch trên cả macOS thật lẫn Windows runner). Kèm kiến trúc 'không bao giờ crash': mọi lệnh gọi hệ thống bọc guard, hỏng thì lùi về fallback chứ không văng.
Cú vấp thật
'App thoát khi bấm Lưu' KHÔNG phải lỗi nút Lưu — là thư viện pynput gọi Text-Input-Source API SAI LUỒNG (off-main-thread) trên macOS 26 → SIGTRAP (crash tầng C, try/except KHÔNG bắt được). Sửa không phải vá mà THAY HẲN bằng Quartz CGEventTap chạy trên main run loop. Cú lớn nhất: chữ ký ad-hoc đổi cdhash MỖI lần build → macOS âm thầm XOÁ quyền (Screen Recording/Accessibility) → dựng chứng chỉ ký CỐ ĐỊNH ('FC-FastCapture Dev (10XLifeOS)' trong keychain riêng) → quyền giữ mãi qua các bản build.

VoiceFlow

medium — details chắc chắn ở tầng CI/ký số/bug treo mic (roadmap HTML mô tả kỹ), NHƯNG như chính tài liệu tự thừa nhận: engine STT cụ thể, cỡ model, phím tắt bản Windows, cơ chế tự-cập-nhật CHƯA xác nhận được từ nguồn công khai — KHÔNG bịa thêm.
Nói tiếng Việt → chữ hiện ngay tại con trỏ.
Đọc → chữ realtimeChèn tại con trỏOfflineFork Handy · Tauri 2
Ảnh sản phẩm VoiceFlow
Nỗi đau
Đọc thành chữ theo thời gian thực (dictation): bấm phím tắt → nói → chữ chèn tại con trỏ. Local-AI, offline, chèn tại chỗ.
Động cơ / công nghệ
KHÔNG xây từ số 0 — FORK dự án mã nguồn mở Handy (cjpais/Handy) rồi Việt hoá + rebrand. Stack: Tauri 2 + Rust backend + React/TS frontend. Giữ hai mối nối git: origin (github.com/thanghuyenduc10x/voiceflow) + upstream (cjpais/Handy để kéo cập nhật). Engine STT offline cụ thể (Whisper? cỡ model?) tài liệu công khai KHÔNG xác nhận được.
Bài học riêng
Con đường nhanh nhất cho một tính năng KHÓ (nhận diện giọng nói offline) là FORK một dự án đã chạy tốt + có người dùng, thay vì tự xây — 'bằng chứng có người cần' nằm sẵn trong việc dự án gốc tồn tại. Đổi lại: phải làm chủ ký số, dây chuyền phát hành, và các ca hỏng thật. Khi fork: thay đổi TỐI THIỂU (giữ nguyên tên binary gốc 'handy' để dây chuyền không vỡ, chỉ đổi lớp nhận diện).
Cú vấp thật
Bug TREO khi mic không dây rớt giữa chừng: 'người nghe' đứng chờ mãi một tiếng động không bao giờ tới nên kẹt 'đang bận', không kịp nhận lệnh Dừng. Sửa: poll vài phần giây một lần (thay vì chờ đến chết) + cờ 'thiết bị đã chết' → dừng ngay + chống 'người gửi ma' trả rỗng thay vì chờ. Sau đó KIỂM THỬ ĐỐI KHÁNG để xác nhận, ghi rủi ro tồn (chế độ luôn-bật còn khựng 2 giây) vào backlog. Riêng: dây chuyền CI FAIL ở CẢ 3 hệ điều hành lần đầu (Mac lỗi nhập cert; khoá updater 'Wrong password'; Linux thiếu FUSE); và mất chứng chỉ tự-ký cũ → bản mới đổi chữ ký → RESET quyền người dùng (chủ động KHÔNG auto-replace).
Tech stack & quyết định

Chọn gì — và vì sao

PyQt6 (FC-FastCapture)
App tiện ích màn hình macOS/Windows dựng bằng Python + Qt (menu-bar app, floating bar, overlay editor). Cho phép GUI native đa nền tảng nhanh mà lập trình viên đơn độc làm chủ được. Khác Tauri/Rust của Chép Lời & VoiceFlow — FC không bọc AI-engine nên không cần Rust.
PyInstaller đóng gói RIÊNG mỗi kiến trúc (per-arch: arm64 native · Intel qua Rosetta · Windows onefile)
PyInstaller KHÔNG cross-compile được → phải build mỗi kiến trúc trên đúng môi trường: arm64 native trên Mac Apple Silicon; Intel build qua Rosetta (build-intel.sh, venv x86_64 dưới arch -x86_64, ký CÙNG cert để TCC khớp); Windows .exe --onefile bắt buộc chạy trên windows-latest runner. Bẫy: với --specpath, đường --icon phải TUYỆT ĐỐI kẻo PyInstaller nhân đôi path và fail bước BUNDLE.
mss (chụp màn hình) + Quartz CGWindowList / EnumWindows+PrintWindow (bắt cửa sổ)
mss cho grab toàn màn hình nhanh, đa màn hình (user có 3 monitor). Bắt cửa sổ riêng: Quartz CGWindowListCopyWindowInfo trên macOS, EnumWindows + PrintWindow (pure ctypes, KHÔNG pywin32) trên Windows cho Mode-4. Cũng dùng mss + CGWindowList để debug khả kiến khi computer-use không cấp quyền cho app mới build theo tên.
Quartz CGEventTap trên MAIN run loop (thay pynput) cho hotkey toàn cục — macOS
pynput crash SIGTRAP trên macOS 26 (gọi Text-Input-Source API off-main-thread) và GlobalHotKeys fail với tổ hợp Option/⌥. Fix: CGEventTapCreate(kCGSessionEventTap) + CFRunLoopAddSource(CFRunLoopGetCurrent()); callback đọc raw keycode + flags (không TIS, không việc off-main) → khớp vk+mods → fire. Cần quyền Accessibility. Trên Windows dùng Win32 RegisterHotKey + QAbstractNativeEventFilter (pure ctypes).
GitHub Actions (windows-latest) build bản Windows — FC-FastCapture
PyInstaller không cross-compile từ Mac sang Windows → CI trên windows-latest là con đường DUY NHẤT để ra .exe. build-windows.yml build FC-FastCapture-Windows.exe (--onefile) + đính vào release mỗi lần push app/**. Source đẩy qua Git Data API (Contents API chặn file workflow nếu thiếu scope 'workflow'; Git Data API thì không).
GitHub Actions matrix + gắn nhãn phiên bản (git tag) — Chép Lời / VoiceFlow
1 file cấu hình → tự dựng Mac (Apple Silicon + Intel) + Windows + Windows-GPU/Linux cho MỌI phiên bản, không cần máy trong tay. Đẩy tag v<version> khớp file cấu hình = NÚT BẤM duy nhất kích hoạt build + tạo Release + cập nhật latest.json. Dây chuyền chịu lỗi: một OS đỏ thì các OS khác vẫn đăng.
GPU theo nền tảng: Metal (Mac) · Vulkan (Windows có card) · CPU fallback — Chép Lời
whisper.cpp chạy offline cần tăng tốc GPU khác nhau mỗi OS; GIỮ luôn bản CPU vì bản Vulkan KHÔNG chạy trên máy thiếu driver → ship 2 bản để phủ mọi máy. Song song: chip cũ như Celeron N2920/FX-8350 phải TẮT tăng tốc kẻo sập ngay khi mở.
reqwest native-tls (không rustls) + audio thuần Rust (symphonia+rubato) + SQLite bundled — Chép Lời
native-tls tránh phải kéo OpenSSL/NASM khi build Windows. Audio thuần Rust để KHÔNG cần ffmpeg → đóng gói sạch đa nền tảng. SQLite bundled = 1 nguồn sự thật, chống crash, resumable, không cần cài thêm.
Tauri + Rust (Chép Lời) / Tauri 2 + Rust + React-TS, fork Handy (VoiceFlow) — thay vì Electron / xây từ 0
Tauri cho file cài nhỏ (~6MB vs ~100MB Electron), nhanh, an toàn. VoiceFlow fork Handy tiết kiệm hàng tháng công vì tự làm STT offline quá khó — giữ 2 mối nối git (origin để sửa, upstream để kéo cập nhật).
Web HTML tĩnh + đẩy git push → Hostinger auto-deploy (10x-lifeos.com), mỗi app một /slug/
Đẩy git → tự lên web, đơn giản, nhanh, KHÔNG cần FTP. Mỗi app một thư mục /slug/ (favicon + OG 1200×630 + footer.js chung), bê nguyên trang chep-loi/ làm scaffold. Xác minh HTTP 200 sau mỗi push. Bẫy: tên miền có gạch ngang (10x-lifeos.com) sai 1 ký tự = NXDOMAIN; và cache có thể hiện bản cũ ~1 phút.
Model AI + bản cài + công cụ nặng để NGOÀI thư mục code; model tải LẦN ĐẦU (không nhồi vào installer)
Installer nhẹ (6MB thay vì nhồi 'bộ não' 1,5GB) → người dùng tải model 1 lần khi chạy đầu. Bản cài/model/công cụ đặt ở gốc dự án ngoài thư mục code → giữ repo gọn nhẹ, sạch.
Hai loại ký số phân biệt rõ: (A) minisign updater key MIỄN PHÍ bắt buộc · (B) ký OS Apple/Windows TRẢ PHÍ tuỳ chọn
Đừng nhầm mà mua nhầm cái đắt: (A) ký-cho-tự-cập-nhật (minisign, MIỄN PHÍ, bắt buộc để app cũ tin bản mới) — nên đổi sang khoá CÓ mật khẩu, giữ kỹ vì mất = phải đổi chữ ký = reset quyền; (B) ký-cho-hệ-điều-hành (Apple/Windows, TRẢ PHÍ, chỉ để tắt cảnh báo lần đầu). Không mua thì dặn người dùng: macOS chuột phải→Open + 2 quyền + khởi động lại; Windows SmartScreen→More info→Run anyway.
Bộ đồ nghề

Thứ để tái dùng — checklist, tài sản, từ điển

Phần mang-đi-được. Tick checklist (được lưu lại trong máy bạn), xem những "1 mũi tên trúng N đích", tra từ điển đời thường.

1 mũi tên — N đích · các tài sản tái dùng
1 tài sảnLÀM 1 LẦNApp UILandingBlogSlideVideoOne-pager
1 mũi tên — N đích: một tài sản làm-một-lần (bộ nhận diện · chứng chỉ ký · lớp platform_backend · 1 file CI) trúng nhiều đích cùng lúc
Checklist 7 chặng

Bản chuẩn — tick được, tự lưu

Đây là checklist gốc. Muốn checklist RIÊNG cho một ý tưởng cụ thể → dùng tab + Tạo Roadmap.

Từ điển đời thường

30 thuật ngữ — giải thích cho người mới

A→Z
Mở từ điển
Vibe coding, spec, fork, CI, ký số, release… bằng tiếng người
Vibe coding
Kiểu để AI viết code mà mình không đọc, không kiểm, không hiểu, cứ 'thấy chạy là được' — ổn cho bản nháp bỏ đi, nhưng rủi ro như ký hợp đồng mà không đọc khi đưa vào app tặng thật.
Đặc tả (Spec / SPEC.md)
Tờ mô tả 'làm cái gì' viết ra MỘT trang trước khi bắt tay — như bản vẽ nhà đưa cho thợ, nói rõ muốn gì và nhất là những gì CỐ TÌNH KHÔNG xây lần này.
Những gì KHÔNG làm (Non-goals)
Danh sách cố tình bỏ ra ngoài lần này, nên viết dài hơn danh sách có làm — nó là hàng rào hữu hình nhất chống app cứ phình ra mãi.
Lát mỏng (Vertical slice)
Chia việc thành từng miếng đủ nhỏ để kể bằng một câu, làm xong miếng nào chạy được miếng đó, mình tự mắt xác nhận rồi mới qua miếng sau.
Fork (mượn khung)
Mượn nguyên khung một dự án mã nguồn mở có sẵn rồi sửa thành của mình — nhanh hơn tự xây từ số 0; khi fork bạn giữ hai đường: một tới 'bản của mình' để sửa, một tới 'bản gốc' để còn kéo cập nhật của họ về.
Repo (kho code)
Thư mục chứa toàn bộ code của app cùng lịch sử thay đổi của nó — luật vàng: 1 repo = 1 bản gốc duy nhất, cấm tạo bản sao tạm ở nơi khác kẻo lệch nhau không biết bản nào thật.
Ghi mốc (Commit)
Một lần 'lưu lại' thay đổi kèm câu mô tả — như lưu game giữa chừng, hỏng thì tải lại mốc cũ; ghi mốc nhỏ và thường xuyên = nhiều điểm lưu để lùi về.
Agent (tác nhân AI)
Chính 'người thợ' AI trong Claude Code viết code cho bạn — là thợ giỏi nhưng 'mù màn hình của bạn', nên đừng tin lời 'đã xong' mà phải tự chạy thử thấy tận mắt.
Plan mode (chế độ lập kế hoạch)
Chế độ cho AI đọc code và lập kế hoạch nhưng CHƯA được sửa gì, để bạn duyệt 'nó định làm gì' bằng tiếng người trước khi cho nó động tay.
/clear (xóa trí nhớ tạm)
Lệnh xóa trí nhớ tạm của AI trong phiên làm việc — khi nó bắt đầu rối, quên chỉ dẫn cũ, hoặc sửa 2 lần cùng một chỗ vẫn sai thì /clear rồi viết lại yêu cầu cho gọn.
CLAUDE.md
Tờ ghi chú đặt ở gốc dự án để AI đọc mỗi lần: lệnh build, quy ước, cạm bẫy, chỗ AI KHÔNG được đụng — phải NGẮN, dài quá thì AI chìm trong nhiễu và bỏ qua nửa số quy tắc.
Đo, đừng đoán
Khi app 'treo' hay chậm, đừng đoán nguyên nhân — hãy bật log, bấm giờ, tái hiện lỗi để con số nói sự thật, vì 'treo' thường chỉ là CHẬM chứ không hỏng.
Bấm thử nhanh (Smoke test)
Mở app lên chạy thử tính năng chính xem có 'khói' (lỗi lộ liễu) không trước khi đi sâu — như bật thử xe nổ máy được không trước khi lái đường dài.
Fallback (phương án dự phòng)
Đường lùi tự động khi cách chính hỏng — vd không có GPU thì tự chạy bằng CPU chậm hơn nhưng vẫn chạy; nhờ vậy app 'không bao giờ crash', hỏng chỗ nào thì lùi về phương án an toàn chứ không văng.
Tương thích phần cứng
Chuyện app chạy được trên nhiều loại máy khác nhau chứ không chỉ máy bạn — máy đời cũ thiếu khả năng tăng tốc, hoặc Windows giới hạn độ dài đường dẫn file, không lo trước là app sập ngay khi người máy yếu mở lên.
PyInstaller / đóng gói (Package)
Công cụ gói toàn bộ code + thứ app cần thành MỘT file cài 'bấm-là-chạy' cho người thường, để họ không phải cài Python hay công cụ gì — mẹo hay là để đồ nặng (mô hình AI 1,5GB) tải lần đầu thay vì nhồi vào file cài.
Tự động build & phát hành (CI/CD)
Một cái máy trên mạng (GitHub Actions) tự nhận code của bạn, tự dựng bản cài cho Mac/Windows/Linux rồi tự đăng — như dây chuyền nhà máy; lưu ý lần đầu lắp thường trục trặc vài chỗ, đó là bình thường.
Nhãn phiên bản (Git tag)
Một 'cái nhãn' bạn dán lên code (vd v0.8.6) — với hệ thống đã dựng, đẩy cái nhãn này lên chính là NÚT BẤM duy nhất kích hoạt toàn bộ dây chuyền build + phát hành.
Release (bản phát hành)
Bản đóng gói chính thức đăng công khai để mọi người tải về, gắn với một số phiên bản — nên đặt ở nơi ổn định có version để còn cập nhật và không làm chết link tải.
Đánh số phiên bản (SemVer)
Cách đánh số 3 phần LỚN.VỪA.NHỎ (vd 0.8.5): đổi số NHỎ = sửa lỗi vặt, số VỪA = thêm tính năng, số LỚN = thay đổi lớn — như nhãn 'bản mới có gì' cho cả người và máy đọc.
Nhật ký thay đổi (CHANGELOG)
Cuốn sổ ghi mỗi bản đổi những gì (Thêm/Sửa/Bỏ) — rẻ nhất nhưng quý nhất khi cần lùi lại, vì nó cho biết bản nào đã đụng vào phần nào.
Ký số (Code signing) — HAI loại khác nhau
Đóng dấu điện tử lên app để chứng minh 'đúng là của tôi'; có HAI loại đừng nhầm: (A) ký-cho-tự-cập-nhật (minisign, MIỄN PHÍ, bắt buộc) và (B) ký-cho-hệ-điều-hành (Apple/Windows, TRẢ PHÍ, chỉ để tắt cảnh báo) — đừng mua nhầm cái đắt.
Tự cập nhật (Auto-update)
App tự biết có bản mới và tự tải về nhờ một 'tấm biển thông báo' (latest.json) trên GitHub — nhưng nhớ: đổi chữ ký giữa hai bản sẽ khiến hệ điều hành RESET quyền mic/trợ năng, nên có lúc phải cố tình không tự thay app cũ.
Lùi lại (Rollback)
Quay về khi bản mới hỏng — cách sạch nhất là 'lùi bằng cách tiến': sửa lỗi rồi ra một bản vá SỐ CAO HƠN, vì app luôn tự chọn số lớn hơn.
Hotkey (phím tắt toàn cục)
Một tổ hợp phím bấm là chạy ngay dù đang ở app khác (vd bấm để bắt đầu thu âm / chụp màn hình) — tiện nhưng hay dính lỗi tầng hệ thống, nên là chỗ phải thử kỹ trên máy thật.
localStorage (bộ nhớ trong trình duyệt)
Một ngăn nhỏ ngay trong trình duyệt/WebView để app tự nhớ cài đặt của bạn giữa các lần mở mà không cần máy chủ hay tài khoản — hợp với app offline 'mở là dùng'.
Deploy (đưa lên mạng)
Đưa trang web/landing của bạn lên máy chủ để người lạ mở được — với 10x-lifeos.com chỉ cần git push là Hostinger tự lên, nhớ xác minh HTTP 200 và bấm thử link từ máy lạ.
Dùng thử món mình nấu (Dogfooding)
Bạn tự cài và dùng bản mới trước 1-2 ngày trước khi đưa cho người khác — ăn thử món mình nấu bắt được phần lớn lỗi mà không cần hạ tầng gì.
Chỉ số phù phiếm (Vanity metric)
Con số nhìn cho sướng mà không giúp quyết định gì (lượt tải, sao GitHub, view trang) — bỏ qua, chỉ giữ con số trả lời được 'mình nên làm gì tiếp' (như số bản phải vá khẩn, bao lâu dùng được lần đầu).
Nợ-hiểu-biết (Comprehension debt)
Cái nợ vô hình khi bạn sở hữu một cỗ máy mình không đọc được — khi nó hỏng không ai cứu; thuốc giải không phải đi học code mà là ghi mọi thứ vào file + để máy tự kiểm lỗi.
+ Tạo Roadmap

Máy tạo roadmap cho ý tưởng mới

Điền 3 ô → nhận ngay một roadmap 7 chặng riêng cho ý tưởng của bạn, có checklist tick được (lưu trong máy). Đây là cái khuôn biến kho tri thức thành công cụ.

Điền tên ý tưởng ở trên rồi bấm Tạo roadmap. Tiến độ tick của mỗi ý tưởng được lưu riêng trong trình duyệt này.