Skip to content
Nachi3D Labs

ProjectsNachi3D Invoice App

Nachi3D Invoice App

Live

Desktop invoicing and business management for the Nachi3D workshop.

Source available on request

About this project

Overview

A full desktop invoicing app for my own fabrication business — Nachi3D. It covers the full billing workflow: creating quotes and invoices from a product catalogue with cost estimations, tracking payment status, exporting accounting data to Excel for the annual tax declaration, and generating branded PDFs with ICE/SIRET fiscal identifiers depending on whether the client is Moroccan or French.

There's also a competitor benchmarking tool that generates mystery-shopping inquiry emails to local 3D printing studios, tracks their prices, and auto-generates price justification arguments when clients push back.

All data lives in JSON files on disk, synced to OneDrive or Google Drive through the OS. No backend, no SaaS subscription, no cloud database. The app is packaged as a Windows .exe via Electron with GitHub Actions auto-building on every push to main.

Key features

What it does

Dual-currency quotes and invoices (MAD/EUR) with ICE/SIRET based on client country
Service price grids per material type and process, with per-line editing
Product catalogue with cost estimation, margin calculation, one-click quote generation
Competitor benchmark tracker with AI-generated mystery shopping emails via Groq
Accounting export to multi-sheet Excel with monthly revenue breakdown
Auto-updating Electron app — GitHub Actions builds .exe, in-app update notification

Built with

The Stack

React
Vite
Electron
JSON storage
Groq AI
SheetJS

What I'd do differently

In hindsight

I'd separate the data layer from the start instead of bolting on the Electron IPC bridge halfway through. The dual-mode api.js that detects Electron vs browser caused hard-to-debug production-only bugs. I'd also start with chunk splitting in Vite from day one.

Want something like this built for you?

Tell me what you'd like to build and we'll see if it fits.