9 điểm bởi medidevlab 2026-04-15 | 16 bình luận | Chia sẻ qua WhatsApp

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

  1. Phát hiện chọn văn bản toàn cục (xử lý quyền Accessibility API)
  2. 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)
  3. 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

 
t7vonn 2026-04-17

Xin chào, mình xin góp vài ý kiến!

  • Theo mình biết thì trong số người dùng Mac có khá nhiều người dùng các công cụ như Alfred / Raycast, và phím tắt mặc định của các app này là 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.
  • Có vẻ ứng dụng chưa được ký/chứng thực công chứng.
(1) codesign  
$ codesign -dv --verbose=4 MiniAi.app  
Executable=/Users/.../Downloads/MiniAi.app/Contents/MacOS/MiniAi  
Identifier=com.miniai.app  
Format=app bundle with Mach-O thin (arm64)  
CodeDirectory v=20400 size=8551 flags=0x2(adhoc) hashes=257+7 location=embedded  
VersionPlatform=1  
VersionMin=917504  
VersionSDK=1704960  
Hash type=sha256 size=32  
CandidateCDHash sha256=c60ed7e37e533d09cf5365d97bf6428c8d42f2dd  
CandidateCDHashFull sha256=c60ed7e37e533d09cf5365d97bf6428c8d42f2dd94cdca992cd3f61e8e6554a3  
Hash choices=sha256  
CMSDigest=c60ed7e37e533d09cf5365d97bf6428c8d42f2dd94cdca992cd3f61e8e6554a3  
CMSDigestType=2  
Executable Segment base=0  
Executable Segment limit=1556480  
Executable Segment flags=0x1  
Page size=16384  
CDHash=c60ed7e37e533d09cf5365d97bf6428c8d42f2dd  
Signature=adhoc  
Info.plist entries=24  
TeamIdentifier=not set  
Sealed Resources version=2 rules=13 files=7  
Internal requirements count=0 size=12  
  
(2) gatekeeper  
$ spctl -a -vvv -t execute MiniAi.app  
MiniAi.app: rejected  
  
(3) Notary staple  
$ xcrun stapler validate MiniAi.dmg  
Processing: /Users/.../Downloads/MiniAi.dmg  
MiniAi.dmg does not have a ticket stapled to it.  
  
$ xcrun stapler validate MiniAi.app  
Processing: /Users/.../Downloads/MiniAi.app  
MiniAi.app does not have a ticket stapled to it.  
  • So với việc phát hành file dmg, sẽ tốt hơn nếu có thể cài đặt qua App Store / Homebrew.
 
medidevlab 2026-04-18

Wow, cảm ơn bạn rất nhiều vì đã xem kỹ đến vậy 🙏

  1. 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!

  2. 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!

  3. 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ả codesign nữ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 😄

 
kurthong 2026-04-16

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ứ?

 
medidevlab 2026-04-16

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é~~ :)

 
kurthong 2026-04-16

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

 
medidevlab 2026-04-16

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 😁

 
ly0738 2026-04-15

Đó là model AI nào vậy??

 
jhk0530 2026-04-15

Có nói là ứng dụng này sử dụng API của Claude.

 
ly0738 2026-04-15

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.

 
medidevlab 2026-04-15

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 :)

 
ly0738 2026-04-15

Á, tôi đã nói với anh/chị jhk0530 rồi.

 
ly0738 2026-04-15

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.

 
medidevlab 2026-04-15

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 :)

 
ly0738 2026-04-15

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!

 
medidevlab 2026-04-15

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é 😄

 
ly0738 2026-04-23

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