Mình có một thói quen khá tệ là thường xuyên tắt báo thức trong vô thức. Nhiều sáng tỉnh dậy muộn, nhìn điện thoại mới biết báo thức đã bị tắt từ lúc nào. Chuyện này khiến mình không ít lần bị "bể việc".
Mình nghĩ chắc không chỉ riêng mình gặp vấn đề này. Vậy nên mình bắt đầu làm WakeBolt, một app báo thức trên iPhone mà muốn tắt chuông thì phải hoàn thành một nhiệm vụ nào đó, thay vì chỉ chạm vào nút Stop.
Không chỉ đơn giản là làm báo thức khó tắt hơn
Ý tưởng ban đầu khá đơn giản: bắt người dùng giải một bài toán hoặc thực hiện vài động tác thể chất trước khi tắt báo thức.
Nhưng mỗi người có một cách tỉnh dậy khác nhau. Có người chỉ cần giải toán là đủ, có người phải thực sự rời khỏi giường hoặc vận động mới tỉnh được.
Vì vậy mình xây dựng nhiều loại nhiệm vụ như giải toán, chống đẩy, squat, lắc điện thoại, tìm vật thể, chụp ảnh ngoài trời, đọc thành tiếng và mini-game. Người dùng có thể kết hợp tối đa ba nhiệm vụ trong một báo thức.
Mình cũng bổ sung tính năng Wake-up Check, kiểm tra lại sau vài phút vì ngay cả khi hoàn thành nhiệm vụ, chúng ta vẫn có thể quay lại giường ngủ tiếp.
Tại sao mình chọn xử lý mọi thứ offline?
Đây có lẽ là phần mình dành nhiều thời gian nhất khi phát triển WakeBolt.
Với các nhiệm vụ như chống đẩy, squat hay tìm vật thể, app cần nhận diện và xác minh xem người dùng có thực sự hoàn thành hay không.
Một hướng giải quyết là gửi ảnh lên server và dùng các model AI online để xác minh. Một số ứng dụng khác đang làm theo cách này. Nó giúp tận dụng được các model mạnh mà không cần xử lý quá nhiều trên điện thoại.
Nhưng mình không thích cách tiếp cận đó vì hai lý do.
Đầu tiên là quyền riêng tư.
Hãy tưởng tượng bạn vừa thức dậy, còn đang ngái ngủ, quần áo chưa chỉnh tề và phải chụp một bức ảnh để tắt báo thức. Bức ảnh đó có thể vô tình chứa những thứ khá riêng tư trong phòng ngủ.
Mình không muốn người dùng phải gửi những hình ảnh như vậy lên một server nào đó chỉ để chứng minh rằng họ đã thức dậy.
Thứ hai là sự phụ thuộc vào Internet.
Nếu việc xác minh nhiệm vụ cần kết nối server, điều gì xảy ra khi bạn đi du lịch, ở nơi sóng yếu hoặc đơn giản là mất mạng?
Một ứng dụng báo thức mà tính năng quan trọng nhất không hoạt động ổn định khi offline thì với mình là một vấn đề khá lớn.
Vì vậy, ngay từ đầu mình quyết định toàn bộ quá trình xác minh nhiệm vụ của WakeBolt phải chạy trực tiếp trên thiết bị.
Mình sử dụng các công nghệ nhận diện của Apple và dành khá nhiều thời gian tinh chỉnh model offline, cân bằng giữa độ chính xác, tốc độ xử lý và hiệu năng. Chạy model trên điện thoại có nhiều giới hạn hơn so với server, nhất là khi phải hỗ trợ nhiều đời thiết bị khác nhau.
Đây không phải hướng dễ nhất, nhưng là sự đánh đổi mình thấy đáng làm.
Một quyết định khác là chỉ hỗ trợ iOS 26 trở lên
Với app thông thường, một lỗi nhỏ đôi khi chỉ gây khó chịu. Nhưng với báo thức, một lỗi có thể khiến người dùng đi làm muộn hoặc bỏ lỡ việc quan trọng.
Mình quyết định sử dụng AlarmKit, framework báo thức chính thức của Apple, thay vì tìm cách xử lý bằng notification như trước đây.
Điều này đồng nghĩa với việc WakeBolt chỉ hỗ trợ iOS 26 trở lên, chấp nhận bỏ qua những người dùng đang sử dụng phiên bản iOS cũ.
Với một indie app còn ít người biết đến, thu hẹp số thiết bị được hỗ trợ rõ ràng không phải quyết định lý tưởng. Nhưng mình vẫn ưu tiên xây dựng trên nền tảng mà Apple thiết kế riêng cho báo thức.
Nếu làm lại từ đầu
Có lẽ mình sẽ bắt đầu với ít nhiệm vụ hơn.
Lúc phát triển, mình thường có xu hướng nghĩ ra thêm một nhiệm vụ mới rồi muốn đưa ngay vào app. Nhưng mỗi nhiệm vụ kéo theo khá nhiều việc: UI, logic xác minh, xử lý các trường hợp ngoại lệ và cả bảo trì sau này.
Mình cũng sẽ dành nhiều thời gian hơn cho trải nghiệm lần đầu. Người dùng tải một app báo thức về không phải để tìm hiểu công nghệ đằng sau nó. Họ chỉ cần đặt báo thức nhanh chóng và tin rằng sáng hôm sau nó sẽ hoạt động.
WakeBolt hiện đã có những người dùng đầu tiên, dù số lượng vẫn còn khá khiêm tốn. Mình cũng chưa dành nhiều thời gian cho marketing nên điều này không quá bất ngờ.
Sau một thời gian làm sản phẩm, mình nhận ra viết code và đưa app lên App Store mới chỉ là một phần công việc. Làm sao để người dùng biết đến, tiếp tục sử dụng và sẵn sàng trả tiền cho nó lại là một câu chuyện khác.
Đó cũng là phần mình đang tiếp tục học.
WakeBolt: https://wakebolt.com





