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).