A resilient, browser-native analytics platform engineered for complex Shopify Excel exports. Built with an Obsidian dark interface, zero-backend architecture, dynamic schema normalization, and multi-departmental intelligence.
Modern e-commerce ledgers generated by Shopify exports often contain irregular schemas, composite product bundles, inconsistent date serials, and fragmented departmental requirements. Ledgerify was created to solve this problem entirely on the client side.
By combining browser-native SheetJS parsing, resilient schema normalization, and an Inversion-of-Control (IoC) dependency injection container, Ledgerify transforms raw, multi-megabyte Excel spreadsheets into structured domain intelligence across eight specialized organizational roles without sending data to an external server.
The platform provides human-centric visibility: leaders and operators receive clear, synthesized conclusions rather than being overwhelmed by raw tabular data.
Ledgerify is built upon three core engineering pillars:
- Separation of Concerns (SoC): Strict isolation between parsing, storage, domain metric calculation, and UI presentation.
- Dependency Injection (DI): Business logic resides in decoupled domain services injected through a lightweight IoC container.
- Zero-Knowledge Privacy: 100% client-side computation. Workbooks are parsed in-memory, cached in browser IndexedDB, and never transmitted over the network.
For the comprehensive technical specification, class diagrams, normalization rules, and state management flow, see ARCHITECTURE.md.
flowchart TD
subgraph ClientLayer["Client Layer (Browser Runtime)"]
A["User Upload (.xlsx / .csv)"] --> B["IFileParser (SheetJS Engine)"]
B --> C["Resilient Normalizer & Header Mapper"]
C --> D["Domain Entities (NormalizedOrder[])"]
D --> E["IStorageService (IndexedDB Cache)"]
end
subgraph ServiceLayer["Domain & Service Layer (IoC Container)"]
E --> F["Dependency Injection Container"]
F --> G1["ExecutiveService"]
F --> G2["FinanceService"]
F --> G3["InventoryService"]
F --> G4["OperationsService"]
F --> G5["MarketingService"]
F --> G6["CreativeService"]
F --> G7["AdminDataQualityService"]
F --> G8["CompareService"]
end
subgraph PresentationLayer["Presentation Layer (Obsidian UI)"]
G1 & G2 & G3 & G4 & G5 & G6 & G7 & G8 --> H["React Context Providers"]
H --> I["Departmental View Controllers"]
I --> J["Interactive Visualizations & Drill-Downs"]
end