Synaplan
기업을 위한 오픈소스 AI 플랫폼
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 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).