1. 개발 배경과 동기
시작: "100분 토론방"에서 태어난 프로젝트
2026년 3월 18일 오후 5시 19분(KST). /Documents/Conversation 폴더에서 열린 "100분 토론방" 세션. 가벼운 토론을 위한 공간이었지만, 이날의 대화는 8시간짜리 마라톤이 됐다.
"zig로 swc 같은걸 만들면 어떤 이득이 있을까요?" — 최초의 질문 (08:24 UTC)
"그냥 새로 만들어보고 싶어서 공부용이긴 하지만 그래도 프로덕션 레벨을 고민하면서" — 동기 설명 (08:25 UTC)
이 두 마디에 프로젝트의 본질이 담겨 있다. 공부용이지만 프로덕션 레벨. 이 모순적인 목표가 ZTS의 정체성이 됐다.
질문은 빠르게 구체화됐다:
"Bun의 JS파서는 공개야?" "그리고 그렇게 했을때 속도는 얼마나, 안정성은 얼마나 장단점을 가질 수 있을까?" "설계를 어떻게 해야 oxc보다 앞설 수 있죠? 번은 앞서나요?" — (08:30 UTC) 성능 목표 설정
그리고 Test262를 처음 알게 됐다:
"그리고 TEST262가 뭐야?" — (08:42 UTC)
이 세션에서 나온 핵심 결정들:
- Zig 언어 선택
- TS 5.8까지 전체 지원, 타입 체크는 안 함
- Test262로 파서 정합성 검증
- React Native 번들러로의 확장 목표: "React Native도 목표라 Flow 지원 하고 싶어" (10:12 UTC)
- 번들러 비전: "추후 번들러까지 확장할 생각이긴 한데" (09:49 UTC)
레퍼런스 프로젝트 클론도 이 세션에서 시작됐다:
"esbuild도 클론 해주세요" — oxc, Bun, SWC, esbuild, Hermes, Metro를 한꺼번에 클론
워크플로우 확립도 이 세션:
"순차적으로 각각 최대한 나눠서 서브에이전트로 진행해서 PR 올리고 /simplify 진행해서 리뷰하고 코드 품질 점검하고 이거 룰에 적어주세요" — (10:46 UTC)
"그리고 진행하다 의사결정이 필요하면 반드시 물어본다를 메모리에 넣어줄 수 있나요?" — (09:42 UTC)
그리고 이 세션 안에서 프로젝트 생성 + Phase 1 렉서 완성 + Phase 2 파서 대부분 완성까지 진행됐다.
세션의 마지막 메시지:
"메모리가 지금 어디에 저장되어있는거야? 지금 내가 컨버스테이션 폴더에서 실행해서.. zts로 가도 이어지는거?" — (16:13 UTC)
이때 /Documents/workspace/zts로 이동하면서 다음 세션이 시작됐다.
학습 프로젝트이자 실용 프로젝트
ZTS(Zig TypeScript Transpiler)는 처음부터 학습과 실용 두 가지 목표를 동시에 추구했다:
- Zig 언어 학습 — 실제 프로덕션 급 프로젝트를 만들면서 언어를 익히기
- 트랜스파일러/번들러의 내부 구조 이해 — esbuild, oxc, SWC가 어떻게 동작하는지 직접 구현하면서 파악
- React Native 번들러 가능성 — 궁극적으로 Metro를 대체할 수 있는 고성능 번들러로 발전
이후 세션에서도 이 방향성은 반복 확인됐다:
"나중에 react-native도 지원 계획이라, strictExecutionOrder를 제공하려면 고민해야할 부분이 뭘까요" — 3/21 세션 "근데 메트로는 CJS 순서 보장 중요한데 ESM에서 그걸 가능하게 하는 옵션이 있었던거 같은데" — 3/21 세션
"빠른 완성"보다 "올바른 구조"를 선택했다:
"간단한 해결책보다 구조적으로 안정된 방법을 선호" — 메모리 시스템 기록
"C로 가자 이런건 좀 크더라도 유지보수나 안정성을 생각해야해" — 3/19 RegExp 설계 결정 시
성능에 대한 집착
학습 프로젝트이지만 성능에 대한 욕심도 분명했다. 3월 18일 첫 세션에서부터:
"난 OXC보다 빨랐으면 좋겠는데 너무 양보하면 안되는데" — Phase 3 트랜스포머 전략 결정 시
"근데 bun에는 지나?" — 24바이트 AST 노드 결정 시
이 두 가지 상반된 목표 — 안정성/유지보수성 우선 vs oxc/Bun 수준의 성능 — 는 프로젝트 전체를 관통하는 긴장이었다. 매 의사결정마다 이 두 축 사이에서 균형을 찾아야 했다.
레퍼런스 프로젝트들
처음부터 혼자 설계한 것은 아니다. 12개의 레퍼런스 프로젝트를 로컬에 클론해두고, 구현 방향이 갈릴 때마다 참조했다:
핵심 원칙은 3/19 세션에서 확립됐다:
"그리고 구현 방법이 여러가지라면 왠만하면 oxc 따라줘" — 3/19, 이후 프로젝트 전체 원칙으로 자리잡음
매번 구현 방향이 갈릴 때마다 "oxc는 어떻게 하는데?", "esbuild는?", "rolldown은?" 하고 물어보는 패턴이 반복됐다. 이것은 단순한 참조가 아니라, 각 프로젝트가 왜 그런 선택을 했는지까지 이해하려는 시도였다.
Claude Code와의 협업 — 프로젝트의 핵심 특성
ZTS 개발의 가장 독특한 점은 Claude Code(AI 어시스턴트)와 전 과정을 함께 진행했다는 것이다. 단순히 코드를 생성하는 수준이 아니라, 아키텍처 설계부터 의사결정, 코드 리뷰, 버그 추적까지 전 과정이 대화를 통해 이루어졌다.
실제 대화 패턴을 보면:
의사결정 시 — 항상 선택지를 먼저 요구
"트랜스포머 전략은 어느게 낫다고 생각해? 각 장단점 설명해줘" — 3/18 "51. B / 52. B / 53. 은 추천대로 / 54. A / 55. A 로 갈건데 나머지 옵션이나 이런것도 일단 진행전에 다 장단점 좀 더 자세히 설명해줘" — 3/19 semantic analysis 설계
구현 중 — /simplify 리뷰를 절대 빠뜨리지 않음
"아니 멈추고 PR 올리고 /simplify 진행하고 계속 이어서 가시죠" — 3/19 "/simplify 한거야?" — 여러 세션에서 반복적으로 확인
방향이 흐려질 때 — 다른 프로젝트 비교 요청
"oxc나 swc, esbuild, babel 등은 어떻게 하는지?" — 3/20 "rolldown은? rspack은?" — 3/23
메모리 시스템을 통한 연속성
38개 세션에 걸쳐 작업하면서, 이전 세션의 맥락을 유지하는 것이 핵심이었다. 세션이 끝날 때마다:
"메모리에 저장했어? 새로운 세션에서 진행하게" — 3/19 "다음에 뭐라고 말하면 되지?" — 3/19
이런 패턴으로 프로젝트 상태, 다음 작업 우선순위, 미결정 사항을 메모리에 기록하고, 다음 세션에서 이어갔다.
프로젝트 타임라인 한눈에 보기
git log 기준 누적 — 4/7까지 ~1,440개, 4/23까지 2,330개, 그리고 4/245/12의 19일 동안 ~1,340개가 더해져 5/12 시점 누적 약 3,670개 커밋(5/9 하루 161개 — 단일 날짜 최다). 그리고 여전히 진행 중이다 — 5/12 시점은 zntc 0.1.0 배포 직전(실제 npm publish는 아직). 자세한 흐름은 3-11. Metro 동등성 — RN HMR 재설계 → 3-14. RFC 시리즈 → 3-15. "프로덕션이라는 말" → 3-16. binding-lite·패키지 분리·이름 변경 → 3-17. 0.1.0을 향해 편에서 다룬다.
이름이 바뀌었다: 2026-05-07 15:40 KST, 배포를 준비하다 npm org
@zts가 이미 선점돼 있다는 걸 발견하고 프로젝트 이름을zts에서zntc("Zig Native Transpiler Compiler")로 변경했다(687 파일 한 커밋). 이 문서들은 초기 명칭 "ZTS"를 그대로 두지만, 5/7 이후의 저장소·패키지·문서 사이트는 모두zntc다.OpenAI Codex 병행: 4/26부터 Claude Code(
zts/zntc폴더)와 OpenAI Codex CLI(zts-codex별도 클론, 같은 origin remote)를 병행했다. 두 AI가 같은 GitHub 이슈/PR 풀을 공유하며 갈라져 작업하는 구도. 회고는 3-17 끝에 둔다.
작업 강도 — 거의 24시간 쉬지 않고
커밋 시간대를 분석하면, 하루 중 모든 시간에 커밋이 존재한다. 가장 적은 시간대(새벽 5시)에도 6개의 커밋이 있다.
일별 작업 시간:
3/18~4/7 구간: 가장 긴 수면 시간은 8시간(3/22 02:3810:41). 평균 수면은 약 46시간.
4/8~4/23 구간: 평균 세션 공백은 약 1.6시간 — 자정 경계를 넘겨 계속 이어진 날이 16일 중 11일이다. 가장 긴 공백은 4/11 23:49 → 4/12 15:02의 15.2시간이었지만, 이것도 수면이라기보다 "하루 쉬었다 돌아온" 구간에 가깝다. 그 외 14일의 경계 공백이 모두 4시간 미만이었다. 전반기(3/184/7)에 46시간씩 자던 리듬은 후반기 16일 동안 거의 사라졌고, 일이 끝난 뒤 곧바로 다음 날 작업으로 이어지는 패턴이 굳어졌다.
4/24~5/12 구간: 자정 경계를 넘겨 이어진 날이 19일 중 15일. "00:xx~23:xx"는 대부분 잠깐 끊겼다 이어진 spillover지 24시간 연속 작업은 아니다 — 그래도 명백한 휴식일(거의 손 안 댄 날)은 0일이다. 이 구간에서 OpenAI Codex CLI를 별도 워크스페이스(zts-codex)로 병행하기 시작하면서 처리량이 한 단계 올라갔다 — 5/9 하루 161 커밋은 전 기간 단일 날짜 최다이며, 종전 최다 3/19(138)을 넘긴다.
3/18 첫날은 5.4시간 만에 48커밋(시간당 9.0커밋)으로 가장 빠른 속도를 기록했다 — Phase 1~2를 한 번에 쏟아낸 결과다. 단일 날짜 최다 커밋은 5/9의 161개(publish-readiness + TS Project References + 코어 파일 분리 리팩터 100개가 겹친 날)로, 종전 최다였던 3/19(138)을 넘겼다. 후반기(4/245/12)만 보면 4/25(102)·4/30(93)·4/28(91)·4/29(90) 순으로 컸다.
여전히 진행 중
이 "개발 배경" 편은 4/7까지의 기준선을 다루지만, 4/8 이후에도 작업은 이어지고 있다. 3-11~3-14 편이 4/84/23의 16일을, 3-15~3-17 편이 4/245/12의 19일을 담았다. 그동안 4/23 시점의 진행 중 에픽(RFC #1672 oxc 스타일 AST, 트리쉐이킹 개선, HMR #1727, require.context, 에러 UX miette급, ESTree 어댑터, CSS 번들링 등)은 대부분 머지됐고, 그 위에 새로운 것들이 쌓였다:
@zntc/*모노레포 분리 — core / web / server(private) / react-native / vite-plugin / wasm / rspack-loader / init / shared + 9 platform 서브패키지- 번개(bungae) 흡수 — RN 번들러 래퍼를
@zntc/react-native로 통합, 번개 자체는 폐기 - 이름 변경 —
zts→zntc(5/7, npm org@zts선점 때문) - 0.1.0 publish prep — changesets·OIDC publish·9-platform prebuilt·문서 사이트 340+ 페이지. 단, 실제
npm publish는 아직 안 함 - Codex 병행 — 같은 저장소·이슈/PR 풀을 Claude/Codex 두 AI가 갈라 작업
- 진행 중: binding-lite 후속, 헤르메스/롤리팝 다운레벨 깊이, mangle-props, 대형 번들 워커풀 재설계, dev HTTPS(BoringSSL), Vue/Svelte 문법, Next.js/터보팩 같은 메타프레임워크 빌드, Zig 0.16 업그레이드 등
즉 이 프로젝트는 학습 프로젝트로 시작해 프로덕션 레벨 — zntc 0.1.0 배포 직전 — 까지 왔고, 여전히 가고 있다. "완성"이라 부를 시점은 아직 오지 않았다.