Glide - 확장 가능한 키보드 중심의 웹 브라우저

1 month ago 15

  • Firefox 기반의 TypeScript 설정 파일을 통해 브라우저 자체를 프로그래밍 가능한 도구로 만드는 새로운 접근 방식
  • 웹 확장 프로그램이 갖는 보안 제약 없이 브라우저 UI 커스터마이징, 외부 프로세스 호출 등 무제한적인 기능 구현 가능
  • Vim 스타일의 모드 시스템과 키 매핑을 제공하여 마우스 없이 완전한 키보드 중심 브라우징 지원
  • 힌트 모드, 탭 퍼지 파인더, REPL 등 개발자 친화적 기능들을 기본 제공하며 6개월간 실사용 검증 완료
  • macOS와 Linux에서 알파 버전 다운로드 가능하며, 기존 Firefox 확장 프로그램 및 워크플로우와 완전 호환

Glide 개발 배경

  • 개발자는 Firefox에서 Tridactyl 확장 프로그램을 사용하던 중 웹 확장 프로그램의 근본적인 보안 제약 문제를 경험
    • addons.mozilla.org 같은 특정 사이트에서는 확장 프로그램이 완전히 비활성화되어 모든 키 매핑이 작동하지 않음
    • 커스텀 홈페이지에서도 Tridactyl이 작동하지 않는 문제 발생
  • 이러한 제약은 악의적인 확장 프로그램으로부터 사용자를 보호하기 위한 브라우저의 필수적인 보안 모델이지만, 동시에 확장성을 크게 제한
  • 브라우저 UI 자체 커스터마이징부터 외부 도구 호출까지 제한 없이 가능한 진정한 맞춤형 브라우저의 필요성을 인식하고 Glide 개발 시작

Glide의 핵심 차별점

  • TypeScript 설정 파일 기반의 완전한 제어권 제공
    • 웹 확장 프로그램에서 절대 지원할 수 없는 API와 기능들을 사용 가능
    • 최종 사용자가 직접 설정 파일을 작성하므로 보안 제약을 둘 필요가 없는 근본적으로 다른 보안 모델
  • 설정 파일에서 가능한 작업들
    • 커스텀 키 매핑 정의
    • 웹 확장 프로그램 API 접근
    • 임의의 외부 프로세스 실행
    • 매크로 정의 등
  • Firefox 기반으로 구축되어 기존 Firefox 확장 프로그램과 워크플로우가 그대로 작동

실용적인 설정 예시

GitHub 저장소 자동 클론 및 편집기 실행

glide.keymaps.set("normal", "gC", async () => { // extract the owner and repo from a url like 'https://github.com/glide-browser/glide' const [owner, repo] = glide.ctx.url.pathname.split("/").slice(1, 3); if (!owner || !repo) throw new Error("current URL is not a github repo"); // * clone the current github repo to ~/github.com/$owner/$repo // * start kitty with neovim open at the cloned repo const repo_path = glide.path.join(glide.path.home_dir, "github.com", owner, repo); await glide.process.execute("gh", ["repo", "clone", glide.ctx.url, repo_path]); await glide.process.execute("kitty", ["-d", repo_path, "nvim"], { cwd: repo_path }); }, { description: "open the GitHub repo in the focused tab in Neovim" });
  • GitHub 저장소 페이지에서 gC 키를 누르면 자동으로 다음 작업 수행
    • 현재 URL에서 소유자와 저장소 이름 추출
    • ~/github.com/$owner/$repo 경로로 저장소 클론
    • kitty 터미널에서 neovim을 열어 클론된 저장소로 이동
  • 작업마다 몇 초씩 절약되며, 설정 추가에는 단 몇 분만 소요

캘린더 탭으로 빠른 전환

glide.keymaps.set("normal", "gc", async () => { const tab = await glide.tabs.get_first({ url: "https://calendar.google.com/*" }); assert(tab && tab.id); await browser.tabs.update(tab.id, { active: true }); }, { description: "[g]o to [c]alendar.google.com" });
  • gc 키로 Google 캘린더 탭으로 즉시 전환 가능

모드 시스템

  • Vim의 모드 개념을 차용하여 모든 키 매핑이 특정 모드에 연결
  • 브라우저와의 상호작용에 따라 자동으로 모드 전환
    • normal 모드: 기본 모드
    • insert 모드: <input> 요소 클릭 시 자동 전환되어 키 매핑이 텍스트 입력을 방해하지 않음
    • ignore 모드: Shift+Escape로 전환, 웹사이트가 키 매핑과 충돌할 때 사용

키보드 기반 내비게이션

힌트 모드

  • f 키를 눌러 힌트 모드 진입
  • 클릭 가능한 모든 요소(링크, 버튼 등) 위에 텍스트 레이블 오버레이 표시
  • 레이블을 입력하면 해당 요소에 포커스 및 클릭 실행
  • 마우스 없이 완전한 웹 페이지 조작 가능

개인적으로 선호하는 기능들

  • gI: 페이지에서 가장 큰 가시적 입력 요소에 자동으로 포커스, 마법처럼 느껴지는 기능
  • <space><space>: 탭 퍼지 파인더 실행으로 잃어버린 탭을 쉽게 찾기
  • <c-i>와 <c-o>: 이전 탭 내비게이션에 필수적
  • :repl: 설정 변경사항을 빠르게 테스트
  • 힌트 모드: 마우스에 손을 뻗고 싶지 않을 때 유용
  • which-key 스타일 UI: 다양한 키 매핑을 상기시켜주는 인터페이스

현재 상태 및 사용 가능성

  • 6개월간 일상적으로 사용
  • 여전히 초기 알파 단계이지만 macOS와 Linux에서 다운로드 가능
  • :tutor 명령으로 튜토리얼 확인 권장 (아직 완성되지는 않음)
  • Linux 사용자는 아직 패키지 저장소에 등록되지 않아 수동으로 압축 해제 및 설정 필요
  • 쿡북과 개발자의 dotfiles에서 더 많은 예제 확인 가능
  • 알파 버전이므로 아직 모든 API가 구현되지는 않았지만, 완전한 제어권 제공이 주요 목표

Read Entire Article