Skip to content
PersonalFrontend + backend web · 15 scheduled current-date slots · singleton KST · fixed DTO projection

Daesin Logistics Dispatch Operations Ledger

Sole owner of planning, frontend, backend, deployment, and operations

2026-01-01 — present

A current-day dispatch ledger for route, vehicle, and statistics views, with singleton collection ownership and a fixed browser data boundary

Verified outcomes

Current-day collection

Current date · Mon–Sat 06:00–20:00 · 15 scheduled slots

Morning and later updates rechecked

Before: Previous day before 14:00

Replica duplication

15 singleton slots

Singleton restored

Before: 15 slots per replica

Browser data boundary

Vehicle details public · internal IDs and credential URL excluded

Fixed public route DTO

Before: Source and internal fields not separated

← Scroll horizontally to view the scenario →

Three-step user journey for dispatch overview, route search, and route detail rendered with synthetic data
This user scenario reproduces the actual React UI structure with a deterministic synthetic fixture and is not presented as evidence of live data.

Problem Solving

1

Why — current-day source data was already available in the morning, but a pre-14:00 previous-day rule skipped it

Solution Process

How — fixed the default collection date to the current date and made the singleton KST scheduler recheck it in 15 scheduled hourly slots from Mon–Sat 06:00–20:00

Result

Result — subsequent runs can capture morning data and later source changes without maintaining static date or row-count claims

← Scroll horizontally to view the scenario →

Current-date recheck prevents morning gaps
Current-date recheck prevents morning gaps.Removes the pre-14:00 previous-day rule and independently rechecks the current date in 15 scheduled hourly slots from Mon–Sat 06:00–20:00. Failures are logged; the next scheduled run checks again without immediate retry or backoff.
2

Why — each web replica started a scheduler, duplicating the same collection job

Solution Process

How — moved collection responsibility out of web processes into one singleton KST scheduler

Result

Result — reduced per-replica 15-slot schedules to one singleton's 15 slots, excluding the one startup sync

← Scroll horizontally to view the scenario →

Move per-replica collection into one singleton owner
Move per-replica collection into one singleton owner.Moves 15 scheduled slots registered by every web replica into one separate singleton KST scheduler.
3

Why — source fields needed by the operational UI had to remain useful while internal and credential-bearing fields stayed blocked

Solution Process

How — used a method/path allowlist, required-field validation, a fixed output projection, and source-URL contracts to pass only operational UI fields while excluding internal IDs, unknown fields, and the credential-bearing tracking URL

Result

Result — verified the fixed output projection and source-URL allowlist together with redirect, payload, and deployment regression boundaries

← Scroll horizontally to view the scenario →

Separate public route responses from authenticated routes
Separate public route responses from authenticated routes.Applies allowlist projection only to public route responses, not the whole Next.js proxy. It enforces exact method and path, schema, payload limits, and redirect rejection while forwarding only allowlisted methods and paths for authenticated routes.

System architecture and operating boundary

Collection independently rechecks the current date on each scheduled run and sends it through the crawler into SQLite. Queries project public fields in the public route DTO branch inside the Next.js proxy before passing through Traefik and the active Express slot. Authenticated routes pass separately, and the inactive slot must pass health checks before switching.

← Scroll horizontally to view the collection, query, and deployment flows →

Current-date independent recheck flow, public route DTO branch inside the Next.js proxy, and the health-gated slot switch with manual rollback

Operating limits

Collection failures are logged and checked again on the next scheduled run; there is no immediate retry or backoff.
SQLite fits the current read-heavy operation but has a ceiling on horizontal write scaling.
The inactive slot must pass health checks before switching; an operator restores the previous slot on failure.

Claim → public evidence

Each claim links directly to public code, tests, or CI rather than only to a repository home page.

BE clean CI run

Did the backend repository pass a clean CI run?

Tech Stack

TypeScriptExpressNext.jsReactPrismaSQLiteCheerioTSyringeTanStack QueryDockerTraefikTailwind CSSVitest