Synaplan
开源 AI 软件平台,面向企业:自托管 AI 代理,符合 GDPR 的聊天机器人小部件,RAG 知识库,WhatsApp 与 Outlook AI,MCP,多模型路由。支持 Docker、Kubernetes 或在 Germ 托管。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗A CMMS (computerized maintenance management system) for small teams: work orders, assets, locations, preventive-maintenance scheduling, checklists, inspections, vendors, and team management — backed by Supabase with a React/Vite front end.
Live site: https://maintenease.com Lovable project: https://lovable.dev/projects/8e4b0baf-d26e-4fdc-947e-b3bad90e188b (changes made via Lovable are committed to this repo automatically).
supabase/)npm install # Node 20+; installs deps (xlsx comes from cdn.sheetjs.com)
npm run dev # start the dev server (regenerates public/sitemap.xml first)
Useful scripts:
| Script | What it does |
|---|---|
npm run build | Production build (also regenerates the sitemap) |
npm run typecheck | tsc --noEmit against tsconfig.app.json |
npm run lint | ESLint over the repo (warnings allowed, errors fail CI) |
npm test | Vitest run |
npm run seed:demo / reset:demo / verify:demo | Manage the demo tenant (see docs/demo-environment-playbook.md) |
npm run check:og / check:social / snapshot:meta | Social-preview / metadata checks used by CI |
The Supabase URL/publishable key are committed defaults in
src/integrations/supabase/. Optional overrides:
VITE_SUPABASE_URL, VITE_SUPABASE_PUBLISHABLE_KEY, VITE_SUPABASE_PROJECT_IDVITE_SENTRY_DSN — per-environment Sentry project (a default DSN is hard-coded)VITE_APP_VERSION — release tag for Sentry; CI sets this to the commit SHAVITE_PAYMENTS_CLIENT_TOKEN — payments/billing client tokensrc/
pages/ # route components (see src/router/routeManifest.ts)
components/ # feature UIs (workOrders, assets, calendar, team, …)
services/ # ALL Supabase access lives here (enforced by lint rule)
hooks/ # react-query hooks and shared logic
integrations/ # supabase client + generated types
supabase/
functions/ # edge functions
migrations/ # SQL migrations (RLS policies included)
scripts/ # sitemap, demo tenant, and metadata-check scripts
Two conventions are enforced by ESLint:
src/services/** or
src/integrations/** — components/hooks/pages go through a domain
service consumed via a react-query hook.src/services/supabaseHelpers.ts (requireUserCompany, getCurrentUser,
…) instead of calling supabase.auth.getUser() directly..github/workflows/ci.yml runs lint, typecheck, tests, and the production
build on every PR. meta-tests-pr.yml runs metadata/OG regression tests and
posts a report comment; social-preview-check.yml validates social-card
images. All jobs install with npm ci, so keep package-lock.json in sync
with package.json when changing dependencies.
Client errors are reported to Sentry from src/lib/sentry.ts. Reporting is
disabled in development and active in any non-dev build.
Every event is tagged with:
route — current pathname (kept in sync by SentryContextSync)session_id — stable per-tab id (survives navigation, resets on reload)user.id / user.email — when authenticated, anon:<sessionId> otherwiserelease — from VITE_APP_VERSION (CI sets this to the commit SHA)Network failures (5xx / fetch errors) carry the request URL, method, status,
and response headers via httpClientIntegration. For thrown errors inside
service code, prefer:
import { captureApiError } from "@/lib/sentry";
try {
// ...fetch / supabase call
} catch (err) {
captureApiError(err, { method: "POST", url, status, body, response });
throw err;
}
CI sets VITE_APP_VERSION=${{ github.sha }} on every build, so each deploy
shows up as a distinct release in Sentry → Releases with crash-free session
and user metrics.
To get notified about production error spikes, create these alerts in the Sentry UI (Alerts → Create Alert → Issues):
event.type:error environment:production,
trigger: a new issue is created, action: email / Slack.event.count, filter
environment:production level:error, threshold: > 20 events in 5m.regressed.The default DSN is hard-coded; override per environment with
VITE_SENTRY_DSN if you need a separate Sentry project.
Open the Lovable project and click Share → Publish. Custom domains: Project → Settings → Domains (docs).