Zigbook이 Zigtools Playground의 WASM 바이너리와 자바스크립트 코드를 라이선스 고지 없이 가져다 쓴 정황과 이에 대한 Zigtools의 입장을 정리합니다.
Auguste Rame, Techatrix — 2025년 11월 30일
잘 모르는 분들을 위해 설명하자면, Zigtools는 Zig 커뮤니티, 특히 입문자들을 지원하기 위해 설립되었습니다. ZLS 같은 에디터 툴링을 만들고, lsp-kit을 통해 Zig로 구현된 언어 서버의 빌딩 블록을 제공하며, Zigtools Playground 같은 도구를 개발하고, vscode-zig과 같은 Zig 에디터 확장에도 기여하고 있습니다.
몇 주 전, Zigbook이라는 Zig 학습 리소스가 “제로 AI”와 독창적인 “프로젝트 기반” 구조를 내세우며 공개되었습니다.
하지만 장(chapter) 구조의 난센스, 책 내용과 예제, 밋밋한 웹사이트, 논란 이후 이슈를 비활성화한 저장소 등을 대충 훑어보기만 해도, 이 책이 전형적인 LLM 생성 덤핑물이라는 점과, 이 프로젝트 자체가 봇 계정과 가짜 반응들로 꾸며진 아첨성 공작(psychological operation)처럼 보인다는 점을 금방 알 수 있습니다.
우리는 Zigbook에 추가적인 SEO 효과를 주지 않기 위해 직접 링크는 모두 생략합니다.
커뮤니티 전반의 강한 반발이 나오면서 프로젝트가 이쯤에서 끝나겠거니 했지만, Zigbook은 굴하지 않고 바로 지난주에 새 기능이라며 “고전압 베타(high-voltage beta)” Zig playground를 공개했습니다.
Zigtools 역시 자체 Zig playground를 운영하고 있기 때문에(저장소, 웹사이트), 우리의 관심은 곧바로 쏠릴 수밖에 없었습니다. UI와 동작 방식이 상당히 비슷해 보였고, Zigbook은 심지어 ZLS를 playground에 통합해(비록 동작은 안 되지만) 코드 완성, 정의로 이동 등 그럴듯한 편집기 기능도 제공한다고 주장했습니다.
Zigbook의 이런 전력(前歷)을 알고 있던 우리는 즉시 WASM 블롭들을 조사했습니다. 결과적으로, 이 WASM 블롭들은 우리 것과 바이트 단위로 완전히 동일했습니다. 이 두 블롭(zig.wasm — 약간 수정한 Zig 컴파일러, zls.wasm — WASI용으로 엔트리 포인트를 수정한 ZLS)은 Zigtools Playground를 위해 완전히 맞춤 제작한 바이너리이기 때문에, 우연일 가능성은 전혀 없습니다.
아래 WASM 파일들은 인터넷 아카이브의 도움으로 보존한 것입니다.
zls.wasm (sha256sum: 3a63e5092e8f90172716977af5c88b4f49e546f730f25e9bafb47f4ac9a2ee1d)
zig.wasm (sha256sum: d3fe6b8a6b1db84a914eaa1f4a80ca5dcfd3b0948a35f2b1e78432a392eace96)
이어서 자바스크립트 코드도 살펴보았고, 역시 비슷한 방식으로 복사되었다는 사실을 금방 확인했습니다. 완전히 동일해 보이지 않도록 LLM이 왜곡·재작성한 흔적이 있었지만, 워커에서의 데이터 전달 구조와 로깅 부분처럼, 일부 구간은 완전히 동일했습니다(원본 ZLS playground 코드, Zigbook 표절 코드).
두 파일 모두에서 아래 코드는 그대로 일치합니다.
tstry { // @ts-ignore const exitCode = wasi.start(instance); postMessage({ stderr: `\n\n---\nexit with exit code ${exitCode}\n---\n`, }); } catch (err) { postMessage({ stderr: `${err}` }); } postMessage({ done: true, }); // ... onmessage = (event) => { if (event.data.run) { run(event.data.run); } };
특히 \n\n---\nexit with exit code ${exitCode}\n---\n라는 문자열은 누가 봐도 그대로 베껴 쓴 흔적입니다.
웃긴 점은, Zigbook이 우리 코드를 여기저기서 베껴 쓰면서도 ZLS 통합 코드의 가장 핵심적인 부분, 즉 ZLS WASM 바이너리의 API에 맞춰 설계된 자바스크립트 ZLS API는 베끼지 않았다는 겁니다. 이 자바스크립트 코드는 Zigbook이 실제로 표절해 간 ZLS 바이너리와 상호작용하기 위해 필수적인 부분입니다. Zigbook이 이 코드를 베끼지 않은 이유는, 그 정도까지는 너무 노골적으로 티 날 것이라 판단했거나, Zigtools Playground가 어떻게 동작하는지 근본적으로 이해하지 못했거나, 아니면 앞으로 더 많은 코드를 베껴 넣을 계획이기 때문일 것입니다.
명확히 하자면, playground와 Zig는 MIT 라이선스로 배포되기 때문에, 우리 코드와 WASM 블롭을 가져다 쓰는 것 자체는 전적으로 허용됩니다. 문제는 Zigbook이 MIT 라이선스 조건을 전혀 지키지 않았고, 코드와 바이너리를 사실상 자기들 소유인 것처럼 보이게 하면서 라이선스를 제대로 고지하지도 않았다는 점입니다.
우리는 라이선스 위반을 바로잡기 위해 Zigbook 저장소에 중립적인 어조로 PR을 보냈습니다. 그러나 그들은 이 PR을 곧바로 닫고, 설명을 지워 버렸습니다. 자신들의 잘못을 숨기려는 행동으로밖에 보이지 않습니다.
원래 PR의 설명은(또한 PR 첫 댓글의 “edits” 드롭다운에서도 확인할 수 있습니다) 아래와 같습니다.
저희(@zigtools)는 귀하가 Zigtools Playground에서 코드를 가져가 사용하고 있다는 점을 확인했습니다. 여기에는 우리의 WASM 블롭을 바이트 단위로 그대로 복사한 것과, 자바스크립트 소스 코드 일부 발췌본이 포함되어 있습니다.
이는 Zigtools Playground에 적용된 MIT 라이선스를 위반하는 행동이며, 동시에 zig.wasm 블롭에 대해 적용되는 Zig MIT 라이선스 역시 위반하는 것입니다.
MIT 라이선스에서 다음과 같이 명시하고 있습니다.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.우리는 귀하의 저장소에 필요한 라이선스를 추가하는 방식으로 이 문제를 수정했습니다. 귀하의 저장소에는 *.wasm 의존성에 대한 직접 링크가 없기 때문에, playground 페이지에 라이선스 고지문을 덧붙여 해당 라이선스들을 명시했습니다.
Zigbook의 앞서 언급한 좋지 않은 행태, 그리고 우리 라이선스를 계속해서 위반하면서도 이를 고치려 하지 않는 태도 때문에, 우리는 이 블로그 글을 쓰기로 결정했습니다.
우리의 첫 블로그 글이 우리 프로젝트 중 가장 멋진 하위 프로젝트의 표절 문제라는 점은 안타까운 일입니다. 우리는 WASM 기반 클라이언트 사이드 playground를 만들어, 오프라인 사용, 코드 프라이버시, 서버 비용 제로라는 도전을 스스로에게 던졌습니다.
이번 사건을 계기로 우리는 playground에 더 많은 시간을 투자하고, 몇 가지 아이디어도 떠올리게 되었습니다.
브라우저에서 더 복잡한 Zig 프로젝트를 실행할 수 있도록 멀티 파일 지원을 추가하고 싶습니다.
다른 Zig 개발자(Ziguanas)들과 협력해서 그들의 훌륭한 Zig 튜토리얼, 도서, 블로그 글에 playground를 통합하고 싶습니다.
아직 셀프 호스티드 Zig 컴파일러가 내보내지 못하고 있는 DWARF 디버그 정보를 활용하여 스택 트레이스를 지원하고 싶습니다.
Zig 커뮤니티의 일원으로서, 우리는 모든 Zig 커뮤니티 구성원에게 Zigbook을 멀리할 것을 권고합니다.
Zig를 배우고 싶다면, 앞서 언급한 Ziglings부터 Karl Seguin의 Learning Zig까지, 다양한 훌륭한 자료를 모아 둔 공식 Zig 학습 페이지를 강력히 추천합니다.
또한 이 자리를 빌려, 유일한 풀타임 유지관리자인 Techatrix가 ZLS를 지속 가능하게 유지할 수 있도록 모금을 진행 중임을 알리고자 합니다. 한 달에 5달러만 후원해 주셔도 큰 힘이 됩니다. OpenCollective나 GitHub Sponsors 페이지를 방문해 주세요.
읽어 주셔서 감사합니다! (^-^)/