
사프타 카탈린 미하이(Safta Catalin Mihai)는 AI 에이전트가 코드를 작성하고 검토하는 개인용 일지 앱 LCARS를 만들었다. 일지와 작업을 기록하는 웹 콘솔, 에이전트에게 일을 맡기는 시스템, 브라우저에서 걸어 다닐 수 있는 3D 엔터프라이즈호로 구성되며, 제작자는 자신만 사용할 소프트웨어를 휴대전화에서 지시해 바꾼다.
체험용 콘솔과 3D 우주선은 가상의 일지를 사용하며, 로그인 없이 브라우저에서 이용할 수 있다. 입력한 내용은 브라우저에만 저장된다.
미하이는 1990년대 어린 시절 스타트렉을 본 뒤, 말로 요청하면 작동하는 컴퓨터를 원했다고 설명한다. 이번 글은 LCARS 개발 시리즈의 다섯 번째 편이다. 그는 기존 일지 앱인 Logseq, Capacities, NotePlan, Obsidian을 써 봤지만 원하는 기능이 없어 직접 만들기로 했고, 직장과 어린 자녀를 돌보느라 코드를 쓸 시간이 부족해 AI 에이전트와의 실험으로 방향을 틀었다. Opus 4.8, Opus 5, 5.5를 거쳐 현재는 Fable 5.1이 지휘 역할인 Number One을, Opus 5.5가 엔지니어 역할을 맡는다.
일지와 웹 콘솔
미하이는 매일 휴대전화로 일지에 기록한다. 작업, 수면, 운동, 회의 메모, 떠오른 생각 등을 담고, 아들의 새로운 단어도 한 건씩 남긴다. 각 항목은 유형을 나타내는 kind를 가진 행으로 저장된다. 데이터베이스는 SQLite 테이블 하나를 사용하며, 항목을 실제로 지우는 대신 삭제 표시를 한다. 습관 추적기나 독서 목록 같은 기능도 테이블 구조를 바꾸기보다 새로운 유형을 추가하는 방식이다.
처음에는 직접 만든 Raylib 앱을 사용했다. C 코드와 데이터베이스, API는 남기고 브라우저를 주된 사용 환경으로 바꾸면서 데스크톱 앱은 10월에 폐기했다. 당시 직접 작성한 약 11,000줄의 C 코드와 외부에서 가져온 380,000줄의 코드를 한 번의 커밋으로 제거했지만, 원하면 되돌릴 수 있도록 Git 기록에 보존했다. 현재 서버는 C11로 작성했고 프레임워크 없이 약 23,000줄로 구성된다.
웹 클라이언트는 빌드 과정이나 프레임워크, node_modules 없이 단일 index.html로 제공된다. 일지 전체를 브라우저의 IndexedDB에 복제하고 변경분만 동기화하기 때문에 검색이 빠르고 오프라인에서도 쓸 수 있다. 연결이 끊긴 동안의 편집은 대기열에 담겼다가 네트워크가 복구되면 전송된다. 콘솔에는 날짜별 기록, 마크다운 편집기, 작업 목록, 일·월 달력, 수치 기록과 추세 그래프, 항목의 의미를 바탕으로 배치하는 별자리 차트 등이 있다.
미하이는 페이지 변경을 적용하기 전에 가상의 일지 4,000건을 넣고 헤드리스 Chromium에서 상호작용 성능을 확인한다. 기준은 99백분위에서 초당 60프레임을 유지하는 것이다. 음성 명령도 주요 기능이다. “새 작업”, “수면을 의미로 검색”, “오늘 기록 읽기”, “완료로 표시” 같은 명령을 포함해 콘솔에는 음성 명령 269개가 있으며, 새 키보드 단축키에 음성 명령이 없으면 테스트가 실패하도록 했다. 과거에는 Vosk를 이용해 오프라인 받아쓰기를 지원했지만, 현재는 휴대전화 자체 음성 인식과 Deepgram을 사용한다. 미하이는 오프라인 지원보다 인식 성능을 더 중요하게 여겼다고 설명한다.
서버 쪽에는 CalDAV 연동이 있어 작업과 마감일이 Apple Reminders에 나타난다. 사진·영상·음성 메모는 가정의 NAS에 저장하고, Logseq의 과거 일지를 가져오는 기능과 열린 페이지에 변경사항을 알리는 서버 푸시도 제공한다. 질문을 받으면 서버가 Claude Code 에이전트를 실행해 일지의 자체 명령줄 도구인 lcars-cli만 사용하게 한다. 에이전트는 SQL을 작성하거나 파일을 건드리거나 다른 프로그램을 실행할 수 없다. 이 제한 안에서 기록을 검색해 답하고 근거가 된 항목 링크를 제시하거나 작업을 추가한다.
여행 계획도 일지의 한 유형으로 관리한다. 사용자가 목적지를 자연어로 요청하면 내비게이터가 정차 지점과 이동 수단, 체류 시간, 출발 시간을 계획한다. 지도에는 시간과 거리, 고도 변화, 각 지점의 날씨를 표시한다. 계획 변경은 기존 항목을 덮어쓰지 않고 새 버전을 만들며, 이전 버전은 삭제 표시해 되돌릴 수 있다. 지도·경로·고도·장소 검색에는 Mapy.com API, 날씨에는 Open-Meteo, 강수 레이더에는 RainViewer, 기상 경보에는 MeteoAlarm, 등산로에는 Waymarked Trails를 사용한다.
에이전트 승무원과 배포 절차
엔지니어 역할의 에이전트는 LCARS 코드 자체를 수정하는 Claude Code 세션이다. 각 세션은 별도의 Git worktree와 브랜치를 받아 서로의 작업을 분리하고, herdr 터미널 탭에서 프로젝트 규칙과 수정 범위, 결과 보고 방법을 전달받는다. 세션은 백그라운드에서 유지되므로 페이지를 닫거나 휴대전화를 잠가도 작업을 이어 간다. 미하이는 콘솔, 휴대전화의 Claude 앱, 터미널에서 세션에 접근할 수 있다.
에이전트의 작업은 미하이의 명령 없이는 서비스에 반영되지 않는다. 배포 스크립트는 엔지니어의 작업이 끝나기를 기다린 뒤, 변경사항을 운영 브랜치에 재적용하고 웹 테스트를 실행한다. 테스트를 통과하면 병합하고, C 코드가 바뀐 경우 서버를 다시 빌드한 다음 재시작해 응답 여부를 확인한다. 실패하면 배포하지 않고 오류 내용을 엔지니어 세션에 전달한다. 롤백도 버튼 하나로 할 수 있다. 미하이에 따르면 10월 8일 이후 배포는 230회였고, 이 가운데 28회는 실패했다. 대부분은 테스트가 배포 전에 문제를 발견한 경우였다.
여러 엔지니어를 휴대전화에서 관리하기 어려워 한 세션에는 Number One이라는 조정 역할을 맡겼다. 미하이가 원하는 결과를 말하면 Number One이 작업 지시를 작성하고 엔지니어를 시작하며, 결과를 검토하고 통과한 변경의 배포를 진행한다. 다만 코드를 직접 수정할 수는 없다. 파일을 읽고 읽기 전용 Git 명령과 승무원 관리 명령을 실행할 수 있으며, 미하이의 판단이 필요한 경우에만 질문한다. 에이전트 간 메시지는 일지에 저장해 세션이 오프라인이어도 사라지지 않고, 미하이가 내용을 확인하거나 수정할 수 있다.
서버는 처음에 월 3달러짜리 VPS로, CPU 1개와 메모리 2GB를 제공했다. Claude Code 세션 하나가 약 300MB를 쓰고 테스트마다 헤드리스 Chromium을 실행하면서 메모리 부족 문제가 생겼다. 10월 9일에는 커널의 OOM 킬러가 테스트 도중 배포 프로세스를 종료했다. 이후 한 번에 실행하는 Claude Code 세션은 Number One과 엔지니어 한 명, 최대 두 개로 제한했다. 나머지 엔지니어는 작업 대화와 브랜치를 유지한 채 대기하며, 미하이의 메시지가 오면 우선권을 받는다. 다른 작업이 대기 중일 때 30분을 넘긴 작업은 중단된다.
한 엔지니어가 /proc을 초 단위로 읽어 테스트에 걸리는 시간을 측정한 뒤 서버를 CPU 4개와 메모리 8GB로 늘렸다. 전체 테스트 시간은 한 CPU에서 16분이었고, 변경 후에는 2~3분이 걸린다고 미하이는 밝혔다. 다만 에이전트를 병렬로 실행하면 같은 파일을 수정해 병합 충돌을 해결하는 데 토큰이 더 들기 때문에, 자원 문제가 사라진 뒤에도 한 명씩 작업하는 방식을 유지했다. 엔지니어가 예상한 시간의 중앙값은 실제 작업 시간의 약 세 배였고, 수정 작업은 2~6분, 기능 추가는 10~30분 정도 걸렸다고 한다.
예약 작업을 수행하는 승무원도 있다. 이들은 일정과 날씨, 밤사이 작업 내역을 아침에 요약하거나 일지의 일간·월간 기록과 주간 통계를 작성한다. 문서와 코드를 대조하고 보안 점검을 하는 역할, 개인 기록을 읽는 상담 역할도 포함된다. 각 역할은 일정, 모델, 예산, 실행 가능한 명령, 프롬프트를 담은 마크다운 파일로 설정한다. 이들은 제한된 권한으로 일지를 읽고 결과를 항목 하나로 남긴다.
브라우저 속 우주선
3D 우주선은 두 번째 웹 페이지인 deck.html에서 실행된다. three.js로 만든 U.S.S. 엔터프라이즈호를 노트북에서는 키보드와 마우스로, 휴대전화에서는 터치로 돌아다닐 수 있다. 미하이는 3D 코드나 모델을 직접 만들지 않았으며, 에이전트가 지시에 따라 작업했다고 밝혔다. 8번 갑판의 복도, 함교, 선장실, 텐 포워드 등은 방별로 직접 구성했고, 나머지 갑판은 코드가 시드값에 따라 생성한다. 터보리프트 뒤에는 방 42개가 있다.
사용자는 일지 항목을 최대 아홉 개까지 들고 다니며 벽이나 책상, 창문, 콘솔에 패드 형태로 고정할 수 있다. 고정 위치도 space 유형의 일지 항목으로 저장되므로 동기화와 삭제 취소가 일반 기록과 같은 방식으로 작동한다. 승무원 캐릭터는 방 사이를 이동하고 서로 비켜 간다. 캐릭터에게 말을 걸거나 엔지니어로 승격하면, 앞서 설명한 Claude Code 세션이 생성된다. 해당 엔지니어의 변경이 검토와 테스트를 통과해 배포되면 다음에 불러온 우주선에도 반영된다.
이 프로젝트는 ecompute의 VPS 한 대에서 운영한다. 미하이는 Tailscale 네트워크를 통해서만 접속하고, tailscale serve로 C 서버 앞에 HTTPS를 둔다. 코드를 수정하고 배포할 수 있는 엔지니어 경로도 Tailscale 로그인에서 온 요청에만 응답한다. 사진과 영상은 가정의 Synology NAS에 두고 NFS로 서버에 연결하며, 최근 파일은 가정의 느린 업로드 속도를 보완하기 위해 VPS 디스크에도 캐시한다.
제작자가 밝힌 한계와 활용 범위
미하이는 소스 공개를 원하지만 현재는 한 사람과 한 서버를 위해 만든 상태라 준비되지 않았다고 말한다. 공개 전에 코드와 전체 기록에서 사적인 정보가 있는지 확인하고 안전하게 개방할 작업이 필요하다는 설명이다. 우주선은 실제 VR 헤드셋에서 시험하지 않았고, 콘솔 소개 영상은 앱의 변화 속도를 따라가지 못해 한 달가량 뒤처져 있다. 에이전트가 의도보다 지시 문구를 그대로 따르는 경우도 있고, 앱에는 여전히 버그가 생긴다. 미하이는 이를 승무원에게 알리고 수정하게 한다. 코드 규모가 커질수록 새 기능 추가가 어려워질 가능성도 있지만, 지금까지 수백 가지 기능을 추가하는 동안 그런 상황은 아직 겪지 않았다고 밝혔다.
그는 개인이나 소수 사용자를 위한 소프트웨어에는 이 방식이 꽤 잘 맞는다고 본다. 다만 다른 사람들이 의존할 제품을 이런 방식으로 만들지는 않겠다고 선을 그었다. 백엔드는 주로 SQLite의 C API를 사용해 이해하지만, 프런트엔드가 어떻게 작동하는지는 더 이상 알지 못한다고도 했다. 자신을 AI 회의론자라고 소개하면서도, 에이전트 덕분에 같은 시간 안에는 만들 수 없었을 기능을 구현했다고 평가했다. 앱 버전은 9월의 0.22에서 현재 0.256으로 바뀌었다.
미하이는 마지막으로 이 글도 AI의 도움을 받아 작성했다고 밝혔다. 에이전트 Jake Sisko가 메모와 프로젝트 문서를 바탕으로 초안을 만들었고, 미하이가 이를 크게 검토하고 다시 썼다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요