Trên bàn làm việc của tôi có một con Mac Mini không bao giờ ngủ.
Nó chạy trợ lý AI của tôi. Cả ngày, mỗi ngày. Tôi nhắn cho nó qua Telegram như nhắn cho bạn bè - "check xem build iOS pass chưa", "tuần trước tôi chốt gì về cái paywall nhỉ", "tóm tắt GitHub trending hôm nay" - và con Mac làm hết.
Không web dashboard. Không SaaS. Chỉ là một cái máy tính nhỏ trong căn hộ của tôi, làm việc vặt cho tôi.
Tôi chạy setup này được mấy tháng rồi. Đây là bài viết thật thà về nó: nó là gì, vì sao tôi không dùng mấy framework phổ biến, và những chỗ nó vẫn té sấp mặt.
Vì sao tôi tự build thay vì dùng OpenClaw hay Hermes
Nói luôn cái này trước, vì đây là câu tôi bị hỏi nhiều nhất.
OpenClaw và Hermes Agent đều có sẵn. Đều tốt. Đều làm được gần như những gì setup của tôi làm - giao diện Telegram, skills, bộ nhớ lâu dài. Nếu bạn muốn có thứ chạy được ngay cuối tuần này, cứ dùng một trong hai. Thật lòng đấy.
Tôi không dùng, vì một lý do rất tầm thường: tiền.
Cả hai framework đều gọi model qua API key. Trả tiền theo token. Ổn thôi nếu trợ lý của bạn mỗi ngày trả lời vài câu. Không ổn chút nào khi nó chạy 24/7, nửa đêm index hội thoại, lọc tin, review code, xử lý mấy chục task mỗi ngày. Hóa đơn token lúc đó không còn là tiền lẻ nữa.
Setup của tôi build trên Claude Code, chạy theo subscription. Phí cố định hàng tháng. Trợ lý có cày năm chục task trong một ngày thứ Ba thì hóa đơn vẫn đứng yên.
Chỉ một khác biệt đó thôi đã thay đổi những gì bạn dám tự động hóa. Khi mỗi task đều tốn token, bạn phải tính toán chi li. Khi phí cố định, bạn cứ "thôi kệ, để trợ lý làm" với mọi thứ. Chính cái chế độ thứ hai mới là lúc nó thực sự hữu dụng.
Còn lý do thứ hai: quyền kiểm soát. Tự build thì tôi quyết chính xác cái gì được đưa vào bộ nhớ của trợ lý. Không phải vật lộn với abstraction của framework, không phải học hệ thống plugin, không phải chờ maintainer merge cái thứ mình cần. Khi có gì đó hỏng lúc 2 giờ sáng, đó là script Python của tôi, và tôi biết chính xác là cái nào.
(Lý do thứ ba là tôi rõ ràng không cưỡng lại được việc tự build những thứ có thể tải về dùng luôn. Xem thêm: mọi app trên điện thoại của tôi.)
Nó hoạt động thế nào
Kiến trúc nghe kém hoành tráng hơn bạn tưởng. Mà đó chính là điểm hay.
Con Mac Mini chạy 24/7 như một local server luôn bật. Nó nằm trên bàn, cắm dây ethernet, nhìn vào chẳng thấy nó làm gì. Cái máy tính nhàm chán nhất tôi có. Cũng là cái hữu dụng nhất.
Nó đấy, nằm góc bàn, không làm gì trước mắt trong khi làm tất cả mọi thứ.
Claude Code chạy thường trực trên đó. Đấy là con agent - thứ đọc file, viết code, chạy script, ra quyết định.
Một con bot Telegram làm giao diện. Đây là phần nghe như phép thuật dù nó là mảnh đơn giản nhất. Tôi cầm điện thoại ở bất cứ đâu, gõ một tin nhắn, và con Mac ở nhà làm việc. Đứng xếp hàng mua cà phê, tôi có thể bảo nó chạy một bản build iOS. Về đến nhà thì xong rồi.
Mấy script Python tự viết lo các việc cụ thể: task theo lịch, index cho recall (SQLite FTS5 - full-text search trên mọi thứ chúng tôi từng bàn), một bộ lọc GitHub trending tune theo sở thích của tôi, build iOS chạy nền, đại loại thế.
LaunchAgents - hệ thống kiểu cron có sẵn của macOS - chạy routine hàng đêm. 23:45, con Mac index hội thoại trong ngày. 23:50, nó rút ra bài học từ đó. Lúc ấy tôi thường đang ngủ. Nó không cần tôi.
Hết. Không Kubernetes. Không microservices. Một con Mac, một con bot, ít Markdown, và mấy script Python được ghép lại với nhau bằng một niềm tin vừa phải.
Bộ não chỉ là mấy file Markdown
Đây là phần tôi thích nhất, và cũng là phần ít kỹ thuật nhất.
Bộ nhớ của trợ lý - cái "bộ não thứ hai" - là một folder chứa file Markdown:
context/- trạng thái hiện tại của từng project. Đã ship gì, đang kẹt gì, tôi đã quyết gì và vì sao.preferences/- tôi thích mọi thứ được làm ra sao. Giọng văn của tôi, code style của tôi, những lỗi nào không được lặp lại.knowledge/- bài học rút ra. Những con bug từng làm tôi khổ, mấy trò oái oăm của App Store review, những thứ mà không ghi lại thì cứ sáu tháng lại phải học lại._inbox/- các mẩu ghi nhớ mới được đề xuất, chờ tôi duyệt.
Cái cuối cùng quan trọng hơn vẻ ngoài của nó. Trợ lý không được phép tự viết thẳng vào bộ nhớ dài hạn của chính nó. Khi nó nghĩ mình vừa học được điều gì đáng giữ, nó viết nháp một note vào _inbox/, rồi tôi duyệt hoặc bỏ sau. Bộ nhớ có bước review.
Không có cái này, bộ não sẽ đầy những kết luận sai nhưng rất tự tin. Có nó, bộ não vẫn là thứ tôi thật sự tin được. (Tôi rút ra điều này theo đúng cách tôi rút ra mọi thứ - làm sai trước đã.)
Cả cái vault được track bằng git và sync qua một private repo trên GitHub. Mọi session, mọi máy, cùng một bộ não. Nếu mai con Mac Mini chết, bộ nhớ vẫn sống. Và tôi có diff trên bộ nhớ của trợ lý - gõ ra câu này thấy hơi kỳ nhưng nó hay thật - tôi thấy chính xác tuần này nó học được gì, từng dòng một.
Model nào làm việc gì
Hai model, một nguyên tắc.
Claude Sonnet lo mọi thứ cần hay: viết nháp, trả lời câu hỏi thật sự, chắt lọc insight từ cả ngày hội thoại, review code Swift của tôi.
Claude Haiku lo mọi thứ máy móc: gắn tag cho note, phân loại task, lọc tin, sanity check, format.
Nguyên tắc của tôi: task nào có đáp án đúng/sai rõ ràng thì Haiku. Task nào cần hay hoặc cần khôn thì Sonnet.
Bạn không cần một model thông minh để quyết định một repo GitHub có phải về iOS hay không. Nhưng bạn cần một cái để nói cho bạn biết copy paywall của bạn có ổn không.
Và một lần nữa - vì cái này chạy trên subscription của Claude chứ không phải API trả tiền theo token, tôi không phải nâng niu từng lượt gọi. Haiku có thể phân loại cả nghìn thứ qua đêm. Đồng hồ tính tiền không chạy.
Điều bất ngờ: mấy tính năng nhàm chán lại thắng
Tôi build cái này với kỳ vọng mấy thứ hào nhoáng mới là quan trọng. Agent tự động làm task nhiều bước. Sinh code qua đêm.
Còn thứ tôi thực sự dùng mỗi ngày:
Recall. "Hồi tháng 6 tôi chốt gì về giá của ShiftPlus nhỉ?" Có câu trả lời trong vài giây, kèm đúng ngữ cảnh, vì mọi hội thoại đều được index. Riêng cái này đã đáng để dựng cả setup. Trí nhớ tôi tệ. Trí nhớ con Mac thì không.
Bản digest hàng đêm. GitHub trending, lọc còn những thứ tôi thật sự quan tâm. Năm mục thay vì năm trăm.
Build kiểu bấm rồi quên. "Build app đi, fail thì báo tôi." Tôi đi nấu cơm.
Bản nháp đúng giọng tôi. Vì sở thích viết lách của tôi nằm trong bộ não, bản nháp đầu ra đã nghe giống tôi thay vì giống thông cáo báo chí. Tôi vẫn sửa lại hết. Nhưng sửa rẻ hơn nhiều so với viết từ đầu.
Chẳng cái nào trong số này là demo đem lên sân khấu được. Nhưng tất cả đều cộng dồn giá trị mỗi ngày.
Giới hạn, nói thật
Mục này tồn tại vì bài build in public nào bỏ qua nó là đang nói dối.
Thỉnh thoảng nó hỏng trong im lặng. Một LaunchAgent không chạy, một script chết lặng lẽ, và hai ngày sau tôi mới phát hiện thứ Ba chẳng có gì được index. Giám sát một hệ thống luôn bật là cả một công việc riêng, và tôi làm việc đó dở.
Chất lượng bộ nhớ cần chăm vườn. Cái pattern inbox giúp được phần nào, nhưng context cũ vẫn tích tụ. Một trợ lý tự tin trích dẫn kế hoạch tháng 3 của tôi vào tháng 8 còn tệ hơn một trợ lý biết nói "tôi không biết."
Nó không tự chủ. Nó không ship tính năng trong lúc tôi ngủ. Nó làm việc vặt trong lúc tôi ngủ. Khác nhau xa. Giấc mơ "AI vận hành business giùm tôi" còn cách cái bàn này rất xa.
Chi phí setup là có thật. Nhiều tuần buổi tối. Nếu định giá thời gian của mình một cách sòng phẳng, dùng OpenClaw mới là lựa chọn hợp lý. Tôi đã làm hòa với việc mình không hợp lý ở khoản này.
Một điểm chết duy nhất. Một con Mac, một căn hộ, một lưới điện. Bộ não sống sót nhờ GitHub, nhưng bản thân trợ lý thì chìm theo tàu.
Kết
Tôi không nghĩ ai cũng nên build cái này. Phần lớn mọi người không nên.
Nhưng nếu bạn là dev, có sẵn một con Mac dư, và hơi dị ứng với việc trả tiền theo token, thì đây là một project làm xong rất đã. Bạn có được một trợ lý biết rõ project của bạn, viết đúng giọng bạn, làm việc trong lúc bạn ngủ - lắp từ những mảnh bạn hiểu tường tận.
Còn chủ yếu, tôi chỉ thích cái cảm giác có một cái máy tính nhỏ trên bàn, lặng lẽ giỏi dần lên trong việc giúp ích cho tôi.
Đến giờ vẫn thấy hơi khó tin.
Build in public bởi @_nghialuong - solo dev, làm app iOS và macOS.