A local, dockerized, visual data migration framework for moving business‑critical data between ERP, CRM and e‑commerce systems without CSV/Excel hell or cloud lock‑in.
ARC Migrator Tool is a pluggable migration engine that:
- Runs entirely locally (Docker / on‑prem)
- Connects to source systems (e.g. Zoho CRM/Books, HubSpot, Shopify, WooCommerce)
- Connects to target systems (e.g. Odoo, WooCommerce, Shopify)
- Lets users design field mappings visually (n8n/Node‑RED style UI)
- Executes migrations in preview, dry‑run, and commit modes
- Preserves complete historical context (activities, emails, invoices, notes, etc.)
Primary goal:
Turn “spreadsheet migration hell” into a repeatable, auditable and transparent process.
-
Connectors
Pluggable adapters for specific systems (Zoho, Odoo, Shopify, etc.) that:- Discover schemas
- Extract data (via API or exported CSV/Excel)
- Push transformed data to target systems
-
Schema Inspection Engine
Analyses source and target schemas:- Infers data types (string, number, date, enum candidates)
- Detects lookup/relational candidates (columns with few unique values)
- Builds an internal representation for mapping (models + fields)
-
Mapping Workspace (ArcFlow UI)
Node‑based editor (ReactFlow-style):- Source fields (left), target fields (right), transform/lookup nodes (middle)
- Users “draw edges” between fields
- Supports 1→1, 1→N, N→1, constants, and transform chains
- Stores mappings as versioned JSON profiles
-
Processing & Validation Engine
- Applies transform rules on dataframes
- Resolves lookups (e.g. suppliers, users, categories)
- Matches or creates related records
- Validates required fields & constraints before import
-
Execution & Logging
- Preview: counts, sample records, warnings
- Dry run: generate import datasets without writing to target
- Commit: push to target (API/CSV) and create rollback bundles
- Detailed logs & audit trail per migration run
Specialized mode for scenarios like Zoho → Odoo where the priority is complete history, not just current master data.
-
Record‑centric view
For a given account/partner, show:- Contacts, deals, tasks, calls, emails, notes, documents
- Invoices, payments, balances (from CRM + Books)
- “Before” (source system view) vs “After” (simulated target view)
-
History Profiles
- Configurable profiles that define:
- Which source modules are treated as “history” (e.g. tasks, events, deal stage logs, invoices)
- How they map to target entities (e.g. Odoo
mail.message,mail.activity,account.move, etc.)
- Configurable profiles that define:
-
Interactive lookup resolution
- When a column looks like a lookup list (few unique values), the engine prompts:
- “Create new target records?”
- “Match to existing records?”
- “Ignore / map to constant?”
- When a column looks like a lookup list (few unique values), the engine prompts:
-
Excel‑free workflow
- Users configure and iterate mappings in the visual UI
- Output is ready‑to‑import CSVs or direct API calls, no manual Excel massaging required
-
Frontend (UI)
- React + ReactFlow (or similar)
- Node‑based mapping workspace
- Project wizard (“From system?” / “To system?” / “What to migrate?”)
-
Backend
- Python + FastAPI
- Pandas for dataframe operations
- Mapping/transform engine
- Connector abstraction layer
-
Persistence
- SQLite for:
- Projects
- Mapping profiles
- Lookup dictionaries
- Execution history
- SQLite for:
-
Deployment
- Docker (single-compose stack)
- Everything runs locally; no external cloud services are required by design
- Create project: Source = Zoho CRM/Books, Target = Odoo
- Connect/extract: API connection or CSV/Excel exports from Zoho
- Inspect schemas: Engine discovers Zoho modules & Odoo models
- Configure mapping in ArcFlow UI:
- Accounts →
res.partner - Contacts →
res.partner(child contacts) - Deals →
crm.lead/opportunity - Activities, calls, notes →
mail.activity/mail.message - Invoices & payments →
account.moveandaccount.payment
- Accounts →
- Resolve lookups for owners, users, suppliers, categories
- Preview & dry‑run migration, fix conflicts
- Commit to Odoo and store an audit/rollback bundle
Suggested GitHub issue hierarchy.
Convention:
- Label
type: epic,type: story,type: task- Optionally labels for area:
area:backend,area:frontend,area:connector, etc.
User goal: Run ARC Migrator Tool locally in a consistent, reproducible way and support basic project management.
- Task 1.1.1: Set up repository structure (
/backend,/frontend,/connectors,/docs) (type: task) - Task 1.1.2: Configure Python environment and dependency management (e.g.
poetryorpip + requirements.txt) (type: task) - Task 1.1.3: Configure frontend tooling (React + Vite/Next + TypeScript) (
type: task) - Task 1.1.4: Add basic CI checks (linting, formatting, tests) (
type: task)
- Task 1.2.1: Create Dockerfile for backend service (
type: task) - Task 1.2.2: Create Dockerfile for frontend service (
type: task) - Task 1.2.3: Add
docker-compose.ymlto run UI + backend + SQLite (type: task) - Task 1.2.4: Document local run instructions (
README: Getting started) (type: task)
User goal: Allow migrations between specific real systems (starting with Zoho and Odoo) via a generic connector abstraction.
- Task 2.1.1: Define
ConnectorBaseinterface (Python) forget_schema,extract,push(type: task) - Task 2.1.2: Implement connector registration & discovery mechanism (
type: task) - Task 2.1.3: Define
metadata.jsonformat for connectors (type: task)
- Task 2.2.1: Support reading Zoho CRM via CSV exports (baseline) (
type: task) - Task 2.2.2: Optional: Implement Zoho CRM API extractor (
type: task) - Task 2.2.3: Parse Zoho modules (Accounts, Contacts, Deals, Activities) into dataframes (
type: task) - Task 2.2.4: Parse Zoho Books exports (Invoices, Payments, Products) into dataframes (
type: task)
- Task 2.3.1: Implement Odoo schema discovery via
fields_get(XML‑RPC/JSON‑RPC) (type: task) - Task 2.3.2: Implement Odoo data push for core models (
res.partner,crm.lead,account.move) (type: task) - Task 2.3.3: Add CSV export mode for Odoo‑compatible imports (
type: task)
User goal: Automatically understand source/target schemas and represent them in a way that supports visual mapping.
- Task 3.1.1: Define internal
FieldandModelrepresentations (name, type, stats) (type: task) - Task 3.1.2: Implement type inference (string, numeric, date, enum candidates) (
type: task) - Task 3.1.3: Implement lookup detection based on unique value counts (
type: task) - Task 3.1.4: Store inspected schemas in SQLite linked to a
MigrationProject(type: task)
- Task 3.2.1: Define
MappingProfileandMappingEdgemodels (Python + SQLite schema) (type: task) - Task 3.2.2: Support 1→1, 1→N, N→1 mappings in the data model (
type: task) - Task 3.2.3: Add transform and lookup resolver references on mapping edges (
type: task)
User goal: Allow users to map fields and configure transformations without touching Excel or writing code.
- Task 4.1.1: Integrate ReactFlow (or equivalent) in the frontend (
type: task) - Task 4.1.2: Render source models/fields as nodes in left column (
type: task) - Task 4.1.3: Render target models/fields as nodes in right column (
type: task) - Task 4.1.4: Allow drawing edges from source fields to target fields (
type: task)
- Task 4.2.1: Implement transform node types (concat, split, lowercase, trim, constant) (
type: task) - Task 4.2.2: Implement lookup node UI for value mappings (source value list → target entities) (
type: task) - Task 4.2.3: Persist mapping graph and node layout to backend (
type: task) - Task 4.2.4: Load and render existing mapping profiles into the editor (
type: task)
User goal: Run a migration end‑to‑end with preview, validation, and safe commit.
- Task 5.1.1: Implement pipeline to apply mapping edges to source dataframes (
type: task) - Task 5.1.2: Implement transform rule execution (e.g. Python functions or DSL) (
type: task) - Task 5.1.3: Integrate lookup resolution into the pipeline (
type: task)
- Task 5.2.1: Implement required‑field validation based on target schema (
type: task) - Task 5.2.2: Implement conflict detection (duplicate keys, ambiguous matches) (
type: task) - Task 5.2.3: Build preview endpoint + UI (counts, sample rows, warnings) (
type: task)
- Task 5.3.1: Implement dry‑run mode (no writes, only simulated operations) (
type: task) - Task 5.3.2: Implement commit mode with per‑record result logging (
type: task) - Task 5.3.3: Generate rollback bundles (raw inputs + transformed outputs + mapping profile) (
type: task) - Task 5.3.4: Store execution history in SQLite and expose basic run list UI (
type: task)
User goal: Migrate complete customer history (activities, emails, invoices, etc.) from systems like Zoho CRM/Books to Odoo without manual Excel work.
- Task 6.1.1: Define “history entities” concept (activities, notes, emails, invoices) in the data model (
type: task) - Task 6.1.2: Implement backend endpoint to fetch all related records for a given account/contact (
type: task) - Task 6.1.3: Build UI to display “source history” vs “simulated target view” for a single customer (
type: task)
- Task 6.2.1: Define
HistoryProfilemodel (which modules/fields are treated as history) (type: task) - Task 6.2.2: Implement mapping logic from history profile to target entities (
type: task) - Task 6.2.3: Expose history profile selection/configuration in the project wizard (
type: task)
- Task 6.3.1: Detect lookup columns (owners, users, categories) in historical tables (
type: task) - Task 6.3.2: Implement guided UI dialogs for “create / match / ignore” decisions (
type: task) - Task 6.3.3: Persist lookup mappings and reuse them across runs (
type: task)
This repository currently contains:
- ✅ High-level system design
- ✅ Planned architecture and backlog (this document)
- ⏳ Implementation in progress
Contributions welcome – especially connectors, UI improvements, and migration profiles for specific source/target pairs.