
NotebookLM dopé aux stéroïdes — conçu spécialement pour les chercheurs en sécurité.
Tout chercheur en sécurité connaît cette sensation — vous tombez sur un dépôt GitHub intéressant, un nouveau writeup CVE, un article de blog sur une technique d'exploitation récente. Vous vous l'envoyez sur WhatsApp. Il se noie immédiatement dans la discussion. Des semaines plus tard, vous avez réellement besoin de cet article — et il a disparu.
Arrêtez de vous envoyer des liens que vous ne retrouverez jamais — envoyez-les à Samuraizer une fois, et ils sont résumés, étiquetés et consultables pour toujours.
| Avant 😵 | Après 🗡️ |
|---|---|
![]() Liens éparpillés noyés dans l'historique des discussions | ![]() |
🎯 Mode confidentialité supplémentaire (local uniquement) — exécutez avec ollama, toutes les données restent sur votre machine.
samuraizer.db + plongements IA locaux via Ollama.ollama pull qwen3:4b, ollama pull qwen3-embedding:8b)..pdf, .docx, .pptx, .txt, .md


/yt-channels et apparaît dans l'interface sous les sections RSS/YT
![]() Analyse d'une URL | ![]() Lecture suggérée quotidienne |
@ pour l'auto-complétion ou utilisez le bouton de navigation @
![]() Chat RAG avec scores des sources | ![]() Chat avec contexte épinglé |
[!IMPORTANT] Façonnez l'avenir de Samuraizer ! Nous votons actuellement pour de nouvelles fonctionnalités comme les LLM locaux et l'export Obsidian. Votez ici !
flowchart LR
Browser[Interface Navigateur] -->|HTTP| Frontend[Frontend React]
Frontend -->|REST/NDJSON| Backend[API Flask]
Backend -->|SQL| SQLite[(samuraizer.db)]
Backend -->|API| Gemini[Gemini 2.5 Flash]
Backend -->|API locale| Ollama[Ollama - LLM Local]
Backend -->|API GitHub| GitHub[GitHub]
Backend -->|RSS| RSS[Flux RSS]
Telegram[Bot Telegram] -->|HTTP| Backendsamuraizer.db et affichés dans le frontend.PATCH /entries/<id>)| Couche | Tech / Bibliothèques |
|---|---|
| Backend |
Choisissez votre méthode de configuration préférée :
git clone https://github.com/zomry1/Samuraizer.git
cd Samuraizer
Copiez .env.example vers .env et remplissez vos valeurs.
Vous pouvez aussi ouvrir l'interface web, aller dans l'onglet Paramètres, et ajuster les réglages (fournisseur, clés API, noms des modèles Ollama, noms des modèles de plongement) avant d'enregistrer.
cp .env.example .env
La façon la plus simple d'exécuter la pile complète — une commande construit et démarre tout.
git clone https://github.com/zomry1/Samuraizer.git
cd Samuraizer
cp .env.example .env
# Modifiez .env et remplissez GEMINI_API_KEY (et toutes les autres valeurs nécessaires)
Tous les fichiers Docker se trouvent dans le dossier docker/. Exécutez les commandes depuis la racine du projet :
Gemini (cloud) — par défaut :
docker compose -f docker/docker-compose.yml up -d
Ollama sur CPU :
docker compose -f docker/docker-compose.yml --profile ollama up -d
Ollama sur GPU NVIDIA :
docker compose -f docker/docker-compose.yml --profile ollama-nvidia up -d
youtube-transcript-api ?L'implémentation originale utilisait la bibliothèque open-source Python youtube-transcript-api. Elle fonctionne bien localement mais présente une limitation critique en pratique : YouTube bloque agressivement les adresses IP qui effectuent des requêtes automatisées de transcription, en particulier :
Cela signifie qu'après avoir analysé seulement une poignée de vidéos, l'ensemble du serveur se retrouvait bloqué et chaque récupération de transcription suivante échouait avec une erreur IPBlocked / RequestBlocked — brisant complètement l'analyse des vidéos YouTube.
transcriptapi.comSamuraizer utilise désormais transcriptapi.com — une API payante tierce qui gère la récupération des transcriptions YouTube de leur côté, en routant via une infrastructure qui n'est pas bloquée.
Avantages :
POST /analyze
Corps :
{ "url": "https://github.com/proprietaire/depot" }
POST /analyze-pdf
Corps : multipart/form-data avec un champ file contenant un fichier .pdf.
Diffuse des événements NDJSON dans le même format que /analyze (en utilisant le nom du fichier comme clé url).
GET /entries/<id>/pdf — sert le PDF en ligne dans le navigateur.
GET /entries/<id>/pdf?dl=1 — sert le PDF en tant que téléchargement de fichier.
MIT
| Python, Flask, SQLite, feedparser, PyMuPDF |
| LLM | Gemini 2.5 Flash (API Gemini), Ollama (local optionnel) |
| Frontend | React 18, Vite, Tailwind CSS |
| Bot | python-telegram-bot v20 |
| Transcripts | transcriptapi.com |
| Variable | Requise | Où l'obtenir |
|---|
LLM_PROVIDER | Non | gemini (par défaut, cloud) ou ollama (local) |
GEMINI_API_KEY | Quand gemini | Google AI Studio → Obtenir une clé API |
OLLAMA_URL | Quand ollama | URL de l'API Ollama (par défaut : http://localhost:11434) |
OLLAMA_MODEL | Quand ollama | Modèle de raisonnement (par défaut : qwen3:14b) |
OLLAMA_EMBED_MODEL | Quand ollama | Modèle de plongement (par défaut : qwen3-embedding:8b) |
TELEGRAM_BOT_TOKEN | Non | Créez un bot avec @BotFather sur Telegram |
GITHUB_TOKEN | Non | GitHub → Paramètres → Paramètres développeur → Jetons d'accès personnels — augmente la limite de taux API de 60 à 5 000 requêtes/heure |
TRANSCRIPTAPI | Non | transcriptapi.com/dashboard/api-keys — requis pour la récupération des transcriptions YouTube |
SAMURAIZER_URL | Non | URL de votre backend (par défaut : http://localhost:8000), utilisée par le bot Telegram |
Exécutez Samuraizer entièrement hors ligne avec Ollama :
# Installer l'interface en ligne de commande Ollama (dépend de la plateforme)
# 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
# Démarrer le service Ollama
ollama serve
# Installer les modèles
ollama pull qwen3:4b # raisonnement
ollama pull qwen3-embedding:8b # plongements
# Définir le fournisseur dans .env
LLM_PROVIDER=ollama
Si vous avez déjà des plongements Gemini, passer à Ollama les effacera automatiquement au prochain démarrage (incompatibilité de dimension). Ré-encodage via l'interface ou POST /entries/embed-all.
# Créer et activer un environnement virtuel
python -m venv .venv
source .venv/bin/activate # Sur 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
Docker Desktop pour Windows intègre automatiquement l'environnement d'exécution de conteneur NVIDIA — aucune étape supplémentaire n'est nécessaire.
Linux :
Installez le NVIDIA Container Toolkit :
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
Ollama sur GPU AMD (nécessite un GPU compatible ROCm + pilote amdgpu sur Linux) :
docker compose -f docker/docker-compose.yml --profile ollama-amd up -d
C'est tout. Le frontend est à l'adresse http://localhost et l'API à http://localhost:8000.
Astuce : Lorsque vous utilisez un profil Ollama, définissez
LLM_PROVIDER=ollamadans votre.env. L'OLLAMA_URLest automatiquement définie surhttp://ollama:11434à l'intérieur des conteneurs — vous n'avez pas besoin de la modifier.
Après le premier démarrage avec Ollama, téléchargez les modèles (utilisez le nom du conteneur correspondant au profil que vous avez démarré) :
# --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/ du projet et les sauvegardes dans db_backups/.ollama_data (persiste entre les redémarrages).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
GET /api/v2/youtube/transcript)Inconvénients :
Configuration : Ajoutez à .env :
TRANSCRIPTAPI=votre_cle_ici
Obtenez une clé sur transcriptapi.com/dashboard/api-keys.
| Option | Fonctionnement | Risque de blocage IP | Coût |
|---|---|---|---|
| transcriptapi.com (actuel) | API REST gérée | Aucun (leur problème) | Basé sur crédits |
| yt-dlp | Télécharge les sous-titres via --write-sub --skip-download | Faible (imite un navigateur) | Gratuit, auto-hébergé |
youtube-transcript-api + cookies | Transmet un cookies.txt Netscape depuis une session navigateur connectée | Moyen (risque de compte jetable) | Gratuit |
| YouTube Data API v3 | API officielle Google, pas de scraping | Aucun | Quota gratuit, puis payant |
| Supadata | API REST gérée similaire | Aucun | Niveau gratuit (100 req/jour) |
Meilleure alternative gratuite : yt-dlp — il est activement maintenu, imite les requêtes de navigateur réelles et a peu de chances d'être bloqué aussi rapidement qu'une simple requête HTTP. Pour basculer, remplacez _fetch_youtube_content par un appel à yt-dlp --write-auto-sub --sub-format vtt --skip-download et analysez le fichier .vtt résultant.
GET /entries (prend en charge les filtres : search, category, tag, source, list_id, read, useful)
GET /yt-channels — lister les chaînes abonnées (id, channel_id, channel_url, name, last_checked)POST /yt-channels/preview — corps { "url": "https://www.youtube.com/@handle" }, renvoie les informations de la chaîne + les dernières vidéos (url/title/published)POST /yt-channels — corps { "url": "...", "name": "optionnel", "analyze_urls": ["https://...", ...] } ; créer un abonnement et analyser optionnellement les vidéos sélectionnéesPOST /yt-channels/<id>/poll — interrogation manuelle immédiate d'une chaîneDELETE /yt-channels/<id> — supprimer l'abonnementPATCH /entries/<id> avec JSON { "tags": ["tag1","tag2"] }