Codex Account Switcher 개발로그 · 1화
Codex·Claude 계정 다섯 개 중 지금 쓸 계정을 골라 주는 한도 전략 탭을 붙였다: 5시간 창 하나가 주간 22%였다
메뉴바 계정 전환 앱 Codex Account Switcher에 세 번째 탭 한도 전략을 붙였다. 계정마다 주간 한도와 초기화 시각, 초기화권, Claude의 5시간 한도까지 계산해 지금 쓸 계정과 늦어도 언제부터 써야 하는지 알려 준다. Claude는 초기화 시각을 남기지 않아 15분 간격 사용률 기록에서 거꾸로 추정했다.
Codex Account Switcher는 맥 메뉴바에서 ChatGPT·Codex 계정을 골라 바꿔 주는 앱이다. 8월에 처음 공개했고, 9월 29일에는 Claude 앱의 Code 세션을 다른 계정으로 가져오는 Claude 탭을 붙였다. 공식 앱은 고치지 않고 인증만 바꾼다.
계정이 늘자 다른 고민이 생겼다. 지금 등록된 계정은 Claude 두 개, Codex 세 개다. 계정마다 주간 한도가 초기화되는 요일과 시각이 다르고, 초기화 전에 다 쓰지 못한 한도는 그냥 사라진다. Claude는 주간 한도와 별개로 5시간 한도도 있다. 그래서 10월 1일 오전 10시 19분에 이렇게 부탁했다. 등록된 계정별로 남은 한도, 초기화 시각, 초기화권까지 다 따져서 지금 어느 계정을 쓰는 게 유리한지, 언제까지 다 써야 하는지, Claude는 5시간 한도까지 계산해서 알려 줄 수 있을까.
8분 뒤 팝오버에 세 번째 탭 한도 전략이 생겼다
10시 27분에 첫 버전이 설치됐다. 메뉴바 아이콘을 누르면 뜨는 팝오버의 탭이 Codex, Claude 둘에서 한도 전략까지 셋이 됐다. 새 파일은 넷이다. 계산을 맡는 QuotaPlanner, Claude 사용 기록을 읽는 ClaudeQuotaHistory, 두 서비스의 값을 같은 모양으로 바꾸는 QuotaSnapshots, 그리고 화면이다. 이 탭은 네트워크 요청을 새로 하지 않는다. 다른 탭이 이미 조회한 값만 쓴다.
맨 위에는 서비스마다 “지금은 이 계정을 쓰라”는 카드가 하나씩 있다. 주간 한도가 남아 있고 지금 바로 쓸 수 있는 계정 가운데 마감이 가장 급한 계정을 고른다. 모든 계정이 바닥났으면 가장 먼저 풀리는 계정과 그 시각을 보여 준다. 그 아래에 계정이 마감 급한 순서로 줄을 선다. 계정마다 주간 잔량, 초기화 시각과 남은 시간, 하루에 써야 하는 양, 초기화권이 나온다.
Claude의 초기화 시각은 15분마다 남는 사용률 기록에서 거꾸로 계산했다
Codex는 서버가 초기화 시각을 알려 준다. Claude는 아니었다. Claude 앱은 사용률(%)만 15분 간격으로 파일에 남기고 초기화 시각은 어디에도 저장하지 않는다.
그래서 기록에서 거꾸로 셌다. 주간 사용률이 뚝 떨어진 시점들을 모아 7일 주기에 가장 잘 맞는 시점을 찾고, 거기에 7일씩 더해 다음 초기화를 잡는다. 9월 29일 새벽 3시 25분처럼 주기에서 벗어난 초기화는 정기 주기 계산에서 뺐다. 5시간 한도는 지금 창을 처음 쓴 기록 시각에 5시간을 더한다. 기록 간격 때문에 오차는 15분 안팎이고, 화면에는 늘 “(추정)“을 붙인다. 초기화를 한 번도 본 적 없는 계정은 “초기화 시각 미확인”으로 둔다. 10월 1일에는 두 번째 Claude 계정이 그랬는데, 첫 초기화가 지나자 10월 9일(금) 4시 40분으로 잡혔다.
5시간 창 하나가 주간 몇 %인지 알자 늦어도 언제 시작해야 하는지가 나왔다
Claude에서 중요한 숫자는 남은 주간 %가 아니었다. 5시간 창 하나를 끝까지 쓰면 주간 한도가 몇 % 줄어드는지다. 이것도 기록에서 계산한다. Max 20x 계정은 창 하나가 주간의 약 22%였다.
10월 1일 오전 그 계정은 주간 78%가 남았고 다음 초기화는 10월 6일(화) 20시 3분으로 추정됐다. 78%를 다 쓰려면 5시간 창이 4개 더 필요하다. 창은 5시간마다 하나씩만 열리니, 늦어도 10월 6일 새벽 4시 3분부터는 5시간마다 이어서 써야 다 쓴다. 남은 78%만 보면 넉넉해 보이지만 실제로는 시작 시각이 정해져 있었다. 지금부터 쉬지 않고 써도 남는 양이 있으면 “X%는 못 씀”을 빨간색으로 띄우고 그 계정을 맨 앞으로 올린다.
Codex는 5시간 제약을 계산하지 않는 대신 초기화권을 본다. 초기화권이 주간 초기화보다 먼저 만료되면 마감을 만료 시각으로 당기고, 그 전에 주간 한도를 다 쓴 뒤 초기화권을 쓰라고 표시한다. 테스트 11개를 새로 넣어 초기화가 빠른 계정을 먼저 추천하는지, 5시간 제한 때문에 못 쓰는 양을 맞게 계산하는지, 초기화권 만료가 마감을 앞당기는지 확인했다.
첫 화면은 어느 계정인지 알아볼 수 없었고 한도도 두 군데가 틀렸다
12시 37분에 화면을 보고 말했다. 이렇게 나오는데 뭘 알아볼 수가 있냐, 별명이라도 적어 넣을까. 계정이 전부 w***@gmail.com처럼 가린 이메일로만 나왔고, 지금 로그인된 Claude 계정은 이메일도 없이 계정 번호로만 나왔다. 별명 기능을 넣었다. Claude 계정은 이름 옆 연필 버튼으로, Codex 계정은 메뉴의 “별명 바꾸기”로 붙인다. 별명이 크게, 가린 이메일이 그 아래 작게 나온다.
5분 뒤에는 한도도 안 맞는 것 같다고 했다. 버그가 두 개였다.
- 첫 줄의 “5시간 0%“는 지난 기록이었다. 그 계정을 마지막으로 쓴 9월 30일 새벽, 5시간 한도를 다 쓴 상태가 그대로 남아 있었다. 그 5시간은 이미 지났다. 이제는 마지막 기록 뒤에 초기화 시각이 지났으면 다시 찬 값을 보여 준다.
- 둘째 줄은 실제 계정이 아니었다. 계정을 바꿀 때 Claude 앱이 이전 계정 아래에 세션 없는 빈 폴더를 하나 만들어 둔다. 한도 기록은 계정이 아니라 조직 단위로 남아서, 지금 계정의 한도가 이전 계정의 이름을 달고 한 번 더 나왔다. 세션이 하나도 없는 빈 폴더는 목록에서 뺐다.
13시 13분에는 Claude 계정이 왜 하나밖에 없느냐고 물었다. 두 개가 다 나와 있었는데, 하나는 맨 위 “현재 계정” 칸에 있어서 하나처럼 보였다. 스위처는 이 맥의 Claude 앱이 남긴 파일로만 계정을 안다. 다른 맥이나 웹에서만 쓴 계정은 보이지 않는다. 마지막으로 “이걸 좀 길게 빼 봐”라고 했다. 계정 목록이 팝오버 안에서 한 줄 남짓으로 접혀 있었다. 계정 수로 높이를 짐작해 넣었더니 아래가 비어서, 실제 목록 높이를 재서 맞췄다. 이제 다섯 계정이 스크롤 없이 한 번에 보인다. 테스트는 74개가 됐다.
10월 3일 밤 공개 저장소에 올리기 전에 계정이 드러날 만한 것부터 지웠다
이틀 동안 써 보니 문제가 없어서, 10월 3일 밤 11시 52분에 GitHub에 올리자고 했다. 이 저장소는 공개라서 조건을 붙였다. 계정이나 키가 하나도 드러나지 않게.
올리기 전에 새 코드와 커밋 메시지를 훑었다. API 키나 토큰 형태의 문자열, 실제 계정과 조직 ID, 이메일, 내 컴퓨터의 경로, 계정 별명은 하나도 없었다. 실제 계정 ID가 적힌 인수인계 메모는 원래 git에서 제외되는 파일이다. 테스트 예시에 들어 있던 가린 이메일은 u***@example.com으로 바꿨다. 새 커밋 다섯 개의 작성자 이메일도 GitHub가 주는 비공개 주소로 바꾼 뒤, 테스트 74개를 다시 통과시키고 올렸다.
배운 것
한도는 남은 양을 보여 주는 게이지가 아니라 마감이 있는 일정이었다. 주간 한도는 쓰지 않으면 사라지고, Claude는 5시간마다 한 칸씩만 쓸 수 있다. 그래서 같은 78%라도 언제 초기화되는지, 5시간 창 하나가 몇 %인지에 따라 지금 써야 할 계정이 달라졌다.
모르는 값은 추정이라고 적어야 했다. Claude 앱은 초기화 시각을 남기지 않아서 15분 간격 기록으로 거꾸로 셌다. 그 값에는 “(추정)“을, 한 번도 초기화를 보지 못한 계정에는 “미확인”을 붙였다. 첫 화면에서 한도가 틀렸던 것도 결국 오래된 기록을 지금 값처럼 보여 줬기 때문이었다.