Finds the actually solvable issues that match your level among thousands of GitHub issues and sends them to Telegram before your morning coffee is ready.
It runs automatically every day at 08:00:
- The Go backend queries the GitHub GraphQL API and collects issues tagged
good first issue/help wanted - It applies repository quality filters (README, license, contributor count, recent activity)
- It sends issues to the Python analyzer service, which uses Gemini for complexity analysis
- It selects the best 5 issues and sends them to Telegram with complexity scores
- It skips issues already seen using records stored in PostgreSQL
GitHub GraphQL API
│
▼
backend/cmd/openscout/main.go
│
├── internal/adapter/github ← issue collection and repo quality filters
├── internal/usecase ← collection, analysis, notification flow
├── internal/adapter/http ← Python analyzer client
├── internal/adapter/notification ← Telegram / email notifications
└── internal/adapter/postgres ← user, preference, and notification records
│
▼
ai/service.py ← Gemini-based issue analysis (JSON output)
│
▼
PostgreSQL ← skip issues seen before
Why these technologies?
- GraphQL: Fetches issues and repository quality data in a single query, while REST would need 3-4 requests
- Gemini: Fast and cost-effective analysis model for a daily workflow
- Go backend: Keeps scheduling, notifications, and data flow in one service
- Python analyzer: Isolates the LLM call and keeps the JSON output simple
- PostgreSQL: Central database for persistent cache and user data
git clone https://github.com/kullaniciadi/openscout.git
cd openscoutpython -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txtcp .env.example .envFill in the .env file:
GITHUB_TOKEN=ghp_xxx # github.com → Settings → Developer Settings → Tokens
GEMINI_API_KEY=xxx # Google AI Studio / Gemini API
TELEGRAM_BOT_TOKEN=xxx # @BotFather → /newbot
TELEGRAM_CHAT_ID=xxx # See step 4
POSTGRES_USER=openscout
POSTGRES_PASSWORD=openscoutpass
POSTGRES_DB=openscout- Find @BotFather on Telegram
- Send
/newbotand give it a name (for example,OpenScout) - Copy the token and add it to
.env - Send any message to the bot
- Find the chat ID:
curl "https://api.telegram.org/bot<TOKEN>/getUpdates" # "chat":{"id": COPY_THIS_NUMBER
- Add the chat ID to
.env
docker compose up --buildThis command starts three services:
openscout- Go backend and HTTP APIanalyzer- Python Gemini analyzer servicedb- PostgreSQL
# Backend health check
curl http://localhost:8080/health
# Analyzer health check
curl http://localhost:8000/healthIf you want, you can also run the services locally one by one:
# Start the backend in its own terminal
cd backend && go run ./cmd/openscout
# Start the analyzer in a separate terminal
cd ai && uvicorn service:app --host 0.0.0.0 --port 8000🔭 OpenScout — 15 January 2025
Today's 5 contribution opportunities:
1. Fix nil pointer in HTTP middleware
📦 gin-gonic/gin ⭐ 77,000
🟢 Complexity: 2/5 ⚡ ~2h
🔧 Go · HTTP
💡 The error message is specific, and a single-file change is enough.
🔗 View issue
────────────────────────────────
2. Add TypeScript types for config
📦 vitejs/vite ⭐ 65,000
...
- Go backend + Python analyzer split
- PostgreSQL cache and user data
- Cron-based daily collection and notification flow
- Web interface (language selection + email subscription)
- Supabase integration
- Email notifications (Resend)
See CONTRIBUTING.md if you want to open an issue or send a PR.
MIT