원문 캡처 · github.com
원문 캡처 · github.com

닌텐도 DS 계열 기기를 컴퓨터에서 실행 중인 Claude Code의 무선 화면과 키보드로 쓰는 오픈소스 프로젝트 ds-claude-terminal이 공개됐다. DS 화면에서 작업 내용을 확인하고, 버튼으로 수정·명령 실행을 승인하거나 거부하며, 터치 키보드로 프롬프트를 입력할 수 있다.

코드와 Claude Code는 컴퓨터에서 실행된다. DS는 화면을 보여주고 키 입력을 전달할 뿐이며, 두 기기 사이의 통신은 암호화된다. 프로젝트 설명에 따르면 DS에서 보낸 입력으로 명령을 실행하거나 파일을 읽을 수는 없다.

DS에서 할 수 있는 일

위쪽 화면에는 Claude Code 터미널이 표시된다. 기본 화면 크기는 42×24이며, 작은 글꼴로 64×32를 표시하는 별도 빌드도 있다. 아래쪽 화면에는 Claude가 작업 중인지, 완료했는지, 승인이 필요한지, 질문을 하는지 평문과 소리로 나타난다. Claude가 파일 수정이나 명령 실행을 요청하면 DS 화면이 노란색으로 바뀌고 소리가 난다. A 버튼은 승인, X 버튼은 거부이며, 질문에 답할 때는 방향 패드를 쓴다.

터치 키보드는 입력 내용을 실시간으로 보내고, 보내기 전에 수정할 프롬프트 작성 화면과 자주 쓰는 문구 모음도 제공한다. QUICK 타일에서는 Claude 모드를 바꾸고, 세션 되감기와 변경 사항(diff), 슬래시 명령과 최근 프롬프트를 이용할 수 있다. REMOTE에서는 컴퓨터에 있는 Claude Code 세션을 확인해 전환하거나 새 세션을 시작하고, 네트워크에 연결된 다른 컴퓨터로 DS를 옮길 수 있다.

PROJECT 화면에는 작업 중인 프로젝트와 현재 진행 상황, 저장소 변경 사항이 표시된다. npm 스크립트, make 대상, 테스트와 사용자 명령을 버튼으로 실행할 수 있다. 출력 내용을 위로 스크롤해 다시 읽을 수도 있고, 아래 버튼을 길게 눌러 현재 위치로 돌아올 수도 있다. DSi와 3DS에서는 카메라 화면을 실시간으로 볼 수 있으며, 촬영한 사진은 컴퓨터에 저장되고 파일 경로가 프롬프트에 들어간다.

소리는 기본 칩튠 음성, 각 효과음에 세 가지 변형이 있는 부드러운 사무실 소리 세트, 사용자 WAV 파일 중에서 고를 수 있고 음소거도 가능하다. 음량, 입력 소리, 네 가지 강조 색상, 시작 화면, 자동 연결, A/B/X/Y/START 버튼의 키 매핑을 설정할 수 있다.

컴퓨터에서는 dsterm 명령 하나로 macOS, Linux 또는 WSL2를 사용하는 Windows에 서버를 설치한다. 서버는 백그라운드에서 실행되고 컴퓨터를 다시 시작하면 자동으로 시작한다. dsterm doctor는 설정을 점검하고 문제가 있으면 해결 방법을 안내한다. dsterm view는 DS의 두 화면을 에뮬레이터처럼 픽셀 단위로 보여주며, 터미널이나 별도 창에서 입력하고 아래 화면을 눌러 조작할 수 있다. DS에서 카메라를 열어 둔 동안 컴퓨터에서도 카메라 화면을 볼 수 있다.

dsterm card는 컴퓨터에서 SD 카드에 앱과 Wi-Fi 정보, 페어링 정보, 사용자 소리를 준비한다. Claude Code는 tmux에서 실행되므로 서버를 다시 시작하거나 DS 연결이 끊겨도 세션은 유지된다. DS가 연결된 동안 Mac과 Linux 컴퓨터는 잠자기 상태로 들어가지 않는다. 여러 컴퓨터를 DS에 페어링하고 기기에서 전환할 수도 있다.

지원 기기와 준비 조건

DSi와 DSi XL은 Unlaunch 또는 TWiLight Menu++로 앱을 실행하며, WPA2 또는 개방형 2.4GHz Wi-Fi를 지원한다. 3DS, 3DS XL, 2DS, New 3DS, New 3DS XL, New 2DS XL은 TWiLight Menu++를 사용하고 같은 종류의 Wi-Fi를 지원한다. DS와 DS Lite는 플래시카트가 필요하며 하드웨어 제한으로 개방형 네트워크만 사용할 수 있다. 모든 기기에서 같은 파일을 실행한다.

프로젝트는 DSi에서 테스트됐다. DS, DS Lite, 3DS 계열은 같은 파일을 사용하고 Wi-Fi 동작은 BlocksDS와 TWiLight Menu++ 문서를 따르지만, 아직 해당 기기 실물에서 시험하지 않았다.

준비물은 DS 계열 기기와 SD 카드, macOS·Linux 또는 Windows 10·11 컴퓨터, 로그인한 Claude Code, 두 기기가 모두 연결할 수 있는 2.4GHz Wi-Fi다. 기기에서 홈브루 앱을 실행할 수 있도록 한 번 설정해야 한다. 이미 다른 홈브루 앱을 실행하도록 준비했다면 이 단계는 건너뛸 수 있다. 매장에서 산 기기는 기본적으로 카트리지 앱만 실행하므로, DSi·3DS 계열은 소프트모드가 필요하고 DS·DS Lite는 플래시카트가 필요하다.

기기실행 준비Wi-Fi
DSi, DSi XLUnlaunch 또는 TWiLight Menu++WPA2 또는 개방형, 2.4GHz
3DS, 3DS XL, 2DS, New 3DS, New 3DS XL, New 2DS XLTWiLight Menu++WPA2 또는 개방형, 2.4GHz
DS, DS Lite플래시카트(R4, Acekard, DSTT 등)개방형 네트워크만 지원(하드웨어 제한)

기기별 안내는 하드웨어 문서에 있다. 앱 실행 준비가 끝나면 SD 카드 파일을 보여주는 TWiLight Menu++, Unlaunch 또는 플래시카트 메뉴가 나타나야 한다.

설치와 페어링

설치는 기기 준비, SD 카드에 앱 복사, 컴퓨터 서버 설치, DS와 컴퓨터 페어링 순으로 진행한다. 기기 준비는 홈브루를 이미 쓸 수 있으면 0분, 그렇지 않으면 저녁 한 번 정도 걸릴 수 있다고 안내한다. 나머지는 각각 2분, 5분, 1분으로 제시돼 있다.

저장소의 Releases 페이지에서 dsterm-<version>.zip과 ds_claude_terminal-<version>-py3-none-any.whl을 내려받는다. ZIP을 풀어 dsterm.nds와 dsterm 폴더를 SD 카드 최상위에 복사한 뒤 카드를 기기에 넣는다. 기기 메뉴에 DS Claude Terminal이 표시돼야 한다.

Mac에서는 Homebrew가 없다면 먼저 설치한 뒤 터미널에서 실행한다.

text
brew install tmux pipx
pipx ensurepath

터미널을 닫고 다시 연 다음 .whl 파일이 있는 폴더에서 실행한다.

text
pipx install ./ds_claude_terminal-*.whl
dsterm setup

서버가 처음 시작될 때 macOS가 Python의 수신 연결을 허용할지 물을 수 있다. 허용하지 않으면 DS가 컴퓨터에 연결할 수 없다.

Linux에서는 Debian·Ubuntu 기준으로 다음과 같이 설치한다. 다른 배포판에서는 해당 배포판의 패키지를 사용한다.

text
sudo apt install tmux pipx
pipx ensurepath

터미널을 닫고 새로 연 뒤 .whl 파일이 있는 폴더에서 실행한다.

text
pipx install ./ds_claude_terminal-*.whl
dsterm setup

Python 3.11 이상이 필요하다. Ubuntu 24.04에는 해당 버전이 포함돼 있다. Ubuntu 22.04에서는 먼저 sudo apt install python3.11을 실행하고, pipx install 명령에 --python python3.11을 추가한다.

Windows에서는 Ubuntu가 포함된 WSL2를 설치한 뒤 Ubuntu 창에서 위 Linux 절차를 따른다. 이어 Windows 방화벽에서 DS 연결을 허용한다.

text
dsterm wsl-setup

WSL을 계속 실행해야 한다. Ubuntu 창을 모두 닫으면 Windows가 몇 초 뒤 WSL을 종료해 서버도 함께 중단한다. PowerShell에서 다음 파일을 열어 설정을 저장한다.

text
notepad $env:USERPROFILE\\.wslconfig

파일에 다음 내용을 넣는다.

text
[general]
instanceIdleTimeout=-1

[wsl2]
vmIdleTimeout=-1

그 뒤 PowerShell에서 다음 명령을 실행하고 Ubuntu를 다시 연다.

text
wsl --shutdown

Windows 로그인 때 WSL을 자동으로 시작하는 방법은 시작 안내서에 있다. 설치 상태는 다음 명령으로 확인한다.

text
dsterm doctor

정상이면 [ ok ] 항목이 표시된다. [warn] 또는 [FAIL]은 조치 방법을 안내하며, 자세한 설명은 문제 해결 문서에 있다. Claude Code는 기본적으로 홈 폴더에서 시작한다. 프로젝트 폴더에서 시작하려면 다음처럼 서버를 설치한다.

text
dsterm install-service --cwd ~/projects/my-app

기본 페어링은 컴퓨터에서 다음 명령을 실행한 뒤 DS에서 DS Claude Terminal을 열고 Find servers on this network를 선택하는 방식이다. 페어링 대기 시간은 2분이다.

text
dsterm pair

처음 연결할 때는 DS의 터치 키보드로 Wi-Fi 네트워크와 비밀번호를 입력한다. 목록에서 페어링 대기 중으로 표시된 컴퓨터를 고르고 Pair를 누른다. 두 화면에 같은 여섯 자리 숫자 코드가 표시되는지 확인한다. 코드가 같으면 DS에서 A를 누르고 컴퓨터에서 y를 입력한다. 다르면 DS에서 B를 누른다. 이 경우 정보는 저장되지 않으므로 dsterm pair를 다시 실행해 시도한다.

비밀번호를 DS에 입력하고 싶지 않다면 SD 카드를 컴퓨터에 연결해 앱과 Wi-Fi 정보, 페어링을 한 번에 준비할 수 있다.

text
dsterm card /Volumes/SDCARD --rom dsterm.nds --wifi --pair

카드 경로는 Mac에서 /Volumes/NAME, Linux에서 /media/you/NAME, WSL에서 D: 드라이브 기준 /mnt/d처럼 지정한다. 이 명령은 기록한 내용을 확인하고 카드에 이미 있는 파일을 삭제하지 않으며, 작업이 끝나면 카드를 꺼낸다.

이후에는 DS 전원을 켜면 3초 카운트다운 뒤 자동으로 연결된다. 카운트다운 중 아무 버튼이나 누르면 메뉴가 열린다. DS가 잠자기 상태에 들어가거나 Wi-Fi가 끊기거나 서버가 재시작돼 연결이 끊겨도 자동으로 다시 연결되므로 다시 페어링할 필요가 없다. 다른 컴퓨터를 추가하려면 해당 컴퓨터에서 dsterm pair를 실행하고, 카운트다운 중 DS 버튼을 눌러 같은 절차로 연결한다. 컴퓨터 사이 전환은 REMOTE에서 한다.

간단히 시험하려면 KEYS를 누르고 터치 키보드로 hello를 입력한 뒤 A(Enter)를 누른다. Claude의 답변은 위쪽 화면에 표시된다. 작은 파일을 바꾸도록 요청하면 승인이 필요할 때 DS가 노란색으로 바뀌며, A로 승인하고 X로 거부할 수 있다. 어디서든 X를 누르면 Control 화면으로 돌아간다. 나머지 화면과 기능은 사용 안내에서 확인할 수 있다. 업데이트, 소스에서 설치, 제거 방법은 시작 안내서에 있다.

명령과 세션 확인

dsterm --help는 전체 명령을 표시한다. 일상적으로 쓰는 명령은 서버 상태와 연결된 DS, 세션을 확인하는 dsterm status, 설치 상태를 점검하는 dsterm doctor, 다른 DS를 페어링하는 dsterm pair, 페어링된 기기를 보는 dsterm devices다. dsterm devices forget ID는 해당 기기의 권한을 취소한다. dsterm restart는 서버를 재시작하며 start, stop 명령도 있다. 서버를 재시작해도 Claude 세션은 계속 실행된다. dsterm logs -f는 서버 로그를 실시간으로 보여준다.

컴퓨터에서 같은 Claude 세션에 직접 접속하려면 tmux -L dsterm attach -t dsterm을 실행한다. dsterm attach도 같은 기능을 하며, 세션에서 나올 때는 Ctrl-B를 누른 다음 D를 누르면 작업이 계속 유지된다. dsterm view --window는 두 DS 화면을 창에 픽셀 단위로 표시해 데모·방송·녹화에 쓸 수 있고, 그 창에서 입력과 클릭도 가능하다. dsterm view는 화면을 터미널에 표시한다. iTerm2, Ghostty, kitty, WezTerm에서는 그림으로, 그 밖의 터미널에서는 텍스트로 나타난다. Ctrl-] 다음 e를 누르면 창을 열고 q를 누르면 나간다. dsterm camera --window는 DS에서 카메라를 연 동안 실시간 영상을 보여준다. dsterm screen은 현재 DS 화면을 한 번 출력한다.

브라우저에서는 컴퓨터에서만 접근할 수 있는 읽기 전용 대시보드를 http://127.0.0.1:8348/에서 볼 수 있다. 세션 터미널은 어디에서 접속하든 DS 화면에 맞춘 42×24 크기로 유지된다.

Windows에서는 서버가 WSL에서 실행된다. Ubuntu에서는 앞서 나온 명령을 그대로 쓰고, PowerShell이나 명령 프롬프트에서는 앞에 wsl을 붙인다.

text
wsl -d Ubuntu -- bash -lc "dsterm view --window"
wsl -d Ubuntu -- tmux -L dsterm attach -t dsterm
wsl -d Ubuntu -- bash -lc "dsterm doctor"

Ubuntu는 배포판 이름이며 wsl -l로 확인할 수 있다. bash -lc는 로그인 셸을 열어 ~/.local/bin의 dsterm을 찾게 한다. 대신 전체 경로를 지정할 수도 있다. 서버를 기본 사용자와 다른 Linux 사용자로 실행한다면 사용자 이름도 지정한다.

text
wsl -d Ubuntu -u <you> -- /home/<you>/.local/bin/dsterm view --window

창 기능을 쓰려면 Ubuntu에서 Python의 tkinter가 필요하다. Linux에서도 같은 패키지를 설치한다.

text
sudo apt install python3-tk

Windows 11은 WSLg를 통해 창을 표시한다. 설정·변경 명령으로는 서버 설치와 시작을 한 번 실행하는 dsterm setup, 프로젝트 디렉터리를 지정하는 dsterm install-service --cwd ~/projects/app, SD 카드에 앱·Wi-Fi·페어링을 준비하는 dsterm card PATH --rom dsterm.nds --wifi --pair, 사용자 소리를 카드에 복사하는 dsterm card PATH --sounds FOLDER, 소리 이름을 확인하는 dsterm sounds, Windows 방화벽을 설정하는 dsterm wsl-setup이 있다.

연결 보안과 구현

네트워크에서 컴퓨터를 자동으로 찾고, 화면 안내에 따라 Wi-Fi를 설정한다. DSi와 3DS에서는 WPA2를 지원한다. 페어링은 블루투스 기기처럼 양쪽 화면의 여섯 자리 코드를 비교하는 방식이며 비밀번호를 입력하지 않는다. DS마다 별도 키를 사용하고 dsterm devices forget으로 페어링을 해제할 수 있다.

모든 화면 프레임은 ChaCha20으로 암호화하고 HMAC-SHA256으로 서명한다. 이 기능은 끌 수 없다. 연결이 끊겼다가 복구되는 기능도 포함한다. DS는 키보드가 할 수 있는 일만 할 수 있다. DS에 전송된 텍스트는 실제 입력 전에 사용자가 한 번 더 눌러야 한다. 이 제한은 스니펫, 클립보드, 프로젝트 버튼에도 적용된다. GOD MODE는 기본적으로 꺼져 있고 켜면 빨간색으로 표시되며, 프로젝트 버튼이 확인 단계를 건너뛸 수 있다.

프로젝트 설명에 따르면 네트워크에 드러나는 정보는 DS가 컴퓨터와 통신한다는 사실과 입력 시점뿐이며 입력 내용은 노출되지 않는다. 서버 포트를 인터넷에 직접 공개해서는 안 된다. 집 밖에서 사용하려면 홈 네트워크에서 연결을 종료하는 VPN을 이용하라고 안내한다. 자세한 위협 모델은 보안 문서에 있다.

구현은 67MHz ARM9과 4MB RAM을 갖춘 2004년형 휴대용 기기를 대상으로 두 프로그램과 통신 프로토콜을 구성한다. C로 작성한 홈브루 DS 클라이언트는 운영체제 없이 BlocksDS를 사용하며, Wi-Fi 설정과 기기 검색·페어링 메뉴, 비트맵 터미널 렌더러, 터치 키보드, 사운드 믹서, Wi-Fi로 사진을 전송하는 카메라 처리를 포함한다.

Python 서버는 tmux에서 Claude Code를 실행하고 pyte로 터미널을 에뮬레이션한다. 화면에서 바뀐 셀만 전송하며, 메시지는 DS의 제한에 맞춰 TCP 세그먼트 하나인 536바이트에 들어간다. 터미널 에뮬레이터에는 시간 예산을 두어 프로그램 출력이 통신을 지연시키지 않도록 설계했다.

암호화 기능은 C와 Python 양쪽에 구현하고 서로 결과를 대조했다. X25519 교환과 숫자 비교로 페어링한 뒤 모든 프레임에 ChaCha20과 HMAC-SHA256을 적용한다. RFC 테스트 벡터에 맞춰 확인하고 바이트 단위로 교차 검증했다고 프로젝트는 설명한다. 암호화 설명에서 자세한 내용을 볼 수 있다.

프로젝트는 Python 테스트 약 1,200개, 두 화면 크기에서 AddressSanitizer와 UBSan을 이용한 C 검사 수만 건, 바깥 바이트를 읽는 모든 파서에 대한 시드 기반 퍼징, 모든 푸시에서 실행하는 CI, 부하 상태 지연 시간 측정을 제시한다. 수치는 성능 문서에 있다. 저장소 구성 설명은 아키텍처 문서에 있다.

프로젝트는 DSi 실물에서 Wi-Fi, 기기 검색, 페어링, 암호화 연결, Claude Code 실시간 세션, 버튼과 터치 키보드, 카메라, 기기 잠자기 뒤 재연결까지 종단 간 테스트했다고 밝혔다. 다른 DS와 3DS 계열은 아직 실물에서 테스트하지 않았으며, 해당 기기 사용자는 설치 결과를 이슈로 보고해 달라고 안내한다. 라이선스는 MIT다. 제작자는 LC이며 Nintendo나 Anthropic과 제휴하지 않았다.