Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Live childcare availability for families and a small ERP for the centres that publish it. Built on a vertical-agnostic booking core so clinics, hospitals and venues can be added later.
Families search licensed centres by city and age group, see open spaces and waitlist sizes, join waitlists, track their position and estimated wait, accept or decline offers, and estimate their fees and subsidy.
Centres see occupancy by room, run their waitlist and send offers, take attendance, split monthly fees between parent / subsidy / program funding and create draft invoices, and check staff-to-child ratios. Every offer and enrolment updates the public listing automatically.
All centres, families and children in the seed data are invented.
Requires Node.js 20+.
npm install
npm run setup # creates tables and loads sample data into ./.data/pglite
npm run dev # http://localhost:3000
Open Sign in and pick a demo account:
Without DATABASE_URL, the app uses PGlite (Postgres compiled to WASM)
stored in ./.data/pglite. It allows one process at a time, so stop npm run dev before
running npm run db:seed again. Reseed from scratch with npm run db:seed -- --reset.
docker compose up -d
cp .env.example .env
# set DATABASE_URL=postgres://openslot:openslot@localhost:5432/openslot
npm run setup
npm run dev
Production must use PostgreSQL. Host it in a Canadian region (see the checklist below).
| Command | What it does |
|---|---|
npm run dev | Development server |
npm run build / npm start | Production build and server |
npm run setup | Migrate + seed |
npm run db:generate | Create a new SQL migration after changing src/db/schema.ts |
npm run db:migrate | Apply migrations |
npm run db:seed | Load sample data (-- --reset to wipe first) |
npm run db:import-ontario | Load real Ontario centres as directory listings (-- --reset-ontario to replace) |
npm test | Unit tests + an end-to-end offer/accept test against in-memory Postgres |
npm run typecheck | TypeScript check |
src/
db/
schema.ts Tables (Drizzle ORM). The generic booking core.
client.ts Postgres (DATABASE_URL) or embedded PGlite
migrate.ts, seed.ts
domain/ Pure logic, no database — safe to share with a mobile app
types.ts Age groups, queue flags, DomainError
queue.ts Admission order, wait estimate, offer hold time
rules/provinces.ts Fees, ratios and subsidy rules per province
services/ Business operations used by both the web UI and the API
listings.ts Public search and availability
queue.ts Join, offer, accept, decline, withdraw, expire
centre.ts Dashboard, attendance, ratios, billing, invoices
capacity.ts Occupancy counts and publishing to the listing
auth.ts Demo sign-in (replace before a pilot)
app/ Next.js App Router
page.tsx Find care
waitlists/ Family's waitlists and offers
subsidy/ Fee & subsidy estimator
centre/[locationId]/ ERP: dashboard, waitlist, attendance, billing, staff
actions.ts Server actions behind the web forms
api/v1/ REST API for the mobile app and centre website widgets
drizzle/ SQL migrations
tests/
Organization ─┬─ Location (vertical, province, licence, base fee, funding programs)
│ └─ Resource (room / practitioner / court; capacity; attrs e.g. ageGroup;
│ publishedOpen + publishedAt = what the public sees)
└─ User (centre_admin)
Customer (parent) ── Dependant (child) ── User (family)
QueueEntry resource × dependant; status waiting → offered → accepted | declined | expired | withdrawn
Booking the enrolment; active | ended; approved subsidy per month
Attendance one row per booking per day
Staff assigned to a resource; on/off shift
Invoice per booking per month, split into parent / subsidy / program shares
Key rules live in code, not the database:
domain/queue.ts).GET /api/cron/expire-offers releases unanswered ones.Alongside the invented demo centres, you can load every licensed childcare centre in Ontario from the province's open data — about 6,350 active centres under 2,600 licensees:
# 1. Download the latest monthly file from the Ontario Data Catalogue (XLSX) into data/ontario/
# 2. Turn it into the importer's JSON (keeps only active facilities):
python scripts/extract_ontario.py data/ontario/<file>.xlsx data/ontario/active_facilities.json
# 3. Load it:
npm run db:import-ontario # add -- --reset-ontario to replace a previous import
以上為 README 的開頭部分。其餘內容請閱讀原文。 檢視完整 README ↗