~/work/iwefarm

iWeFarm

A marketplace for Ngoc Linh ginseng. Users buy plants, follow their garden’s care, and trade consignment holdings on an in-app trading floor, on web and mobile.

Role
Full Stack Engineer · Freelance
Scope
Backend · Web · Mobile
Platforms
Web · iOS · Android
Live
iwefarm.com.vn
Web · iwefarm.com.vn
Web · iwefarm.com.vn
App · explore
App · explore
App · plants by age
App · plants by age
App · store
App · store

The problem

Ginseng is a slow-growing, high-value crop, and buyers rarely see their plants. The client needed a platform where people could own, follow and resell plants remotely, which meant wallets, payments and a trading floor that users could trust.

What I built

  1. 01
    REST API · ~220 routesUsers, products, orders, wallets, trading, commissions, campaigns and identity documents.
  2. 02
    Trading floorBuy and sell orders with trade execution for consignment plant holdings.
  3. 03
    Wallets & paymentsBalances, top-up and transfers behind PIN verification, with SePay QR bank-transfer payments.
  4. 04
    Real-timeChat and online status over Socket.IO, and Firebase push notifications.
  5. 05
    Web, app & adminA React web app with Vietnamese and English, a Flutter mobile app, and an admin dashboard.

Architecture

Clients
WebReact · Vite · React Query
MobileFlutter · Provider
API
Express serverNode.js · Sequelize
Socket.IOchat · presence
Data & services
MySQL · Redisdata · OTP · cache
SePay · Cloudinary · Firebasepay · media · push

Hard parts

Money in motion

Wallet transfers, commissions and a master wallet all move real value. Each sensitive action requires a PIN, and a cron job cancels stale orders.

Account isolation

Users can switch between saved accounts, so every query cache key is scoped to the user. That stops one account’s data from appearing in another.

Stack

Node.jsExpressSequelizeMySQLRedisSocket.IOReact 18ViteReact Queryshadcn/uiTailwindi18nextFlutterFirebaseSePayCloudinary