Skip to main content
Glama
WistRu
by WistRu

TabHub

REST, MCP 및 웹 인터페이스를 갖춘 여러 Chromium 브라우저의 로컬 탭 관리자. 서버는 127.0.0.1에서만 수신합니다.

요구 사항

  • Windows 10/11

  • Node.js 22+

  • Corepack (corepack enable)

실행

corepack pnpm install
Copy-Item .env.example .env
corepack pnpm dev

개인 컨텍스트 로컬 기능

일급 컨텍스트 라우트는 TABHUB_FEATURE_CONTEXT=true 뒤에서 실패 시 폐쇄(fail-closed)됩니다. 프로덕션 /app 탐색은 불투명한 HttpOnly; SameSite=Strict 로컬 세션을 받습니다. Vite 개발 중에는 무작위 서버 전용 TABHUB_DEV_PROXY_SECRET을 설정하세요. Vite 프록시는 POST /api/local/session/bootstrap를 호출하고 일치하는 x-tabhub-dev-proxy-secret 헤더를 주입해야 합니다. 이 값에 VITE_ 변수를 사용하거나 브라우저 코드에 노출하지 마십시오. 부트스트랩 비밀번호, bearer 자격 증명, 페어링 코드, 컨텍스트 본문, 원시 검색 쿼리 및 멱등성 키는 요청 로그에서 제외됩니다.

명령은 먼저 웹 인터페이스를 빌드한 다음 서버를 시작합니다. http://127.0.0.1:7717/app/를 여세요.

웹 인터페이스는 영어와 러시아어로 제공됩니다. 언어는 앱 헤더에서 선택할 수 있으며, 선택 사항은 브라우저에 저장됩니다. 확장 프로그램의 팝업과 설정은 브라우저 인터페이스 언어가 영어 또는 러시아어인 경우 이를 자동으로 사용합니다.

서버 확인:

Invoke-RestMethod http://127.0.0.1:7717/api/health

현재 예상 응답:

{"status":"ok","database":"ok","schemaVersion":26}

기본 데이터베이스는 리포지토리 루트 기준 data/tabhub.sqlite에 생성됩니다. 경로는 루트 .envTABHUB_DB_PATH를 통해 변경할 수 있습니다.

TABHUB_FEATURE_LOGICAL_IMPORTANCE=false는 개별 물리적 탭에 대한 기존 중요도 편집기를 유지하고 새로운 logical-page 엔드포인트를 비활성화합니다. true 값을 설정하면 동일한 URL 페이지의 모든 복사본에 대한 단일 표준 중요도 평가가 활성화됩니다. 플래그 변경 후 서버를 다시 시작하세요. 안전한 롤백을 위해 false로 되돌리세요: 저장된 표준 데이터는 삭제되지 않지만 레거시 인터페이스는 이를 읽거나 수정하지 않습니다.

hot reload로 UI를 개발하려면 서버와 Vite를 한 명령으로 실행한 다음 콘솔의 Vite 주소를 여세요:

corepack pnpm dev:web

TABHUB_FEATURE_RESOURCES=true는 Resource 백엔드 및 REST API를 활성화합니다: 리소스 목록/상세/페이지/전체 기간 활동, 리소스 컨텍스트, 명령, 사용자 평가, 탭/인스턴스 선택에 대한 resource_id 교차. Resource UI 기능은 W30에 제공되며 이 서버 플래그만으로는 활성화되지 않습니다. 안전한 롤백을 위해 플래그를 false로 되돌리고 다시 시작하세요: 저장된 매핑, 컨텍스트 및 평가는 격리된 상태로 유지되며 리소스 라우트에 의해 삭제되거나 노출되지 않습니다.

정확한 복사본 캡처 및 Drawer Short/Deep 페이지 요약 흐름은 TABHUB_FEATURE_PAGE_SUMMARY_CAPTURE=true 뒤에서 독립적으로 실패 시 폐쇄됩니다. 이는 의도적으로 Resource 연구 플래그를 재사용하지 않습니다: 딥 페이지 요약은 여전히 캡처된 한 페이지를 분석하는 반면, 연구는 별도의 코퍼스, 증거, 예산, 동의 의미론을 가집니다. 이 플래그가 꺼져 있으면(기본값) /api/featurespageSummaryCapture: false를 보고하고, HTTP 릴레이는 확장 프로그램 디스패치 전에 capture-tab-content만 거부하며, 정확한 인스턴스 수집 라우트는 존재하지 않습니다. 일반 콘텐츠 수집, 이미 캡처된 콘텐츠에 대한 기존 Library 짧은 요약 작업, 활성화/닫기/작업공간 릴레이 명령은 계속 사용할 수 있습니다. 플래그 변경 후 서버를 다시 시작하세요. 스키마 호환 롤백 표면을 위해 false로 되돌리세요.

캡처 전용 Resource/페이지 연구는 TABHUB_FEATURE_RESEARCH=true 뒤에서 독립적으로 기본 꺼짐입니다. Schema 24는 무조건 설치되므로 플래그가 false로 돌아가도 기존 연구 기록과 개인정보 삭제(redaction)는 계속 읽을 수 있습니다. 비활성화된 플래그는 새 preflight, 실행 및 연구 취소 변경만 차단합니다. 실행에는 추가로 ANTHROPIC_API_KEY가 필요합니다. 공급자가 없으면 preflight, 기록, 작업 읽기 및 개인정보 삭제는 계속 사용할 수 있지만 실행/정제는 쓰기 전에 503 RESEARCH_PROVIDER_UNAVAILABLE로 실패합니다.

공급자는 ANTHROPIC_RESEARCH_MODEL, ANTHROPIC_RESEARCH_INPUT_USD_PER_MTOKANTHROPIC_RESEARCH_OUTPUT_USD_PER_MTOK의 변경 불가능한 시작 가격, 선택적 명시적 ANTHROPIC_RESEARCH_PRICING_VERSION을 사용합니다. 버전이 비어 있으면 TabHub는 유효한 가격에서 버전을 파생합니다. TABHUB_RESEARCH_MAX_OUTPUT_TOKENS는 8192로 제한되고 TABHUB_RESEARCH_TIMEOUT_MS는 한 번의 호출을 제한합니다. 작업자는 동시 호출 1회, 시도 10회, UTC 일당 USD 2 예약을 허용하지만, 모든 실행은 사용자가 승인한 예산에도 맞아야 합니다. 연구는 캡처된 승인 코퍼스만 소비합니다. URL을 가져오거나, 열거나, 탐색하지 않습니다. 연구 플래그나 공급자 설정을 변경한 후 서버를 다시 시작하세요.

Schema-26 제한된 실시간 수집은 TABHUB_FEATURE_LIVE_ACQUISITION=true 뒤에서 독립적으로 기본 꺼짐입니다. 활성화되면 승인된 C90b 코디네이터는 Resource 전용 preflight/start/status 흐름을 노출하고, 폐쇄된 서버 내부 SafePublicHttpClient를 사용하며, 제한된 공개 증거를 구체화하고, 변경 불가능한 캡처/실시간 코퍼스를 기존 연구 워크플로우에 전달합니다. 일반 fetch 엔드포인트를 노출하지 않으며 브라우저 탐색, 확장 프로그램 fetch, 리디렉션, 재시도, 스크립트, 하위 요청 또는 탭/창 변경을 절대 사용하지 않습니다. 명시적으로 검토된 롤아웃 외부에서는 플래그를 false로 유지하세요.

TABHUB_FEATURE_PRIVACY_PURGE=true는 새로운 영구 개인정보 삭제(purge) 생성을 활성화합니다. 플래그가 꺼져 있어도 기존 schema-26 삭제 상태 및 재시도/복구는 계속 사용할 수 있으므로 새 작업을 비활성화해도 진행 중인 삭제가 중단되지 않습니다.

일일 활동은 두 개의 독립적인 실패 시 폐쇄 플래그로 제어됩니다. TABHUB_FEATURE_ACTIVITY_DAILY_WRITER=true를 설정하면 승인된 활동을 UTC 일일 버킷으로 수집하고 갭/중복/순서 오류 메트릭을 업데이트합니다. TABHUB_FEATURE_ACTIVITY_WINDOWS=trueTABHUB_FEATURE_ACTIVITY_DAILY_WRITER=trueTABHUB_FEATURE_RESOURCES=true와 함께 설정하면 7일/30일 페이지/리소스 창과 활동 메트릭을 UI/어댑터에 광고하고 노출합니다. 두 활동 플래그 모두 기본값은 false입니다. 읽기 전용 모드는 일일 적용 범위가 불완전하므로 G3 전체 기간 활동으로 실패 시 폐쇄됩니다. 쓰기 전용 모드는 새 읽기 기능을 노출하지 않고 버킷을 수집하므로 단계적 롤아웃에 유효합니다.

변경 불가능한 마이그레이션 가용성 epoch는 일일 추적이 가능해진 시점을 기록합니다. 별도의 영구 저장된 작성기 수명 주기 epoch는 서버 측 일일 작성기가 활성화된 현재 연속 기간만 기록합니다. 브라우저 확장 프로그램이 가능한 모든 관찰을 전달했다고 주장하지 않습니다. 갭과 전달 상태는 별도의 원격 측정 문제입니다. 작성기를 비활성화했다가 다시 활성화하면 새 연속 epoch가 시작되며, 두 활동 플래그가 모두 현재 활성화되어 있지 않으면 유한 기간 읽기 기능은 계속 사용할 수 없습니다.

우선순위 평가 롤아웃은 세 개의 독립적인 기본 꺼짐 플래그를 사용합니다. TABHUB_FEATURE_PRIORITY_ASSESSMENT_WRITER는 단계적 평가 쓰기를 허용하고, TABHUB_FEATURE_PRIORITY_READERS는 schema-22 읽기를 허용하며, TABHUB_FEATURE_PRIORITY_SHADOW는 readers도 활성화된 경우에만 섀도(shadow) 프레젠테이션을 허용합니다. C50은 이러한 플래그를 선언하고 검증만 할 뿐, 수집을 시작하거나 우선순위 라우트를 노출하지 않습니다. writer는 readers나 shadow 없이 단계적으로 배포될 수 있으며, 요청된 모든 기능은 schema 22보다 오래된 데이터베이스에서 실패 시 폐쇄됩니다.

Windows 자동 시작

영구 로컬 실행을 위해 먼저 프로덕션 아티팩트를 빌드하고 수동으로 확인하세요:

corepack pnpm install --frozen-lockfile
corepack pnpm build
corepack pnpm start

서버는 여전히 127.0.0.1에서만 연결을 수락합니다. v1에는 인증이 없으므로 다른 TABHUB_HOST 값은 거부됩니다. 자동 시작을 위해 작업 스케줄러 → 작업 만들기를 열고 다음을 설정하세요:

  • 트리거 로그인 시;

  • 일반 탭에서 '로그온한 사용자만 실행'을 선택하세요. 브라우저 창 간 포커스 전환에는 대화형 데스크톱이 필요하기 때문입니다.

  • 동작 프로그램 시작;

  • 프로그램 — (Get-Command node).Source의 절대 경로;

  • 인수 — (Resolve-Path packages/server/dist/main.js).Path의 절대 경로를 따옴표로 묶습니다;

  • 작업 폴더 — (Resolve-Path .).Path의 경로.

  • 설정 탭에서 '3일 이상 실행되는 작업 중지'를 끄고 실패 시 다시 시작(예: 1분 후 최대 3회)을 켜세요.

저장한 후 작업을 수동으로 실행하고 Invoke-RestMethod http://127.0.0.1:7717/api/health로 확인하세요. TabHub를 업데이트한 후 corepack pnpm install --frozen-lockfilecorepack pnpm build를 다시 실행한 다음, 실행 중인 서버(또는 작업 스케줄러의 작업)를 다시 시작하여 새 마이그레이션을 적용하고 health 엔드포인트가 schemaVersion: 26을 표시하는지 확인하세요. 브라우저 확장 프로그램 페이지에서 TabHub를 다시 로드하고 앱 페이지를 새로고침하여 새 스냅샷을 보내세요. 작업을 다시 만들 필요는 없습니다.

Chromium 확장 프로그램

단일 Manifest V3 빌드를 생성하세요:

corepack pnpm --filter @tabhub/extension build

각 브라우저에서 확장 프로그램 페이지를 열고 개발자 모드를 켠 다음 압축 해제된 packages/extension/.output/chrome-mv3 폴더를 로드하세요:

  • Chrome: chrome://extensions

  • Edge: edge://extensions

  • Yandex Browser: browser://extensions

TabHub 설정을 열고 현재 브라우저 이름을 별도로 선택하세요. 이는 필수입니다. Chromium API는 Chrome과 Yandex Browser를 안정적으로 구분할 수 없으므로 명시적으로 선택하기 전까지 자동 및 수동 탭 전송이 비활성화됩니다. 이전 버전에서 업데이트한 후에는 브라우저를 다시 선택해야 합니다. 이전 자동 값 chrome이 Edge나 Yandex를 잘못 표시하지 않도록 하기 위해서입니다. 이미 설정된 값을 변경하면 확장 프로그램은 먼저 이전 스냅샷을 닫은 다음 새 정체성으로 전체 스냅샷을 전송합니다. 각 확장 프로그램 설치에는 자체 UUID가 저장되고, 브라우저에 현재 로드된 확장 프로그램 세션에는 별도의 세션 UUID가 있으며, 네이티브 tabId를 전달합니다. 따라서 동일한 브라우저의 두 프로필과 동일한 URL을 가진 두 물리적 탭은 더 이상 병합되지 않으며, 확장 프로그램 재시작 또는 다시 로드 후 오래된 tabId는 전환에 사용되지 않습니다.

팝업에서는 로컬 서버 확인, 동기화되지 않은 물리적 탭 및 작업 수, 수동 스냅샷, 현재 탭 또는 사용 가능한 모든 HTTP(S) 탭의 콘텐츠 캡처를 사용할 수 있습니다. 탭 수에 대한 하드 제한이 없는 전체 스냅샷은 시작 시, 탭 변경 후 디바운스(debounce)로, 그리고 chrome.alarms를 통해 5분마다 전송됩니다. 전송 계층은 실제 페이로드 크기만 확인합니다. 서버가 꺼져 있으면 대기 데이터가 chrome.storage.local에 저장됩니다. 교체된 스냅샷과 중복 콘텐츠는 압축되고, 큐는 작업 수 제한 없이 안전한 32MiB 크기로만 제한됩니다. 408/425/429를 제외한 지속적인 HTTP 4xx 오류는 50개 항목으로 제한된 로그로 이동하며 다음 항목을 차단하지 않습니다. 일시적 오류는 순서를 유지하고 자동으로 재시도됩니다.

웹 인터페이스는 기본적으로 Library를 열며, Graph는 동일한 표준 페이지의 대체 시각화로 남습니다. 별도의 기본 탭 Open tabs는 더 이상 없습니다. Library는 페이지가 처음 나타난 순서와 Chrome → Yandex → Edge → Other의 고정 브라우저 순서를 유지합니다. 태그, summary 및 연결은 물리적 복사본 간에 중복되지 않습니다. Tab 열에서 닫힌 페이지는 물리적 대상을 가지지 않으며, 하나의 열린 복사본은 간결한 정확한 브라우저 탭으로 표시되고, 두 개 이상의 복사본은 창, 위치 및 네이티브 tabId가 있는 목록으로 펼쳐집니다. 이 목록에서 전환 및 닫기는 전체 identity browser / installation / browserSession / browserTabId로 주소가 지정되므로 TabHub는 선택한 탭을 해당 Chrome, Yandex Browser, Edge 또는 다른 Chromium 프로필에서 포커스하거나 닫으며 URL 중복을 열지 않습니다. Multiple open copies 필터는 openInstanceCount > 1인 표준 행만 남깁니다. 이 필터는 계산 및 페이지네이션 전에 서버에서 적용되며 의도적으로 raw URL의 exact-duplicate 확인과 다릅니다. Fragment(#...)는 표준 페이지의 identity에 포함되고, 대소문자를 구분하지 않는 utm_*은 계속 추적 매개변수로 제거됩니다.

일반 상태에서 Library의 체크박스는 상태와 테마를 변경하기 위한 표준 페이지를 선택합니다. 별도의 Manage browser tabs / 브라우저 탭 관리 버튼은 물리적 인스턴스의 대량 선택을 활성화합니다. 상위 행의 체크박스는 그 행의 모든 열린 복사본을 선택하고, 펼쳐진 목록에서는 특정 복사본만 남길 수 있습니다. 물리적 선택은 페이지네이션 중에도 유지되지만, Library 필터를 변경하거나 관리 모드를 끄거나 Graph로 이동하면 초기화됩니다. Graph로 전환하면 일반 페이지 모드로 돌아갑니다. 필터링된 전체 물리적 탭 집합은 SQLite의 999개 bind 파라미터 제한이 없는 별도의 비페이지네이션 요청으로 처리됩니다. 이 모드에서는 Move, Close, Pin/Unpin, Mute/Unmute, Sleep, Reload, Workspaces 및 URL/Markdown/JSON 내보내기와 Extra exact copies, 정확한 hostname 및 age 프리셋을 사용할 수 있습니다. 일반 live 명령은 정확히 하나의 browser/install/session에만 적용될 수 있으며, 혼합되었거나 오래되었거나 오프라인인 선택은 전체적으로 차단됩니다. 별도의 명시적 작업인 Close all matching duplicates는 연결된 프로필들에서 안전한 중복 exact raw-URL 복사본만 일괄 처리하고, 각 그룹에서 keeper를 유지하며, 각 프로필에 대해 별도의 엄격한 live preview를 수행하고, 전체 확인 전에 제외된 프로필을 표시합니다. 대량 닫기는 프로필별 receipt와 사용 가능한 Reopen closed tabs를 표시하며, 알 수 없는 결과는 자동으로 반복되지 않습니다. Library 행을 마우스 휠로 클릭하면 모달 창 없이 단일 물리적 복사본만 닫힙니다. 복사본이 여러 개인 경우 먼저 펼쳐진 목록에서 정확한 행을 선택해야 합니다. TabHub 탭은 계속 보호되며, live 명령에는 숨겨진 대상 제한이 없습니다.

Library 안에는 개인 컬렉션인 검토 대상휴지통이 있습니다. 검토 대상에는 중요도가 0인 Inbox의 약한 페이지 추천만 들어갑니다. 인터페이스는 항상 이유와 경고를 표시하지만 아무것도 자동으로 삭제하지 않습니다. 어떤 페이지든 사이트나 테마와 관계없이 유지, 나중에, 또는 닫고 잊기를 명시적으로 선택할 수 있습니다. 마지막 작업은 확인이 필요하며, 알려진 각 물리적 복사본을 해당 브라우저에서 직접 처리하고, 완전하고 정확한 닫기 결과를 요구한 다음에만 표준 페이지를 일반 Library에서 숨깁니다. 오프라인이거나 변경되었거나 주소를 지정할 수 없는 복사본이 있으면 페이지는 잊히지 않습니다. 여러 브라우저를 닫는 도중에 오류가 발생하면 결과는 닫힌 복사본 수를 알려주고, 기록은 안전한 재시도를 위해 Library에 남습니다. 잊힌 페이지는 7일 동안 되돌릴 수 있는 휴지통에 남습니다. 다시 열거나 명시적으로 복원하면 삭제가 취소되고, 기한이 지난 닫힌 기록은 서버가 백그라운드에서 정리합니다.

Library의 Activity 열에서 TabHub는 추적된 모든 브라우저 세션에서 표준 페이지에 대한 두 가지 기록 지표를 합산합니다. 이 값은 물리적 탭이 닫히고 브라우저가 다시 시작된 후에도 유지됩니다. 탐색 중에는 인터벌이 기록된 URL에 속하므로 페이지 시간이 섞이지 않습니다. 짧은 이동이 디바운스된 snapshot보다 먼저 끝나더라도, 수용된 activity interval은 그 자체로 닫힌 Library 기록을 생성하며, 이후 snapshot은 중복 없이 해당 기록을 열고 보강합니다. On screen은 탭이 선택되고, 해당 창이 전경에 있으며, 컴퓨터가 유휴 상태도 아니고 잠금 상태도 아닌 시간만 계산합니다. Active use는 확인된 마우스 이동/클릭, 키보드, 스크롤 또는 터치 후 60초 이내의 이 시간의 부분 집합입니다. Drawer는 현재 browser session의 특정 물리적 탭에 대해 기록적인 Page activity / 페이지 활동Open copies / 열린 복사본 지표를 별도로 표시합니다. 확장 프로그램은 포인터 좌표, 키 입력, 텍스트 없이 인터벌과 합계만 저장합니다. content script를 사용할 수 없는 보호된 브라우저 페이지의 경우 On screen만 계산됩니다. 브라우저를 완전히 다시 시작하면 물리적 탭 카운터가 새 세션을 시작하므로 재사용된 Chromium tabId가 다른 시간을 받지 않지만, 페이지의 기록 활동은 계속 누적됩니다. 정확한 기록 집계는 schema 15부터 시작됩니다. URL이 저장되지 않은 이전 물리적 합계는 의도적으로 페이지에 임의로 이전되지 않습니다. schema 16은 snapshot이 보지 못한 정확한 activity-only URL을 구체화합니다.

Workspaces는 선택된 모든 물리적 인스턴스의 명명된 스냅샷을 서버의 최신 browser/window/index 순서로 SQLite에 저장하며, 동일한 URL도 포함합니다. 쿼리에는 간결한 식별자가 포함되며, live 명령 후 확장 프로그램은 먼저 새 순서와 플래그를 동기화합니다. 따라서 Move/Pin/Mute 직후의 Save는 이전 상태를 저장하지 않습니다. Save & close는 먼저 확인을 거쳐 스냅샷을 저장한 다음에만 close preview를 엽니다. 저장된 전체 세트는 현재 또는 새 창에서 열거나, 이름을 바꾸거나, 삭제할 수 있습니다. 복원은 숨은 잘림 없이 저장된 각 항목을 순차적으로 엽니다. 복원 중에는 재실행이 차단되며, 타임아웃으로 결과를 알 수 없는 경우 UI는 먼저 브라우저를 확인하도록 요청합니다. 선택한 탭은 URL, Markdown 또는 JSON 목록으로도 복사됩니다.

콘텐츠는 명령으로만 추출됩니다. Readability는 본문 텍스트와 기사의 HTML을 가져오고, 적합한 기사가 없는 페이지에는 document.body.innerText를 사용합니다. v1에는 모든 탭을 자동으로 순회하는 기능이 없습니다.

여러 브라우저에서 스냅샷을 찍으면 기록이 브라우저 열과 함께 공통 테이블에 나타납니다. 다시 스냅샷을 찍으면 기존의 정규화된 링크가 업데이트되고, 사라진 탭은 isOpen=false 상태로 데이터베이스에 남습니다.

확장 프로그램 없이 REST 확인

$body = @{
  browser = 'chrome'
  tabs = @(@{
    url = 'https://example.com/?utm_source=test#section'
    title = 'Example'
    windowId = 1
    index = 0
  })
} | ConvertTo-Json -Depth 4

Invoke-RestMethod -Method Post -Uri http://127.0.0.1:7717/api/ingest/snapshot -ContentType application/json -Body $body
Invoke-RestMethod http://127.0.0.1:7717/api/tabs

GET /api/tabs는 페이지네이션 전에 전역 정렬을 지원합니다. sort_bytitle, topics, browser, activity, status, importance, state 또는 age를 받고, sort_directionasc 또는 desc를 받습니다. 열 정렬은 search_mode=semanticsimilar_to와 결합되지 않으며, 이 경우 순서는 관련성에 따라 결정됩니다.

전체 텍스트 검색

검색은 콘텐츠를 캡처하기 전에도 제목과 전체 URL을 대상으로 작동하며, 표준 페이지와 병합된 각 물리적 탭의 제목과 원본 URL도 포함합니다. 캡처 후에는 정제된 텍스트와 summary도 고려합니다. 부분적으로 입력된 단어는 접두사로 일치하고, 제목과 URL의 리터럴 조각은 대소문자를 구분하지 않는 Unicode 부분 문자열로 일치합니다. 사용자 쿼리의 문장 부호는 FTS 구문으로 해석되지 않습니다:

Invoke-RestMethod 'http://127.0.0.1:7717/api/tabs?q=local-first'

웹 인터페이스에서는 동일한 매개변수가 테이블 위의 검색 창에서 사용할 수 있습니다.

의미 검색 및 inbox 클러스터

임베딩은 명시적 요청이 있을 때만 생성됩니다. 기본적으로 TabHub는 http://127.0.0.1:11434의 로컬 Ollama를 사용합니다. 첫 인덱싱 전에 모델을 설치하세요:

ollama pull nomic-embed-text

Voyage를 사용하려면 .envEMBEDDING_PROVIDER=voyage, VOYAGE_API_KEY, 그리고 필요한 경우 VOYAGE_EMBEDDING_MODEL을 설정하세요. EMBEDDING_PROVIDER=disabled는 프로바이더를 완전히 비활성화합니다. 두 옵션 모두 512차원 벡터를 로컬 sqlite-vec 테이블에 저장합니다. 캡처된 텍스트는 프로바이더로 전송되기 전에 32,000자로 제한되며 100개 탭씩 배치로 처리됩니다.

Invoke-RestMethod -Method Post `
  -Uri http://127.0.0.1:7717/api/embeddings/reindex `
  -ContentType application/json `
  -Body '{"limit":100}'

Invoke-RestMethod 'http://127.0.0.1:7717/api/tabs?q=compiler&search_mode=semantic'
Invoke-RestMethod 'http://127.0.0.1:7717/api/tabs?similar_to=1'

Invoke-RestMethod -Method Post `
  -Uri http://127.0.0.1:7717/api/clusters/inbox `
  -ContentType application/json `
  -Body '{"maxClusters":8}'

텍스트를 다시 캡처하면 오래된 벡터가 제거됩니다. cluster_inbox는 아직 인덱싱되지 않은 inbox 상태의 탭만 인덱싱한 다음 명명된 클러스터를 결정론적으로 제안합니다. 태그를 만들지 않으며 사용자 지정 마크업을 변경하지 않습니다.

요청 시 요약

TabHub는 탭을 자동으로 요약하지 않습니다. UI 또는 MCP에서 수동 요청을 활성화하려면 .envANTHROPIC_API_KEY를 설정하고 서버를 다시 시작하세요. 기본적으로 짧은 모드는 claude-haiku-4-5-20251001을 사용하고, 심층 모드는 claude-sonnet-5를 사용합니다. 모델과 계산된 가격은 .env.exampleANTHROPIC_* 변수로 재정의할 수 있습니다.

요청은 SQLite에 안정적인 작업을 생성하며, 백그라운드 worker는 동시에 하나의 Anthropic 호출만 실행합니다. 일시적인 오류는 backoff로 재시도되고, 완료되지 않은 작업은 재시작 후 복구되며, 오래된 결과는 다시 캡처된 콘텐츠 위에 기록되지 않습니다. TABHUB_DAILY_SUMMARY_LIMIT는 UTC 하루 동안의 프로바이더 호출 시도만 제한합니다. 토큰 사용량과 계산된 비용은 각 시도에 대해 저장되며 성공한 작업의 로그에 기록됩니다.

$job = Invoke-RestMethod -Method Post `
  -Uri http://127.0.0.1:7717/api/tabs/1/summarize `
  -ContentType application/json `
  -Body '{"depth":"short"}'

Invoke-RestMethod "http://127.0.0.1:7717/api/jobs/$($job.jobId)"

키가 설정되지 않으면 endpoint는 503 SUMMARY_PROVIDER_UNAVAILABLE을 반환하고 작업을 생성하지 않습니다. UI 테이블에서 캡처된 텍스트가 있는 각 탭에 대해 짧은 summary를 만들거나 업데이트할 수 있습니다. 대기열 상태와 오류는 작업 옆에 표시됩니다.

탭 구성

테이블은 행 선택과 상태 대량 변경 또는 예를 들어 Research/AI/Agents 같은 계층적 테마 경로 지정을 지원합니다. 대량 패널과 탭 카드의 테마 필드는 검색 가능한 기존 경로를 제안하지만, 새 경로를 만들 수 있도록 편집 가능한 상태로 유지됩니다. 시스템 테마 Без темы는 제안에 포함되지 않습니다. 현재 페이지의 행은 동적 높이 측정으로 가상화되므로, 펼쳐진 summary는 전체 페이지를 DOM에 마운트하지 않고도 올바르게 유지됩니다. 테마 사이드바는 누적 카운터가 있는 임의 깊이의 트리를 표시합니다. 여기서 루트 및 하위 테마를 만들고, 이름을 바꾸고, 이동하고, 색상을 설정하고, 확인 후 하위 테마가 없는 테마를 삭제할 수 있습니다. 상위 경로 필터에는 모든 하위 테마의 탭이 포함됩니다. 행을 클릭하면 콘텐츠, summary, 테마, 방향성 링크, 중요도 및 임의 필드가 있는 탭 카드가 열립니다.

보호되는 시스템 테마 Без темы는 사용자 지정 테마가 없는 모든 탭을 자동으로 포함합니다. 첫 번째 일반 테마를 할당하면 이 연결이 해제되고, 마지막 일반 테마를 삭제하면 다시 복원됩니다. Без темы는 Library와 Graph에서 필터로 사용할 수 있지만 이름을 바꾸거나, 이동하거나, 삭제하거나, 수동으로 할당할 수 없습니다. 그래프에서 시스템 테마 자체와 그 구조적 연결은 표시되지 않습니다. 필터링된 탭은 테마가 할당되지 않은 일반 탭처럼 보입니다.

PATCH /api/tabs/:idstatus, importance, customFields의 비어 있지 않은 조합을 허용합니다. 문자열 값은 필드를 만들거나 업데이트하고, null은 해당 필드를 제거합니다. 대량 중요도는 PATCH /api/tabs/importance를 통해 사용할 수 있습니다. 테마 CRUD는 /api/tags 아래에 있고, 경로 할당은 POST /api/tags/assign입니다. 탭-탭, 탭-테마, 테마-테마 범용 연결은 /api/relations에서 사용할 수 있으며, 이전 /api/links는 탭 간 연결의 호환 가능한 프로젝션으로 유지됩니다. 수동 변경은 user 출처로 저장되고, MCP 변경은 agent로 저장됩니다.

관계 그래프

Graph 섹션은 탭과 테마가 별도의 노드 유형으로 표시되는 3D WebGL 그래프를 엽니다. 마우스로 장면을 회전하고, 평면을 이동하고, 확대/축소할 수 있습니다. 클릭하면 노드를 선택하고 카메라가 해당 노드로 이동하며 메타데이터, 기존 브라우저 탭이나 선택한 Library 테마로 이동할 수 있는 인스펙터가 열립니다.

선택한 노드에 대해 1~5단계의 초점 깊이를 설정할 수 있습니다. 이 무방향 환경의 모든 노드와 가장자리는 밝게 유지되고 나머지 장면은 투명해집니다. 필터가 활성화되면 서버는 테마 경계 너머의 직접적인 교차 연결을 유지하고, 선택한 노드의 더 깊은 주변은 별도의 제한된 프로젝션으로 추가 로드됩니다. 이를 위해 전체 전역 그래프는 필요하지 않습니다. 인스펙터에서는 보이는 모든 노드와 방향성 의미 연결을 만들고, 해당 유형과 메모를 지정하거나 기존 의미 연결을 삭제할 수 있습니다. 테마 계층과 탭 소속은 구조적 가장자리로 표시되지만 사용자 연결 테이블에는 중복되지 않습니다.

테마 트리의 필터는 선택한 하위 트리만 로드합니다. 밀도가 높은 그래프의 경우 인터페이스는 시뮬레이션 시간을 줄이고, 지오메트리를 단순화하며, 비용이 많이 드는 개별 노드 드래그를 비활성화합니다. 3D 코드 자체는 별도의 lazy chunk로 로드되므로 Library 초기 열기를 무겁게 만들지 않습니다. 표준 타입화된 REST 응답은 별도로 제공되며, 이전 endpoint는 호환성을 위해 유지됩니다:

Invoke-RestMethod http://127.0.0.1:7717/api/graph/v2
Invoke-RestMethod 'http://127.0.0.1:7717/api/graph/v2?root_topic_id=1'
Invoke-RestMethod 'http://127.0.0.1:7717/api/graph/v2?root_topic_id=1&focus_node_type=topic&focus_node_id=2&focus_depth=3'
Invoke-RestMethod http://127.0.0.1:7717/api/relations
Invoke-RestMethod http://127.0.0.1:7717/api/graph

Claude Desktop 및 Codex용 MCP

먼저 stdio MCP 서버를 빌드하고 기본 TabHub 서버를 127.0.0.1:7717에서 실행 중인 상태로 두세요:

corepack pnpm --filter @tabhub/mcp build
corepack pnpm dev

MCP 프로세스는 TABHUB_API_URL을 사용하며 REST API 위의 얇은 어댑터로 유지됩니다. 이 프로세스는 list_tabs, get_tab, search_tabs, summarize_tab, cluster_inbox, set_status, set_importance, tag_tabs, link_tabs, list_tags, get_stats, review_disposable_pages, set_page_retention, close_and_forget_page, list_retention_trash, restore_retention_page 도구와 tabhub://tab/{id} 리소스를 제공합니다. list_tabs는 REST 목록과 동일한 필터(q, search_mode, similar_to 포함)를 받습니다. search_tabsfulltextsemantic 모드를 지원합니다. cluster_inbox는 분류되지 않은 탭을 명시적으로 인덱싱하고 제목, 키워드, 탭 ID가 포함된 제안을 반환합니다. Deprecated된 set_importance 도구는 먼저 /api/features를 읽습니다. logical importance가 활성화된 경우 서버는 on_behalf_of_user 에이전트 기록을 저장하며, 플래그가 꺼져 있거나 이전 schema-17 서버에서는 선택된 탭에 대해서만 기존의 스칼라 기록이 사용됩니다. 잘못된 feature contract는 기록을 생성하지 않습니다. review_disposable_pages는 개인 제안과 경고만 표시하며, set_page_retention은 '유지' 또는 '나중에' 결정을 저장합니다. 파괴적인 close_and_forget_pageconfirmed=true를 요구하며, 정확히 확인된 결과가 있는 경우에만 알려진 모든 물리적 인스턴스를 닫고 페이지를 7일 휴지통으로 이동합니다. 이 페이지는 list_retention_trashrestore_retention_page를 통해 확인하고 되돌릴 수 있습니다. summarize_tab은 요청을 에이전트 요청으로 표시하고 동일한 SQLite 큐에 넣은 다음 최대 55초 동안 완료를 기다립니다. 작업이 아직 끝나지 않은 경우 다시 호출하면 동일한 활성 작업에 대한 대기가 계속됩니다. MCP 응답의 콘텐츠는 약 20,000자로 제한됩니다.

Claude Desktop

Settings → Developer → Edit Config를 열고 %APPDATA%\Claude\claude_desktop_config.json에 서버를 추가한 다음 Claude Desktop을 완전히 다시 시작하세요:

{
  "mcpServers": {
    "tabhub": {
      "command": "C:\\Program Files\\nodejs\\node.exe",
      "args": ["D:\\VibeCoding\\TabHub\\packages\\mcp\\dist\\main.js"],
      "env": {
        "TABHUB_API_URL": "http://127.0.0.1:7717"
      }
    }
  }
}

Node.js 또는 리포지토리가 다른 위치에 있다면 (Get-Command node).Source(Resolve-Path packages/mcp/dist/main.js).Path 명령으로 절대 경로를 확인한 후 위 값을 교체하세요.

Codex

CLI를 통해 서버를 추가하세요:

codex mcp add tabhub --env TABHUB_API_URL=http://127.0.0.1:7717 -- 'C:\Program Files\nodejs\node.exe' 'D:\VibeCoding\TabHub\packages\mcp\dist\main.js'
codex mcp list

%USERPROFILE%\.codex\config.toml의 동일한 수동 설정:

[mcp_servers.tabhub]
command = 'C:\Program Files\nodejs\node.exe'
args = ['D:\VibeCoding\TabHub\packages\mcp\dist\main.js']
cwd = 'D:\VibeCoding\TabHub'
startup_timeout_sec = 10
tool_timeout_sec = 60

[mcp_servers.tabhub.env]
TABHUB_API_URL = "http://127.0.0.1:7717"

연결 후 Codex에서 /mcp를 열고 tabhub 및 위에 나열된 모든 도구를 사용할 수 있는지 확인하세요.

확인

corepack pnpm test
corepack pnpm typecheck
corepack pnpm build

백업

서버가 중지되었거나 실행 중인 상태에서 SQLite online-backup은 다음 명령으로 생성됩니다:

corepack pnpm backup

파일은 루트 폴더 backups/에 생성됩니다.

구현 상태

  • 단계 0: 모노레포 뼈대, 공통 스키마, SQLite 마이그레이션 및 healthcheck — 완료.

  • 단계 1: Chromium 브라우저 스냅샷, 안정적인 확장 프로그램 큐, REST ingest, 중복 제거 및 공통 테이블 — 완료.

  • 단계 2: Readability 콘텐츠 수동 캡처, FTS5 및 UI 검색 — 완료.

  • 단계 3: 관리 REST 작업, 계층적 태그, 통계 및 Claude Desktop/Codex용 MCP 도구 — 완료.

  • 단계 4: 안정적인 SQLite 큐를 통한 명시적 요약, 순차적 Anthropic worker, UI 및 MCP — 완료.

  • 단계 5: 주제 트리, 탭 카드, 연결, 중요도, custom fields 및 UI/MCP 대량 작업 — 완료.

  • 단계 6: sqlite-vec, Ollama/Voyage를 통한 명시적 인덱싱, 시맨틱 검색, 유사 탭 및 REST/MCP의 명명된 inbox 클러스터 — 완료.

  • 단계 7: WebGL 내비게이션, 임의의 교차 연결, 인스펙터, 그리고 1–5단계 깊이의 주변 환경에 초점을 맞춘 타입화된 탭·주제 3D 그래프 — 완료.

-
license - not tested
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
2hResponse time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

  • Private-by-default, local-first memory/context/task orchestrator for MCP apps and agents.

  • Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.

  • Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/WistRu/Hypomnema'

If you have feedback or need assistance with the MCP directory API, please join our Discord server