i built a green blob that lives on my desktop. now it has feelings.
Linux 데스크톱에 사는 초록색 blob을 만들었더니 감정을 갖게 됐습니다
Python·GTK4·PyGObject·Cairo로 만든 Linux 데스크톱 동반자 Mochi v0.3의 개발기입니다. 영속적인 유대감, 상태 관리, 데스크톱 활동의 프라이버시 보호, 집중 세션을 구현하며 귀여운 픽셀 아트가 실제 소프트웨어 아키텍처 문제로 확장되는 과정을 보여줍니다.
- 주제
AI 요약
Mochi는 Linux 데스크톱 위에서 살아가는 작은 초록색 픽셀 아트 생명체입니다. 개발자는 처음에 단순히 blob을 움직이게 만드는 것을 목표로 시작했지만, 프로젝트는 곧 이 캐릭터를 살아 있는 것처럼 느끼게 하는 방향으로 확장됐습니다. v0.3에서는 생산성 시스템, 감정적 진행, 간식, 다양한 애니메이션까지 추가됐지만, 핵심은 기능을 많이 넣는 데 있지 않습니다. 사용자가 데스크톱에 작은 존재가 함께 있다는 느낌을 받도록 하면서도, 또 하나의 관리 대상이나 알림 시스템이 되지 않게 만드는 것이 중심 설계 원칙입니다.
■ 기술 구성과 초기 동작
Mochi는 Python, GTK4, PyGObject, Cairo로 구현된 Linux용 데스크톱 애플리케이션입니다. 클라우드 서비스나 계정이 필요하지 않고, Electron으로 만든 거대한 창이 백그라운드에 숨어 있지도 않습니다. 애플리케이션은 데스크톱 위에 작은 캐릭터를 직접 표시합니다. 초기 버전에서는 가만히 있기, 눈 깜빡이기, 걷기, 잠들기, 클릭에 반응하기, 사용자가 입력 중인지 알아차리기, 데스크톱에서 일어나는 일부 상황에 반응하기 같은 기능을 구현했습니다.
이런 동작만으로도 데스크톱 개발의 난점이 예상보다 빠르게 드러났습니다. 캐릭터가 걷고, 잠들고, 집어 들리고, 입력에 반응하고, UI를 표시하며, 독립적으로 애니메이션까지 시작하면 각각의 동작을 단순한 이미지 재생으로 처리할 수 없습니다. 어떤 상태가 현재 동작을 소유하는지, 새 상호작용이 기존 동작을 중단할 수 있는지, 애니메이션이 끝난 뒤 어디로 돌아가야 하는지를 관리해야 합니다. 개발자는 이 문제를 귀여운 데스크톱 애완동물이 만들어낸 상태 관리 문제라고 표현합니다.
■ 의무가 아닌 유대감으로 설계한 진행 시스템
v0.3에서 가장 큰 방향 전환은 가상 애완동물 시스템을 어떻게 설계할지에 대한 판단입니다. 일반적인 가상 애완동물이라면 배고픔, 건강, 일일 연속 기록, 사용자가 자리를 비운 동안 계속 내려가는 각종 수치를 넣을 수 있습니다. 그러나 개발자는 이런 메커니즘이 사용자가 며칠간 컴퓨터를 사용하지 못한 뒤 돌아왔을 때 죄책감이나 관리 의무를 느끼게 만들 수 있다고 봤습니다.
그래서 v0.3의 설계 규칙은 돌봄이 의무가 아니라 애정을 만들어야 한다는 것입니다. Mochi와 사용자의 유대감은 커질 수 있지만, 사용자가 외출했다고 해서 줄어들지 않습니다. 일일 연속 기록은 없고, Mochi가 굶지도 않으며, 애플리케이션을 종료하는 것이 도덕적 실패로 취급되지도 않습니다. 진행 시스템의 목적은 더 강한 능력치나 게임식 보상을 제공하는 것이 아니라, 새로운 성격 표현, 반응, 대화, 애니메이션, 작은 놀라움을 열어 주는 데 있습니다.
v0.3은 영속적인 유대감 진행을 도입합니다. Mochi는 애플리케이션이 다시 시작될 때마다 관계를 처음부터 초기화하지 않고, 사용자가 쌓아 온 관계를 서서히 기억합니다. 상호작용은 유대감 진행에 기여하고, 새로운 레벨에 도달하면 이후 더 표현력 있는 행동을 연결할 수 있는 기반이 됩니다. 간식 주기 역시 배고픔 수치를 계속 채워야 하는 핵심 시스템이 아니라, 원할 때 선택하는 작은 상호작용으로 구현됐습니다. 진행 바가 사용자를 조종해서 행동을 강요하는 방식은 피하려고 했습니다.
■ 애니메이션을 카탈로그와 상태 시스템으로 관리하기
Mochi에는 많은 반응 애니메이션이 추가되고 있습니다. 개발자는 각각의 애니메이션을 서로 무관한 GIF 모음으로 다루는 대신, 캐릭터가 상황에 맞는 반응을 일관되게 선택할 수 있도록 애니메이션 카탈로그와 상태 시스템을 구축하고 있습니다. 실제로 어려운 부분은 애니메이션을 그리는 일이 아니라, 여러 동작이 충돌할 때의 규칙을 정의하는 일입니다.
Mochi가 걷는 중에 감정을 표현하려고 하면 어떻게 해야 하는지, 애니메이션 중간에 사용자가 캐릭터를 집어 들면 어떻게 해야 하는지, 잠든 상태라면 무엇이 가능한지, 애니메이션이 끝난 뒤 어떤 상태로 돌아가야 하는지, 이미 만료된 타이머가 상태 변경 이후 실행되면 어떻게 막을 것인지 등을 처리해야 합니다. 현재 Mochi는 명시적인 행동·상태 소유권을 사용합니다. 우선순위가 높은 상호작용이 낮은 우선순위의 주변 동작을 중단할 수 있게 해, 여러 타이머가 하나의 sprite를 동시에 제어하는 상황을 피하려는 구조입니다.
■ 데스크톱 인식과 프라이버시 경계
Mochi는 사용자의 광범위한 데스크톱 활동에도 반응할 수 있습니다. 터미널, 에디터, 브라우저, 미디어 애플리케이션 등 인식된 맥락에서 시간을 보내고 있으면 캐릭터가 다르게 행동할 수 있습니다. 다만 개발자는 이 기능의 프라이버시 경계를 엄격하게 설정했습니다. Mochi는 사용자가 무엇을 입력하는지 알 필요가 없고, 모든 창 제목이나 파일 이름, 데스크톱 화면의 대화 내용을 수집할 필요도 없습니다.
대신 시스템은 활동을 작은 의미 신호로 축약합니다. 예를 들어 `terminal active`, `typing happening`, `media playing`, `user returned`처럼 현재 상황의 범주만 전달합니다. 어떤 내용을 입력했는지, 어떤 파일을 열었는지, 데스크톱에서 무엇을 보고 있는지를 그대로 수집하는 방식이 아닙니다. 개발자는 데스크톱 동반자가 주변 상황을 인식하는 듯한 느낌을 주면서도 데스크톱 감시 도구가 되어서는 안 된다고 설명합니다.
■ Focus with Mochi
v0.3의 또 다른 주요 기능은 Focus with Mochi입니다. 사용자는 집중 시간과 휴식 시간의 길이, 반복할 라운드 수를 선택할 수 있고, 부드러운 격려와 빗소리 사운드스케이프를 켤 수도 있습니다. 집중 시간은 Mochi와의 유대감에 기여하지만 휴식 시간은 그렇지 않습니다. 또한 휴식 중 사용자가 무엇을 하는지 Mochi가 판단하지 않도록 설계했습니다.
이 기능은 효율성을 극대화하는 생산성 대시보드를 만들기 위한 것이 아닙니다. 사용자가 잠시 일하고 있고 Mochi도 곁에 있다는 감각을 제공하는 것이 목적입니다. 개발자는 캐릭터가 또 하나의 생산성 시스템처럼 사용자를 재촉하거나 평가하지 않도록 하면서, 데스크톱 장식 이상의 유용성을 실험하고 있습니다.
■ 데스크톱 애플리케이션으로서의 통합 문제
프로젝트가 커지면서 새로운 기능을 추가하는 일 자체보다 모든 기능이 함께 작동하도록 만드는 일이 더 어려워졌습니다. 집중 세션이 다른 상호작용 이후에도 유지되어야 하고, 간식 주기가 상태 머신을 망가뜨려서는 안 됩니다. Mochi를 드래그한 뒤 보이지 않는 창이 남아서는 안 되며, 이름표가 마우스 입력을 가로채서도 안 됩니다. UI가 열렸다고 잠자기가 의도치 않게 취소되어서는 안 되고, 과거의 callback이 몇 초 뒤 실행되어 현재 상태를 덮어써서도 안 됩니다.
Mochi가 Linux의 실제 데스크톱 표면으로 동작하기 때문에 Wayland, XWayland, GTK lifecycle, 창 위치 계산, 다중 모니터, 음수 모니터 좌표, input grab, GLib timer, 종료 시 정리 작업까지 고려해야 합니다. 처음에는 초록색 blob을 그리는 프로젝트였지만, 이제는 GTK4 기반 데스크톱 애플리케이션의 생명주기와 운영체제 통합을 다루는 프로젝트가 됐습니다.
■ 기능을 늘리는 대신 침묵도 설계하기
개발자는 반응, 팝업, 대화, 알림을 계속 추가해 활동량을 최대화하려는 유혹을 경계하고 있습니다. 좋은 주변형 동반자는 언제 조용히 있어야 하는지도 알아야 하기 때문입니다. Mochi가 어떤 상황을 알아차리고 반응할 때도 있지만, 아무것도 하지 않을 때도 있고, 그냥 그 자리에 앉아 있을 때도 있습니다. 이 침묵 역시 캐릭터의 성격을 구성하는 요소로 봅니다.
v0.3은 Mochi에게 기억을 제공하는 유대감 시스템, 그 유대감에 의미를 부여하는 상호작용 시스템, 감정을 표현하는 애니메이션 라이브러리, 데스크톱과 연결되는 맥락 인식, 그리고 강압적이지 않은 집중 기능을 하나의 방향으로 묶은 릴리스입니다. 앞으로는 더 의미 있는 유대감의 이정표, 맥락에 따른 반응, 작은 잠금 해제 행동, 개선된 대화와 완성도를 추가할 계획입니다. 개발자는 이 과정에서 GTK의 동작과 관련된 버그도 계속 마주칠 것으로 보고 있지만, 단순한 데스크톱 캐릭터가 실제 시스템 설계와 데스크톱 통합을 배우게 하는 프로젝트로 확장된 점을 가장 흥미로운 결과로 보고 있습니다.
원문: dev.to / 번역·요약: Trawling