본문으로 건너뛰기
로그인 둘러보기
윈도우즈 유틸 · 커뮤니케이션

Lunex

0

Lunex는 Tauri v2, React, Convex를 기반으로 만들어진 네이티브 데스크톱 채팅 애플리케이션으로, 모든 메시지와 미디어, 이모지 반응을 서버에 전송하기 전에 클라이언트에서 암호화하는 엔드투엔드 암호화를 핵심 원칙으로 내세웁니다.

메신저암호화채팅프라이버시

소개

Lunex는 Tauri v2, React, Convex를 기반으로 만들어진 네이티브 데스크톱 채팅 애플리케이션으로, 모든 메시지와 미디어, 이모지 반응을 서버에 전송하기 전에 클라이언트에서 암호화하는 엔드투엔드 암호화를 핵심 원칙으로 내세웁니다. 사용자 인증과 로그인 흐름은 BIP-39 12단어 니모닉에서 파생된 비대칭 키 쌍을 사용하며, 개인키는 기본적으로 RAM에만 존재하고 앱 종료 시 함께 사라집니다. Windows와 Linux에서 가벼운 네이티브 바이너리로 동작하도록 설계되었으며, GitHub 저장소에서 MIT 라이선스로 공개되어 있습니다.

상세정보

엔드투엔드 암호화 및 키 관리

모든 데이터는 디바이스를 떠나기 전에 암호화되며, 메시지는 Signal·WhatsApp과 동일한 NaCl box(TweetNaCl) 방식으로, 미디어 파일은 파일별 랜덤 IV를 사용하는 AES-GCM 방식으로 암호화됩니다. 가입 시 BIP-39 니모닉으로부터 비대칭 키 쌍이 생성되고, 개인키는 디바이스 밖으로 전송되지 않습니다. 이모지 반응 역시 저장 전에 개별적으로 암호화되며, 채팅 목록에 표시되는 마지막 메시지 미리보기조차 서버에는 암호문 형태로만 저장됩니다.

실시간 메시징과 미디어 공유

Convex의 반응형 쿼리와 WebSocket 구독을 통해 메시지가 전송되면 모든 참여자에게 즉시 전달되며, 채팅 열람 시 최근 30개 메시지를 먼저 불러오고 위로 스크롤할 때 과거 메시지를 페이지네이션 방식으로 로드합니다. 타이핑 표시, 전송·전달·읽음 확인 표시, 온라인/오프라인 상태 추적이 함께 제공됩니다. 이미지·영상·문서는 업로드 전 클라이언트에서 AES-GCM으로 암호화되며, 동일 메시지에서 여러 파일을 보낼 때는 업로드 배치 ID로 묶어 미디어 그리드로 표시합니다. 저장된 미디어는 6시간마다 실행되는 cron 작업으로 Convex 측에서 자동 삭제됩니다.

프라이버시 컨트롤과 세션 모델

온라인 상태, 타이핑 표시, 읽음 확인, 메시지 알림의 네 가지 속성을 각각 ‘모두에게’, ‘아무에게도’, ‘특정 연락처만’, ‘특정 연락처 제외’ 단위로 독립 설정할 수 있으며, 사용자 차단 목록도 제공됩니다. Lunex는 두 단계의 세션 모델을 제공합니다. 기본(Tier 1)에서는 매 실행마다 12단어 니모닉을 입력해야 하고 개인키는 RAM에만 존재하다가 앱 종료와 함께 사라지며, App Lock(Tier 2)을 활성화하면 6자리 PIN으로 비밀키를 AES-GCM 암호화한 형태로 OS 수준 안전한 저장소(Tauri plugin-store)에 보관하고 자동 잠금 타이머(1분·5분·30분·1시간)로 다시 잠글 수 있습니다.

메시지 관리와 채팅 부가 기능

본인 메시지 편집, ‘나에게만 삭제’, ‘모든 사용자에게 삭제’, 다중 선택 일괄 삭제, 답장, 메시지 정보(전송·전달·읽음 시각) 확인, 우클릭 컨텍스트 메뉴가 지원됩니다. 채팅별 색상 테마(내 말풍선·상대 말풍선·텍스트 색·배경색), 채팅 내 검색, 별표 메시지, 최대 3개까지의 고정 메시지, 이모지 반응, 1시간·6시간·12시간·1일·3일·7일 단위로 설정 가능한 소멸 메시지 타이머가 함께 제공됩니다.

시스템 통합과 친구 시스템

친구 요청 모델을 채택해 사용자명 검색, 요청 보내기·수락·거절, 수락 시 자동으로 대화가 생성되는 흐름을 제공하며 차단 사용자 관리도 가능합니다. 시스템 트레이로 최소화(좌클릭 표시, 우클릭 메뉴), 네이티브 데스크톱 알림, 서명된 빌드만 설치되도록 검증되는 자동 업데이트 기능이 포함됩니다. Tauri 알림 플러그인은 발신자의 알림 프라이버시 설정에 따라 발송 여부가 결정됩니다.

설치·시작·기본 사용

Windows에서는 winget을 이용한 설치가 권장됩니다. PowerShell에서 다음 명령으로 Lunex.Lunex 패키지를 설치한 뒤 실행할 수 있습니다.

  • winget install Lunex.Lunex (winget 메타데이터에 명시된 공식 설치 명령)
  • Releases 페이지에서 .msi 또는 .exe 설치 파일을 내려받아 직접 실행
  • Linux에서는 배포판에 맞는 패키지(AppImage/.deb/.rpm)를 Releases에서 받아 설치. AppImage는 실행 권한을 부여한 뒤 직접 실행, Debian/Ubuntu 계열은 sudo dpkg -i lunex_*.deb, Fedora·openSUSE 계열은 sudo rpm -i lunex_*.rpm

최초 실행 후 12단어 니모닉을 사용해 로그인하며, 이후 사용자명 검색을 통해 친구 요청을 보내고 수락되면 자동으로 채팅이 생성됩니다. 메시지·미디어·반응은 모두 클라이언트에서 암호화된 뒤 전송되며, 필요에 따라 Settings에서 App Lock(6자리 PIN)과 자동 잠금 타이머, 전역 기본 소멸 타이머, 사용자별 프라이버시 예외 목록을 설정할 수 있습니다.

소스에서 직접 빌드 및 자체 호스팅

자체 호스팅을 진행하려면 Node.js v20 이상, Rust stable 툴체인, Convex 계정이 필요합니다. 저장소를 클론해 npm install을 실행한 뒤 한 터미널에서 npx convex dev로 Convex 개발 서버를 시작하고, 다른 터미널에서 npx tauri dev를 실행하면 개발 모드로 앱이 동작합니다. 프로덕션 배포 시에는 Convex 대시보드의 프로덕션 키와 URL을 .env.production에 설정하고, npx tauri signer generate로 생성한 서명 키를 .env에 등록한 뒤 npx tauri build로 빌드합니다. Windows 빌드는 src-tauri/target/release/bundle/ 아래에 .msi와 NSIS .exe 형태로 출력되며, Linux 빌드는 AppImage·.deb·.rpm 형태로 출력됩니다.

버전 및 업데이트

현재 winget 메타데이터에 기록된 최신 버전은 0.1.2이며, 저장소 README에 따르면 자동 업데이트 체인이 세 개 버전에 걸쳐 검증되어 활성화되어 있습니다. Lunex는 Tauri updater 플러그인을 통해 시작 시 업데이트 엔드포인트를 확인하고, 서명된 새 빌드가 있으면 사용자에게 설치·재시작을 안내합니다. 업데이트 매니페스트(updater.json)에는 플랫폼별 다운로드 URL과 서명 정보가 명시되어 있습니다.

제한·라이선스·확인사항

Lunex의 라이선스는 MIT이며, 자세한 내용은 저장소의 LICENSE 파일에서 확인할 수 있습니다. winget 메타데이터에 명시된 릴리스 노트 본문은 비어 있어, 버전별 변경 사항의 구체적인 내용은 공식 GitHub Releases 페이지를 통해 확인해야 합니다. 또한 채팅 내 검색은 현재 세션에서 로드된 복호화 메시지를 대상으로 동작하므로 전체 대화 이력에 대한 검색은 향후 릴리스에서 제공될 예정입니다. 실시간 백엔드로 Convex가 사용되므로 서비스 이용을 위해서는 별도의 Convex 계정이 필요합니다.

시스템 요구사항

- GitHub 저장소의 Lunex는 Windows(x64)와 Linux 환경을 공식 지원하며, Windows 패키지는 winget 채널(Lunex.Lunex)과 .msi/.exe 설치 파일로 배포됩니다.
- 런타임으로 Tauri v2(Rust + WebView) 기반의 데스크톱 바이너리가 필요하며, winget 설치 시 별도 런타임 추가 설치는 요구되지 않습니다.
- 소스에서 직접 빌드할 경우에는 Node.js v20 이상과 Rust stable 툴체인이 필요하고, Linux에서는 libwebkit2gtk-4.1-dev, libssl-dev, libgtk-3-dev, libayatana-appindicator3-dev, librsvg2-dev 등의 시스템 라이브러리가 필요합니다.
- 실시간 백엔드로 Convex 계정과 Convex 개발 서버(npx convex dev) 또는 프로덕션 배포가 필요하며, Tauri 배포용 서명 키 쌍도 별도로 생성해 환경 변수로 등록해야 합니다.