r2d2-tv: webOS TV용 로컬 홈 화면, 프라이빗 브라우저, 음성 비서
r2d2-tv란 무엇인가
r2d2-tv는 오픈소스 프로젝트로, webOS 스마트 TV를 디스플레이와 리모컨만 남기고, 소유자가 선택한 스마트 기능만 다시 추가합니다: 로컬 홈 화면, 프라이버시 필터링 원격 브라우저, 그리고 푸시투토크 음성 비서. 모든 브라우저 렌더링과 음성 모델 추론은 TV나 벤더 클라우드가 아닌, 같은 LAN에 있는 별도의 aarch64 Linux 머신에서 실행됩니다.
이 프로젝트는 GitHub 사용자 anubhavmalhotra가 https://github.com/anubhavmalhotra/r2d2-tv 에 게시했으며, Hacker News에 "Show HN: Making a smart TV dumb and then smart"(아이템 50202865)로 제출되었습니다. 저장소에는 데모 비디오 https://anubhavmalhotra.com/vibing/r2d2-webos/r2d2-demo.mp4 와 "R2D2 for webOS"라는 제목의 더 긴 문서로 연결됩니다.
아키텍처: 하나의 Linux 호스트, 하나의 TV, 세 개의 코드 영역
r2d2-tv는 엄격한 책임 분리에 기반합니다. Linux 컴퓨트 호스트가 무거운 작업을 수행하고, TV는 디스플레이, 애플리케이션, 리모컨을 제공합니다. 저장소는 협력하는 세 부분을 설명합니다.
컴퓨트 호스트 (spark/)
호스트는 aarch64 Linux 머신입니다. 샌드박스 처리된 Chromium 세션을 개인 디스플레이 및 오디오 세션 내에서 렌더링하고, 해당 세션을 LAN을 통해 TV로 스트리밍합니다. 동일한 호스트는 로컬 음성 인식 및 의도 모델과 폐쇄형 명령 레지스트리를 실행합니다. 즉, 음성 명령 세트는 빌드 시 고정되며 개방형이 아닙니다.
TV 측 (tv/, voice/tv/)
TV는 홈 애플리케이션과 브라우저 뷰어를 실행합니다. 뷰어는 원격 입력을 호스트로 다시 보냅니다. TV의 루트 캡처 소유자는 리모컨의 음성 키를 가져와 상호 TLS를 통해 호스트로 제한된 오디오를 보냅니다.
콘텐츠 보호 (protection/)
콘텐츠 차단은 각 임시 브라우저 프로필에 로드되는 고정된 필터 규칙으로 구현되므로, 각 브라우징 세션은 상태를 축적하지 않고 깨끗하고 필터링된 프로필에서 시작됩니다.
로컬에 유지되는 것, 그리고 네트워크를 떠나는 것
모델 추론은 호스트에 유지됩니다. 이것이 프로젝트의 핵심 프라이버시 주장입니다.
저장소는 이것이 전면적인 오프라인 모드가 아님을 명확히 합니다: 요청된 웹사이트, 검색, 스트리밍 앱, 선택적 날씨 기능은 여전히 자체 제공업체에 연결됩니다. 즉, r2d2-tv는 TV 벤더를 데이터 경로에서 제거합니다 — 벤더의 홈 화면, 추천, 상시 음성 파이프라인 — 하지만 사용자가 방문하기로 선택한 사이트를 익명화하지는 않습니다. 보안 경계와 보고는 저장소의 SECURITY.md에 문서화되어 있습니다.
요구 사항
r2d2-tv를 실행하려면 양쪽에 특정 하드웨어와 소프트웨어가 필요합니다.
- 빌드 머신: Python 3.10 이상 및 Node.js 20 이상.
- 컴퓨트 호스트: aarch64 Linux, 비루트 서비스 계정(UID 1000); 샌드박스가 활성화된 Chromium snap; 개인 X 디스플레이용 Xvfb; WebRTC 경로용 PipeWire, WirePlumber, GStreamer 플러그인; MSE 및 AirPlay 경로용 하드웨어 HEVC 인코딩이 있는 FFmpeg; CUDA 지원 GPU와 Python 3.12(고정된 로컬 모델용, 약 10GB 가중치).
- TV: 소유자가 시스템(루트) 액세스와 패키지 설치 권한을 가진 webOS TV. 네이티브 음성 캡처는 정확한 펌웨어 빌드와 일치하는 툴체인과 헤더가 추가로 필요합니다.
- 네트워크: TV와 호스트가 같은 LAN에 있어야 합니다. 프로젝트는 처리량과 지터를 측정하도록 권고합니다. 명목 링크 속도가 재생 품질을 보장하지 않기 때문입니다.
빌드, 테스트, 배포
빌드
빌드는 소프트웨어를 설치하거나 장치에 접촉하지 않으며, 출력 디렉토리는 새로워야 합니다. 문서화된 흐름은 예제 구성을 git-ignored 파일로 복사하고, 사용자 장치에 맞게 편집한 다음, 빌더를 실행하여 서명되지 않은 홈 패키지, 렌더링된 호스트 서비스, TV 서비스 소스 및 파일 매니페스트를 생성합니다.
브라우저 단축키를 활성화하려면 개인 기능 키(umask 077 아래에서 Python secrets 모듈로 생성된 64자 16진수 토큰)를 생성하고 browser-key-file 옵션으로 빌드에 전달해야 합니다. 브랜드 로고는 의도적으로 포함되지 않습니다: 앱 ID를 허용된 data-URI 로고에 매핑하는 개인 JSON 파일이 제공되지 않으면 홈 화면은 텍스트 타일을 표시합니다. 렌더링된 출력은 배포 주소를 포함하고 브라우저 기능을 포함할 수 있으므로 비공개로 유지되어야 합니다.
테스트
오프라인 테스트는 Python 단위 테스트와 보호 증명 및 홈 화면 핵심 로직에 대한 Node 테스트 파일을 실행한 다음, 프라이버시 검사 스크립트를 실행합니다. UI 테스트는 홈 및 브라우저 화면에 Playwright의 Chromium을 사용합니다. 오프라인 검사 전체 목록은 저장소의 CI 워크플로 파일에 있습니다. 프로젝트는 오프라인 검사가 물리적 비디오 케이던스, 마이크 품질 또는 다른 펌웨어 빌드와의 호환성을 확립하지 않는다고 경고합니다.
호스트 배포
호스트 배포 모델은 수동입니다. 완전히 렌더링된 spark/ 트리는 서비스 계정이 소유한 버전 관리 디렉토리로 준비되며, 세션 관리자가 활성화되기 전에 사전 점검이 확인 전용 모드로 실행됩니다. 사전 점검은 샌드박스, 디스플레이 및 오디오, 콘텐츠 보호, DNS, 정리를 확인합니다. 패키지를 설치하거나 TV 재생을 확인하지 않으며, 일반적인 호스트 설치 프로그램이 없습니다 — 종속성 설치 및 서비스 감독은 일반 호스트 관리로 운영자에게 맡겨집니다.
런타임은 기능 키와 선택적 음성 구성을 서비스 계정 홈 디렉토리의 .local/share/baaz-browser/ 아래에 유지합니다. 프로젝트는 baaz-browser가 호환성을 위해 유지되는 레거시 런타임 디렉토리 이름이며, 이러한 파일은 개인 디렉토리 내에서 모드 0600이어야 한다고 언급합니다. 상주 음성은 추가로 고정된 모델 스냅샷, TLS 자격 증명, 로컬 페어링된 TV 제어가 필요합니다.
TV에 설치
권장 순서는 webOS 패키지 워크플로를 통해 홈 패키지를 설치하고 먼저 일반 애플리케이션으로 테스트하는 것입니다. 홈 및 유휴 라우팅 변경은 별도의 나중 단계입니다: tv/integration/ 내부의 오프라인 홈 플래너는 펌웨어의 캡처된 상태에서 후보 변경 및 롤백 페이로드를 생성합니다.
음성 캡처는 문서화된 로컬 캡처 활성화 계약을 따릅니다. 공개 빌더는 장치 액세스 권한을 얻거나, 시스템 파일을 패치하거나, 서비스를 자체적으로 활성화할 수 없습니다. 프로젝트는 사용자에게 UI 재시작으로 종료되지 않는 프로세스 외부에 원본 파일과 복구 경로를 유지한 다음, 리모컨, 기존 앱, 브라우저 재생, 연속 음성 누름, 대기 및 재개, 전원 꺼짐/켜짐을 확인하도록 지시합니다.
위험: 루트, 펌웨어 고정, 보증
r2d2-tv는 안전한 일반 목적의 수정이 아니며, 저장소는 이를 처음부터 명시합니다.
TV 구성 요소는 루트로 실행되고 특정 펌웨어 빌드에서 벤더 시스템 서비스를 수정합니다. 명시된 결과는 수정이 지원되지 않고, 보증이 무효화될 수 있으며, 재부팅 또는 공장 초기화까지 TV를 사용할 수 없게 만들 수 있다는 것입니다.
세 가지 특정 메커니즘이 그 위험을 수반합니다: 키필터 패치, 홈 및 유휴 라우팅 변경, 네이티브 음성 캡처. 각각은 벤더 서비스를 대체하거나 후킹하므로 실수는 TV가 복원될 때까지 리모컨, 홈 버튼 또는 음성을 비활성화할 수 있습니다. 펌웨어 SHA-256 핀, 코드 오프셋, 심볼 이름, 패치 앵커는 모두 단일 참조 빌드를 대상으로 합니다; 프로젝트는 사용자에게 자체 펌웨어에 대해 다시 유도하고 불일치 핀을 강제하지 말라고 말합니다.
현재 상태는 의도적으로 좁습니다
참조 배포는 하나의 TV와 하나의 펌웨어 빌드를 다룹니다. 해당 구성에서 홈, 브라우저, 원격 음성 명령은 종단 간 작동합니다. TV, 펌웨어, 리모컨, 호스트의 다른 모든 조합은 검증되지 않은 것으로 설명됩니다.
저장소는 소스와 오프라인 테스트만 제공합니다. 명시적으로 범용 루트 도구, 펌웨어 설치 프로그램 또는 호스트 설치 프로그램이 아닙니다. 또한 독립 프로젝트로, LG Electronics, Lucasfilm, The Walt Disney Company 또는 스트리밍 서비스와 제휴, 보증 또는 후원되지 않습니다.
라이선스
프로젝트 코드는 MIT 라이선스입니다. 브라우저 확장, 필터 도구 및 해당 데이터, 두 개의 런타임 어댑터는 GPL-3.0-or-later입니다. 타사 고지 파일은 해당 구성 요소와 업스트림 저작자 표시를 나열합니다.
커뮤니티 반응: 대안 및 HDMI 기준점
Hacker News 토론은 작았습니다 — 게시물은 7개의 댓글과 함께 37점을 받았습니다 — 댓글은 대부분 구현을 비판하기보다 r2d2-tv를 더 간단한 대안과 비교했습니다.
반복되는 입장 중 하나는 이상적인 TV는 거의 아무것도 하지 않는다는 것입니다. 한 댓글러가 말했듯이:
TV가 해주길 바라는 것은 빠르고 안정적으로 켜지고 HDMI1에 연결된 것을 표시하는 것뿐입니다. 시장은 "스마트" (실제로는 감시) TV로 가득 차 있어서 사지 않는 것은 현실적으로 불가능합니다.
그 댓글은 프로젝트가 다루는 긴장을 포착합니다: 감시 기능이 있는 TV를 원하지 않는 사람들도 구매를 피하는 것이 비현실적이라고 생각하므로, 구매 후 소프트웨어를 제거하는 것이 실용적인 경로가 됩니다.
두 번째 댓글러는 TV 소프트웨어 정리를 위한 관련 프로젝트, https://github.com/Gathin23/cleanyourtv/tree/main 를 가리켰으며, 같은 문제를 다른 각도에서 해결하는 작은 도구 생태계를 나타냅니다.
세 번째 댓글러는 스마트 기능을 완전히 건너뛰는 것이 가장 간단한 해결책이라고 주장했습니다:
HDMI로 Kodi를 실행하는 Raspberry Pi에 연결된 멍청한 TV가 나에게는 충분히 스마트합니다.
이 댓글들에 내포된 반론은 r2d2-tv가 저위험 HDMI 박스 접근 방식과 다른 펌웨어 정리 도구도 포함하는 영역에서 고위험, 고통합 옵션이라는 것입니다. r2d2-tv는 TV의 자체 리모컨, 홈 화면, 음성 버튼이 계속 작동하면서 벤더 소프트웨어 계층이 교체되기를 원하는 사람을 위한 선택입니다.
소스 맵 빠른 참조
| 경로 | 용도 |
|---|---|
tv/home/ |
홈 애플리케이션 템플릿 |
tv/integration/ |
오프라인 홈 및 유휴 복귀 플래너 |
spark/ |
브라우저, 미디어 전송, 세션 관리자 |
voice/ |
TV 캡처, 로컬 모델, 검증된 명령 실행 |
protection/ |
콘텐츠 차단 규칙 및 재현 가능한 확장 빌더 |
tools/ |
개인 빌드, 패키지, 프라이버시 도구 |
저장소의 지침은 장치 구성, 키, 펌웨어 이미지 및 런타임 데이터를 버전 관리 외부에 유지하는 것입니다.