2P by GN⁺ 10일전 | ★ favorite | 댓글 2개
  • 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가 구현되지는 않았지만, 완전한 제어권 제공이 주요 목표

매니악하게 써야될 것 같은데요. GUI의 장점을.. 상쇄할만하게 쓸 수 있다면야..

Hacker News 의견
  • 나에게는 완전히 취향은 아니지만, Chromium 대신 Firefox를 포크한 것은 신선함을 느낌. 이제 Zen, Floorp와 함께 크게 변형된 Firefox 포크가 세 개나 있게 됨
    • Tor도 있어서 이 흐름에 추가됨
    • LibreWolf도 있는데, 개인적으로는 이게 기본이 됐으면 하는 바람이 있음
  • 아이디어가 참 좋다고 생각함, 그리고 보안 패치 추적 방식으로 유지한다는 코멘트를 보고 안심이 됨
  • 나도 Vimium C를 사용할 때 addons.mozilla.org의 제한을 겪었음. 그 빈도가 높지는 않아서 브라우저를 바꿀 만큼은 아니었지만, 오히려 리눅스 데스크톱 전체를 키보드 중심으로 만드는 도구가 더 끌림. 예를 들어 homerow가 macOS에서 하는 것처럼 말임
  • 작성자임, 궁금한 점이 있으면 언제든 질문해도 됨
    • 힌트 API가 맘에 듦, 특히 브라우저 엘리먼트에도 힌트를 줄 수 있다는 점이 좋음. 하지만 고급 사용자는 힌트 시스템으로 다양한 종류의 엘리먼트를 선택하고 싶을 것 같음. CSS 셀렉터를 전달해서 어떤 요소에 힌트가 달릴지 지정하는 기능을 확장했으면 함. 예를 들어, 유저가 특정 엘리먼트를 선택하고 그 텍스트를 복사하는 명령을 만들 수도 있음
    • DRM 지원이 되는지 궁금함. Netflix 같은 상업 스트리밍 사이트에서 쓸 수 있는지 알고 싶음. 이전에는 Firefox 포크에서 이게 큰 문제였음. 또한 Firefox Sync는 어떨지 궁금함. 그리고 외부 프로세스에서 RPC 호출이 가능한지도 물어보고 싶음. 예를 들어, 현재 열린 탭의 URL이나 목록, 컨텐츠를 불러오거나, 탭을 원격 제어해 다른 URL로 이동하는 등, 다른 앱이나 스크립트와 연동하는 데 활용할 수 있을지 궁금함. 이 분야에서 Firefox가 부족한 편임. 마지막으로 보안성이 어느 정도인지 궁금함
    • 프로젝트가 아주 멋져 보임. Helix/Kakoune 스타일의 키바인딩을 설정할 수 있을 만큼 config가 유연한지 궁금함
    • config 파일로 확장 프로그램의 자동 설치와 Firefox의 내장 설정 변경이 가능한지 알고 싶음. 나머지 프로그램들은 다 dotfiles로 세팅하니, Firefox도 그런 옵션이 있었으면 함
  • 정말 멋져 보임. 나는 지금 Firefox와 VimFX, 그리고 복잡한 config.js를 조합해 한동안 써왔음. NixOS 패키지가 병합되면 꼭 시험해 볼 예정임. 만약 기본 Firefox ESR을 계속 쓴다면 VimFX를 강력히 추천함. https://github.com/akhodakivskiy/VimFx 참고하면 좋을 듯. VimFX의 가장 큰 단점은 Firefox 내부 API 문서화가 부족하다는 거임. 탭 관리 등의 작업을 하려면 WebExtensions API라면 쉽게 끝날 일도 소스코드를 직접 파봐야 했음. Glide가 이런 API를 config 파일에서 쓸 수 있게 해주는 부분이 제일 기대되는 점임
  • ʕ•ᴥ•ʔ Bear Blog에서 이걸 발견했고 재미있게 써보고 있음. 내 zen browser처럼 사이드바랑 고정 탭 세팅 맞춰놓고 업무용 생산성 스택에 넣어서 시험 중임. glide-hint CSS도 userChrome.css로 내 미적 취향에 맞게 테마화함. 계속 멋진 작품 만들어주길 바라며 지켜볼 생각임
    1. https://freeimage.host/i/KMQu3EQ
    2. https://freeimage.host/i/KMQAJ9t
    • 평균적으로 몇 개 정도의 탭을 동시에 열어두는지 궁금함. 파비콘만 보고 탭을 찾는 데 불편함을 느끼는 경우는 없는지 알고 싶음
  • 소스 코드 구조를 깊게 보진 않았지만, Firefox 포크라고 했을 때 향후 Firefox의 보안 패치나 수정 사항은 어떻게 통합할 계획인지 궁금함
    • 자동화된 패치 방식과 새 파일 추가로 구현했음. 빌드할 때 Firefox 소스를 다운받아 패치 적용되므로, Firefox 버전을 올리는 것도 매우 쉬움. 실제로는 잦은 업데이트가 가능해서 Firefox 베타 채널을 추적하고 있음
  • 드디어 compact mode가 돌아와서 너무 고맙게 생각함. Firefox 포크도 반갑고, 이런 컨셉은 매우 흥미로움. 나는 어디서든 vim을 쓰는 사람이라, 꼭 직접 써봐야겠다는 생각이 듦
    • 다만 j/k로 스크롤할 때 움직임이 부드럽지 않은 느낌임. 혹시 스크롤을 더 자연스럽게 만들 방법이 있는지 궁금함(내가 문서를 그냥 넘긴 건지도 모르겠음)
  • 꽤 멋지다고 생각함. Chrome에서 Vimium을 사용해왔는데 만족스러웠음
    1. https://chromewebstore.google.com/detail/vimium/…
    • chrome:// 페이지에서도 동작하는지 궁금함. Vimium Firefox 버전이 이 부분이 늘 아쉬웠음
  • 문서를 쭉 훑어봤는데, 이건 내가 꿈꾸던 브라우저 같음. Firefox 기반에 WebExt API도 온전히 가능하고, 심지어 브라우저 밖 명령 실행도 된다는 점이 마음에 듦. Firefox Developer Edition이 이랬으면 했는데, 오늘 꼭 바로 써봐야겠음