Synaplan
기업을 위한 오픈소스 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 전문 보기 ↗