4 projects

Projects

Work on a production logistics platform, plus side projects I build to learn and to use myself.

Logistics SaaS Platform

A multi-service logistics platform with centralized identity, role-based access and real-time data sync, serving about 1,000 daily users.

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

HTTP API that turns Vietnamese business documents (VAT invoices, receipts, customs declarations, delivery orders, CVs, spreadsheets) into structured JSON, with the heavy OCR/LLM core on Modal GPUs.

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

Multi-agent LLM tool that analyzes Vietnamese stocks, from analyst reports to a bull/bear debate and a risk-checked trade decision.

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

Frontend-only web app that makes Anki cards by hand or from a GPT prompt and pushes them into Anki through AnkiConnect.

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.

Have a backend or platform role in mind?

Send me the job description, the company and the salary range. If it fits, I will reply within a few days.