AI-powered GitHub Trending analyzer that learns your projects, recommends repos that fit your stack, and generates monetization ideas.
- Trending Scraper: GitHub Trending (daily/weekly/monthly) with language filters
- GitHub Enrichment: Topics, issues, license, and activity via GitHub API
- AI Scoring & Summaries: Gemini analysis with heuristic fallback when AI is disabled
- Project Profiles: Register projects with stack, tags, and goals
- Smart Matching: Two-stage matcher (pgvector similarity + stack overlap + quality)
- GitHub Search Discovery: Find repos beyond trending using project-based queries
- Snapshots & History: Save runs and track trending history over time
- GitHub Sync: Sync your GitHub repos as projects automatically (
gt github-sync) - Folder Scanner: Scan local projects folder for auto-registration (
gt scan-projects) - Stack Detection: Auto-detect tech stack from package.json, pyproject.toml, README.md
- Slack Integration: Rich Korean notifications for all features
- Daily Digest: Trending + project matching summary
- Project Matches: "This trending repo fits your project X"
- RAG-powered Bot: AI answers using stored repo data (langchain + Gemini)
- Slack Commands:
μ€μΊ,μΆμ²,νΈλ λ©in channel β results as new message
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β RepoFit β
β β β
β βββββββββββββββββββββββΌββββββββββββββββββββββ β
β β βΌ β β
β β ββββββββββββ ββββββββββββ ββββββββββ β β
β β βCollector ββ β Enricher ββ βAnalyzerβ β Python β
β β β(scraper) β β(GH API) β β(Gemini)β β Backend β
β β ββββββββββββ ββββββββββββ ββββββββββ β β
β β β β β β β
β β ββββββββββββββββ΄ββββββββββββ β β
β β β β β
β β ββββββββββββββββ β β
β β β Embedder β β β
β β β (Gemini) β β β
β β ββββββββββββββββ β β
β β β β β
β β ββββββββββββββββ β β
β β β Matcher β β β
β β β (2-stage) β β β
β β ββββββββββββββββ β β
β βββββββββββββββββββββββΌββββββββββββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββββββββββββββ β
β β Supabase (PostgreSQL) β β
β β βββββββββββ βββββββββββ βββββββββββββ β β
β β βgt_repos β βgt_projs β β pgvector β β β
β β βββββββββββ βββββββββββ βββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βββββββββββββ΄ββββββββββββ β
β βΌ βΌ β
β βββββββββββββββββββ βββββββββββββββββββ β
β β Next.js Web UI β β Slack Notifier β β
β βββββββββββββββββββ βββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
cp .env.example .env
python -m venv .venv && source .venv/bin/activate
pip install -e .
gt init
gt quickstart
# Register your project
gt project-add --name "MyApp" --stack "python,fastapi" --tags "api,web"
# Or sync from GitHub
gt github-sync
# Get daily recommendations
gt sync --notify| Command | Description |
|---|---|
gt init |
Create env files and validate Supabase schema |
gt setup |
Validate configuration and show setup hints |
gt quickstart |
Seed trending data and recommendations quickly |
gt trending |
View trending repos |
gt trending --analyze |
With AI analysis |
gt inspect owner/repo |
Detailed repo analysis |
gt history owner/repo |
Trending history for a repo |
gt snapshots |
List saved trending snapshots |
| Command | Description |
|---|---|
gt projects |
List your projects |
gt project-add |
Register a project |
gt github-sync |
Sync your GitHub repos as projects |
gt github-sync --starred |
Also show starred repos |
gt scan-projects ~/projects |
Scan local folder for projects |
gt match |
Find matching repos for all projects |
gt match --project <id> |
Match a single project |
gt recommendations |
View AI recommendations |
gt discover |
Discover GitHub repos that fit your projects |
| Command | Description |
|---|---|
gt sync |
Full pipeline (fetch β analyze β save β match) |
gt sync --notify |
Full pipeline with daily digest to Slack |
gt schedule |
Run daily sync at a fixed local time (default 19:00) |
gt bot |
Start Slack auto-reply bot (requires Socket Mode) |
The recommendation engine uses a 2-stage approach across all stored repositories:
-
Stage 1 - Fast Filter:
- Tech stack overlap (languages, frameworks)
- Keyword matching (tags, topics)
- Quality threshold (stars, activity)
-
Stage 2 - Semantic Rerank:
- Vector similarity using Gemini embeddings
- Cosine distance between project β repo embeddings
Scoring Formula:
score = 0.5 Γ embedding_similarity
+ 0.3 Γ stack_overlap
+ 0.2 Γ quality_score
-
Create Slack App with Bot Token:
- Go to Slack API β Create New App
- Add Bot Token Scopes:
chat:write,channels:read,channels:history - Install to Workspace β Copy Bot Token (
xoxb-...) - Invite bot to your channel:
/invite @YourBot
-
Enable Socket Mode (for auto-reply bot):
- Slack App Settings β Socket Mode β Enable
- Create App-Level Token with
connections:writescope - Copy the token (
xapp-...) - Event Subscriptions β Enable Events
- Subscribe to bot events:
message.channels,app_mention
-
Configure environment:
SLACK_BOT_TOKEN=xoxb-your-bot-token SLACK_APP_TOKEN=xapp-your-app-token # Socket Modeμ© SLACK_CHANNEL_ID=C0A1CVD5153 SLACK_NOTIFY_THRESHOLD=0.7
RepoFit λ΄μ langchain + Gemini + pgvectorλ₯Ό μ¬μ©νμ¬ μ μ₯λ λ ν¬ λ°μ΄ν°λ₯Ό κ²μνκ³ λ μ νν λ΅λ³μ μ 곡ν©λλ€.
gt bot # λ΄ μμ (λ°±κ·ΈλΌμ΄λλ‘ μ€ν κΆμ₯)μ±λ λͺ λ Ήμ΄ (μ λ©μμ§λ‘ κ²°κ³Ό μ μ‘):
| μ±λ/μ€λ λμ μ λ ₯ | λμ |
|---|---|
μ€μΊ / scan |
νλ‘μ νΈ ν΄λ μ€μΊ β λ±λ‘ β λ§€μΉ |
μΆμ² / recommend |
μΆμ² κ²°κ³Ό β μ±λμ μ λ©μμ§ |
νΈλ λ© / trending |
νΈλ λ© TOP 10 β μ±λμ μ λ©μμ§ |
λ§€μΉ / match |
λ§€μΉ μ€ν β κ²°κ³Ό μ±λμ |
μΌλ° μ§λ¬Έ (RAG μλ΅):
[Slack μ€λ λ]
ββ π€ RepoFit: π μ€λμ λ€μ΄μ μ€νΈ...
ββ π€ λ: "fastapiλ langchain μ‘°ν©νλ©΄ λ λ§λ€ μ μμ΄?"
ββ π€ RepoFit: (μ μ₯λ λ ν¬ μ 보 κ²μ ν ꡬ체μ λ΅λ³)
π μ€λμ RepoFit λ€μ΄μ μ€νΈ
π Python β’ π νΈλ λ© 25κ° λΆμ
ββββββββββββββββββββββββββββ
π― νλ‘μ νΈλ³ λ§€μΉ κ²°κ³Ό
MyApp: 5κ° λ§€μΉ β’ π₯ μ΅κ³ μ 92% (owner/repo)
Backend: 3κ° λ§€μΉ β’ β μ΅κ³ μ 85% (author/lib)
ββββββββββββββββββββββββββββ
π μ€λμ TOP μΆμ²
π₯ fastapi/fastapi β MyApp 92% λ§€μΉ
β langchain/langchain β Backend 85% λ§€μΉ
ββββββββββββββββββββββββββββ
π λ€μ λ¨κ³
β’ gt recommendations - μ 체 μΆμ² 보기
# One-off run (send Slack summary + high-score matches)
gt sync --notify
# Daily schedule at 19:00 local time (keep process running)
gt schedule --hour 19 --minute 0 --notify# Backend (.env)
SUPABASE_URL=your-supabase-url
SUPABASE_ANON_KEY=your-anon-key
SUPABASE_SERVICE_KEY=your-service-key
GEMINI_API_KEY=your-gemini-key
GEMINI_MODEL=gemini-2.5-flash
GITHUB_TOKEN=your-github-token # For github-sync
# Slack Bot (optional but recommended)
SLACK_BOT_TOKEN=xoxb-xxx
SLACK_APP_TOKEN=xapp-xxx # Socket Mode
SLACK_CHANNEL_ID=Cxxx
SLACK_NOTIFY_THRESHOLD=0.7
# Frontend (web/.env.local)
NEXT_PUBLIC_SUPABASE_URL=your-supabase-url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-keymkdir -p ~/.config/systemd/user
cp scripts/repofit-daily.{service,timer} ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now repofit-daily.timerTo change the time, edit ~/.config/systemd/user/repofit-daily.timer and update OnCalendar=.
# Every day at 7 PM - full digest
0 19 * * * cd /path/to/repofit && .venv/bin/gt sync --notify
# Every day at 6 PM - run matching
0 18 * * * cd /path/to/repofit && .venv/bin/gt match --notifyUse .github/workflows/daily-sync.yml with secrets:
SUPABASE_URL,SUPABASE_ANON_KEY,SUPABASE_SERVICE_KEYGEMINI_API_KEYSLACK_BOT_TOKEN,SLACK_CHANNEL_ID
| Component | Technology |
|---|---|
| CLI | Python, Typer, Rich |
| AI | Google Gemini (analysis + embeddings) |
| AI SDK | google-genai, langchain, langchain-google-genai |
| RAG | langchain + pgvector retrieval |
| Database | Supabase (PostgreSQL + pgvector) |
| Frontend | Next.js 16, React 19, Tailwind CSS 4 |
| HTTP | httpx (async) |
| Notifications | Slack Block Kit, slack-bolt (Socket Mode) |
- Schema missing: Run
schema.sqlin Supabase SQL Editor - No recommendations: Set
GEMINI_API_KEY, then rungt quickstart - Slack not working: Check
SLACK_BOT_TOKENandSLACK_CHANNEL_ID - No project matches: Register projects with
gt project-addfirst - GitHub sync fails: Check
GITHUB_TOKENpermissions (repo scope)
MIT