Báo cáo project

Tasket.

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.

1 thành viên (Cá nhân)React 19ViteNode.jsExpressMongoDBAblyBetter AuthResendCloudflare
Cuộn xuống để khám phá

Chức năng chính

Thiết kế comic-like với viền đậm, shadow lệch và màu tương phản.

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.

Đa ngôn ngữ

Hỗ trợ tiếng Việt và tiếng Anh, đồng bộ theo lựa chọn người dùng.

Workspace cộng tác

Chia sẻ project qua invite/share link, phân quyền thành viên, comment và đồng bộ realtime bằng Ably.

Task Voice Agent

Tạo task từ giọng nói, có STT resilience, NLP date parsing, JSON repair và validate schema.

Nhắc hạn qua email

Resend gửi email overdue/digest qua notifications@tasket.io.vn, có dedup, retry và unsubscribe token.

Better Auth migration

Google OAuth production, session cookie, lazy migration user cũ và fallback JWT compatibility.

Soft-delete 7 ngày

Task/project đã xóa có thể khôi phục trong 7 ngày trước khi bị dọn dẹp.

Admin moderation

Admin dashboard có analytics, user management, audit logs và visit tracking.

Production domain

Ứ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.

DNS/Email hardening

Cấu hình A/CNAME, DKIM, SPF, MX, DMARC và xử lý lỗi SSL handshake/proxy Cloudflare.

MVVM backend

Refactor từ MVC sang MVVM với ViewModel, error class riêng và route layer mỏng.

Situation - Bối cảnh

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.

Người dùng mục tiêu

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.

Production domain thật

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.

Email có thương hiệu

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.

Stack đã trưởng thành

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.

Scope vượt todo app

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.

Docs như sản phẩm thật

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.

Vai trò cá nhâ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.

Task - Nhiệm vụ

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.

DNS/SSL production không đơn giản

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.

Email dễ fail production

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.

Google OAuth từng lỗi production

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.

Dependency conflict thật

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 task khó vì AI/STT

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.

Collaboration cần realtime ổn

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.

Controller bắt đầu phình

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.

Notification không được spam

Email overdue cần dedup 24h, batch delay theo rate limit Resend, retry có backoff, digest theo timezone và unsubscribe token an toàn.

Data deletion cần 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.

Action - Quyết định & Thực thi

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.

Cấu hình Cloudflare/DNS

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.

Hardening email domain

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.

Migration Better Auth

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.

Fix OAuth production

Tôi xử lý lỗi Google OAuth 404 ở production và lazy initialize Better Auth để backend không crash khi dependency/env chưa đủ.

Xây Task Voice Agent

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.

Realtime hoàn toàn bằng Ably

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ỏ.

Refactor MVC sang MVVM

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.

Thiết kế email reminder có kiểm soát

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ạo admin operations

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.

Result - Kết quả đạt được

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 production đáng tin hơn

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 evidence mạnh

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ó bug production đã xử lý

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.

Tín hiệu fullstack rất rõ

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.

Chiều sâu kỹ thuật

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.

Số liệu phạm vi

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.

Limitation thật

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.

Điểm mạnh của Tasket

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.

Hướng phát triển

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

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.

Định Vị Đúng Vai Trò Của AI

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

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.

Preview & Trải nghiệm thực tế

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
Xem toàn màn hình
01

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
Xem toàn màn hình
02

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
Xem toàn màn hình
03

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
Xem toàn màn hình
04

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
Xem toàn màn hình
05

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
Xem toàn màn hình
06

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
Xem toàn màn hình
07

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
Xem toàn màn hình
08

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ụ
Xem toàn màn hình
09

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
Xem toàn màn hình
10

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ụ
Xem toàn màn hình
11

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
Xem toàn màn hình
12

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
Xem toàn màn hình
13

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
Xem toàn màn hình
14

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
Xem toàn màn hình
15

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
Xem toàn màn hình
16

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
Xem toàn màn hình
17

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 đó.

Mã nguồn & Demo

Trải nghiệm dự án
Source Code & Demo

Xem toàn bộ mã nguồn trên GitHub hoặc mở bản demo hoạt động thực tế.

DỰ ÁN TIẾP THEO
Sẵn sàng cho cơ hội mới

Cùng hợp tác nhé.

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ể.