- Linux용 CLI 프로그램으로, GUI 애플리케이션을 터미널에서 직접 실행할 수 있게 해줌
- 자체 제작한 Wayland 컴포지터를 사용해 모니터 대신 터미널로 GUI 출력을 전달하는 방식
- ssh 환경에서도 실행 가능하며, 웹 브라우저, 파일 매니저, 심지어 Doom 게임까지 터미널 안에서 실행 가능
- 터미널 해상도(행·열 수)에 따라 출력 품질이 달라지며, iTerm2·kitty 같은 이미지 지원 터미널에서는 풀 해상도 렌더링도 지원
- Typescript와 bun 기반으로 개발되었고 일부 C++ 코드가 포함되어 있으며, 현재는 일부 앱만 지원하지만 “Term everything❗” 을 목표로 확장 중임
프로젝트 중요성 및 비교 우위
- Term.everything은 기존 터미널 파일 뷰어나 단순 이미지 출력 도구와 달리, “모든” GUI 애플리케이션을 터미널 안에서 실행할 수 있음
- SSH를 포함한 네트워크 환경에서도 GUI 인터페이스를 사용할 수 있어 서버 관리, 원격 개발에 강점이 있음
- kitty, iterm2 등 최신 터미널의 이미지 기능을 최대한 활용하며, 해상도·프레임레이트 향상 옵션 제공
개요
- Term.everything은 Linux CLI 프로그램이며, 터미널에서 GUI 창을 직접 실행 가능하게 하는 것이 특징임
- 자체 개발한 Wayland 기반 컴포지터가 핵심이며, 일반 모니터 대신 터미널로 GUI를 렌더링함
- x11, Wayland 기반 모두 지원하고 ssh를 통해 원격에서도 사용 가능함
- 한정된 터미널 행/열이 윈도우 품질에 영향을 미치며, 터미널 해상도를 늘리면 품질 향상이 가능함(단, 성능 저하 발생 가능성 존재)
주요 사용 예시
- 게임 실행: 터미널 안에서 Fontemon 같은 게임이나 Doom(쉐어웨어 에피소드) 실행 가능
- 동영상 재생: Wing It! 영화 재생, 해상도 조절을 통해 프레임레이트와 화질 균형 설정 가능
- 브라우저 실행: iTerm2 + ssh 환경에서 Ubuntu에 접속해 Firefox 실행 가능
- 파일 뷰어 대체: 굳이 터미널 전용 파일 뷰어를 만들지 않고, 기존 GUI 파일 매니저를 터미널에서 직접 사용 가능
- 재귀 실행: 터미널 안에 또 다른 터미널을 실행하는 "terminal in a terminal"
작동 원리 및 개발 정보
-
기본 개념
- 과거에는 프로그램이 화면에 무언가를 그리려면 RAM의 특정 영역에 직접 기록할 수 있었음
- 현대 시스템에서는 디스플레이 서버(Display Server) 가 입출력을 관리하며, 마우스/키보드 같은 입력과 그래픽/이미지 출력을 조율함
- 리눅스 환경에서는 주로 Wayland 프로토콜 또는 X11이 사용되며, Term.everything은 Wayland를 기반으로 동작
-
Wayland 프로토콜
- Wayland는 디스플레이 서버 자체가 아니라, 서버와 프로그램 간 통신을 정의한 프로토콜
- 프로그램은 직접 렌더링한 결과물을 디스플레이 서버에 전달하고, 서버는 이를 화면에 출력
- 중요한 점은 렌더링 모델이 강제되지 않음 → 프로그램이 원하는 방식으로 그림을 그릴 수 있음
- 덕분에, 출력 결과를 화면 대신 다른 곳(예: 터미널)으로 보낼 수 있음
-
Term.everything의 출력 처리
- Wayland 클라이언트(실행된 GUI 앱)가 그린 이미지를 받아서 터미널 문자 출력으로 변환
- 변환 과정:
- 1. 클라이언트가 전달한 이미지 데이터를 수신
- 2. 이를 UTF-8 문자 + ANSI 이스케이프 코드로 변환
- 3. 변환에는 chafa 라이브러리를 활용하여 픽셀을 터미널 문자로 매핑
- 입력은 stdin을 통해 전달된 키보드, 마우스 이벤트를 Wayland 클라이언트에 전달
-
실제 구현
- 핵심 아이디어는 간단하지만, 실제 구현에는 약 만여 줄의 코드가 필요
- Typescript(bun 기반)와 일부 C++로 작성되어 있으며, 커스텀 Wayland 디스플레이 서버 역할을 수행
- 소스 코드는 src/ 디렉토리에서 확인 가능
-
확장 가능성
- Term.everything은 단순히 터미널로 GUI를 실행하는 것 이상을 지향
- Wayland 기반 커스텀 디스플레이 서버를 이용해 다른 실험적 아이디어도 구현 가능성이 있음
- 예: 출력 장치를 터미널이 아닌 전혀 다른 매체(예: 프린터, 물리적 아트워크 등)로 연결하는 활용