4 dự án

Dự án

Công việc trên một nền tảng logistics chạy production, cùng các dự án cá nhân tôi làm để học và tự dùng.

Logistics SaaS Platform

Nền tảng logistics nhiều dịch vụ với định danh tập trung, phân quyền theo vai trò và đồng bộ dữ liệu thời gian thực, phục vụ khoảng 1.000 người dùng mỗi ngày.

Phần chi tiết dưới đây viết bằng tiếng Anh.

Problem

A logistics company needed one platform for sales, operations and accounting teams. Each team used separate tools, with separate logins, separate permissions and data that drifted out of sync.

What I built

I work on the core of this platform as a developer and team lead. My scope covers:

  • Identity and RBAC. Single sign-on through Keycloak, with a role-based permission model shared by every module.
  • Microservices. Backend capabilities split into independently deployable services.
  • Change data capture. Debezium streams database changes into Kafka, so other services react to data changes without tight coupling.
  • Micro-frontend. The UI is composed of separately built apps loaded through Webpack Module Federation, so teams can ship their modules on their own schedule.

Stack and architecture

Java and Spring Boot services behind Keycloak, with Kafka and Debezium as the event backbone. React micro-frontends sit in a host shell and load modules at runtime. Services run on Kubernetes.

Outcome

The platform serves roughly 1,000 daily users. The main lessons: keep identity and permissions in one place from the start, and treat CDC events as a public contract between services, because changing them breaks consumers just as an API change would.

Company details are omitted on purpose; this is a private commercial product.

ai-ocr

API HTTP bóc tách chứng từ tiếng Việt (hoá đơn VAT, biên lai, tờ khai hải quan, lệnh giao hàng, CV, bảng tính) thành JSON có cấu trúc, phần OCR/LLM nặng chạy trên GPU Modal.

Phần chi tiết dưới đây viết bằng tiếng Anh.

Problem

Vietnamese paperwork arrives as a mix of digital PDFs, scans, phone photos and spreadsheets, and the PDF font layer is often broken, so plain text extraction returns garbage. Teams re-type the same fields by hand. I wanted one API that accepts any of these files and returns validated fields.

What I built

A service that detects the real file format and the document type, reads the text, extracts fields and returns one JSON envelope with per-field confidence and review flags. Supported types: VAT invoices, payment receipts, customs declarations, electronic delivery orders, commercial invoices with packing lists, CVs, invoice-summary spreadsheets, and any xlsx/xls turned into a table. A React demo page lets you upload a file and inspect the result next to the source.

Architecture

  • Pipeline: ten modules in a fixed order (intake, format, content, classify, preprocess, read, layout, extract, validate, output). Each answers one question and records a trace. Golden files guard every document type while it moves onto the staged pipeline.
  • Reading: pdfplumber for the text layer; Tesseract, VietOCR or a vision-language model for scans, photos and garbled fonts. A layout model orders regions and columns for CVs.
  • Validation: email, phone, date, tax-code checksum and totals.
  • Compute: the OCR core and vLLM servers run on Modal GPUs behind a bearer-token gateway; prompts are never logged.
  • Hosting: a thin nginx proxy in Docker Compose on a small VM, with TLS and basic auth in front. No database, queue or object storage.

Outcome

A single deployable service covering eight document families, with unit tests per module, golden-file regression tests and field-accuracy baselines. Demo access on request.

vn-trading-agents

Công cụ đa agent LLM phân tích cổ phiếu Việt Nam, từ báo cáo phân tích tới tranh luận mua/bán và quyết định đã qua kiểm soát rủi ro.

Phần chi tiết dưới đây viết bằng tiếng Anh.

Problem

Global multi-agent trading frameworks assume US markets. Vietnamese stocks (HOSE, HNX, UPCOM) have their own rules: daily price limits, T+2 settlement, 100-share lots, and specific fees and taxes. Generic tools ignore them and produce orders that cannot be placed.

What I built

I adapted the analyst, debate, trader and risk architecture of the open-source TradingAgents idea to the Vietnamese market:

  • Technical, fundamental and sentiment analysts feed a bull/bear debate.
  • A trader agent and a risk check turn that debate into a decision.
  • Market rules are encoded in code: price limits, T+2, lot size, fees and tax.
  • A backtester applies the same costs, and a screener ranks a whole basket such as VN30.
  • A monthly planner uses an investor profile to suggest where new money should go.
  • A small local HTTP API exposes the current figures.

Stack and architecture

Python on top of vnstock for market data, with Claude for reasoning. Every agent has a rule-based fallback, so the tool runs without an API key. Pytest covers the debate, order and scorecard modules.

What I learned

Putting hard market constraints in plain code and letting the LLM argue only within them keeps output realistic. A rule-based fallback also made the agents far easier to test.

anki-maker

Web app chỉ có frontend để tạo thẻ Anki bằng tay hoặc từ prompt GPT rồi đẩy thẳng vào Anki qua AnkiConnect.

Phần chi tiết dưới đây viết bằng tiếng Anh.

Problem

Making good flashcards in Anki desktop is slow: many fields, formatting by hand, media pasted one piece at a time. I wanted to turn a short prompt into a card and send it to Anki in a few clicks.

What I built

A single-screen web app with two modes. In manual mode you type each field. In AI mode you write a prompt and GPT drafts the card. Either way, one button sends the card to the chosen deck in Anki desktop through AnkiConnect.

  • Basic, reversed and Cloze note types.
  • Images and video pasted or dragged into a field.
  • YouTube and TikTok links turned into responsive embeds.
  • GPT output requested as structured JSON, so card parsing does not depend on free text.
  • A URL parameter to prefill the prompt.

Stack and architecture

React 18, TypeScript, Vite and MUI, with TanStack Query for data fetching. There is no backend: the browser calls OpenAI and AnkiConnect directly, and the API key stays in local storage. Tests use Vitest and MSW. It is deployed on Cloudflare Pages.

What I learned

Asking the model for JSON instead of prose removed most parsing bugs. Skipping the backend kept hosting free and the app simple, at the cost of requiring the user’s own API key.

Bạn đang tuyển vị trí backend hoặc platform?

Gửi tôi JD, tên công ty và khoảng lương. Nếu phù hợp, tôi phản hồi trong vài ngày.