A robust offline-first data management system for household and beneficiary data with event sourcing and synchronization capabilities
- π Offline-First Architecture - Works seamlessly without internet using IndexedDB
- π Two-Level Synchronization - Client β Server β External system sync
- π Event Sourcing - Complete audit trail of all data changes
- π’ Multi-Tenant Support - Single backend serving multiple applications
- π JWT Authentication - Secure API access with role-based permissions
- π― TypeScript Throughout - Type-safe development experience
- π Conflict Resolution - Automatic handling of data conflicts during sync
- π§ Extensible Architecture - Custom event types and sync adapters
This monorepo contains four main packages:
packages/datacollect- Core library for offline data managementpackages/backend- Central sync server with PostgreSQLpackages/admin- Vue.js admin interface for server managementpackages/mobile- Mobile application built with Vue.js and Capacitor
For setting up on Docker, see the docker/README
- Node.js 22.x or higher
- PostgreSQL 15+ (for backend)
- pnpm 10.x
- Clone the repository:
git clone https://github.com/idpass/idpass-data-collect.git
cd idpass-data-collect- Install dependencies:
# Install all workspace dependencies
pnpm install- Build the datacollect library (required before using in other packages):
pnpm build:datacollect- Set up environment variables:
cp .env.example .env
# Edit .env with your configuration- Start the development servers:
# Terminal 1: Backend server
pnpm dev:backend
# Terminal 2: Admin interface
pnpm dev:adminimport { EntityDataManager } from "@idpass/data-collect-core";
// Initialize the data manager
const manager = new EntityDataManager(/* ... */);
// Create a household group
const household = await manager.submitForm({
type: "create-group",
data: { name: "Smith Family" },
// ... other fields
});
// Add members to household
const updated = await manager.submitForm({
type: "add-member",
entityGuid: household.guid,
data: {
members: [{ name: "John Smith", dateOfBirth: "1980-01-15" }],
},
// ... other fields
});See examples/basic-usage for a complete example.
graph LR
A1[App 1 - DataCollect]<--> B[Backend Server]
A2[App 2 - DataCollect] <--> B
A3[App 3 - DataCollect] <--> B
B <--> C[External Systems]
B <--> D[(PostgreSQL)]
The system uses event sourcing with CQRS pattern:
- Events represent immutable changes to entities
- Entities represent current state (Groups and Individuals)
- Sync handles bidirectional data synchronization
- Storage Adapters abstract database operations
# Run all tests
pnpm test
# Run tests for specific package
pnpm test:datacollect
pnpm test:backend
pnpm test:admin
# Run with coverage (package-specific)
cd packages/datacollect && pnpm test -- --coverageWe welcome contributions! Please see our Contributing Guide for details on:
- Code of Conduct
- Development setup
- Submitting pull requests
- Coding standards
- Privacy Policy
- Governance
- Do No Harm Assessment
- Accessibility
- Security Policy
- Code of Conduct
- Contributing
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
Developed and maintained by Association pour la CoopΓ©ration NumΓ©rique
For questions or support, please open an issue or contact the maintainers.