Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗The envolv.org marketing site — English at /, Spanish at /es, light or dark to
match the visitor's system setting. One landing page + a live-demo page + three
comparison pages (/compare/…) + the privacy policy + demo-request capture.
This is Workstream B of the Envolv roadmap (ROADMAP.md in the medvolunteer
repo). It is deliberately a separate repo — see DECISIONS.md.
npm install
npm run dev # http://localhost:3100
npm run build
npm run lint
Port 3100, not Next's default 3000 — 3000 is taken by another project on Sean's machine, and Next silently bumping itself to 3001 is a confusing way to find that out. Vercel ignores the flag and assigns its own port, so this only affects local dev.
Copy .env.example → .env.local. Set the same vars on the Vercel project.
| Var | Required | Purpose |
|---|---|---|
RESEND_API_KEY | yes | Sends the demo-request notification. Missing → the form returns a visible error rather than silently dropping the lead. |
RESEND_FROM_EMAIL | yes | Must be on a Resend-verified domain. envolv.org was verified 2026-08-26, so use [email protected]. |
DEMO_NOTIFY_EMAILS | yes | Comma-separated. Every demo request goes to all of them. Adding a founder = an env var edit, no code change. |
NOTION_TOKEN | recommended | Secret of the "envolv-www leads" Notion integration. Saves each demo request as a row in Website Leads. Missing → leads are email-only. |
NOTION_LEADS_DATA_SOURCE_ID | recommended | Data source id of the Website Leads database (c38d2ca0-…, see Vercel). |
RESEND_WEBHOOK_SECRET | for support@ | Signing secret of the Resend webhook that calls /api/inbound (Resend → Webhooks → the inbox.email.received one, whsec_…). |
RESEND_INBOX_API_KEY | for support@ | A full-access Resend key — reading a received message needs it. Separate from RESEND_API_KEY, which stays sending-only. |
SUPPORT_FORWARD_TO | no | Comma-separated; who gets support@ mail. Defaults to DEMO_NOTIFY_EMAILS. |
NEXT_PUBLIC_DEMO_URL | no | Base URL of the demo app that /demo sends visitors into. Defaults to https://envolv-demo.vercel.app. |
⚠️
NEXT_PUBLIC_DEMO_URLis the onlyNEXT_PUBLIC_*var here, and that is on purpose. In themedvolunteerrepo, build-time inlining ofNEXT_PUBLIC_*caused a production login outage — vars were saved to Vercel ~10h after the last build, so the deployed bundle never got them. Everything on this site that matters (Resend key, recipients) is read on the server at request time and never baked into the browser bundle. Keep it that way.That does not mean changes are instant: Vercel applies an env-var change only to deployments created after it. Change a var → Redeploy (Deployments → ⋯ → Redeploy), or the live site keeps the old value.
This repo is public (
envolvapp/envolv-www). Real addresses and keys live only in the Vercel project — never in.env.exampleor anywhere else here.
All copy that makes a claim — pricing, competitor figures, vertical list — lives
in lib/content.ts (and, for the comparison pages, lib/compare.ts), not scattered
through JSX. Pricing and positioning follow the founders' action plan of 2026-10-31:
one plan, priced in bands by active volunteers (anyone with a completed shift,
clock-in or logged hour in the past 12 months), unlimited admins on every paid band,
no feature gates, clinics as the lead audience. Competitor figures carry their
sources and the date they were checked (AS_OF, SOURCES). Change the decision,
change content.ts.
The site lists only what ships today (2026-10-30 — this replaced the "Soon"
badges). A roadmap feature is not on the site at all until it's live in the app;
when it lands, add it to PAID_FEATURES in content.ts (every paid band gets it).
The header comment of content.ts lists what was checked against the app and when.
Comparison pages (/compare/volgistics-alternative-for-clinics,
/compare/get-connected-alternative, /compare/envolv-vs-civic-champs, and the same
under /es) are one component, components/ComparePage.tsx, fed by lib/compare.ts.
Their price rows are computed from BANDS / PRICE_POINTS, so they can't drift from
the pricing section. Named competitors appear only in these dated, sourced
comparisons and the home page's comparison table (DECISIONS 2026-10-31). Re-check
every competitor figure, and bump AS_OF, whenever you touch them.
Both languages live in the same file. Every visible claim in content.ts is an
{ en, es } pair, and the interface copy (headings, buttons, form labels) is in
lib/copy.ts. Change a sentence in one language, change it in the other. Prices,
limits and seat counts are plain numbers, so they can't drift between languages.
The Spanish uses "tú", like the Envolv apps, and still needs a native speaker's read
(ROADMAP B6).
以上為 README 的開頭部分。其餘內容請閱讀原文。 檢視完整 README ↗