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
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
Elektripaigaldise käit. Lihtsalt. — a digital operations logbook for electrical installations: käidupäevik, käidukava, puudused and dokumendid in one place. Project documentation lives in docs/ and agent instructions in CLAUDE.md. • Node.js 24 (see .nvmrc; ≥ 22.18 required) • A Docker-compatible container runtime for the local database (Docker Desktop, Colima, Podman, …) • Everything else, including the Supabase CLI, is installed by npm install at pinned versions. .env.local needs exactly two required values from the hosted development Supabase project (Project Settings → API / API Keys):Read the full README ↗
Elektripaigaldise käit. Lihtsalt. — a digital operations logbook for electrical installations: käidupäevik, käidukava, puudused and dokumendid in one place.
Next.js 16 (App Router) · TypeScript · Supabase (Postgres, Auth, Storage) · Tailwind CSS · Vercel.
Project documentation lives in docs/ and agent instructions in CLAUDE.md.
.nvmrc; ≥ 22.18 required)npm install at pinned versions.npm install
cp .env.example .env.local # then fill in the DEVELOPMENT project's values
npm run dev # http://localhost:3000
.env.local needs exactly two required values from the hosted development Supabase project
(Project Settings → API / API Keys):
| Variable | Value |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | https://<project-ref>.supabase.co — no path |
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY | the publishable key (sb_publishable_…) |
Production deployment, the full environment-variable inventory (Preview vs Production) and
the launch runbook: docs/DEPLOYMENT.md and
docs/RELEASE_CHECKLIST.md. Production uses its own Supabase
project and additionally KAIDLY_SITE_URL=https://kaidly.ee.
Optional (server-side only, not a secret; set it in Vercel for Preview/Production too):
| Variable | Value |
|---|---|
KAIDLY_CONTACT_EMAIL | address for the "Soovin jätkata" link when a company's trial or full access has ended (subject "KAIDLY täiskasutuse jätkamine (…)"). Without it the notice only says to contact KAIDLY, with no link. Never put a personal address in source code. |
Never add the service_role / secret key. If configuration is missing or invalid, the app
refuses to run and says what's wrong (it does not fall back to skipping authentication).
npm run db:start # start local Supabase (first run downloads images)
npm run db:reset # rebuild the local database from supabase/migrations + seed.sql
npm run test:db # pgTAP database/RLS tests in supabase/tests
npm run db:types # regenerate lib/supabase/database.types.ts
npm run db:stop
npm run db:reset also loads supabase/seed.sql: a fictional demo organisation
("Näidis Elektritööd OÜ", /o/naidis-elektritood-demo) with two sites, five installations,
log entries, scheduled activities and deficiencies. Demo accounts — password
kaidly-demo-parool:
| Role | |
|---|---|
[email protected] | owner |
[email protected] | admin |
[email protected] | operator |
[email protected] | viewer |
The seed only ever runs against the local database (supabase db push never runs seeds).
To browse it, run the app against the local stack: npm run dev:local.
Sample documents and photos (generated locally, no downloads) go through the normal upload flow, signed in as the demo users — run after each reset:
npm run db:seed-files
Realistic fictional QA companies for manual testing and dogfooding (password for every QA
account: kaidly-qa-parool; accounts listed at the top of supabase/qa/qa_fixtures.sql):
npm run db:reset && npm run qa:fixtures # QA Elektritööd OÜ (trial), QA Tööstuspark OÜ (active),
# QA Haldus OÜ (expired), QA Suletud OÜ (deactivated)
npm run qa:fixtures -- --perf # + QA Jõudlus: 30 sites, 150 installations, 2000 log
# entries, 500 activities, 300 deficiencies, 500 documents
npm run db:reset # remove / reset (rebuilds the local database)
scripts/qa-fixtures.mjs writes only inside the local database container and aborts if the
production project ref appears anywhere in the environment or the CLI link, or if the
target isn't localhost (scripts/qa-guard.mjs, unit-tested). Document rows are metadata
only (no files). There is deliberately no hosted variant.
Storage consistency (stale pending uploads, orphaned objects; read-only):
docker exec -i supabase_db_kaidly psql -U postgres < supabase/maintenance/storage_report.sql
npm run db:start # local Supabase must be running
npx playwright install chromium # once
npm run test:e2e # starts its own dev server on port 3100 against the local stack
The Playwright suite (e2e/) refuses to run against anything but localhost. Test users
are created through the local auth admin API and fixture rows with SQL as the local
postgres user; the service-role key is read from supabase status at runtime and never
stored. Every test runs on desktop (1440 px); tests tagged @responsive also run on a
phone (375 px) and a tablet (768 px).
Full check before every commit:
npm run check # lint, typecheck, unit tests, database tests, production build
npm run test:e2e # browser tests (local Supabase running)
To run the app against the local stack instead of the development project:
npm run dev:local # http://localhost:3000, reads the local values from `supabase status`
Local auth emails are caught by Mailpit (URL in npx supabase status).
The UI is Estonian by default, with English and Russian (lib/i18n/{et,en,ru}.ts). The
language is chosen in the public header or the account menu and kept in a cookie and, for
signed-in users, in their profile. Russian terminology still needs review by a native
electrical professional before public launch.
This is the beginning of the README. Read the rest at the original. Read the full README ↗