Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
Discover the companies behind relevant experience. Find the people worth looking at. Understand why they fit.
Translation pending
BusinessTypeScript · CSSGitHub @taniyasouza1OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Because lightweight talent won’t cut it.
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗Hand it a hiring brief. Get back the few people worth a call, each with the exact profile text that put them there, plus the strong candidates your usual search would never have looked at.
The job: technical sourcing. Turning a hiring brief into a short, justified list of people to contact.
Who does it today: in-house recruiters and sourcers, agency recruiters, freelance sourcers, and hiring managers who source for themselves.
Who pays: the employer, either through a talent team's salary budget or through an agency that is paid when someone is hired.
Where they slip:
Heavy Brains attacks all three: it searches wider, reads profiles for meaning, and refuses to rank anyone on something it can't quote.
One brief goes in. About a minute later you get a ranked list. The run is automatic from the moment you press Find people:
| People outside your usual companies | The quote behind every score |
|---|---|
Where a person still has to step in
| Kind | What it measures |
|---|---|
| Relevance (0 to 100) | How much of your brief the profile proves, weighted by must/nice/context and importance. Role descriptions count most, skills lists least. |
| Career signals (own 0 to 100) | Startup veteran (years at pre-seed or seed-stage teams with 15 or fewer engineers), joined companies while young, rehired by the same company, fast promotion, lean-team employers, repeat contract hires, competitor experience, open-source impact (stars × merged PRs per repo, from GitHub). |
| Optional | An AI review of the quality of what someone posts on LinkedIn, run on request because it costs credits. |
Signals that can't be checked are left out of the score, not counted as zero. The landing page explains each one.
Paste this into the box on the landing page:
We need a founding backend engineer in Bengaluru who has shipped payments systems at a startup. Find me five people worth a call this week, and tell me why each one fits.
On our last live run this took about a minute and about 150 Crustdata credits. Repeating it within 24 hours is served from a cache and costs nothing.
No keys? Choose DEMO DATA in the header. It runs the whole product on a fictional dataset (every screenshot here is from it).
Plain TypeScript runs the agents in order and in parallel. No agent chooses its own next step. Full diagrams are in docs/ARCHITECTURE.md.
| Part | Detail |
|---|---|
| Agents | Brief Analyst, Search Strategist, Evidence Reviewers (parallel, 5 profiles per call), Briefing Writer, Outreach Writer, Content Reviewer. Model: claude-opus-5-5 by default. |
| Scoring | Not a model. A deterministic engine in the browser, so changing a criterion re-ranks instantly. |
| Guards | Any quote must appear verbatim in the profile or it is discarded. Briefing and message drafts are checked the same way. A years-of-experience range in the brief is sent to the search as a filter and re-checked on every result; people outside it are hidden by default. |
| State | Projects live in the browser's localStorage. The server keeps only a 24-hour result cache, on disk locally and in the temp dir on Vercel, where it lasts only while a function instance stays warm. |
| Stack | Next.js 16, TypeScript, Tailwind 4, Motion, three.js. |
| Endpoint | Used for | Cost |
|---|---|---|
/person/search | The candidate pool, several queries per search | 0.03 credits per profile, plus field groups |
/company/search | Employer profiles, founding year, size | 0.03 per company |
/person/enrich | Top 10: full dated career, education, summary, matched GitHub account | about 1 to 2 per person |
/company/enrich | Their employers: funding stage, engineers on the team | about 2 per company |
/social_post/search | Optional post-quality review, one person at a time | 0.5 per post |
Not used: Job Search, Watcher, Web Search, the MCP server. Details and limits we found are in docs/crustdata-integration.md.
npm install
cp .env.example .env # fill in the keys you have; all are optional
npm run dev # http://localhost:3000
Key in .env | Turns on | Without it |
|---|---|---|
CRUSTDATA_API_KEY | Live people search, enrichment, post review | Demo mode (fictional data) |
ANTHROPIC_API_KEY | The agents and message drafts | Keyword rules only |
GITHUB_TOKEN | Open-source signal. A token with no scopes is enough. | That signal stays unchecked |
The header always shows LIVE or DEMO, and AI AGENTS ON or OFF. Nothing switches silently.
npm test # 133 tests
npm run build
| Checked | Result |
|---|---|
| Full live search, AI on, enrichment on | about 60 seconds, about 152 credits, 5 picks with quotes |
| Same search again | 0.0 seconds, 0 credits (cache hit) |
| Post-quality review | Run on 5 real candidates: 1 judged, 4 had too few posts and were skipped at no cost |
| GitHub open-source signal | 7 of the top 10 had a matched account; activity fetched for all 7 |
| Outreach draft | Run on a real candidate: opens with their work, quote checked |
| Not measured | Ranking accuracy against known hires. We have no benchmark and don't claim a hit rate. |
| Not connected | Pay estimates (no salary source), patents, citations, products with users, closed companies |
| Approach | What worked | What didn't |
|---|---|---|
| Keyword rules only | Fast, free, explainable. Still the no-key fallback. | Knew about 14 software terms. Couldn't read a real job posting. |
| LLM scores every profile | Would read profiles well. | Never built. Scores can't be audited, and a model will invent a flattering quote. |
| LLM finds evidence, a formula scores it (what we built) | Every point traces to a quote. Live: 34 quoted findings on one search, anything unquoted dropped. | The quote check first rejected valid quotes over a full stop vs a comma (3 of 5 picks lost). Fixed without loosening the wording match. |
| GitHub activity formulas | Stars × merged PRs per repo works and is live. | One PR into a 56,000-star beginners' practice repo scored near the top, and self-merged PRs inflated scores. We ignore practice repos and cap self-merged PRs. A single PR into a huge project still scores well. |
| Supabase as a data store for GitHub data | – | Hit an error we couldn't get past in time. We call GitHub and Crustdata directly instead. |
| Salary from salary portals | – | Ranges for the same person were far apart across sources. Nothing trustworthy, so salary is not in the ranking. |
| "Startup veteran" metric | Funding stage and engineer count from Company Enrich make it measurable. | Wrong three times on real data: it added up overlapping roles, counted one-person shells, then excluded real startups that LinkedIn labels "Self-Employed". |
| A fix that broke the briefing | – | Telling the model "never write internal ids" left each pick's id field empty, so all five picks vanished. Tests passed because the fake model always sent valid ids. A live run caught it. |
| Autonomous recruiter that also sends | – | Left out: sending needs consent and double-send protection. |
| Left out | Why not now |
|---|---|
| Sending messages | Needs consent handling and a guarantee nobody is contacted twice. Drafting exists. |
| A ranking benchmark on known hires | The as-of replay (judge people using only what was knowable on a date) is the groundwork. We haven't built or run the benchmark. |
| Job Search and Watcher | A standing search that alerts you when a shortlisted person moves is the natural next step. |
| Headcount over time | Company Enrich returns a time series we haven't used. It would fix "team size today, not then". |
| Patents, citations, products with users | Need a data source we don't have. Scoring logic and tests exist. |
| Accounts and a database | State is per-browser. Fine for one recruiter, not for a team. |
Sourcing becomes continuous instead of a project. An agent keeps a standing brief, notices when someone becomes a fit, writes to them, and hands a person a complete file. The recruiter's job shifts from searching to judgement: who to trust and how to win them. The rule that makes that safe stays the same: no claim without a quote a person can check.
3D models are from Sketchfab under CC BY and credited on the pages. More: docs/ARCHITECTURE.md · docs/BUILD-NOTES.md · docs/crustdata-integration.md