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
Upload franchise applications and get a recommendation, reason, franchisee readiness score and next steps for every partner.
BusinessJavaScript · CSSGitHub @Abhi908-YOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Upload the case's Excel file (Applications + Territories, with the fixed Existing stores sheet). Every applicant gets a recommendation (Recommended, Waitlist, On hold or Rejected), the reason, next steps, a training plan and an email draft. A chat panel answers "why" questions and takes new facts ("APP-012 has now found a ground-floor space"), then re-runs the whole batch and reports every knock-on change.
No login. The file is read in the browser.
npm install
cp .env.example .env.local # add OPENROUTER_API_KEY (or GEMINI_API_KEY)
npm run dev # http://localhost:3000
The app works without a key too: the chat falls back to built-in handling of simple questions and updates.
OPENROUTER_API_KEY (and optionally OPENROUTER_MODEL, default google/gemini-3.7-flash). Or use a Google AI Studio key: GEMINI_API_KEY and GEMINI_MODEL. If both keys are set, OpenRouter is used.If the model ever returns errors (for example, a retired model name), set OPENROUTER_MODEL (or GEMINI_MODEL) to a current Flash model and redeploy. The dashboard keeps working either way.
Code decides; Gemini only explains and turns chat messages into data updates. Same input, same output, every time.
Minimum investment: Tier 1 ₹30 lakh, Tier 2 ₹22 lakh, Tier 3 ₹18 lakh. All thresholds are editable under "Brand rules" in the app.
public/sample-applications.xlsx is built on the real template and plants the traps judges are likely to use:
| Applicant | Trap | Expected |
|---|---|---|
| APP-005 | Pin 570009 already has ST-06 | Rejected |
| APP-016 | Pin outside every territory | Rejected |
| APP-009 | ₹18 lakh in Tier 1 | Rejected |
| APP-008 | ₹26 lakh in Tier 1 (small shortfall) | On hold |
| APP-007 | No space yet, 2-month launch | On hold |
| APP-012 | Upper floor | On hold → Recommended after "found a ground-floor space", which pushes APP-013 off pin 572101 |
| APP-015 | City Mangaluru, pin from Mysuru | On hold |
| APP-017 | "Not yet identified" but gives size and floor | On hold |
| APP-018 | Investment blank | On hold |
| APP-019 | Form says Ground, notes say second floor | On hold |
| APP-020 | 260 sq ft | On hold |
| APP-004, APP-010 | Lose slots to higher scorers | Waitlist |
| APP-014 | Score below a Low-priority territory's bar | Waitlist |
npm run check # 48 checks against the sample file
docs/: the original case PDF and template, plus HANDOFF.md
scripts/check-sample.mjs: the self-check
lib/parse.js: reads the template (skips the grey example rows, keeps pin codes as text)
lib/engine.js: rules, scoring, allocation, before/after comparison
lib/plan.js: next steps, training plans, email drafts
lib/snapshot.js, app/api/chat/route.js: what Gemini sees, and the server call (key never reaches the browser)
lib/chatLocal.js: chat fallback without Gemini
app/page.js, app/components/*: the dashboard