diff --git a/README.md b/README.md index 5f0e1d4..6336e78 100644 --- a/README.md +++ b/README.md @@ -305,8 +305,11 @@ The detail lives in dedicated documents: one table comparing it with the other, both priced without contingency and with the ramp-up reserve. Each carries renders of the [plant and business plan calculator](docs/fleet-calculator.html) with - its own preset (plant view, budget check, ten years of cash; in - `docs/renders/calculator/`). Built from `docs/business-plan/build/` + its own preset (the isometric plant view on the cover and in section 6, + the budget check, ten years of cash; in `docs/renders/calculator/`) and + a software section (5.5) with screenshots of the plant overview, the + factory console with its ERPNext link, the artist ordering demo, fan + funding and the record passport (`docs/renders/demos/`). Built from `docs/business-plan/build/` (`python build_plan.py` makes both versions; the PDFs are exported with LibreOffice so the table of contents is filled in). Draft 0.2, a single launch-plant plan with contingency, is in the git history diff --git a/docs/business-plan/CNX-Vinyl-Business-Plan-A.docx b/docs/business-plan/CNX-Vinyl-Business-Plan-A.docx index 243497d..b209422 100644 Binary files a/docs/business-plan/CNX-Vinyl-Business-Plan-A.docx and b/docs/business-plan/CNX-Vinyl-Business-Plan-A.docx differ diff --git a/docs/business-plan/CNX-Vinyl-Business-Plan-A.pdf b/docs/business-plan/CNX-Vinyl-Business-Plan-A.pdf index 2c46172..62cd5a0 100644 Binary files a/docs/business-plan/CNX-Vinyl-Business-Plan-A.pdf and b/docs/business-plan/CNX-Vinyl-Business-Plan-A.pdf differ diff --git a/docs/business-plan/CNX-Vinyl-Business-Plan-B.docx b/docs/business-plan/CNX-Vinyl-Business-Plan-B.docx index 2378857..2bf3fe8 100644 Binary files a/docs/business-plan/CNX-Vinyl-Business-Plan-B.docx and b/docs/business-plan/CNX-Vinyl-Business-Plan-B.docx differ diff --git a/docs/business-plan/CNX-Vinyl-Business-Plan-B.pdf b/docs/business-plan/CNX-Vinyl-Business-Plan-B.pdf index 3f7a179..d342526 100644 Binary files a/docs/business-plan/CNX-Vinyl-Business-Plan-B.pdf and b/docs/business-plan/CNX-Vinyl-Business-Plan-B.pdf differ diff --git a/docs/business-plan/build/content_a.py b/docs/business-plan/build/content_a.py index e9824d5..44c4f4b 100644 --- a/docs/business-plan/build/content_a.py +++ b/docs/business-plan/build/content_a.py @@ -17,7 +17,7 @@ def blocks(): title="What It Takes to Build a Top-Notch Vinyl Plant", subtitle="Business plan for a full-service vinyl, cassette and CD manufacturing plant " "in the Chiang Mai region, Northern Thailand", - image="renders/aerial-hero.png", + image=pick("renders/calculator/plan-a-cover.png", "renders/calculator/plan-b-cover.png"), lines=[ "**Prepared for:** the project's lead investor", "**Prepared by:** Simona Meesaiyati (Project Lead) and Alexander Grabowski (Technical Consultant), " @@ -34,7 +34,9 @@ def blocks(): "This version is Plan B: the whole chain, cutting and galvanics included, with five presses " "at launch and everything in, at ~225M THB (~224M). A second version, Plan A (~180M THB), " "launches with three presses and six cost levers. ") - + "The plan price includes the ramp-up reserve and carries no contingency. Draft 0.3 replaces " + + "The plan price includes the ramp-up reserve and carries no contingency. Cover picture: the " + "plant as the plant and business plan calculator draws this plan (schematic, Payap scenario " + "layout, section 6.2). Draft 0.3 replaces " "draft 0.2 (October 2026), which described a single launch plant priced with a contingency.", )) out.append(TOC()) diff --git a/docs/business-plan/build/content_b.py b/docs/business-plan/build/content_b.py index 78037ca..4747025 100644 --- a/docs/business-plan/build/content_b.py +++ b/docs/business-plan/build/content_b.py @@ -497,6 +497,81 @@ def blocks(): "also make the plant's sustainability story true rather than claimed, which matters to the " "labels it sells to."), + H2("5.5 The software: plant overview, factory console and artist platform"), + P("Three pieces of software carry the traceability and the customer promise of this plan into daily " + "work. All three exist today as working demos on the project's test site, run on simulated data: " + "orders, customers, IDs and measurements are invented, while the stages, checks, cycle times and " + "shifts follow the plan. They show investors, vendors and future staff what is being built. The " + "production versions are the development project of section 5.1 (software block USD 115k to 310k, " + "estimate), built on ERPNext as the plant's only system of record."), + H3("Plant overview (SCADA)"), + P("One screen for the whole plant: the metal path from audio intake through mastering, lathe cutting, " + "the Pheenix Alpha galvanics line and Sibert stamper prep to the stamper rack; the press hall with " + "its presses, extruders, material lab and compound silos; inspection, packaging and fulfilment; and " + "underneath them the utilities (steam, process cooling, compressed air, hydraulics, water treatment, " + "energy and PV, HVAC). The demo animates the launch plant at real cycle times, from real time up " + "to 3600× (a day in 24 seconds); every station opens with its figures and the source of each, and " + "the three artist gates show how many titles wait at each. In the plant the same screen is fed " + "from the machine-data store instead of the simulation: the presses over OPC UA, boilers, chillers " + "and compressor over Modbus (the data clause in every equipment RFQ). Alarms go to the shift's " + "phones and keep working with the internet down."), + IMG("renders/demos/scada.png", 170, + "Figure 2. Plant overview (simulated SCADA) of the launch plant, running at 60×: header with shift, " + "presses running, cycles an hour, good records and rejects, metal in work, steam pressure, plant " + "load and solar; metal path on top, press hall and finishing in the middle, utilities below. " + + pick("", "The demo draws the launch plant (Duplex system 1 and the Classic); Plan B adds the " + "second Duplex system to the same screen. ") + + "Demo (docs/plant-operation.html), simulated values."), + H3("Back office: the factory console on ERPNext"), + P("The factory application (working name cnx-factory) is the plant's working interface. It shows the " + "press floor with live counters per press, stamper life and the optical result of every record; " + "work orders per station in kiosk form (badge in, scan what the step asks for, confirm); the " + "material lab gate with lots on hold; stamper metrology and the lacquer, father, mother and stamper " + "genealogy; the hash-chained event log; and the customer portal of the same orders. It keeps no " + "business records of its own: orders, job cards, batches, inspections, metal parts, deliveries and " + "invoices are posted to ERPNext through an outbox, so no press waits for the ERP, and the office " + "works in ERPNext's own desk for purchasing, accounts, stock and planning."), + IMG("renders/demos/factory-floor.png", 165, + "Figure 3. Factory console, press floor: good and rejected records today, presses running, orders " + "in production and waiting at an artist gate, compound on hold; one card per press with its order, " + "progress, stamper set and play count, cycle time and steam temperature; the optical inspection " + "stream keyed by stamper, press and cycle time; what needs attention. Demo " + "(docs/factory-console.html), simulated orders and values; the demo runs one Duplex system and " + "one Classic."), + IMG("renders/demos/factory-erp.png", 165, + "Figure 4. The ERPNext link: every posting the floor makes (job cards, serial numbers of lacquers, " + "fathers, mothers and stampers, quality inspections, artist gates, downtime entries, purchase " + "receipts), its document name in ERPNext and its outbox status. Demo, simulated documents."), + H3("Artist platform: order, fund and follow a record"), + P("The artist platform is the plant's front door for every customer. The customer configures the " + "record against a to-scale mock-up; uploads music and artwork, which are checked in the browser " + "and never uploaded in the demo (format, sample rate and bit depth, clipping, side length; artwork " + "size, spine, bleed, resolution and colour against downloadable templates); approves the master " + "plan, the first of the three artist gates; and receives an itemised offer with its lead time. In " + "the demo's example a 12-inch black LP with a printed jacket costs 37,836 THB once per title and " + "343 THB a copy all in at 300 copies (indicative prices, estimates)."), + IMG("renders/demos/artist-offer.png", 160, + "Figure 5. Artist ordering: the itemised offer, per title (mastering, lacquers, cutting, " + "electroforming with the father and mother kept for represses, press setup, test pressings) and " + "per copy (pressing, sleeve, assembly, printed jacket, shrink wrap), with the mock-up and the " + "lead time. Demo (docs/artist-order.html), price list demo-0.1, indicative."), + P("The artist then orders directly or runs a fan-funded campaign: fans pre-order at the artist's price " + "into a ring-fenced account, the plant presses from 100 copies, and if the goal is missed every fan " + "is refunded. At a fan price of 1,200 THB the artist needs 100 fans, breaks even at 41 and keeps " + "~548 THB a copy at the goal. After delivery each copy has a record passport, reached from the code " + "on its sleeve: the traceability record of that one copy, from the approved master through lacquer, " + "father, mother and stamper to the press cycle and the packing scan. Campaigns go live only after " + "the first paying releases have shipped and lead times are measured. The public side is costed at " + "USD 40k to 90k within the software block (estimate). The platform's name is undecided."), + IMG("renders/demos/fan-funding.png", 160, + "Figure 6. Fan funding in the investor demo of the platform: the artist sets the fan price and " + "the deadline; the fans needed follow from the 100-copy minimum and the break-even, with what the " + "artist keeps. Demo (docs/make-a-record.html), indicative prices."), + IMG("renders/demos/record-passport.png", 160, + "Figure 7. Record passport of one copy: the record key (stamper, press, cycle time, side) and the " + "chain from master to shipment, with the repress path from the archived father and mother. IDs " + "and times are simulated."), + # -------------------------------------------- 6 site and building H1("6. Site and building"), H2("6.1 Land: a long lease, three candidates"), @@ -584,12 +659,6 @@ def blocks(): "to 1,600 kVA with it)."), H2("6.2 The building"), - IMG("renders/site-plan.png", 120, "Figure 2. Site plan on the candidate Mueang Chi parcel (massing " - "model, July 2026): main building with rooftop PV, utility yard, " - "fire and raw-water tanks, parking canopies and the phase 2 " - "building. It predates the crane, the visitor corridor and the " - "utility yard built for four modules. Source: parametric model, " - "project repository."), P("The main building is a single-storey steel portal frame (pre-engineered) of **60 × 25 m " "(1,500 m²)**, designed from day one for an overhead crane, with a 10° monopitch roof carrying the " "PV array, low eave 7.0 m, high side ~11.4 m. The floor is a 200 mm slab rated 30 kN/m² (3 t/m², " @@ -624,31 +693,42 @@ def blocks(): "estimate). ") + "At the lower half of the table everything fits in " "1,500 m²; at the upper half, finished goods move to a second building."), - IMG("production-hall-layout-sketch.png", 170, "Figure 3. Rough layout sketch of the 60 × 25 m hall " - "(October 2026): machine door and workshop at the ramp end, then mastering, galvanics, stamper " - "prep, material area and lab, the press hall, inspection, QC and packaging along the glazed " - "visitor corridor" + pick(" (built later in this plan)", "") + ", with the 5 t crane runway " - "over the production compartment up to the warehouse fire wall. " + pick( - "It still draws two Classic positions (the plan installs one)", - "It still draws one Duplex system and two Classic positions (the plan installs two Duplex " - "systems and one Classic)") + " and " - "puts reception and the cutting room under the crane's travel, a conflict the Payap scenario " - "model resolves with a separate office building. All positions are estimates."), - P("Figure 4 shows the same plant as the calculator draws it for " + label() + ": the ground floor of a " - "whole site with the press hall cut open, the machines this plan installs and the free positions it " - "keeps for growth."), + P("Figures 8 to 10 show the plant as the plant and business plan calculator draws it for " + label() + + ". The calculator draws the Payap scenario model (section 6.1): a 128 × 25 m production floor in " + "process order along the glazed visitor corridor, a two-storey office, the detached utility yard " + "and a press hall of ~870 m² laid out for five Duplex bays and four Classic positions, on a " + "150 × 150 m placeholder plot. The building described above and the zone table are the 60 × 25 m " + "hall for Mueang Chi; which layout is built is decided once a plot passes zoning and lease-ability. " + "The calculator itself is interactive: rotate, zoom, switch floors and tap any object for its " + "figures and their source."), + IMG(pick("renders/calculator/plan-a-iso-roof.png", "renders/calculator/plan-b-iso-roof.png"), 170, + "Figure 8. The site from above, " + label() + " preset of the plant and business plan calculator: " + "the factory with roof PV" + pick(" supplied through the solar PPA (the battery is drawn too; " + "whether a PPA offer includes it is open)", + " and battery, owned") + + ", the office, the utility yard (boiler hall and chiller compound built for four modules each, " + "pump and heat-exchanger room, transformer, water treatment, PVC silos), parking with PV canopies " + "and the phase 2 reserve. Schematic render of the Payap scenario model (docs/fleet-calculator.html); " + "positions and envelopes are estimates."), IMG(pick("renders/calculator/plan-a-iso-gf.png", "renders/calculator/plan-b-iso-gf.png"), 170, - "Figure 4. The plant at a glance in the plant and business plan calculator, " + pick( - "Plan A preset: Duplex system 1 and the Classic in a press hall laid out for five Duplex bays " - "and four Classic positions, boiler modules B-1/B-2 and chillers CH-1/CH-2 (the free yard " - "positions are marked), the frame crane-ready with the crane rented", - "Plan B preset: Duplex systems 1 and 2 and the Classic in a press hall laid out for five Duplex " - "bays and four Classic positions, boiler modules B-1/B-2 and chillers CH-1 to CH-3 (the free " - "yard positions are marked), the 5 t crane and the cassette room") + - ". Schematic render (docs/fleet-calculator.html, also at cnxvinyl.lol/demos/fleet-calculator/) of a " - "generic site after the Payap scenario model and the utility yard of scale.md, not the Mueang Chi " - "parcel of Figure 2; positions and envelopes are estimates, not to scale where the vendors publish " - "no footprint."), + "Figure 9. Ground floor with the roofs cut away, " + label() + " preset: from the west end the " + "staff entry, workshop, galvanics (PASU, PPPU, PDPU, PMPB), Sibert stamper prep, metrology" + + pick(" (launch tier)", "") + ", PVC lab and colour store, then the press hall, optical inspection, " + "finishing and packaging, the warehouse and dispatch; the office with reception, lathe and cutting " + "room, listening room and archive. " + pick( + "The frame is crane-ready with the crane rented; the visitor corridor, cassette and CD-R come " + "later. ", + "With the 5 t crane, the visitor corridor and the cassette and CD-R rooms. ") + + "Schematic, estimates."), + IMG(pick("renders/calculator/plan-a-iso-hall.png", "renders/calculator/plan-b-iso-hall.png"), 170, + "Figure 10. The press hall close up, " + label() + " preset: " + pick( + "Duplex system 1 (two HRP 12 presses with their extruders) and the Classic; the dashed " + "outlines are the free Duplex bays and Classic positions for growth. In the yard, boiler " + "modules B-1 and B-2 and chillers CH-1 and CH-2, with B-3, B-4, CH-3 and CH-4 free", + "Duplex systems 1 and 2 (four HRP 12 presses with their extruders) and the Classic; the " + "dashed outlines are the free Duplex bays and Classic positions. In the yard, boiler modules " + "B-1 and B-2 (B-3 and B-4 free) and chillers CH-1 to CH-3 (CH-4 free)") + + ". Schematic, estimates."), H3("Crane, workshop and visitor corridor"), B(pick([ "**A crane-ready frame, with the crane rented at first.** The frame, the runway and the machine " diff --git a/docs/business-plan/build/content_c.py b/docs/business-plan/build/content_c.py index 5256d42..971c42d 100644 --- a/docs/business-plan/build/content_c.py +++ b/docs/business-plan/build/content_c.py @@ -496,10 +496,10 @@ def blocks(): "the part of Plan B that can still return to a growth step, leaving the three-press launch " "plant."), ]), - P("Figure 5 is the budget check of the plant and business plan calculator with the " + label() + + P("Figure 11 is the budget check of the plant and business plan calculator with the " + label() + " preset, contingency kept out of the total as in this plan."), IMG(pick("renders/calculator/plan-a-budget.png", "renders/calculator/plan-b-budget.png"), 160, - "Figure 5. Budget card of the plant and business plan calculator, " + pick( + "Figure 11. Budget card of the plant and business plan calculator, " + pick( "Plan A preset: 161.7M THB at the midpoint without contingency, 171.7M to 181.7M with the " "ramp-up reserve of 10M to 20M, inside 180M at the midpoint", "Plan B preset: 209.2M THB at the midpoint without contingency, 219.2M to 229.2M with the " @@ -794,7 +794,7 @@ def blocks(): "exemptions shield part of early-year profits where there are any.", ])), IMG(pick("renders/calculator/plan-a-cash.png", "renders/calculator/plan-b-cash.png"), 160, - "Figure 6. Ten years of cash in the plant and business plan calculator, " + pick( + "Figure 12. Ten years of cash in the plant and business plan calculator, " + pick( "Plan A preset: cash payback in year ~3.9, IRR ~25 %, NPV ~4.9M USD at 10 %", "Plan B preset: cash payback in year ~3.3, IRR ~32 %, NPV ~9.7M USD at 10 %") + ". Year 0 is the midpoint investment plus the ramp-up reserve; years 1 to 3 sell 35, 70 and 90 % of " @@ -1261,7 +1261,8 @@ def blocks(): "parametric model"], ["fleet-calculator.html", "Plant and business plan calculator: target output and specials share to " "the Duplex/Classic mix, people, utilities, investment and the operating " - "picture, with the Plan A and Plan B presets"], + "picture, with the Plan A and Plan B presets and the isometric plant " + "view (Figures 8 to 12)"], ["equipment/pressing-line.md and equipment/newbilt/", "Press fleet strategy, hydraulic ring mains; " "Newbilt offer, site requirements, service " "rates, 2026 product flyers"], @@ -1276,11 +1277,13 @@ def blocks(): "came after the show"], ["suppliers/china-utilities.md", "Chinese boilers, compressed air and hydraulics; Thai rules for " "imported boilers; what the Chinese route saves"], - ["digital-factory.md", "Data platform: ERPNext as the only system of record, machine data, the " - "factory application, the NixOS fleet"], + ["digital-factory.md (demos plant-operation.html, factory-console.html)", "Data platform: ERPNext " + "as the only system of record, machine data, the factory application, the " + "NixOS fleet; the plant overview and factory console demos (Figures 2 to 4)"], ["artist-platform.md (demos artist-order.html, make-a-record.html)", "Upload and itemised price " "calculator, fan-funded " - "campaigns"], + "campaigns, the record " + "passport (Figures 5 to 7)"], ["process-flow.md, production-timeline.md", "The chain and its checks; order turnaround stage by " "stage, lead times and the repress path"], ["traceability.md, quality-automation.md", "The traceability specification; metrology, layered " @@ -1298,8 +1301,10 @@ def blocks(): ["cnx_vinyl_parametric.FCStd, cnx_vinyl_parametric_payap.FCStd and renders/", "Parametric building " "and site models on " "the candidate " - "plots, and their " - "renders"], + "plots (draft 0.2's " + "figures; this draft " + "uses the " + "calculator's view)"], ], widths_mm=[62, 108], font_pt=8.5), P("Vendor PDFs and spreadsheets are primary sources and reflect the state of negotiations at their file " "dates. Treat prices and lead times as snapshots, not commitments."), diff --git a/docs/renders/calculator/plan-a-cover.png b/docs/renders/calculator/plan-a-cover.png new file mode 100644 index 0000000..340c115 Binary files /dev/null and b/docs/renders/calculator/plan-a-cover.png differ diff --git a/docs/renders/calculator/plan-a-iso-gf.png b/docs/renders/calculator/plan-a-iso-gf.png index 424b81c..f9623dd 100644 Binary files a/docs/renders/calculator/plan-a-iso-gf.png and b/docs/renders/calculator/plan-a-iso-gf.png differ diff --git a/docs/renders/calculator/plan-a-iso-hall.png b/docs/renders/calculator/plan-a-iso-hall.png new file mode 100644 index 0000000..3dbd0fd Binary files /dev/null and b/docs/renders/calculator/plan-a-iso-hall.png differ diff --git a/docs/renders/calculator/plan-a-iso-roof.png b/docs/renders/calculator/plan-a-iso-roof.png new file mode 100644 index 0000000..11e1432 Binary files /dev/null and b/docs/renders/calculator/plan-a-iso-roof.png differ diff --git a/docs/renders/calculator/plan-b-cover.png b/docs/renders/calculator/plan-b-cover.png new file mode 100644 index 0000000..6ebdf81 Binary files /dev/null and b/docs/renders/calculator/plan-b-cover.png differ diff --git a/docs/renders/calculator/plan-b-iso-gf.png b/docs/renders/calculator/plan-b-iso-gf.png index f651255..2d9a487 100644 Binary files a/docs/renders/calculator/plan-b-iso-gf.png and b/docs/renders/calculator/plan-b-iso-gf.png differ diff --git a/docs/renders/calculator/plan-b-iso-hall.png b/docs/renders/calculator/plan-b-iso-hall.png new file mode 100644 index 0000000..f6b950b Binary files /dev/null and b/docs/renders/calculator/plan-b-iso-hall.png differ diff --git a/docs/renders/calculator/plan-b-iso-roof.png b/docs/renders/calculator/plan-b-iso-roof.png new file mode 100644 index 0000000..c2fe878 Binary files /dev/null and b/docs/renders/calculator/plan-b-iso-roof.png differ diff --git a/docs/renders/demos/artist-offer.png b/docs/renders/demos/artist-offer.png new file mode 100644 index 0000000..49dfbba Binary files /dev/null and b/docs/renders/demos/artist-offer.png differ diff --git a/docs/renders/demos/factory-erp.png b/docs/renders/demos/factory-erp.png new file mode 100644 index 0000000..a9d7851 Binary files /dev/null and b/docs/renders/demos/factory-erp.png differ diff --git a/docs/renders/demos/factory-floor.png b/docs/renders/demos/factory-floor.png new file mode 100644 index 0000000..b0f1ba7 Binary files /dev/null and b/docs/renders/demos/factory-floor.png differ diff --git a/docs/renders/demos/fan-funding.png b/docs/renders/demos/fan-funding.png new file mode 100644 index 0000000..6975abc Binary files /dev/null and b/docs/renders/demos/fan-funding.png differ diff --git a/docs/renders/demos/record-passport.png b/docs/renders/demos/record-passport.png new file mode 100644 index 0000000..6696f2e Binary files /dev/null and b/docs/renders/demos/record-passport.png differ diff --git a/docs/renders/demos/scada.png b/docs/renders/demos/scada.png new file mode 100644 index 0000000..a400153 Binary files /dev/null and b/docs/renders/demos/scada.png differ