{"id":"d2eb4380-01f4-42f9-bb5a-cd37444acc93","slug":"openradar","kind":"mcp","name":"openradar","summary":"Open base of job vacancies and freelance orders from every board, RSS and Telegram. Run your own node, share with the hub. No paywalls.","owner":"MikhailSagalaev","repoUrl":"https://github.com/MikhailSagalaev/openradar","license":"AGPL-3.0","licenseTier":"strong-copyleft","trust":"community","stars":4,"match":null,"fewStars":true,"format":"mcp","createdAt":"2026-10-27T07:05:42.000Z","addedAt":"2026-10-29T09:13:50.165Z","logoUrl":"https://avatars.githubusercontent.com/u/101730295?u=4b2f10ad66029e7d2e2e99f90554ce60f5b4cfad&v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["communication","databases"],"tags":["freelance","job-board","lead-generation","open-source","postgresql","rss","self-hosted","telegram"],"runtime":"binary","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-29T09:17:20.812Z","sample":false,"url":"https://conduits.dev/tools/openradar","language":"TypeScript","transports":["stdio"],"install":{},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"# openradar\n\n<p align=\"right\"><b>English</b> · <a href=\"README.ru.md\">Русский</a></p>\n\n<p align=\"center\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"assets/logo-white.png\">\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"assets/logo-black.png\">\n    <img alt=\"openradar\" src=\"assets/logo-black.png\" width=\"360\">\n  </picture>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://openradar.fun\"><img src=\"https://img.shields.io/badge/live-openradar.fun-10b981.svg\" alt=\"Live hub: openradar.fun\"></a>\n  <a href=\"docs/stories.json\"><img src=\"https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2FMikhailSagalaev%2Fopenradar%2Fmain%2Fdocs%2Fstories.json&query=%24.count&label=%F0%9F%8E%89%20found%20work%20through%20openradar&suffix=%20on%20the%20record&color=2ea44f\" alt=\"Stories of work found through openradar\"></a>\n  <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/license-AGPLv3-blue.svg\" alt=\"License: AGPL v3\"></a>\n  <a href=\"docs/PROTOCOL.md\"><img src=\"https://img.shields.io/badge/protocol-radar%2F2-purple.svg\" alt=\"Protocol: radar/2\"></a>\n</p>\n\nopenradar is an open base of job vacancies and freelance orders. Parsers, nodes and people add posts from boards, RSS feeds, Telegram channels and email alerts; the hub merges duplicates and keeps one clean feed.\n\nJob seekers should not have to pay for subscriptions to parsers or for responding to a vacancy. openradar has no paid tier: the contacts are in the post, and you write to the client directly. Anyone can run their own copy.\n\n**Live hub:** [openradar.fun](https://openradar.fun) · **Want to help?** Start with [CONTRIBUTING.md](CONTRIBUTING.md): one board, one adapter, one pull request.\n\n<p align=\"center\">\n  <a href=\"https://openradar.fun\"><img alt=\"The openradar.fun feed\" src=\"docs/screenshots/hub-en.png\" width=\"800\"></a>\n</p>\n\n## What it does\n\n- **One feed of every trade.** FL.ru, Kwork, Freelancehunt, Habr Career, hh.ru, Работа России, We Work Remotely, Jobicy, RemoteOK and Telegram channels (public ones as they are, private ones and chats through your own account): development, design, video, writing, ads, sales and more. A post seen on two boards is one lead.\n- **Search, filters and a rating.** Budget from, skill, remote only, language. The feed opens with the best recent leads first (rating, fading with age); newest or highest budget are one click away. Each lead gets a 0-100 rating from its pay, skills, detail and a direct contact. A vacancy whose pay is far below the usual for its role shows «check the salary» instead of the number.\n- **Browser extension.** Sign in with GitHub once, then add a vacancy or an order from any site in one click; it also shows what similar work usually pays and whether the pay on the page is below, within or above it.\n- **Votes and submissions.** Signed-in users mark leads as useful, junk, scam or closed, and add posts by link.\n- **Market research.** [openradar.fun/research](https://openradar.fun/research): pay in vacancies and order budgets by role, grade, language, city and skill, with medians, quartiles and sample sizes. Monthly reports are frozen so they can be cited; the data is open under CC BY 4.0 (CSV and JSON). How it is counted: [methodology](https://openradar.fun/research/methodology).\n- **RSS for any query**, an HTTP API and an MCP server over the same feed.\n- **Your own node.** Run it at home or on a server, connect your sources, filters and notifications (Telegram, webhook). Nothing leaves the node unless you share a source.\n\n## The network\n\nNodes and parsers can send their posts to the shared hub. Every post is signed with the participant's key. The hub merges the same post seen in different places, credits whoever saw it first, and lowers the weight of junk and scam by the votes and the rating of the participants who reported it.\n\nPeople who send leads see the feed earlier:\n\n| Tier | How | Delay | Contacts |\n| --- | --- | --- | --- |\n| Guest | not signed in | 12 h | hidden |\n| Member | GitHub sign-in, or rating 1+ | 3 h | shown |\n| Active | rating 10+ over 30 days | 30 min | shown |\n| Core | rating 50+, or moderator | none | shown |\n\nRating comes from confirmed leads you saw first (×1.5 for private channels and for a 6-hour exclusive), confirmations and signals that matched the outcome; leads hidden as junk or scam cost points. Details: [docs/PROTOCOL.md](docs/PROTOCOL.md).\n\n## Quick start\n\nNode.js 22.19+ and pnpm 11+:\n\n```bash\ngit clone https://github.com/MikhailSagalaev/openradar.git\ncd openradar\npnpm install\npnpm dev serve\n```\n\n`serve` prints a one-off admin token. Open `http://127.0.0.1:8787`, sign in with it, go to **Источники** → **Каталог площадок** and connect boards one by one or all at once (**Подключить все**): they are polled right away and the first leads appear within seconds.\n\nWithout `DATABASE_URL` the node keeps everything in memory. For a persistent node, use PostgreSQL 17 through Docker:\n\n```bash\npnpm init:env           # writes .env with fresh random secrets\ndocker compose run --rm radar migrate\ndocker compose up -d\n```\n\n`pnpm init:env` never overwrites an existing `.env`. If you copy `.env.example` by hand instead, replace its secrets: `docker compose` refuses to start with the example ones.\n\n## Connecting a parser\n\nAny script (a Telethon reader for private channels, a Playwright scraper, a cron job) can send posts to a node:\n\n```bash\npnpm dev source add --kind webhook --title \"My parser\"   # prints the source id and token\npython my_parser.py | pnpm dev push --source <id>        # NDJSON, one post per line\n# or over HTTP: POST /api/v2/ingest/<id> with the header x-radar-token\n```\n\nOr straight to the hub with the Python SDK (standard library only, Telethon and Pyrogram helpers included):\n\n```bash\npip install \"git+https://github.com/MikhailSagalaev/openradar#subdirectory=sdk/python\"\n```\n\n```python\nimport os\nfrom openradar import HubClient, Key\n\nhub = HubClient(\"https://openradar.fun\", Key.from_string(os.environ[\"RADAR_KEY\"]))\nhub.observe([{\"source\": {\"platform\": \"telegram\", \"channel\": \"-1001234567890\", \"visibility\": \"private\", \"message_id\": \"48213\"},\n              \"text\": \"Ищем React-разработчика...\"}])\n```\n\n`RADAR_KEY` is your participant key (`pnpm dev key`); your rating is bound to it. The TypeScript package exports the same `HubClient` and `NodeClient`.\n\n## Documentation\n\n| Document | Contents |\n| --- | --- |\n| [GETTING_STARTED.md](docs/GETTING_STARTED.md) | Scenarios: reading the hub, running a node, a server, a parser, sharing with the hub |\n| [PROTOCOL.md](docs/PROTOCOL.md) | radar/2: posts, signatures, merging, tiers, rating, moderation |\n| [ARCHITECTURE.md](docs/ARCHITECTURE.md) | The node pipeline, the score, the data model, HTTP routes |\n| [PLUGINS.md](docs/PLUGINS.md) | Writing a source or sink adapter |\n| [EXTENSION.md](docs/EXTENSION.md) | The browser extension and the market estimate |\n| [BACKUP_AND_RESTORE.md](docs/BACKUP_AND_RESTORE.md) | Backups |\n| [JOBSPY_EXPORT.md](docs/JOBSPY_EXPORT.md) | JobSpy-compatible CSV export for pandas pipelines |\n| [LOCAL_LLM.md](docs/LOCAL_LLM.md) | Running the classifier on ollama / LM Studio |\n| [ROADMAP.md](docs/ROADMAP.md) | Directions, epics and the v1.0 criteria |\n| [BRAND.md](docs/BRAND.md) | Logo and naming |\n| [sdk/python](sdk/python/README.md) | Python SDK |\n\n## Contributing\n\nNew boards are the most useful contribution: one adapter, one fixture, one test; `pnpm new:connector` writes the skeleton. See [CONTRIBUTING.md](CONTRIBUTING.md) and the [code of conduct](CODE_OF_CONDUCT.md). Good first issues: the [`good first issue` label](https://github.com/MikhailSagalaev/openradar/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22). Report vulnerabilities privately: [SECURITY.md](SECURITY.md).\n\n⭐ If openradar helped you find work or data, a star helps the next person find it.\n\n## License\n\nAGPL-3.0. See [LICENSE](LICENSE).\n"}