시간정원
← Blog

sideproject · 2026-07-28 · 조회수 18

Codex 사용량을 작업표시줄에 띄우는 Codex Pulse 개발기

왜 만들었나

Codex를 오래 켜놓고 쓰다 보면 지금 한도가 얼마나 남았는지 궁금할 때가 있다. Codex 앱의 프로필을 열면 사용량을 확인할 수 있지만, 작업하다 말고 매번 프로필 화면까지 들어가는 건 은근히 번거로웠다.

한편 기존에는 작업표시줄에 붙여두는 트래픽 모니터링 프로그램으로 CPU와 메모리 사용률을 보고 있었다. 개발하거나 빌드할 때 시스템이 얼마나 바쁜지 바로 확인할 수 있어 편했지만, Codex 사용량은 다시 별도의 앱을 열어야 했다.

그래서 두 화면을 합치기로 했다. Codex 한도와 토큰 활동을 중심에 두고, 기존 트래픽 모니터에서 보던 CPU와 메모리까지 같은 작업표시줄 위젯에서 확인하는 것이 이 프로젝트의 출발점이었다.

원했던 건 거창한 대시보드가 아니었다. 작업표시줄 한쪽에 아래 정보만 계속 보이면 됐다.

  • Codex 사용 한도와 초기화 시간
  • 오늘·누적 토큰 활동
  • 현재 CPU와 메모리 사용률

처음에는 스티커 메모처럼 항상 위에 떠 있는 작은 창을 생각했다. 만들다 보니 자유롭게 옮기는 오버레이와 작업표시줄에 붙여두는 모드를 둘 다 지원하게 됐고, 이름은 Codex Pulse로 정했다.

어떤 도구인가

Codex Pulse는 Windows용 상시 사용량 위젯이다. 평소에는 306×48 크기의 미니 위젯으로 Codex·CPU·메모리 상태만 보여주고, 클릭하면 상세 패널이 열린다.

현재 들어간 기능은 이렇다.

  • Codex 사용 한도와 초기화 시각
  • 오늘 및 누적 토큰 활동
  • CPU·메모리 사용률과 간단한 추이 그래프
  • 작업표시줄 모드와 자유 배치 모드
  • 다크·라이트 테마
  • 시스템 트레이 메뉴
  • 자동 새로고침
  • 한도 임계치와 초기화 시점 Windows 알림
  • Windows 시작 시 자동 실행 옵션
  • 중복 실행 방지

작업 표시줄에서 열린 Codex Pulse 상세 패널

작업 표시줄의 미니 위젯을 누르면 위쪽으로 상세 패널이 열린다.

자유 배치 다크 모드의 Codex Pulse

자유 배치 모드의 다크 색상.

자유 배치 라이트 모드의 Codex Pulse

자유 배치 모드의 라이트 색상.

Codex 데이터는 30초마다, CPU와 메모리는 1초마다 갱신한다. 정보를 가져오지 못했을 때는 그럴듯한 더미 숫자를 만들지 않고 -로 표시한다. 실제 사용량을 보여주는 도구에서 가짜 데이터가 보이는 것보다는 비어 있는 편이 낫다고 판단했다.

Codex 사용량은 어디서 가져오나

처음에는 ChatGPT 구독으로 쓰는 Codex의 토큰 활동을 외부 프로그램에서 가져올 수 없는 줄 알았다. 그런데 Codex 앱 프로필에는 실제로 lifetime tokens와 날짜별 Token activity가 표시되고 있었다.

확인해보니 Codex 앱은 로컬의 Codex app-server와 통신하고 있었다. Codex Pulse의 Rust 백엔드도 같은 app-server를 실행해 아래 요청을 사용한다.

account/read
account/rateLimits/read
account/usage/read

여기서 로그인 계정과 플랜, 현재 사용 한도, 초기화 시각, 누적 토큰과 날짜별 토큰 버킷을 읽는다. CPU와 메모리는 Windows 시스템 정보에서 별도로 수집한다.

구독 결제일이나 만료일은 app-server 응답에 없어서 표시하지 않는다. 최근 1시간 사용 속도나 “몇 시간 후 한도 도달” 같은 예측도 넣지 않았다. 계산할 수 있다는 것과 정확하다는 것은 다른 문제라, 현재는 서버가 내려주는 값만 보여주는 쪽을 택했다.

Tauri 창을 작업표시줄에 직접 넣어봤다

기술 스택은 Tauri 2 + React + TypeScript + Rust다. 상세 패널과 자유 배치 위젯은 React로 만들었다. 카드 UI, 그래프, 다크·라이트 테마를 다루기에는 웹 UI가 편했다.

문제는 작업표시줄이었다.

처음에는 Tauri WebView 창을 SetParent로 Explorer의 Shell_TrayWnd 아래에 넣었다. 겉으로는 진짜 작업표시줄 구성 요소처럼 보였고, 별도의 오버레이보다 자연스러울 것 같았다.

하지만 Windows 11에서는 안정적이지 않았다. Explorer가 작업표시줄을 다시 만들거나 화면 구성이 바뀌는 순간 Shell_TrayWnd를 찾지 못했고, 로그에는 다음 오류가 반복됐다.

taskbar attachment check failed: Windows 작업표시줄을 찾을 수 없습니다.

작업표시줄이 잠깐 사라졌다 다시 생기는 동안 재부착이 연속으로 실행되면서 위젯도 나타났다 사라졌다 했다. 보조 모니터의 Shell_SecondaryTrayWnd, Explorer 재시작 후 전달되는 TaskbarCreated, 해상도 변경 시 발생하는 WM_DISPLAYCHANGE, 재시도 간격까지 대응했지만 근본적인 문제는 남았다.

Tauri WebView 창의 생명주기를 Explorer 창에 맡긴 상태라 부모 창이 재생성되는 순간을 완전히 피하기 어려웠다. 작업표시줄 모드에서 자유 배치 모드로 전환해도 이전 부모 관계와 창 스타일 때문에 위젯이 남거나 위치가 망가지는 경우가 있었다.

결국 작업표시줄 모드는 별도의 Win32 WS_POPUP 창으로 다시 만들었다. Explorer 내부에 억지로 집어넣지 않고 작업표시줄 좌표 위에 독립 창을 정확히 겹치는 방식이다. 클릭과 우클릭은 네이티브 윈도우 메시지로 처리하고, Explorer 재시작과 WM_DISPLAYCHANGE도 따로 대응했다.

픽픽 같은 캡처 프로그램을 실행한 뒤 위젯이 작업표시줄 뒤로 밀리는 문제도 있었다. 캡처 오버레이가 최상단 창 순서를 바꾸기 때문이었다. 창을 다시 만들거나 위치를 흔들지 않고 Z-order만 조용히 복구하도록 처리했다.

작은 위젯에서 더 오래 걸린 것들

상세 패널을 만드는 것보다 48px 높이의 미니 위젯을 다듬는 데 더 많은 시간이 들었다.

팝업을 열 때 모서리에 Windows 기본 테두리가 한 프레임 나타났다가 사라졌고, 투명 창의 실제 영역이 화면에 보이는 카드보다 크게 잡히기도 했다. 작업표시줄 색상과 앱의 라이트·다크 테마가 다르면 글자가 거의 안 보이는 문제도 있었다.

그래서 다음을 하나씩 조정했다.

  • 팝업을 처음 보여주기 전에 Win32 프레임과 DWM 모서리 속성 적용
  • 실제 작업표시줄 배경 밝기를 샘플링해 글자 색상 결정
  • 팝업 위치를 현재 모니터의 작업 영역 안으로 제한
  • 바깥 클릭 시 상세 패널 닫기
  • 작업표시줄과 오버레이 양쪽에 동일한 우클릭 메뉴 제공

글꼴도 예상보다 까다로웠다. 작업표시줄 위젯은 React 화면이 아니라 Rust에서 GDI DrawTextW로 직접 그리고 있었는데, 작은 크기에서 숫자와 영문이 자글자글하게 보였다. 마지막에는 배치와 클릭 구조는 Win32 그대로 두고 텍스트 렌더링만 DirectWrite로 교체했다. 숫자와 % 사이의 간격, 글자 두께, 색상 막대의 그리기 순서까지 다시 맞췄다.

지금 상태

현재 Codex Pulse는 내가 쓰는 Windows 11 환경에서 실제 Codex 구독 데이터와 시스템 사용량을 표시한다. 작업표시줄에 놓고 클릭하면 상세 패널이 열리고, 필요하면 자유 배치 위젯으로 바꿀 수 있다.

Codex app-server는 일반 공개 REST API가 아니어서 Codex가 내부 응답 형식을 바꾸면 연동 코드도 함께 수정해야 한다. 작업표시줄 위에 독립 창을 겹치는 방식 역시 Windows와 Explorer의 동작을 계속 확인할 필요가 있다.

그래도 처음 원했던 “작업 중에 Codex 한도를 한눈에 확인하기”는 해결됐다. 만들기 전에는 작은 숫자 네 개짜리 위젯이면 금방 끝날 줄 알았는데, 실제로는 투명 창, Explorer, DPI, Z-order, GDI와 DirectWrite까지 건드리게 됐다.

작은 화면일수록 단순한 게 아니라, 숨길 수 있는 문제가 적다는 걸 다시 느꼈다.

소스 코드

Codex Pulse의 소스 코드는 GitHub에 공개했다.

현재 저장소에는 직접 실행하는 방법과 Windows 빌드 방법을 정리해두었다.

설치

첫 공개 버전인 Codex Pulse v0.1.0을 GitHub Releases에 올렸다.

Windows x64 환경에서는 릴리스 페이지의 Codex.Pulse_0.1.0_x64-setup.exe를 내려받아 설치할 수 있다. Codex 사용량을 읽으려면 Codex Desktop이 설치되어 있고 ChatGPT 구독 계정으로 로그인되어 있어야 한다.

현재 설치 파일은 디지털 서명되지 않아 Windows SmartScreen 경고가 표시될 수 있다.

앞으로

첫 공개 버전은 만들었지만, 당분간은 기능을 무작정 늘리기보다 매일 켜두는 도구로서의 안정성을 먼저 다듬을 생각이다.

  1. 여러 모니터와 상단·좌우 작업표시줄, 서로 다른 DPI 환경에서 위치 검증
  2. Explorer 재시작, Win + D, 화면 캡처 프로그램 사용 후 Z-order 복구 테스트
  3. Codex 앱과 날짜별 토큰 집계 기준이 일치하는지 장기적으로 확인
  4. Codex app-server의 응답 형식이나 버전이 바뀌었을 때의 호환성 보강
  5. 공식 한도 데이터로 정확히 판단할 수 있는 경우에만 Windows 알림 제공
  6. 코드 서명과 자동 업데이트를 포함한 배포 과정 개선

댓글

목차