Synaplan
开源 AI 软件平台,面向企业:自托管 AI 代理,符合 GDPR 的聊天机器人小部件,RAG 知识库,WhatsApp 与 Outlook AI,MCP,多模型路由。支持 Docker、Kubernetes 或在 Germ 托管。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
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.
翻译准备中
正在加载完整 README。
查看完整 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.
以上为 README 的开头部分。其余内容请阅读原文。 查看完整 README ↗