12 điểm bởi GN⁺ 2025-06-19 | 1 bình luận | Chia sẻ qua WhatsApp
  • Bao gồm các tính năng tạo kế hoạch tập luyện, theo dõi tiến độ và cung cấp cơ sở dữ liệu bài tập đồ sộ
  • Được khởi đầu từ kinh nghiệm thất bại của workout.lol, với mục tiêu trở thành một dự án tiến hóa bền vững dành cho cộng đồng mã nguồn mở
  • Sử dụng kiến trúc dựa trên Feature-Sliced DesignNext.js, nhấn mạnh tính độc lập theo từng tính năng, khả năng mở rộng và khả năng bảo trì mã nguồn
  • Cơ sở dữ liệu bài tập có thể nhập dễ dàng bằng tệp CSV, bao gồm thông tin chi tiết như đặc tính bài tập, video, nhóm cơ chính được tác động và nhiều dữ liệu khác
  • Trong tương lai, dự án dự kiến sẽ tiếp tục mở rộng tính năng dựa trên sự tham gia của cộng đồng như ứng dụng di động, huy hiệu/gamification, tích hợp thiết bị đeo, diễn đàn cộng đồng

Tổng quan và giá trị của Workout-Cool

  • Workout-Cool là một nền tảng huấn luyện thể hình mã nguồn mở hiện đại, cho phép người dùng tạo kế hoạch tập luyện tùy chỉnh, ghi lại tiến độ của mình và sử dụng rộng rãi cơ sở dữ liệu bài tập phong phú (bao gồm mô tả, video, v.v.)
  • Nhà phát triển từng trực tiếp trải qua việc dự án workout.lol bị bỏ bê và khai tử, nên đã tái sinh nó thành một nền tảng thể hình mã nguồn mở bền vững và hiện đại hơn cho cộng đồng tập luyện

Khởi đầu dự án và động lực

  • Với vai trò là người đóng góp chính của dự án workout.lol, tác giả từng gặp khó khăn do thất bại trong hợp tác với đối tác cung cấp video và vấn đề chi phí bản quyền video
  • Sau khi dự án bị bán cho người khác rồi nhanh chóng bị khai tử, tác giả đã cố gắng liên lạc với chủ sở hữu mới trong hơn 9 tháng nhưng không nhận được phản hồi
  • Để không lãng phí giá trị của dự án cũ, tác giả quyết định xây dựng mới một nền tảng hiện đại được cải thiện toàn diện
  • Đây không phải là dự án vì mục đích thương mại. Nó mang ý nghĩa của sự tiến hóa, với cam kết bảo trì và phát triển đáng tin cậy cho cộng đồng mã nguồn mở

Triết lý vận hành dựa trên cộng đồng

  • Với tư cách vừa là nhà phát triển vừa là người dùng thực tế, tác giả trực tiếp phản ánh các tính năng và trải nghiệm mà cộng đồng cần
  • Nếu từng là người dùng workout.lol, bạn sẽ được chào đón; nếu là người dùng mới, bạn có thể trải nghiệm giá trị của một nền tảng thể hình hướng tới tương lai
  • Bất kỳ ai cũng có thể trực tiếp đóng góp và gửi ý kiến cải thiện

Cơ sở dữ liệu bài tập và nhập dữ liệu

  • Dự án được tích hợp cơ sở dữ liệu bài tập phong phú
  • Dưới định dạng CSV mẫu, có thể tùy biến việc import nhiều loại thông tin như id, tên, mô tả, URL video, ảnh, nhóm cơ chính, thuộc tính của từng bài tập
    • Ví dụ các cột chính: id, name, name_en, description, description_en, full_video_url, full_video_image_url, introduction, slug, attribute_name, attribute_value, v.v.
    • Ví dụ các loại thuộc tính: TYPE(sức mạnh/cardio/plyometrics/giãn cơ), PRIMARY_MUSCLE, SECONDARY_MUSCLE, EQUIPMENT, MECHANICS_TYPE, v.v.
  • Có thể import dữ liệu ngay bằng lệnh một dòng, giúp khả năng mở rộng dữ liệu rất cao

Kiến trúc dự án

  • Dựa trên Next.js App Router với nguyên tắc Feature-Sliced Design (FSD)
    • Triển khai cấu trúc độc lập theo từng tính năng và dễ tái sử dụng
    • Phân tách tầng domain rõ ràng: shared → entities → features → widgets → app
    • Duy trì tính nhất quán giữa UI, logic nghiệp vụ và tầng dữ liệu
  • Ví dụ phân tách tệp:
    • app/ - route và layout của Next.js
    • processes/ - luồng nghiệp vụ tổng hợp
    • widgets/ - UI lắp ghép (ví dụ: Sidebar, Header)
    • features/ - các đơn vị chính (xác thực, quản lý bài tập, v.v.)
    • entities/ - người dùng, bài tập, workout, v.v.
    • shared/ - mã và kiểu dùng chung
    • styles/ - CSS/toàn cục/chủ đề

Phát triển và triển khai

  • Cần Node.js 18+, PostgreSQL (Docker hoặc tự thiết lập), pnpm hoặc npm
  • Sau khi clone thì cài dependency, thiết lập biến môi trường, thiết lập cơ sở dữ liệu (tự động hoặc thủ công), rồi truy cập http://localhost:3000 trên trình duyệt
  • Có thể tự chạy migration cơ sở dữ liệu và khởi động máy chủ phát triển
  • Build image Docker và chạy container (dự kiến)

Tính năng dự kiến

  • Thêm bài tập/video
  • Ứng dụng di động (dựa trên React Native)
  • Gamification (hệ thống huy hiệu, v.v.)
  • Thống kê tiến độ nâng cao và trực quan hóa
  • Tích hợp thiết bị đeo (đồng hồ/tracker)
  • Hỗ trợ đa ngôn ngữ
  • Xác thực OAuth (Google, Apple, v.v.)
  • Diễn đàn cộng đồng tích hợp sẵn

1 bình luận

 
GN⁺ 2025-06-19
Ý kiến trên Hacker News
  • Thật thú vị khi nhìn thấy app của tôi workout.lol ở đây
    Tôi đã bán app cho một người, rồi rơi vào tình huống người đó cứ bỏ mặc nó
    Tôi đã nhắn tin nhiều lần bảo rằng nếu cần hỗ trợ thì cứ liên hệ, nhưng chưa từng nhận được một hồi âm nào
    Dù vậy, thấy giờ nó lại được quản lý tiếp khiến tôi thật sự rất vui
    Phần UI cũng cải thiện rất tốt, làm tuyệt lắm
  • Là Vincenius đây!
    Bạn không thể tưởng tượng nổi tôi đã vui thế nào khi thấy tên bạn hiện ra đâu
    Tôi cũng từng có cảm giác tan nát khi chỉ biết nhìn dự án bị đình trệ mà chẳng thu lại được gì
    Rốt cuộc chính điều đó đã trở thành động lực để tôi đập đi làm lại toàn bộ, đồng thời giữ tinh thần cởi mở mà bạn từng có khi bắt đầu
    Cảm ơn lời khen về UI, nghe được điều đó từ bạn thật sự rất có ý nghĩa
    Nếu bạn muốn quay lại lúc nào thì luôn được chào đón
    Chỉ cần có ý tưởng, góp ý, hay đơn giản là sự hiện diện của bạn thôi cũng đã rất đáng quý
  • Cái này thật sự rất hay
    Tôi đang làm một API tự động lên lịch lịch biểu tích hợp với Apple CalDAV(iCal)
    Tôi xây tính năng quản lý lịch trình xoay quanh mục tiêu của người dùng (dùng Google ORTools để tính một mô hình ràng buộc CP-SAT cực lớn rất nhanh, xử lý cả kế hoạch 1 năm cũng dưới 5 giây)
    Trong đó cũng có cả tính năng thực đơn đáp ứng mục tiêu dinh dưỡng
    Thật ra tôi rất muốn đưa kiểu hệ thống kế hoạch tập luyện này vào, nhưng hoàn toàn chưa biết nên dùng gì
    Giờ thì đã rõ nên dùng cái gì rồi
    Cảm ơn vì đã làm ra dự án này
  • Tôi tự hỏi không biết có phải ai đó trong ngành đã mua nó đi để chặn một lựa chọn miễn phí hay không
    Giờ tôi muốn theo dõi xem tương lai dự án này sẽ ra sao
  • Tôi thấy thông báo error loading exercises
    Không biết bạn nghĩ gì về dự án wger
    https://github.com/wger-project là một nền tảng tự host để quản lý fitness/tập luyện/dinh dưỡng, FLOSS theo giấy phép AGPL
    Có lẽ đã gần 10 năm tuổi, là ứng dụng Django, và còn có app Flutter chính thức nên dùng được trên Android/iOS/Windows/Linux/macOS
    Hỗ trợ nhiều người dùng, thậm chí còn có thể dùng để vận hành phòng gym
    body.build là một dự án FLOSS mới hơn, chạy trên trình duyệt và tập trung vào việc xây dựng chương trình tập tạ
    Tác giả của body.build cũng có đóng góp cho wger
    Sau khá nhiều lần thử và sai, tôi hiện đang dùng wger ổn trong homelab
    Có khá nhiều yếu tố cần cân nhắc trong quá trình tự host, nhưng nó hoạt động tốt
    Điểm yếu lớn nhất là độ bao phủ của cơ sở dữ liệu bài tập, nhưng may là các contributor đang dần mở rộng thêm
    Nếu có ai có thể đóng góp dữ liệu bài tập (và media bài tập), dự án AGPL này chắc chắn sẽ rất cảm kích
  • Gần đây tôi có thử Wget, nhưng tiếc là không thể khuyên dùng
    UX của website rất tệ, còn app mobile thì (trên iOS) đầy lỗi
    Bấm vào bắt đầu bài tập/chỉnh mức tạ/ghi lại buổi tập chỗ nào cũng cứ crash hoặc treo, rồi liên tục bị đăng xuất
    Giờ tôi đang dùng LiftLog, có đủ mọi thứ tôi cần và là FOSS
    https://github.com/LiamMorrow/LiftLog
    Dù fitness và tập tạ giờ là sở thích rất phổ biến, thật lạ là gần như không có app phi thương mại nào vừa dùng được vừa được duy trì tốt
    Đó là kết luận của tôi sau khi tự thử vài chục dự án trên Github
  • Tôi cũng gặp lỗi đó
  • Tôi đã tập tạ khoảng 5 năm, và thấy một công cụ mã nguồn mở được làm chỉn chu như thế này thật đáng mừng
    Khi đã có kinh nghiệm, thứ quan trọng hơn tính năng của app rốt cuộc vẫn là bạn ghi chép đều đặn đến đâu để quản lý progressive overload
    App này là một lựa chọn tốt để người mới bắt đầu
    Nếu muốn được dùng rộng hơn thì có đúng 2 thứ nhất định phải có
  1. App mobile (hoặc PWA, PWA tôi tự làm cũng đã đủ tốt như app native)
  2. Khả năng lưu và quản lý một routine tập cụ thể trong thời gian dài
  • Lý tưởng nhất là dữ liệu phải có thể export và chia sẻ giữa nhiều UI
    https://json-schema.app/view/#?url=https%3A%2F%2Fgist.githubusercontent.com%2Fgavmor%2Fb74c4746aa9f3f63b0f50863a5e62d52%2Fraw%2F01318d1107f67ac83387a905d6556736fa7797ff%2Flifting.json
  • Tôi viết điều này sau khi dùng thử, hoàn toàn không có ý dìm OP
    Tôi không đồng ý rằng đây là lựa chọn tốt cho người mới
    Tôi hoan nghênh công sức bỏ ra, nhưng phần sắp xếp bài tập được đề xuất hơi đáng lo
    Ví dụ: chọn “lưng/tay trước” thì hiện ra 9 bài tập rất lộn xộn
    Không có sự cân nhắc về thứ tự hay cách sắp xếp bài, compound lift xuất hiện ngay giữa danh sách hoặc chin-up bị lặp đến ba lần
    Không có tính toán 1RM liên quan đến rep/set/trọng lượng
    Lại còn gợi ý bro split không chuẩn, khiến mọi thứ càng rời rạc hơn
    Tôi nghĩ chỉ cần làm một app PPL tối giản theo thiết bị thôi cũng có thể tốt hơn nhiều
  • Cảm giác thật tuyệt khi được một người có kinh nghiệm trong giới phòng gym công nhận như vậy
    Tôi cũng giống bạn, càng có kinh nghiệm càng thấy thứ quan trọng nhất thật ra là sự đều đặn và việc ghi lại tiến trình (với tôi thì để quản lý tinh thần, nên giờ tập trung vào theo dõi trạng thái hơn là thành tích)
    Tính năng lưu routine + theo dõi dài hạn đã có trong roadmap
    Vì thế kiến trúc workout session được thiết kế hoàn toàn khác app cũ
    Tôi muốn để người dùng tạo từng khối training riêng lẻ, rồi tối ưu trải nghiệm tái sử dụng, chia sẻ, phân tích và phát triển dần chúng
    Nếu được, tôi rất muốn nghe cách bạn tiếp cận việc quản lý routine trong PWA bạn làm
    Có vẻ chúng ta đã đi qua con đường khá giống nhau, nên tôi rất muốn nghe bạn chia sẻ
  • Nếu bạn tò mò về nguồn dữ liệu thì đây là vài dự án đáng tham khảo
    https://wrkout.xyz/ (API cơ sở dữ liệu bài tập mở, có cả hình ảnh/video)
    https://github.com/wrkout/exercises.json (dataset bài tập mã nguồn mở)
    Khuyên bạn tận dụng nếu cần
  • Tôi từng xem qua wrkout.xyz rồi, đúng là một dự án rất hay
    Lần này tôi và đối tác đã dựng lại dataset hoàn toàn từ đầu để tránh rõ ràng các vấn đề bản quyền liên quan đến video
    Nhờ vậy chúng tôi kiểm soát được dữ liệu để có thể chỉnh thuộc tính, bản dịch và mọi thứ theo đúng ý muốn
    Dù vậy, tôi rất vui khi thấy có nhiều dự án mở trong lĩnh vực này
    Nếu cả hai cộng đồng đều có thể phát triển thì tôi rất muốn tìm cách tạo ra cộng hưởng
    DM luôn được chào đón
  • Đây mới đúng là một đóng góp thực sự
    Không chỉ ném ra ý tưởng, mà còn gom sẵn dataset để người mới có thể bắt đầu ngay
    Thật sự cảm ơn
  • Thành thật mà nói thì app này ổn hơn tôi tưởng
    Điều tôi muốn là tính năng gợi ý mức tạ/số rep cho từng bài tập
    Bạn có thể tham khảo chương trình fitness “100 Pushups”
  • Làm một bài kiểm tra tối đa số lần lặp (ví dụ: 8 cái chống đẩy)
  • App tạo lịch tập (3, 4, 3, 3, 5 rồi nghỉ 2 phút và lặp lại)
  • Tùy theo trình độ người dùng mà gợi ý số rep tăng dần, có điều chỉnh
  • Tới khoảng tuần 6 thì hướng tới mốc tối đa 100 cái
    Nếu bạn hứng thú, tôi cũng sẵn sàng bàn thêm về UI
  • Nếu bạn muốn bỏ backend thì tích hợp AT Protocol cũng là một ý tưởng
    Toàn bộ dữ liệu người dùng được lưu trong PDS, không cần server riêng
    Kể cả nếu dự án lại bị bỏ hoang thì dữ liệu vẫn tiếp tục tồn tại lâu dài
  • Tôi hoàn toàn ấn tượng với ý tưởng đó
    Tôi biết app này, nó thực sự đơn giản và cách tiến triển mang tính thích ứng rất xuất sắc trong việc tạo động lực cho người mới
    Tôi rất muốn bàn về UI để triển khai routine kiểu tự điều chỉnh ~ tăng tiến như vậy
    Tôi sẽ thử nghĩ trước một thuật toán (còn thô sơ) nên hãy DM cho tôi nhé
  • App trông có vẻ ổn nhưng bị lỗi trong quá trình tải bài tập
    0:{"a":"$@1","f":"","b":"eETmgndxtv4Ar0i8Wync1"}
    1:{"serverError":"An unexpected error occurred."}
    Tôi còn chia sẻ cả mã request nữa (đã điền đầy đủ header và thông tin chi tiết)
  • Cảm ơn bản báo cáo chi tiết
    Lượng truy cập từ HN tăng đột biến đã làm server quá tải ngoài dự kiến
    Tôi sẽ sớm ổn định lại và sửa lỗi
    Cảm ơn bạn một lần nữa vì đã test và phản hồi
  • Tôi gặp khá nhiều vấn đề kỹ thuật, dù hiểu rằng chuyện này là bình thường với một dự án mới
    Về căn bản thì hệ thống gợi ý bài tập chưa xét đến các yếu tố cốt lõi của việc thiết kế chương trình fitness
    Ở trạng thái hiện tại, tôi khó có thể khuyên dùng nó cho mục đích xây dựng chương trình tập luyện
    Có lẽ nên tập trung vào việc import nhật ký tập/routine template đã được kiểm chứng thay vì tạo routine ngay từ đầu (và tôi thấy bạn cũng đã thể hiện sự quan tâm đến hướng này)
    Đây là các vấn đề chính tôi gặp phải
  1. Tôi muốn tập toàn thân, nhưng một buổi lại được gợi ý tới 33 bài — không thực tế
  2. Việc chọn bài chỉ gán ngẫu nhiên 3 bài cho mỗi nhóm cơ, bỏ qua bài tập nhắm nhiều nhóm cơ/phân bổ volume hợp lý
  3. Các bài lạ hoặc kém hiệu quả cũng thường xuyên được gợi ý
  4. App còn gợi ý cả thiết bị tôi không có; tôi là người tập ở home gym nên cần loại bỏ hoàn toàn máy tập
  5. Có cả những thiết bị mang thương hiệu lạ được gợi ý
  6. Dù đổi lựa chọn thiết bị thì danh sách bài tập vẫn giữ nguyên
  7. Không thể xóa bài tập được gợi ý, cũng không thể thêm bài mới
  • Tôi cũng có cảm nhận tương tự
    UI và phần mô tả rất tốt, nhưng khâu chọn bài tập thì mơ hồ hoặc phi lý ngay cả khi nó có hiện ra
    Hay là trước tiên cứ đưa đầy đủ các bài primary/secondary tiêu chuẩn (bar, dumbbell, machine) vào database, rồi để người dùng tự tạo routine
    Sẽ càng tốt hơn nếu có cả tùy chọn thay thế cho từng bài cụ thể
    Sau khi chuẩn bị xong những điều này rồi mới triển khai tính năng tạo routine, và sẽ rất tuyệt nếu có huấn luyện viên thực tế góp ý
    Thiết bị nên giữ đơn giản/chuẩn hóa, hạn chế tối đa các máy mang thương hiệu riêng
  • Thật lòng cảm ơn bạn đã để lại phản hồi kỹ lưỡng như vậy
    Những ý kiến chi tiết thế này đặc biệt quý giá ở giai đoạn sớm
    Logic chương trình tập hiện tại đúng là còn rất sơ khai
    Nó vẫn chưa phản ánh tốt các nguyên tắc tập luyện như volume, movement pattern, chu kỳ hồi phục, compound/isolation
    Phiên bản hiện tại thật sự chỉ để “khám phá”, hoàn toàn chưa phải một huấn luyện viên thông minh
    Có lẽ tôi nên nói rõ điều này trong UI
    Trả lời từng ý cụ thể
  1. 33 bài được gợi ý đúng là quá đà thật (cười)
  2. Đúng vậy, hiện tại chỉ đang gợi ý mù quáng 3 bài cho mỗi nhóm cơ, sau này sẽ củng cố logic
  3. Tôi đang bổ sung metadata như phân loại compound/isolation, cơ chính/cơ phụ/movement pattern/chất lượng kháng lực, cũng như các tag độ phổ biến
  4. Tôi cũng đang nghĩ tới việc thêm tùy chọn loại trừ hoàn toàn một số loại thiết bị như máy tập
    Tôi hoàn toàn hiểu nhu cầu kiểu có dumbbell/thanh xà nhưng không muốn dùng cable/machine, và sẽ cụ thể hóa phần UI này
  5. OK
  6. Có bug là đổi thiết bị mà danh sách không đổi, tôi sẽ sớm sửa
    (Bây giờ phải lặp lại 2 lần, là lỗi render)
  7. Tính năng chỉnh sửa toàn bộ routine sẽ sớm được hỗ trợ
    Tôi muốn cải thiện nó theo những nguyên tắc tốt, nên nếu được tôi rất muốn bạn cùng góp ý định hướng
  • Tôi thấy người khác có nhắc tới tầm quan trọng của “chỉnh form”, nên tò mò không biết hiện có công nghệ computer vision mã nguồn mở nào để kiểm tra posture/form không
    Tôi còn hứng thú hơn nếu đó là giải pháp có thể triển khai và dùng trực tiếp trên phần cứng tiêu dùng
  • Sẽ tốt hơn nếu việc chọn thiết bị/cơ bắp không phải là bắt buộc
    Ví dụ, tôi có thanh xà nhưng không biết có thể tập cơ nào với nó
    Hay là thay vào đó dùng kiểu bộ lọc “dễ cho người mới bắt đầu” thì sao
  • Tôi cũng chưa nghĩ đến điểm này, nhưng đúng là flow hiện tại đòi hỏi quá nhiều kiến thức ngay từ đầu
    Người khác cũng đã phản hồi tương tự
    Tôi sẽ chuyển các tùy chọn lọc thành không bắt buộc, và thêm các gợi ý như “thân thiện với người mới”, “bài tập phổ biến”, “calisthenics”
    Cảm ơn bạn đã nói ra
  • Thế thì chỉ cần chọn mỗi thanh xà trong phần thiết bị là được mà?
  • Với tư cách người mới, điều đầu tiên tôi cảm nhận là UI chọn cơ bắp vừa hào nhoáng vừa gây bối rối
    Ở phần onboarding ban đầu, việc chọn cơ là bắt buộc, mà với người mới không biết routine nào nhắm vào cơ nào thì đây là một rào cản
    Tôi biết đại khái “push”, “pull”, “leg”, nhưng tên các nhóm cơ cụ thể thì quá xa lạ
    Rốt cuộc app này giống như chỉ phù hợp cho người sẵn sàng học giải phẫu
    Cần nghĩ cách để người dùng có thể vào dễ hơn một chút
    Ví dụ: nhóm cơ được gợi ý, preset
  • Cảm ơn phản hồi thẳng thắn
    Phần onboarding hiện tại đang mặc định người dùng đã có quá nhiều kiến thức (nhiều hơn tôi tưởng)
    Người mới đâu phải muốn biết “cơ delta sau” hay “cơ xô”, họ chỉ muốn khỏe hơn và trông đẹp hơn thôi
    Trong bản cập nhật tiếp theo
  • việc chọn cơ sẽ trở thành tùy chọn (hoặc có thể bỏ qua)
  • sẽ có preset cho người mới (toàn thân, thân trên, v.v.)
  • sẽ có các preset gắn nhãn trợ giúp như “ngực + tay sau (push)”, “lưng + tay trước (pull)”
    Mục tiêu là tạo ra trải nghiệm thân thiện để người dùng có thể bắt đầu ngay mà không phải học giải phẫu từ đầu
    Phản hồi của bạn thật sự giúp ích rất nhiều
    Chúc bạn thuận lợi trên hành trình fitness
  • “push” với “pull” có thể thấy khó, nhưng nếu không biết cả “leg” thì có phải là hơi mù mờ quá rồi không nhỉ (đùa thôi)