Back to projects
lumir-sar-platform
Stage 3+4 integrated (3-layer full-stack)

Lumir SAR Data Platform

Unified search, storage, analysis, and request for Sentinel + LumirX — an internal satellite-data full-stack service (3 layers)

Integrated layers
3 (storage · analysis · frontend)
PSI detections
5,143,119
Verified subsidence
-17.30 mm/yr (GNSS-verified)
AI-written code
100% (AI native)
Unified architecture
Unified architecture
Forward flowResponse / returnExternal system

A user's location request flows down the frontend → storage → analysis spine and returns as a result. The center axis (amber) is the forward request, the right side is response / write-back, the left side is the external data feeds. One person owns all three layers full-stack.

Screens · artifacts
SAR search UI (frontend layer)
Frontend layer — map-based SAR search + AOI + catalog
InSAR time series (analysis layer)
Analysis layer — control-point time series (65 epochs / 2.30-yr stack)
Problem

There was no integrated service to take Sentinel and LumirX data from search through storage, analysis, and request in one cycle. Storage (NAS + CDSE), InSAR analysis (SNAP · ISCE2 · MintPy), and the user-facing frontend were all separate — making it hard for a user to get from 'I want this location' to a finished result.

System

I'm solo-designing and building the 3-layer integrated service. **Storage layer** (sar-data-retrieval, NestJS monorepo + CDSE + NAS PoC + DDD 5-layer) + **Analysis layer** (lumir-linux-snap, 5-tool stack + multi-agent worktrees) + **Frontend layer** (sar-search-and-analyzer, Next.js + map + AOI + analysis-request UI). All three are 100% AI-native, and I'm back-transferring the 4-layer + CQRS + Korean-method-name pattern validated in him into the company backend design.

Impact

With ISCE2 in place, the analysis layer is fast enough that *weather- and season-independent surface-displacement data as a service* is now feasible. The key point: a user picking a location on the map gets either the stored result instantly, or a freshly-processed one — and the whole pipeline is full-stack-owned by a single person.

My contribution

All three layers, solo (sar-data-retrieval's 5 areas in full · lumir-linux-snap tool selection & operation · sar-search-and-analyzer apps/web in full + the backend design doc). The integrated vision is also mine.

Honesty note (for interviews)

Some patterns in each layer came from elsewhere — the Plan/Current environment split (from the team lead) and parts of the SAR domain knowledge (AI as a thinking partner). The sar-search-and-analyzer backend (apps/api · worker · crawler) is still at the CLAUDE.md design-document stage; actual implementation belongs to the next phase.

Interview Q&A prep

Q.How do the three layers come together as one service?+
A.When a user picks a location on sar-search-and-analyzer's map, sar-data-retrieval either returns existing analysis data, or asks lumir-linux-snap for a fresh analysis. New results are written back into sar-data-retrieval so the next identical request is served instantly.
Q.How is one person able to run all three layers at once?+
A.100% AI-native — AI writes the code; I plan the UI, review the code, and keep the integration interfaces consistent. The 4-layer + CQRS + Korean-method-name pattern validated in him is back-transferred into the company backend so the patterns stay consistent across layers.
Q.What's your contribution vs. inherited scope in each layer?+
A.Storage (sar-data-retrieval): all 5 areas mine. Analysis (lumir-linux-snap): SAR domain knowledge was undergraduate-level, so heavy reliance on AI as a thinking partner. Frontend (sar-search-and-analyzer): apps/web all mine; the Plan/Current pattern came from the team lead.
Q.Is any of this exposed externally?+
A.Currently internal-only. The program reports v1–v4 and policy-briefing PDFs may later be used with external program owners.
Keywords
3-layer full-stackSentinel-1 + LumirXNestJS + Next.jsSpeed via ISCE2Multi-agent worktreesMap + AOI100% AI nativeBack-transfer from the him pattern
📊 Quantitative metrics pending (not yet measured)
  • ·End-to-end completion date (analysis → storage → frontend)
  • ·Internal user count
  • ·Number of satellites supported (currently Sentinel-1 + LumirX planned)
Layer-by-layer depth

Each of the 3 layers in detail

Each layer of the integrated box, expanded. These are the deep-link landing points for external search and sharing.

🗄
Storage layer
Stage 3+4 (+5) blend/ sar-data-retrieval

Sentinel SAR search & analysis backend

NestJS monorepo + CDSE + NAS PoC + DDD 5-layer + snap integration (AI native)

DDD layers
5-layer
External systems integrated
CDSE + NAS
Problem

We needed a previously-nonexistent platform for weather- and season-independent surface displacement data, plus a unified backend for Sentinel SAR search, download, and metadata. A service layer that exposes snap-processed results in location-searchable form was also missing.

System

Built a NestJS monorepo (sentinel-retrieval + ai-processing) on top of the CDSE API, ran a NAS PoC (SMB2 vs direct FS), modeled the SLC domain, applied DDD 5-layer, and added an integration layer for the snap sister repo. Done AI-native; the domain structure was only tweaked at the points where predictable boilerplate emerged.

Impact

This is the storage layer of the 3-layer integrated service — the foundation that lets a user's location query be answered with already-analyzed data instantly, or with newly-processed data on the fly.

Analysis layer
Stage 3 → 4 + stage-5 signal/ lumir-linux-snap

Sentinel-1 InSAR processing pipeline

5-tool stack + an InSAR-results API delivered to an external platform · joint-gov surface-displacement monitoring

PSI persistent scatterers
5,143,119
Sirubong subsidence (GNSS-verified)
-17.30 mm/yr
Tool stack
5 tools, blended
Payload optimization
81MB → 1.1MB (0.56s)
Problem

On the joint-gov surface-displacement monitoring program, a SNAP-only pipeline couldn't keep up with real-time service demands. The LOS 1-D limit of ASC-only SBAS, and the minimum 2-year stack required to identify per-building hotspots, also had to be addressed.

System

Ran a 5-tool stack (SNAP 12 + SNAPHU 2.0.3 + MintPy 1.6.2 + StaMPS PSI + ISCE2 2.6.3). Anti-over-engineering as the working principle, tool selection done with AI as a thinking partner, and multi-Claude-Code agent worktrees (agents 1–4 in parallel + a gpt_isolated wrapper + handoff system). On top of that I designed the FastAPI operational layer that delivers results to an external 3D platform (`/xyz/*` time series · `/aoi/assess` · `/baseline/perp`), plus preflight endpoints that diagnose suitability in seconds before any heavy run, and owned the ops hardening — auto-start on reboot (Docker) and automatic disk-full eviction to NAS (systemd timer).

Impact

Introducing ISCE2 unlocked the processing speed needed to make the analysis layer of the 3-layer service viable. Outputs: Mt. Sirubong −17.30 mm/yr subsidence (GNSS-verified), 5,143,119 PSI persistent scatterers, 5 m DEM TC, and program reports v1–v4 — all AI-native, with near-zero writing time. I also delivered the external platform's required 'XYZ coordinate time series': re-architecting the full-series bulk response (81 MB · 13 s) into a per-epoch snapshot binary + point-click split brought it to 1.1 MB · 0.56 s — done by first measuring that the DB query was only 73 ms, so the bottleneck was serialization and transfer, then changing the payload structure.

Control-point time series (65 epochs / 2.30-yr stack)
Control-point time series — 65 epochs / 2.30-yr stack
5 m DEM hillshade
5 m DEM hillshade — NGII DEM with terrain correction applied
DEM comparison — unwrap result
DEM comparison — phase-unwrap result
Honesty note

SAR is outside my primary role (web development). I'd consider entering it impossible without AI as a thinking partner — a textbook example of stage-3 role expansion.

🖥
Frontend layer
Stage 4 in progress (in-role · UI planning + backend concurrent)/ sar-search-and-analyzer

Sentinel SAR search & request frontend (full-stack-ready)

Map-driven SAR data search · download · InSAR analysis requests

Current stage
UI planning & build
Team
Solo
AI-written
AI native
Problem

We needed an internal frontend that lets users search satellite data on a map and request InSAR analysis in one place — the entry point that ties the storage and analysis layers together.

System

Next.js (App Router) + a Plan/Current environment-split pattern + a (sar) domain with user and admin pages + a Next.js Route-Handler BFF. Currently apps/web only; the monorepo (pnpm + libs/*) is pre-staged for future backend additions (apps/api · worker · crawler). I wrote the CLAUDE.md backend design (4-layer Clean Architecture + CQRS + Korean method names) myself, importing the patterns validated in him.

Impact

Map-based AOI polygons + catalog search + InSAR analysis requests — the user UI is being planned and built right now. With backend dev and planning happening in parallel, the interface design that keeps both sides aligned is the core work.

Recorded with Playwright e2e (Plan mock mode, no backend dependency) — auto-tour through five screens: user search → AOI manager → InSAR request → downloads → admin dashboard.GIF
SAR data search UI — map + AOI + catalog
Search screen — Korea map + AOI polygon + payload/satellite filters + catalog (Hwaseong · Pohang · Ulsan · Seoul)
AOI selection UI
AOI setup — two overlapping polygons + the AOI configuration panel
Honesty note

Right now there's only apps/web; apps/api · worker · crawler aren't implemented yet. The monorepo is pre-staged for future backend work, and the 4-layer backend is still at the CLAUDE.md design stage. With UI planning and backend design running in parallel, keeping the interface consistent is the priority of this moment.