Note
This project is archived. OpenLib has shifted its focus toward showcasing high-quality, verified applications — curated by the community and admins, not automated bots. Going forward, only community-submitted and admin-approved apps will be listed on OpenLib. As a result, this crawler is no longer in active use or development.
The repository is preserved here for reference and for anyone who may find the architecture or approach useful for their own projects.
Production-ready GitHub crawler and AI-powered enrichment system built for discovering, analyzing, moderating, and syncing open-source applications into OpenLib.
Designed specifically for low-resource systems like MX Linux laptops, the crawler uses Node.js, SQLite, and local Ollama AI models to process repositories efficiently with minimal RAM and CPU usage.
- GitHub repository discovery and crawling
- AI-powered metadata enrichment using local LLMs
- README parsing and screenshot extraction
- Quality scoring and duplicate detection
- Moderation workflow before publishing
- Sync engine for pushing approved apps to OpenLib
- SQLite-based lightweight architecture
- Restartable worker-based processing
- Optimized for low-end hardware
- PM2 and cron support for automation
- Browser GUI for live operations, data files, logs, queues, and moderation
GitHub API
↓
Crawler Workers
↓
Repository Filters
↓
README + Metadata Parser
↓
Screenshot Extractor
↓
Local AI Enrichment
↓
Duplicate Detection
↓
Quality Scoring
↓
Moderation Queue
↓
Sync Queue
↓
OpenLib API
The crawler database acts as the source of truth. OpenLib data is updated only through authenticated sync workers.
- Node.js
- SQLite
- Ollama
- PM2
- GitHub REST API
- Browser GUI served by the Node.js control server
openlib-crawler/
├── docs/
├── bin/
├── logs/
├── scripts/
├── src/
│ ├── gui/
│ ├── services/
│ ├── workers/
│ ├── config.js
│ ├── db.js
│ └── server.js
├── data/
├── crawler.js
├── updater.js
├── sync.js
├── ai.js
└── ecosystem.config.js
| File / Folder | Purpose |
|---|---|
src/config.js |
Loads environment configuration |
src/db.js |
Initializes SQLite database and WAL mode |
src/gui/public/ |
Browser GUI assets |
src/services/ |
Core services for crawling, AI, parsing, scoring, syncing |
src/workers/ |
One-shot worker jobs |
src/server.js |
Browser GUI, moderation API, job controls, data API |
docs/schema.sql |
Reference database schema |
ecosystem.config.js |
PM2 process configuration |
bin/openlib-control-panel |
Launches the local GUI server |
The operator UX is now a browser GUI served by src/server.js. It provides dashboard metrics, worker controls, queue views, SQLite statistics, Ollama monitoring, GitHub API usage, system telemetry, log streaming, scheduler controls, repository moderation, data file downloads, app export, and .env editing.
npm run controlThen open:
http://127.0.0.1:3020The GUI reads the existing openlib.db, .env, data/, and logs/ assets, so crawler data does not need migration. If MODERATION_API_KEY is set, enter it in the GUI API key field.
- Node.js 18+
- npm
- Git
- Ollama (optional but recommended)
git clone https://github.com/AHS-Mobile-Labs/openlib-crawler.git && \
cd openlib-crawler && \
cp .env.example .env && \
npm install && \
npm run setupnpm run smokeInstall Ollama and pull a lightweight model:
ollama pull tinyllamaAlternative lightweight models:
ollama pull qwen2.5:0.5b
ollama pull phiRecommended settings for low-end systems:
CRAWLER_CONCURRENCY=2
AI_CONCURRENCY=1
TARGET_APPS_PER_RUN=50npm run crawl -- --limit 50npm run updatenpm run ainpm run screenshotsnpm run syncnpm run controlRun all jobs automatically:
npm run schedulerInstall PM2:
npm install -g pm2Start workers:
pm2 start ecosystem.config.jsSave configuration:
pm2 save
pm2 startupExample cron configuration:
0 */6 * * * cd /home/Linox/openlib-crawler && /usr/bin/npm run crawl -- --limit 50
20 2 * * * cd /home/Linox/openlib-crawler && /usr/bin/npm run update
40 1 * * * cd /home/Linox/openlib-crawler && /usr/bin/npm run ai
10 3 * * 0 cd /home/Linox/openlib-crawler && /usr/bin/npm run screenshots
*/30 * * * * cd /home/Linox/openlib-crawler && /usr/bin/npm run synccurl -H "X-API-Key: $MODERATION_API_KEY" \
"http://127.0.0.1:3020/api/apps?status=pending&limit=20"curl -X PUT \
-H "X-API-Key: $MODERATION_API_KEY" \
-H "Content-Type: application/json" \
-d '{"category":"Developer Tools","tags":["git","developer-tools"]}' \
"http://127.0.0.1:3020/api/apps/1"curl -X POST \
-H "X-API-Key: $MODERATION_API_KEY" \
"http://127.0.0.1:3020/api/apps/1/approve"curl -X POST \
-H "X-API-Key: $MODERATION_API_KEY" \
-H "Content-Type: application/json" \
-d '{"reason":"not a user-facing app"}' \
"http://127.0.0.1:3020/api/apps/1/reject"Repositories are rejected before expensive processing if they are:
- Forks
- Archived
- Disabled
- Unlicensed
- Inactive
- Below minimum star threshold
- Missing useful descriptions
Quality scoring considers:
- Stars
- Activity
- Releases
- Screenshots
- Website availability
- Organization verification
- License quality
- README quality
- Documentation
- Topic richness
Only repositories above the configured quality threshold enter moderation.
OpenLib Crawler uses local Ollama models only.
If Ollama is unavailable, the system falls back to deterministic enrichment logic.
Supported lightweight models:
- tinyllama
- qwen2.5:0.5b
- phi
- lightweight Mistral variants
Start local Ollama:
npm run ollama:startPull models:
npm run ollama:pullCheck status:
curl http://127.0.0.1:11434/api/tagsRun AI test:
npm run ai -- --limit 1Stop Ollama:
npm run ollama:stop| Resource | Location |
|---|---|
| SQLite Database | openlib.db |
| Main Logs | logs/openlib-crawler.log |
| PM2 Logs | logs/pm2-*.log |
| Screenshot Cache | data/cache/screenshots |
| Ollama Models | data/ollama-models |
SQLite runs in WAL mode for better reliability during concurrent workers.
OpenLib Crawler aims to:
- Build a scalable open-source app discovery engine
- Reduce manual app submission work
- Improve metadata quality using local AI
- Support privacy-friendly self-hosted infrastructure
- Run efficiently on low-end hardware
MIT License
Discover open-source alternatives and apps on:
