나의 첫 하네스 — Telegram으로 LLM Wiki 원격 조종하기

오늘 하루 만에 개인 지식 베이스를 만들고, 그걸 Telegram으로 원격 조종하는 시스템을 만들었다. 돌이켜보면 이것이 나의 첫 하네스 엔지니어링이었다.

시작: Karpathy의 LLM Wiki

모든 것은 Andrej Karpathy의 LLM Wiki 패턴에서 시작했다. 핵심 아이디어는 간단하다 — RAG처럼 매번 원본에서 검색하는 대신, LLM이 위키를 점진적으로 구축하고 유지관리하게 만드는 것이다.

구조는 3계층이다:

  • Raw sources (raw/) — 원본 자료. 불변.
  • Wiki (wangsyObsidian/) — LLM이 유지관리하는 마크다운 파일들. Obsidian vault.
  • Schema (CLAUDE.md) — LLM에게 “이렇게 일해라”를 알려주는 규칙서.

Claude Code를 열고 Karpathy Gist를 공유하면서 시작했다. Claude가 기존 Obsidian vault 구조를 분석하고, CLAUDE.md 스키마를 작성하고, index.mdlog.md를 생성하고, 기존 42개 페이지를 색인했다. 한 시간도 안 걸렸다.

문제: 이 컴퓨터 앞에 앉아 있어야 한다

위키가 돌아가기 시작하니까 바로 문제가 보였다. 원격에서는 쓸 수가 없다.

출퇴근길에 흥미로운 기사를 발견해도, 회의 중에 메모할 것이 생겨도, 집 컴퓨터 앞에 앉아서 Claude Code를 열어야만 ingest할 수 있다. 지식 베이스는 24시간인데 입력 통로는 컴퓨터 앞에 있는 시간만큼만 열려 있는 셈이다.

내가 원한 것은 세 가지였다:

  1. 어디서든 URL이나 텍스트를 보내면 즉시 ingest
  2. 어디서든 질문하면 위키 기반으로 답변
  3. 이미 매일 쓰고 있는 앱에서

답은 Telegram Bot이었다.

아키텍처: 봇은 얇게, 두뇌는 Claude에게

설계 원칙을 하나 잡았다: 봇은 메시지를 중계할 뿐, 모든 지식 작업은 Claude Code가 한다.

스마트폰 → Telegram → Bot 서버(내 PC) → Claude Code CLI → Wiki

봇의 역할은 정말 단순하다:

  1. Telegram 메시지를 받는다
  2. claude -p로 Claude Code에 전달한다
  3. 결과를 Telegram으로 돌려보낸다

위키의 모든 규칙(어디에 저장할지, 어떻게 교차참조할지, index를 어떻게 업데이트할지)은 CLAUDE.md에 있고, Claude Code가 그대로 따른다. 봇 코드에는 위키 로직이 한 줄도 없다.

이게 왜 중요한가? 하네스 엔지니어링의 핵심 원칙과 연결된다:

“에이전트가 실수하면 에이전트가 아니라 하네스를 고쳐라”

봇이 위키 로직을 갖고 있으면, 규칙을 바꿀 때 봇 코드와 CLAUDE.md 두 곳을 고쳐야 한다. 봇을 얇게 유지하면 CLAUDE.md만 고치면 된다. 하네스(CLAUDE.md)가 단일 진실의 근원이 된다.

구현: 생각보다 간단했다

Telegram Bot 생성

BotFather에게 /newbot — 30초면 끝난다. 토큰을 받는다.

봇 코드 (Python, 약 100줄)

핵심은 run_claude 함수 하나다:

async def run_claude(prompt: str) -> str:
    proc = await asyncio.create_subprocess_exec(
        "claude", "-p",
        "--allowedTools", "Read,Write,Edit,Glob,Grep,WebFetch,...",
        cwd=str(WIKI_DIR),
        stdin=asyncio.subprocess.PIPE,
        stdout=asyncio.subprocess.PIPE,
        stderr=asyncio.subprocess.PIPE,
    )
    stdout, stderr = await proc.communicate(input=prompt.encode())
    return stdout.decode().strip()

claude -p는 Claude Code의 비대화형 모드다. stdin으로 프롬프트를 넘기면 stdout으로 결과가 나온다. --allowedTools로 필요한 도구(파일 읽기/쓰기, 웹 가져오기)를 허용한다.

나머지는 Telegram 핸들러를 붙이는 것 뿐:

  • URL이 오면 → “이 URL을 ingest해줘”
  • 텍스트가 오면 → “위키에서 이 질문에 답해줘”
  • 파일이 오면 → raw/에 저장 → “이 파일을 ingest해줘”
  • /lint 명령 → “위키를 lint해줘”

systemd로 상시 운영

.service 파일 하나 만들고 systemctl enable --now — PC가 켜져 있는 한 봇은 항상 살아 있다.

실사용 흐름

출퇴근길에 기사 발견:
Telegram에 URL 붙여넣기 → 봇이 자동 ingest → raw/에 원본 보존 → Atlas/에 요약 페이지 생성 → index.md 업데이트 → log.md 기록

회의 중 떠오른 질문:
Telegram에 “지난 프로젝트 설정이 어떻게 됐더라?” 입력 → 봇이 위키 검색 → 답변 도착

누군가 전달한 정보 기록:
Telegram에 /ingest 김과장이 내일 미팅에서 예산안 가져온다고 함raw/에 보존 → 위키에 통합

삽질 기록

순탄하지만은 않았다. 기록해둔다.

  1. --prompt 옵션은 없다claude --print --prompt "..." 가 아니라 claude -p "..." 이다. prompt는 위치 인수.
  2. --allowedTools와 위치 인수 충돌claude -p --allowedTools "..." "prompt" 에서 prompt가 인식 안 됨. stdin 파이프로 해결.
  3. 비대화형 모드에서 도구 권한-p 모드는 도구 승인 프롬프트를 띄울 수 없다. --allowedTools로 사전 허용 필수.

이런 삽질들이 모두 하네스를 이해하는 과정이었다. 에이전트(Claude)의 문제가 아니라 하네스(호출 방식, 권한 설정)의 문제였고, 하네스를 고치니 해결됐다.

이것이 하네스 엔지니어링인가?

돌이켜보면, 오늘 한 것은 정확히 하네스 엔지니어링이었다:

  • Schema 설계CLAUDE.md에 위키의 규칙과 워크플로우를 정의
  • 입출력 채널 설계 — Telegram Bot으로 원격 접근 경로 구축
  • 도구 권한 설계--allowedTools로 에이전트가 쓸 수 있는 도구 범위 지정
  • 얇은 중계층 — 봇은 로직 없이 메시지만 전달, 모든 판단은 에이전트가

긱뉴스에서 읽었던 그 문장이 떠오른다:

“남이 만든 하네스를 그대로 복사해 쓰는 것은 남의 옷을 입는 것과 비슷하다”

Karpathy의 LLM Wiki 구조를 가져왔지만 그대로 쓰지 않았다. 내 Obsidian vault 구조에 맞추고, Calendar를 raw source로 재정의하고, Telegram 입력 채널을 추가했다. 남의 패턴을 가져와서 내 것으로 만드는 과정 — 그것이 하네스 엔지니어링의 시작이었다.

다음 단계

  • 이미지 ingest 지원 (Telegram 사진 메시지)
  • 긴 응답의 마크다운 포맷팅 개선
  • Obsidian URI 연동 (응답에서 바로 페이지 열기)
  • 주기적 자동 lint

하루 만에 여기까지 온 것이 믿기지 않는다. 대부분의 코드는 Claude가 짰고, 나는 방향을 잡고 결정을 내렸다. 이것도 하네스 엔지니어링의 일부인 것 같다 — 에이전트가 일하는 구조를 설계하는 것이 곧 에이전트와 함께 일하는 방식이니까.

mytube – YouTube로 영어 공부하는 도구를 만들었다

YouTube를 많이 본다. 특히 영어 콘텐츠를 많이 보는데, 자막에 의존하는 습관이 문제라고 느꼈다. 자막 없이 듣다 보면 모르는 단어에서 막혀서 전체 흐름을 놓치고, 그렇다고 매번 사전을 찾자니 귀찮다. 이 문제를 풀어보고 싶었다.

당연히 이런 서비스는 세상에 많을 것이다. 하지만 AI, Agentic Coding, Vibe Coding이 유행하면서 함께 온 말이 있다. Instant App 시대가 올 거라고. 이번에 그 말을 몸으로 느끼게 되었다. 찾아보는 것보다 만드는 것이 빠르다. 더구나 찾는다 해도, 모든 것이 나에게 맞춤형일 수는 없다. 그러니 직접 만들었다. 세세한 부분까지 나에게 맞춤형으로.

mytube라는 이름으로 웹앱을 하나 만들었다. YouTube 영상으로 영어를 공부하는 도구다. 공개하거나 서비스할 목적으로 만들어진 것은 아니다. 철저히 내가 개인적으로 사용할 목적으로 만들었다.

어떻게 동작하는가

기본 아이디어는 간단하다. YouTube 플레이리스트를 동기화하고, 영상의 음성을 AI로 전사(transcribe)해서, 영상을 보면서 모르는 단어를 바로 찾아볼 수 있게 하는 것이다.

mytube 메인 화면
메인 화면 – YouTube 플레이리스트 동기화

Google 계정으로 로그인하면, 내 YouTube 플레이리스트가 동기화된다. Watch Later, Favorites, 커스텀 플레이리스트 등등. 자동 다운로드를 켜 놓으면 15분마다 새 영상을 체크해서 알아서 처리한다.

mytube 플레이리스트 상세
플레이리스트 상세 – 각 영상의 자막 준비 상태가 표시된다

플레이리스트에 들어가면 영상 목록이 보이고, 각각의 자막 준비 상태가 표시된다. “자막 준비됨”, “오디오 준비됨” 같은 식으로. 시청 진행률도 표시된다.

핵심: 영상 + 자막 + 단어 학습

영상을 클릭하면 플레이어 화면이 열린다. 영상 아래에 실시간 자막이 동기화되어 표시된다. YouTube 자체 자막이 아니라, 영상 음성을 ElevenLabs의 AI로 직접 전사한 것이다. 단어 단위의 타임스탬프가 있어서 정확하다.

mytube 영상 플레이어
영상 플레이어 – 실시간 자막이 영상과 동기화된다

자막에서 모르는 단어를 선택하면, Google Gemini AI가 한국어 뜻과 문맥에 맞는 번역을 알려준다. 사전적 뜻 뿐만 아니라 해당 문장의 직역과 의역도 함께 보여준다. 여러 단어를 한꺼번에 선택해서 일괄 분석도 가능하다.

mytube 모르는 단어 목록
모르는 단어 – 어떤 영상에서 어떤 문맥으로 등장했는지 함께 기록된다

이렇게 모은 모르는 단어들은 별도의 목록으로 관리된다. 각 단어가 어떤 영상의 어떤 문장에서 나왔는지 컨텍스트가 남아있어서, 나중에 다시 볼 때 기억이 살아난다. 이미 아는 단어로 표시하면 다음부터 자동으로 필터링된다.

기술 스택

프론트엔드는 Next.js 14 + React + Tailwind CSS, 백엔드는 Prisma + SQLite, 작업 큐는 BullMQ + Redis 조합이다. 영상 음성 추출에 yt-dlp + ffmpeg, 음성 전사에 ElevenLabs Scribe API, 단어 분석에 Google Gemini API를 사용한다.

Docker로 패키징해서 사내 서버의 Coolify에서 호스팅하고 있다. 컨테이너 하나에 Next.js 앱, 백그라운드 워커, Redis가 모두 들어있는 구조다.

mytube 대시보드
대시보드 – 플레이리스트별 오디오 저장 용량

현재 1,499개 영상, 1.5GB 정도의 오디오가 저장되어 있다. 영상을 재생하면 백그라운드에서 자동으로 오디오를 다운로드하고 전사하는데, 보통 몇 분 이내에 완료된다.

다만 ElevenLabs API 가격은 생각보다 돈이 많이 나갔다. 영상이 쌓이면 쌓일수록 전사 비용이 올라간다. 저렴한 대안을 찾아볼 필요가 있다.

처리 파이프라인

영상을 처음 열면 이런 과정을 거친다:

  1. yt-dlp로 YouTube 영상의 오디오를 MP3로 다운로드
  2. ElevenLabs Scribe API로 음성을 텍스트로 전사 (단어 단위 타임스탬프 포함)
  3. 문장과 단어를 DB에 저장
  4. 프론트엔드에서 영상 재생과 자막을 실시간 동기화

이 전체 과정이 BullMQ 작업 큐로 관리되고, 실시간으로 처리 로그가 화면에 표시된다. 실패하면 자동 재시도도 한다.

만드는 과정

Claude Code와 티키타카 하면서 대략 5-6시간 걸린 것 같다. 사실 확인하고, 기다리고, 이 과정의 반복이다. 코드는 단 한 줄도 보지 않았다. 구조나 이런 것도 보지 않았다. 그냥 원하는 결과물만 이야기했다.

솔직히 말하면, 아직 이걸로 영어 실력이 비약적으로 올랐다고 하기는 어렵다. 하지만 예전에는 모르는 단어를 그냥 넘겼다면, 이제는 클릭 한 번으로 뜻을 확인하고 기록이 남는다는 점이 다르다. 단어장이 쌓이는 걸 보면 나름 뿌듯하기도 하다.

기술적으로는, AI 서비스들의 API를 조합해서 뭔가 유용한 걸 만드는 경험이 좋았다. ElevenLabs의 음성 인식 정확도가 꽤 괜찮고, Gemini의 문맥 기반 번역도 생각보다 쓸만하다. 이런 API들이 없었으면 혼자서는 절대 못 만들었을 것이다.

사실 이 블로그 글도 AI가 써줬다.

부서진 Sound Core 헤드폰

부서진 SoundCore 헤드폰
부서진 SoundCore 헤드폰

24년 광군절 행사에서 4-5만원대에 구입했다. 막귀인 내가 들어도 음악 감상용으로는 절대 부족하다고 느꼈다. 하지만 평소 유튜브나 팟캐스트 등 보이스 위주로 듣기 때문에 별 문제가 없었다. 특히 AirPod Pro 가 메인이긴 하지만, 내가 가진 유일한 헤드폰으로 역할을 잘 해주었다. 원래는 책상에서만 썼는데, 점점 욕심이 나서 가방에 가지고 다니기 시작했는데, 몇 주 안되어서 박살이 났다. AirPod Max 가 왜 무겁지만 금속으로 만든지 이해가 갔다.

우버 잇츠의 매출이 우버 보다 더 높아 졌다고

코로나로 인해서, 이동량이 줄어서 우버 승차 공유에 대한 수요는 줄어 들었고, 음식 배달에 대한 수요는 오히려 늘어서, 결과적으로 우버 잇츠의 매출이 우버 보다도 높아지는 결과가 되었다.

우버잇츠는 3년만에 우버가 이룬 성과를 만든 거라고.

메모 : 코로나 사태가 장기화 되면, 이동이 줄고, 배달은 늘고 이 흐름이 언제까지 지속될 것인지가 관건.

ODD 렌터카+원격운전을 이용한 우버

ODD(On Demand Door-to-door) Car 라는 다음과 같이 동작한다.

  1. 우버나 리프트를 호출 하듯이 차를 호출한다.
  2. 빈 차가 우리 집앞에 혼자 온다.
  3. 뒷자리가 아닌 운선석에 앉는다.
  4. 직접 운전해서 목적지까지 간다.
  5. 차에서 내리면 빈차는 떠난다.

이 기술이 동작하기 위해서는 한 가지 기술이 필요하다. 원격 운전. LTE나 5G로 연결되어서 운전자는 원격에서 자동차를 운전하기만 하면 된다.

무슨 의미냐? 현재 우버와 같은 공유차량 서비스는 큰 문제가 있다. 바로 비용의 대부분이 운전자의 인건비라는 것이다. 운전을 고객이 직접 함으로써 비용 절감이 가능하다. 또한 운전자는 항상 운행중인 것이 아니고, 30% 이상의 시간은 길거리에서 손님 잡으러 낭비하고 다닌다. 위 ODDCar 를 이용하면, 이러한 낭비를 줄 일 수도 있다. 우버 대비 반 가격에 서비스 제공이 가능해 진다.

완전자율주행이 오면 이런 거 다 필요 없지 않냐고? 그렇다. 그러나 완전 자욜 주행이라는 것이 언제 올지 모른다. 10년이 될지 그 이상이 될지. 그리고, 대중은 아직 완전 자율주행차에 대한 두려움이 있다. 중간 단계가 필요하다. 또 하나, 당장 완전 자율 주행이 나오더라도 사람 운전자 만큼의 원활한 속도의 원할환 서비스 제공이 불가능하다. 아마도 시장의 반감을 살 수도 있다. 그 보다 먼저 이런 중간 시도가 완전 자율 주행 서비스가 도입되기 전까지는 더 나은 만족도를 줄 수 있다.

메모 : 나는 개인적으로 매우 신박한 아이디어라고 본다. 우리나라 정부, 그리고 5G광고하기 좋아하는 통신사 그리고 현대기아차에서 재빨리 이런 아이디어를 실험해 보기를 희망하지만, 아마도 중국에서 가장 먼저 해 보지 않을까 싶다. (미국은 빨리 시작해도 중국보다 더 빨리 본격적으로 광범위하게 실험하지는 못할것 같다는 느낌) 누가 되었던 빨리 시도해 보기를 기대한다.

어떤 사람은 궁극의 완전한 솔루션으로 바로 가는 것을 좋아하고, 어떤 사람은 아주 안정적인 기존 기술에 머무르기를 좋아하는데, 나는 개인적으로 이렇게 작은 한 발 전진을 매우 좋아하는 편이다.

"아아존 고"의 손바닥 인증 및 결제

아마존이 최근 아마존의 오프라인 매장인 “Amazon Go” 에서 사용할 수 있는 손바닥 인증 및 결제 솔루션을 선보였다. 이름하여 Amazon One 솔루션 향후 스타디움이나 다른 보안 시설에도 확장할 계획이라고. 그리고 홀푸드마켓까지.

손바닥을 선택한 이유는 보안. 얼굴(홍채, 지문 마찬가지)에 대한 정보를 아이존 서버에 보관하고 있는 것이 좀 찝찝하고, 그 다음부터 나쁜 마음으로 어디서든 스캔하면 나 몰래 추적이 되지 않나 두려움이 생기는데, 손바닥은 주먹을 펴서 명시적인 행동을 해야 스캔이 가능하고, 노출이 부담이 적은 데이타라 선택한 것이라고 한다. 그리고, 지문 인식과 달리 접촉이 필요 없는 것도 코로나 시절에 장점.

서드파티에게도 제공해 줄 예정인데, 일반 빌딩 출입 관리, 매장 관리 등에서도 사용할 수 있도록 할 예정. Amazon One 계정은 아마존 계정이 없어도 핸드폰이나 신용카드만 있으면 등록 가능하다고.

메모 : 중국이 얼굴인식을 통한 디바이스 없는 결제를 시도할 때만 해도, 중국이니깐 저러지라고 생각했다. 그런데 아마존이 좀 더 세계가 받아들일 수 있는 수준으로 디바이스 없는 생체정보만의 결제 그리고 개인인증까지 시도하니깐, 아 이제는 받아들일때가 왔구나 싶다.

K팝, K드라마, K방역까지 우리가 한참 앞서 나간다는 생각이 들다가도, 이런 부분은 전혀 진척이 없네.

보물 찾기

코로나로 경제가 어려워 지자, 보석상을 하던 존은 자신의 매장에 있던 모든 보석을 땅에 묻어 버렸다. 그리고, 지도를 만들고, 보물찾기 서비스를 만들었다 총 1.4 m (20억원) 정도. 참가비를 내면, 지도를 받게 되고, 문제를 플면 보석의 위치를 알 수 있다. via Cassandra Daily

메모 : 국내에서는 사행성이라 흉내내기는 어려울 듯. 어설프게 따라했다가 관련법에 저촉될 가능성 매우 높음.