Zigbook이 Zigtools Playground를 표절하고 있습니다

발행: (2025년 11월 30일 오후 12:54 GMT+9)
10 min read

Auguste Rame, Techatrix — 2025년 11월 30일

Introduction

Zigtools는 Zig 커뮤니티, 특히 신규 사용자를 지원하기 위해 설립되었습니다. 이를 위해 ZLS와 같은 편집기 도구를 만들고, Zig로 작성된 언어 서버용 빌딩 블록을 제공하는 lsp-kit을 개발했으며, Zigtools Playground 같은 도구를 작업하고, vscode-zig와 같은 Zig 편집기 확장에도 기여하고 있습니다.

The Plagiarism

몇 주 전, “zero AI”와 원본 “프로젝트 기반” 구조를 내세운 Zig 리소스인 Zigbook이 출시되었습니다.

하지만 장(chapter) 구조, 책 내용, 예제, 일반적인 웹사이트, 혹은 사후 논란으로 비활성화된 레포지토리를 대충 살펴보면, 이 책은 전적으로 LLM이 만든 잡동사니이며 프로젝트 자체가 일종의 아첨하는 심리전처럼 보이고, 봇 계정과 가짜 반응으로 꾸며져 있다는 것이 드러났습니다.

우리는 Zigbook에 대한 직접적인 링크를 남기지 않아 SEO 효과를 더 주지 않으려 합니다.

우리는 광범위한 커뮤니티 반발이 프로젝트의 종말을 의미할 것이라 생각했지만, Zigbook은 지난 주에 “고전압 베타” Zig 플레이그라운드라는 새로운 기능을 출시하며 계속해서 버텼습니다.

Zigtools가 자체 Zig 플레이그라운드(레포, 웹사이트)를 가지고 있기에 우리의 관심은 즉시 끌렸습니다. 형태와 기능이 매우 유사했으며 Zigbook은 (동작하지는 않지만) ZLS를 플레이그라운드에 통합해 코드 자동완성, 정의 이동 등 다양한 편집기 기능을 제공하려 했습니다.

Zigbook의 사기 이력을 알기에 우리는 즉시 WASM 블롭을 조사했습니다. 안타깝게도 WASM 블롭은 우리 것과 바이트 단위로 동일했습니다. 이는 두 블롭(zig.wasm, 약간 수정된 Zig 컴파일러 버전, 그리고 zls.wasm, WASI용 수정 진입점을 가진 ZLS)이 Zigtools Playground를 위해 완전히 맞춤 제작된 것이기 때문에 우연일 수 없습니다.

편의를 위해 인터넷 아카이브에 보관된 WASM 파일을 아래에 정리했습니다:

  • zls.wasm (sha256sum: 3a63e5092e8f90172716977af5c88b4f49e546f730f25e9bafb47f4ac9a2ee1d)

  • zig.wasm (sha256sum: d3fe6b8a6b1db84a914eaa1f4a80ca5dcfd3b0948a35f2b1e78432a392eace96)

그 다음 우리는 JavaScript 코드를 살펴보았고, 이 역시 유사하게 복사되었으나 LLM이 왜곡한 흔적이 있어 완전히 동일하지는 않았습니다. 그래도 JavaScript 워커 데이터 전달 구조와 로깅 부분 등은 일대일로 복사된 것이 확인되었습니다 (원본 ZLS 플레이그라운드 코드, 복제된 Zigbook 코드).

두 파일에서 동일하게 나타나는 코드는 다음과 같습니다:

try {
    // @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와 연동하도록 설계된 JavaScript ZLS API를 복사하지 않았습니다. 해당 JavaScript 코드는 복제된 ZLS 바이너리와 상호작용하기 위해 절대적으로 필요합니다. Zigbook이 이 코드를 복사하지 않은 이유는 눈에 띄게 드러나는 것을 피하려 했거나, Zigtools Playground의 동작 방식을 근본적으로 이해하지 못했거나, 혹은 앞으로 더 많은 코드를 복사하려는 계획 때문일 수 있습니다.

우리 코드를 복사하고 WASM 블롭을 그대로 가져가는 행위 자체는 플레이그라운드와 Zig가 MIT 라이선스로 제공되기 때문에 허용됩니다. 그러나 Zigbook은 MIT 라이선스 조항을 전혀 준수하지 않았으며, 코드를 자신들의 것으로 주장하면서 라이선스를 올바르게 표시하지 않았습니다.

우리는 Zigbook에 중립적인 라이선스 위반 수정 PR을 보냈지만, 그들은 신속히 PR을 닫고 설명을 삭제해 자신의 부정을 감추려 했습니다.

원래 설명(원 PR 코멘트의 “edits” 드롭다운에서도 확인 가능)은 다음과 같습니다:

We (@zigtools) noticed you were using code from the Zigtools Playground, including byte‑by‑byte copies of our WASM blobs and excerpts of our JavaScript source code.
This is a violation of the MIT license that the Zigtools Playground is licensed under alongside a violation of the Zig MIT license (for the zig.wasm blob).
As the MIT license states:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

We’ve fixed this by adding the licenses in question to your repository. As your repository does not include a direct link to the *.wasm dependencies, we’ve added a license disclaimer on the playground page as well that mentions the licenses.

Zigbook의 위와 같은 악행과 지속적인 라이선스 위반, 그리고 이를 바로잡지 않으려는 태도는 우리가 이 블로그 글을 쓰게 만든 직접적인 동기가 되었습니다.

Our Vision for the Zigtools Playground

우리의 첫 번째 블로그 글이 가장 멋진 서브프로젝트의 표절에 관한 것이 되어 안타깝습니다. 우리는 오프라인 사용, 코드 프라이버시, 서버 비용 제로를 목표로 WASM 기반 클라이언트‑사이드 플레이그라운드를 만들며 스스로에게 도전했습니다.

이번 사건은 플레이그라운드에 더 많은 시간을 투자하도록 만들었으며, 다음과 같은 아이디어를 떠올리게 했습니다:

  • 다중 파일 지원을 활성화해 브라우저에서 더 복잡한 Zig 프로젝트를 실행할 수 있게 하기.
  • 다른 Zig 커뮤니티 구성원들과 협업해 플레이그라운드를 훌륭한 Zig 튜토리얼, 책, 블로그 포스트에 통합하기. 예를 들어, Ziglings 온라인 연습을 플레이그라운드와 연동하는 것이 좋은 사례가 될 수 있습니다.
  • Zig 공식 웹사이트 자체를 통합 포인트로 삼기.
  • 아직 자체 호스팅 Zig 컴파일러가 내보내지 않는 DWARF 디버그 정보를 활용한 스택 트레이스 지원.

Conclusion

Zig 커뮤니티 구성원으로서, Zigbook을 절대 이용하지 말 것을 강력히 권고합니다.

Zig를 배우고 싶다면, 공식 Zig 학습 페이지를 적극 추천합니다. 여기에는 앞서 언급한 Ziglings부터 Karl Seguin’s Learning Zig까지 다양한 자료가 포함되어 있습니다.

또한 우리는 현재 유일한 전임 유지관리자인 Techatrix를 위해 ZLS를 지속 가능하게 만들기 위한 모금 활동을 진행 중임을 알립니다. 월 $5 정도 후원해 주시면 큰 힘이 됩니다. 우리의 OpenCollective 혹은 GitHub Sponsors를 확인해 주세요.

읽어 주셔서 감사합니다! (^-^)/

Back to Blog

관련 글

더 보기 »

자신감 상실

번역할 텍스트를 제공해 주시겠어요? 텍스트가 없으면 번역을 진행할 수 없습니다.