Skip to content
Role
Founder & Design Engineer
Team
1 person
Period
2026.04 – Present
Tools
Figma, Next.js, TypeScript, n8n, AI, Data

Real Estate Intelligence Platform

Reevl

Video provided by uibowl

Summary

A property-intelligence product for reading the state of Korea's apartment market. I designed, built, shipped and still operate it solo.

45,695
Apartment complexes

255 districts · output

8
Public data sources

MOLIT · K-apt · Korea Real Estate Board and others

64,817
Public pages

Standalone routes for search · output

Role – research · information architecture · design system · frontend · data · operations (solo)

Overview

Reevl is a real estate terminal for Korean apartments. It treats apartment complexes like listed stocks – each with a price chart, a change rate, and a value – so the market state is readable at a glance.

I started it in April 2026 and launched it in July 2026. Everything from design to operations is mine.

Live: reevl.co.kr

Problem

Existing services help you find a complex. Reevl lets you compare the state of the market.

Someone deciding whether to buy, sell or wait does not need the price of one complex. They need to know where that price sits in the market right now. Whether it is rising or falling, how it compares with the district next door, which way the jeonse ratio and the transaction volume are moving – a decision needs all of that read together.

The existing way ended at finding the complex. Search and filters take you to it, and out come the price and the listings. Where that number sits in the market was left for the user to work out. The index, the change rate and the regional ranking lived on other screens and in other services.

So the index, the change rate and the regional ranking come before any single price. A complex is not the destination of a search; it is one holding inside a market.

This problem statement was my assumption, not the result of user interviews. The validation came after launch: behaviour data and what users pointed out told me which assumptions held and which did not.

Key decisions

Five decisions set the product's direction: what was decided, why, and what came of it.

  1. 01Show the state of the market, not the price of a home

    Where the whole market is moving should read before any one complex's price. So the direction was a Bloomberg terminal's information density with the cleanness of Toss Securities.

    →One home screen carries the market briefing, the sales and jeonse indices, and the complex rankings. Searching for a complex comes after that.Home screen

  2. 02Judge a screen by session replays, not by review

    Twelve features shipped in one day on August 27. Each had passed review; the screen did not hold. Bounce went from 24% to 62%, time on site from 226s to 40s, and 36 rage clicks appeared – the only day in the whole observation window with any.

    →Session replays gave six causes, and all six were fixed: 0 rage clicks on August 29; by September 1, bounce was 29% and time on site 115s.Usage

  3. 03Don't show forecast prices beyond two years

    One-year outlooks ranked with an information coefficient of 0.19, positive in 93% of quarters; beyond two years it was 0.01 at the complex level. A number that can't be right isn't information.

    →Long-range forecasts show no prices – only the region level, which held up under walk-forward validation (IC 0.16).

  4. 04Rebuild Figma from the code

    So the values designers see never drift from the values users get, the Figma library was extracted back from the production tokens.

    →140 variables · 28 styles · 23 components (v1.0, 2026-09-17). Adoption is measured on every build: colour 98.5% · type 100% · z-layers 95.2% (measured by ds_scan).Design system

  5. 05Give AI the unit and meaning before the value

    With the MCP server open through seven read-only tools, a model read prices stored in units of ₩10,000 as won – a 10,000× error. A person asks when something looks off; a model makes something up.

    →A describe_fields tool now gives the model each field's unit and meaning before it reads any value.

More decisions
  • Up is red, down is blue, on every screen – it follows the convention Korean market users already read by; green never means "up". Direction colours exist only as design-system tokens (up · down).
  • One screen, three shells – the same information appears as a docked panel on desktop, a full screen on phones, and standalone pages for search. That one structure produces 64,817 public pages.
  • A missing value is "not applicable", not zero – Jeju and Ulleung have no motorways, and filling their 1,047 complexes with zero would read as poor transport. Indicators whose sign flipped when the validation window moved were dropped for the same reason. Station access is the baseline, with motorways and airports added on top.
  • Advancement rates came out of the school score – the published rates did not separate anything, and scoring them would have ranked schools. Private-academy density from NEIS took their place. Having the data was not a reason to use it.
  • Natural-language search was built without an LLM – the search bar and the AI canvas share one parser (nlsearch.ts), so "Seocho-gu, near Line 2, under ₩2 billion" becomes a screener condition directly. That avoided the cost, the latency and the uncertainty at once.

Process

Research

Reevl's research came less from interviews than from operating data and what users pointed out. After launch, the signals that arrived every day became the reasons for the next decision.

  • 366 commits started from a user's remark – 16% of all commits (output). One-line reports like "the hover effect gets cut off" (its cause changed three times) or "going back drops me on the apartment list" each became a fix.
  • Behaviour data – 89% of visits came from Naver and 79% of devices were mobile (measured in Clarity, as of 2026-09-06). Those two numbers set the priorities: mobile first, Naver search first.
  • Eight data sources – MOLIT transactions, K-apt, the Korea Real Estate Board, KOSIS, the Bank of Korea, V-World, SchoolInfo, and Cheongyak Home: 255 districts, 45,695 apartment complexes and 11 million transactions brought into one screen's language (output).

Design

Information architecture

Three layout shells carry the same screens: a docked panel on desktop, a full-screen view on phones, and standalone routes for search engines.

Design system

The Figma library was rebuilt from production code: the shipped system is the source of truth for the tokens, and how closely it is followed is measured on every build.

Build

Build log

Selected milestones out of those commits. Each one is a decision that shipped.

  1. 01

    Jul 1, 2026Foundation

    Engine and frontend in one push

    Set up the data engine and a Next.js + Tailwind frontend – the skeleton of a real estate terminal.

    commit 6e14935

  2. 02

    Jul 7, 2026Brand

    Logo and identity

    Applied the wordmark, mark, and mobile logo across header and footer.

    commit a0d3448

  3. 03

    Jul 16, 2026Design system

    Pulling UI into shared components

    Built Badge, Popover, and StatRow primitives plus spacing and state tokens, so hierarchy stopped drifting between screens.

    commit acdc364

  4. 04

    Jul 19, 2026Search

    Natural language search, redesigned

    Separated names from conditions and added a concept lexicon, so every screener filter can be set in plain words.

    commit dad8b17

  5. 05

    Jul 22, 2026Measure

    GA4 and Clarity

    The point where real usage data started coming in.

    commit 334d2b2

  6. 06

    Jul 27, 2026Operate

    Deploy verification gate

    Detects missing JS chunks after each deploy and redeploys automatically.

    commit b0a958d

  7. 07

    Aug 6, 2026AI

    Reevl AI as its own app

    Browsing and asking are different mental models, so the AI moved into its own /ai shell.

    commit 07296ee

  8. 08

    Sep 11, 2026Performance

    First screen stops waiting on 7.8 MB

    Fixed endless loading on slow phones by serving a lightweight table first.

    commit db211f3

  9. 09

    Sep 17, 2026Design system

    From code back to Figma

    Rebuilt the Figma design system from code: 140 variables and 23 components extracted from production.

    commit 9d2f5a2

Activity

exclusiveyon-a11y / reevlPrivate
main2,380 Commits

수요와 공급으로 부동산을 재정의

  • TypeScript50.4%
  • Python41.5%
  • JavaScript4.5%
  • CSS2.2%
  • Shell1.4%
AI pair programming86%

2,054 of 2,380 commits written together with Claude Code

2,380 contributions since Jul 1, 2026

JulAugSep
Mon
Wed
Fri
LessMore

Commits on Sep 17, 2026

  • docs(디자인): Figma 디자인 시스템 구축 기록 – 코드에서 추출한 140토큰·23컴포넌트

    exclusiveyon-a11y committed

    9d2f5a2
  • chore(통근): 지하철 그래프 공식 경로시간 대조 스크립트·참값 캐시(296+111쌍)

    exclusiveyon-a11y committed

    82b17e0
  • fix(통근): 신분당·수인분당·공항철도·부산·대구 등 34개 노선을 좌표 근사에서 열차 시간표 실측으로

    exclusiveyon-a11y committed

    54fab7e
  • fix(통근): 서울 버스가 대전 정류장으로 순간이동했다 – 정류장 ID가 전국 유일이 아니었다

    exclusiveyon-a11y committed

    aaf1caf

Commits on Sep 16, 2026

  • fix(통근): 강남→서면(부산) 55분 – 동명이역이 순간이동으로 이어져 있었다 · 버스+지하철 통근 신설

    exclusiveyon-a11y committed

    585953a
  • fix(도보): '역 도보 N분'이 실제보다 중위 3분 짧았다 – 보행망 실경로 + 오르막

    exclusiveyon-a11y committed

    1feb7c8
Snapshot as of 2026-09-18

Dock identity bug sweep

A dock could be opened from more than the table – also from the heatmap, comparison view, search, and deep links. The type-detection logic didn't match all of those paths, causing seven identity bugs. Sweeping for the whole class fixed all seven at once. The code comments showed the same class had already been noted twice.

Stack and implementation detail

Next.js, TypeScript, and Tailwind on the front, with TradingView Lightweight Charts for time series. Behind it, a Python data engine. Hosting runs on Cloudflare Workers with D1 and R2, migrated from Vercel on July 25. All 45,000 complex detail pages were being server-rendered on every request, so they were moved to static generation – with the way back left in place.

Accessibility work spans 35 commits: ARIA on tooltips, a focus trap for dialogs, sr-only labels, and a version picker for legal documents built on a native select to keep it accessible.

Eleven build gates run on every build, including design-system adoption (ds_scan) and a 432 KB first-screen JavaScript budget; failing one blocks the deploy. A rule is added only after an incident. Adding every theoretically bad pattern would pile up warnings, and piled-up warnings get ignored.

The same data is also exposed as a public MCP server so AI tools can query Korean apartment data directly. The MCP server was also listed on the official registry, and the same data was opened through the ChatGPT app directory and the Claude Code plugin marketplace. The channels were later consolidated back down to just the MCP server.

Results

What changed the product most was not a new feature but a release that failed. The numbers below are measured in GA4 and Microsoft Clarity.

24% → 62%
Bounce, right after twelve features shipped (measured, Aug 27)
6
Causes found in session replays (measured)
62% → 29%
Bounce, after the fixes (measured, Sep 1)
36 → 0
Rage clicks (Clarity, Aug 27 → Aug 29)
98 → 18
Dead clicks (Clarity, Aug 29)
36s → 115s
Time on site (measured, Sep 1)
Six causes behind the August 27 incident

The condition bar not attaching to the header and floating mid-page had two causes: opacity and header height. A fixed complex-name column didn't cover the full row, so the column behind it showed through. Rows left ghosting after scrolling past because a blurred child element was missing bar-blur. On narrow screens the complex name disappeared while the badge and range overlapped. A JSX comment written without braces rendered as literal text on screen. The pre-sale type table showed zero rows because of a missing status field and an upcoming-complex filter.

Scale

7,000+
Monthly active users · GA4 30-day active users · measured 2026-10-09
64,817
Public pages (output)
45,695
Apartment complexes (output)

The data covers eight public sources, 255 districts and 11 million recorded transactions (output). Reevl is featured on uibowl, a Korean UI/UX reference platform.

Traffic sources

Measured in GA4 and Clarity, as of September 6, 2026. The assumption that "Korean real estate search happens on Naver" held up in numbers.

1,122
Visits from Naver (24× Google's 46)
912
Weekly users (up from 60)
42
Visits from AI assistants (ChatGPT)
Sessions by channel, and search visibility

GA4 channels: Organic Search 1,199 · Direct 656 · Organic Social 82 · Unassigned 66 · AI Assistant 42 · Referral 16.

The sitemap lists 65,501 URLs. There was also an incident where Google's crawl dropped from 29,514 to 22 requests a day (the cause: detail pages not rendered on the server); after the fix, Google visibility is still recovering.

Search Console data showed an average ranking of 2–5, peaking at 1.2 (August 24, 3 clicks). Impressions were 66 and clicks 4 – few pages were indexed, but the ranking itself wasn't low.

Growing the sitemap from 41,600 to 65,501 URLs came with a bill: Worker CPU jumped from a usual 2–5M ms to 13.5M ms, and 831 5xx responses appeared. One SEO tool's crawler alone spent 10 million ms of CPU over 9 hours 20 minutes without contributing to any index; robots.txt and a WAF rule stopped it.

AI crawlers were slowed down, not blocked. Over 23 hours GPTBot made 34,856 requests (28%) and ClaudeBot 25,161 (21%) – far more than Googlebot's 480 – but a crawl-delay instead of a block kept the chance of being cited by AI. The 42 visits from AI assistants came from that.

Where a person steps in

The operation runs by itself; what needs judgement comes to a person.

  • By itself – transaction refreshes, publishing and error watching run as n8n workflows. Not a window to open every morning, but something that speaks up when it should.
  • By hand – data from unreliable sources is refreshed manually, and the screen carries the date it is good for. Saying when something is from beats showing it as if it were current.
  • A cap – outgoing messages are capped at 50 a day. A channel that pings 50 times a day gets muted, and a muted channel is the same as none.

Reflection

What held up

  • Extracting Figma back from the code. The values designers see never drifted from the values users get, and how well it is followed is measured on every build: colour 98.5% · type 100% · z-layers 95.2% (measured by ds_scan).
  • Mobile first, Naver first. 89% of visits came from Naver and 79% of devices were mobile (Clarity, as of September 6). The priority set before launch was the right one.
  • Deleting numbers that can't be validated. Complex-level forecast prices beyond two years are gone; what remains on screen is the region level that passed walk-forward validation. A screen that isn't wrong still beats a screen that looks precise.

What failed

  • I assumed a screen that passed review was fine. August 27 contradicted that. Each of the twelve features was right; the screen they shared was wrong.
  • I didn't doubt a good validation score first. Future information had leaked into the label calculation and doubled the IC. Fixed with FEATURE_LAG=2. Of five model upgrades measured afterwards, four were rejected.
  • I trusted the pipeline's green light. The orchestrator node failed while the workflow still finished as a success. Naver blog publishing had been stopped for six weeks, and 11,891 server errors were reported as zero. Since then what is watched is the output, not the success log, across twenty automated operational checks.
  • I didn't count the cost of more search visibility. More public pages meant crawlers, and crawlers meant an infrastructure bill. Now the first question is whether a metric actually matters to the product.

What I would test next

  • A 19.6% quick-back rate. I still don't know where those sessions break (Clarity, as of September 6).
  • Google visibility. Still recovering, even after the detail-page rendering fix.
  • Collaboration. Built alone, the product shows nothing about whether the same judgement holds in a team.

Next – ON THE WAY

Site visits start only when you arrive, yet the neighbourhoods and roads you pass on the way are already part of the area. Splitting a visit into nine steps showed that half of its 14.3 hours went to travel and sorting notes. So my graduation exhibition, "REEVL: ON THE WAY", turns the drive into exploration: Reevl's transaction and indicator data, redesigned for the car, attaches prices to the places you pass, and asking a question changes the route rather than returning an answer.

Before drawing a screen, I checked whether it could ship at all. The review of the AAOS-based Pleos Connect constraints is written up separately in Reevl: ON THE WAY.