Claude Code는 Anthropic의 코딩 에이전트입니다. Claude 앱과 같은 Claude 모델로 돌지만 내 기계에서 돌기 때문에, 파일을 읽고 셸 명령을 실행하고 코드를 고칠 수 있습니다. Claude 유료 플랜에 딸려 나오고요. 저는 VS Code 확장이나 데스크톱 앱이 아니라 터미널에서 씁니다. 노트북의 tmux 세션 하나 안에 세션 다섯 개를 띄워 두고, 거의 전부 권한 확인을 끈 채로 시작하며, 폰에서는 Claude 앱의 Remote Control, SSH, 또는 채팅 봇으로 닿습니다.
아래는 그 셋업을 기억이 아니라 제 기계에서 나온 숫자로 자세히 적은 것입니다. 설정 파일들, Claude Code가 ~/.claude/projects 아래에 남기는 세션 기록(제 것은 8월 28일부터 있습니다), 그리고 2월부터 쌓여 프롬프트 7,323개가 들어 있는 프롬프트 기록이 출처입니다.
Claude와 Claude Code는 다른 물건입니다#
Claude는 모델 계열이자, 그 모델과 대화하는 채팅 앱입니다. claude.ai에도, 데스크톱에도, 폰에도 있죠. Claude Code는 그 모델 위에 만든 에이전트입니다. 프로젝트 폴더에서 시작하면 그 자리에서 루프를 돌며 파일을 읽고, 명령을 실행하고, 코드를 고치고, 테스트를 돌립니다. 일이 끝나거나 제가 필요해질 때까지요. Claude에게 뭔가 고치는 법을 물으면 답을 받습니다. Claude Code에게 물으면 고친 결과와, 읽어 볼 diff를 받습니다.
저는 둘 다 씁니다. 제가 만드는 마켓플레이스 겸 커뮤니티 앱은 10월 18일부터 Django 백엔드에서 번역을 Claude API로 바로 보내고 있는데, 그렇게 바꾼 변경도 Claude Code 세션에서 만들었습니다. 제 세션 기록에서 답변의 94%는 Opus 5.5가 했고, 설정의 effort 레벨은 high입니다.
네이티브 설치 프로그램은 한 줄이고, 알아서 최신 상태를 유지합니다.
curl -fsSL https://claude.ai/install.sh | bash설치하면 ~/.local/bin에 ~/.local/share/claude/versions/ 안을 가리키는 claude 심볼릭 링크가 생깁니다. 제 것은 10월 21일에 혼자서 2.1.305에서 2.1.306으로 올라갔습니다. Claude Code를 쓰려면 Claude 유료 플랜(Pro, Max, Team, Enterprise)이나 API 계정이 필요합니다. 가격은 꽤 자주 바뀌니 Anthropic 가격 페이지에 맡기겠습니다.
tmux 세션 하나, 창 일곱 개#
이 글을 쓰는 지금 tmux list-panes -a를 치면 노트북에 main이라는 세션 하나가 있고, 창이 일곱 개입니다. 그중 다섯 개가 Claude Code로, 프로젝트마다 하나씩입니다. 제 마켓플레이스 앱과 견적 앱(둘 다 지금 쓰는 스택에서 소개했습니다), 이 블로그, 그리고 자잘한 것 두 개요. 터미널 프로필은 모든 창을 main에 붙는 로그인 셸로 엽니다. 그래서 노트북에서 새 탭을 열든 폰에서 SSH로 로그인하든 같은 세션에 도착합니다.
9월 17일부터 10월 8일까지는 다른 멀티플렉서를 써 봤는데, 현실적인 이유로 tmux로 돌아왔습니다. 폰에서 쓰는 SSH 앱이 tmux로 멀티플렉싱하고, 단축 버튼도 tmux 기본 키를 보내거든요. ~/.tmux.conf의 이런 줄들은 폰 때문에 있습니다.
set -g prefix C-a # Ctrl-a prefix
set -g prefix2 C-b # stock Ctrl-b too, for apps that send it
# Size each window to the client that used it last, not the smallest one,
# so a phone attached to the same session doesn't shrink it.
setw -g window-size latest
# Copy to the clipboard of whichever terminal is attached (OSC 52),
# so over SSH it lands on the phone's clipboard too.
set -g set-clipboard ontmux 안에서는 두 가지가 달라집니다. Claude Code는 실행 중인 명령을 Ctrl+B로 백그라운드에 보내는데, 이게 이제 제 두 번째 tmux prefix입니다. 그래서 ~/.claude/keybindings.json에서 그걸 끄고 대신 Meta+B를 씁니다.
{
"bindings": [
{ "context": "Global", "bindings": { "ctrl+b": null } },
{ "context": "Task", "bindings": { "ctrl+b": null, "meta+b": "task:background" } }
]
}다른 하나는 줄바꿈입니다. Enter는 프롬프트를 보냅니다. 문서는 어느 터미널에서나 되는 방법으로 \ 다음 Enter, 그리고 Ctrl+J 두 가지를 듭니다. Option+Enter는 터미널이 Option을 Meta로 보내도록 설정하면 되고, Shift+Enter는 일부 터미널에서는 그냥 되지만 tmux는 extended-keys가 켜져 있을 때만 그걸 넘겨줍니다. 제 건 꺼져 있어서, 제 세션에서는 Shift+Enter를 누르면 프롬프트가 보내져 버립니다. 사실 어느 것도 쓸 일이 별로 없습니다. 프롬프트 7,323개 중 제가 직접 친 줄바꿈이 들어간 건 84개이고, 붙여넣기가 들어간 건 279개입니다. 붙여넣은 내용은 Claude Code가 [Pasted text #1 +34 lines] 같은 자리표시자로 접어 두고, 보낼 때는 전부 보냅니다.
터미널, VS Code 확장, 데스크톱 앱 중 무엇을?#
같은 에이전트가 몇 가지 포장으로 나오고, 모두 같은 설정 파일을 읽습니다. Claude Code가 세션 기록마다 남기는 진입점을 기준으로 보면 제 세션은 이렇게 나뉩니다.
| 형태 | 무엇인가 | 제 사용량, 8월 28일~10월 21일 |
|---|---|---|
| 터미널의 CLI | 터미널에서, tmux 안에서 실행하는 claude | 세션 128개 |
| 데스크톱 앱의 Code 탭 | Claude 앱 안의 Claude Code, diff 뷰와 패널이 있음 | 세션 2개 |
| VS Code 확장 | 에디터 안의 채팅 패널 | 없음. 지금은 설치돼 있지 않고 설정만 남아 있습니다 |
| Claude 앱과 claude.ai/code | 노트북에서 도는 세션을 조종하거나, 클라우드에서 세션을 돌림 | 10월 이후 대부분의 세션, Remote Control로 |
제 답은 터미널이고, 의리 때문은 아닙니다. 폰이 붙는 tmux가 터미널을 필요로 하고, 외부 이벤트를 세션으로 밀어 넣는 channels도 그렇습니다. 문서에 CLI 기능으로 나와 있거든요.
Claude Code에 git이 필요하냐는 질문도 받습니다. CLI는 필요 없습니다. 제 홈 디렉터리는 저장소가 아닌데, 제 프롬프트 중 208개가 거기서 시작한 세션으로 갔습니다. 데스크톱 앱 문서에는 세션마다 자기 worktree를 받는 세션 격리에 git이 필요하다고 나와 있고, 클라우드 세션을 터미널로 끌어오려면 같은 저장소의 체크아웃이 있어야 합니다. 저는 “Git is required for local sessions” 메시지를 직접 본 적이 없습니다. 10월 20일에 쓴 마지막 데스크톱 세션은 아예 저장소가 아닌 폴더에서 돌았습니다.
권한 모드, 그리고 제가 실제로 쓰는 것#
권한 모드는 Claude Code가 얼마나 자주 멈춰서 물어볼지를 정하고, Shift+Tab으로 모드를 차례로 바꿉니다. Manual(default)은 파일을 고치거나 명령을 실행하거나 네트워크에 접근하는 대부분의 동작 전에 묻습니다. acceptEdits는 파일 수정과 흔한 파일시스템 명령은 통과시킵니다. plan은 읽고 제안만 할 뿐 고치지 않습니다. auto는 두 번째 모델, 즉 분류기가 위험한 동작을 사람에게 묻는 대신 막아 줍니다. bypassPermissions는 거의 아무것도 묻지 않습니다. 버전 2.1.283부터는 따로 지정하지 않으면 터미널 세션이 auto 모드로 시작합니다.
그래서 “Claude Code를 권한 확인 없이 돌리려면 어떻게 하나요"에 대한 제 솔직한 답은, 이렇게 시작한다는 겁니다.
claude --dangerously-skip-permissions셸 기록에 남은 claude 명령 69개 중 62개에 이 플래그가 붙어 있고, 지금 돌고 있는 세션 다섯 개도 전부 그렇습니다. 8월 28일부터 10월 21일까지 제가 입력한 프롬프트 1,266개 중 1,179개는 bypass 모드 세션으로, 82개는 auto 모드로, 5개는 Manual이나 accept-edits로 갔습니다.
문서는 bypass 모드가 “인터넷 접근이 없는 컨테이너, VM, dev 컨테이너처럼 Claude Code가 호스트 시스템을 망가뜨릴 수 없는 격리된 환경"을 위한 것이라고 분명히 말합니다. 제 노트북은 그 어디에도 해당하지 않고, 제 설정에는 그 경고를 클릭해서 넘겼다는 기록까지 남아 있습니다("skipDangerousModePermissionPrompt": true). 같은 길을 가신다면 이건 알아 두세요. bypass 모드에서는 allow 규칙이 아무 효과가 없습니다. 그래서 제 평소 세션에서는 설정 파일 19개에 흩어진 allow 규칙 378개가 하는 일이 전혀 없습니다. deny와 ask 규칙은 여전히 적용되는데, 저는 둘 다 하나도 없습니다.
예외는 다른 사람이 쓴 글을 읽는 세션입니다. 이 세션의 런처는 그 플래그를 넘기지 않아서 auto 모드로 시작합니다. 10월 12일부터 20일 사이에 세션에 도착한 프로덕션 이벤트 27개 전부와 채팅 메시지 43개 중 42개가 auto 모드에서 들어왔고, bypass 모드에서 들어온 건 하나도 없었습니다.
bypass 모드에 실제로 물리지 않게 해 주는 건 몇 가지 습관입니다. 일이 한 번씩 틀어진 뒤에 Claude 메모리에 적어 둔 것들이죠. 9월 10일, 세션 여러 개가 마켓플레이스 앱의 같은 체크아웃에서 작업하던 중에 한 줄짜리 수정이 빌드 실패 네 번을 버텨 놓고는 커밋되기 전에 사라졌습니다. 다른 세션이 그 파일을 덮어썼고, git에는 아무 기록도 없었습니다. 같은 날 배포 하나가 어떤 세션의 커밋 안 된 작업을 내보낼 뻔했습니다. 배포 스크립트가 HEAD가 아니라 작업 트리를 빌드하기 때문이었죠. 그 뒤로 규칙은 이렇습니다. 작은 수정은 동작하는 순간 커밋한다. 파일은 이름으로 스테이징하고 git add -A는 절대 쓰지 않는다. git status에서 내가 만들지 않은 변경을 살핀다. main에 다른 세션의 배포 안 된 작업이 있으면, 지금 라이브인 커밋으로 worktree를 만들어 거기서 배포한다.
폰에서 닿기#
들어가는 길은 세 가지이고, 각각 닿는 곳이 다릅니다.
| 들어가는 길 | 폰에서 얻는 것 | 무엇으로 돌아가는지 |
|---|---|---|
| Claude 앱의 Remote Control | 세션 하나의 대화: 입력하고, 질문에 답하고, 사진을 첨부 | remoteControlAtStartup: true, 그리고 푸시 알림 |
폰의 SSH 앱으로 main에 SSH | 터미널 그 자체, 모든 창 | 사설 네트워크, 제 사용자로 도는 sshd, 그리고 붙이는 데 쓰는 짧은 alias |
| 채팅 봇 | 프로덕션 오류를 듣고 메시지에 답하는 세션 | Claude Code 공식 채널 플러그인과 제가 만든 이벤트 채널 |
Remote Control은 폰의 Claude 앱이나 브라우저의 claude.ai/code를 노트북에서 계속 돌고 있는 세션에 연결합니다. 파일, 도구, MCP 서버까지 그대로요. 9월 13일부터 10월 20일 사이에 /rc를 26번 쳤습니다. 지금은 remoteControlAtStartup이 켜져 있어서 새 세션이 알아서 연결됩니다. 10월 초부터 제가 시작한 세션 77개 중 67개에 Remote Control 링크가 있었는데, 9월 후반에는 52개 중 3개였습니다. agentPushNotifEnabled를 켜 두면 Claude가 필요하다고 판단할 때 푸시 알림을 보낼 수 있습니다. 문서에 따르면 보통 긴 작업이 끝났거나 결정이 필요할 때입니다. API 키가 아니라 claude.ai 구독이 있어야 하고, 세션이 노트북에서 도니 노트북이 깨어 있어야 합니다. 10월 15일부터 제 노트북은 덮개를 닫아도 잠들지 않습니다(sudo pmset -a disablesleep 1).
반대 방향도 됩니다. /teleport나 claude --teleport는 웹이나 앱에서 시작한 클라우드 세션을 브랜치와 대화째 터미널로 끌어옵니다. 저는 두 번 해 봤고, 둘 다 7월이었습니다.
SSH는 터미널 그 자체가 필요할 때 씁니다. 폰은 사설 네트워크 글에서 다룬 사설 네트워크를 거쳐 노트북에 닿고, alias 하나가 main에 붙여 주니 노트북에 열어 둔 창들 사이를 스와이프로 오갈 수 있습니다. Mac이 폰 앱에 제대로 답하게 만드는 데는 서로 다른 수정이 네 번 들었는데, Claude Code와 관련해 중요한 건 tmux가 절대 저절로 시작돼서는 안 된다는 점입니다. docker ps를 돌리려고 세션을 연 앱이 결과 대신 72 KB짜리 화면 다시 그리기를 돌려받았거든요.
채팅 봇은 앉아서 지켜보고 싶지 않은 세션용입니다. 10월 12일부터 세션 하나가 제가 만든 작은 채널을 달고 돌고 있습니다. 이 채널은 1분에 한 번 앱 서버에서 새 프로덕션 오류와 프로젝트 보드 활동을 확인해 세션에 넘깁니다. 여기에 공식 채팅 플러그인 하나도 붙어 있어서, allowlist에 있는 저희 두 사람이 세션에 메시지를 보낼 수 있습니다. 실행 줄은 이름만 일반적으로 바꾸면 이렇습니다.
exec claude \
--channels plugin:<chat-plugin>@claude-plugins-official \
--dangerously-load-development-channels server:my-events "$@"슈퍼바이저 스크립트가 tmux 안에서 이 세션을 계속 살려 둡니다. 재시작하면 같은 대화를 이어 가니, 세션이 백지 상태로 깨어나는 게 아니라 하던 일을 계속하고, 재시작할 때마다 채팅에 알립니다. 이 세션은 작업 트리에서 고치는 데까지만 하고 멈춥니다. 예외가 하나 있는데, 10월 13일에 추가했습니다. 프로덕션에서 실제로 사용자에게 피해를 주고 있는 버그라면 고치고, 테스트하고, 커밋하고, 배포한 다음 무엇을 했는지 저희에게 알려도 됩니다.
스킬, 메모리, 그리고 /goal#
제 설정 파일 어디에도 hooks 키는 없습니다. 가장 가까운 건 /goal로, 7월 11일부터 279번 썼습니다. 조건을 하나 받아서 그 세션에 Stop hook을 거는데, Claude Code의 표현을 빌리면 이 hook은 “will block stopping until the condition holds”(조건이 충족될 때까지 멈추지 못하게 막는다)입니다. 제 goal은 제가 소리 내어 말하는 그대로 적혀 있습니다. 7월에 실제로 쓴 것 하나는 오타까지 그대로 옮기면 빌드가 “still broken, try a deeper fix and dont stop until”(아직도 안 돼, 더 근본적으로 고치고 ~까지 멈추지 마) 테스터에게 나갈 때까지라고 했습니다. 긴 실행을 방해하지 않고 상황을 보고 싶을 땐 /btw가 있습니다. 대화에 섞이지 않는 곁가지 질문이죠. 제 건 대부분 “hows it going?"(잘 돼 가?)의 변주입니다.
스킬에는 그게 없었으면 매번 설명했을 것들이 들어 있습니다. 사용자 레벨 스킬 하나는 이 블로그를 포함해 제가 관리하는 사이트들의 주간 키워드 보고서를 읽고, 그 내용을 제목, 설명, 태그에 반영합니다. 이 글이 답하는 질문들도 이 스킬이 10월 18일자로 낸 이 블로그의 보고서에서 왔고, 스킬 파일은 저장소에서 코드와 함께 버전 관리됩니다. 마켓플레이스 앱 저장소에도 자체 스킬이 있습니다. 하나는 Docker에서 API를 띄우고 스모크 테스트를 돌리고, 하나는 프로젝트 보드를 다루고, 하나는 회사 경비를 처리합니다. 설치해 둔 플러그인 두 개는 Swift 언어 서버 플러그인과 그 채팅 플러그인입니다.
메모리는 교훈이 쌓이는 곳입니다. 프로젝트 17개에 걸쳐 메모리 파일이 160개 있고, 그중 83개가 마켓플레이스 앱 것이며, 상당수가 뭔가 고장 났던 이야기입니다. 앱의 CLAUDE.md는 이제 6월보다 여섯 배쯤 길어졌습니다. 이 블로그의 CLAUDE.md는 빈 파일입니다. 글이 어떤 목소리여야 하는지는 그 대신 메모리 파일에 들어 있습니다.
큰 일에는 Claude가 서브에이전트를 띄웁니다. 제 메인 세션에서 120번이었고, 그중 40번은 대화를 포크한 것이었습니다. 이 블로그의 일본어, 한국어, 중국어, 베트남어 버전도 그렇게 만들어집니다. 10월 19일과 20일에는 앱 커뮤니티 섹션의 리디자인이 Workflow 도구를 네 번 거쳤습니다. 일곱 가지 관점과 비평가 하나로 감사를 돌려 발견 사항 약 58개를 확정했고, 각자 자기 파일을 맡은 다섯 그룹이 수정한 뒤 그룹마다 리뷰를 받았고, 남은 것들을 한 번 더 훑었고, 마지막으로 모든 발견 사항이 고쳐졌는지 독립적으로 확인했습니다. 리디자인은 20일에 배포됐습니다.
devbox가 들어오는 자리#
사설 네트워크 글은 무거운 일을 GPU가 달린 사무실 워크스테이션 devbox에 맡기고, 어디서든 거기에 닿는 이야기입니다. 그 닿는 일은 대부분 Claude Code가 합니다. 9월 24일부터 10월 19일까지 노트북의 세션 21개가 평범한 ssh로 devbox에서 명령 1,470개를 실행했습니다. 거기서 도는 클러스터에 kubectl을 날리고, 데이터베이스 pod 안에서 psql을 돌리고, 긴 작업이 어떻게 돼 가는지 보려고 tmux capture-pane을 쓰는 식이죠. ssh devbox는 사무실 네트워크 밖에서는 터널로 넘어가니, 같은 세션이 사무실에서도, 집에서도, 카페에서도 동작합니다. 게다가 노트북이 이제 잠들지 않으니, 세션이 devbox를 계속 부리는 동안 저는 폰으로 들여다보면 됩니다.
Claude Code냐 Codex냐?#
Claude Code가 Codex보다 나은지는 제 사용 경험으로는 말씀드릴 수 없습니다. 이유는 표를 보시면 압니다.
| Codex | Claude Code | |
|---|---|---|
| 언제 | 2025년 11월 29일~12월 4일 | 적어도 2025년 11월부터. 프롬프트 기록은 2026년 2월부터 |
| 어디서 | VS Code 확장 | 터미널(세션 128개), 데스크톱 앱(2개) |
| 모델과 effort | gpt-5.1-codex, medium | Opus 5.5, high |
| 승인 | workspace-write 샌드박스, 네트워크 꺼짐, 요청 시 확인 | 프롬프트의 93%가 bypass, 채팅 세션은 auto |
| 사용량 | 스레드 4개 | 2월부터 프롬프트 7,323개 |
| 프로젝트 노트 | AGENTS.md를 읽음 | CLAUDE.md와 메모리 파일을 읽음 |
이미지 질문 하나, 웹사이트 수정 두 건, 3D 장면 하나에 쓴 일주일간의 스레드 네 개는 비교가 아니라 맛보기입니다. 그래도 거기서 나온 한 가지는 에이전트를 갈아타는 누구에게나 해당됩니다. 그 3D 프로젝트는 규칙을 claude.md에 두고 있었고, 거기서 Codex에게 던진 첫 질문은 대화를 시작하기 전에 Claude의 파일을 읽느냐는 것이었습니다. 읽지 않는다고 했고, 제가 그 파일을 읽으라고 시키고 나서야 프로젝트 규칙을 파악했습니다. 어느 에이전트로 옮기든, 지시 파일은 직접 챙겨 가지 않으면 그 자리에 남습니다. 그 뒤로 Codex 스레드는 열지 않았습니다. 9월 24일부터 10월 4일 사이 며칠은 제가 아무것도 시작하지 않았는데도 확장이 VS Code에서 로드됐고, 지금은 제거했습니다.
그러니 제가 책임질 수 있는 결론은 좁습니다. 제 셋업은 Claude Code를 중심으로 짜여 있고, Codex가 지금 같은 일을 어떻게 처리하는지는 다시 확인해 보지 않았습니다.
마지막 숫자 하나가 위의 어떤 내용보다 제가 이걸 어떻게 쓰는지 잘 보여 줍니다. 8월 말부터 노트북의 메인 세션에서 Claude Code는 셸 명령을 18,311개 실행했고, 파일을 읽거나 쓰거나 고친 건 2,331번이었습니다. 횟수로 보면 일의 대부분은 원래 제가 쳤을 명령을 대신 실행하는 것입니다. 노트북에서도, SSH 너머에서도, 제가 어디에 있든요. 정작 코드를 쓸 때는 그 코드가 어디서나 환영받지는 않는데, 그건 pyhtml2text 글에서 따로 풀어 둔 이야기입니다.
