스크립트
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 채널을 구독해 주세요. 다음 영상에서 뵙겠습니다.
커뮤니티 글
아직 글이 없습니다. 이 영상에 대한 첫 번째 글을 작성해 보세요!
이 영상에 대해 글쓰기