SAVE FILE — PORTFOLIO.DAT STATUS: AVAILABLE
CHUL CHIVORN
★ WEB DEVELOPER CLASS

QUEST BRIEFING — learning full-stack development by building real systems, not tutorials.

This page is a save file, not a brochure — what I've built, what's integrated, and what broke along the way.

FILE 01

player profile // about

CHARACTER BIO

Started with "how hard can it be" and ended up with a growing list of things I only understood after they broke. Web developer, currently building real systems — payments, auth, the parts tutorials skip.

education
Setec Institute — MIS (Management Information System), graduated
languages
Khmer, English
INVENTORY — SKILLS
Communication Problem-solving Adaptability Flexibility Teamwork Meeting deadlines
FILE 02

side quest // experience

IT Staff — Setec Institute JUN 2022 — PRESENT
  • Provide technical support to lecturers and students, resolving software and hardware issues on a daily basis.
  • Set up and maintained network cabling to support classroom and lab connectivity.
  • Performed routine maintenance on school computers to keep systems reliable for teaching and coursework.
FILE 03

gear & equipment // stack

frontend
ReactVite — routing & client state
backend
Node.jsExpress (ESM) — MongoDBMongoose
admin tooling
TypeScriptReactTailwind — separate dashboard app
auth
Firebase Admin SDK — server-side token verification
storage
Cloudflare R2 — S3-compatible object storage
deploy
AWS — HTTPS, public domain
FILE 04

quest log // projects shipped

FILE 05

boss battles // payment integrations, chiron's

defeated
Gateway #1 — signed/hashed request building, popup redirect handling, transaction status polling, idempotent fulfillment on the backend.
in battle
Gateway #2 — PaymentIntent + Elements-style flow, wiring into the existing order pipeline.
wounded
Gateway #3 — checkout works, still needs the same server-side reliability layer as Gateway #1.
FILE 06

loading tips // lessons, the hard way

TIP 01
env vars load after you read them

Top-level process.env reads can execute before dotenv finishes loading. Fix: read env vars inside function bodies, not module scope.

TIP 02
closures go stale

useEffect captures state at creation time. A polling loop that needs live values needs useRef, not useState.

TIP 03
"success" isn't one event

A third party confirming success and my app recording it are two separate failure domains — worth tracking as its own case, not lumped in with a normal failed request.

TIP 04
order of operations matters

Multi-step mutations need validate-before-commit, with a defined rollback path if a later step fails.

TIP 05
client timeouts don't cancel anything

A slow request can still complete on the server or third-party side after the UI has stopped waiting on it.

TIP 06
sandboxes lie a little

Some real-world states — specific failure responses, edge cases — only ever show up in production. Don't assume sandbox coverage is complete.

FILE 07

playstyle // how i work

PLAYER NOTES —

I write the code myself first, then bring it back for review — not looking for solutions handed to me. I want the why before the what.

FILE 08

continue? // contact