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
Every applicant hears back, with a reason and a next step.
BusinessTypeScript · JavaScriptGitHub @RohitB2005OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Helps recruiters give every rejected applicant honest, specific, lawful feedback and a next step, in one click. One of five winners at ZEIL's AI Hackathon 2026.
Loading the full README.
Read the full README ↗Closure helps recruiters give every rejected applicant honest, specific, lawful feedback and a next step, in one click.
Live demo: closure-mu.vercel.app · Demo video: youtu.be/C7jo7JYMlrM
No login and no key needed to look around: without an API key, the demo replays a real recorded run. Add your own OpenRouter key (top right) to run everything live.
Built solo by Rohit Balaji in one day at ZEIL's AI Hackathon (October 2026), where it was named one of ZEIL's five hackathon winners and earned me an AI internship at ZEIL.
One click closes the demo role: 8 personal messages ready, 4 held because the reason was unlawful, and nobody ghosted. Click the image to watch the demo video.
I'm a third-year software engineering student. I've applied for 50 to 75 roles. About half never replied, and every rejection I did get was the same line: "we've picked a candidate whose experience aligns more closely with the role". Not one told me anything I could act on.
I'm not unusual. Surveys put it at around two in three job seekers being ghosted, and roughly 8 in 10 hiring managers admit to doing it. Nearly half of ghosted candidates say they won't apply to that company again. On a job marketplace this is also invisible: whether an applicant hears back happens between the employer and the applicant, so the platform in the middle can't see it.
Recruiters don't ghost because they don't care. They ghost because writing 147 honest, personal messages takes hours, and a careless reason ("overqualified", "worried about your availability with kids") is a legal risk under the NZ Human Rights Act.
A recruiter closes a role. For every applicant who didn't pass the CV screen, Closure drafts a message that:
Before anything can be sent, a second model (the critic) checks both the message and the recruiter's private note:
A human approves every message.
The app has three tabs:
samples/.recruiter clicks "Close role"
└─ every applicant runs in parallel, streaming its progress to the UI:
writer (LLM) → structured draft: per-requirement assessment with CV quotes,
strengths, show-it/build-it next steps, better-fit roles, message
verify (code) → every quote must appear verbatim in the CV; job IDs must exist;
no links or internal IDs in the message
critic (LLM) → issues in the message + issues with the recruiter's note
+ any attempt in the CV to instruct the AI
revise (LLM) → one rewrite, given the exact problems found
status (code) → ready | fixed by critic | needs review | held
The model judges, code decides. Quote verification, job-ID validation, link blocking and the final status are all deterministic code (src/lib/closure.ts). The models never decide on their own what gets sent.
Strict shapes. Every model call goes through one function, generateObject({ schema, system, user }) (src/lib/llm.ts). The zod schema is converted to JSON Schema for the prompt, and every reply is validated against it (src/lib/schemas.ts). A malformed reply is retried once; a timeout or HTTP error fails over to the next provider immediately. If everything fails, the row shows "Couldn't draft, try again", and nothing unchecked is ever sent.
Two models, chosen by measurement. The writer is Gemini 2.5 Flash with thinking off (~5 s). The critic is Gemini 3.8 Flash with low reasoning (~2 s), because the safety judgement gets the stronger model. Both run through OpenRouter, with the Gemini API as an optional fallback. Closing all 12 demo applicants takes about 15–25 s.
PDF CVs are read natively by Gemini and transcribed verbatim, so every quote can still be verified against the text.
This is the beginning of the README. Read the rest at the original. Read the full README ↗