TRI.DEV · SECTION A–A
ENVI
CV ↓
Section A–A. Eight products, 2018 to 2026. Every one starts at the interface; the most recent reaches the server it runs on.

A-000 · Section A–A · Rev 2026.10

Trần Mạnh Trí

Full-stack Engineer · Senior Frontend

Section A–A, rotated: eight products from 2018 to 2026, each as deep as the stack it reached.

I design frontend architecture for multi-portal products — and build the APIs, data and infrastructure behind them.

  • 7+ years building enterprise web apps
  • 8 shipped products
  • 3 developers led and mentored
  • Ho Chi Minh City, Vietnam

Open to Senior Frontend and Full-stack roles

Section A–A. Eight products, 2018 to 2026. Every one starts at the interface; the most recent reaches the server it runs on.

Explore the section ↓

Projects

A-101 · Section 01

Banh Mi Daily

Ordering & store-operations platform — trilingual Nuxt SSG site, self-service kiosk, tablet POS and admin dashboard, built as a pnpm/Turborepo monorepo.

Cut · 6 levels
  1. L1INTERFACE
    • Website
    • Self-service kiosk
    • Tablet POS
    • Admin dashboard
  2. L2FE ARCH.
    • Monorepo packages
  3. L3CLIENT DATA
    • API clientD6
  4. L4API
    • NestJS APID1D2D3D5D7Try
    • MollieD4
  5. L5DATA
    • PostgreSQL
    • Cloudflare R2
  6. L6INFRA.
    • VPS
    • Cloudflare Pages
    • GitHub Actions
Role
Full-Stack — end-to-end FE, BE, DB & self-managed deployment
Surfaces
Website · Self-service kiosk · Tablet POS · Admin dashboard
Period
06/2026 — Present
Stack
Nuxt 4 · Vue 3 · TypeScript · Feature-Sliced Design · TanStack Query · Zod · Ant Design Vue · PWA · Turborepo · NestJS · Prisma · PostgreSQL · JWT · RBAC · Mollie · Webhooks · Docker · Nginx · Cloudflare Pages/R2 · GitHub Actions

Problem

A store needed online ordering and in-store operations on one platform — a website, a self-service kiosk, a tablet POS and an admin dashboard — designed, built and run by a single developer.

Constraints

  • Sole developer across frontend, backend, database and deployment
  • Concurrent checkout without race conditions
  • Real payments with iDEAL and cards
  • Trilingual customer-facing website
  • Receipt printing on ESC/POS hardware from the browser

Decisions

  1. D1

    Dual-axis order state machine

    Order state is modelled as an explicit state machine and enforced by the API.

  2. D2

    Idempotency keys + advisory locks

    Eliminate race conditions when checkouts arrive concurrently.

    Try it — send the same order twice →
  3. D3

    Server-authoritative pricing & VAT

    Totals and VAT are computed by the API, never trusted from a client surface.

  4. D4

    Verified, idempotent payment webhooks

    Signature-verified Mollie webhooks drive payment-status reconciliation and order confirmation.

  5. D5

    JWT refresh-token rotation + RBAC

    Sessions rotate refresh tokens; access is role-based.

  6. D6

    Validated API boundary

    TanStack Query paired with Zod validation where data enters the frontend.

  7. D7

    Image pipeline

    Uploads are processed with Sharp and stored on Cloudflare R2.

Delivery

  • GitHub Actions CI runs lint, typecheck, tests and PostgreSQL E2E
  • API runs in Docker behind Nginx on a VPS
  • Site and images served from Cloudflare Pages and R2
View case study →

A-102 · Section 02

EngiHire (Engilink)

3-party recruitment platform for the Japanese market — connecting agencies, companies and candidates through dedicated portals per role (agency, manager, visitor).

Cut · 5 levels
  1. L1INTERFACE
    • Agency portalD1
    • Manager portal
    • Visitor portal
  2. L2FE ARCH.
    • Shared packagesD2
  3. L3CLIENT DATA
    • State & data
  4. L4API
    • NestJS REST APID3D4
  5. L5DATA
    • MongoDB

Deeper levels: not in this role

Role
Fullstack — monorepo FE architecture + REST API endpoints & JWT auth on BE
Surfaces
Agency portal · Manager portal · Visitor portal
Period
≈ 2025–2026 · about 1 year
Stack
Vue 3 · TypeScript · Feature-Sliced Design · Pinia · TanStack Query · Turborepo · pnpm workspaces · Element Plus · Vite · NestJS · MongoDB · JWT · REST API

Problem

A three-party recruitment platform for the Japanese market: agencies, companies and candidates each need a dedicated portal on the same product.

Constraints

  • Three role-specific portals — agency, manager and visitor
  • Frontend architecture and backend endpoints owned in one role
  • Token-based authentication with access and refresh tokens

Decisions

  1. D1

    One monorepo for three portals

    Portals and shared packages live in a single Turborepo + pnpm workspace.

  2. D2

    Feature-Sliced Design

    One layering convention for every portal's codebase.

  3. D3

    REST endpoints in NestJS

    Built and maintained API endpoints with NestJS and MongoDB.

  4. D4

    Access / refresh token auth

    JWT authentication flows implemented on the backend.

View case study →

A-103…108 · Earlier sections

Earlier work

Frontend and frontend-architecture roles across six platforms.

  1. A-108AconceptL1 INTERFACEMangoAds · 09/2018 — 11/2018
  2. A-107LearningiftL2 FE ARCH.Groot Co., Ltd · ≈ 2020
  3. A-106RecteleworkL2 FE ARCH.Groot Co., Ltd · ≈ 2020–2021 · 9 months
  4. A-104LearningpocketL1 INTERFACEGroot Co., Ltd · ≈ 2021–2022 · about 1 year
  5. A-105JSICL1 INTERFACEGroot Co., Ltd · ≈ 2022–2023 · 10 months
  6. A-103Engibase SuiteL2 FE ARCH.Groot Co., Ltd · ≈ 2023–2025 · about 2 years

A-108 · Section 08

Aconcept

Commercial website for a Vietnamese interior design brand — built as part of the MangoAds frontend team.

Cut · 1 level
  1. L1INTERFACE
    • Website

Deeper levels: not in this role

Role
Frontend — UI implementation & responsive layout
Surfaces
Website
Period
09/2018 — 11/2018
Stack
JavaScript · jQuery · Bootstrap · Laravel

A-107 · Section 07

Learningift

Corporate website introducing the company.

Cut · 2 levels
  1. L1INTERFACE
    • Website
  2. L2FE ARCH.
    • Frontend structure · component system

Deeper levels: not in this role

Role
Frontend Architect — scalable frontend structure & component system
Surfaces
Website
Period
≈ 2020
Stack
HTML5 · CSS3 · JavaScript ES6 · jQuery · Bootstrap 4 · Laminas MVC · SSR

A-106 · Section 06

Rectelework

Remote recruitment and telework management platform for distributed teams.

Cut · 2 levels
  1. L1INTERFACE
    • Surfaces not stated
  2. L2FE ARCH.
    • UI system design & implementation

Deeper levels: not in this role

Role
Frontend Architect — UI system design & implementation
Surfaces
Not stated in the summary
Period
≈ 2020–2021 · 9 months
Stack
HTML5 · CSS3 · JavaScript ES6 · jQuery · Bootstrap 4 · Laminas MVC · SSR

A-104 · Section 04

Learningpocket

Multi-site e-learning platform with mobile WebView integration — admin, teacher, student and staff portals.

Cut · 1 level
  1. L1INTERFACE
    • Admin
    • Teacher
    • Vue.js WebView features for the mobile app
    • Student
    • Staff

Deeper levels: not in this role

Role
Frontend — manager-site UI & Vue.js WebView features for mobile app
Surfaces
Admin · Teacher · Student · Staff
Period
≈ 2021–2022 · about 1 year
Stack
Vue.js · WebView · Laminas MVC · SSR

A-105 · Section 05

JSIC

Japanese enterprise portal — dual-site system (admin + customer-facing).

Cut · 1 level
  1. L1INTERFACE
    • Admin site
    • User site

Deeper levels: not in this role

Role
Frontend — full UI implementation for both admin & user sites
Surfaces
Admin site · User site
Period
≈ 2022–2023 · 10 months
Stack
jQuery · JavaScript · Bootstrap · Laminas MVC · SSR

A-103 · Section 03

Engibase Suite

Multi-role EdTech enterprise platform — frontend architecture across backend, customer, teacher and visitor portals.

Cut · 2 levels
  1. L1INTERFACE
    • Backend
    • Customer
    • Teacher
    • Visitor
  2. L2FE ARCH.
    • UI architecture · component standardization

Deeper levels: not in this role

Role
Frontend Architect — UI architecture, component standardization, multi-portal DX
Surfaces
Backend · Customer · Teacher · Visitor
Period
≈ 2023–2025 · about 2 years
Stack
HTML5 · CSS3 · JavaScript ES6 · jQuery · Bootstrap 4 · Chart.js · ECharts · Laminas MVC · SSR

Stack, from the interface to the server it runs on.

L1 ▽ ±0.00 · A-201

Interface

Multi-portal web apps, a trilingual SSG site, kiosk and POS surfaces.

L1 over time: 8 projects pass through it.

Core

  • Vue 3 · Banh Mi Daily, EngiHire (Engilink)
  • Nuxt 4 · Banh Mi Daily
  • TypeScript · Banh Mi Daily, EngiHire (Engilink)

Working

  • TailwindCSS
  • Element Plus · EngiHire (Engilink)
  • Ant Design Vue · Banh Mi Daily
  • PWA · Banh Mi Daily
  • Web Bluetooth · Banh Mi Daily

8 projects pass through this level: Aconcept, Learningift, Rectelework, Learningpocket, JSIC, Engibase Suite, EngiHire (Engilink), Banh Mi Daily.

L2 ▽ −2.20 · A-202

Frontend architecture

Several portals in one codebase with clear module boundaries and shared UI.

L2 over time: 5 projects pass through it.

Core

  • Feature-Sliced Design · Banh Mi Daily, EngiHire (Engilink)
  • Monorepo (pnpm + Turborepo) · Banh Mi Daily, EngiHire (Engilink)

Working

  • Design Systems
  • Vite · EngiHire (Engilink)

5 projects pass through this level: Learningift, Rectelework, Engibase Suite, EngiHire (Engilink), Banh Mi Daily.

A-301 · Detail 01 · Scale 1:5

Share the right boundaries

Which responsibilities can change independently?

Three portals build from the same packages/ workspace. A change in packages/ reaches all three; a change inside one portal’s feature slice stays in that portal.

Three EngiHire portals share packages in one workspace, with clear frontend and API responsibilities.

Evidence

※ Simplified illustration of a documented decision.

L3 ▽ −4.40 · A-203

Client state & data

Server state, caching and validated data at the API boundary.

L3 over time: 2 projects pass through it.

Core

  • TanStack Query · Banh Mi Daily, EngiHire (Engilink)
  • Pinia · EngiHire (Engilink)

Working

  • Zod · Banh Mi Daily

2 projects pass through this level: EngiHire (Engilink), Banh Mi Daily.

A-302 · Detail 02 · Scale 1:5

Validate at the boundary

Which change should stay local?

Data from the API is parsed with a Zod schema where it enters the frontend. Invalid data stops at the boundary, before it reaches the interface.

Validate data where it crosses a boundary: TanStack Query paired with Zod where API data enters the frontend.

Evidence

※ Simplified illustration of a documented decision.

L4 ▽ −6.60 · A-204

API & backend

REST endpoints, authentication, role-based access and payment integrations.

L4 over time: 2 projects pass through it.

Core

  • NestJS · Banh Mi Daily, EngiHire (Engilink)
  • REST API design · EngiHire (Engilink)
  • JWT refresh-token rotation · Banh Mi Daily, EngiHire (Engilink)

Working

  • RBAC · Banh Mi Daily
  • Payments & webhooks (Mollie) · Banh Mi Daily
  • ExpressJS

2 projects pass through this level: EngiHire (Engilink), Banh Mi Daily.

A-304 · Detail 04 · Scale 1:5

Design for retries

What happens when the same request arrives twice?

The first request takes the lock for its key. The same request sent again finds the lock held and is rejected as a duplicate. One order is created.

Concurrent requests need a deliberate boundary. Idempotency keys and advisory locks protect checkout.

REQUESTS 0 · ORDERS 0

Send the order, then send the same request again while the first one holds the lock.

Evidence

※ Simplified illustration of a documented decision.

L5 ▽ −8.80 · A-205

Data & consistency

Orders that stay correct when checkouts arrive at the same time.

L5 over time: 2 projects pass through it.

Core

  • PostgreSQL · Banh Mi Daily
  • Prisma · Banh Mi Daily
  • MongoDB · EngiHire (Engilink)

Working

  • Mongoose
  • Order state machine · Banh Mi Daily
  • Idempotency keys · Banh Mi Daily
  • Advisory locks · Banh Mi Daily

2 projects pass through this level: EngiHire (Engilink), Banh Mi Daily.

A-305 · Detail 05 · Scale 1:5

Make state explicit

Which changes is an order allowed to make?

An order carries two states, orderStatus and paymentStatus, and the API owns both. It accepts the changes the machine allows and refuses the rest, such as COMPLETED before READY.

Model domain rules where they can be enforced. In Banh Mi Daily, the API owns the order state machine.

Order · orderStatus
RECEIVED
Order recorded, not yet in the kitchen
PREPARING
The kitchen is preparing it
READY
Ready, waiting for the customer to collect it
COMPLETED
The customer has collected the order
CANCELLED
Cancelled on purpose
EXPIRED
Expired on its own when the hold time ran out
Payment · paymentStatus
UNPAID
Not paid yet
PENDING
Waiting for the payment to be confirmed (every payment passes here until it is)
PAID
Payment received
FAILED
Payment failed, was cancelled or expired; no payment attempt is active
REFUND_PENDING
Waiting for a full refund to be confirmed
REFUNDED
Fully refunded
Evidence

※ Simplified illustration of a documented decision.

L6 ▽ −11.00 · A-206

Infrastructure & delivery

Deploying and running the system myself, gated by CI.

L6 over time: 1 projects pass through it.

Core

  • Docker · Banh Mi Daily
  • Nginx · Banh Mi Daily
  • GitHub Actions CI · Banh Mi Daily

Working

  • Docker Compose
  • Hetzner VPS · Banh Mi Daily
  • Cloudflare Pages & R2 · Banh Mi Daily
  • E2E tests on PostgreSQL · Banh Mi Daily

One project passes through this level: Banh Mi Daily.

A-401 · Plan · Scale 1:50

Plan at ▽ −11.00 — Delivery

Banh Mi Daily is the only project with documented delivery.

Inside the property line · self-managed
  • Nginx — Reverse proxy on the VPS
  • NestJS API · Docker — Orders · pricing & VAT · auth
Managed services
  • Cloudflare Pages — Static site hosting
  • Cloudflare R2 — Images processed with Sharp
  • Mollie — iDEAL & cards · signed webhooks
  • GitHub Actions — lint · typecheck · test · PostgreSQL E2E
Not documented
  • PostgreSQL · Prisma — Host not documented
Delivery
  • GitHub Actions CI runs lint, typecheck, tests and PostgreSQL E2E
  • API runs in Docker behind Nginx on a VPS
  • Site and images served from Cloudflare Pages and R2

※ Schematic of documented responsibilities. Not live traffic.

A-501 · Revisions

Career — a history of building.

HTML and jQuery, Vue components on Laravel APIs, nearly six years of frontend architecture with backend work alongside, and now a platform built and run end to end.

Career from 2018 to 2026, as a dimension chain running down.
  1. REV 5 · 06/2026 — Present

    Full-Stack Developer

    Banh Mi Daily · Freelance

    • Sole developer of an ordering & store-operations platform: trilingual Nuxt SSG website, self-service kiosk, tablet POS and admin dashboard, built as a pnpm/Turborepo monorepo.
    • NestJS, Prisma and PostgreSQL — dual-axis order state machine, idempotency keys and advisory locks to eliminate race conditions under concurrent checkout, server-authoritative pricing & VAT, JWT refresh-token rotation with RBAC, Sharp → Cloudflare R2 image pipeline.
    • Mollie payments (iDEAL & cards) with signature-verified, idempotent webhooks driving payment-status reconciliation and order confirmation.
    • Vue 3 / Nuxt 4, Ant Design Vue, TanStack Query with Zod validation at the API boundary, Feature-Sliced Design, PWA, ESC/POS receipt printing over Web Bluetooth.
    • Dockerised API behind Nginx on a VPS, Cloudflare Pages/R2, GitHub Actions CI (lint, typecheck, test, PostgreSQL E2E).

    Nuxt 4 · Vue 3 · TypeScript · TanStack Query · Zod · Turborepo · PWA · NestJS · Prisma · PostgreSQL · Mollie · Webhooks · Docker · Nginx · Cloudflare R2 · GitHub Actions

    SectionsBanh Mi Daily

  2. REV 4 · 08/2020 — 06/2026

    Fullstack Developer / Frontend Architect

    Groot Co., Ltd

    • Designed and led frontend architecture using Vue 3, FSD and a Turborepo monorepo.
    • Built and maintained REST API endpoints with NestJS and MongoDB.
    • Implemented JWT authentication flows (access/refresh tokens) on the backend.
    • Led and mentored a team of 3 developers via code reviews and architectural guidance.
    • Built shared reusable UI systems improving consistency and development velocity.

    Vue 3 · TypeScript · FSD · Pinia · Vite · Turborepo · NestJS · MongoDB · JWT

    SectionsEngiHire (Engilink) · Engibase Suite · Learningpocket · JSIC · Rectelework · Learningift

  3. REV 3 · 11/2019 — 04/2020

    Frontend Developer

    Ezbook

    • Built Vue.js components integrated with Laravel backend APIs.
    • Used Element UI for building application layouts.

    Vue.js · Element UI · Laravel · Bitbucket

  4. REV 2 · 09/2018 — 11/2018

    Frontend Developer

    MangoAds

    • Collaborated in a frontend team building UI layouts for Laravel-based websites.
    • Delivered production UI for Aconcept (aconcept.vn) — JS, jQuery & Bootstrap.

    HTML/CSS · SCSS · JavaScript · jQuery · Bootstrap · Laravel

    SectionsAconcept

  5. REV 1 · 05/2018 — 09/2018

    Frontend Developer

    Freelancer

    • Web application projects for clients in the US and UK.
    • Responsible for HTML/CSS structure as the foundation for team development.

    HTML/CSS · WordPress

A-601 · Title block

Hiring for Vue, Nuxt or full-stack TypeScript work?

Open to Senior Frontend and Full-stack roles. Email is the fastest way to reach me; the CV has the full history.

Download CV ↓

Based in Ho Chi Minh City, Vietnam

General notes

  1. Frontend architecture

    Feature-Sliced Design, pnpm/Turborepo monorepos and shared UI systems for products with several portals.

  2. Correctness on the backend

    State machines, idempotency keys, advisory locks and server-authoritative pricing where money and orders are involved.

  3. End-to-end ownership

    From the Vue interface to the NestJS API, PostgreSQL, Docker/Nginx deployment and CI.

  4. Leading a team

    Mentored three developers through code reviews and architectural guidance.

  5. AI-assisted workflow

    Claude Code, OpenAI Codex, GitHub Copilot and Cursor are part of daily engineering.

Education

Tay Nguyen University · Bachelor's Degree in IT · 2014 – 2018

Issued for construction · Rev 2026.10

Let's build what's next.