[Skip to content](#main)

[→](/)

[![Avunu](/brand/avunu-logo.svg)![Avunu](/brand/avunu-logo-light.svg)](/)[Services](/services/)[Consulting](/services/consulting/)[ERP](/services/erp/)[Odoo](/services/erp/odoo/)[ERPNext](/services/erp/erpnext/)[Custom software](/services/custom-software/)[Devices & IoT](/services/devices-iot/)[Websites](/services/websites/)[Infrastructure](/services/infrastructure/)[Partners](/partners/)

[Work](/work/)[Open source](/open-source/)[Knowledge base](/kb/)[About](/about/)

[About Avunu](/about/)[Team](/about/team/)[Insights](/insights/)[Contact](/contact/)

[Client portal](https://erp.avunu.net/projects)[Start a project](/start/)

- [Services](/services/)[Consulting](/services/consulting/)
- [ERP](/services/erp/)
- [Odoo](/services/erp/odoo/)
- [ERPNext](/services/erp/erpnext/)
- [Custom software](/services/custom-software/)
- [Devices & IoT](/services/devices-iot/)
- [Websites](/services/websites/)
- [Infrastructure](/services/infrastructure/)
- [Partners](/partners/)

[Work](/work/)[Open source](/open-source/)[Knowledge base](/kb/)[About](/about/)

- [About Avunu](/about/)
- [Team](/about/team/)
- [Insights](/insights/)
- [Contact](/contact/)

[Client portal](https://erp.avunu.net/projects)[Start a project](/start/)

Print-shop production on a tested, self-hosted ERP

ERPNext runs a textile print shop's orders, RIP print queue, and shipping on a tested, self-hosted NixOS server, connected to its online store.

[Work](/work/)

Textile & home-decor printing

Textile & home-decor printing&#xA;
ERPNext · NixOS · WordPress&#xA;

IndustryTextile & home-decor printing

PlatformERPNext · NixOS · WordPress

Services[ERPNext implementation](/services/erp/erpnext/)
,&#x20;
[custom software](/services/custom-software/)
,&#x20;
[managed infrastructure](/services/infrastructure/)
,&#x20;
[Websites](/services/websites/)

StackERPNext, Frappe, Python, TypeScript, Vue, Caldera RIP, ShipStation, 17Track, and 8 more

Status

**Print floor**

Orders

**Print queue**

Nesting

Packing

Shipping

Designs

Printer 1 · wallpaper · 54 in rollPrint queue

Pause queue
Send to RIP&#xA;

Roll 1 nested84%

| Work order | Product         | Nesting         | Status        |
| ---------- | --------------- | --------------- | ------------- |
| WO-1042    | Wallpaper panel | Nested&#xA;     | Printing&#xA; |
| WO-1043    | Fabric, 60 in   | Nested&#xA;     | Queued&#xA;   |
| WO-1044    | Sample set      | Nested&#xA;     | Queued&#xA;   |
| WO-1045    | Wallpaper panel | Needs file&#xA; | On hold&#xA;  |

The challenge

This manufacturer prints fabric and home-decor products to order. Every order is a small production job: find the right design, set it up for the printer, print, pack, and ship. Printing, work orders, and shipping are the business, so the system that runs them can't go down and can't drift.

When the shop came to us, it had no shop-floor management and no data system beyond its files and folders. Print files arrived by email and were copied, moved and torn apart by hand, and nobody could easily track which prints had shipped to which customers.

The goal was a production system the team could trust: print control inside the ERP, automated hand-offs from order to shipment, code that's tested before it ships, and a server the shop owns.

What we built

ERP-to-RIP printing

Printing moved from external tools into a server-integrated Caldera RIP workflow. A live print-queue screen in the ERP gives operators detailed, real-time control over the queue. Nesting logic lays out fabric, samples, and wallpaper efficiently, and printer profiles live in the ERP next to the products that use them.

Order automation

Online-store orders arrive through ShipStation and are processed into the ERP on a schedule. Work orders, packing slips, and shipping flow from there, with 17Track following each package after it leaves.

Vendor pipeline

Some products ship from partner vendors. The ERP routes those orders, lets vendors upload design files, and keeps drop-shipped orders in sync through ShipStation.

Floor tools

Portal pages for print-queue management, packing bins, and shipping put the right screen in front of the right person on the floor.

AI-assisted quality checks

AI image flagging marks likely quality problems in print files for a person to review, using models that run on the shop's own hardware.

The online store

We also build and maintain the shop's WordPress and WooCommerce store, including a trade program. Designs managed in the ERP publish to the store, so product data is entered once.

Self-hosted platform

The ERP runs as a NixOS service on a dedicated production server, with centralized identity and file sharing, offsite cloud backups, secure remote file access through Cloudflare, and separate VM test environments.

Results

Order intake, print control, and shipping now run in one system, and the floor team works from screens built for their steps. The custom code has gone from hard to change to well covered by tests: more than 800 automated tests at about 90% line coverage, with a coverage floor that may rise but never fall. Running ERPNext's own regression tests against the shop's customizations turned up three real bugs, including one in a vendored storage app that blocked stock cancellations for ordinary users. All three are fixed.

Online-store orders reach the ERP through ShipStation and move into production automaticallyA live print-queue screen gives the floor real-time control over what goes to the Caldera RIPMore than 800 automated tests, at roughly 90% coverage, guard the shop's custom codeRunning ERPNext's own test suite against the customizations surfaced three real bugs, all fixedThe ERP runs as a declared NixOS service on the shop's own server, with offsite backupsDesigns managed in the ERP publish to the online store without re-entry

Because the whole server is declared in code, it can be rebuilt, tested in a VM, and audited. The shop owns the hardware, the data, and the code.

Under the hood

ERPNextFrappePythonTypeScriptVueCaldera RIPShipStation17TrackWordPressWooCommerceNixOSBackblaze B2CloudflareFreeIPASambaOllama

**ERPNext on Frappe v16,**
&#x20;customized through a dedicated app plus&#x20;
[jailbreak](/open-source/jailbreak/)
&#x20;for the rare low-level override. Core apps are never forked. Controllers for Sales Order, Work Order, Stock Entry, and other core doctypes are typed, class-based overrides.

Quality gates

Ruff and ty for Python; oxfmt, oxlint, and strict TypeScript for the front end. CI evaluates the Nix environment and runs lint on every push.

Testing

An integration harness with document factories, fakes for external services (cloud storage, Cloudflare KV, ShipStation), and a frozen clock for date-dependent reports. Money reports are checked against hand-worked numbers, not shape.

**[frappe-nix](/open-source/frappe-nix/)**
&#x20;declares the whole bench, dev services, and the NixOS production service in one flake.

**[carbon_frappe](/open-source/carbon_frappe/)**
&#x20;gives the desk and portal a consistent Carbon Design System look.

Storage and integrations

Backblaze B2 behind Cloudflare's CDN for design files; ShipStation for order intake and drop-shipping; 17Track for tracking; log export for monitoring and alerting.

Identity and files

FreeIPA with Samba integration for staff accounts and shares.

More detail

Open source it's built on

[All open-source projects](/open-source/)

![]()NixOS[frappe-nix](/open-source/frappe-nix/)frappe-nix

Reproducible Nix infrastructure for Frappe and ERPNext, from the development shell to OCI containers and a multi-site NixOS module.

![]()Frappe[Carbon Frappe](/open-source/carbon_frappe/)Carbon Frappe

A complete IBM Carbon Design System theme for Frappe and ERPNext, covering the desk, website, login, email, charts, and tables.

![]()Frappe[Jailbreak](/open-source/jailbreak/)Jailbreak

Power-user tools for Frappe and ERPNext admins, including bulk merge, item-to-variant conversion, and version restore, each gated behind a setting.

“”

Related work

[All case studies](/work/)

![](/brand/avunu-icon.svg)Professional services

[We run Avunu on what we build, from proposal to paycheck](/work/avunu-erp/)

![](/brand/avunu-icon.svg)Auto & heavy-truck repair

[A truck repair shop's whole job, from inspection to invoice, in one system](/work/heavy-truck-repair-shop/)

![](/brand/avunu-icon.svg)Timber-frame structures manufacturing

[CAD drawings that become quotes, BOMs, and shop-floor work](/work/timber-frame-manufacturer/)

Have a challenge like this one?

Tell us how your work flows today and where it hurts. We'll tell you honestly whether ERPNext, Odoo, or something custom fits, and what a first phase could look like.

[Start a project](/start/)[Explore ERPNext implementation](/services/erp/erpnext/)

Services

- [ERP implementation](/services/erp/)
- [Odoo](/services/erp/odoo/)
- [ERPNext](/services/erp/erpnext/)
- [Custom software](/services/custom-software/)
- [Devices & IoT](/services/devices-iot/)
- [Websites](/services/websites/)
- [Infrastructure](/services/infrastructure/)

Resources

- [Our work](/work/)
- [Open source](/open-source/)
- [Knowledge base](/kb/)
- [Insights](/insights/)

Company

- [About](/about/)
- [Team](/about/team/)
- [Partners](/partners/)
- [Contact](/contact/)

Clients

- [Project portal](https://erp.avunu.net/projects)
- [Invoices](https://erp.avunu.net/)
- [Support](https://erp.avunu.net/)

[![Avunu](/brand/avunu-logo-light.svg)](/)[\<av-icon data-jx-static>\<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor" stroke="none" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">\<path d="M20.400 20.500h-3.600v-5.600c0-1.300 0-3-1.800-3s-2.100 1.400-2.100 2.900v5.700H9.400V9h3.400v1.600c.5-.9 1.600-1.900 3.400-1.900 3.600 0 4.300 2.400 4.300 5.500v6.300zM5.300 7.400a2.100 2.100 0 1 1 0-4.100 2.100 2.100 0 0 1 0 4.100zm1.800 13.100H3.600V9h3.500v11.500zM22.200 0H1.800C.8 0 0 .8 0 1.700v20.600c0 .9.800 1.700 1.800 1.700h20.400c1 0 1.800-.8 1.800-1.700V1.700C24 .8 23.200 0 22.200 0z">\</path>\</svg>\</av-icon>](https://www.linkedin.com/company/avunu)[\<av-icon data-jx-static>\<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor" stroke="none" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">\<path d="M12 .3a12 12 0 0 0-3.8 23.4c.6.1.8-.3.8-.6v-2c-3.3.7-4-1.6-4-1.6-.6-1.4-1.4-1.8-1.4-1.8-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.8 1.3 3.5 1 .1-.8.4-1.3.7-1.6-2.7-.3-5.5-1.3-5.5-5.9 0-1.3.5-2.4 1.2-3.2-.1-.3-.5-1.5.1-3.2 0 0 1-.3 3.3 1.2a11.500 11.500 0 0 1 6 0c2.300-1.500 3.300-1.200 3.300-1.200.6 1.700.2 2.900.1 3.200.8.8 1.200 1.900 1.200 3.200 0 4.600-2.800 5.600-5.500 5.900.4.400.8 1.100.8 2.200v3.300c0 .3.2.7.8.6A12 12 0 0 0 12 .3">\</path>\</svg>\</av-icon>](https://github.com/Avunu)[Client portal](https://erp.avunu.net/projects)[Start a project](/start/)

Avunu LLC · 948 East Philadelphia Street, York, PA 17403 · (717) 814-8540Knowledge base articles are in the public domain[Privacy](/privacy/)[Terms](/terms/)
