작업 기간: 2026.08.17–10.11
Codex, Grok, Claude의 남은 사용량을 확인하려고 서비스마다 화면을 여는 게 번거로웠어요. 그래서 2026년 8월 17일 Mac 메뉴 막대에 Codex의 남은 퍼센트를 보여주는 CodexTime을 만들었어요. 지금은 세 서비스를 함께 보여주고 Windows와 iPhone 앱·위젯까지 이어졌어요.
이 글은 10월 10일부터 10월 11일까지 iPhone에서 세 계정을 연결하는 화면을 다듬은 기록이에요. 저는 방향과 화면 문구를 정하고 제 계정으로 확인했고, 구현은 AI 코딩 도구 Codex가 맡았어요. 컴퓨터 없이 연결하려면, 그리고 방식이 다른 세 서비스를 헷갈리지 않게 하려면 화면에 무엇이 있어야 할까요?

Mac의 숫자를 넘겨받는 대신 아이폰에서 직접 받기로 했어요
목표는 컴퓨터를 켜두지 않고 아이폰에서 본인 계정을 각각 연결해 사용량을 보는 것이었어요. 처음에는 Mac이 이미 읽고 있는 숫자를 iCloud 데이터베이스에 올리고 앱이 그것을 받아 쓰는 구성을 먼저 만들었어요. 10월 10일에 Mac과 iPhone 양쪽 코드를 만들고 자동 테스트까지 통과시켰어요.
만들어 보니 이 구성은 확장성이 너무 떨어졌어요. Mac이 있고 켜져 있는 사람만 쓸 수 있고, 숫자가 늘 Mac과 iCloud를 거쳐야 해서 범용적이지도 않았어요. 배포용 빌드도 iCloud 권한 설정에서 막혔지만, 그보다 아이폰이 직접 인증해서 정보를 받아야 한다고 판단해 중계를 접었어요.

처음에는 사용자가 숫자를 직접 짚게 했어요
아이폰 단독의 첫 방법은 수동 확인이었어요. 10월 10일 빌드13에서 공식 웹을 앱 안에서 열고, 사용자가 직접 로그인한 화면에서 숫자를 읽게 했어요. 이때 앱은 웹 문구만 보고 숫자의 뜻을 짐작하지 않았어요.
대신 사용자가 먼저 ‘사용함’인지 ‘남음’인지, 어느 한도인지 고르고 ‘숫자 읽기’를 누른 뒤 15초 안에 그 퍼센트를 한 번 탭해요. 저장하는 것은 퍼센트와 뜻, 한도, 확인 시각뿐이고 카드에는 수동 확인 표시와 시각을 붙여요. 1시간이 지나면 지난 확인으로 구분해요.
같은 날 화면을 세 번 더 고쳤어요. 긴 안내와 설정이 로그인 화면을 가린다고 제가 알리자, 빌드14에서 안내는 ‘더 보기’로, 설정은 ‘읽기 설정’ 시트로 옮기고 아래 조작을 한 줄로 줄였어요.
빌드15에서는 Claude의 Google 로그인이 앱 안 웹에서 제한되는 경우를 안내로 막고 이메일 로그인과 뒤로·새로고침을 남겼어요. 빌드16에서는 ‘사용량 읽기’ 한 번으로 Claude의 세션과 주간을 함께 읽되, 두 숫자가 모두 확인될 때만 저장하게 했어요.
그래도 한계가 남았어요. 웹 로그인은 앱이 켜져 있는 동안만 유지돼 앱을 닫으면 다시 로그인해야 했고, 위젯은 마지막 저장 값만 보여줄 뿐 스스로 갱신하지 못했어요. 그래서 10월 11일 빌드17부터 계정을 직접 연결하고, 수동 확인은 대체 경로로 남겼어요.
같은 복사·붙여넣기라도 방향이 달랐어요
세 서비스는 연결 방식부터 달랐어요. Codex와 Grok은 앱에 표시된 기기 코드를 복사해 공식 페이지에 붙여넣어요. Claude는 반대로 승인 페이지가 준 일회성 결과를 복사해 CodexTime에 붙여넣어요. 이 차이를 버튼과 안내 문구에 그대로 드러내는 게 중요했어요.

Codex는 ‘ChatGPT로 연결 → 코드 복사 → ChatGPT 열기’ 순서예요. 코드를 직접 탭해도, ‘ChatGPT 열기’를 눌러도 코드가 복사돼요. 공식 페이지에서 로그인하는 동안 앱에는 ‘로그인 완료를 기다리는 중’이 떠서, 지금 할 일과 앱이 기다리는 상태가 한 화면에 보여요.
Grok은 승인만 하면 앱이 이어받게 했어요
Grok도 기기 코드 방식이라 사용자가 할 일은 공식 xAI 페이지에서 승인하는 것 하나예요. ‘Grok 연결’을 누르면 카드가 ‘Grok에서 연결 승인’으로 바뀌고 코드, ‘코드 복사’, ‘Grok에서 승인하기’가 차례로 나와요. 그 아래에는 “승인 후 이 앱으로 돌아오세요.”와 진행 표시를 두었어요.

돌아오면 앱이 승인 결과를 받아 인증을 저장하고 첫 사용량을 조회해요. 성공하면 ‘이 iPhone에 연결됨’과 남은 사용량, 다음 리셋, 확인 시각이 보이고 ‘지금 새로고침’이 생겨요. 공유 로그인 방식이라 승인 페이지에 ‘Grok Build’가 보일 수 있다는 점은 연결 전에 먼저 알렸어요.
빌드17에서는 공식 페이지에서 승인이 끝났는데 앱으로 돌아오면 연결 실패가 표시됐어요. 화면에는 “Grok에 연결하지 못했습니다.”와 ‘Grok 연결’ 버튼만 있고 연결됨이나 새로고침은 없었어요. 그래서 승인 결과를 받아 인증을 저장하기 전 단계로 범위를 좁혔어요.

빌드18에서는 승인 결과를 기다리는 중 생기는 일시적인 통신 오류를 그 승인 요청의 만료 시간 안에서 다시 시도하도록 보강했어요. 인증 응답 처리의 호환성도 점검했어요. 오류 안내도 승인을 끝내지 못한 경우와 인증은 됐지만 첫 사용량 조회만 실패한 경우로 나눴어요.
인증은 됐는데 조회만 실패했다면 연결 상태를 유지하고 ‘지금 새로고침’으로 다시 조회할 수 있어요. 빌드17 문제의 정확한 원인은 당시 로그가 없어 확정하지 못했어요. 이 경로를 보강한 빌드18에서는 제가 TestFlight 내부 테스트로 Grok 연결과 사용량 표시를 확인했어요.
Claude는 제한을 먼저 알리고 결과를 직접 붙여넣게 했어요
Claude 연결 화면은 맨 위에 제한 안내부터 보여줘요. Anthropic은 타사 앱의 구독 로그인 사용을 제한하고 있고, CodexTime이 허용됐다는 확인은 없어요. 그래서 비공식 호환 방식이라 지원이 중단되거나 거부될 수 있다는 문장과 공식 인증 지침 링크를 연결 버튼보다 먼저 두었어요.
‘호환 방식으로 연결’을 누르면 ‘Claude에서 승인’ 아래에 번호 붙은 두 단계가 나와요. ‘1. Claude 승인 페이지 열기’로 승인하고, 2단계 안내대로 승인 화면의 인증 결과 전체를 복사해 돌아와요. 그다음 ‘code#state 붙여넣기’ 칸에 넣고 ‘연결 완료’를 눌러요.

칸에 넣은 내용은 가려서 보여주고, 비어 있으면 ‘연결 완료’를 누를 수 없어요. 제출하면 칸을 비우고, 결과가 방금 시작한 연결 요청과 짝이 맞는지 확인하는 동안 ‘인증과 사용량을 확인하는 중’을 띄워요.
결과의 유효 시간은 약 10분이라 화면에 함께 적었고, 형식이 다르거나 거부되면 연결을 취소하고 웹에서 직접 확인하게 했어요. Grok은 앱이 기다리고 Claude는 사용자가 결과를 들고 와요. 그래서 Grok에는 기다리는 표시를, Claude에는 번호 붙은 단계와 입력 칸을 두었어요.
Claude 연결과 사용량 표시는 빌드17 TestFlight 내부 테스트에서 제가 확인했어요. 다만 연결이 된다는 결과와 공급자가 공식으로 지원한다는 것은 서로 다른 이야기라서 나눠서 기록했어요.
숫자 옆에는 언제 확인한 값인지가 함께 있어야 했어요
확인하지 못한 값은 —로, 실제 잔여량이 0이면 0%로 보여줘요. 일시적인 조회 실패가 생기면 마지막 성공 값과 확인 시각을 유지하고, 오래된 값에는 지난 조회라는 상태를 붙여요. 다른 계정으로 다시 연결하면 이전 계정의 숫자를 가져오지 않아요.
앱과 소형 위젯은 같은 표시 뷰로 세 서비스를 가로 세 열에 놓아요. 단색 로고 아래에 남은 사용량을 두고, 상태와 확인 시각은 회색 보조 정보로 내렸어요. Claude는 주간 한도와 세션 한도가 함께 중요해서 두 줄로 보여줘요.

연결된 서비스는 앱을 쓰는 동안 약 10분마다 조회하고, 앱으로 돌아왔을 때 오래된 값을 다시 확인해요. 위젯도 직접 조회를 시도하지만 실제 실행 시점은 iOS가 정해서, 앱을 닫아둔 상태의 정확한 갱신 간격은 보장하지 않는다고 화면에 적었어요.
빌드18을 심사에 다시 냈고, 확인할 일은 남아 있어요
이번 작업에서 저는 아이폰 단독 연결로 방향을 정하고, 연결 화면의 순서와 안내 문구, 어디까지 지원한다고 말할지를 판단했어요. 코드 구현과 자동 테스트, 배포 기록 정리는 Codex가 맡았어요. TestFlight에서 제 계정으로 직접 연결해 보고 결과를 전한 것은 제 몫이었어요.
빌드18은 iPhone 자동 테스트 194개와 세 플랫폼 CI를 통과했고, GitHub 설명도 최종 동작에 맞췄어요. 2026년 10월 11일 App Store에 1.0(18)을 다시 심사 제출했어요. 제출 당시 상태는 심사 대기였고, 승인 뒤에는 직접 출시하도록 설정했어요.
지금까지 확인한 것은 제 계정으로 한 TestFlight 내부 테스트 범위예요. 공식 웹의 숫자·리셋과 앱 숫자를 맞춰 보는 일, 실제 기기의 위젯, 오래 쓰는 동안의 인증 갱신은 계속 확인할 부분으로 남겨두었어요.
처음 질문으로 돌아가면, 방식이 달라도 사용자가 지금 할 일과 앱이 기다리는 상태가 같은 화면에 있으면 헷갈리지 않았어요. 무엇을 복사해 어디에 붙여넣는지, 승인을 기다리는지, 조회만 다시 하면 되는지를 화면이 말해주는 것을 앞으로도 연결 화면의 기준으로 삼으려고 해요.