Kanban kéo thả
Quản lý tiến độ bằng cách kéo thẻ nhiệm vụ giữa các cột.
Bài cuối kỳ được phát triển thành ứng dụng Kanban live tại tasket.io.vn, có Ably realtime collaboration, Better Auth/OAuth, Resend email domain, admin analytics và Task Voice Agent.
Thiết kế comic-like với viền đậm, shadow lệch và màu tương phản.
Quản lý tiến độ bằng cách kéo thẻ nhiệm vụ giữa các cột.
Hỗ trợ tiếng Việt và tiếng Anh, đồng bộ theo lựa chọn người dùng.
Chia sẻ project qua invite/share link, phân quyền thành viên, comment và đồng bộ realtime bằng Ably.
Tạo task từ giọng nói, có STT resilience, NLP date parsing, JSON repair và validate schema.
Resend gửi email overdue/digest qua notifications@tasket.io.vn, có dedup, retry và unsubscribe token.
Google OAuth production, session cookie, lazy migration user cũ và fallback JWT compatibility.
Task/project đã xóa có thể khôi phục trong 7 ngày trước khi bị dọn dẹp.
Admin dashboard có analytics, user management, audit logs và visit tracking.
Ứng dụng đang live trên Render với domain tasket.io.vn, DNS Cloudflare và domain mua tại Mắt Bão.
Cấu hình A/CNAME, DKIM, SPF, MX, DMARC và xử lý lỗi SSL handshake/proxy Cloudflare.
Refactor từ MVC sang MVVM với ViewModel, error class riêng và route layer mỏng.
Thiết kế comic-like với viền đậm, shadow lệch và màu tương phản.
Quản lý tiến độ bằng cách kéo thẻ nhiệm vụ giữa các cột.
Hỗ trợ tiếng Việt và tiếng Anh, đồng bộ theo lựa chọn người dùng.
Chia sẻ project qua invite/share link, phân quyền thành viên, comment và đồng bộ realtime bằng Ably.
Tạo task từ giọng nói, có STT resilience, NLP date parsing, JSON repair và validate schema.
Resend gửi email overdue/digest qua notifications@tasket.io.vn, có dedup, retry và unsubscribe token.
Google OAuth production, session cookie, lazy migration user cũ và fallback JWT compatibility.
Task/project đã xóa có thể khôi phục trong 7 ngày trước khi bị dọn dẹp.
Admin dashboard có analytics, user management, audit logs và visit tracking.
Ứng dụng đang live trên Render với domain tasket.io.vn, DNS Cloudflare và domain mua tại Mắt Bão.
Cấu hình A/CNAME, DKIM, SPF, MX, DMARC và xử lý lỗi SSL handshake/proxy Cloudflare.
Refactor từ MVC sang MVVM với ViewModel, error class riêng và route layer mỏng.
Tasket bắt đầu từ bài cuối kỳ, nhưng tôi phát triển nó như một sản phẩm thật: có domain riêng đang live, deploy production, email domain, admin dashboard và tài liệu vận hành.
Dự án hướng tới sinh viên/nhóm nhỏ/freelancer cần quản lý project, deadline, thành viên, comment và lịch sử hoạt động thay vì dùng todo list rời rạc.
Tôi mua domain tasket.io.vn ở Mắt Bão, chuyển nameserver sang Cloudflare, trỏ root/www về Render và cấu hình SSL để app chạy bằng tên miền riêng.
Tôi cấu hình Resend với notifications@tasket.io.vn, DKIM/SPF/MX/DMARC trên Cloudflare và region Tokyo để gửi email nhắc hạn chuyên nghiệp hơn.
Frontend dùng React 19, Vite, Tailwind, React Query, dnd-kit, React Hook Form và Zod; backend dùng Express, MongoDB/Mongoose, Better Auth, Ably, Resend, Cloudinary, rate limit và Helmet.
Tasket có project collaboration, invite/share link, comment, realtime sync bằng Ably, voice agent, profile/avatar, notification settings, admin analytics, audit logs và soft-delete.
Repo có ADR, architecture docs, deployment guide, overdue-email docs, profile-image docs, auth migration docs, test docs và task breakdown cho từng feature lớn.
Tôi trực tiếp xử lý product flow, frontend, backend, auth, database, deployment, DNS/email config, bug fix, test và documentation để có thể tự demo lẫn giải thích kỹ thuật.
Tasket bắt đầu từ bài cuối kỳ, nhưng tôi phát triển nó như một sản phẩm thật: có domain riêng đang live, deploy production, email domain, admin dashboard và tài liệu vận hành.
Dự án hướng tới sinh viên/nhóm nhỏ/freelancer cần quản lý project, deadline, thành viên, comment và lịch sử hoạt động thay vì dùng todo list rời rạc.
Tôi mua domain tasket.io.vn ở Mắt Bão, chuyển nameserver sang Cloudflare, trỏ root/www về Render và cấu hình SSL để app chạy bằng tên miền riêng.
Tôi cấu hình Resend với notifications@tasket.io.vn, DKIM/SPF/MX/DMARC trên Cloudflare và region Tokyo để gửi email nhắc hạn chuyên nghiệp hơn.
Frontend dùng React 19, Vite, Tailwind, React Query, dnd-kit, React Hook Form và Zod; backend dùng Express, MongoDB/Mongoose, Better Auth, Ably, Resend, Cloudinary, rate limit và Helmet.
Tasket có project collaboration, invite/share link, comment, realtime sync bằng Ably, voice agent, profile/avatar, notification settings, admin analytics, audit logs và soft-delete.
Repo có ADR, architecture docs, deployment guide, overdue-email docs, profile-image docs, auth migration docs, test docs và task breakdown cho từng feature lớn.
Tôi trực tiếp xử lý product flow, frontend, backend, auth, database, deployment, DNS/email config, bug fix, test và documentation để có thể tự demo lẫn giải thích kỹ thuật.
Một todo app CRUD quá phổ biến, nên bài toán của tôi là biến nó thành workspace có collaboration, auth thật, realtime, background job và vận hành production.
Custom domain cần đúng A/CNAME, Cloudflare phải DNS only cho Render, nếu bật proxy cam sẽ gặp SSL handshake/certificate pending.
Resend cần verify domain, copy đúng DKIM dài, cấu hình SPF/MX/DMARC và tắt EMAIL_DEV_REDIRECT_TO_ADMIN để email không gửi nhầm về admin.
Commit history có fix production Google OAuth 404 và lazy initialize Better Auth để tránh startup crash khi cấu hình OAuth/env chưa sẵn sàng.
Commit `fix(deps)` cho thấy tôi đã xử lý xung đột Zod v4 bằng cách bỏ better-auth/infra và nâng OpenAI lên v6, tức có vấn đề dependency không chỉ code feature.
Voice agent phải xử lý transcript tiếng Việt, lỗi STT, ngày giờ mơ hồ, output AI sai schema, JSON hỏng, rate limit và validation fail.
Khi nhiều người cùng thao tác project/task/comment, UI cần đồng bộ và quyền thành viên phải rõ để tránh sửa/xem nhầm dữ liệu.
ADR và commit refactor cho thấy backend ban đầu theo MVC, sau đó chuyển sang MVVM vì controller chứa quá nhiều validation, transform và business logic.
Email overdue cần dedup 24h, batch delay theo rate limit Resend, retry có backoff, digest theo timezone và unsubscribe token an toàn.
Soft-delete 7 ngày phải xử lý restore, purge bằng cron, query exclude deleted và cleanup liên quan như notification/avatar khi user bị xóa.
Một todo app CRUD quá phổ biến, nên bài toán của tôi là biến nó thành workspace có collaboration, auth thật, realtime, background job và vận hành production.
Custom domain cần đúng A/CNAME, Cloudflare phải DNS only cho Render, nếu bật proxy cam sẽ gặp SSL handshake/certificate pending.
Resend cần verify domain, copy đúng DKIM dài, cấu hình SPF/MX/DMARC và tắt EMAIL_DEV_REDIRECT_TO_ADMIN để email không gửi nhầm về admin.
Commit history có fix production Google OAuth 404 và lazy initialize Better Auth để tránh startup crash khi cấu hình OAuth/env chưa sẵn sàng.
Commit `fix(deps)` cho thấy tôi đã xử lý xung đột Zod v4 bằng cách bỏ better-auth/infra và nâng OpenAI lên v6, tức có vấn đề dependency không chỉ code feature.
Voice agent phải xử lý transcript tiếng Việt, lỗi STT, ngày giờ mơ hồ, output AI sai schema, JSON hỏng, rate limit và validation fail.
Khi nhiều người cùng thao tác project/task/comment, UI cần đồng bộ và quyền thành viên phải rõ để tránh sửa/xem nhầm dữ liệu.
ADR và commit refactor cho thấy backend ban đầu theo MVC, sau đó chuyển sang MVVM vì controller chứa quá nhiều validation, transform và business logic.
Email overdue cần dedup 24h, batch delay theo rate limit Resend, retry có backoff, digest theo timezone và unsubscribe token an toàn.
Soft-delete 7 ngày phải xử lý restore, purge bằng cron, query exclude deleted và cleanup liên quan như notification/avatar khi user bị xóa.
Tôi đóng gói React SPA + Express API thành Render Web Service, cấu hình APP_URL, CORS_ORIGIN, env secrets và health path để service chạy production.
Tôi chuyển nameserver Mắt Bão sang Cloudflare, trỏ A `@` về 216.24.57.1, CNAME `www` về Render và giữ DNS only để Render cấp SSL.
Tôi cấu hình Resend domain tasket.io.vn với DKIM, SPF, MX, DMARC và dùng EMAIL_FROM `Tasket <notifications@tasket.io.vn>` cho môi trường production.
Tôi thêm Better Auth server foundation, compatibility routes, Google entrypoint, cookie session bootstrap và fallback JWT để user cũ không bị gãy phiên.
Tôi xử lý lỗi Google OAuth 404 ở production và lazy initialize Better Auth để backend không crash khi dependency/env chưa đủ.
Tôi nâng voice-to-task thành pipeline có STT route, intent extraction, chrono/date parsing, JSON repair, schema validation, Retry-After và test cho voice route.
Tôi dùng Ably cho realtime collaboration thay vì Socket.IO: project events, invite/share link, comment model, TaskCommentsModal và UI project members được đồng bộ cho nhóm nhỏ.
Tôi chuyển backend sang MVVM với Task/Auth/Profile/Admin ViewModel, route layer mỏng, error class riêng và response format nhất quán.
Tôi xây Resend email service, NotificationLog TTL 90 ngày, cron 15 phút, digest hourly, retry 30 phút, dedup 24h và unsubscribe bằng HMAC token.
Tôi thêm admin dashboard, analytics, user management, audit logs, VisitLog, admin API/service và chỉnh Settings để quản trị dự án rõ hơn.
Tôi đóng gói React SPA + Express API thành Render Web Service, cấu hình APP_URL, CORS_ORIGIN, env secrets và health path để service chạy production.
Tôi chuyển nameserver Mắt Bão sang Cloudflare, trỏ A `@` về 216.24.57.1, CNAME `www` về Render và giữ DNS only để Render cấp SSL.
Tôi cấu hình Resend domain tasket.io.vn với DKIM, SPF, MX, DMARC và dùng EMAIL_FROM `Tasket <notifications@tasket.io.vn>` cho môi trường production.
Tôi thêm Better Auth server foundation, compatibility routes, Google entrypoint, cookie session bootstrap và fallback JWT để user cũ không bị gãy phiên.
Tôi xử lý lỗi Google OAuth 404 ở production và lazy initialize Better Auth để backend không crash khi dependency/env chưa đủ.
Tôi nâng voice-to-task thành pipeline có STT route, intent extraction, chrono/date parsing, JSON repair, schema validation, Retry-After và test cho voice route.
Tôi dùng Ably cho realtime collaboration thay vì Socket.IO: project events, invite/share link, comment model, TaskCommentsModal và UI project members được đồng bộ cho nhóm nhỏ.
Tôi chuyển backend sang MVVM với Task/Auth/Profile/Admin ViewModel, route layer mỏng, error class riêng và response format nhất quán.
Tôi xây Resend email service, NotificationLog TTL 90 ngày, cron 15 phút, digest hourly, retry 30 phút, dedup 24h và unsubscribe bằng HMAC token.
Tôi thêm admin dashboard, analytics, user management, audit logs, VisitLog, admin API/service và chỉnh Settings để quản trị dự án rõ hơn.
Tasket không chỉ chạy local: ứng dụng đang live tại tasket.io.vn, có hướng dẫn production, Render custom domain, Cloudflare DNS và SSL checklist.
Email nhắc hạn dùng domain notifications@tasket.io.vn, có DKIM/SPF/MX/DMARC và checklist Resend Logs để kiểm tra Sent/Delivered.
Commit history ghi rõ các mốc lớn: Cloudflare + Domain + OAuth (#24), upload profile + Gmail overdue (#22), collaboration (#23), voice agent (#28), admin page (#27), MVVM refactor (#1).
Các lỗi thật đã được xử lý gồm Google OAuth 404, Better Auth startup crash, Zod v4 conflict, OpenAI v6 upgrade, deploy health path và notification collaborator bug.
Project chứng minh tôi làm được UI phức tạp, backend domain logic, auth/session, realtime collaboration, file upload, email job, DNS/deploy và admin ops.
Có nhiều chủ đề kỹ thuật để đào sâu: MVVM vs MVC, Better Auth migration, cookie session, Ably realtime, cron idempotency, DNS/SSL, Resend deliverability và AI output recovery.
Source có 2 package frontend/backend, hơn 10 dependency vận hành chính, nhiều docs feature, test config Vitest/Playwright/Jest/Supertest và nhiều workflow production.
Render free tier có cold start; Resend free plan giới hạn email/ngày; AI/STT phụ thuộc API bên thứ ba; Ably/service realtime cần kế hoạch cost nếu user tăng.
Tasket cho thấy tôi đã tự xử lý các phần gần với sản phẩm thật: domain, DNS, email deliverability, OAuth production và bug dependency.
Tiếp theo nên bổ sung public test account, status page, uptime monitoring, e2e production smoke test, billing tier và metrics cho email/realtime/AI usage.
Tôi học được cách biến một bài môn học thành case study có product scope, architecture decision và feature documentation.
Bài học quan trọng nhất là không dùng AI để thay thế mọi rule. AI nên xử lý phần semantic, còn date parsing, priority rule, validation và concurrency phải do code kiểm soát.
Dự án giúp tôi trình bày rõ hơn quá trình làm việc: có bối cảnh học phần, vấn đề thật, hành động cụ thể và bằng chứng màn hình/docs/source.
Tasket không chỉ chạy local: ứng dụng đang live tại tasket.io.vn, có hướng dẫn production, Render custom domain, Cloudflare DNS và SSL checklist.
Email nhắc hạn dùng domain notifications@tasket.io.vn, có DKIM/SPF/MX/DMARC và checklist Resend Logs để kiểm tra Sent/Delivered.
Commit history ghi rõ các mốc lớn: Cloudflare + Domain + OAuth (#24), upload profile + Gmail overdue (#22), collaboration (#23), voice agent (#28), admin page (#27), MVVM refactor (#1).
Các lỗi thật đã được xử lý gồm Google OAuth 404, Better Auth startup crash, Zod v4 conflict, OpenAI v6 upgrade, deploy health path và notification collaborator bug.
Project chứng minh tôi làm được UI phức tạp, backend domain logic, auth/session, realtime collaboration, file upload, email job, DNS/deploy và admin ops.
Có nhiều chủ đề kỹ thuật để đào sâu: MVVM vs MVC, Better Auth migration, cookie session, Ably realtime, cron idempotency, DNS/SSL, Resend deliverability và AI output recovery.
Source có 2 package frontend/backend, hơn 10 dependency vận hành chính, nhiều docs feature, test config Vitest/Playwright/Jest/Supertest và nhiều workflow production.
Render free tier có cold start; Resend free plan giới hạn email/ngày; AI/STT phụ thuộc API bên thứ ba; Ably/service realtime cần kế hoạch cost nếu user tăng.
Tasket cho thấy tôi đã tự xử lý các phần gần với sản phẩm thật: domain, DNS, email deliverability, OAuth production và bug dependency.
Tiếp theo nên bổ sung public test account, status page, uptime monitoring, e2e production smoke test, billing tier và metrics cho email/realtime/AI usage.
Tôi học được cách biến một bài môn học thành case study có product scope, architecture decision và feature documentation.
Bài học quan trọng nhất là không dùng AI để thay thế mọi rule. AI nên xử lý phần semantic, còn date parsing, priority rule, validation và concurrency phải do code kiểm soát.
Dự án giúp tôi trình bày rõ hơn quá trình làm việc: có bối cảnh học phần, vấn đề thật, hành động cụ thể và bằng chứng màn hình/docs/source.
Mỗi màn hình đi kèm phần mô tả chi tiết để làm rõ luồng hoạt động và trải nghiệm người dùng thực tế.

trang chủ mobile viewport
Ảnh này dùng làm bằng chứng cho flow Tasket. Màn hình "trang chủ mobile viewport" giúp giải thích rõ trạng thái UI, dữ liệu hiển thị và thao tác người dùng ở bước đó.

giao diện các project
Ảnh này dùng làm bằng chứng cho flow Tasket. Màn hình "giao diện các project" giúp giải thích rõ trạng thái UI, dữ liệu hiển thị và thao tác người dùng ở bước đó.

màn hình chi tiết dự án
Ảnh này dùng làm bằng chứng cho flow Tasket. Màn hình "màn hình chi tiết dự án" giúp giải thích rõ trạng thái UI, dữ liệu hiển thị và thao tác người dùng ở bước đó.

kéo thả dự án
Ảnh này dùng làm bằng chứng cho flow Tasket. Màn hình "kéo thả dự án" giúp giải thích rõ trạng thái UI, dữ liệu hiển thị và thao tác người dùng ở bước đó.

thêm công việc desktop view port
Ảnh này dùng làm bằng chứng cho flow Tasket. Màn hình "thêm công việc desktop view port" giúp giải thích rõ trạng thái UI, dữ liệu hiển thị và thao tác người dùng ở bước đó.

thêm công việc bằng giọng nói
Ảnh này dùng làm bằng chứng cho flow Tasket. Màn hình "thêm công việc bằng giọng nói" giúp giải thích rõ trạng thái UI, dữ liệu hiển thị và thao tác người dùng ở bước đó.

processing
Ảnh này dùng làm bằng chứng cho flow Tasket. Màn hình "processing" giúp giải thích rõ trạng thái UI, dữ liệu hiển thị và thao tác người dùng ở bước đó.

output nhập liệu bằng giọng nói
Ảnh này dùng làm bằng chứng cho flow Tasket. Màn hình "output nhập liệu bằng giọng nói" giúp giải thích rõ trạng thái UI, dữ liệu hiển thị và thao tác người dùng ở bước đó.

chia sẻ nhiệm vụ
Ảnh này dùng làm bằng chứng cho flow Tasket. Màn hình "chia sẻ nhiệm vụ" giúp giải thích rõ trạng thái UI, dữ liệu hiển thị và thao tác người dùng ở bước đó.

share project cho thành viên khác
Ảnh này dùng làm bằng chứng cho flow Tasket. Màn hình "share project cho thành viên khác" giúp giải thích rõ trạng thái UI, dữ liệu hiển thị và thao tác người dùng ở bước đó.

chỉnh sửa quyền trên nhiệm vụ
Ảnh này dùng làm bằng chứng cho flow Tasket. Màn hình "chỉnh sửa quyền trên nhiệm vụ" giúp giải thích rõ trạng thái UI, dữ liệu hiển thị và thao tác người dùng ở bước đó.

nhiệm vụ được chia sẻ ở chế độ chỉ xem
Ảnh này dùng làm bằng chứng cho flow Tasket. Màn hình "nhiệm vụ được chia sẻ ở chế độ chỉ xem" giúp giải thích rõ trạng thái UI, dữ liệu hiển thị và thao tác người dùng ở bước đó.

co work comment trên task
Ảnh này dùng làm bằng chứng cho flow Tasket. Màn hình "co work comment trên task" giúp giải thích rõ trạng thái UI, dữ liệu hiển thị và thao tác người dùng ở bước đó.

công việc sắp hết hạn
Ảnh này dùng làm bằng chứng cho flow Tasket. Màn hình "công việc sắp hết hạn" giúp giải thích rõ trạng thái UI, dữ liệu hiển thị và thao tác người dùng ở bước đó.

gmail gửi nhắc công việc hết hạn
Ảnh này dùng làm bằng chứng cho flow Tasket. Màn hình "gmail gửi nhắc công việc hết hạn" giúp giải thích rõ trạng thái UI, dữ liệu hiển thị và thao tác người dùng ở bước đó.

trang nhật kí hoạt động
Ảnh này dùng làm bằng chứng cho flow Tasket. Màn hình "trang nhật kí hoạt động" giúp giải thích rõ trạng thái UI, dữ liệu hiển thị và thao tác người dùng ở bước đó.

trang cài đặt
Ảnh này dùng làm bằng chứng cho flow Tasket. Màn hình "trang cài đặt" giúp giải thích rõ trạng thái UI, dữ liệu hiển thị và thao tác người dùng ở bước đó.
Xem toàn bộ mã nguồn trên GitHub hoặc mở bản demo hoạt động thực tế.
Tôi đang tìm kiếm những thử thách mới và cơ hội hợp tác. Nếu bạn có câu hỏi hoặc chỉ muốn chào hỏi, tôi sẽ phản hồi sớm nhất có thể.