Synaplan
开源 AI 软件平台,面向企业:自托管 AI 代理,符合 GDPR 的聊天机器人小部件,RAG 知识库,WhatsApp 与 Outlook AI,MCP,多模型路由。支持 Docker、Kubernetes 或在 Germ 托管。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
A bilingual (Swedish/English) demo web app for EU Navigator — a concept
for a municipal SaaS covering the full external-funding lifecycle:
project idea → matching → fund-specific analysis → application → quality
assurance → decision → delivery → reporting → feedback into future
projects. The core idea: the AI never reasons about "EU grants" in
general — it always works in the context of one specific call and its
documentation.
One main tab per purpose, following the chain *project → application →
grant → reports*:查看完整 README ↗A bilingual (Swedish/English) demo web app for EU Navigator — a concept for a municipal SaaS covering the full external-funding lifecycle: project idea → matching → fund-specific analysis → application → quality assurance → decision → delivery → reporting → feedback into future projects. The core idea: the AI never reasons about "EU grants" in general — it always works in the context of one specific call and its documentation.
One main tab per purpose, following the chain project → application → grant → reports:
/oversikt) — what needs doing now: applications in
progress, reports needing action or coming up, open tasks and unread
notifications, across all projects./projekt, /projekt/[id]) — the organisation's projects
(ideas, needs, planned investments), each with a lifecycle status (idea
→ being scoped → searching for funding → funded → running → completed).
The project page is the hub: the project's path at a glance, its
applications, its grants and their reporting, and matching calls./ansok) — every application across projects by where it
stands (draft, with the funder, decided), plus Hitta finansiering:
calls matched against the portfolio and the calls the user watches. The
application workspace itself is /ansokan./rapportera) — every report on every grant: needing
action (returned or overdue), upcoming, done. A grant
("beviljat stöd", /stod/[id]) is the funding decision on an awarded
application, with its own reporting; a project can have several./datacenter) — the portfolio view for leadership
(economics, projects and applications per status, total awarded) and
the admin/knowledge-hub view of the data the AI works from.lib/notifications.ts.The demo starts with three example applications (lib/data/applications.ts):
the awarded applications behind the two example grants, and one with the
funder. Confirmations (remove, reset, register a grant) are asked in the
page itself (components/ConfirmButton.tsx), never with the browser's
blocking window.confirm.
Old addresses (/demo, /projektbank, /bevakning, grants under
/projekt/ap-…) redirect to the new ones (next.config.mjs).
/eu-databas) — a three-level structure: Programme
(permanent info: purpose, priorities) → Call/utlysning (deadline,
budget, evaluation criteria) → Documents (the actual AI context
package: call text, guide, forms, criteria, budget instructions, FAQ,
reporting instructions, templates — each flagged when it needs an
update).evaluationCriteria (e.g. Relevance 30 / Impact 30 /
Quality 20 / Implementation 20 points) rather than one fixed formula
applied to every call — see the comment on criteriaWeights in
lib/matching/scoreMatch.ts. Beyond thematic fit it checks eligibility
(applicant type from the organisation profile, the call's programme
area), the type of activity the call funds, target group, the requested
grant (not the total budget) against the grant range, partnership reach
in number of countries, and project start against the expected funding
decision. A call the organisation isn't eligible for is capped at a low
score however well it fits thematically./ansokan) — once a call is chosen, the AI is
locked to that call's evaluation criteria. The assessment (application
readiness, "Application Coach" on Relevance/Impact/Evidence, reviewer
notes) reads the application's own text — the project description plus
every section the user has written or edited, not untouched AI
suggestions — and is recomputed as the user types, showing the change
since the application was opened, what each section contributes, and
which section each remaining action belongs in. The project page shows
the same readiness measure for the project against its best match.
Includes a dual-compliance check against the organisation's own
internal process (Organisationens regelverk).lib/data/callTemplates.ts) — a call
in data/utlysningar.csv names the form it uses in the Ansökningsmall
column (today Horizon Europe RIA/IA Part B and ESF+ Projektrummet+). The
Ansökningsstudio then shows the form's numbered sections with the
funder's instructions, the criterion each is assessed under, character
counts and an estimated page count against the page limit, and the
form's tables (e.g. Part B's 3.1a–h). Export follows how the funder takes
the application in: the funder's own Word template filled in under its
headings and in its tables (lib/export/fillDocx.ts) — Part B V5.1 is
kept in public/mallar/ (the portal's .rtf saved as .docx), and the user
can upload another version — a Word document laid out as the template
when there is no file, or a field-by-field document to paste into a web
form. A call using a form also takes its evaluation criteria. The
column names the report form a grant's reports follow
(: Horizon Europe's periodic report Part B,
ESF+'s reports in Projektrummet+): its numbered sections with what the
application promised beside them, its tables (work packages taken from
the application) and the costs per the funder's cost categories
(, flat rates calculated), exported the same
way. The application states its budget per the same categories and
exports it as an Excel workbook with formulas ().
() adds a form from the
funder's Word template — headings, instructions, tables and page limits
read as a proposal (), reviewed, saved in
the browser — and chooses per call which form its application and
reports follow.The homepage's three entry points route into this same system depending
on where the user is in the chain: "Jag har ett projekt" → /ansokan,
"Jag har hittat en utlysning" → /eu-databas, "Jag har fått
finansiering" → /rapportera.
lib/data/fundedProjects.ts (74 of a real
municipality's actual awarded EU projects, 2014-2027, extracted from its
own "Projekt med beviljade medel" documentation — organisation names,
contact emails and source links replaced with a fictional "Exempelstad"
so the source municipality isn't identifiable), and lib/data/fundingPrograms.ts
(the real EU funds/programmes that municipality tracks and has been
awarded from).lib/data/projectBank.ts (a municipality's own
in-progress project ideas — inherently invented for a demo, since real
ones are usually confidential), lib/data/grants.ts (the
commitments-vs-actuals reporting example), and the specific open
FundingCall deadlines/criteria in lib/data/fundingCalls.ts (real
calls change constantly; wiring this to the live EU Funding & Tenders
Portal API is the natural next step there).The system is locked behind a simple login on the start page: e-mail plus
one shared demo password, checked on the server (app/api/login). A
signed, httpOnly session cookie (8 hours, or 30 days with "Kom ihåg mig")
is required on every page except the start page (middleware.ts); a
logged-in visitor to the start page goes straight to Översikt, and after
logging in the user lands on the page they were trying to open. It is only
a lock: it doesn't tell users apart ("mina projekt" still follows the
example user), and the data still lives in each browser.
Set DEMO_PASSWORD in the hosting environment (Vercel → Project →
Settings → Environment Variables). Without it, login is refused in
production with a message saying so; the dev server and the tests use
demo. Changing the password logs everyone out.
No backend, no database — everything runs client-side. The
matching, gap analysis, readiness score and Application Coach are all
transparent, deterministic functions (lib/matching/) rather than live
LLM calls, so the demo is fast, free to run, and always reproducible.
Swap in real Claude API calls — scoped to a specific call's actual
documents — later without changing the UI.
Next.js 14 (App Router) + TypeScript + Tailwind CSS.
npm install
npm run dev
Then open http://localhost:3000.
npm run typecheck # tsc --noEmit
npm run lint # next lint
npm run test:unit # matching/scoring/CSV-import logic, no browser needed
npm run test:e2e # Playwright, drives the real app in Chromium
npm test # both test projects together
npm run test:e2e needs Chromium installed once via npx playwright install chromium (or --with-deps chromium on a fresh Linux machine/CI
runner). The GitHub Actions workflow in .github/workflows/ci.yml runs all
of the above — lint, typecheck, build, unit tests, then e2e tests — on every
push and pull request.
The fastest path to a public URL is Vercel (built by the makers of Next.js, free tier is enough for a demo):
DEMO_PASSWORD (the shared login
password — see Login above).https://eu-navigator-xxxx.vercel.app.
Paste that URL into APV App.Every subsequent push to this branch (or your default branch, once merged) will automatically redeploy the same URL.
Same idea — "Import from Git", framework preset "Next.js", default build
command (npm run build) and publish directory are auto-detected.
npm audit flags a couple of Next.js/PostCSS advisories that are only
fully resolved in Next 16, which would require a larger migration. Since
this app has no authentication, no server actions, and no user data, the
practical exposure is low for a demo — but worth revisiting before this
becomes anything more than a pitch/demo site.
app/ Routes: /, /oversikt, /projekt(+[id]), /ansok,
/ansokan (workspace), /rapportera, /stod/[id],
/eu-databas(+[programId]+[callId]),
/referensprojekt, /datacenter, /installningar
components/ UI components (landing sections, demo flow,
shared header/footer/status badge)
lib/i18n/ Swedish/English translation dictionary + language context
lib/types.ts Shared data model (Programme/Call/Document,
ProjectBankEntry, ApplicationRecord, Grant,
FundedProject, matching types)
lib/data/ Seed data — real programmes (22) and awarded
reference projects (74), plus illustrative
calls/documents, project bank and
grant reporting example
lib/matching/ Scoring engine, gap analysis, readiness score,
application coach, workspace content generator
tests/unit/ Logic-only tests (no browser) for the matching/
readiness/CSV-import engines
tests/e2e/ Playwright tests driving the real app
lib/data/reportTemplates.tslib/data/costCategories.tslib/export/exportBudget.ts/datacenter/mallarlib/export/templateOutline.ts/referensprojekt) —
real data: an anonymised municipality's actual register of 74
EU-funded projects 2014-2027 (fund, budget, EU share, role, theme), with aggregated
statistics (share led as project owner, average budget, most common
theme), reachable standalone or from any call page./stod/[id]) — grants, where
commitments made in the application (indicators, targets) are tracked
against reported outturn, with an AI comment on any deviation./datacenter) — the admin/knowledge-hub view: exactly
what data the AI has access to (project ideas, programmes, calls, open
calls, reference projects, documents) and what needs attention
(documents needing an update, projects with incomplete information)./datacenter/ledningsrapport) — one printable page
for leadership: the own portfolio (applications, success rate, grants,
reporting, co-financing) and EU grants per inhabitant against the demo
municipality's comparison group (<profile>-peers.json, population in
lib/data/population.ts)./datacenter/medfinansiering) — own co-financing
per year for grants and applications with the funder, how much is paid
out before the grant arrives (advance and payment lag adjustable), the
currency risk on grants paid in euro, and a Word decision brief per
project (lib/matching/cofinancing.ts)./partnersok) — the organisations in the imported
projects, searched by subject, programme, theme, period, type and
country (/api/partnersok).lib/data/auditChecklist.ts).