{
  "appSlug": "hyoda",
  "name": "서효다",
  "category": "person",
  "description": "19년차 개발자. 지식이 쌓이는 바닥, 배포되는 길, AI가 붙는 자리, 발견되는 표면을 깔아드립니다. 만들어드리지는 않습니다.",
  "urls": {
    "web": "https://hyoda.kr/",
    "llmsTxt": "https://hyoda.kr/llms.txt",
    "llmsTxtEn": "https://hyoda.kr/llms-en.txt",
    "webEn": "https://hyoda.kr/en/",
    "discovery": "https://hyoda.kr/api/catalog.json",
    "graph": "https://hyoda.kr/api/graph.json",
    "proof": "https://hyoda.kr/proof/",
    "capabilities": "https://hyoda.kr/stack/"
  },
  "entity": {
    "canonicalPersonId": "https://hyoda.kr/#person",
    "operator": "서효다",
    "mission": "나는 인프라와 환경을 잡아주고, 그들은 디테일을 심는다."
  },
  "facts": [
    {
      "label": "개발 경력",
      "value": "19년 9개월",
      "method": "개발 경력 시작(2006-11 유솔비넷 개발사업부)부터 빌드 시각까지 자동 산정",
      "source": "본인 이력서(2023-09) · 위시켓 집계 교차 확인",
      "verifiedAt": "2026-08-21"
    },
    {
      "label": "위시켓 평점",
      "value": "5.00 / 5.00",
      "method": "플랫폼 인증 평점, 상위 1% 프리랜서",
      "source": "위시켓 인증",
      "verifiedAt": "2026-03"
    },
    {
      "label": "한국저작권위원회 프로그램 등록",
      "value": "C-2026-005914",
      "method": "등록번호 공개",
      "source": "AI 기반 쇼핑몰 데이터 수집 및 등록 자동화 시스템",
      "verifiedAt": "2026"
    },
    {
      "label": "PIRS — 개인정보 유출 대응 모의훈련 플랫폼 구축",
      "value": "49일 · 커밋 442 · 이슈 150/151 종료(99.3%) · 51,001 LOC",
      "method": "저장소 실측 집계. **MVP 구간(2026-01-07~02-25) 기준**이다 — 1차 문서 작성 시점의 스냅숏이라 그 뒤 쌓인 커밋은 여기 없다. `git rev-list --count HEAD --until=2026-02-25` 재측정 442(2026-08-17). 배포 v0.1.1~v0.1.281, 이슈 151 생성/150 종료, TS·TSX 260개 파일, DB 마이그레이션 46개.",
      "source": "내부 1차 문서",
      "verifiedAt": "2026-02-25"
    },
    {
      "label": "레거시 저장 프로시저 재작성",
      "value": "8만 줄 → 2만 줄",
      "method": "리팩토링 전후 라인 수",
      "source": "위시켓 이력서",
      "verifiedAt": "2020"
    },
    {
      "label": "리조트 레벨 요금 시스템 — 예약율 개선",
      "value": "30~60% → 80~95%",
      "method": "도입 전후 예약율",
      "source": "위시켓 이력서",
      "verifiedAt": "2020"
    },
    {
      "label": "한솔인티큐브 레퍼런스 체크",
      "value": "통과",
      "method": "위시켓 인증 레퍼런스",
      "source": "위시켓 레퍼런스 체크 — 한솔인티큐브",
      "verifiedAt": "2021"
    },
    {
      "label": "PIRS — MVP 요구사항 달성",
      "value": "14/14 (100%) + 추가 구현 15건",
      "method": "MVP 계획 대비 달성 현황표. 5단계 훈련 시뮬레이션·7가지 질문유형·자동채점·기업포탈·관리자콘솔 등 14개 전부 완료, 계획 외 15개 추가 구현.",
      "source": "내부 1차 문서",
      "verifiedAt": "2026-02-25"
    },
    {
      "label": "전국 매장 census 수집 가능성 실측",
      "value": "17개 시도 완주 · distinct 2,167 · 외부 오라클 대비 갭 14%(within) · 삼각측량 종합 PASS",
      "method": "삼각측량 3축 동시 판정 — A 내부일관성(무절단·무손실·소진, leaf 71개 전량 소진·캡도달 0), B 엔드포인트 수렴(union 2,167 · new_id_rate 0.0 · converged), C 외부 오라클 대조(공식 1,900 vs 관측 2,166 · 갭 +14% · 허용 15% 이내). 폴라이트 1.5 req/s · 90콜 · throttle 0건. 시도별 합 2,575와 distinct 2,167의 차이 408은 인접 시군구 경계 중복으로 id 중복제거 흡수.",
      "source": "store-collect-studio/docs/briefing/2026-06-21-전국census-실측결과.md (1차 문서)",
      "verifiedAt": "2026-06-21"
    },
    {
      "label": "비정형 → 정형 데이터 실적",
      "value": "상품 카테고리 매칭·자동등록 100만 건 · 오프라인 매장 정형화 38만 매장 · 인허가 데이터 190개 업종",
      "method": "각 프로젝트의 처리 건수 집계. 핵심 역량(비정형을 정형으로)의 규모 증거.",
      "source": "내부 1차 문서",
      "verifiedAt": "2026-06"
    },
    {
      "label": "카드혜택 API 정합성 회복",
      "value": "55.8% → 97.2%",
      "method": "운영 로그 실측 기반 회복안 적용 전후 정합성.",
      "source": "내부 1차 문서",
      "verifiedAt": "2026"
    },
    {
      "label": "CrawlCat — 이커머스 상품등록 자동화",
      "value": "326 릴리즈 · 등록시간 90%↓ · 오류 95%↓",
      "method": "릴리즈 카운트 및 도입 전후 비교.",
      "source": "내부 1차 문서",
      "verifiedAt": "2026"
    },
    {
      "label": "누적 산출",
      "value": "40+ 프로젝트 · 자사 제품 6종 · 600+ 릴리즈",
      "method": "프로젝트·제품·릴리즈 누적 집계.",
      "source": "내부 1차 문서",
      "verifiedAt": "2026"
    },
    {
      "label": "GitHub 본인 리포 — 릴리즈·태그",
      "value": "릴리즈 태그 715 · GitHub 릴리즈 280 (리포 175개)",
      "method": "`ops/count-releases.py` — GraphQL 로 본인 리포(포크 제외) 전수, `releases.totalCount` 와 `refs(refPrefix: refs/tags/).totalCount` 를 합산. **둘은 다른 것이다** — 릴리즈를 만든 리포는 5개, 태그가 있는 리포는 15개다.",
      "source": "GitHub GraphQL API — 본인 소유 리포(포크 제외) 전수",
      "verifiedAt": "2026-08-22"
    },
    {
      "label": "협업형 워케이션 실증 — 15일 합숙 협업",
      "value": "브랜드(BI) 설계를 반나절에 · 거의 무비용",
      "method": "마음 맞는 참여자들과 15일 장기 합숙하며 일하는 구조. 각자 다른 역량을 가진 소집단이 한 자리에 모이자 아침 식사 전후 짧은 시간에 브랜드 아이덴티티가 나왔다. 협업형(공유형이 아닌) 구조의 효과를 보여주는 사례.",
      "source": "내부 1차 문서",
      "verifiedAt": "2023"
    },
    {
      "label": "공공 제안 설계 — 신축 0(CAPEX 0) 원칙",
      "value": "기존 유휴 공간 재활용 · 3년 한정 위탁(BTO형) + 인수인계 내장",
      "method": "‘센터’를 건물이 아니라 운영 역량(데이터팀+SOP+멤버십 엔진)으로 정의하고, 이미 있는 유휴 그릇에 프로그램·데이터·사람을 넣는 설계. 자생력을 형용사가 아니라 연도별 보조금 의존도 하락 곡선으로 규정.",
      "source": "내부 1차 문서",
      "verifiedAt": "2026-06"
    },
    {
      "label": "공공 데이터 진단 — 지자체 관광 통계 정합성",
      "value": "두 출처 간 163만(23%) 불일치 규명 · ‘판정 기준 부재’로 재정의",
      "method": "무인계수기(물리 통과 카운트)와 통신신호 기반 추정 모델을 대조해 같은 기간 23% 격차를 확인하고, 원인을 ‘어느 쪽의 오류’가 아니라 ‘정의·관측단위 상이’로 규명. 이어 실제 인구통계 데이터가 월 300명 QR 설문(자기선택 표본)뿐임을 확인해 ‘방문객이 누구인지 판정할 기준 데이터가 없다’로 진단을 재정의.",
      "source": "내부 1차 문서",
      "verifiedAt": "2026-06"
    },
    {
      "label": "남해 워케이션 지역정보 챗봇 — 협업형 실물",
      "value": "수집 데이터 505건 (펜션 202 · 음식점 145 · 카페 112 · 서핑·액티비티 등)",
      "method": "2023년 8월 남해군 워케이션 기간에 제작. Streamlit + OpenAI 기반 RAG 챗봇으로 현지 숙박·음식·카페·액티비티 정보를 수집해 질의응답. 수집 원문에 ‘남해군 워케이션 일정 중’ 기록이 남아 제작 시기·장소가 확인된다.",
      "source": "내부 1차 문서 (data/ 505건 · README) — 저장소 비공개",
      "verifiedAt": "2023-08"
    },
    {
      "label": "미션 선언은 2025년 4월에 본인이 이미 작성했다",
      "value": "2025-04-08",
      "method": "devmine.co.kr 블로그 원문 GET, datePublished 메타 확인",
      "source": "https://devmine.co.kr/blog/tech-people",
      "verifiedAt": "2026-08-15"
    },
    {
      "label": "블로그 글",
      "value": 30,
      "method": "sitemap.xml 의 /blog/ URL 에서 tag·category 제외 후 전수 GET",
      "source": "https://devmine.co.kr/blog (sitemap 전수)",
      "verifiedAt": "2026-08-21"
    },
    {
      "label": "블로그 본문 총량",
      "value": "397,159자",
      "method": "글 30건의 <article> 텍스트를 전수 수집해 합산",
      "source": "https://devmine.co.kr/blog (본문 전수 수집)",
      "verifiedAt": "2026-08-21"
    },
    {
      "label": "8,000자 이상 전략 보고서",
      "value": "17",
      "method": "같은 수집분에서 본문 8,000자 이상을 계수",
      "source": "https://devmine.co.kr/sitemap.xml",
      "verifiedAt": "2026-08-15"
    },
    {
      "label": "남해 워케이션 중 만든 RAG 챗봇 「시다 챗」",
      "value": "2023-08 · 문서 506건",
      "method": "공개 저장소 트리 전수 조회 후 소스의 st.title 문자열과 data/ 하위 분류를 확인",
      "source": "내부 1차 문서 — 저장소 비공개 전환(2026-08-16)으로 공개 링크 없음",
      "verifiedAt": "2026-08-15"
    },
    {
      "label": "링크드그램 등재 매장",
      "value": "111곳 · 24개 시군구",
      "method": "sitemap.xml 전수 파싱 후 /stores 상세와 /stores/region 을 분리 계수",
      "source": "https://linkedgram.kr/sitemap.xml",
      "verifiedAt": "2026-08-15"
    },
    {
      "label": "미라클타임 — 멤버십 앱 누적 회원 · 앱 이벤트",
      "value": "누적 회원 754 · 30일 앱 이벤트 8,807",
      "method": "office.miracletime.kr 관리자 대시보드 실측. 가장 많이 열린 화면은 커뮤니티 피드.",
      "source": "office.miracletime.kr 대시보드 (본인이 최고 관리자로 접근 · 게재는 오너 합의)",
      "verifiedAt": "2026-08-16"
    },
    {
      "label": "PIRS — 누적 (MVP 이후 포함)",
      "value": "커밋 500 · 릴리즈 태그 296",
      "method": "서버 실물 저장소 `/home/ubuntu/pirs` 에서 전수 계측. `git rev-list --count HEAD` = 500(최초 2026-01-07 ~ 최신 2026-04-15), 모든 ref 기준 514, `git tag | wc -l` = 296.",
      "source": "PIRS 운영 서버의 git 저장소 (직접 계측)",
      "verifiedAt": "2026-08-17"
    },
    {
      "label": "대량 처리 — 배치 + 큐 기반 발송 시스템 (엔터프라이즈)",
      "value": "수만 명 개인화 발송 · 실패/재시도/지연 설계",
      "method": "NestJS 기반. MongoDB 배치 처리 + Bull Queue 로 청크 단위 조회와 큐 워커를 분리하고 실패 건만 재시도하는 구조. 삼성전자 북미법인 프로젝트의 리포트·배치 파트에서 만들었다.",
      "source": "https://devmine.co.kr/blog/bull-queue-email (본인 글, 2024-03-08 · 공개)",
      "verifiedAt": "2024-03-08"
    },
    {
      "label": "데이터 파이프라인 운영 — Airflow 배치 오케스트레이션",
      "value": "DAG 상태 10초 폴링 현황판 · enrich 3차 런 254,597 → 100,069 (61% 감소)",
      "method": "Airflow DAG 를 운영하며 사이클 로그를 관찰하고 실패 런만 재처리한다. 사무실(공인 IP)↔외부(VPN) 교차 작업을 도달성 probe 로 자동 선택하는 SSH 구성, Docker health + DAG 상태를 함께 보는 현황판(10초 폴링).",
      "source": "지휘 워크스페이스 저장소의 HANDOFF·도구 등록부 (비공개 1차 문서)",
      "verifiedAt": "2026-07-23"
    },
    {
      "label": "전국 매장 수집 — 규모와 정확도",
      "value": "중복 제거 고유 매장 332,382 · 브랜드 전수 검증 2,167(공식 대비 14% 이내)",
      "method": "수집 DB 다중 교차(naver_id dedup)로 고유 매장을 센다. 정확도는 '전국 스타벅스' 같은 전수 확인 가능한 브랜드로 대조해 검증했다.",
      "source": "store-collect-studio 실측 보고 (비공개 1차 문서, 2026-06)",
      "verifiedAt": "2026-06-23"
    },
    {
      "label": "숙박 도메인 종사 기간 (누적)",
      "value": "12년 1개월",
      "method": "`employment` 에서 `domain=hospitality` 인 재직 구간의 개월을 합산한다 (유솔비넷 · 대명위드원 · 디미디어 · 베이직나인). **구간 합이지 처음~마지막이 아니다** — 중간에 다른 도메인 일이 있었다.",
      "source": "본인 이력 — 숙박 도메인 재직 구간 4건",
      "verifiedAt": "2026-08-22"
    },
    {
      "label": "공개 저장소",
      "value": "5개 (본인 174개 중)",
      "method": "gh repo list --limit 500. 포크 제외 집계",
      "source": "ops/catalog/build.py --fetch",
      "verifiedAt": "2026-08-23"
    },
    {
      "label": "발제",
      "value": "남해군 인수위원회 포럼 제4세션 (2026)",
      "method": "공개 발표 영상·보도",
      "source": "http://www.namhae.tv/news/articleView.html?idxno=65398",
      "verifiedAt": "2026-06-24"
    }
  ],
  "sites": [
    {
      "name": "서효다",
      "url": "https://hyoda.kr/",
      "role": "hub",
      "what": "19년차 개발자. 지식이 쌓이는 바닥, 배포되는 길, AI가 붙는 자리, 발견되는 표면을 깔아드립니다. 만들어드리지는 않습니다."
    },
    {
      "name": "데브마인랩 협업형 오피스",
      "url": "https://devmine.co.kr/office/",
      "role": "satellite",
      "what": "2022년부터 소프트웨어를 만들어온 곳의 인프라를 엽니다. 인프라와 환경은 우리가 잡고, 디테일은 당신이 심습니다."
    },
    {
      "name": "링크드그램",
      "url": "https://linkedgram.kr/",
      "role": "satellite",
      "what": "우리 동네 단골 매장을 발견하는 플랫폼. 소상공인 멤버십 SaaS."
    },
    {
      "name": "데브마인랩",
      "url": "https://devmine.co.kr/",
      "role": "satellite",
      "what": "업무 자동화와 지식그래프 기반 시스템 구축. 2022년 설립."
    },
    {
      "name": "워케이션, 일탈이 아닌 설계",
      "url": "https://workation-story.netlify.app/",
      "role": "satellite",
      "what": "장소를 바꾸면 일의 구조도 바꿀 수 있지 않을까"
    }
  ],
  "products": [
    {
      "name": "링크드그램",
      "status": "운영 중",
      "url": "https://linkedgram.kr"
    },
    {
      "name": "미라클타임",
      "status": "운영 중",
      "url": "https://www.miraclekuji.com"
    },
    {
      "name": "CrawlCat",
      "status": "운영 중"
    },
    {
      "name": "PIRS",
      "status": "운영 중",
      "url": "https://pirs.hyoda.kr"
    },
    {
      "name": "Wing Studio",
      "status": "개발 중"
    },
    {
      "name": "handoff",
      "status": "오픈소스",
      "url": "https://github.com/hyoda/claude-skill-handoff"
    },
    {
      "name": "opraseno",
      "status": "운영 중",
      "url": "https://opraseno.com"
    },
    {
      "name": "마일샵 RC",
      "status": "운영 중"
    },
    {
      "name": "시다 챗",
      "status": "보관"
    },
    {
      "name": "정대표의 오토플랜",
      "status": "운영 중",
      "url": "https://autoplan.hyoda.kr/"
    },
    {
      "name": "does-it-bite",
      "status": "오픈소스",
      "url": "https://github.com/hyoda/does-it-bite"
    },
    {
      "name": "hat-agents",
      "status": "오픈소스",
      "url": "https://github.com/hyoda/claude-hat-agents"
    },
    {
      "name": "마진 계산기",
      "status": "오픈소스",
      "url": "https://hyoda.github.io/margin-calculator/"
    }
  ],
  "writings": {
    "posts": 30,
    "reports": 17,
    "chars": 397159,
    "index": "https://devmine.co.kr/blog",
    "foundational": [
      {
        "title": "나의 비전 선언문: 기술보다 사람이 먼저입니다",
        "url": "https://devmine.co.kr/blog/tech-people",
        "published": "2025-04-08"
      },
      {
        "title": "AI 시대, 나는 왜 작은 가게를 위한 시스템을 만들었나",
        "url": "https://devmine.co.kr/blog/ai-system",
        "published": "2025-04-11"
      },
      {
        "title": "정열은 시스템을 해킹하는 감각에서 온다",
        "url": "https://devmine.co.kr/blog/system",
        "published": "2025-04-11"
      },
      {
        "title": "남해 스위칭 허브: 전문성의 시스템화를 통한 지역 활성화 전략 프레임워크",
        "url": "https://devmine.co.kr/blog/namae-euwiing-eoeu-eonuneongui-systemwaeul-onghan-iyeog-waleongwa-strategy-framework",
        "published": "2025-08-09"
      },
      {
        "title": "작게, 그러나 무너지지 않게 — 협업형 오피스는 왜 존재하는가",
        "url": "https://devmine.co.kr/blog/small-but-unbreakable",
        "published": "2026-08-16"
      }
    ]
  },
  "surfaces": [
    {
      "path": "/.well-known/discovery.json",
      "type": "application/json"
    },
    {
      "path": "/api/catalog.json",
      "type": "application/json"
    },
    {
      "path": "/api/graph.json",
      "type": "application/json"
    },
    {
      "path": "/llms-en.txt",
      "type": "text/plain"
    },
    {
      "path": "/llms.txt",
      "type": "text/plain"
    },
    {
      "path": "/robots.txt",
      "type": "text/plain"
    },
    {
      "path": "/sitemap.xml",
      "type": "application/xml"
    }
  ],
  "blockers": [
    {
      "slug": "knowledge",
      "symptom": "했던 걸 또 하고 있습니다",
      "limit": "지식의 영속성 실패 — 쌓이지 않고 흩어짐",
      "url": "https://hyoda.kr/lp/knowledge/",
      "reading": [
        "https://hyoda.kr/keep/",
        "https://devmine.co.kr/blog/namae-euwiing-eoeu-eonuneongui-systemwaeul-onghan-iyeog-waleongwa-strategy-framework",
        "https://devmine.co.kr/blog/iyeog-sangaengyeong-euwii-eoeu",
        "https://devmine.co.kr/blog/25-dev"
      ]
    },
    {
      "slug": "handover",
      "symptom": "제가 없으면 안 돌아갑니다",
      "limit": "지식의 확장 실패 — 한 사람 머리에서 멈춤",
      "url": "https://hyoda.kr/lp/handover/",
      "reading": [
        "https://hyoda.kr/hand/",
        "https://devmine.co.kr/blog/small-but-unbreakable",
        "https://devmine.co.kr/blog/namae-euwiing-eoeu-eonuneongui-systemwaeul-onghan-iyeog-waleongwa-strategy-framework",
        "https://devmine.co.kr/blog/tech-people"
      ]
    },
    {
      "slug": "deploy",
      "symptom": "다 만들었는데 띄우지를 못합니다",
      "limit": "배포하지 못함 — 만들어도 세상에 못 냄",
      "url": "https://hyoda.kr/lp/deploy/",
      "reading": [
        "https://hyoda.kr/ship/",
        "https://hyoda.kr/gone/",
        "https://devmine.co.kr/blog/bull-queue-email",
        "https://devmine.co.kr/blog/wsl2-network-vethernet-interface-172181761",
        "https://devmine.co.kr/blog/themesmith-gpt-eomoeoneueoeueu-ema-emeulis-ejag-eieoneu-eueg"
      ]
    },
    {
      "slug": "discovery",
      "symptom": "잘 만들었는데 아무도 모릅니다",
      "limit": "발견되지 못함",
      "url": "https://hyoda.kr/lp/discovery/",
      "reading": [
        "https://hyoda.kr/found/",
        "https://devmine.co.kr/blog/blog-seo-strategy",
        "https://devmine.co.kr/blog/euouol-aeeoling-aeoun-maeing-strategy",
        "https://devmine.co.kr/blog/0weon-maeing-ileon-guide-onyeongae-aeyoui-eieo-euleieu-ongyageobwa-ai-iae-aengon-strategy",
        "https://devmine.co.kr/blog/seo-local-naver-strategy",
        "https://devmine.co.kr/blog/euol-euaeneu-eungi-strategy-analysis"
      ]
    },
    {
      "slug": "ai",
      "symptom": "AI를 배웠는데 정작 일에는 안 씁니다",
      "limit": "AI를 제대로 못 씀 — 도구는 있는데 안 붙음",
      "url": "https://hyoda.kr/lp/ai/",
      "reading": [
        "https://hyoda.kr/agent/",
        "https://devmine.co.kr/blog/ai-iban-companyga-aeoun-gai-changul-iaeeul-wihan-strategyeog-euleiug",
        "https://devmine.co.kr/blog/with-ai",
        "https://devmine.co.kr/blog/ai-system",
        "https://devmine.co.kr/blog/automation"
      ]
    }
  ],
  "methodology": {
    "canon": 15,
    "public": [
      "https://devmine.co.kr/blog/namae-euwiing-eoeu-eonuneongui-systemwaeul-onghan-iyeog-waleongwa-strategy-framework"
    ]
  },
  "sameAs": [
    "https://devmine.co.kr/",
    "https://devmine.co.kr/office/",
    "https://github.com/hyoda",
    "https://linkedgram.kr/",
    "https://workation-story.netlify.app/"
  ],
  "generatedAt": "2026-08-23T05:34:26Z"
}