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

Witchat은 Windows와 Linux에서 실행되는 비공식 bitchat 클라이언트다. 계정이나 전화번호, 서버 가입 없이 주변 휴대전화가 참여한 Bluetooth 메시에 PC를 연결하며, 메시지 중계 노드로도 쓸 수 있다.

bitchat은 Bluetooth로 주변 사람끼리 대화하는 메신저다. 메시지는 다른 휴대전화를 거쳐 전달될 수 있어 직접 연결 범위를 벗어난 사람도 대화에 참여한다. 공식 앱은 iPhone, Mac, Android에서 제공된다. Witchat은 이 메시 프로토콜을 다시 구현해 Windows·Linux PC를 참여시킨다. 공식 앱과는 독립적으로 작동한다.

PC에서 대화하려면 Witchat을 클라이언트로 실행해 공유 주변 채팅 #mesh에 글을 쓰고, 다른 사람에게 비공개 메시지와 사진·음성 메모·파일을 보낼 수 있다. 두 사람이 서로를 즐겨찾기에 등록하면 Bluetooth 범위를 벗어난 뒤에도 Nostr 릴레이를 통해 암호화된 비공개 메시지를 주고받는다. PC를 노드로 두면 창을 닫아도 트레이에서 메시지를 중계한다. 창이 없는 컴퓨터를 위한 헤드리스 모드도 있다. 제작자는 실험실에서 Bluetooth 범위를 벗어난 iPhone과 iPad가 Windows PC를 거쳐 연결된 사례를 제시하지만, 이것이 Android에서도 확인된 것은 아니다.

Bluetooth 메시지는 컴퓨터에서 컴퓨터로 이어져 건물·구역·캠퍼스까지 확장될 수 있지만, 두 도시는 연결되지 않는다. 도시 간 연결은 상호 즐겨찾기한 사람의 비공개 대화가 Nostr 릴레이를 이용할 때 가능하다. 위치 채널은 처음부터 릴레이를 통해 전달되고, 주변 채팅의 메시지는 Bluetooth에 머문다. PC의 인터넷 연결을 주변 휴대전화에 빌려주는 기능은 이번 릴리스에 포함되지 않았다.

주요 기능은 Bluetooth LE의 중앙 역할과, 어댑터가 지원하는 Windows 및 BlueZ 기반 Linux의 주변 역할, 공개 #mesh 채팅과 중계·조각 전송·동기화다. 비공개 메시지는 Noise XX 종단간 암호화를 사용하며, 전달·읽음 확인과 최대 24시간 보관되는 암호화 전송 대기함을 지원한다. 주변의 신뢰된 피어가 아직 전달되지 않은 메시지의 봉인된 사본을 운반할 수도 있다. 위치 채널은 구역부터 지역 단위까지의 지오해시 채널과 사람 목록, 채널 이동, 해당 위치 사람과의 비공개 메시지를 제공한다. 사진·음성 메모·PDF는 비공개 대화에서 암호화되며 자동 재생되지 않는다. 릴레이 연결에는 선택형 Tor를 사용할 수 있고, 알림에는 메시지 내용이 표시되지 않는다.

내려받기와 시작하기

Releases에서 witchat-<version>-windows-x86_64.zip 또는 witchat-<version>-linux-x86_64.tar.gz를 내려받아 압축을 풀고 실행한다. 설치 프로그램은 없으며 Program Files에 파일을 쓰거나 제거 항목을 만들지 않는다. 폴더를 삭제하면 프로그램을 제거할 수 있다. 키·즐겨찾기·설정은 사용자 계정에 저장되므로 새 압축 파일로 교체해도 유지되지만, 프로그램 폴더를 다른 PC로 복사해도 함께 옮겨지지 않는다. Windows 경로는 %APPDATA%\witchat, Linux 경로는 ~/.local/share/witchat이다. 로그는 이 데이터 폴더 아래에 저장된다. 로그인 시 자동 실행은 기본적으로 꺼져 있다.

Windows 실행 파일은 서명되지 않았다. 브라우저·SmartScreen·경우에 따라 Defender가 알 수 없는 파일이라고 경고할 수 있다. 제작자는 이를 알려진 바이러스라는 신고로 볼 수는 없다고 설명하며 Defender나 랜섬웨어 보호를 끄지 말라고 안내한다. 해당 릴리스의 해시가 일치할 때만 실행해야 한다. 해시가 일치해도 Microsoft가 Witchat을 검토했다는 뜻은 아니다. 이메일이나 다른 사이트에서 받은 파일은 실행하지 말고, 해시가 다르면 파일을 지운 뒤 공식 릴리스에서 다시 내려받는다.

Windows에서는 다음 순서로 확인한다.

  • 내려받은 ZIP이 이 프로젝트의 Releases 페이지에서 왔는지 확인한다.
  • 압축을 풀기 전에 PowerShell에서 Get-FileHash .\witchat-<version>-windows-x86_64.zip을 실행한다. 결과는 릴리스 페이지의 SHA256SUMS.txt에 적힌 Windows 항목과 일치해야 한다. 대소문자는 구분하지 않는다.
  • 압축을 푼 뒤 해당 폴더에서 Get-FileHash .\witchat.exe를 실행하고, 프로그램 옆의 witchat.exe.sha256과 비교한다. SHA256SUMS.txt는 ZIP의 해시이므로 실행 파일 해시와 값이 다른 것이 정상이다.
  • 파일 탐색기에서 witchat.exe를 실행한다. 게시자를 확인할 수 없다는 창이 뜨면 해시가 일치하는지 확인한 뒤 실행한다.
  • “Windows protected your PC”라는 SmartScreen 창에서는 “More info”를 누르고 이름이 witchat.exe인지 확인한 뒤 “Run anyway”를 선택한다.
  • “Risky action blocked” 알림이나 “Access is denied” 창은 대개 바탕 화면이나 OneDrive 안의 폴더에서 Defender의 랜섬웨어 보호 규칙이 쓰기를 막을 때 나타난다. Windows Security → Protection history에서 해당 이벤트를 열고 “Allow on device”를 선택한 뒤 파일 탐색기에서 다시 실행한다. 해결되지 않으면 Windows 안내를 참고한다.

Linux는 BlueZ가 필요하며 게시자 확인 창은 없다. 다음 명령으로 압축을 풀고 해시를 확인한 다음 실행한다.

sh
tar -xzf witchat-*.tar.gz && sha256sum -c witchat.sha256

해시 확인 명령이 OK를 출력하면 ./witchat을 실행한다. 자세한 내용은 Linux 안내에 있다.

처음 연결할 때는 PC 근처에서 공식 bitchat 앱을 열고 휴대전화의 Bluetooth를 켠다. PC가 휴대전화를 찾을 때까지 앱을 화면에 띄워 둬야 한다. bitchat이 백그라운드에 있으면 PC가 iPhone을 검색할 수 없다. Bluetooth를 켠 PC에서 Witchat을 시작하면 몇 초 안에 휴대전화가 사이드바에 나타나며, #mesh에 글을 쓸 수 있다. 사람을 눌러 비공개 메시지를 보내고, 서로 즐겨찾기에 등록하면 떨어져 있을 때 Nostr로 대화를 이어갈 수 있다. Bluetooth 오류 HRESULT 0x800710DF 등 무선 문제는 Windows 안내와 Linux 안내를 참고한다.

로그는 Windows의 %LOCALAPPDATA%\witchat\witchat\data\logs 또는 Linux의 ~/.local/share/witchat/logs에서 순환 저장된다. 버그를 신고할 때는 witchat/ → debug → copy diagnostics report에서 진단 보고서를 복사하거나 witchat --diag를 사용한다. 제작자는 보고서에 메시지·키·이름이 포함되지 않는다고 설명한다.

메시·개인정보 기능

Witchat은 bitchat의 바이너리 패킷 인코딩·디코딩(v1/v2), 패딩, zlib/deflate, 공지 TLV, 공개 메시지를 지원한다. Bluetooth LE 중앙 역할로 공식 서비스 UUID를 검색해 연결하고 프레임을 교환한다. 어댑터가 주변 역할을 지원하면 Windows의 WinRT 또는 Linux의 BlueZ를 통해 bitchat 서비스를 광고해 휴대전화가 연결할 수 있다. 공개 대화, TTL 중계, 링크 MTU에 맞춘 조각 분할·재조립, 패킷 중복 제거, iOS 호환 가십 동기화를 포함한다. 가십 동기화는 Golomb 부호 집합 필터를 사용해 이미 가진 메시지를 다시 보내지 않으면서 이웃끼리 #mesh와 피어 목록을 채운다. 연결이 생기면 곧바로 공지해 휴대전화가 범위로 돌아왔을 때 몇 초 안에 보이도록 한다.

/ping nick은 메시 네트워크 피어까지 왕복 시간을 측정하고, /trace nick은 휴대전화가 공지에 담은 이웃 목록으로 경로를 추정한다. 디버그 화면에서는 메시 지도, Bluetooth 링크의 RSSI와 트래픽, 주변 기기, 세션 상태·기능, 패킷 수와 폐기 이유, 가십 동기화, Nostr 릴레이 상태를 볼 수 있다. Bluetooth 연결을 끊거나 재연결 대기를 건너뛸 수도 있고 자세한 로그 설정도 제공한다.

비공개 메시지를 시작하면 Noise XX 핸드셰이크를 자동 수행하고 세션이 안전해질 때까지 메시지를 대기시킨다. 휴대전화가 확인할 때까지 다시 전송하며 전달(✓)과 읽음(✓✓) 표시를 제공한다. 공식 앱의 명시적 nonce 프레이밍을 따르고, 공식 255바이트 제한을 넘는 메시지는 단어 경계에서 나눠 보낸다. 확인되지 않은 메시지는 사람마다 최대 100개, 최대 24시간 보관하고 8차례 전송을 시도한다. 상대 휴대전화가 범위에 들어오면 같은 ID로 재전송한다. 주변 피어가 봉인된 사본을 운반하면 상태가 “with couriers”로 바뀐다. Windows에서는 DPAPI, Linux에서는 Secret Service 키로 대기함을 봉인한다. 키링이 없으면 프로그램을 종료할 때까지 유지된다. 메시지 ID로 중복 수신을 막고, 재시작 뒤 재전송된 메시지가 두 번 표시되지 않도록 받은 ID를 25시간 기억한다.

메시가 메시지를 전달하지 못하거나 Nostr 릴레이가 모두 거부하면 Witchat은 상대 키로 메시지 사본을 봉인해 최대 세 명의 상호 즐겨찾기 또는 인증된 피어에게 전달한다. 수신자가 먼저 만나면 대신 전달한다. 공개된 키 묶음에 일회용 사전 키가 있으면 이를 사용해 나중에 키가 유출돼도 메시지를 열 수 없도록 한다. 이미 릴레이가 메시지를 수락했다면 택배 피어에게 사본을 보내지 않는다. Witchat도 다른 사람의 봉인된 메시지를 최대 40개, 24시간 동안 보관하고 자신에게 온 메시지를 연다. 운반자는 발신자와 내용을 볼 수 없다. 자세한 조건과 한계는 SECURITY.md에 있다.

즐겨찾기를 등록하면 공식 [FAVORITED] 알림을 보낸다. 달 모양 표시는 상대가 먼저 나를 즐겨찾기에 등록했다는 뜻이다. 지문을 비교하고 상대를 인증할 수 있으며, 핸드셰이크 뒤에는 양쪽이 서명된 키 상태를 교환해 공지와 모순되면 경고한다. 설정의 QR 코드는 서명된 “scan to verify me” 코드이며 4분마다 갱신된다. 상대 휴대전화의 QR 코드를 웹캠에 보여 주거나 스크린샷을 열거나 bitchat://verify?… 링크를 붙여넣을 수 있다. 휴대전화가 코드의 키를 보유했다는 사실을 증명해야 인증된다. witchat.exe --qr-lab은 키 교환 실험을 실행한다.

상호 즐겨찾기는 npub을 교환한다. 상대가 Bluetooth 범위를 벗어나면 Witchat은 iOS 릴레이를 통해 iOS 호환 gift wrap(kind 1059/13/14, XChaCha20-Poly1305)으로 메시지와 확인 정보를 보낸다. 오프라인 즐겨찾기도 사이드바에 남는다. 비공개 메시지 기록은 디스크에 저장하지 않는다. 예외는 아직 보내지 못한 암호화 대기 메시지다.

위치 채널은 지오해시 셀을 사용한다. #location channels…에서 “get location and my geohashes”를 한 번 누르면 구역·동네·도시·도·지역 셀과 인원 수가 표시된다. Windows 위치 기능 또는 Linux의 GeoClue에서 얻은 위치는 지오해시로만 사용하고 메모리에만 보관한다. 위치 권한을 허용하면 실행할 때마다 새 위치를 얻어 휴대전화가 인원을 계속 셀 수 있다. 위치 권한을 제거하면 기능이 꺼진다. 채널에서는 최근 5분간 확인된 사람을 HERE IN #cell에서 볼 수 있다. 이름을 눌러 비공개 메시지를 보내면 해당 셀 키와 상대 키로 감싼다. 이 메시지의 휴대전화 왕복 테스트는 아직 실험실 기록에 포함되지 않았다. 빠른 참여는 지역 채널을 추천하고, 북마크(⚐/⚑)를 보관하며, /geo 9q8yy 또는 teleport로 지오해시 채널에 참여한다. 자신이 들어 있지 않은 셀에 쓴 게시물에는 iOS와 같이 teleport 태그가 붙는다. 각 채널은 iOS가 사용하는 같은 디렉터리에서 셀에 가까운 릴레이 5개를 고르고, bitchat GitHub 목록에서 매일 갱신해 iOS 규칙에 따라 검증한다. Tor 사용 설정이 켜져 있으면 이미 PC에서 실행 중인 Tor를 통해 릴레이 트래픽을 보내고 휴대전화처럼 존재를 알린다. 끄면 릴레이에 PC의 IP 주소가 보인다.

수신 이미지·음성 메모·PDF는 MIME 허용 목록, 파일 시그니처, 1MiB 제한으로 검증한다. 서명된 공개 방송 또는 암호화된 비공개 대화에서 받은 파일은 Downloads\witchat에 저장해 화면에 표시한다. 음성 메모는 Witchat 안에서 재생되며 자동 재생되지 않는다. 마이크 버튼으로 Windows에서 최대 30초 음성 메모를 녹음할 수 있다. +, 끌어다 놓기, /send <path>로 파일을 보낸다. Witchat은 iOS의 비공개 미디어 기능을 광고하므로 휴대전화는 암호화해 파일을 보내며, 놓친 비공개 파일은 휴대전화가 다시 연결되면 재전송된다. 휴대전화에서 실시간 푸시 투 토크를 하면 “talking live”로 표시되고 완성된 음성 메모는 평소처럼 도착한다. /pay <cashu-token>은 iOS와 같이 Cashu 토큰을 전달하며, 공개 채팅에서는 /pay <token> public을 쓴다. Cashu 토큰과 Lightning 청구서는 지갑을 여는 칩으로 표시된다. Witchat은 지갑이 아니라 전달 수단이다.

데스크톱 사용과 한계

창을 닫아도 Witchat은 트레이에서 실행되며 메시지를 중계하고 받는다. 트레이 아이콘으로 창을 다시 열거나 프로그램을 종료할 수 있다. 알림은 Settings > NOTIFICATIONS에서 끌 수 있다. Linux는 GNOME/KDE 패널 등 알림 영역 호스트가 필요하다. “Stay awake while relaying”은 기본적으로 꺼져 있으며, 전원 연결 중 메시 중계로 인한 유휴 절전을 막는다. witchat --relay는 창 없이 별도 중계 노드를 실행하며, PC나 Linux 장비를 켜 둔 채 사용할 수 있다. 관련 안내: Linux 헤드리스 중계, Windows 헤드리스 중계. 디버그 화면의 “what this PC does for the mesh”는 각 인스턴스의 중계량을 숫자로만 보여 준다.

백그라운드에 있을 때 비공개 메시지와 @멘션 알림을 표시하며, 알림을 누르면 해당 대화가 열린다. 잠금 화면에 표시될 수 있으므로 알림에는 보낸 사람과 위치만 나오고 메시지 내용은 나오지 않는다. 긴급 삭제는 알림 기록도 지운다. 인터페이스는 witchat/ @nick 헤더와 닉네임 편집, IRC 스타일 메시지 행, 피어별 색상, 읽지 않은 메시지 표시, 작업 표시줄 깜박임, 최근 확인 피어, 클릭 가능한 #geohash 링크를 제공한다. /를 입력하면 명령어를 찾을 수 있고 위·아래 화살표로 고르며 Tab 또는 Enter로 완성한다. 설정과 정보는 witchat/ 제목에서 연다. /block은 사람을 숨기고 파일을 디스크에 저장하지 않으며, /clear는 대화를 비운다. 제목을 세 번 누르거나 설정의 panic wipe를 쓰면 한 차례 확인 후 신원·즐겨찾기·북마크·기록·대기함·운반 중인 메시지·이 PC가 만난 피어 목록을 지운다. 선택형 /history on은 #mesh와 위치 채널 기록을 일반 텍스트 JSON으로 저장하며 채널마다 최신 2,000개를 보관한다. 기본값은 꺼짐이다. /history off와 긴급 삭제는 저장 기록을 지운다.

제작자가 밝힌 한계는 다음과 같다.

  • 무선 연결은 주로 중앙 역할에 의존한다. 공식 휴대전화는 중앙·주변 역할을 모두 한다. Windows Witchat도 어댑터가 지원하면 광고하지만, PC를 거쳐 휴대전화 두 대를 중계한 것은 실험실에서 iPhone과 iPad의 2홉 ping으로 한 차례 확인했을 뿐이며 Android에서는 아직 확인되지 않았다. Linux는 BlueZ로 광고하지만 실험실에서 휴대전화가 연결된 사례가 없다. Wi-Fi Aware로만 Witchat을 찾는 휴대전화는 Bluetooth를 광고하기 전까지 표시되지 않는다.
  • 주변에 공식 bitchat 앱이 설치된 휴대전화가 있어야 메시를 확인할 수 있다. BitChat Desktop의 Windows/Linux 미리보기는 GATT를 지원하지 않아 시험 피어로 쓸 수 없다.
  • 창을 닫아도 프로그램은 트레이에서 계속 실행된다. Windows와 알림 영역이 있는 Linux 데스크톱에서 동작하며, Settings > start at login은 기본적으로 꺼져 있다. 트레이 아이콘에서 종료한다.
  • 결제 기능은 지갑이 아니다. /pay와 결제 칩은 공식 bitchat처럼 토큰 전달을 담당한다.
  • Tor는 선택 기능이며 함께 제공되지 않는다. Settings > TOR는 Tor Browser(127.0.0.1:9150) 또는 Tor 서비스(127.0.0.1:9050)를 통해 릴레이를 연결한다. 사용하지 않으면 위치 채널과 Nostr 메시지가 PC IP에서 릴레이로 전달된다. Windows Tor 안내, Linux Tor 안내를 참고한다.
  • 키는 디스크에 저장된다. Windows에서는 신원·대기함·피어 공개 키를 사용자 계정용 DPAPI로 암호화한다. Linux에서는 Secret Service 키를 사용할 수 있으면 세션 키링으로 감싼다. 없으면 신원은 소유자만 읽을 수 있는 파일에 저장하고 대기함과 피어 목록은 메모리에만 둔다. 자세한 내용은 SECURITY.md에 있다.
  • GUI는 iced를 사용하며 Win32나 GTK가 아니다. Mac 클라이언트도 아니다. macOS는 공식 bitchat이 지원한다.
  • 이 저장소에서 공식 Android 앱을 설치하지 말고 Play Store 또는 재현 가능한 공식 릴리스를 이용하라고 안내한다.

프로젝트와 빌드

공식 bitchat은 iOS·macOS·Android를 지원하지만, PC는 프로토콜 스택을 다시 구현하지 않는 한 메시 네트워크에 참여할 수 없다. 다른 데스크톱 프로젝트로는 공식 Mac 앱을 재구성한 BitChat Desktop(Windows/Linux 빌드는 Bluetooth 검색만 지원), 터미널 클라이언트 bitchat-tui, 90줄 UDP 콘솔인 zakkeasterbrook/bitchat-windows가 있다. Witchat은 iced 데스크톱 GUI, 압축을 풀어 실행하는 배포 방식, 감사 가능한 Rust 프로토콜 크레이트로 구성된다. 공식 앱보다 앞서 나가기보다는 공식 앱을 따른다. 자체적인 와이어 변경은 없으며 개인정보 보호 변경은 양쪽 공식 플랫폼에 적용된 뒤에만 반영한다.

빌드에는 Rust 1.90 이상이 필요하다. Windows에서는 C++를 포함한 MSVC Build Tools의 Desktop development with C++도 필요하다. 제작자가 제시한 명령은 다음과 같다.

text
cargo test --workspace cargo build -p witchat-app --release 

릴리스 실행 파일은 Windows에서 target/release/witchat.exe, Linux에서 target/release/witchat이다. 패키징은 Releases와 같은 압축 해제 후 실행하는 폴더를 만든다. Windows는 powershell -File scripts/build-windows.ps1, Linux는 bash scripts/build-linux.sh를 사용한다. PowerShell에서 cargo를 찾지 못하면 먼저 . .\scripts\use-rust.ps1을 실행한다.

명령줄 플래그는 cargo run -p witchat-app -- --scan(GUI 대신 터미널 메시 클라이언트), cargo run -p witchat-app -- --relay(별도 신원을 사용하는 헤드리스 노드), cargo run -p witchat-app -- --testnet(UUID …4B5A를 쓰는 공식 디버그 휴대전화 빌드), cargo run -p witchat-app -- --no-advertise(GATT 서비스를 광고하지 않고 휴대전화에 접속), cargo run -p witchat-app -- --geohash 9q8yy(터미널 위치 채널 클라이언트), cargo run -p witchat-app -- --geo-lab dn(휴대전화의 위치 셀 목록에 Witchat이 표시되는지 확인), cargo run -p witchat-app -- --qr-lab mine(키가 바뀐 QR 실험)이다.

명령어로는 대화창에 글을 보내는 것 외에 /msg nick text(어디서든 비공개 메시지), /nick name(닉네임 변경 및 재공지, 기본값은 휴대전화처럼 anon 뒤에 숫자 4개), /fav nick·/unfav nick(즐겨찾기 등록·해제와 알림), /hug nick·/slap nick(iOS 이모트), /ping nick·/trace nick(메시 피어의 왕복 시간·경로 추정), /geo <cell>·/leave(위치 채널 참여·나가기), /send <path>(최대 1MiB 이미지·음성 메모·PDF 전송), /sendvisible <path>(암호화 미디어를 지원하지 않는 피어에게 읽을 수 있는 서명 파일 전송), /pay <token>(Cashu 전송, 공개 채팅에서는 /pay <token> public), /block [nick]·/unblock [nick](숨기기·숨김 해제), /clear(대화 비우기), /history [on|off](기본적으로 꺼진 #mesh·위치 기록 설정), /who(재공지), /help(명령어 목록), /hs nick(문제 해결을 위한 Noise 핸드셰이크 재시작)이 있다.

보안 방식과 보호하지 않는 항목, 디스크에 저장하는 데이터, 취약점 신고 방법은 SECURITY.md에 있다. 빌드·검사·프로젝트 규칙·휴대전화 시험 사례는 CONTRIBUTING.md에서 확인할 수 있다. Windows와 Linux 배포 압축 파일에는 SHA-256 해시, Git 커밋·컴파일러·빌드 시각을 담은 출처 정보 JSON, THIRD-PARTY-NOTICES.txt가 포함된다. 변경점과 알려진 미작동 항목은 CHANGELOG.md에 정리돼 있다. 라이선스는 MIT다. 프로토콜은 Unlicense로 공개된 공식 iOS/macOS 소스에서 재구현했다. 공식 Android는 GPL-3.0이며 읽기 전용 참고 자료로만 사용했고 코드를 복사하지 않았다고 프로젝트는 밝힌다.