Nexa Beep 아이콘

Nexa Beep

v0.2.14

설정 없이 실행만 하면 같은 네트워크의 동료가 바로 보이는 종단 암호화 메신저

다운로드 GitHub 문서 (Wiki)

모든 데스크톱 OS에서 사용할 수 있어요

설치

Windows

  1. 설치형 (권장) — GitHub Releases에서 nexa-beep-<버전>-windows-x64-setup.exe(ARM64는 windows-arm64)를 받아 실행합니다. 사용자 단위(HKCU) 설치라 관리자 권한이 필요 없고 UAC 창이 뜨지 않습니다. 무인 설치는 /S. 설치 후 시스템 시작 시 자동 실행이 기본 켜짐이며 설정 ▸ 고급 app.autostart에서 끌 수 있습니다.
  2. 포터블nexa-beep-<버전>-windows-x64-portable.zip을 풀고 nexa-beep.exe를 더블클릭하면 끝입니다. 설정·신원·기록은 exe 옆 data\ 폴더에만 생겨 폴더째 옮기면 신원도 따라옵니다(USB 휴대 가능). 같은 폴더의 nbeep-imgdec.exe(이미지 격리 디코더)는 지우지 마세요 — 없으면 사진 대신 이니셜 아바타로 폴백합니다.
  3. 릴리스마다 SHA256SUMS.txt가 함께 올라옵니다. Get-FileHash <파일> -Algorithm SHA256으로 대조하세요.
  4. 기기를 옮기거나 포맷할 때data\identity.key가 곧 신원입니다. 설정 ▸ 프로필에서 백업해 두지 않으면 재설치 후 상대에게 다른 사람으로 보입니다. 대화 기록은 기기를 따라가지 않습니다.

시스템 요구사항: Windows 10 / 11 (x64 · ARM64) — .NET·Visual C++ 재배포 패키지가 필요 없습니다. 발견은 UDP 47100, 세션은 TCP 47200(기본)을 쓰므로 첫 실행 시 Windows 방화벽이 묻는 허용 창을 승인하세요. 코드 서명 인증서가 아직 없어 SmartScreen 경고("알 수 없는 게시자")가 나올 수 있습니다 — "추가 정보 → 실행"으로 진행하세요. 패키지 매니저 채널 현황 (2026-09-01 실측): ⏳ winget SosomLab.NexaBeep(설치형) · SosomLab.NexaBeep.Portable(포터블) — v0.2.14 매니페스트를 새로 제출해 심사 중입니다(PR #427125 · #427126). 08-21에 올렸던 0.2.2 PR 2건은 검증 오류 라벨이 붙은 채 12버전이나 뒤처져, 닫고 최신판으로 다시 냈습니다. ⏳ Chocolatey nexa-beep · nexa-beep-portable — 첫 게시 검수가 끝날 때까지 제출을 보류하고 있습니다. 승인 전에는 winget install·choco install로 찾을 수 없으므로 그때까지는 위 GitHub Releases에서 직접 받으세요. 무서명 실행 파일은 바이러스 검사 오탐으로 지연되는 일이 잦습니다.

macOS

Homebrew Cask (권장 — .app 설치)

brew install --cask kiros33/tap/nexa-beep

서명·공증 전이라 서명 없는 앱에 격리 표식이 붙으면 macOS가 실행 자체를 SIGKILL합니다. Cask는 설치 시 격리 표식을 제거해 주므로(임시방편 — 서명은 로드맵) macOS에서는 이 경로를 권장합니다. 탭이 릴리스를 자동 추종해 0.2.14가 바로 반영된 것을 08-30 실측으로 확인했습니다. 갱신은 brew upgrade --cask nexa-beep.

Homebrew Formula (CLI 포터블)

brew install kiros33/tap/nexa-beep-portable

창 없이 터미널 단말(--chat-live)로 쓰거나 서버 경유 CLI를 돌릴 때. nexa-beep --window --live로 창도 띄울 수 있습니다.

  1. 수동 설치 — GitHub Releases의 .dmg(x64 · ARM64)를 열어 Nexa Beep.app을 응용 프로그램으로 끌어 놓습니다. 서명 전이라 처음 열 때 Gatekeeper가 막으면 xattr -dr com.apple.quarantine "/Applications/Nexa Beep.app"으로 격리 표식을 떼어 내거나 Cask 경로를 쓰세요.
  2. 데이터는 사용자 설정 폴더(포터블은 실행 파일 옆 data/)에 생깁니다. identity.key가 곧 신원이므로 설정 ▸ 프로필에서 백업해 두세요.

Apple Silicon · Intel 둘 다 네이티브 자산이 있습니다. 알림은 UNUserNotificationCenter 정식 경로라 첫 실행 시 알림 허용을 묻습니다. 발견(UDP 47100)·세션(TCP 47200)에 대한 네트워크 허용 창이 뜨면 승인하세요.

Linux

deb 패키지

sudo dpkg -i nexa-beep-<버전>-linux-x64.deb

GitHub Releases에서 받은 파일명으로 바꿔 실행합니다. 데스크톱 항목과 XDG autostart(사용자 수준 · 기본 켜짐)가 함께 등록됩니다.

포터블

tar xzf nexa-beep-<버전>-linux-x64-portable.tar.gz && ./nexa-beep

풀어서 바로 실행. 영속물은 실행 파일 옆 data/에 생깁니다.

현재 x64 자산만 제공합니다. 알림은 데스크톱 알림 경로를 쓰고 트레이는 구현되어 있으나, v0.2.10~v0.2.14에서 Linux 실기 검증을 집중적으로 진행해 앱 메뉴 실행·트레이 포커스·시스템 테마 추종·클립보드(Wayland·X11)를 실물로 확인했습니다 — 남은 문제가 있으면 GitHub 이슈로 알려 주세요. 릴레이 서버를 직접 세우려면 brew install kiros33/tap/nexa-beepd(Linux·macOS Apple Silicon) 또는 릴리스의 nexa-beepd-*-linux-x64.tar.gz(musl 정적 · 어느 배포판이든 바이너리 하나)를 쓰고, TCP·UDP 47300을 둘 다 엽니다.

서버 주소도, 계정도, 상대 등록도 없습니다. 실행하면 같은 네트워크에서 실행 중인 사용자가 자동으로 목록에 나타나고, 고르면 종단 암호화 세션으로 바로 대화합니다. 받은 파일은 격리 → 검사 → 승인을 거쳐야 실체가 되고, 다른 네트워크의 상대와는 내용을 볼 수 없는 릴레이 서버로 이어집니다. 산출물 약 1.7MB · 유휴 상주 17~20MB · 런타임 의존 0. (Windows · macOS · Linux)

주요 기능

기능 자세히 보기

발견 · 연결

사전 등록 없이 서로를 찾고, 발견이 닿지 않는 망에서도 손으로 이어 붙일 수 있습니다.

  • LAN 자동 발견 (UDP 47100) IPv6/IPv4 멀티캐스트와 브로드캐스트를 동시에 쏘는 다단 폴백 사다리(S1~S4). 발견 패킷은 서명 없는 힌트로 존재·표시 이름·포트만 싣고, 프로필·연락처·메시지는 절대 싣지 않습니다. 새 상대는 목록에 나타날 뿐 창을 빼앗지 않습니다 — 여는 것은 사용자입니다.
  • 주소 직접 연결 (⌘/Ctrl+K) 다른 서브넷·VPN 너머 상대는 10.0.0.5처럼 주소를 넣어 연결합니다(포트 생략 = 기본 47200, [v6]:port 형식 검증). 수동 등록한 상대는 대화창을 닫아도 목록에 남고 기억한 주소로 재연결됩니다. 릴레이 서버를 쓸 때는 같은 창에 상대의 64자리 지문을 붙여넣습니다.
  • 세션 포트 47200 · 상태바 표시 세션은 기본 포트 47200을 우선 바인딩하고(점유 시 임의 폴백) 실제 수신 포트를 상태바에 상시 표시합니다. 설정 net.session_port--port <N> 인자로 바꿀 수 있어 방화벽 예외 등록이 예측 가능합니다.
  • 죽은 연결 감지 · 자동 재연결 TCP keepalive로 FIN 없는 죽음(전원 차단·강제 종료·망 단절)을 약 22초 안에 감지해 목록 점을 빨갛게 바꿉니다. 끊긴 상대는 5초 → 15초 → 60초 → 5분 백오프로 재시도하고, 자동 성립은 창을 열지 않습니다. 연결 수립은 전부 워커 스레드라 죽은 상대를 클릭해도 화면이 멈추지 않습니다.
  • 프레즌스 표시 — 색 × 실루엣 목록 점은 색 = 지금 닿는가(세션·LAN 발견·서버 공개 목록), 실루엣 = 세션 유무의 2축입니다. 초록(대화 중)·파랑(연결 시도 중)·빨강(끊김)·회색(발견만)에 적록 색각·저대비를 고려한 이중 부호화를 씁니다.
  • 목록 필터 바 (v0.2.6) 툴바 아래 아이콘 칩 3그룹 — Via(전체·로컬·서버·인터넷·그룹) · On(전체·온라인·오프라인) · Who(전체·인증·핀·신규). 선택은 저장되어 재시작 후 유지되고, 모든 칩과 툴바 버튼에 툴팁이 붙습니다. 서버 공개 목록으로만 아는 상대는 왕래가 생기기 전까지 Server 칩에서만 보여 스팸 표면을 줄입니다.
  • 목록 정렬 4모드 · 고정 · 타자 검색 최근 대화(기본)·이름·최근 접속·온라인 우선으로 정렬하고, 자주 보는 상대·그룹을 ★로 위에 고정합니다. 읽지 않은 메시지 개수 배지와 마지막 확인 시각이 행에 붙고, 창 제목에 "새 메시지 N"이 떠 작업 표시줄에서도 보입니다.

신원 · 신뢰

이름·IP·사용자 주장은 신원의 근거가 아닙니다. 신원은 기기 키 지문 하나입니다.

  • Noise_XX 종단 세션 X25519 · ChaCha20-Poly1305 · BLAKE2s. 핸드셰이크가 키 소유를 증명하고 이후 모든 페이로드가 AEAD로 암호화됩니다. 와이어에 평문이 없다는 사실은 tap 테스트로 고정되어 있고, 파일도 별도 포트가 아니라 같은 암호 세션의 File 스트림을 탑니다.
  • TOFU 핀 — 암호화 영속 · fail-closed 첫 접촉에서 키를 고정하고 이후 같은 키만 신뢰를 잇습니다. 핀 파일은 "내가 아는 상대 전체 목록"이라 그 자체를 암호화하며, 손상·키 불일치 시 조용히 재핀하지 않고 전부 미검증 취급 + 잠김 표시로 닫힙니다. 이름 재사용은 경고합니다.
  • 지문 대조 승격 (/fingerprint → /verify) /fingerprint로 내 지문과 상대 지문을 출력하고, 전화·대면 등 다른 채널로 맞춰 본 뒤 /verify(또는 프로필 카드의 대조 완료 버튼)로 승격합니다. 인증하려는 그 통로 안에서 "확인했어?"를 주고받아 승격하면 중간자가 그 문답까지 대신할 수 있으므로, 통로 밖 대조가 전제입니다. /unverify로 되돌립니다.
  • 신뢰 배지 가족 미검증 · 핀 고정 · 지문 대조됨 · 차단 · 이름 충돌 · 첫 접촉을 색과 실루엣으로 구분합니다. 프로필의 실명·연락처는 "이 키의 주장"일 뿐이라 신뢰 배지와 함께 표시하고, 보증하지 않는 것을 보증하는 척하지 않습니다.
  • 신원 키 백업 · 복원 · 실명 비방송 identity.key가 곧 신원이라 설정 ▸ 프로필에서 백업·복원(핫 로딩)합니다. 표시 이름 기본값은 실명 추정 부분을 제거한 호스트명(판별 불가 시 beep-{지문})이라 실명이 LAN에 평문으로 방송되지 않으며, 바꾸면 즉시 재공지됩니다.

대화

카카오톡식 말풍선과 전달·읽음 점, 오프라인 큐, 입력창 명령까지 — 메신저의 기본기를 전부 갖췄습니다.

  • 말풍선 대화창 좌우 말풍선·꼬리·분 단위 시각·날짜 알약, Shift+Enter 멀티라인, 말풍선·입력란 우클릭 메뉴, 전체선택·복사·잘라내기·붙여넣기·더블/트리플 클릭·Shift+이동 선택·가로 스크롤 등 텍스트 편집 기본기 일습. 대화 헤더(48px)에는 상대 아바타·이름과 경로 배지(via server 파랑 · via internet 주황)가 붙습니다.
  • 전달 · 읽음 확인 내 메시지 옆 점 1개 = 전달, 2개 = 읽음. 두 축은 완전히 독립이고 읽음은 활성 창 기준으로 자동 처리됩니다. 둘 다 수신자 설정으로 제어(기본 On)하며 검증된 상대에게만 되쏘는 프라이버시 게이트가 걸려 있습니다.
  • 오프라인 큐 (1:1) 상대가 꺼져 있어도 보낼 수 있습니다. 내 PC에 보관했다가 상대가 나타나면 자동 전달하고 재시작해도 유지됩니다. 서버 보관이 아니라 내 PC가 켜져 있을 때만 전달되는 발신자 측 큐라는 한계는 그대로 적어 둡니다.
  • 메시지 등급 · 공지 브로드캐스트 메시지에 등급을 붙여 알림 강도를 구분하고, 공지를 여러 상대에게 한 번에 보냅니다. 알림은 미검증 상대에게서 온 것이면 무음으로 처리하는 신뢰 게이트를 거칩니다.
  • 클립보드 이미지 전송 (Ctrl+V) 캡처한 화면을 입력창에 붙여넣으면 바로 이미지로 전송됩니다(3-OS). 수신측 미리보기는 격리 프로세스가 디코드합니다.
  • 입력창 /명령 /로 시작하면 메시지가 아니라 로컬 명령입니다 — /help · /fingerprint · /verify · /unverify · /trust · /close. 앞에 공백이 있으면 메시지로 보내고, //안녕/안녕으로 보내며, 오타 명령은 보내지도 실행하지도 않고 안내만 합니다.
  • 대화함 — 기록 관리 저장된 대화 기록을 목록·미리보기·필터로 관리하고, 클릭해 열고, 2단계 확인으로 삭제하며, sealed 봉투째 백업·복원합니다.

파일 전송 · 무해화

보낸 사람이 누구든 믿지 않습니다. 받은 파일이 실체가 되려면 반드시 네 단계를 거칩니다.

  • ① 협상 자격(핀 + 양방향 대화)·수신 정책(자동/기간/수동/거부)·용량 상한·속도를 먼저 합의합니다. 상호 대화 전에 파일이 막히면 "왜 + 뭘 하면 되는지"를 모달로 보여 줍니다(스팸 방어 규칙의 가시화). 송신 전에 상대의 상한을 확인해 읽기 전에 초과를 차단합니다.
  • ② 격리 — .beepq 봉인 원본은 실체화되지 않고 해시·메타를 담은 .beepq 봉인으로 격리함에 들어갑니다. 전송 "완료"는 소켓 쓰기가 아니라 수신측 격리 성공의 종단 확인(ack) 으로만 확정됩니다("전달됨 · 확인 대기" → 완료).
  • ③ 검사 확장자·매직 바이트로 위험 등급을 판정(fail-closed)하고, zip은 절대 해제하지 않고 중앙 디렉터리만 읽어 폭탄 구조를 거릅니다(zip64 포함 · 암호화 zip·중첩·비zip은 "판정 불가"). Windows에서는 설치된 백신의 AMSI 실물 검사를 거칩니다(EICAR 실측). 표기는 사실만 — "검사됨(탐지 없음) / 검사됨(탐지) / 검사 안 됨".
  • ④ 승인 실체화 사람이 승인해야 다운로드 폴더로 나갑니다. 해시 재검증·실행 비트 제거 후 OS 격리 표식(macOS quarantine xattr · Windows MotW Zone.Identifier)을 남겨 SmartScreen·Gatekeeper의 보호가 이어지게 합니다. 앱은 파일을 실행하지 않고 링크를 자동으로 열지 않습니다.
  • 스트리밍 + 지연 해시 10GB급도 메모리에 올리지 않고 보내며 UI가 멈추지 않습니다. 해시는 전송하며 증분 계산해 완료 시 검증하므로 승인 창은 즉시 뜹니다. 수신 상한 기본 512MiB(설정), 발신은 무제한.
  • 이어받기 · 인챗 제어 끊긴 부분 수신물을 72시간/1GiB까지 봉인 보존했다가 재연결 시 N%부터 이어받습니다(프리픽스 해시 대조 · 불일치면 처음부터). 별도 전송 창 없이 풍선 안 ⏸▶✕로 송·수신 양쪽이 같은 상태를 보고, 배치 합산 배너와 전체 취소가 와이어로 전파되며, 정지 방치는 2분 뒤 자동 취소됩니다.
  • 요청 단위 승인 여러 파일을 끌어 놓으면 승인 1회(파일 수·이름 목록·총합 표시), 거절 1회 = 배치 전체. 요청당 최대 파일 수 1~5(기본 5), 용량 초과·폴더는 양쪽 목록에 "제외됨"으로 표시됩니다.
  • 격리 이미지 디코드 (nbeep-imgdec) 이미지 파서는 역사적으로 RCE의 단골 통로라 본체는 파서를 링크하지 않습니다. 아바타·수신 이미지 미리보기·확대는 별도 프로세스가 디코드하고 본체가 픽셀을 다시 검증합니다(원본 16MiB 상한 · 시간 초과 시 부모가 죽임 · SVG 미지원). 디코더가 없으면 이니셜 아바타로 조용히 폴백합니다.

그룹 대화

동보 전송이 아니라 구성원 전원이 같은 방을 보는 공유 채팅입니다 — 종단 암호화는 그대로.

  • 공유 그룹 채팅 발신자 아바타·이름 라벨이 붙은 한 스레드를 전원이 봅니다. 그룹 키를 따로 두지 않고 기존 1:1 세션 위로 팬아웃하므로 E2E가 그대로 유지됩니다. 로컬 "방송 그룹"(동보)과는 다른 계약이라 UI에서 구분합니다.
  • 소유자 명부 · 초대 수락제 그룹의 진실은 소유자가 서명한 명부(roster)이고 버전이 단조 증가해 구버전 재생을 막습니다. 명부에 올라도 내가 수락해야 내 화면에 방이 생기며(무단 편입 금지), 초대받은 방은 재시작 후에도 남아 클릭 = 수락/거절입니다. 구성원도 초대를 요청할 수 있습니다.
  • 기록 영속 · 자가 복구 그룹 대화 기록도 1:1과 같은 암호화 세그먼트로 저장되어 재시작 후 복원되고 발신자 라벨을 보존합니다. 옛 신원에 잠긴 세그먼트는 부팅 시 보관 이동 후 자가 복구합니다.
  • 미연결 구성원 자동 연결 · 재동기 연결되지 않은 구성원에게는 자동 연결 후 이어 전달하고, 재접속하면 송신자가 보관해 둔 분량을 재동기합니다(상한 설정). 그룹 파일은 구성원 수만큼 업로드되며, 콘텐츠 키 봉투로 줄이는 개선은 설계 완료 상태입니다.
  • 3-신원 실기 검증 세 신원으로 한 방을 꾸려 초대·수락·메시지·파일 팬아웃·재시작 복원을 실기로 검증한 기록을 저장소 문서(33 그룹 채팅 테스트 가이드)로 남겨 두었습니다.

릴레이 서버 — 다른 네트워크의 상대와

같은 LAN이면 언제나 직접 경로가 우선이고, 서버는 선택입니다. 서버가 죽어도 LAN 대화는 그대로 돌고, 서버가 있어도 내용은 열리지 않습니다.

  • 공식 기본 서버 · Test 1회 설정 › Server에서 모드를 Managed로 바꾸고 [Test] 를 한 번 누릅니다 — 주소·포트 기본값이 이미 공식 서버 beepd.sosomlab.com:47300입니다. 모드 전환이나 값 변경은 자동 접속하지 않고 Test 성공만이 접속을 열며(성공은 저장 — 이후 부팅은 자동), 접속 중에는 툴바에 표시가 떠 클릭하면 서버 설정으로 갑니다.
  • 회전 랑데부 ID — 서버는 명부를 만들 수 없다 서버에 올라가는 것은 공개키가 아니라 SHA-256("nbeep-rid-v1" ‖ 공개키 ‖ UTC 일 번호)의 앞 16바이트입니다. 날마다 바뀌고 역산이 불가능하며, 상대 지문을 이미 아는 사람만 그날의 ID를 계산할 수 있습니다 — 릴레이는 새로운 만남을 주선하지 않고, 모르는 사람은 나를 찾을 수 없습니다.
  • 랑데부 → 홀펀칭 → 릴레이 폴백 서버가 양쪽의 공인 (IP:포트) 관측값을 교환(STUN-lite)하고 동시에 UDP를 쏘게 조율합니다. 홀펀칭이 성립하면 서버는 경로에서 빠지고, 대칭 NAT 등으로 실패하면 암호문을 대신 나릅니다(연결당 1MiB/s 기본 상한). 어느 경로든 Noise_XX 종단 세션은 두 단말이 직접 맺습니다.
  • 서버가 보는 것 / 못 보는 것 보는 것: 회전 ID · 채널 번호와 개설/종료 시각 · 바이트 수 · 공인 IP:포트. 못 보는 것: 누구인지 · 대화 본문 · 파일과 파일명 · 프로필. 아무것도 저장하지 않습니다 — 버퍼가 아니라 파이프라 양쪽이 동시에 붙어 있을 때만 흐르고, 로그도 봉투만 남깁니다.
  • 서버 핀 — 사칭이면 시끄럽게 서버와도 Noise 핸드셰이크를 하고 서버 공개키를 TOFU로 핀합니다. 키가 바뀌면 조용히 재핀하지 않고 접속을 중단하며 경고합니다. 공식 서버의 핀은 위키에 공개되어 있어 첫 접속 때 표시되는 값과 대조할 수 있습니다.
  • 서버 사용자 자동 목록 · 공개 카드 (v0.2.5~0.2.6) "서버 사용자에게 나를 표시"를 켠 사용자끼리는 서버 접속만으로 서로 목록에 뜹니다(상호 규칙 — 끄면 목록도 받지 않음). 프로필에서 공개로 둔 이름·이메일·소개만 공개 카드로 중계되어 연결 없이 즉시 보이고, 연결 후 종단으로 받은 실제 프로필이 우선합니다. 서버는 카드를 해석하지 않고 크기만 봅니다.
  • 원격 파일 정책 — 경로 2축 신원 신뢰는 키에, 경로 등급은 통로에 붙습니다. 파일 발신은 설정 › Server의 "via server 상대에게 파일 전송" / "via internet 상대에게 파일 전송"(기본 둘 다 끄기)으로 경로별 허용하고, 인터넷 경유 상대의 파일은 지문 대조 전에 차단됩니다. 수신 승인 창은 경로(local/server/internet)를 색 배지로 또렷이 보여 주고 사람이 결정합니다.
  • 자가 호스팅 nexa-beepd 공식 서버는 편의일 뿐 특권이 없습니다. brew install kiros33/tap/nexa-beepd 또는 릴리스 자산(Linux는 musl 정적 651KB · 외부 의존 0 · Windows·macOS ARM64 자산)으로 직접 세우고, 사용자에게는 주소:포트와 핀 64hex 두 값만 배포하면 됩니다. systemd·작업 스케줄러·launchd 상주, 1GB 무료 VM 체크리스트가 저장소 문서(41)에 있습니다.

저장 · 프라이버시

디스크에 평문을 남기지 않고, 지우면 읽을 수 없게 만듭니다.

  • 봉인 봉투 NBSE — 평문 0 실측 대화 기록 · 격리된 수신물(.beepq) · PII 사이드카(profile.sec — 이메일·전화) · 프로필 이미지 캐시 · 신뢰 핀이 전부 ChaCha20-Poly1305 봉투로 저장됩니다. salt/nonce는 매회 신선하고, 파일 종류별 도메인 분리 키로 바꿔치기를 막으며, 평문 폴백이 없습니다(fail-closed). 2026-08-21 저장 축 전수 감사로 평문 0을 확인했습니다.
  • 크립토 셰레딩 대화를 삭제하면 그 대화의 데이터 키를 폐기해 잔존 바이트를 난수로 만듭니다. SSD 웨어 레벨링·백업 사본 때문에 물리 삭제는 보장할 수 없다는 한계와 함께 적어 둡니다 — 못 읽게 하는 것이지 지우는 것이 아닙니다.
  • 프로필 옵트인 노출 이름·이메일·전화·소개글·사진은 항목별 공개 토글(기본 전부 비공개)이고, 발견 패킷에는 어떤 프로필 필드도 싣지 않습니다. 연결된 상대에게만 암호화 세션으로 자동 프리페치되며, 같은 LAN의 상대는 발견 즉시 조용한 세션이 서서 프로필 변경이 실시간 반영됩니다(v0.2.6 · 서버 무관).
  • 진짜 포터블 · durable 폴백 영속물은 실행 파일 옆 data/에만 생깁니다(settings.cfg · identity.key · trust.seg …). 폴더가 읽기 전용이면 사용자 폴더로, 그래도 안 되면 ~/.nexa-beep로 폴백하되 임시 폴더는 쓰지 않습니다 — OS 청소로 신원이 조용히 바뀌던 함정을 없앴습니다. OneDrive류 동기화 폴더 안이면 경고합니다.
  • 목록에서 삭제 ≠ 차단 우클릭 ▸ 목록에서 삭제는 핀·프로필 캐시를 통째로 지우되 다시 만나면 새로 뜹니다(되돌릴 수 있어 안전한 기본). 차단은 별도이며, 익명 제로 컨피그에서 차단은 우회 비용을 올릴 뿐 근절하지 못한다는 한계도 문서에 적혀 있습니다.

화면 · 설정 · 상주

OS 위젯을 쓰지 않고 모든 픽셀을 직접 그려 세 OS에서 같은 화면을 냅니다.

  • 자체 렌더링 · 커스텀 컨트롤 19종 CPU 래스터라이저와 글리프 폴백·광학 크기 보정을 갖춘 텍스트 스택 위에 버튼·드롭다운·스위치·캐러셀·컨텍스트 메뉴·스크롤바(자동 숨김) 등 19종을 올렸습니다. 캐럿 깜빡임 530ms, OS 포커스 창에서만 깜빡이고 타이핑 중엔 항상 밝은 것까지 OS 규약을 따릅니다.
  • VS Code식 설정 화면 · 영속 트리·검색·즉시 적용. 테마(다크/라이트 + 주요 색 지정)·시간 형식·컨트롤 크기·한글 IME 기준값·알림·전송·서버 등 모든 설정이 재시작 후 유지되고, 백업/복원/초기화가 있습니다. 범위 밖 입력은 즉시 경고 + 직전값 원복. 초기화는 신원·핀·그룹·프로필·창 위치를 보존합니다.
  • 4개 언어 · 한글 IME 실측 대응 영어·한국어·중국어·일본어가 상태바·우클릭 메뉴·모달·명령·창 제목까지 전면 적용됩니다. 한글 조합 중 경합(H-1~27)은 실측 기반 게이트로 다스리고, 새 OS·IME 조합의 재발은 NEXA_IME_TRACE로 수집합니다.
  • 프로필 · 12간지 아바타 사진·이름·이메일·전화·소개글(멀티라인)을 편집하고 항목별 공개를 정합니다. 기본 아바타는 내장 12간지 자산에서 고르고 실사진도 쓸 수 있으며(격리 디코드), 툴바 프로필 버튼이 내 얼굴입니다. 우측 상단 [전체 64]·[짧은 8] 버튼으로 지문을 복사합니다.
  • 트레이/메뉴바 상주 · 알림 (3-OS) 트레이 아이콘은 내 아바타로 합성되고 우클릭 = 이름·열기·종료, ui.close_to_tray로 X = 숨김을 고를 수 있습니다. 알림은 macOS UNUserNotificationCenter · Windows · Linux 정식 경로이며 클릭하면 해당 대화가 열립니다.
  • 시스템 시작 자동 실행 (v0.2.0) Windows HKCU\…\Run · macOS LaunchAgent · Linux XDG autostart로 사용자 수준 등록(기본 켜짐 · 설정 ▸ 고급 app.autostart에서 해제). 포터블을 옮겨도 부팅 시 경로를 다시 맞춥니다. Windows에서 GUI를 띄워도 검은 콘솔이 남지 않습니다.
  • 창 크기 · 위치 기억 메인 창 최소 474×689(첫 실행 = 최소 크기), 창 위치·크기가 재시작 후 유지됩니다. 주소 등록·프로필 창은 항상 위 모달이고 인바운드 연결이 창을 빼앗지 않습니다.
  • 상태 로깅 (옵션) 기본 꺼짐. 켜면 상태바 메시지를 일자별 파일로 남겨 진단에 쓰고 설정에서 바로 엽니다. 내용은 상태 문구뿐이며 어디로도 전송되지 않습니다.

CLI 단말

GUI 없이 터미널만으로 참여합니다. 수신은 모두에게서 받고, 상호 대화는 명시적으로 연결한 한 명과 합니다.

  • --chat-live nexa-beep --chat-live 내이름으로 대기하며 /peers로 발견 목록을 보고, /connect <번호> 또는 /connect <host[:port]>로 골라 대화합니다. 한 줄 = 전송, /send <파일…>(공백 구분 다중 · 요청당 최대 5), /accept·/reject(요청 전체), /quit은 대화만 끝내고 목록으로 돌아갑니다.
  • 수신 전용 채널 상대가 걸어온 연결은 받아서 세워 둡니다 — {지문}(수신 전용)>으로 메시지가 보이고 전달/읽음 확인도 되쏘지만 대화 모드로 자동 진입하지 않습니다(거절하면 상대 GUI가 무한 재시도해 로그가 홍수가 됐던 교훈). 대화하려면 /connect로 승격합니다.
  • 서버 경유 CLI --server <주소>:47300으로 릴레이에 등록하고 --chat-connect-via <상대지문64>로 인터넷 너머 상대에게 겁니다. --whoamifull = 줄이 내 64자리 지문입니다. Windows cmd/pwsh에서 부르면 앱이 자기 콘솔 창을 새로 엽니다(Git Bash·파이프는 그 자리 그대로).

예산 · 품질 · 배포

가벼움과 정확함을 게이트로 강제하고, 실측으로만 말합니다.

  • 예산 게이트 산출물 ≤10MB/타깃 · 유휴 RSS ≤30MB · 런타임 의존 0 · 24시간 상주 누수 0을 CI 4잡(lint · 3-OS 테스트 · 교차 빌드 · 예산 게이트)이 검사합니다. 실측: 산출물 약 1.7MB, 유휴 Windows 17.1MB · macOS 18~20MB(phys_footprint — mac ps RSS는 reclaimable 허수라 판정에 쓰지 않음).
  • 테스트 783 green · 실기 기록 clippy 경고 0. Windows↔macOS 2-PC 실기(메시지·파일·프로필 왕복 · 교차 대용량 전송·이어받기), 3-신원 그룹 실기, 10분 자동 네트워크 계측(과다 송수신 0), 실 NAT 릴레이 연결(08-22)을 저장소 문서에 기록으로 남깁니다.
  • 5타깃 × 2채널 자동 배포 Windows x64·ARM64 · macOS x64·ARM64 · Linux x64에 NSIS 설치본(사용자 단위·무권한·무인 /S) · dmg · deb · 포터블 zip/tar.gz — 자산 14종 + SHA256SUMS.txt. 태그 push = 자동 공개. Homebrew Cask/Formula 자동 추종, winget·Chocolatey 매니페스트 자동 생성. 서버 nexa-beepdbeepd-v* 별도 릴리스.
  • 문서 41종 · ADR 14종 · 알려진 한계 설계 문서·결정 기록·종단 동작 설명서·경쟁 조사·와이어 보안 감사·알려진 한계(40)가 저장소 docs/에 SSOT로 있고 위키가 요약합니다. "UI가 이 문서에 없는 보증을 말하면 그것이 버그"라는 원칙으로 표기를 관리합니다.

소개

Nexa Beep는 설정이 없는 로컬 네트워크 메신저입니다. 첫 실행부터 대화까지 설정 화면이 한 번도 나오지 않습니다 — 실행하면 같은 네트워크의 사용자가 스스로 목록에 나타나고, 한 명을 고르면 그 자리에서 대화가 시작되며, 발견된 사용자를 그룹으로 묶어 한 방에서 함께 이야기할 수 있습니다. 사내망에서 20년 넘게 쓰여 온 일본산 IPMsg류 도구가 채우지 못한 자리 — 낡은 화면, Windows 전용, 느린 갱신, 평문 전송 — 를 겨냥해 만들었습니다.

일곱 가지 설계 원칙이 제품 전체를 관통합니다. ① 실행 = 참여(제로 컨피그) ② 사전 등록 없는 자동 발견 — 멀티캐스트가 막힌 사내망까지 다단 폴백으로 ③ 기본은 P2P 직접 연결, 서버 경유는 선택 ④ 경로가 무엇이든 내용은 두 단말만 읽는 종단 암호화 — 릴레이 서버도 예외 없음 ⑤ 받은 파일은 어떤 경우에도 실행되지 않음 ⑥ 런타임 의존 없는 네이티브로 최소 크기·최소 메모리 ⑦ Windows(x64·ARM64)·macOS·Linux에서 모든 렌더링을 직접 그려 같은 화면. OS 위젯도, Qt·Electron·WebView 같은 UI 프레임워크도 쓰지 않고 커스텀 컨트롤 19종을 자체 래스터라이저 위에 올렸습니다.

신원은 이름이 아니라 기기의 키 지문입니다. 상대와 처음 연결될 때 Noise_XX 핸드셰이크로 키 소유가 증명되고, 그 키가 신뢰 핀으로 고정(TOFU)되어 이후에는 같은 키만 신뢰를 잇습니다. 이름이 같아도 다른 키에 신뢰가 옮겨가지 않고, 같은 이름의 새 키는 이름 충돌 표식으로 드러납니다. 확신이 필요하면 /fingerprint로 지문을 확인해 전화나 대면 등 다른 채널로 대조한 뒤 /verify로 승격합니다. 표시 이름의 기본값은 실명 추정 부분을 걷어낸 호스트명이라 실명이 LAN에 평문으로 방송되지 않습니다.

파일은 보낸 사람이 누구든 믿지 않습니다. 협상(자격·수신 정책·용량·속도 합의) → 격리(원본을 실체화하지 않고 .beepq 봉인으로 격리함에) → 검사(확장자·매직 판정, zip은 해제 없이 구조만 점검, Windows는 설치된 백신의 AMSI 검사) → 승인 실체화(사람이 승인해야 다운로드 폴더로 — 해시 재검증·실행 비트 제거·OS 격리 표식)의 4단계 게이트를 반드시 거칩니다. 앱은 받은 파일을 실행하지 않고, 링크를 자동으로 열지 않으며, 아카이브를 자동으로 풀지 않습니다. 이미지 파서는 본체에 아예 링크하지 않고 별도 격리 프로세스에서만 디코드합니다. 전송 자체는 10GB급도 메모리에 올리지 않는 스트리밍이고, 끊기면 이어받으며, 풍선 안에서 ⏸▶✕로 제어합니다.

대화는 1:1과 공유 그룹 채팅 둘 다 됩니다. 그룹은 구성원 전원이 같은 방을 보고, 진실은 소유자가 서명한 명부이며, 명부에 올라도 내가 수락해야 내 화면에 방이 생깁니다. 메시지마다 전달·읽음 점이 붙고, 상대가 꺼져 있으면 오프라인 큐에 보관했다가 나타날 때 전달합니다. 메시지 등급과 공지 브로드캐스트, 클립보드 이미지 붙여넣기 전송, 말풍선 우클릭 메뉴, 입력창 /명령이 있고, 터미널만으로 참여하는 CLI 단말(--chat-live)도 갖추고 있습니다.

디스크에 평문을 남기지 않습니다. 대화 기록·격리된 수신물·이메일·전화 같은 PII·프로필 이미지 캐시·신뢰 핀이 전부 같은 봉인 봉투(ChaCha20-Poly1305, 파일 종류별 도메인 분리 키)로 암호화되며, 2026-08-21 실측 감사로 평문 0을 확인했습니다. 대화를 지우면 그 대화의 데이터 키를 폐기하는 크립토 셰레딩이라 잔존 바이트는 난수가 됩니다. 데이터는 실행 파일 옆 data/ 폴더에만 생겨 포터블로 들고 다닐 수 있고, 신원 키는 설정에서 백업·복원합니다.

같은 LAN이 아닌 상대 — 집과 회사처럼 — 와는 릴레이 서버 nexa-beepd를 경유합니다. 설정의 Server 모드를 Managed로 켜고 [Test]를 한 번 누르면 공식 기본 서버(beepd.sosomlab.com)에 등록됩니다. 서버에는 공개키 원본이 아니라 날마다 바뀌는 회전 랑데부 ID만 올라가므로 서버는 사용자 명부를 만들 수 없고, 상대 지문을 이미 아는 사람만 그날의 ID를 계산할 수 있어 모르는 사람이 나를 찾아낼 수 없습니다. 연결은 랑데부 → UDP 홀펀칭 → 릴레이 폴백 순이고, 어느 경로든 Noise_XX 종단 세션은 두 단말 사이에서만 맺어집니다. 서버는 봉투(연결 사실·바이트 수·시각)만 보고 아무것도 저장하지 않습니다. 2026-08-22 집(맥) ↔ 회사(윈도우) 실 NAT 연결을 실증했고, 서버는 외부 의존 0의 651KB 정적 바이너리라 누구나 직접 세울 수 있습니다.

가벼움은 약속이 아니라 게이트입니다. 산출물 ≤10MB/타깃 · 유휴 상주 ≤30MB · 런타임 의존 0을 CI가 검사하며, 실측은 산출물 약 1.7MB, 유휴 상주 Windows 17.1MB · macOS 18~20MB입니다. 워크스페이스 테스트 783건 green, clippy 경고 0, CI 4잡(lint · 3-OS 테스트 · 교차 빌드 · 예산 게이트)을 매 커밋 통과하고, Windows↔macOS 2-PC 실기(메시지·파일·프로필 왕복·대용량 교차 전송·이어받기), 3-신원 그룹 실기, 10분 자동 네트워크 계측(과다 송수신 0)을 기록으로 남깁니다.

무엇을 막지 못하는지도 숨기지 않습니다. 첫 접촉 그 순간의 중간자는 TOFU가 원리적으로 탐지하지 못하고(지문 대조가 완화책), 클라이언트 격리나 IGMP 스누핑이 걸린 기업 무선망에서는 발견이 전멸할 수 있으며(수동 주소 등록이 폴백), "검사됨(탐지 없음)"은 설치된 백신의 판정일 뿐 안전 보증이 아닙니다. 기록은 기기를 따라가지 않고, 릴레이를 쓰면 내용은 몰라도 "누가 누구와 언제"라는 메타데이터는 서버가 알게 됩니다. 코드 서명 전이라 SmartScreen·Gatekeeper 경고가 뜹니다. UI가 이 목록에 없는 보증을 말하면 그것이 버그라는 원칙으로 표기를 관리합니다.

배포는 Windows x64·ARM64, macOS x64·ARM64, Linux x64의 5타깃 × 설치본·포터블 2채널(자산 14종 + SHA256SUMS)이며 태그를 푸시하면 자동으로 공개됩니다. Homebrew는 릴리스와 함께 자동 추종하고, winget·Chocolatey는 첫 게시 검수를 기다리고 있습니다. PolyForm Noncommercial 1.0.0 라이선스로 개인·비상업 사용은 무료이며, 상업 사용은 별도 유료 라이선스(문의 [email protected])가 필요합니다.

릴리스 노트

v0.2.14 2026-08-30 Linux·macOS 클립보드 자체 구현 — 이미지 붙여넣기가 3-OS 전부에서 동작합니다.

수정

  • Linux에서 붙여넣기가 통째로 안 되던 문제 — 이미지뿐 아니라 텍스트까지 전멸이었습니다. 원인은 클립보드를 wl-paste · xclip 같은 외부 도구를 실행해 읽고 있었는데 GNOME 기본 설치에는 그 도구들이 없다는 것 — 특정 배포판 문제가 아니라 프로토콜 계층을 남에게 맡긴 설계의 문제였습니다.
  • 클립보드를 직접 구현했습니다. Wayland는 ext-data-control 우선에 코어 wl_data_device 폴백, X11은 셀렉션 규약(대용량 전송 INCR 포함)을 순수 Rust로 다룹니다. 새 의존성은 0 — 창 라이브러리가 이미 쓰던 것과 같은 판을 씁니다. 외부 도구 실행은 최종 폴백으로만 남겼습니다.
  • macOS도 NSPasteboard를 직접 다루도록 바꿔 3-OS 자체 구현이 완결됐습니다.

개선

  • 자동 실행의 macOS 슬롯에 회귀 테스트를 붙였습니다(v0.2.13의 인스턴스별 슬롯 후속).
  • 릴리스 빌드를 설치본 자리에 덮어써 설치본처럼 실행하는 install-local 도구를 3-OS로 정비했습니다 — 배포 전 실기 확인이 빨라집니다.

배포

  • 테스트 799 green · 3-OS CI 전부 통과 · 자산 14종 · Homebrew 0.2.14 자동 추종 확인.
v0.2.13 2026-08-29 자동 실행을 인스턴스별 슬롯으로 분리 — 한 PC에서 여러 신원을 쓸 때의 줄다리기 종결.

수정

  • 같은 PC에서 여러 벌(여러 신원)을 쓸 때 자동 실행이 서로를 덮어쓰던 문제 — 등록 이름이 하나뿐이라 마지막에 켠 것만 살아남았습니다. 등록 이름에 실행 파일 경로 해시를 붙여 인스턴스마다 슬롯을 나눴습니다(Windows · macOS · Linux 공통).
v0.2.12 2026-08-29 트레이 “열기”가 창을 실제로 앞으로 가져옵니다 (Linux).

수정

  • Linux(GNOME · Wayland)에서 트레이 “열기”를 눌러도 창이 앞으로 오지 않던 문제 — Wayland는 앱이 스스로 창을 올릴 수 없고 셸이 준 활성화 토큰이 있어야 합니다. 셸에 토큰을 요청(ProvideXdgActivationToken)해 xdg_activation으로 올바르게 활성화하도록 고쳤습니다.
v0.2.11 2026-08-29 Linux 실기 피드백 5건 — 시스템 테마 추종 · 창 app_id · 트레이 Wayland 대응.

개선

  • 시스템 테마 추종이 기본이 되었습니다 — 데스크톱의 밝게/어둡게 설정을 그대로 따릅니다.
  • app_id 지정 — 작업 표시줄·Dock에서 아이콘과 이름이 제대로 붙습니다.
  • 트레이 열기·종료의 Wayland 대응 및 종료 시 스레드 정리에 시간 상한을 두어 매달리지 않도록 했습니다.
v0.2.10 2026-08-29 Linux 앱 메뉴 실행이 데모 모드로 뜨던 결함 정정 — 가짜 사용자 7명이 보이던 문제.

수정

  • Linux에서 앱 메뉴로 실행하면 목록에 가짜 사용자 7명이 뜨던 문제 — 데스크톱 런처의 실행 줄이 --window 단독이었는데, 이 인자는 네트워크를 쓰지 않는 데모 모드입니다. 08-13에 “인자 없이 실행 = 창 + 실물”로 정한 뒤 런처만 따라 고치지 못한 것으로, v0.2.2부터 v0.2.9까지의 Linux 설치본 전부가 해당됩니다.
  • 런처를 무인자 실행으로 정정했습니다. Windows 설치본 · macOS · Chocolatey · winget 쪽 실행 줄은 점검 결과 처음부터 정상이었습니다.
v0.2.9 2026-08-24 macOS brew 업그레이드 후 신원·설정이 사라지던 문제 정정.

수정

  • macOS에서 brew upgrade 뒤 지문과 설정이 전부 사라지던 문제 — “실행 파일 옆에 쓸 수 있으면 포터블”이라는 판정이 .app 번들과 brew 설치 자리를 포터블로 오판해, 신원 파일을 번들 안에 두고 있었습니다. 업그레이드는 번들을 통째로 갈아 끼우므로 그때 함께 사라진 것입니다.
  • 번들·/usr·/opt 같은 교체형 설치 자리를 인식해 포터블로 보지 않도록 고쳤고, 기존 data/가 남아 있으면 사용자 폴더로 한 번 이관합니다. Windows 설치본은 원래 영향이 없었고, Linux .deb도 안전했습니다.
  • ⚠️ 0.2.6~0.2.8에서 이미 소실된 신원은 복구할 수 없습니다 — 설정 ▸ 프로필에서 백업해 두세요.
v0.2.8 2026-08-24 자동 실행 항목을 사용자가 직접 지웠으면 앱이 다시 만들지 않습니다.

개선

  • OS 설정에서 자동 실행 항목을 직접 지운 경우, 앱이 조용히 재등록하지 않고 설정 쪽 스위치를 꺼진 상태로 맞춥니다. 사람이 끈 것을 앱이 되돌리지 않는다는 원칙을 따릅니다.
v0.2.7 2026-08-24 그룹 창에서 파일 주고받기 — 실기 4라운드로 다듬은 통합 개편.

추가

  • 그룹 창 파일 송수신 — 그룹에 파일을 보내면 참여자 전원에게 팬아웃되고, 받은 쪽은 그룹 스레드에서 처리합니다. 여러 건을 보낼 때는 풍선에 카운터로 집계되어 대화가 밀리지 않습니다.
  • 그룹 전송임을 알리는 표식을 제어 스트림에 추가해, 1:1과 그룹의 처리 경로가 섞이지 않도록 했습니다.

수정

  • 1:1로 받은 파일이 그룹 창으로 잘못 열리던 문제를 근절했습니다.
  • 받는 쪽 배너는 여러 건을 합산해 보여 주고, 자동 취소까지 남은 시간을 카운트다운으로 표시합니다.
  • 전체 취소는 요청 단위로 마감되어, 취소한 뒤 남은 제안 카드가 다시 나타나지 않습니다. 개별 ✕로 하나씩 취소하는 것도 됩니다.
  • 그룹으로 보내는 진행 상황은 목록의 그룹 행 막대 하나로 보여 줍니다 — 참여자 수만큼 막대가 늘어서던 것을 정리했습니다.
v0.2.6 2026-08-23 목록 필터 바 · 서버 공개 카드 · 원격 파일 정책 개편 — UX·정책 대규모 업데이트.

추가

  • 목록 필터 바 — 툴바 아래 아이콘 칩 3그룹(Via 전체·로컬·서버·인터넷·그룹 / On 전체·온라인·오프라인 / Who 전체·인증·핀·신규). 선택은 저장되어 재시작 후 유지되고, 모든 칩·툴바 버튼에 툴팁이 붙습니다. 서버 공개 목록으로만 아는 상대는 왕래가 생기기 전까지 Server 칩에서만 보입니다.
  • 서버 공개 목록의 즉시 프로필 — "서버 사용자에게 나를 표시"를 켠 사용자끼리는 공개로 둔 이름·이메일·소개가 연결 없이 즉시 목록에 보입니다(옵트인 항목만 · 연결 후 실제 프로필이 우선). 서버는 카드를 해석하지 않고 크기만 봅니다.
  • LAN 프로필 즉시 동기 — 같은 망 상대는 발견 즉시 조용한 세션이 서서 프로필·변경이 실시간 반영됩니다(서버 무관). 1회 실패가 영구 미동기로 남던 구멍은 재연결 사다리에 시딩해 교정했습니다.
  • 프레즌스 색 축 — 목록 점 = 색(지금 닿는가) × 실루엣(세션 유무). 서버 공개 사용자도 초록으로 보이고 On 필터의 온라인 판정에 포함됩니다.
  • 지문 복사 [64]·[8] 버튼 · 설정 초기화 확장(필터·창 크기 포함 · 프로필 정보는 보존).

개선

  • 원격 파일 정책 개편 — 파일 발신은 설정 › Server의 "via server 상대에게 파일 전송" / "via internet 상대에게 파일 전송"(기본 둘 다 끄기)으로 경로별 허용. 수신은 제한 없음 — 승인 창이 경로(local/server/internet)를 색 배지로 또렷이 표시하고 사람이 결정합니다.
  • 서버 검증 게이트 — Managed 전환·값 변경은 자동 접속하지 않고 [Test] 성공만이 접속을 엽니다(성공은 저장 — 부팅 자동 유지). 접속 중엔 툴바에 표시(클릭 = 서버 설정).
  • 대화 헤더 개편 — 툴바 높이(48px) · 상대 아바타+이름 · via server(파랑)/via internet(주황) 배지 분리.
  • 아바타 부팅 깜빡임 제거 · 읽음 확인 = 활성 창 기준 · 메인 창 최소 크기 474×689(첫 실행 = 최소 크기).

배포

  • Homebrew 자동 추종(0.2.6 ✓ 실측) · winget/Chocolatey는 첫 게시 검수 통과 대기로 계속 제외. 서버 재릴리스 없음(beepd-v0.2.5 유지).
  • 게이트: 테스트 787 green · 교차 빌드 0 경고 · 자산 14종 · CI 전 job 성공.
v0.2.5 2026-08-22 서버 사용자 자동 목록(roster) · 프로필 지문 복사 · 서버 beepd-v0.2.5.

추가

  • 서버 사용자 자동 목록(roster) — "서버 사용자에게 나를 표시"(기본 켜짐)를 둔 사용자끼리 서버 접속만으로 서로 목록에 표시됩니다(공개키만 · 상호 공개 규칙 — 끄면 목록도 받지 않음). 편입은 2초 틱당 256개 배치, 보관 상한 4096(악의 서버 폭주 방어).
  • 프로필 지문 복사 버튼 — 우측 상단 [전체 64]·[짧은 8]. 64자리가 ⌘/Ctrl+K 서버 랑데부의 대상 값입니다.

서버

  • beepd-v0.2.5(별도 릴리스) — roster 지원 · 패키지 매니저 3채널 첫 게시(brew 탭 즉시 · winget/choco 검수 대기). OCI 공식 서버에 배포하고 2클라이언트 상호 표시를 실서버로 검증했습니다.
v0.2.4 2026-08-22 기본 릴레이 서버 탑재 — 첫 실 NAT 연결(집 맥 ↔ 회사 윈도우) 성립.

추가

  • 기본 릴레이 서버 탑재 — 설정 › Server를 Managed로 켜면 beepd.sosomlab.com(앱 기본값)으로 등록됩니다. 첫 실측: 집(맥) ↔ 회사(윈도우) 실 NAT 연결 성립, 파일 전송도 무해화 게이트를 거쳐 정상 동작.
  • 서버 설정 UX 일습 — 주소 텍스트 입력(도메인) · 포트 표시 수정 · 연결 테스트 버튼 · 검증 영속(초록 "Server verified") · 접속/포트/타입 상태 표시.

수정

  • 콤보 직접 입력 = 완전한 텍스트 편집(선택·드래그·클립보드·우클릭 메뉴). v0.2.3의 주소 입력 버그로 GUI 진입이 막히던 문제 해소.
v0.2.3 2026-08-22 서버 접속 개통(클라이언트) + 릴레이 서버 첫 릴리스 beepd-v0.2.3.

추가

  • 서버 접속 개통 — GUI Managed 접속(TOFU 핀 · 자동 재접속) · 주소 모달 지문 연결 · CLI --server / --chat-connect-via · 자유 입력 설정 영속 수정.
  • 서버 첫 릴리스 beepd-v0.2.3(별도 · Linux musl 정적) — 회전 랑데부 ID · UDP 홀펀칭 + 릴레이 폴백 · 자작 경량 ARQ UdpLink · 외부 의존 0 · 0.35MB.
v0.2.2 2026-08-21 경로 2축 정책 · 아카이브 점검 완결 · 크립토 셰레딩 · AMSI 실물 검사 · 배포 3채널.

추가

  • 경로 2축 정책 — 신원 신뢰는 키에, 경로 등급은 통로에. 인터넷 경유 상대의 파일은 지문 대조 전 차단.
  • 아카이브 점검 완결 — zip64 포함 · 격리 내용 목록 · 중앙 디렉터리만 읽고 절대 해제하지 않음.
  • 크립토 셰레딩 — 대화 삭제 = 그 대화의 데이터 키 폐기. AMSI 실물 검사(Windows) — 설치된 백신의 판정을 격리 단계에 반영.
  • 저장 축 평문 0 실측 감사 — 기록·격리물·PII·프로필 캐시 전부 NBSE 봉인 확인.

배포

  • winget·Chocolatey 첫 제출(검수 대기) — 배포 3채널(Releases · Homebrew · winget/Chocolatey).
v0.2.1 2026-08-21 1:1 오프라인 큐 · 클립보드 이미지 전송 · 메시지 등급·공지 브로드캐스트.

추가

  • 1:1 오프라인 큐 — 상대가 꺼져 있어도 보관했다가 나타날 때 자동 전달(재시작 유지).
  • 클립보드 이미지 전송(Ctrl+V · 3-OS) · 메시지 등급 · 공지 브로드캐스트.

수정

  • 안정성 2건 — 클립보드 UAF · 경로 경합.
v0.2.0 2026-08-20 마이너 승격 — 시스템 시작 자동 실행과 Windows 콘솔 창 근절. 실행 경험이 바뀌는 변경.

추가

  • 시스템 시작 시 자동 실행(3-OS · 사용자 수준 — Windows HKCU\…\Run · macOS LaunchAgent · Linux XDG autostart). 기본 켜짐(옵트아웃 · 설정 ▸ 고급 app.autostart) · 포터블을 옮겨도 부팅 시 경로를 다시 맞춥니다.
  • CLI 단말 축 완결--chat-live가 조회·선택·능동 연결이 되는 단말로: /peers · /connect <번호|host[:port]> · 요청 단위 승인 · 다중 /send(요청당 최대 5) · 수신/읽음 확인 · 수신 전용 채널(인바운드는 전부 수락해 세워 두되 대화 자동 진입 없음).

수정

  • Windows 콘솔 창 근절 — GUI를 띄워도 검은 콘솔이 남던 문제. windows 서브시스템으로 전환하고 CLI 출력은 부모 콘솔에 붙여 보전합니다.
  • 대화형 CLI 입력 경합 해소cmd/pwsh에서 --chat-live를 부르면 앱이 자기 콘솔 창을 새로 엽니다(Git Bash·파이프는 그대로). GUI→CLI 파일 수신이 전멸하던 지연 해시 꼬리 보정 누락 수정.
v0.1.8 2026-08-20 대용량 전송 축 완성 + 전송 UI 대화창 통합 + 대화함.

추가

  • 발신 스트리밍 + 지연 해시 — 10GB급도 메모리에 올리지 않고 전송(UI 무정지) · 해시는 전송하며 계산해 완료 시 검증.
  • 송수신 용량 상한 — 발신 무제한 · 수신 512MiB 기본 · 송신 전 상대 상한 확인(읽기 전 차단).
  • 전송 재개(이어받기) — 끊긴 부분을 봉인 보존, 재연결 시 N%부터(해시 대조 fail-closed).
  • 인챗 전송 제어 — 별도 창 제거 · 풍선 안 ⏸▶✕(양방향 동치) · 배치 배너 + 전체취소 전파 · 정지 방치 자동 취소(기본 2분).
  • 요청 단위 승인·거절 — 다중 파일 = 승인 1회(목록·총합·제외 표시) · 거절 1회 = 전체 · 요청당 최대 파일 수(1~5).
  • 대화함 — 저장된 대화 기록 관리(목록·미리보기·필터·클릭 열기·2단계 삭제·sealed 백업/복원). 그룹 영속 — 그룹 대화 기록 재시작 복원 · 잠긴 세그먼트 자가 복구 · 초대 자가 수락.
  • 지문 기반 검증(/fingerprint + /verify) · 평문 3면 봉인(격리물·PII·프로필 캐시) · Bio 멀티라인 · i18n 전면 · 데이터 폴백 durable(~/.nexa-beep) · 상태 로깅(옵션).
v0.1.7 2026-08-15 알림 3-OS 정식 · 트레이 상주(Windows) · 신뢰 배지 개편 · 대화창 명령.

추가

  • 알림(3-OS) — 정식 데스크톱 알림(mac UNUserNotificationCenter · Windows · Linux) · 클릭하면 해당 대화.
  • 트레이/메뉴바 상주 완주(Windows) — 아이콘 = 내 아바타 합성 · 우클릭 = 이름·열기·종료 · ui.close_to_tray.
  • 신뢰 배지 개편 — 연결 상태를 색 + 실루엣 2중 부호화(적록 색각·저대비 대응) · 인증 배지 가족(차단·이름 충돌·첫 접촉).
  • SAS 대조 지점(이후 08-18 지문 비교로 전환) · M1 발견 견고화 · 대화창 명령 /… 도입.
v0.1.6 2026-08-13 첫 2-PC 실증(Windows↔macOS)에서 나온 피드백 일습.

추가

  • 읽지 않은 메시지 배지 — 목록에 개수 + 마지막 확인 시각 · 주 창 제목 "새 메시지 N". 인바운드 자동 열림 제거 — 상대가 연결해도 창을 뺏지 않습니다.
  • 자동 재연결(5초→15초→60초→5분 백오프) · 죽은 연결 감지(TCP keepalive · ~22초 실측) · 비발견 상대 목록 유지.
  • 파일 전송 자격 경고 모달 · 텍스트 편집 일습(복사/붙여넣기 전 입력창 · 가로 스크롤 · 영역 밖 드래그) · 주소 등록·프로필 창 = 항상 위 모달 · --port <N>.

수정

  • 파일 전송이 2MiB에서 끊기던 다중화 백프레셔 · 터미널(kitty 프로토콜) 상태 누수 3중 방어 · --chat-live 떠돌이 연결 내성.
v0.1.5 2026-08-13 세션 기본 포트 47200 · 이미지 미리보기 상한 4096².

추가

  • 세션 기본 포트 47200 — 우선 바인딩(점유 시 임의 폴백) · 설정 net.session_port · 주소 입력에서 포트 생략 가능 · 상태바에 실제 수신 포트 상시 표시 — 발견이 닿지 않는 상대와의 수동 연결이 예측 가능해졌습니다.
  • 이미지 미리보기 픽셀 상한 4096² — 폰 사진(12MP급)이 거부되던 것 해소(격리 디코드 원칙은 유지).
v0.1.4 2026-08-12 설정·신원·신뢰 핀 영속 · 프로필 · 격리 이미지 디코드.

추가

  • 설정 영속 · 신원·신뢰 핀 영속(재시작해도 같은 신원·같은 신뢰 — TOFU 핀 암호화 저장) + 신원 키 백업/복원.
  • 표시 이름 정제 기본값 — 실명이 LAN에 평문 방송되지 않음. 프로필 — 편집 화면(사진·이름·이메일·전화) · 항목별 공개 토글(기본 비공개) · 세션 경유 교환 · 우클릭 프로필 카드.
  • 이미지 격리 디코드(imgdec) — 디코더는 격리 프로세스에만(본체 미링크) · 5타깃 전 채널 동봉. Windows MotW 표식 · Switch 컨트롤 · 컨트롤 크기 옵션.
v0.1.3 2026-08-11 Windows 더블클릭 무반응 수정 · 파일 전송 종단 확인 · 주소 직접 연결 모달.

추가

  • 파일 전송 종단 확인(ack) — 발신 "완료"가 소켓 쓰기가 아니라 수신측 격리 성공으로 확정 + 미확인 전송 중 종료 가드.
  • 주소 직접 연결 모달(⌘/Ctrl+K) — 형식 검증(host:port · [v6]:port). 연결 무정지 완결 — 수동 주소 연결도 워커 스레드로.

수정

  • Windows 더블클릭·시작 메뉴 무반응 — 탐색기 실행 감지 → 창 모드. Windows 배포 실기 검증(설치/업그레이드/제거 · MotW 전파 · winget validate) 반영.
v0.1.2 2026-08-11 macOS 앱 더블클릭 무반응 수정 · 클립보드 실물 · 컨텍스트 메뉴.

수정

  • macOS 앱 더블클릭 무반응.app 번들 실행 = 창 모드 + 실물 발견. 스크롤바 자동 숨김을 벽시계 기준으로 정정 + ui.scrollbar_hide 설정.

추가

  • 클립보드 macOS/Linux 실물 구현(pbcopy · wl-copy/xclip) · 컨텍스트 메뉴 컨트롤 신설(말풍선·입력란 우클릭).
v0.1.0 · v0.1.1 2026-08-11 첫 공개 — 5타깃 × 2채널 배포 파이프라인.

배포

  • 5타깃 × 2채널 배포 파이프라인(태그 push 자동 공개) — Windows x64/ARM64 · macOS x64/ARM64 · Linux x64. NSIS 설치본(사용자 단위·무권한) · dmg · deb · 포터블(zip/tar.gz) · SHA256SUMS.txt.
  • Homebrew 탭(kiros33/tap) — Cask(.app) + Formula(포터블). winget·Chocolatey 매니페스트 자동 생성(게시는 스위치로 잠금).
  • macOS 격리 실측 반영: 서명 없는 앱 + quarantine = SIGKILL → Cask postflight 격리 제거(임시방편 — 서명·공증 로드맵).