브라우저 기록을 깔끔하게 정리해 주는 오픈소스 도구 (Hister)

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

스크립트

00:00:00GitHub 이슈에서 읽은 내용인데, 크롬 기록은 쓸모가 없어요. 브라우저는 방문한 모든 페이지를 기억하지만,
00:00:06우리가 실제로 관심 있는 부분, 즉 페이지에 정확히 무엇이 있었는지는 절대 기억하지 못하죠. 그래서
00:00:11제목이나 URL을 잊어버렸다면 다시 찾기가 거의 불가능합니다. 이건 히스터(hister)라는 도구인데, 이 모든 문제를 해결해 줍니다. 읽은 모든 페이지의
00:00:18전체 텍스트를 로컬에 조용히 색인화하므로, 자신만의 검색 기록을 검색할 수 있습니다.
00:00:23마치 나만의 사적인 구글처럼요. 직접 보여드리겠습니다.
00:00:30좋습니다, 브라우저 기록은 페이지에 대해 정확히 두 가지를 저장합니다. 바로 제목과 URL이죠. 그것이
00:00:36기록의 전부입니다. 여러분과 제가 실제로 기억하는 콘텐츠 부분은 저장된 적이 없습니다. 그래서 정확한 제목을
00:00:43잊어버리는 순간 그 페이지는 사라집니다. 파이어폭스의 경우는 더 심각한데, 기본 기록 보존 기간이
00:00:49약 90일이기 때문입니다. 검색에는 두 가지 종류가 있습니다. 발견 검색(discovery search)은 새로운 무언가를
00:00:55찾는 것입니다. 젠장, 그건 구글의 일이고 구글은 그걸 정말 잘하죠. 상기 검색(recall search)은 이미 읽었던
00:01:02무언가를 찾는 것인데, 기본적으로 상기 검색을 위해 개발하는 곳은 아무도 없습니다. 그래서 결국 이런 터무니없는 짓을 하게 되죠.
00:01:08이미 읽었던 페이지를 다시 찾아내려고 구글링을 하며, 표현을 충분히 기억하고 있기를 바라는 겁니다.
00:01:14이것이 바로 히스터가 존재하는 이유입니다. 본격적으로 시작하기 전에, 워크플로를 빠르게 만들어주는 코딩 도구를 좋아하신다면
00:01:19구독해 주세요. 유용한 영상들이 계속해서 올라옵니다. 자, 그럼 아무것도 없는 상태에서 이 도구를 실제로
00:01:24한 번 설정해 보겠습니다. 저는 애플 맥 M4를 사용하고 있어서 darwin arm64 바이너리를 다운로드하고 있습니다.
00:01:30여기서 이름을 history로 바꾸고, 멋진 명령어로 실행 파일로 만든 다음, history listen을 실행하겠습니다.
00:01:39그게 전부입니다! 히스터가 로컬 포트 4433에서 서버를 시작합니다. 포트를 열어보면 전체 인터페이스가 이렇게 생겼습니다.
00:01:46현재는 색인할 내용을 아직 아무것도 주지 않았기 때문에 기본적으로 아무것도 없습니다. 이 퍼즐의 두 번째
00:01:52조각은 브라우저 확장 프로그램입니다. 크롬용과 파이어폭스용이 각각 있는데, 저는 여기서 크롬을 사용하고 있습니다.
00:01:57자, 이제 평소처럼 웹서핑을 해보겠습니다. 이 GitHub 이슈를 열고, 문서 페이지를 열고,
00:02:04여기 기사도 하나 실행해서 열어보겠습니다. 그리고 다른 페이지도 하나 더 열어볼게요. 북마크를 하거나
00:02:11저장 버튼을 누르는 게 아닙니다. 평소 하듯이 그냥 이 페이지들을 방문해서 읽고 있을 뿐이죠.
00:02:16다시 히스터 안으로 들어가 보면, 그 페이지들이 벌써 나타나고 있습니다. 여기서 정말 멋진 점은
00:02:22이게 먼저 페이지를 저장해야만 하는 또 다른 '나중에 읽기' 앱이 아니라는 겁니다.
00:02:26브라우저 확장 프로그램이 웹서핑을 하는 동안 알아서 색인을 구축하고 있습니다. 자, 그럼 그 색인이
00:02:32실제로 쓸모가 있는지 확인해 보겠습니다. 아까 방문했던 기사인데, 페이지 중간 어딘가에서
00:02:37문장 하나를 가져와 보겠습니다. 헤드라인도 아니고 URL도 아니며, 기사 속에 묻혀 있는 무작위 텍스트입니다.
00:02:42아까 그 페이지를 닫고, 히스터에서 그 문구를 검색해 보겠습니다.
00:02:47바로 나오네요. 결과는 페이지와 주변 일치 텍스트를 보여주며, 그 순간 실제로 읽고 있던 내용으로 바로 이동할 수 있습니다.
00:02:54자, 이번에는 크롬 기록에서 정확히 똑같은 검색을 실행해 보겠습니다. 여기에 입력해 볼 텐데,
00:02:59어떤 결과가 나올 것 같나요? 네, 별로 나오는 게 없습니다. 크롬은 제가 그 페이지를 방문했다는 것만 알 뿐
00:03:05그 안에 무엇이 있었는지는 모르기 때문입니다. 그리고 히스터는 기본적인 키워드 검색에만 국한되지도 않습니다.
00:03:11실제로 쿼리 언어가 있어서, 예를 들어 domain github.com 같은 검색을 할 수 있습니다.
00:03:18그러면 제가 방문했던 GitHub 페이지들만 검색하게 되죠. 혹은 text memory leak처럼 텍스트를 검색할 수도 있습니다.
00:03:25검색하는 내용이 무엇이든 해당 문구가 구체적으로 페이지 본문 안에 나타나야 합니다. 이 두 가지를
00:03:30조합할 수도 있습니다. 만약 GitHub 이슈 안에서 메모리 문제에 대해 읽었던 기억은 나는데,
00:03:35어떤 저장소였는지 도저히 기억이 안 난다면, 구글로 돌아가 처음부터 다시 시작하는 대신 내 방문 기록의 범위를 좁힐 수 있습니다.
00:03:42터미널 인터페이스도 제공되므로 history search를 실행할 수도 있습니다. 그러면 터미널을 떠나지 않고도
00:03:48동일한 개인 색인을 검색할 수 있죠. 아마도 이게 워크플로에서 제가 가장 많이 사용할 만한
00:03:56인터페이스일 겁니다. 그리고 처음에 놓쳤던 또 다른 기능이 있는데, 꼭 빈 데이터베이스로 시작할 필요는 없습니다.
00:04:01히스터는 기존 브라우저 기록을 가져올 수 있습니다. 최신 버전에서는 hister import browser 명령어로 가능합니다.
00:04:06해당 기기의 브라우저 데이터베이스를 감지하여 그 URL들을 히스터로 가져옵니다.
00:04:12다만 이전 브라우저 기록과 관련해서는 한 가지 중요한 차이점이 있습니다. 브라우저는 과거에 원래 페이지 콘텐츠를
00:04:17저장한 적이 없기 때문에, 히스터가 해당 URL들을 다시 방문해서 지금 거기에 있는 내용을
00:04:22색인화해야 합니다. 하지만 확장 프로그램이 실행되는 순간부터는 실제 보고 있는 렌더링된 페이지를 캡처하므로,
00:04:28이것을 잠시 사용하고 나면 일반적인 웹서핑을 바탕으로 자신만의 전체 텍스트 검색 엔진을 구축하게 되는 셈입니다.
00:04:33이 모든 것이 여전히 내 노트북에서 실행되고 있죠. 그렇다면 도대체 어떻게 이런 기능을 구현할 수 있을까요?
00:04:39브라우저 확장 프로그램이 자바스크립트 렌더링이 완료된 후 각 페이지를 읽어들이기 때문입니다.
00:04:45회사 위키, 내부 대시보드, 비공개 저장소 등 구글이 인덱싱할 수 없는 모든 것들을 내 컴퓨터는 할 수 있습니다.
00:04:51확장 프로그램이 URL, 제목, 추출된 텍스트, 전체 HTML 문서까지 패키징하여
00:04:58노트북에서 실행 중인 서버로 전송합니다. 순수 Go로 작성된 역방향 인덱스(inverted index)가 검색을 수행하며,
00:05:04전체 HTML은 GZIP으로 압축되어 로컬에 저장되므로 이 모든 데이터의 완전한 오프라인 복사본을 얻을 수 있습니다.
00:05:10페이지당 약 100킬로바이트 수준이라 1만 페이지면 대략 1기가바이트입니다. 저장 공간은 실제로 문제가 되지 않죠.
00:05:17물론 이 분야가 텅 비어 있는 것은 아닙니다. Parakeep은 28,000개의 스타를 받았고, 아카이브 박스(ArchiveBox)도 있습니다. 솔직히 아카이브 박스는
00:05:24WARC 파일, 스크린샷, 동영상 등 웬만한 것보다 훨씬 더 뛰어난 아카이빙 기능을 제공합니다. Wallabag도
00:05:31오랫동안 존재해 왔고, Readwise Reader는 연간 약 120달러에 정말 훌륭한 사용자 경험을 제공합니다. 하지만 이 모든 도구들은
00:05:38공통된 문제를 가지고 있습니다. 실제로 필요하기 전에 무언가를 저장하기로 미리 결정해야 한다는 점이죠.
00:05:44그리고 정말 예상치 못했던 기능이 하나 있는데, MCP 엔드포인트를 기본 제공한다는 것입니다. 따라서 코딩 에이전트를
00:05:50자신의 인덱스에 연결하고, 모델이 학습된 데이터가 아니라 실제로 읽었던 모든 것에 대해 질문할 수 있습니다.
00:05:56따라서 에이전트를 GitHub와 6개의 문서 사이트에 각각 따로 연결하는 대신,
00:06:01이미 읽었고 이미 인증이 완료된 항목들의 단일 인덱스에 연결하는 것입니다.
00:06:06솔직히 말씀드리면, 사파리에서는 작동하지 않아요. 개념 증명용 풀
00:06:12대략 2월부터 열려 있었던 것 같은데, 그 이후로도 전혀 손대지 않은 상태입니다. 따라서 만약 사파리만 사용하는
00:06:18맥 사용자라면 이 도구는 작동하지 않을 것입니다. 하지만 우리 중 많은 분들이 크롬을 사용하고 있죠.
00:06:24가장 큰 단점은 인덱스가 암호화되지 않는다는 점이며, 이 부분은 공정하게 짚고 넘어가야겠습니다. 문서에서도
00:06:30이 내용을 숨기지 않고 정면으로 밝히고 있습니다. 하지만 그 파일이 실제로 무엇인지 생각해 보세요. 그것은
00:06:35읽었던 모든 것의 전체 텍스트입니다. 그건 그 어떤 브라우저 기록보다도 훨씬 더 위험한 데이터입니다. 그러니
00:06:41디스크 암호화를 꼭 사용하세요. 도커(Docker) 경로 설정도 정말 지저분합니다. 바이너리를 실행하면 로컬호스트에만 바인딩되는데,
00:06:48알겠습니다, 거기까지는 좋아요. 하지만 프로젝트와 함께 제공되는 컴포즈(compose) 파일은 0.0.0.0에 바인딩하고 포트를 매핑하며, 기본
00:06:56설정에는 인증이 아예 필요 없습니다. 음, 좀 문제가 있죠? 맥 바이너리가 공증(notarized)되지 않았고 임시 서명만 되어 있습니다.
00:07:02브라우저에서 다운로드하면 게이트키퍼(Gatekeeper)가 차단할 겁니다. 아직 1.0 버전 미만이고, 이는 7개월 동안
00:07:0818번의 마이너 버전릴리즈가 있었으며 그 사이에 호환성이 깨지는 변경 사항들이 문서화되어 있다는 뜻입니다. 업그레이드하거나
00:07:13심지어 이 도구를 설치하기 전에 변경 로그를 꼭 읽어보세요. 문서상으로는 47명의 기여자가 있지만, 그중 약 78%는
00:07:19실제 메인테이너가 작성한 것입니다. 정말 멋진 프로젝트이기는 하니 한번 살펴보는 것도 좋겠지만, 유용했던 만큼
00:07:26최종 결정은 이렇습니다. 파이어폭스나 크롬을 사용하고 있고, 문서와 GitHub 이슈를 많이 읽으며,
00:07:31셀프 호스팅에 이미 익숙하다면 직접 실행해 보세요. 특히 코딩 에이전트가 실제로 질의할 수 있는
00:07:37나만의 프라이빗 코퍼스를 원한다면 더욱 추천합니다. 사파리 전용 사용자라면 작동하지 않으므로 사용하지 마세요.
00:07:42그리고 네트워크에 배치할 예정이라면 나중이 아니라 인증부터 먼저 설정하세요. 설치 과정은
00:07:47정말로 명령어 3개면 끝납니다. 바이너리를 다운로드하고 history listen을 실행하면 약 2초 만에 포트와 함께 실행됩니다.
00:07:53정말 쉽죠. 멀티 아키텍처 도커 이미지와 darwin 모듈이 포함된 제대로 된 닉스 플레이크(nix flake)도 제공됩니다.
00:08:00아직 홈브류(Homebrew)는 없으니 그에 대한 포뮬러를 찾으려고 애쓰지 마세요. 설명란에 모든 링크를 남겨두었으니
00:08:05더 자세히 확인해 보실 수 있습니다. 이와 같은 코딩 팁과 트릭이 마음에 드신다면
00:08:09Better Stack 채널을 구독해 주세요. 다음 영상에서 뵙겠습니다.

핵심 요약

히스터는 브라우저 확장 프로그램과 로컬 서버를 통해 방문한 모든 웹페이지의 전체 텍스트를 자동으로 색인화하여 사적인 구글처럼 본문 내용 기반의 검색을 제공한다.

하이라이트

  • 히스터는 방문한 모든 웹페이지의 전체 텍스트를 로컬에 색인화하여 개인 검색 기록을 검색할 수 있는 오픈소스 도구이다.

  • 브라우저는 기본적으로 페이지의 제목과 URL만 저장하므로, 본문 내용 기반의 상기 검색을 위해 히스터가 개발되었다.

  • 확장 프로그램이 자바스크립트 렌더링이 완료된 페이지를 자동으로 캡처하여 로컬 서버로 전송하므로 별도의 수동 저장 과정이 필요 없다.

  • 저장 공간은 페이지당 약 100킬로바이트 수준이며 1만 페이지 기준으로 대략 1기가바이트를 차지한다.

  • 코딩 에이전트를 로컬 인덱스에 연결할 수 있는 MCP 엔드포인트를 기본 제공한다.

  • 인덱스가 암호화되지 않고 기본 Docker 설정에 인증이 없으므로 보안 설정에 주의해야 한다.

타임라인

브라우저 기록의 한계와 히스터의 등장 배경

  • 크롬과 파이어폭스의 기본 기록은 제목과 URL만 저장하여 본문 내용 검색이 불가능하다.
  • 새로운 것을 찾는 발견 검색과 달리 이미 읽었던 것을 찾는 상기 검색을 지원하는 도구가 부족하다.

기존 브라우저 기록은 정확한 제목을 잊어버리면 다시 찾기 어렵고 파이어폭스는 90일이 지나면 기록이 사라진다. 구글링에 의존하는 기존 방식의 한계를 극복하기 위해 본문 전체를 로컬에 색인화하는 히스터가 개발되었다.

히스터 설치 및 기본 사용법

  • 바이너리를 다운로드한 후 history listen 명령어를 실행하면 로컬 포트 4433에서 서버가 시작된다.
  • 브라우저 확장 프로그램이 웹서핑 중인 페이지를 자동으로 감지하여 색인을 구축한다.

맥 M4 기준 darwin arm64 바이너리를 다운로드하고 실행 파일로 만든 뒤 서버를 실행한다. 나중에 읽기 앱처럼 수동으로 저장할 필요 없이 평소처럼 웹서핑을 하면 자동으로 데이터가 쌓인다.

본문 텍스트 검색 및 쿼리 기능

  • 기사의 헤드라인이나 URL이 아닌 본문 속 무작위 문장으로도 정확한 검색이 가능하다.
  • domain github.com이나 text memory leak 같은 쿼리를 조합하여 검색 범위를 정밀하게 좁힐 수 있다.

크롬 기본 기록과 달리 히스터는 페이지 내부의 텍스트까지 검색할 수 있다. 터미널 인터페이스를 통해 history search를 실행할 수도 있으며, 기존 브라우저 기록을 가져오는 기능도 지원한다.

기술적 구조와 대안 도구 비교

  • 전체 HTML이 GZIP으로 압축되어 로컬에 저장되며 페이지당 약 100킬로바이트의 용량을 차지한다.
  • 코딩 에이전트를 로컬 인덱스에 연결하는 MCP 엔드포인트를 기본 제공한다.

브라우저 확장 프로그램이 렌더링된 페이지의 URL, 제목, 텍스트, HTML을 패키징하여 Go로 작성된 서버로 전송한다. Parakeep, ArchiveBox, Wallabag, Readwise Reader 등과 달리 미리 저장할 필요가 없다는 장점이 있다.

보안 한계 및 최종 평가

  • 인덱스가 암호화되지 않고 Docker 설정에 인증이 없어 보안에 주의해야 한다.
  • 사파리 사용자는 지원되지 않으며 셀프 호스팅에 익숙한 크롬 및 파이어폭스 사용자에게 적합하다.

맥 바이너리가 임시 서명만 되어 있어 게이트키퍼가 차단할 수 있으며 1.0 버전 미만이라 변경 로그를 확인해야 한다. 명령어 3개로 쉽게 설치할 수 있어 프라이빗 코퍼스를 구축하려는 사용자에게 유용하다.

커뮤니티 글

아직 글이 없습니다. 이 영상에 대한 첫 번째 글을 작성해 보세요!

이 영상에 대해 글쓰기