Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
CMMS for facility and maintenance teams. Track work orders, assets, inspections, and equipment risk with account plans from $49/month.
BusinessTypeScript · HTMLGitHub @kyl3kan3OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full 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).