Synaplan
开源 AI 软件平台,面向企业:自托管 AI 代理,符合 GDPR 的聊天机器人小部件,RAG 知识库,WhatsApp 与 Outlook AI,MCP,多模型路由。支持 Docker、Kubernetes 或在 Germ 托管。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证budifyglobal
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗B2B marketing and lead-gen site for Budify (software only). It never sells, promotes or facilitates the sale of cannabis. Next.js 15 (App Router) · TypeScript · Tailwind · next-intl · static generation for every locale (22 locales, 10 markets).
Status: DRAFT. All legal text, compliance values and translations must be reviewed by qualified local counsel / native reviewers before launch. See
docs/COMPLIANCE-ASSUMPTIONS.md.
npm install
cp .env.example .env.local
npm run dev # http://localhost:3000 (redirects to your negotiated locale)
npm run check # compliance + i18n + content-lint gates
npm run build && npm start
npm run build runs check and writes public/compliance-audit.json (config version + hash per deployment).
| Concern | Where |
|---|---|
| Rules per market (min age, consent model, links, footer text, legal pages, positioning, currency, data region) | compliance.config.json (schema: docs/compliance.schema.json) |
Routing /{lang}-{COUNTRY}/…, geo/lang negotiation, localized slugs, 308 canonicalisation | src/middleware.ts, src/i18n/*, src/i18n/slugs.json |
| Messages (fallback locale → language → en) | messages/*.json, messages/overrides/*.json, src/i18n/messages.ts |
| Age/role gate | src/components/compliance/AgeGate.tsx, public/gate-init.js |
| Consent banner, log, withdrawal, GPC/DNT, Consent Mode | src/components/compliance/*, src/lib/consent/*, /api/consent, /api/geo |
| Legal templates per jurisdiction | src/lib/legal/templates.ts, /[locale]/legal/[page] |
| Forms (honeypot, timing, optional Turnstile, rate limit, region-routed webhook, double opt-in) | src/app/api/*, src/lib/* |
| Build gates | scripts/check-compliance.mjs, check-i18n.mjs, content-lint.mjs, audit-log.mjs |
| Security headers / noindex switch | next.config.ts, vercel.json |
Language switcher / region selector (header + footer + /regions) stores the choice in bud_locale; once chosen, the site never auto-redirects again. Geography never blocks access.
compliance.config.json (copy the closest one; fill every field incl. openQuestions).languages if new; add src/i18n/slugs.json entries (optional).content/pricing.json currency, content/entities.json entity/representative placeholders, and sub-processor regions if needed.src/lib/legal/templates.ts (marked Draft).npm run check (validates invariants: footer text, privacy link, banned claims, min age, consent model, legal pages).npm run assumptions and send docs/COMPLIANCE-ASSUMPTIONS.md to local counsel.compliance.config.json → languages (name, dir ltr|rtl, font subset) and to scripts/i18n.config.json (full or core).messages/<lang>.json (copy en.json; core languages need only the namespaces listed in coreNamespaces). Keep _meta stating translation status.languages. Add a font subset in src/app/layout.tsx if the script needs one.dir: "rtl"; layout uses logical properties but needs a visual QA pass.node scripts/gen-overrides.mjs pattern → messages/overrides/<lang>-<CC>.json (only differing keys).npm run check – fails on missing keys / placeholder mismatches in full languages.Edit compliance.config.json, bump version; bump consentVersion if consent categories, purposes or vendors changed (forces re-consent). Run npm run check; the audit log records the new version on the next build. Never loosen bannedClaims without counsel sign-off.
See .env.example: NEXT_PUBLIC_SITE_URL, ALLOW_INDEXING, STRICT_LAUNCH, analytics IDs (optional), Turnstile keys, LEAD_WEBHOOK_URL_<REGION>, CONSENT_LOG_WEBHOOK_URL, NEWSLETTER_SECRET, RESEND_API_KEY, EMAIL_FROM.
vercel.json) and route lead/consent data to the regional webhook that matches dataRegion.ALLOW_INDEXING=0 on previews./api/* (the built-in limiter is per-instance memory).docs/COMPLIANCE-ASSUMPTIONS.md).[TO BE COMPLETED] in content/entities.json; run with STRICT_LAUNCH=1.content/subprocessors.json) matches reality; wire DPA signing.docs/ACCESSIBILITY.md); publish accessibility statement where required.ALLOW_INDEXING=1.visuals)Each market in compliance.config.json has visuals: "sa" (default – the photographic, cannabis-themed look copied from budify.co.za: tabbed feature photos, lounge photo, member-app screens) or "neutral" (abstract, text-only illustrations). The sa photos are AI-generated images hotlinked from readdy.ai (see content/sa-visuals.json). Self-host them (avoids third-party requests before consent): run npm run fetch-images on a machine with normal internet access, commit public/sa/, redeploy. Counsel must approve cannabis-themed imagery per market (global.cannabisImageryApproval; STRICT_LAUNCH=1 fails until it is filled in). New sa.* strings are English-only until translated (other languages fall back to English).
content-lint)No product/consumption imagery, strain or price listings, health claims, or youth-appealing content. Image tags come from content/images.manifest.json and must be in allowedImageryTags. Banned terms are per market and global.
content/articles/translations/<lang>-<cc>.json hold machine-translated drafts of the country articles (es, fr, de, it, nl, th, af, zu). They are served for the matching locale's language and linted against that language's banned terms. Have a native-speaking professional/counsel review them before launch. Locales without a translation (e.g. ca-ES) fall back to English with a notice.