Tôi đã làm một ứng dụng trên thanh menu macOS: chọn văn bản → phím tắt → nhận giải thích từ AI
(miniai.dev)Xin chào. Mình là sinh viên y khoa, và từ 2 tháng trước đã tự học vibe coding rồi làm một ứng dụng thanh menu cho macOS. Hôm nay mình công bố nó!
MiniAI - Ứng dụng này làm gì
Bạn có thể chọn văn bản ở bất kỳ đâu rồi nhấn phím tắt đã chỉ định, một cửa sổ nhỏ sẽ hiện lên từ thanh menu và AI sẽ giải thích cho bạn. Điểm cốt lõi là loại bỏ quy trình phải chuyển sang trình duyệt, tìm kiếm Google rồi quay lại.
Ban đầu mình làm nó vì khi đọc bài báo khoa học, mình ngại phải tra các thuật ngữ không biết. Nhưng sau khi làm xong, mình nhận ra mình dùng nó trong nhiều tình huống khác nhau, như khi viết email tiếng Anh, xem code, v.v.
Tech stack
- UI: NSPanel + SwiftUI (floating window của ứng dụng thanh menu)
- Phản hồi AI: hiệu ứng gõ theo thời gian thực bằng SSE streaming
- Backend: proxy API bằng Supabase Edge Function (để không nhúng API key vào client)
- Rate limiting: giới hạn theo từng người dùng dựa trên PostgreSQL
- Triển khai: đã hoàn tất ký bằng Developer ID + công chứng (notarization)
Phần mất nhiều thời gian nhất khi phát triển
- Phát hiện chọn văn bản toàn cục (xử lý quyền Accessibility API)
- Bảo mật API key (ban đầu hardcode ở client, sau mới phát hiện và phải làm lại từ đầu)
- Quy trình công chứng (lần đầu trải nghiệm nên mất toi 2 ngày)
Đặc biệt là mục số 3, chắc những ai từng phát hành ứng dụng macOS sẽ đồng cảm. Dù làm theo tài liệu, vẫn có nhiều bước không thể chạy trơn tru ngay trong một lần.
Tình trạng hiện tại
- Mở beta, miễn phí
- Có thể tải về từ trang chủ
Rất mong nhận được phản hồi
- UX của phím tắt có tự nhiên không
- Cài đặt sạch có gặp vấn đề gì không
- Kiến trúc có điểm nào cần cải thiện không
- Lời khuyên từ những ai từng phát triển ứng dụng tương tự
Mình rất hoan nghênh chia sẻ về các điểm có thể cải thiện trong kiến trúc hoặc những trải nghiệm vật lộn với quy trình công chứng trên macOS.
Và thêm một điều nữa, với những ai là developer nhưng có công việc chính riêng và làm sản phẩm như dự án phụ,
"Có nên đào sâu thêm không" vs "Xem như một trải nghiệm rồi gác lại để làm cái tiếp theo" — mình tò mò mọi người thường đưa ra quyết định này như thế nào.
16 bình luận
Xin chào, mình xin góp vài ý kiến!
opt + space. Có lẽ nên dùng một phím tắt mặc định khác thì sẽ tốt hơn.Wow, cảm ơn bạn rất nhiều vì đã xem kỹ đến vậy 🙏
Phím tắt: Đúng vậy. Vấn đề xung đột ⌥Space với người dùng Alfred/Raycast là phản hồi chúng tôi nhận được nhiều nhất.
Chúng tôi đã nhận thức được nhu cầu về tính năng thiết lập phím tắt tùy chỉnh,
và sẽ đưa nó vào danh sách ưu tiên cải thiện!
Ký số/công chứng: Vâng, hiện tại đang ở trạng thái ký
adhoc.Vì vẫn đang ở giai đoạn đầu phát triển nên chi phí công chứng vẫn hơi cao, vì vậy chúng tôi đã tạm hoãn lại 😅
Cảm ơn bạn đã kiểm tra giúp!
Cách phân phối: Chúng tôi cũng đang cân nhắc phát hành qua App Store hoặc Homebrew Cask.
Hiện tại để phát hành nhanh, trước mắt chúng tôi đã ra bản DMG,
nhưng tôi cũng nghĩ hướng bạn nói là đúng,,
Thấy bạn còn trực tiếp kiểm tra cả
codesignnữa, tôi thật sự rất cảm động.Cảm ơn bạn rất nhiều vì đã dành nhiều tình cảm cho sản phẩm!
Nếu lại có điểm nào bất tiện, nhất định hãy cho tôi biết nhé, đó là nguồn động viên lớn với tôi 😄
Nếu không phải là thứ bạn đặc biệt định bán ở mức production, thì có lẽ bạn cũng có thể công khai mã nguồn trên GitHub để nhận phản hồi đấy chứ?
Cảm ơn bạn rất nhiều vì ý kiến quý báu!
Vì đây là lần đầu mình làm một mảng kinh doanh liên quan như thế này nên ban đầu mình triển khai chủ yếu để lấy kinh nghiệm, nhưng mình cũng thấy việc phát hành mã nguồn mở để nhiều người có thể trực tiếp sử dụng là một ý tưởng rất hay 😁
Nếu mình đưa ra dưới dạng mã nguồn mở thì nhất định phải góp ý cho mình nhé~~ :)
Không phải là đã mã nguồn mở thì không thể bán đâu. Cũng có khá nhiều ứng dụng đi theo mô hình hai hướng như vậy. Mã nguồn mở chủ yếu là khái niệm cùng xây dựng với các lập trình viên khác quan tâm đến dự án hơn là với người dùng phổ thông. Nếu bạn lo bị sao chép thì chỉ cần gắn giấy phép rõ ràng là được, nhưng... trong thời đại AI, các dự án clean-room mọc lên đầy rẫy nên cũng không chắc điều đó còn nhiều ý nghĩa. Nếu bạn mở mã nguồn thì chẳng lẽ chúng tôi chỉ góp ý phản hồi thôi sao? Haha
Haha cảm ơn những lời khuyên của anh/chị tiền bối lập trình viên
Dạo này thế giới thay đổi quá nhanh nên thật sự rất khó để thích nghi!
Cảm ơn bạn đã chia sẻ nhiều thông tin, và mong bạn sẽ tiếp tục quan tâm trong thời gian tới 😁
Đó là model AI nào vậy??
Có nói là ứng dụng này sử dụng API của Claude.
Nó hiện ra rõ ràng ngay trong bài nên tôi đã hoảng hốt đi tìm lại, tự hỏi có phải mình đã hỏi nhầm hay không.
Tôi đã đọc khá lâu qua bài tóm tắt, bài gốc, trang web và cài cả chương trình để tìm mà vẫn không thấy, hóa ra nó được ghi trong chính sách xử lý thông tin cá nhân.
Thông thường không ai lại lục đến cả chính sách xử lý thông tin cá nhân chỉ để kiểm tra tech stack cả.
Lần sau nếu có thể, mong bạn cho biết nó được nêu ở đâu luôn thì tôi sẽ rất cảm ơn.
Cảm ơn những phản hồi quý báu của mọi người!
Tôi đã định viết thêm về phần mô hình, nhưng nghĩ rằng người dùng phổ thông có thể không quen với khái niệm API nên đã không đề cập đến.
Vì có một số người tò mò về phần này, tôi sẽ chỉnh sửa lại cho rõ hơn.
Mọi người đã thử dùng app chưa? Tôi cũng rất tò mò không biết trải nghiệm của mọi người thế nào :)
Á, tôi đã nói với anh/chị jhk0530 rồi.
Có chỗ nào ghi là dùng API của Claude không?
Mình đã xem bài viết và cả trang web rồi mà không thấy.
Xin chào! Mình là tác giả.
Hiện đang sử dụng mô hình Claude Sonnet 4!
Trong thời gian tới, mình dự định sẽ triển khai tùy chọn BYOK hoặc cho phép tự chọn trực tiếp các mô hình khác.
Cảm ơn bạn đã quan tâm :)
Cảm ơn bạn đã phản hồi!
Tôi vẫn hay dùng tính năng dịch popup của DeepL, nhưng có lẽ sẽ thử dùng cái này một lúc
Về sau, có lẽ cũng hay nếu hỗ trợ cả định dạng https://www.openresponses.org/ để có thể mở ra khả năng dùng cả local LLM nữa!
Có vẻ bạn dự định chủ yếu sử dụng tính năng dịch!
Trong thời gian tới, chúng tôi cũng có kế hoạch bổ sung tính năng chọn chế độ để phát triển theo hướng cung cấp khả năng dịch chuyên biệt hơn một chút :)
Cảm ơn bạn đã đề xuất cả cách có thể sử dụng mô hình cục bộ thay vì chỉ dùng API bên ngoài! Chúng tôi sẽ bổ sung vào kế hoạch triển khai sắp tới.
Cảm ơn bạn vì những phản hồi quý giá, và nếu có bất kỳ điều gì bất tiện phát sinh, xin hãy nhất định cho chúng tôi biết nhé 😄
Tôi đã dùng thử một tuần và thấy trải nghiệm sử dụng rất tốt nên vẫn đang tiếp tục dùng, cảm ơn.
Nếu chỉ giải quyết được vấn đề về cách phân phối phím tắt như những người khác đã nói thì có lẽ sẽ còn tốt hơn nữa! Rất đáng mong đợi