3줄 요약
- OpenMMO(GitHub
Julian-adv/OpenMMO)는 혼자서 바이브 코딩으로 만들고 있는 오픈소스 MMORPG다. 커밋 이력에는Jake Song— 송재경의 영문명 — 이 남아 있다. 바람의 나라·리니지·아키에이지를 만든 그가 2025년 초 엑스엘게임즈를 떠나 오픈게임재단에 합류한 뒤 붙든 개인 프로젝트다. - 핵심 설계 목표는 하나다. AI 에이전트와 인간 플레이어를 동등하게 대한다. 둘은 똑같은 WebSocket 프로토콜로 접속하고, 에이전트에게 주어지는 특권 API는 없다. 서버는 접속자가 사람인지 봇인지 구분하지 못한다.
- 2025년 8월 착수 뒤 다섯 달 남짓 손을 뗐다가 2026년 2월 본격 재개 — 중간 공백을 뺀 실제 개발 기간은 약 7개월이다. 그 안에 1,152커밋, 활동일 169일, 코드 약 12만 줄(Rust·TypeScript·Svelte). 절차적 32km × 32km 월드, 하우징, 던전, LLM이 조종하는 NPC와 흥정 경제까지 이미 돌아가고,
openmmo.to.nexus에서 구글 로그인으로 바로 플레이할 수 있다.
만드는 사람과 만드는 방식
송재경은 1996년 바람의 나라, 1998년 리니지로 한국 온라인 게임의 문을 연 개발자다. 이후 아키에이지·문명 온라인·달빛조각사를 거쳐 엑스엘게임즈를 이끌었고, 2025년 초 회사를 떠나 장현국이 세운 오픈게임재단(Open Game Foundation)의 수석 고문으로 합류했다. 재단 합류 당시 장현국은 그를 두고 “AI와 블록체인을 게임에 통합하는 획기적인 도전에 착수했다"고 소개했다. OpenMMO는 그 도전의 코드 쪽 얼굴로 보인다.
작업 방식은 README가 스스로 밝힌다. “Solo-developed and vibe-coded.” 리포 루트에는 CLAUDE.md, AGENTS.md, GEMINI.md가 나란히 있고 .claude·.codex·.gemini 디렉토리가 함께 놓여 있다. 여러 AI 코딩 에이전트를 한 프로젝트에 붙여 쓰는 구성이다. 에셋도 AI 생성·절차적 생성·인터넷 소싱을 섞었다고 명시한다.
달력으로는 약 11개월이지만, 2025년 9월부터 2026년 1월까지는 커밋이 거의 없다. 개발자 본인이 “중간에 논 기간"이라 부른 공백이고, 이를 빼면 실작업은 약 7개월이다. 그 7개월의 커밋 리듬을 보면 혼자라고 느슨한 것과는 거리가 멀다.
| 지표 | 값 |
|---|---|
| 실제 개발 기간 | 약 7개월 (2025-08 착수, 2025-09~2026-01 공백, 2026-02 본격 재개) |
| 총 커밋 | 1,152 |
| 활동일 | 169일 |
| 하루 최다 커밋 | 27 (2026-02-27) |
| 주 작업 시간대 | 밤 20시~새벽 1시에 집중 |
| 코드 규모 | Rust 약 5.0만 줄 · TypeScript 약 3.9만 줄 · Svelte 약 2.8만 줄 |
기술 스택
전형적인 게임 엔진을 쓰지 않는다. 서버·클라이언트·에이전트가 하나의 Cargo 워크스페이스로 묶여 있고, 서버·클라이언트가 공유하는 shared 크레이트를 클라이언트에서는 WASM으로 불러 쓴다. 충돌 판정 같은 규칙을 브라우저·봇·서버가 같은 Rust 코드로 계산하게 하려는 구조다.
- 서버: Rust + Tokio(비동기 런타임), tokio-tungstenite(WebSocket), Axum(지형·하우징·NPC REST API), serde.
- 클라이언트: Svelte + TypeScript, Three.js를 Threlte로 통합, WebGPU, Vite.
- 에이전트 클라이언트: Rust,
rmcp(MCP 서버), Tokio + tokio-tungstenite.
절차적 월드
월드는 손으로 그리지 않고 전부 절차적으로 생성한다.
- 32km × 32km 규모의 지형·강·해안선·바이옴을 절차 생성한다.
- 강은 물길을 파고 여러 갈래로 갈라지며(braided distributaries), 강이 바다에 닿는 곳에는 삼각주와 하구가 형성된다.
- 정착지를 잇는 도로망을 자동으로 깔고, 도로가 강을 건너는 지점에는 다리를 자동 배치한다.
- 바다는 Gerstner 파도로, 강은 흐르는 잔물결로 애니메이션하고, 바람에 따라 풀과 나뭇잎이 흔들린다.
- 낮과 밤의 길이가 행성의 공전 위치에 따라 달라지고(계절), 두 개의 달이 각자의 궤도와 위상으로 도는 천체 시뮬레이션이 들어 있다.


게임 안에는 월드를 직접 매만지는 맵 에디터가 내장돼 있다. 지형 브러시(도로·평탄화·높이 페인트), 오브젝트 배치 프리뷰, 마을(스폰 금지)과 몬스터 스폰 구역을 사각형으로 그리는 도구까지 게임 내에서 라이브로 편집한다.

하우징과 던전
집은 목골 구조(timber-framed)를 모듈로 조립하며, 2·3·4층까지 지어진다. 방마다 오클루전을 처리해 실내에 들어가면 앞을 가리는 벽과 지붕이 사라지고, 문과 창은 열고 닫힌다. 침대 같은 가구를 놓고 눕거나 쓸 수 있다.

던전은 NetHack 스타일의 시드 결정적 미로다. 지상에 흩어진 입구로 들어가면 최대 20층까지 내려가고, 입구마다 시드가 고정돼 클라이언트에서 만들든 서버에서 만들든 똑같은 미로가 나온다. 지상 입구는 별도 모델을 만들지 않고 하우징의 절차적 지오메트리를 재사용해 돌 건물로 세운다. 마지막 층에는 전용 전리품을 든 보스가 있다. 통 상자를 부수면 아이템이 나오고, 상자를 열면 코인 더미가 실제 바닥 아이템으로 떨어진다.

전투와 인벤토리
전투 규칙은 NetHack·D&D 계보를 따른다.
- 여섯 개의 고전 능력치(STR, DEX, CON, INT, WIS, CHA), 범위 3~18.
- 캐릭터 생성은 4d6-drop-lowest 굴림 + 클래스 보정 + 72점 재분배.
- 모든 피해·명중·판정 계산은 서버에서 처리한다.
인벤토리는 무게 제한이 있고, 머리·주무기·보조무기·가슴·귀·목·벨트·바지·부츠·반지 둘까지 11개 장비 슬롯의 페이퍼돌 시스템을 갖췄다. 아이템은 무게가 있어 무거운 세팅은 실제로 선택을 강요한다. 바닥에 떨어뜨린 아이템은 그 자리에 남고 누구나 주울 수 있으며, 2층에서 떨어뜨린 물건은 2층에서만 주울 수 있다. 줍기 판정은 서버에서 원자적으로 처리해 복제를 막는다.

BGM은 Suno와 Google Flow Music으로 만든 약 50곡을 쓴다. 울티마풍 중세 판타지 음색(류트·리코더·하프·현악·타악·금관)으로, 평시 음악과 전투 음악 풀을 나눠 전투가 시작되면 크로스페이드로 전투 곡이 들어왔다가 다시 평시 곡으로 돌아간다.
에이전트와 인간을 구분하지 않는 설계
이 프로젝트가 여느 1인 게임과 갈라지는 지점이다. 인간 클라이언트는 3D 그래픽과 마우스·키보드로 플레이하지만, 에이전트 클라이언트는 텍스트 인터페이스로 같은 월드에 들어온다. 구조는 세 층으로 나뉜다.
- LLM: 고수준 의사결정(전략, 대화, 판단).
- Agent Client: 저수준 실행(A* 길찾기, 상태 관리, 이벤트 수집). MCP 서버로 동작해 여러 LLM이 붙을 수 있다.
- Game Server: 월드 시뮬레이션, 권한 검증.
핵심은 서버가 에이전트에게 특별한 문을 열어주지 않는다는 것이다. 에이전트와 인간은 같은 프로토콜을 말하고 같은 방식으로 영속화되며, 서버 코드에서 둘의 차이는 is_npc 플래그 하나뿐이다. 사람이 할 수 있는 행동은 에이전트도 할 수 있고, 그 반대도 성립한다.
NPC는 LLM이 조종한다. 상인 Rica, 경비병 Karl 같은 NPC가 대화 맥락에 따라 반응한다. 상인은 흥정이 가능해서, 좋은 이야기나 아부에 값을 깎아주고 무례하게 굴면 값을 올린다. 위시리스트를 가진 비상인 NPC는 대화 중에 “치유 물약을 구해다 주면 값을 잘 쳐주지” 같은 의뢰를 즉석에서 만들어, 별도의 퀘스트 시스템 없이 LLM 롤플레잉만으로 fetch 퀘스트가 생긴다.

두 개의 달이 뜨는 하늘
밤이 되면 횃불이 감쇠하는 점광원으로 실시간 그림자를 드리우고, 하늘에는 두 개의 달이 각자의 위상으로 뜬다. 게임의 시각적 정체성을 요약하는 장면이다.

가장 눈여겨본 대목 — 코드에 남은 30년의 상흔
내가 이 리포에서 가장 인상 깊게 본 것은 화려한 절차적 지형이 아니라 최근 커밋 묶음이었다. 근래의 커밋은 대부분 보안·권위 강화 작업이다. 이동을 서버 권위로 바꾸고(F-006), 공격 사거리를 서버에서 강제하고, 월드 편집 REST API에 관리자 인증을 걸고, 인증되지 않은 연결에 월드 브로드캐스트를 보내지 않게 막고, WebSocket 메시지 크기에 상한을 두고, 경로 순회(path traversal) 공격을 차단한다. 비밀번호 로그인을 구글 로그인으로 갈아치우고 NPC 토큰을 분리해 회귀 테스트로 고정한다.
이건 처음 MMO를 만드는 사람의 우선순위가 아니다. 클라이언트를 절대 믿지 않고 판정을 전부 서버로 끌어오는 습관, 인증 경계와 어뷰징을 기능보다 먼저 챙기는 감각은 수십 년간 실제로 운영해 본 사람의 몸에 밴 반사다.
같은 반사가 경제 설계 문서에도 그대로 있다. 캐릭터를 생성하고 삭제하며 반복하는 머니 펌프를 막으려고 신규 캐릭터에게 시작 골드를 주지 않고, 시작 장비는 아예 가격이 없는 전용 아이템으로 줘서 되팔 수 없게 만든다. LLM NPC의 흥정도 마찬가지다. “쉐보레 딜러 챗봇이 1달러에 차를 팔기로 약속한 사건"을 예로 들며 LLM은 결국 뚫린다고 가정하고, 방어는 전부 서버에서 한다는 원칙을 세운다. LLM은 가격 밴드 안에서 할인율만 고르고, 밴드를 벗어나면 서버가 잘라낸다. 최대 할인 구매가가 최대 판매가보다 항상 높도록 불변식을 서버가 보장해, LLM이 어떤 결정을 내려도 차익 펌프가 생길 수 없다.
송재경은 오래전부터 “MMORPG는 게임이 아니라 가상세계"라고 말해 왔다. 에이전트와 인간을 구분하지 않는 세계를 짓겠다는 이 프로젝트의 목표는, 그 오래된 문장을 AI 시대의 결론까지 밀어붙인 것으로 읽힌다. 그리고 그 세계를 지탱하는 것은 비전이 아니라, 클라이언트를 믿지 않는 서버 코드 한 줄 한 줄이다.
출처
프로젝트: OpenMMO (오픈소스, 1인 개발 · 바이브 코딩)
개발자: Julian-adv — 커밋 이력상 Jake Song(송재경)
라이브: https://openmmo.to.nexus:10004 (구글 로그인)
원문: https://github.com/Julian-adv/OpenMMO
이미지는 리포의 doc/ 문서에 포함된 게임 스크린샷과 컨셉 아트를 인용했다.
