This monorepo contains the core platform for offline-first data collection and synchronization. Use this file when you work across packages or need the big picture. For deep dives, open the AGENTS.md in the package you are changing.
Published architecture (users and external readers): Architecture overview on opendataensemble.org.
ODE is a clearinghouse model: data is collected on devices, synchronized through Synkronus, and is intended to flow through the system for local analysis and stewardship—not to live only on the server.
- Formulus — React Native mobile app: runs forms (JSON Forms) and custom app bundles in WebViews, offline-first, syncs with Synkronus.
- Formulus Formplayer — React web app embedded in Formulus: renders forms inside a WebView; shares the same bridge contract as custom apps.
- Synkronus — Go backend: auth, sync, app bundle distribution, export, shared HTTP API.
- Synkronus Portal — Web admin UI (React + Vite): same API as other clients; no privileged backend channel.
- Synkronus CLI —
synkcommand-line client: automation, bundles, sync, export.
flowchart LR
Formulus[Formulus_RN]
Formplayer[Formulus_Formplayer]
Synkronus[Synkronus_API]
Portal[Portal]
CLI[CLI]
Formulus -->|sync| Synkronus
Portal -->|same_API| Synkronus
CLI -->|same_API| Synkronus
Formulus -->|hosts_WebView| Formplayer
Design principle: One backend, many clients — prefer the public API for all user-facing tools.
| Profile | Typical focus | Where to work |
|---|---|---|
| Platform developer | You are editing this repo: RN, Go, React, shared packages, CI. | Package AGENTS.md below. |
| Custom app author | You ship an HTML/JS/CSS app bundle and JSON forms for Formulus; you may not clone this monorepo. | Custom app template (AI + author context) and documentation. |
Do not assume custom app authors have local checkouts of ODE or internal example repos.
| Package | Role | Stack | Agent guide |
|---|---|---|---|
| formulus | Mobile runtime, WebViews, native bridge | React Native | formulus/AGENTS.md |
| formulus-formplayer | Form UI in WebView | React, Vite, JSON Forms | formulus-formplayer/AGENTS.md |
| synkronus | Sync API and coordination | Go | synkronus/AGENTS.md |
| synkronus-cli | CLI for API operations | Go | synkronus-cli/AGENTS.md |
| synkronus-portal | Web administration | React, TypeScript, Vite | synkronus-portal/AGENTS.md |
| packages/tokens | Design tokens (@ode/tokens) |
Style Dictionary | packages/tokens/AGENTS.md |
| packages/components | Shared UI (@ode/components) |
React | packages/components/AGENTS.md |
- Formulus ↔ WebView (custom apps + formplayer):
formulus/src/webview/FormulusInterfaceDefinition.tsis the source of truth for the injected JavaScript API. Formplayer copies a synced TypeScript snapshot vianpm run sync-interfaceinformulus-formplayer(see formulus-formplayer/AGENTS.md). - Shared UI tokens: Install tokens before components / formplayer where the docs require it (see package READMEs and formplayer AGENTS).
- Pipelines: .github/CICD.md.
- Lint/format: Run the relevant scripts in the package you touch (see root README.md and each package).
- Commits/PRs: Conventional Commits and PR expectations are documented in formulus-formplayer/AGENTS.md (project-wide convention).
Do not implement or assume APIs for these as if they were in-repo unless issues/specs say otherwise:
- ODE Custodian — local data stewardship and correction workflows (roadmap; often CLI-first).
- ODE Workshop — desktop dev environment for bundles/forms (roadmap).
See product roadmap context and organization roadmaps on GitHub.
Authoritative public documentation: opendataensemble.org.
Optional AI-focused context (no ODE clone required): custom_app on GitHub (README.md, AGENTS.md, CONTEXT_*.md).