The Odoo Community mobile experience, reimagined.
Native iOS. Schema-driven UI. One clean API across Odoo 17, 18, and 19.
Highlights • Architecture • Quick start • Roadmap
- Native iOS, built for touch-first Odoo workflows
- Schema-driven forms and lists, powered by real Odoo metadata
- One normalized backend contract across Odoo 17, 18, and 19
- Already shipped: auth, browse, detail, create/edit/delete, actions, chatter, offline-resilient cache, dynamic browse discovery from backend menu trees, and inline preview/export for loaded media/documents
Ordo is production-minded, but still evolving. Full offline sync, many2one stage-style status interactions, multi-company switching, and richer remote attachment handling are still follow-up work.
- Browse grouping is already shipped, but it is client-side grouping over flat list payloads, not backend aggregates.
- Attachment preview/export is already shipped for bytes already loaded in record detail, but there is no backend download/proxy path for large files yet.
- Read-only relation drilldown is already shipped for many2one rows and many2many chip grids when current payloads include usable
comodel+ relation IDs. - Statusbar tap-to-change is shipped only for a narrow action-backed two-state selection flow; many2one stage bars such as CRM stages remain read-only.
- Offline behavior currently means cache + queued update/delete/action replay/management, not queued create replay or a full background sync/conflict engine.
iOS App (SwiftUI)
↓ HTTPS / JWT
NestJS Middleware
↓ JSON-RPC
Odoo 17 / 18 / 19
- iOS: SwiftUI,
@Observable, async/await, Keychain, file cache - Backend: NestJS 11, TypeScript 5, Redis,
class-validator - Testing: Jest, Supertest, Xcode /
xcodebuild
- Node.js 22 LTS
- npm 10+
- Xcode 15+
- Docker (optional, for local Odoo validation)
git clone https://github.com/tuanle96/ordo.git
cd ordo/backend
npm install
cp .env.example .envSet the required values in .env:
JWT_ACCESS_SECRET=your-access-secret
JWT_REFRESH_SECRET=your-refresh-secret
JWT_ACCESS_EXPIRES_IN_SECONDS=900
JWT_REFRESH_EXPIRES_IN_SECONDS=604800
REDIS_URL=redis://127.0.0.1:6379
ODOO_REQUEST_TIMEOUT_MS=15000
ODOO_SESSION_TTL_SECONDS=1800Option A — Docker Compose (recommended):
cd .. # from repo root
docker compose up --buildThis starts both the backend and Redis automatically.
Option B — Local Node.js:
# Start Redis first (or use an existing instance)
npm run start:devAPI base URL:
http://localhost:38424/api/v1/mobile
Run the iOS app from ios/Ordo.xcodeproj, or build with:
xcodebuild -project ios/Ordo.xcodeproj \
-scheme Ordo \
-destination 'generic/platform=iOS Simulator' \
buildOptional local Odoo stack:
cd odoo-instances
docker compose up -d --buildNext major areas:
- wider iOS observation migration
- barcode + inventory workflows
- richer attachment/media flows
- deeper offline sync
- notifications, realtime, biometrics, multi-server support
For full details:
docs/project-roadmap.mddocs/project-changelog.mddocs/system-architecture.mddocs/add-odoo-community-module-support.md
PRs are welcome. Keep changes focused, run relevant validation, and use Conventional Commits.
If you are onboarding support for a new Odoo app/module, start with docs/add-odoo-community-module-support.md.
Licensed under AGPL-3.0. If you modify and deploy Ordo as a network service, you must release the corresponding source code under AGPL-3.0.
Built with ❤️ for the Odoo Community