Stemma is a collaborative family tree editor. It lets multiple people build and maintain a shared genealogy, with permissions and invitation links.
- Create and edit family trees with parent/child relationships
- Invite collaborators via shareable links
- Visual graph rendering of the tree
- Per-person edit permissions
- Frontend: Svelte + Rollup
- Backend: Scala (ZIO, zhttp)
- Storage: PostgreSQL
backend/: Scala backend rootbackend/build.sbt,backend/project/: SBT root and build configbackend/src/api/: domain model and core servicesbackend/src/api_impl_restful/: REST API implementation (local server)backend/src/api_impl_aws_lambda/: AWS Lambda implementationfrontend/: Svelte frontende2e/: Playwright end-to-end tests and local dev stack launcher
- Java 11+
- sbt
- Node.js + npm
- PostgreSQL (or Docker)
docker run --name stemma-postgres \
-e POSTGRES_PASSWORD=mysecretpassword \
-e POSTGRES_DB=stemma \
--rm -p 5432:5432 postgresexport GOOGLE_CLIENT_ID=your_google_client_id
export INVITE_SECRET=your_invite_secret
export JDBC_URL=jdbc:postgresql://localhost:5432/stemma
export JDBC_USER=postgres
export JDBC_PASSWORD=mysecretpassword
cd backend
sbt "project api_impl_restful" runThe REST API listens on http://localhost:8090.
cd frontend
npm install
GOOGLE_CLIENT_ID=your_google_client_id \
STEMMA_BACKEND_URL=http://localhost:8090 \
npm run devOpen the dev server URL printed by Rollup.
cd backend
sbt testcd frontend
npm testcd e2e
npm testBackend:
GOOGLE_CLIENT_ID: Google OAuth client IDINVITE_SECRET: secret for invitation token signingJDBC_URL: PostgreSQL JDBC URLJDBC_USER: database userJDBC_PASSWORD: database passwordE2E_AUTH_BYPASS(optional): when set to1inapi_impl_restful, any bearer token is accepted (for E2E only)
Frontend:
GOOGLE_CLIENT_ID: same client ID as backendSTEMMA_BACKEND_URL: backend base URL (for examplehttp://localhost:8090)
- If you change the schema or need a clean start, drop the database and re-run the backend to recreate the schema.