Layered REST API
The API is split by domain modules instead of putting business logic inside route handlers. Requests go through middleware, Zod validation, controller mapping, service rules and repository access through Prisma/MySQL.
Full-stack project built with a backend-first mindset: clean REST API, JWT + refresh token rotation, Redis/BullMQ background jobs, realtime notifications, AI-assisted moderation, Cloudflare R2 media, Docker deployment and cost-aware infrastructure decisions.
These are the four links I would send to a recruiter first. Start with the frontend demo to see the product, then open the backend docs to understand the API and system design. The two repo links are there for source review.
Live product demo from the user side: feed, posts, profiles, follow/friend flows, notifications and the main social interactions. This is the quickest way to understand what the backend is supporting.
Backend docs covering routes, modules, API groups and feature flows. They show how a request moves through middleware, validation, controllers, services, repositories, Prisma, Redis and workers.
Frontend source for reviewing screen structure, components, routing, authentication state and API integration. This gives context for how the client works with the backend.
Main backend repository: Express, TypeScript, Prisma schema, domain modules, Redis/BullMQ workers, Docker, CI/CD and deployment config. This is the best place to review my backend work.
These are the backend parts I want reviewers to notice: a layered API, background workers for heavy work, separate boundaries for realtime/AI/media, and infrastructure choices that keep costs low without making the project unrealistic.
The API is split by domain modules instead of putting business logic inside route handlers. Requests go through middleware, Zod validation, controller mapping, service rules and repository access through Prisma/MySQL.
Work that does not need to block the request is moved to Redis/BullMQ: email, Bloom filter updates, like sync, grouped notifications, AI evaluation, vector indexing and media jobs.
I chose cheaper infrastructure where it made sense: Cloudflare R2 for object storage, self-hosted FFmpeg/HLS instead of a paid encoding service, MySQL full-text/NGram instead of Elasticsearch for social search, and Soketi as a Pusher-compatible realtime option.
Một màn hình để reviewer nắm nhanh scope kỹ thuật trước khi đi vào route hoặc source.
This is the current shared-infra setup. The idea is simple: keep the reverse proxy, the app, and the data services separate, so Nginx, Redis and MySQL can be reused without putting every container into one large compose file. I will add the newer infrastructure details later.
infa/ contains shared services such as Redis and MySQL. They are kept outside the app
folder so the app can be redeployed without touching database/cache state. proxy/ contains
Nginx, domain routing and the public entrypoint. threads/ contains the Threads app itself:
API container, workers, realtime service and app-specific compose/env files.
proxy-app lets Nginx in proxy/ reach the app in threads/ and forward
traffic to the API/realtime service. app-net connects the app to Redis and MySQL in
infa/; it is marked external: true because multiple compose projects attach
to the same pre-created network. Containers that are only used inside Threads stay on
threads-network.
Note: this repo still has older compose files such as docker-compose.yml and
docker-compose.provider.yaml. This section describes the shared-infra layout I want to show
in the portfolio: shared infra in infa/, proxy in proxy/, and the app in
threads/. The newer infra section can later add domain routing, SSL, backup, monitoring
and rollout details.
Các link này vẫn hữu ích khi reviewer muốn đào sâu, nhưng không đặt trước 4 card tuyển dụng.
Bản đồ toàn hệ thống, route groups, queue coverage và known gaps.
Checklist/tài liệu tổng hợp để đọc hoặc kiểm thử theo nhóm chức năng.
PR write-up, annotated findings, risk register và score improvement plan.
Danh mục route hiện tại để reviewer đối chiếu nhanh với Swagger/source.
Ý tưởng mở rộng sản phẩm, không phải toàn bộ đã production.
Proposal chi tiết cho vòng đời stake/circle và thay đổi backend dự kiến.
Thiết kế feature cảm xúc, realtime fan-out và AI collaboration.
Mẫu bổ sung tài liệu cho route, module và side effect mới.