
NotebookLM을 강화한 버전 — 보안 연구자를 위해 특별히 설계됨.
모든 보안 연구자는 그 기분을 압니다 — 흥미로운 GitHub 저장소, 새로운 CVE 분석글, 새로운 익스플로잇 기법에 대한 블로그 게시물을 발견합니다. 왓츠앱으로 자신에게 전달합니다. 바로 채팅에 묻혀버립니다. 몇 주 후에 그 글을 실제로 필요할 때 — 이미 사라져 있습니다.
다시는 찾지 못할 링크를 자신에게 보내지 마세요 — Samuraizer에 한 번 보내면 요약되고, 태그가 지정되며, 영원히 검색 가능합니다.
| 전에는 😵 | 지금은 🗡️ |
|---|---|
![]() 채팅 기록에 흩어져 묻힌 링크들 | ![]() 분석되고, 태그되어, 언제든 찾을 준비가 된 상태 |
🎯 추가 개인정보 보호 모드 (로컬 전용) — ollama로 실행하면 모든 데이터가 내 컴퓨터에 남습니다.
samuraizer.db에 로컬 벡터 저장소 + Ollama를 통한 로컬 AI 임베딩ollama pull qwen3:4b, ollama pull qwen3-embedding:8b)하면 완전히 오프라인에서 작동.pdf, .docx, .pptx, .txt, .md


/yt-channels API를 통해 실행되며 UI의 RSS/YT 섹션에 표시됩니다
![]() URL 분석 | ![]() 일일 추천 읽을거리 |
@ 입력 또는 @ 찾아보기 버튼 사용
![]() 출처 점수가 포함된 RAG 채팅 | ![]() 고정 컨텍스트 채팅 |
[!IMPORTANT] Samuraizer의 미래를 만들어가세요! 현재 로컬 LLM, 옵시디언 내보내기 등 새로운 기능에 대해 투표가 진행 중입니다. 여기서 투표하세요!
flowchart LR
Browser[Browser UI] -->|HTTP| Frontend[React Frontend]
Frontend -->|REST/NDJSON| Backend[Flask API]
Backend -->|SQL| SQLite[(samuraizer.db)]
Backend -->|API| Gemini[Gemini 2.5 Flash]
Backend -->|local API| Ollama[Ollama - Local LLM]
Backend -->|GitHub API| GitHub[GitHub]
Backend -->|RSS| RSS[RSS feeds]
Telegram[Telegram Bot] -->|HTTP| Backend
samuraizer.db에 저장되고 프론트엔드에 표시됩니다.PATCH /entries/<id>를 통해 유지)| 계층 | 기술 / 라이브러리 |
|---|---|
| 백엔드 | Python, Flask, SQLite, feedparser, PyMuPDF |
선호하는 설정 방법을 선택하세요:
git clone https://github.com/zomry1/Samuraizer.git
cd Samuraizer
.env.example을 .env로 복사하고 값을 입력하세요.
또는 웹 UI를 열고 설정 탭으로 이동하여 저장하기 전에 설정(제공자, API 키, Ollama 모델명, 임베딩 모델명)을 조정할 수 있습니다.
cp .env.example .env
전체 스택을 실행하는 가장 쉬운 방법 — 하나의 명령어로 모든 것을 빌드하고 시작합니다.
git clone https://github.com/zomry1/Samuraizer.git
cd Samuraizer
cp .env.example .env
# .env를 편집하여 GEMINI_API_KEY (및 필요한 다른 값)를 입력하세요
모든 Docker 파일은 docker/ 폴더에 있습니다. 프로젝트 루트에서 명령을 실행하세요:
Gemini (클라우드) — 기본:
docker compose -f docker/docker-compose.yml up -d
CPU에서 Ollama:
docker compose -f docker/docker-compose.yml --profile ollama up -d
NVIDIA GPU에서 Ollama:
docker compose -f docker/docker-compose.yml --profile ollama-nvidia up -d
youtube-transcript-api를 사용하지 않나요?원래 구현은 오픈소스 youtube-transcript-api Python 라이브러리를 사용했습니다. 로컬에서는 잘 작동하지만 실제로는 YouTube가 자동화된 자막 요청을 하는 IP 주소를 적극적으로 차단합니다. 특히 다음 IP가 차단됩니다:
이는 몇 개의 동영상만 분석한 후에도 전체 서버가 차단되어 모든 후속 자막 가져오기가 IPBlocked / RequestBlocked 오류로 실패하게 되어 YouTube 동영상 분석이 완전히 중단된다는 것을 의미했습니다.
transcriptapi.comSamuraizer는 이제 transcriptapi.com을 사용합니다 — 차단되지 않는 인프라를 통해 YouTube 자막 가져오기를 처리하는 타사 유료 API입니다.
장점:
GET /api/v2/youtube/transcript)단점:
설정: 에 추가:
POST /analyze
본문:
{ "url": "https://github.com/owner/repo" }
POST /analyze-pdf
본문: multipart/form-data 형식이며 file 필드에 .pdf 파일이 포함됩니다.
/analyze와 동일한 형태로 NDJSON 이벤트를 스트리밍합니다 (파일 이름을 url 키로 사용).
GET /entries/<id>/pdf — 브라우저에 PDF를 인라인으로 제공합니다.
GET /entries/<id>/pdf?dl=1 — PDF를 파일 다운로드로 제공합니다.
MIT
| LLM | Gemini 2.5 Flash (Gemini API), Ollama (로컬 선택사항) |
| 프론트엔드 | React 18, Vite, Tailwind CSS |
| 봇 | python-telegram-bot v20 |
| 자막 | transcriptapi.com |
| 변수 | 필수 여부 | 획득 방법 |
|---|
LLM_PROVIDER | 아니오 | gemini (기본값, 클라우드) 또는 ollama (로컬) |
GEMINI_API_KEY | gemini 사용 시 | Google AI Studio → API 키 받기 |
OLLAMA_URL | ollama 사용 시 | Ollama API URL (기본값: http://localhost:11434) |
OLLAMA_MODEL | ollama 사용 시 | 추론 모델 (기본값: qwen3:14b) |
OLLAMA_EMBED_MODEL | ollama 사용 시 | 임베딩 모델 (기본값: qwen3-embedding:8b) |
TELEGRAM_BOT_TOKEN | 아니오 | 텔레그램에서 @BotFather로 봇 생성 |
GITHUB_TOKEN | 아니오 | GitHub → 설정 → 개발자 설정 → 개인 액세스 토큰 — API 요청 제한을 60회에서 5,000회/시간으로 증가 |
TRANSCRIPTAPI | 아니오 | transcriptapi.com/dashboard/api-keys — YouTube 자막 가져오기에 필요 |
SAMURAIZER_URL | 아니오 | 백엔드 URL (기본값: http://localhost:8000), 텔레그램 봇에서 사용 |
Ollama로 Samuraizer를 완전히 오프라인에서 실행하세요:
# Ollama CLI 설치 (플랫폼에 따라 다름)
# macOS
curl -fsSL https://ollama.com/install.sh | sh
# Windows
irm https://ollama.com/install.ps1 | iex
# Linux (Ubuntu/Debian)
curl -fsSL https://ollama.com/install.sh | sh
# Ollama 서비스 시작
ollama serve
# 모델 설치
ollama pull qwen3:4b # 추론
ollama pull qwen3-embedding:8b # 임베딩
# .env에서 제공자 설정
LLM_PROVIDER=ollama
이미 Gemini 임베딩이 있는 경우 Ollama로 전환하면 다음 시작 시 자동으로 지워집니다(차원 불일치). UI를 통해 또는 POST /entries/embed-all로 다시 임베딩하세요.
# 가상 환경 생성 및 활성화
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
cd frontend
npm install
cd ..
python server.py
cd frontend
npm run dev
python telegram_bot.py
Windows (WSL 2):
wsl --install
wsl --update
Windows용 Docker Desktop은 NVIDIA 컨테이너 런타임을 자동으로 번들 제공합니다 — 추가 단계 필요 없음.
Linux:
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
AMD GPU에서 Ollama (ROCm 호환 GPU + Linux의 amdgpu 드라이버 필요):
docker compose -f docker/docker-compose.yml --profile ollama-amd up -d
이제 끝입니다. 프론트엔드는 **http://localhost**에, API는 **http://localhost:8000**에 있습니다.
팁: Ollama 프로필을 사용할 때는
.env에서LLM_PROVIDER=ollama로 설정하세요.OLLAMA_URL은 컨테이너 내부에서 자동으로http://ollama:11434로 설정됩니다 — 변경할 필요가 없습니다.
Ollama로 처음 시작한 후 모델을 풀어주세요 (시작한 프로필과 일치하는 컨테이너 이름 사용):
# --profile ollama
docker exec -it samuraizer-ollama-1 ollama pull qwen3:4b
docker exec -it samuraizer-ollama-1 ollama pull qwen3-embedding:8b
# --profile ollama-nvidia
docker exec -it samuraizer-ollama-nvidia-1 ollama pull qwen3:4b
docker exec -it samuraizer-ollama-nvidia-1 ollama pull qwen3-embedding:8b
# --profile ollama-amd
docker exec -it samuraizer-ollama-amd-1 ollama pull qwen3:4b
docker exec -it samuraizer-ollama-amd-1 ollama pull qwen3-embedding:8b
data/ 디렉터리에 저장하고 백업은 db_backups/에 저장합니다.ollama_data Docker 볼륨에 저장됩니다 (재시작 시 유지).docker compose -f docker/docker-compose.yml --profile ollama-nvidia --profile bot up -d
git pull
docker compose -f docker/docker-compose.yml up -d --build
docker compose -f docker/docker-compose.yml down
.envTRANSCRIPTAPI=your_key_here
키는 transcriptapi.com/dashboard/api-keys에서 받으세요.
| 옵션 | 작동 방식 | IP 차단 위험 | 비용 |
|---|---|---|---|
| transcriptapi.com (현재) | 관리형 REST API | 없음 (그들의 문제) | 크레딧 기반 |
| yt-dlp | --write-sub --skip-download로 자막 다운로드 | 낮음 (브라우저 모방) | 무료, 자체 호스팅 |
youtube-transcript-api + 쿠키 | 로그인된 브라우저 세션의 Netscape cookies.txt 전달 | 중간 (임시 계정 위험) | 무료 |
| YouTube Data API v3 | 공식 Google API, 스크래핑 없음 | 없음 | 무료 할당량, 이후 유료 |
| Supadata | 유사한 관리형 REST API | 없음 | 무료 티어 (일 100회 요청) |
최고의 무료 대안: yt-dlp — 적극적으로 유지 관리되며 실제 브라우저 요청을 모방하고 일반 HTTP 요청만큼 빠르게 차단되지 않을 가능성이 높습니다. 전환하려면 _fetch_youtube_content를 대체하여 yt-dlp --write-auto-sub --sub-format vtt --skip-download를 셸로 실행하고 결과 .vtt 파일을 파싱하세요.
GET /entries (필터 지원: search, category, tag, source, list_id, read, useful)
GET /yt-channels — 구독한 채널 목록 (id, channel_id, channel_url, name, last_checked)POST /yt-channels/preview — 본문 { "url": "https://www.youtube.com/@handle" }, 채널 정보 + 최신 동영상(URL/제목/게시일) 반환POST /yt-channels — 본문 { "url": "...", "name": "선택사항", "analyze_urls": ["https://...", ...] }; 구독 생성 및 선택한 동영상 선택적 분석POST /yt-channels/<id>/poll — 채널에 대한 즉시 수동 폴링DELETE /yt-channels/<id> — 구독 제거PATCH /entries/<id>를 통해 JSON { "tags": ["tag1","tag2"] }로 수행됩니다.