PartForge.
A unified management system for Bills of Material, Purchase Orders, Contracts, Quotations and Parts — running locally as a desktop app with a system tray daemon, SQLite database, and browser-based UI modules.
It had to run entirely offline with zero cloud dependency, launch from the system tray, serve a browser-based UI on localhost, and handle everything from BOM imports via drag-and-drop Excel files to automated invoice and forecast generation.
Contract Manager
Full CRUD for engineering contracts. Create, edit, delete, and export. Tracks contract value, status, customer, and all associated parts and POs.
BOM Viewer
Interactive Bill of Materials browser. Drag and drop Excel BOMs, explore hierarchical part trees, search across assemblies, flag missing or duplicate parts.
Purchase Tracker
Track purchase orders from raised to delivered. Monitor ETAs, delivery status, supplier performance, and link POs back to their parent contract and BOM lines.
Quotation Manager
Build and manage quotations with line items, margin calculations, and revision history. Convert accepted quotes directly into contracts.
Parts Manager
Central parts register with KPI dashboards. Track part usage across contracts, monitor stock levels, identify common components across projects.
File Daemon
Background file scanner that watches project folders, cross-references drawings and documents against BOMs, and flags missing deliverables.
# Windows system tray daemon with local HTTP server class BOMHandler(http.server.SimpleHTTPRequestHandler): def do_GET(self): if self.path == "/": self.path = "/apps/index.html" elif self.path.startswith("/api/scan"): folders = self.load_watched_folders() results = self.scan_directory_tree(folders) self.send_json(results) elif self.path.startswith("/api/parts"): db = sqlite3.connect("data/bom_system.db") parts = db.execute("SELECT * FROM parts").fetchall() self.send_json(parts)
Offline-First Requirement
The system had to work on air-gapped machines with no internet access and no cloud accounts.
Local Python HTTP server + SQLite database. All apps served from localhost:8765, zero external dependencies at runtime.
BOM Import Complexity
Engineering BOMs arrive as messy Excel files with inconsistent formatting, merged cells, and nested assemblies.
SheetJS parser with custom normalisation rules. Drag-and-drop import with preview, duplicate detection, and hierarchy reconstruction.
Cross-Module Data Linking
Parts appear in BOMs, POs, contracts, and quotations — keeping references consistent across modules was critical.
Centralised SQLite schema with foreign keys. db-api.js provides a unified data layer all modules share.
Drawing & Document Tracking
Thousands of CAD drawings and documents across network drives needed linking back to BOM line items.
File daemon watches configured folders, scans for part numbers in filenames, and cross-references against the parts database.
Zero-Install Deployment
IT restrictions meant no admin installs, no new services, no changes to group policy.
Single INSTALL.bat that pip-installs dependencies, registers a startup entry, and creates a desktop shortcut. Runs in user-space only.
Selected Works