.png)
OpenAI Codex는 강력한 AI 코딩 도구지만, 데스크톱에 묶여 있습니다. 자리를 비우면 진행 상황을 확인하거나 방향을 조정할 수 없죠.
Remodex는 이 문제를 iPhone에서 Codex를 원격 제어하는 방식으로 해결합니다. 핵심은 모든 실행은 Mac에서, 제어만 iPhone에서 한다는 점입니다.
1) 아키텍처: 로컬 우선 설계
┌──────────────┐ Paired session ┌───────────────┐ stdin/stdout ┌─────────────┐
│ Remodex iOS │ ◄────────────────────► │ remodex (Mac) │ ◄──────────────────────► │ codex │
│ app │ WebSocket bridge │ bridge │ JSON-RPC │ app-server │
└──────────────┘ └───────────────┘ └─────────────┘
핵심 원칙:
| 원칙 | 설명 |
|---|---|
| 로컬 우선 | Codex, git, 작업공간 작업은 Mac에서 실행 |
| iPhone은 리모컨 | 제어만 담당, 실제 실행은 Mac |
| E2E 암호화 | 프롬프트, 응답, git 출력 모두 암호화 |
| 자체 호스팅 | 릴레이 서버 직접 운영 가능 |
2) 보안: End-to-End 암호화
Remodex는 단순한 WebSocket 프록시가 아닙니다. 완전한 E2E 암호화 채널을 구축합니다.
2.1 암호화 핸드셰이크
// secure-transport.js
const HANDSHAKE_TAG = "remodex-e2ee-v1";
const SECURE_SENDER_MAC = "mac";
const SECURE_SENDER_IPHONE = "iphone";
핸드셰이크 과정:
- 브리지 키 페어 생성: Mac이 장기 identity 키페어 생성
- QR 페어링: 연결 URL, 세션 ID, identity 공개키 포함
- 키 교환: X25519 ephemeral 키와 nonce 교환
- 서명 검증: Ed25519으로 핸드셰이크 서명 검증
- 세션 키 도출: HKDF-SHA256으로 AES-256-GCM 키 도출
// 암호화 래핑
function queueOutboundApplicationMessage(payloadText, sendWireMessage) {
const encrypted = encryptEnvelope(payloadText, sessionKey);
// monotonic counter로 replay protection
}
2.2 프라이버시
| 볼 수 있는 것 | 볼 수 없는 것 |
|---|---|
| 연결 메타데이터 | 프롬프트 내용 |
| 세션 ID, 디바이스 ID | Codex 응답 |
| 공개키, nonce | git 출력 |
| 핸드셰이크 결과 | 작업공간 RPC |
3) Git 통합
브리지가 git/* JSON-RPC 호출을 가로채 로컬에서 실행합니다.
// git-handler.js
async function handleGitMethod(method, params) {
const cwd = await resolveGitCwd(params);
switch (method) {
case "git/status": return gitStatus(cwd);
case "git/commit": return gitCommit(cwd, params);
case "git/push": return gitPush(cwd);
case "git/pull": return gitPull(cwd);
case "git/branches": return gitBranches(cwd);
case "git/checkout": return gitCheckout(cwd, params);
// ...
}
}
지원 Git 작업:
| 명령 | 설명 |
|---|---|
git/status | 브랜치, 추적 정보, 변경 파일 |
git/commit | 스테이징 변경 커밋 |
git/push | 리모트에 푸시 |
git/pull | 리모트에서 풀 (충돌 시 자동 중단) |
git/branches | 브랜치 목록 |
git/checkout | 브랜치 전환 |
git/createBranch | 새 브랜치 생성 및 전환 |
git/stash / stashPop | 스태시 |
git/resetToRemote | 하드 리셋 (확인 필요) |
4) 주요 기능
4.1 실시간 스트리밍
iPhone에서 Codex가 실행되는 동안 실시간으로 응답을 스트리밍합니다.
// rollout-live-mirror.js
// JSONL rollout 파일을 감시해서 실시간 미러링
4.2 Plan Mode & Fast Mode
| 모드 | 설명 |
|---|---|
| Fast Mode | 낮은 지연 시간 우선 |
| Plan Mode | 실행 전 구조화된 계획 |
4.3 Steer & Queue
- Steer: 실행 중인 작업을 중단 없이 방향 전환
- Queue: 실행 중일 때 후속 프롬프트 큐잉
4.4 사진 첨부
카메라나 라이브러리에서 사진을 첨부해 Codex에 전달할 수 있습니다.
4.5 알림
턴 완료나 주의 필요 시 인앱 알림을 받습니다.
5) Codex 데스크톱 앱 통합
Remodex는 Codex CLI와 데스크톱 앱 모두와 작동합니다.
// bridge.js
const codex = createCodexTransport({
endpoint: config.codexEndpoint,
env: process.env,
});
동작 방식:
- 브리지가
codex app-server프로세스를 spawn - 대화는
~/.codex/sessions에 JSONL로 저장 - iPhone에서 시작한 스레드가 데스크톱 앱에도 표시
알려진 제한:
- 데스크톱 앱은 외부 프로세스가 쓴 데이터를 실시간으로 다시 읽지 않음
REMODEX_REFRESH_ENABLED=true로 워크어라운드 활성화 가능
# 데스크톱 새로고침 워크어라운드
REMODEX_REFRESH_ENABLED=true remodex up
6) 연결 복원력
// 브리지가 일시적 연결 끊김에도 Codex 프로세스 유지
let codexHandshakeState = "cold";
let reconnectAttempt = 0;
| 기능 | 설명 |
|---|---|
| Auto-reconnect | 지수 백오프 (1초 → 최대 5초) |
| Secure catch-up | 놓친 암호화 메시지 재전송 |
| Codex persistence | 일시적 연결 끊김에도 Codex 프로세스 유지 |
| Graceful shutdown | SIGINT/SIGTERM으로 깔끔한 종료 |
7) 설치 및 사용
브리지 설치
npm install -g remodex@latest
시작
remodex up
QR 코드가 터미널에 표시되고, iPhone 앱으로 스캔하면 페어링 완료.
CLI 명령어
| 명령 | 설명 |
|---|---|
remodex up | 브리지 시작 |
remodex reset-pairing | 페어링 상태 초기화 |
remodex resume | 마지막 활성 스레드 열기 |
remodex watch [threadId] | 이벤트 로그 실시간 확인 |
환경 변수
| 변수 | 설명 |
|---|---|
REMODEX_RELAY | 커스텀 릴레이 URL |
REMODEX_CODEX_ENDPOINT | 기존 Codex 인스턴스 연결 |
REMODEX_REFRESH_ENABLED | 데스크톱 새로고침 활성화 |
REMODEX_PUSH_SERVICE_URL | 푸시 알림 서비스 URL |
8) 자체 호스팅
Remodex는 자체 호스팅이 기본 설계입니다.
# 로컬 릴레이 실행
./run-local-remodex.sh
# 또는 커스텀 릴레이 지정
REMODEX_RELAY="ws://localhost:9000/relay" remodex up
릴레이 코드는 relay/ 폴더에 공개되어 있어 직접 운영 가능.
# Traefik 뒤에 릴레이 배치 예시
REMODEX_RELAY="wss://api.example.com/remodex/relay" remodex up
9) iOS 앱 빌드
cd CodexMobile
open CodexMobile.xcodeproj
Xcode 16+에서 물리 기기 또는 시뮬레이터에 빌드. 타겟은 iOS 18.6.
마치며: 진정한 로컬 우선 원격 제어
Remodex는 “클라우드에서 실행”하는 방식이 아닙니다. Mac이 여전히 진실의 원천이고, iPhone은 안전한 리모컨입니다.
“모든 실행은 로컬, 제어만 원격”
특히 인상적인 점:
- E2E 암호화: 릴레이조차 프롬프트/응답을 볼 수 없음
- Git 통합: 커밋, 푸시, 브랜치 전환까지 iPhone에서
- 자체 호스팅: 릴레이 서버 직접 운영 가능
- 연결 복원력: 일시적 끊김에도 작업 유지
이 패턴은 다른 AI 도구에도 적용할 수 있습니다. 로컬 실행 + 원격 제어 + E2E 암호화 조합은 프라이버시와 편의성을 모두 만족시키는 방향입니다.
🔗 관련 정보
- GitHub: https://github.com/Emanuele-web04/remodex
- npm: https://www.npmjs.com/package/remodex
- OpenAI Codex: https://openai.com/index/codex/
- Codex CLI: https://github.com/openai/codex