Bối cảnh: một thị trường đã đông đối thủ
Quản lý phiên làm việc/tab không phải ý tưởng mới — OneTab, Session Buddy, Toby, Tabs Outliner, Workona đều đã có mặt lâu, có lượng người dùng ổn định. Xây thêm 1 extension cùng nhóm tính năng mà không có lý do rõ ràng để chọn nó thay vì cái đang dùng là một cách chắc chắn để không ai chuyển sang.
Quyết định: chỉ cạnh tranh trên 1 điểm — độ tin cậy dữ liệu
Thay vì cố làm nhiều tính năng hơn đối thủ, tôi chọn đặt cược vào đúng 1 khác biệt: hầu hết đối thủ dựa hoàn toàn vào chrome.storage.local — nghĩa là xoá profile Chrome, hỏng ổ đĩa, hay lỗi extension là mất sạch phiên đã lưu. TabDiary dùng Firestore sync offline-first làm lớp dự phòng, nhắm đúng vào nỗi sợ mất dữ liệu của nhóm người dùng làm nghiên cứu/tri thức — trùng đúng nhóm audience của Markpad, để có thể cross-sell về sau.
Cắt scope có chủ đích cho MVP
Phiên bản v0.1.0 cố tình bỏ qua: mã hoá dữ liệu phía client, thumbnail ảnh thật cho tab nền, liên kết trực tiếp với Markpad, i18n, Pinia, bộ component UI đầy đủ, và cả hạ tầng test (eslint/vitest/playwright). Không phải vì những thứ đó không quan trọng — mà vì mục tiêu là ra được bản chạy được nhanh nhất có thể để kiểm chứng hướng đi, giống đúng cách Markpad đã làm trước đó (test infra của Markpad cũng là 1 spec riêng, không phải việc ngày đầu).
Một quyết định thiết kế nhỏ nhưng có chủ đích: màu thương hiệu
Markpad dùng tông màu warm-stone trung tính. TabDiary cố tình chọn Indigo — chuyên nghiệp, nổi bật trên toolbar, và quan trọng nhất: khác hẳn Markpad để người dùng không nhầm 2 sản phẩm là một, dù chúng nằm trong cùng portfolio và nhắm cùng nhóm khách hàng.
Cái chưa xong, nói thẳng
Sync Firestore — phần lõi của toàn bộ định vị differentiator — tại thời điểm viết bài này vẫn là code stub, chưa nối vào Firebase project thật. Đây không phải một tính năng "gần xong", mà là rủi ro kỹ thuật lớn nhất của sản phẩm, đúng như Markpad từng gặp với chính sync của nó. Ghi rõ điều này ra thay vì mô tả mập mờ là bài học tôi mang từ Markpad sang: đừng để tài liệu nói tốt hơn thực tế code đang chạy.