diff --git a/README.md b/README.md index a7fb14b..96e38ac 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ steps are open planning items. ([total investment](docs/finance/total-investment.md#launch-plant-october-2026)). Chinese boilers, compressor and hydraulics save about 2M THB of that ([Chinese suppliers](docs/suppliers/china-utilities.md)). - The business plan is being re-based on it. + The business plan is re-based on it (draft 0.2). ## Planning Documents @@ -263,21 +263,27 @@ The detail lives in dedicated documents: - [Project scale](docs/scale.md): rough numbers for everything on one page: output capacity, building area, land, electrical demand, solar and storage, steam and fuel, headcount, and money cross-references -- [Total investment](docs/finance/total-investment.md): the full-vision - roll-up (~4.7M to 8.9M USD) and the ~1.7M to 2.9M USD phased entry, with - the basis of every block +- [Total investment](docs/finance/total-investment.md): the launch plant + decided in October 2026 (~161M to 292M THB, ~4.9M to 8.9M USD, midpoint + ~227M THB) with the basis of every block, and the answer to the + investor's 180M / 216M THB question; the earlier full vision and phased + entry are kept as superseded - [Phase 1 construction RFQ](docs/finance/phase1-construction-rfq.md): the spec sheet for asking a contractor to price the phase 1 buildings and site works, with quantities taken from the parametric BIM model -- [Revenue model](docs/finance/revenue-model.md): rough full-capacity - revenue (~3.7M to 6.8M USD/yr), direct cost and margin per record, and - the levers and caveats behind the numbers +- [Revenue model](docs/finance/revenue-model.md): pricing, direct cost + and margin per record, the launch plant's operating picture (central + revenue ~3.75M USD a year, EBITDA ~1.6M, payback ~4 years on 216M THB; + the adverse case loses money), the five-press table, and the levers and + caveats behind the numbers - [Business plan](docs/business-plan/CNX-Vinyl-Business-Plan.docx): the investor-facing roll-up of everything above, built from `docs/business-plan/build/` (run `python build_plan.py` to regenerate - after the numbers move). Draft 0.1 carries the land-lease decision, the - cassette and CD scope, and Ploy Printing as packaging partner and - intended co-investor + after the numbers move; the PDF is exported with LibreOffice so the + table of contents is filled in). Draft 0.2 (October 2026) is built on + the launch plant: the whole chain at launch, the investor's budget + question, the launch plant's operating picture, the commissioning order + and its risks ## Repository Layout diff --git a/docs/business-plan/CNX-Vinyl-Business-Plan.docx b/docs/business-plan/CNX-Vinyl-Business-Plan.docx index 2f3dd4b..288a531 100644 Binary files a/docs/business-plan/CNX-Vinyl-Business-Plan.docx and b/docs/business-plan/CNX-Vinyl-Business-Plan.docx differ diff --git a/docs/business-plan/CNX-Vinyl-Business-Plan.pdf b/docs/business-plan/CNX-Vinyl-Business-Plan.pdf index 01b9adf..f96d554 100644 Binary files a/docs/business-plan/CNX-Vinyl-Business-Plan.pdf and b/docs/business-plan/CNX-Vinyl-Business-Plan.pdf differ diff --git a/docs/business-plan/build/build_plan.py b/docs/business-plan/build/build_plan.py index 2a06b91..ae70f51 100644 --- a/docs/business-plan/build/build_plan.py +++ b/docs/business-plan/build/build_plan.py @@ -21,7 +21,7 @@ OUT = HERE.parent / "CNX-Vinyl-Business-Plan.docx" def main(out: Path = OUT) -> Path: - r = Renderer(DOCS, header_text="CNX Vinyl / Poy Records: Business plan, draft 0.1, September 2026", + r = Renderer(DOCS, header_text="CNX Vinyl / Poy Records: Business plan, draft 0.2, October 2026", footer_text="Confidential") r.render(content_a.blocks() + content_b.blocks() + content_c.blocks()) r.save(out) diff --git a/docs/business-plan/build/content_a.py b/docs/business-plan/build/content_a.py index f072dff..aba81de 100644 --- a/docs/business-plan/build/content_a.py +++ b/docs/business-plan/build/content_a.py @@ -17,11 +17,12 @@ def blocks(): "**Prepared by:** Simona Meesaiyati (Project Lead) and Alexander Grabowski (Technical Consultant), " "supported by buildfor.life, with Ploy Printing (Chiang Mai) as packaging partner and " "strategic co-investor", - "**Version:** Draft 0.1, September 2026", + "**Version:** Draft 0.2, October 2026", ], note="Confidential. All figures in USD and THB at 1 USD = 33 THB (August 2026). Vendor quotes are " "snapshots at their file dates, not commitments. Every number in this plan is labelled as quoted, " - "researched, or estimated; see section 2.", + "researched, or estimated; see section 2. Draft 0.2 replaces draft 0.1 (September 2026): the plant " + "now launches with the whole chain, cutting and galvanics included, in one capital round.", )) out.append(TOC()) @@ -33,93 +34,151 @@ def blocks(): "able to send an audio file to one place and receive finished, packaged, fully traceable records at " "their door, without shipping a fragile lacquer disc across the world and without waiting for metal " "stampers to come back from Europe. Today that customer presses in Europe, the United States or " - "Japan. The one operating pressing shop in Thailand presses only: it buys its stampers abroad, runs " + "Japan. The one Thai pressing shop we have seen presses only: it buys its stampers abroad, runs " "without climate control, and cannot economically serve runs under 300 units."), P("This document explains, for a reader who is not a vinyl specialist, what a top-notch plant " "consists of, why each part matters, what it costs, what it can earn, how long it takes, and what " "could go wrong. It is built from the project's planning repository and vendor documents, and it " "keeps the honest parts: where a number is an estimate, it says so; where the evidence is thin, it " "says that too."), + P("**What changed since draft 0.1.** In October 2026 the plan moved from a phased entry (one press at " + "launch, stampers bought in from the UK, cutting bought in from Europe) to a **launch plant** that " + "has the whole chain from the first day, bought in one capital round and commissioned in sequence. " + "There are no bridge stampers and no outsourced cutting in the plan any more. Every section below " + "is written for that plant."), H2("What we will build"), B([ - "**The complete vinyl chain under one roof:** mastering, lacquer cutting, galvanics (making the " - "nickel stampers), pressing, finishing, packaging with our Chiang Mai print partner Ploy " - "Printing, and fulfilment including direct-to-fan dropshipping.", - "**A mixed press fleet:** semi-automatic presses for colour, splatter and short runs, fully " - "automatic presses for volume. Launch with one semi-automatic line (90,000 to 135,000 records a " - "year); grow to four presses (1.0 to 1.5 million records a year).", - "**Cassette duplication in-house** and **short-run CD duplication** from launch. Full CD " - "replication (injection-moulded discs) is a separate, much larger decision; both CD options are " - "priced in section 4.9 for the investor to decide.", - "**A purpose-built 1,500 m² plant on long-term leased land**, with a detached utility yard, " - "a rooftop solar array, and room for a second building. The land is now planned as a " - "registered long lease rather than a purchase, which lowers upfront capital by roughly " - "USD 0.4 to 1.0 million.", + "**The complete vinyl chain under one roof:** mastering, lacquer cutting, galvanics (growing the " + "nickel stampers), stamper preparation, pressing, finishing, packaging with our Chiang Mai print " + "partner Ploy Printing, and fulfilment including direct-to-fan dropshipping.", + "**Three presses at launch:** one Newbilt Duplex system (two semi-automatic presses with a main " + "and a colour extruder, for colour, splatter and short runs) and one Newbilt Classic fully " + "automatic press for long standard runs. Together about 0.71 to 0.97 million records a year on " + "two shifts (estimate). A second Duplex system is a growth option with its floor, utility " + "positions and pipe connections reserved, not part of the investment.", + "**The metal path in-house:** a Sillitoe SDMS cutting room, a Pheenix Alpha galvanics line with " + "zero-discharge water treatment, and the Sibert stamper-prep line. The father and the mother of " + "every side are archived, so represses start from our own metal.", + "**A modular utility plant:** a boiler hall and a chiller compound built once for four modules " + "each, with two 500 kg/h boiler modules and two 250 kW chiller modules installed at launch; " + "further presses add modules, not rooms. The steam fuel (electric or biomass) is still open.", + "**Cassette duplication and CD-R duplication in-house** from launch. Full CD replication " + "(injection-moulded discs) is a separate, much larger decision, outside the totals; both CD " + "routes are set out in section 4.10 for the investor to decide.", + "**A purpose-built ~1,500 m² plant on long-term leased land**, with a detached utility yard, " + "rooftop solar and room for a second building.", + "**Commissioned in sequence:** the cutting room and galvanics first (the presses need their " + "stampers), then the Duplex system, then the Classic. That puts galvanics, the hardest skill to " + "hire, on the path to the first paying release. Sibert, the stamper-prep supplier in the plan, " + "advised after the Haarlem trade show to get presses, boilers, operators and feedback loops " + "right first; the launch plant was decided anyway, and that advice is carried as a risk " + "(sections 11.2 and 13).", ]), H2("What makes it top-notch"), P("Four things separate this plant from a pressing shop, and they are the reason it can charge " "export-grade prices in a region that currently has none:"), N([ "**Traceability from audio file to shipment.** Every lacquer, father, mother, stamper, press " - "cycle, compound lot and carton lot gets an identity that knows its parents. A customer sees " - "their order's full chain; a complaint resolves to one stamper, one press, one shift and one " - "material lot. Machine data comes from the machines, not from paperwork.", + "cycle, compound lot and carton lot gets an identity that knows its parents; a pressed record is " + "identified by its stamper, press, cycle time and side. The plant runs **ERPNext as its only " + "system of record** (orders, invoices, stock, job cards, batches, inspections, metal-part " + "genealogy); machine data (press cycles, instrument files, audio captures) sits beside it, keyed " + "to the same ERPNext names. A customer sees their order's full chain; a complaint resolves to one " + "stamper, one press, one shift and one material lot. The **father and the mother of every side " + "are archived**: a mother gives about ten stamper sets and a father five to ten mothers " + "(industry rules of thumb), so a repress starts from the archived mother and a worn mother is " + "regrown from the father without a new cut. At Making Vinyl Europe in Haarlem this was what the " + "industry responded to most.", "**Metrology and layered quality control.** The nickel parts are measured without contact " "(laser confocal, wide-area profiler, XRF thickness) and logged per serial, which is ahead of " - "industry practice. Every pressed record passes 100% inline optical inspection, every press " - "cycle is logged, and sampled records are compared automatically against the source master.", - "**Efficiency designed in.** Heat is recovered before energy is generated (the presses' own " - "60 °C cooling return pre-heats the boiler feedwater), ~290 kWp of rooftop solar at phase 1 " - "grows to ~500 kWp with the second building, a 271 kWh battery shaves peaks, cooling runs as a " - "closed loop, no process water is discharged, and 20% of the feedstock is in-house regrind. One " - "operator runs up to four automatic presses.", + "current industry practice. Every pressed record passes 100% inline optical inspection, every " + "press cycle is logged, and sampled records are compared automatically against the source " + "master.", + "**Efficiency designed in.** Heat is recovered before energy is generated: in order, a flue-gas " + "economiser if the boiler is fired, as much condensate back to the feed tank as possible, then a " + "heat pump that lifts the presses' ~60 °C cooling return into boiler feedwater. The main roof " + "carries **~247 kWp** of solar (about 335 to 360 MWh a year, a quarter to a third of mature " + "two-shift use; a second building's roof would take the total to ~498 kWp), with a 271 kWh " + "battery for ride-through. Cooling runs as a closed loop, no process water is discharged, " + "galvanics rinse water goes through a zero-discharge evaporator, and 20% of the feedstock is " + "in-house regrind. Boilers and chillers come in identical modules, so spares and service are one " + "routine. At reported northern fuel prices biomass heat costs a quarter to a tenth of electric " + "steam; the fuel choice is open.", "**Climate control as product quality.** The whole plant runs at 20 to 26 °C, 35 to 60% " "relative humidity, with particulate filtration sized for Northern Thailand's burning season. " - "Moisture and dust are the two classic causes of noisy records; the incumbent has neither " - "control.", + "Moisture and dust are the two classic causes of noisy records; the plant we visited has " + "neither control.", ]), H2("The numbers"), KV([ - ["Capacity", "Launch ~90k to 135k records/yr (1 semi-automatic line, 1 shift); mature ~1.0M to " - "1.5M records/yr (2 semi-automatic + 2 automatic presses, 2 shifts)"], - ["Site", "~1,500 m² main building plus ~180 m² utility yard on ~5 to 8 rai of leased land; " - "second 1,710 m² building as expansion"], - ["Investment, full vision", "~USD 4.4M to 8.0M (~THB 144M to 264M) including 15% contingency " - "(was 4.7M to 8.9M before the decision to lease the land)"], - ["Investment, phase 1 launch", "~USD 2.2M to 3.9M (~THB 73M to 128M) including the building, " - "one press line, climate control, rooftop solar, cassette and CD-R " - "lines, working capital and contingency"], - ["Land lease", "Estimated THB 0.3M to 1.0M per year (USD 9k to 30k), to be replaced by the " - "negotiated figure"], - ["Revenue at maturity", "~USD 3.7M to 6.8M per year (~THB 122M to 224M)"], - ["Operating result at maturity", "Central case EBITDA ~USD 2.6M, operating profit ~USD 2.0M, " - "payback 2 to 4 years. Adverse case is EBITDA-positive but " - "does not cover depreciation. Utilisation and price " - "realisation decide the outcome, not upside."], - ["First paying release", "Q4 2028 to mid-2029 if the gates below start now; one regulatory " - "question (ordering machinery before the BOI certificate) could pull " - "that forward by 6 to 9 months"], - ["People", "~15 to 25 at maturity across shifts, fewer than half that at launch"], + ["Capacity", "Launch plant ~0.71M to 0.97M records/yr (2 semi-automatic presses + 1 Classic, " + "2 shifts; estimate; the press fleet calculator gives ~0.94M at our planning " + "rates). Second Duplex as growth option: ~1.0M to 1.5M"], + ["Site", "~1,500 m² main building plus a ~379 m² utility yard built for four boiler and four " + "chiller modules, on leased land (~4 rai minimum, 6 to 8 rai with expansion); second " + "building as expansion"], + ["Investment, launch plant", "~USD 4.9M to 8.9M (~THB 161M to 292M) including 15% contingency, " + "midpoint ~USD 6.9M (~THB 227M). Not in it: a ramp-up reserve of " + "~THB 10M to 20M, CD replication, financing costs, the central " + "hydraulic plant (not yet costed)"], + ["The investor's 180M THB question", "**216M THB is a realistic target** for the full equipment " + "list with four levers that keep every machine (~203M to " + "213M with the ramp-up reserve); **180M holds only if the " + "open quotes land low**"], + ["Land lease", "Not negotiated; the plan carries an estimated THB 0.3M to 1.0M per year " + "(USD 9k to 30k), section 6.1"], + ["Operating result, mature year", "Central case: revenue ~USD 3.75M (~THB 124M), EBITDA ~USD 1.63M " + "(~THB 54M), operating profit ~USD 1.11M (~THB 37M), payback " + "~4 years (3.0 to 5.5 on the 4.9M to 8.9M band); break-even " + "on operating profit at ~0.3M records a year. **The adverse " + "case loses money:** EBITDA ~USD 0.22M, operating loss ~USD " + "0.67M (~THB 22M). Utilisation and price decide the outcome, " + "not upside (section 9)"], + ["First paying release", "**Open.** The August 2026 calendar gives Q4 2028 to mid-2029 (27 to 33 " + "months from the start of phase 0), but it was drawn for a one-press " + "launch. Commissioning the cutting room and galvanics before the presses " + "is not yet in it, and the lathe, galvanics line and stamper-prep build " + "times are not on file, so the date stays open until those vendors " + "quote. Ordering machinery before the BOI certificate, if allowed, could " + "still pull it forward by 6 to 9 months (section 10)"], + ["People", "~15 to 25 across shifts at volume (estimate); the launch plant needs most of that " + "crew, because two shifts still need press, finishing, galvanics, QC and maintenance " + "staff (13 to 19 direct production staff in the revenue model)"], ]), H2("Where we are, and what we ask"), - P("The project is at the planning stage. Industry outreach has run for several years; vendor quotes " - "exist for the pressing line, utilities have been costed with Thai suppliers, a parametric building " - "model has produced quantities for a construction price request, and a candidate parcel in Mueang " - "Chi, Lamphun has been tested against the design. Nothing has been ordered."), - P("Three gates run now and in parallel: **market validation** with regional labels and at the Making " - "Vinyl trade show in Haarlem (autumn 2026); the **BOI investment promotion** track with a " - "registered consultant; and **land**: zoning verification, lease terms, and a soil test. Nothing " - "large is spent until its gate clears."), + P("The project is at the planning stage. Industry outreach has run for several years. Alexander and " + "Simona attended **Making Vinyl Europe in Haarlem** (30 September to 2 October 2026): most people " + "they talked to were strongly interested in the full-traceability approach, and for Sibert it was " + "the reason to engage at all. Since the show Sibert has confirmed a **USD 250k budget** for its " + "three stamper-prep machines; Pheenix Alpha's CEO has offered a call, reference clients and a " + "factory visit (the next Europe trip is planned for February 2027); OMS has sent reference prices " + "for a galvanics wet room; and SST in Frankfurt, which already cuts Poy Records' lacquers, has " + "offered help. This is supplier-side evidence, not buyer price validation."), + P("Vendor quotes exist for the pressing line (2024, expired), utilities have been costed with Thai " + "suppliers, and a parametric building model has produced quantities for a construction price " + "request. **Site:** a leased parcel in Mueang Chi, Lamphun, is the working candidate the design is " + "tested against; Payap University in Chiang Mai has offered land on lease and joint student " + "programmes, but the point it gave fails zoning (zoned very high density residential, where " + "record pressing is not permitted; checked October 2026), and its other plots are not yet " + "checked. Nothing has been re-sited and **nothing has been ordered**."), + P("Three gates run now and in parallel: **market validation** (buyer prices from regional labels; " + "none yet); the **BOI investment promotion** track with a registered consultant; and **land**: " + "zoning, lease terms and a soil test. Nothing large is spent until its gate clears."), CALL("What the investor is asked to fund now", [ - "**Phase 0 (next 3 to 6 months): ~USD 40k to 80k** for the BOI consultant, Thai legal work on " - "the lease and zoning, a soil boring test, the trade-show trip, firm re-quotes from the press, " - "galvanics and building vendors, and optional specialist consultancy.", - "**Phase 1 (commitment after the BOI certificate and validated pricing): ~USD 2.2M to 3.9M** " - "released in tranches against milestones: lease signed, press order, building contract, " - "fit-out, commissioning.", - "**Decisions needed from the investor:** CD scope (duplication only, or full replication), " - "whether galvanics moves into phase 1, and the equity/debt mix (BOI requires debt-to-equity " - "of at most 3:1).", + "**Phase 0 (next 3 to 6 months): ~USD 40k to 80k (~THB 1.3M to 2.6M)** for the BOI consultant, " + "Thai legal work on the lease and zoning, a soil boring test, and the requests that settle most " + "of the investment band: the Newbilt re-quote for the Duplex and the Classic, a Pheenix quote for " + "the galvanics line, the building price request with the soil test, and metrology distributor " + "quotes.", + "**Then the launch plant round, targeted at ~THB 216M (~USD 6.55M)**, released in tranches " + "against milestones: BOI certificate and lease signed, long-lead orders (lathe, galvanics, " + "stamper prep, presses, first boiler and chiller modules), building contract, fit-out, " + "commissioning in sequence (section 8.3). The full estimate band is THB 161M to 292M; section " + "8.2 shows the levers that bring the midpoint inside 216M.", + "**Decisions needed from the investor:** the equity/debt mix (BOI requires debt-to-equity of at " + "most 3:1); CD replication, yes or no (it must be in the BOI application from the start); the " + "steam fuel, electric or biomass; and which budget levers to take (solar through a PPA, " + "metrology bought in two steps, the visitor corridor later).", "**Co-investment:** Ploy Printing, the Chiang Mai print and packaging house that will produce " "the plant's jackets and sleeves, has expressed the intention to invest alongside the lead " "investor. Terms are not yet discussed; the intended structure is described in section 12.", @@ -130,23 +189,28 @@ def blocks(): P("Every figure in this plan carries one of three confidence levels. Where a table does not say, " "the basis column or caption does."), T(["Label", "Meaning", "Examples"], [ - ["Quoted", "A vendor document exists, in its original currency. Quotes may have expired and " - "need re-confirmation.", "Newbilt pressing line (EUR 200,500, June 2024); Newbilt " - "service rates; Gobel battery list price"], + ["Quoted", "A vendor document exists, in its original currency: a quote, a budget confirmation " + "or a published list price. Quotes may have expired and need re-confirmation.", + "Newbilt pressing line (EUR 200,500, June 2024, expired); Sibert's USD 250k budget confirmation " + "for the stamper-prep line (October 2026); Sillitoe SDMS list price USD 125k (ex tax and " + "shipping); OMS reference prices for a galvanics wet room; Newbilt service rates"], ["Researched", "Published or market data gathered by the team, including one set of real Thai " - "invoices.", "Thai utility supplier ranges; Pheenix AD12 datasheet; domestic " - "pressing prices, August 2026; BOI measures"], + "invoices.", "Record Industry's online price calculator (October 2026); Thai " + "pressing invoices (August 2026); the PEA electricity tariff; vendor " + "flyers and datasheets; reported biomass fuel prices; BOI measures"], ["Estimate", "Engineering ratio or industry norm with no vendor confirmation. Treat as " - "plus or minus 30 to 50%.", "Building cost per m²; galvanics line; mastering " - "room; metrology stack; land lease; all cassette and " - "CD figures"], + "plus or minus 30 to 50%.", "Building cost per m²; the Pheenix galvanics line and the " + "Newbilt Classic (no price on file); the cutting room " + "beyond the lathe; metrology stack; land lease; all " + "cassette and CD figures"], ], widths_mm=[22, 70, 78]), P("Currency: USD and THB at 1 USD = 33 THB (5 August 2026). Vendor quotes issued in EUR or GBP are " "kept in their currency next to their source and converted at 1 EUR = 1.155 USD and " "1 GBP = 1.35 USD. Currency exposure is real and is discussed in section 8.5."), P("Deliberately **not** in this plan: a financing structure or terms (to be agreed with the investor); " - "a signed customer; a signed lease; firm quotes for the automatic presses, the galvanics line, the " - "mastering room or the building. Each of these is a named next step in section 14."), + "a signed customer; a signed lease; firm quotes for the Classic, the galvanics line, the metrology " + "stack or the building; a price for the central hydraulic plant; and a year-by-year cash model. " + "Each of these is a named next step in section 14."), # ------------------------------------------------- 3 opportunity H1("3. The opportunity"), @@ -165,16 +229,19 @@ def blocks(): H2("3.2 Where regional labels press today"), P("Labels and artists in Southeast Asia, Australia and much of East Asia ship their masters to " "Europe, the United States or Japan, wait in those plants' queues, and pay freight and time zones " - "on top. There is no industrial-grade, climate-controlled, full-service plant in the region. That " + "on top. We know of no industrial-grade, climate-controlled, full-service plant in the region. That " "is the gap. It is also the plan's biggest assumption: that enough regional customers will pay for " - "a closer, faster, more accountable plant at a price that works. That pricing power is unproven and " - "the market validation gate exists to test it before capital is committed."), - H2("3.3 What the Thai market shows: one real data point"), - P("In August 2026 the team compared real invoices from the one operating pressing shop in Thailand, " - "ResurRec in Bangkok (with whom a collaboration is also under discussion), and toured its plant. " - "This is one buyer, one plant, one afternoon, and it is deliberately not used to re-base the " - "financial model. But it is the only real market evidence so far, and it points in a useful " - "direction."), + "a closer, faster, more accountable plant at a price that works. That pricing power is unproven. " + "The Haarlem trade show produced strong supplier interest but no buyer prices, and the market " + "validation gate exists to test it before capital is committed."), + H2("3.3 What the market shows: two price points"), + P("Two sets of real prices now exist: invoices from the one Thai pressing shop we have seen, and the " + "published calculator of a European plant. Neither is used to re-base the financial model, which " + "keeps its assumed price until buyers have been asked. Together they bracket that assumption."), + H3("The Thai market: one buyer, one plant"), + P("In August 2026 the team compared real invoices from ResurRec in Bangkok (with whom a " + "collaboration is also under discussion), and toured its plant. This is one buyer, one plant, one " + "afternoon, but it is the only domestic market evidence so far."), T(["Item", "THB", "USD", "Note"], [ ["Audio mastering", "5,000 to 20,000 per song", "150 to 605", "Market range from several engineers"], ["Stamper set (father, mother, silvering)", "up to 22,000 per title", "up to 665", @@ -187,38 +254,64 @@ def blocks(): "in Thailand"], ], widths_mm=[42, 36, 24, 68], caption="Researched: buy-side invoices and published discount ladder, August 2026."), - P("What the tour showed: the incumbent operates from a small non-industrial premises; it does not " - "plate (stampers are bought in from abroad and resold); there is no temperature, humidity or " - "particulate control on the pressing floor; and it runs two Newbilt presses, one fully automatic " - "and one semi-automatic, which is a real capital fleet that on paper out-presses our launch " - "configuration two to three times over."), + P("What the tour showed: the shop operates from a small non-industrial premises; it does not plate " + "(stampers are bought in from abroad and resold); there is no temperature, humidity or particulate " + "control on the pressing floor; and it runs two Newbilt presses, a Classic fully automatic and one " + "semi-automatic, about 190 to 210 records an hour at nameplate. That is a real capital fleet. Our " + "launch plant's three presses (248 to 288 records an hour at nameplate, planned for two shifts) " + "out-press it on paper, which the one-press launch of draft 0.1 did not. Neither figure is " + "measured output: their shifts and order book were not observed."), + H3("A European plant: Record Industry's calculator"), + P("Record Industry (Haarlem, Netherlands) publishes an online calculator. For a 12-inch 140 g black " + "LP cut from a digital master, with stampers, five test pressings, printed labels, a white paper " + "inner sleeve, a printed 3 mm jacket and shrink wrap, ex Dutch VAT and ex freight (checked " + "October 2026):"), + T(["Copies", "Order total", "Per copy", "Per copy, USD", "Per copy, THB"], [ + ["200", "EUR 1,494.68", "EUR 7.47", "8.63", "~285"], + ["300", "EUR 1,721.22", "EUR 5.74", "6.63", "~219"], + ["500", "EUR 2,098.12", "EUR 4.20", "4.85", "~160"], + ["1,000", "EUR 3,169.78", "EUR 3.17", "3.66", "~121"], + ], widths_mm=[22, 38, 30, 40, 40], + caption="Researched: Record Industry online calculator, October 2026; converted at 1 EUR = 1.155 USD " + "and 1 USD = 33 THB."), + P("Its per-title items (set-up, small-run charge, cutting, stampers, test pressings) come to about " + "EUR 580 to 600 (~THB 22,000 to 23,000), at the low end of our per-title assumption. Black " + "pressing with labels and a paper inner sleeve comes to about USD 2.43 a copy at 300 (2.09 at " + "1,000). The Thai price at 300 copies is about 3 to 4.3 times this plant's ex-works price, before " + "the freight, Thai import duty and VAT a Thai buyer pays on an import. Our own artist ordering " + "demo's price list comes to about 343 THB a copy at 300 with vinyl mastering: above the European " + "ex-works price and well below the Thai market. These price levels stay open until buyers have " + "been asked (roadmap item 1)."), P("Four readings follow, each with its caveat:"), B([ - "**Domestic willingness to pay is higher than our model assumes.** The plan prices a record at " - "USD 3.50 to 4.60 blended (Western export benchmark). The Thai market pays 535 to 780 THB on a " - "comparable scope, several times more, even after allowing 100 to 150 THB for the jacket. The " - "caveat: a sole domestic supplier can hold an import-parity price that a second entrant " - "compresses. We kept the conservative price until a second data point exists.", + "**Our assumed price sits between the two markets.** The plan prices a record at USD 3.50 to 4.60 " + "blended (115 to 150 THB). The Thai market pays 535 to 780 THB on a comparable scope, several " + "times more, even after allowing 100 to 150 THB for the jacket. A European plant's published " + "price for black pressing with labels and an inner sleeve (~USD 2.43 at 300) is below our " + "assumption, though our blend also carries colour work and assembly. Two caveats: a sole " + "domestic supplier can hold an import-parity price that a second entrant compresses, and against " + "Europe our assumption is not conservative. We keep it until buyer prices exist.", "**The floor of the market is unserved.** Runs under 300 are uneconomic for a shop whose " "per-title cost is an imported stamper plus outsourced mastering. In-house cutting and plating " "collapse that fixed cost, which makes short runs viable for CNX in a way they structurally are " - "not for the incumbent.", + "not for the incumbent. The artist platform (section 4.8) is the channel for them.", "**Lead time degrades with run size, probably because of metalwork.** Three thousand units is " "about two days of pressing on their fleet, yet they add two to four weeks. A stamper lasts " "1,000 to 2,000 pressings, so a 3,000-unit run needs two or three sets, each an overseas order. " "Jacket printing or floor space could produce the same symptom, and the cause should be " "confirmed before it is treated as a structural weakness.", - "**The gap we close is capability, not capacity.** No plating, no climate control, no metrology, " - "no traceability. The incumbent sells commercially from that room today, which bounds how much " - "the Thai market currently pays for the difference. Our bet is on export-grade customers and on " - "regional labels who currently ship to Europe.", + "**The gap we close is capability, not only capacity.** No plating, no climate control, no " + "metrology, no traceability. The incumbent sells commercially from that room today, which bounds " + "how much the Thai market currently pays for the difference. Our bet is on export-grade customers " + "and on regional labels who currently ship to Europe.", ]), CALL("Investor takeaway", "CNX should not fight a price war at 200-unit runs against an operator " "with low rent and no climate-control load. It competes on what a non-plating, unconditioned " "shop cannot offer at any run size: export-grade quality control and traceability, titles that " - "need plating, consistent output through the burning season, repress in days from an archived " - "mother, and short runs. A stamper-supply relationship with the incumbent is a plausible early " - "revenue line for the galvanics room and is under discussion."), + "need plating, consistent output through the burning season, a repress in two to three weeks " + "from an archived mother, and short runs. A collaboration with the incumbent is under " + "discussion; supplying stampers into its presses is one plausible shape for it, and is not in " + "the revenue model."), H2("3.4 Cassettes and CDs"), P("The investor has asked for cassette and CD capability on the site. Both fit the same customer: " "the independent label that presses 300 to 2,000 records also orders 100 to 500 cassettes and a " @@ -227,16 +320,16 @@ def blocks(): "volumes are small and the equipment market is mostly refurbished, but the format is a natural " "add-on with modest capital. CDs remain a large format in Asia (Japan and Korea in particular), " "but industrial CD replication is an established, price-competitive business with existing " - "capacity across the region. Section 4.8 and 4.9 lay out both formats and the two very different " - "CD routes."), + "capacity across the region. Sections 4.9 and 4.10 lay out both formats and the two very " + "different CD routes; cassette and CD-R duplication are in the launch plant."), # ------------------------------------------ 4 anatomy of the plant H1("4. Anatomy of a top-notch plant: the full chain"), P("The chain from audio file to delivered record has nine stages and three points where the artist or " - "label must approve before work continues. Every stage writes to the traceability database, and " - "the instruments behind every check are specified in section 5. The chart on the next page shows " - "the whole chain; the table after it is the checklist of what a top-notch plant needs and where " - "this plan puts each item."), + "label must approve before work continues. Every stage records its events in ERPNext and its " + "machine data in the plant's data store, and the instruments behind every check are specified in " + "section 5. The chart on the next page shows the whole chain; the table after it is the checklist " + "of what a top-notch plant needs and where this plan puts each item."), PB(), IMG("process-flow.png", 138, "Figure 1. Process flow from audio file to delivered product, with every " "check and the three artist approval gates. Source: project repository."), @@ -244,161 +337,236 @@ def blocks(): H2("4.0 The checklist"), T(["What a top-notch plant needs", "Why it matters", "This plan", "When"], [ ["A quiet, vibration-free cutting room with a modern lathe", "The groove is born here; every " - "defect propagates to every record", "Agnew Analog Type 612 lathe and Type 602 head, " - "in-house at maturity; brokered through a European partner at launch", "Phase 5 (earlier if " - "demand shows)"], - ["In-house galvanics with zero-discharge water", "The regional bottleneck; enables repress in " - "days and short runs", "Digital Matrix plating line, clean room, evaporator-based water " - "recycling", "Phase 5; case for moving to phase 1 under review"], + "defect propagates to every record", "Sillitoe SDMS complete cutting system in-house; Agnew " + "Type 612 as the other candidate", "Launch plant, " + "commissioned first"], + ["In-house galvanics with zero-discharge water", "The regional bottleneck; enables represses in " + "days and short runs", "Pheenix Alpha line (PASU, PPPU, one PDPU, PMPB); evaporator-based " + "zero discharge and DI water in a treatment building next to it", + "Launch plant, commissioned first"], ["Stamper preparation machines", "Turns a raw nickel shell into a press-ready part", - "Sibert punch, back-finisher, coiner", "With galvanics"], - ["A mixed press fleet", "Automatic for volume, semi-automatic for colour and short runs", - "Newbilt Single growing to Duplex; two automatic presses (Pheenix AD12 or Newbilt Classic)", - "Phase 1, then 5"], + "Sibert back-finisher, punch, coiner (USD 250k budget confirmed)", "Launch plant, with " + "galvanics"], + ["A mixed press fleet", "Semi-automatic for colour and short runs, automatic for long runs", + "Newbilt Duplex system (2 presses, main + colour extruder) and one Newbilt Classic", + "Launch plant; second Duplex as growth option"], ["Steam, cooling and compressed air engineered locally", "The largest energy loads; efficiency " - "lives here", "Thai-sourced packages with heat recovery designed in", "Phase 1"], + "lives here", "Boiler hall and chiller compound for four modules each; 2 x 500 kg/h boilers and " + "2 x 250 kW chillers; heat recovery designed in", "Launch plant; modules added " + "with presses"], ["Whole-plant climate and particulate control", "Moisture and dust are the two classic record " - "defects", "20 to 26 °C, 35 to 60% RH, F7 to F9 filtration, HEPA in tight zones", "Phase 1"], + "defects", "20 to 26 °C, 35 to 60% RH, filtration for the burning season, tighter in clean " + "zones", "Launch plant"], ["Metrology for the metal parts", "Data-backed accept/reject before a stamper is mounted", - "Laser confocal, wide-area profiler, XRF thickness, inline vision", "Phase 5; basic at launch"], + "Laser confocal, wide-area profiler, XRF thickness, inline vision", "Launch plant (confocal " + "and profiler can follow " + "from revenue)"], ["Layered QC for every record", "Catch defects at line speed without playing every record", - "100% optical inspection, per-cycle telemetry, sampled audio comparison", "Basic at phase 1, " - "full at phase 5"], + "100% optical inspection, per-cycle telemetry, sampled audio comparison", "Launch plant"], ["Traceability from file to shipment", "Complaints resolve backwards; customers see their " - "order; machine data access is a purchasing condition", "Batch genealogy database, PLC data " - "capture, customer portal", "Phase 1 (v1)"], + "order; machine data access is a purchasing condition", "ERPNext as the only system of record, " + "machine data keyed to it, customer " + "portal", "Launch plant (v1 before " + "the machines arrive)"], ["A materials lab", "PVC lots differ; a bad lot is a noisy run", "Per-lot gate: moisture, heat " - "stability, colour, density, granulate; release by test pressing", "Phase 1"], + "stability, colour, density, granulate; release by test pressing", "Launch plant (day-one " + "tier)"], ["A packaging partner and packaging QC", "Jackets are the path that slips; the wrong " "record in the right jacket is the classic error", "Ploy Printing (Chiang Mai) for jackets, " "sleeves, J-cards; matrix code scanned " - "against jacket barcode", "Phase 1"], - ["An archive for masters and mothers", "Irreplaceable metal; repress economics", - "Fire-rated, climate-controlled room with clean-agent suppression", "Phase 1"], + "against jacket barcode", "Launch plant"], + ["An archive for fathers and mothers", "Irreplaceable metal; repress economics", + "Father and mother of every side; fire-rated, climate-controlled room, clean-agent suppression, " + "mobile shelving (to quote)", "Launch plant"], ["Renewable energy and closed-loop water", "Cost, resilience, brand, BOI tax value", - "~290 kWp PV, 271 kWh battery, closed cooling loop, zero process discharge", "Phase 1 to 2"], + "~247 kWp roof PV, 271 kWh battery, closed cooling loop, zero process discharge", "Launch plant " + "(PV possibly " + "through a " + "solar PPA)"], ["Trained people and a safety program", "Steam at 10 bar, hydraulics at 180 bar, plating " - "chemistry", "Vendor commissioning training, in-house program, PPE, clean rooms", "Phase 1"], + "chemistry", "Vendor commissioning training, in-house program, PPE, clean rooms", "Launch plant; " + "galvanics " + "hiring first"], + ["An ordering platform for every customer", "Short runs need a channel; transparency is the " + "brand", "Itemised price calculator, upload checks, fan-funded campaigns (section 4.8)", + "Calculator early; campaigns after first releases ship"], ["Cassette and CD lines", "Same customers, one order, one shipment", "In-house cassette " - "duplication; CD-R duplication; CD replication as a separate option", "Phase 1 (replication " - "if chosen: phase 2)"], + "duplication; CD-R duplication; CD replication as a separate option", "Launch plant " + "(replication only if " + "chosen)"], ], widths_mm=[40, 45, 55, 30], font_pt=8.5), H2("4.1 Mastering and lacquer cutting"), P("**What happens.** A mastering engineer prepares the audio for vinyl (levels, side length, " "low-frequency handling), then a cutting lathe drives a heated stylus into a lacquer-coated " "aluminium disc, cutting the groove in real time. The lacquer is soft nitrocellulose: heat- and " - "shock-sensitive, and it wants plating within one to three days. Lacquers do not travel well."), + "shock-sensitive, and it wants plating within one to three days. Lacquers do not travel well, " + "which is the reason to cut and plate under the same roof."), P("**What it needs.** A disk mastering lathe and stereo cutter head, matched cutting amplifiers, a " - "mastering console and chain, a preview and pitch automation system, vacuum for platter hold-down " + "mastering console and chain, monitoring, pitch and depth automation, vacuum for platter hold-down " "and chip suction, a groove inspection microscope, and a low-vibration, temperature-controlled " "room away from the presses and compressor. Consumables are lacquer blanks and styli."), - P("**Who supplies it.** Agnew Analog Reference Instruments (Greece) builds the Type 612 lathe, " - "unveiled in 2023 and billed as the first all-new lacquer lathe since the 1960s, with the Type 602 " - "cutter head; bespoke, low-volume manufacturing with long build times. Cutter amplifiers, console, " - "preview automation and lacquer supply are open items."), - P("**Cost and phasing.** Estimated USD 290k to 580k for the room (bespoke market, no public " - "pricing). At launch, mastering is done by an external engineer and cutting is brokered through " - "Stamper Discs' European partners, so that the lacquer is cut and plated in the same region and " - "only nickel travels. Mastering is labour-bound: an engineer masters perhaps two to four songs a " - "day, which caps the title-services line and is discussed in section 9."), + P("**Who supplies it.** The plan is a **Sillitoe Disk Mastering System (SDMS)** from Sillitoe Audio " + "Technology (Australia), a complete cutting system rather than a bare lathe: direct-drive " + "turntable with a vacuum platter for 7- to 14-inch disks, a feedback cutterhead, a 350 W per " + "channel cutting amplifier, vacuum and a groove microscope in the box. Its Space / Time Control " + "software computes a virtual groove from the audio before anything is cut and drives pitch, depth " + "and head lift automatically (vendor claim: no capacity tests or dry runs). It also exports a cue " + "sheet, an open-format groove file and stylus hours, which the cutting record in ERPNext can " + "attach instead of manual entry. The weaknesses: it is a closed system (the head works only with " + "Sillitoe's amplifier and is factory calibrated), the install base is small, and service depends " + "on one small company, so a spare cutterhead and support terms belong in the quote. **Agnew " + "Analog** (Greece) and its Type 612 lathe, billed as the first all-new lacquer lathe since the " + "1960s, is the other candidate: bespoke, unpublished price, long build times, with amplifiers and " + "automation sourced around it. Used lathes and complete used studios exist too, through contacts " + "OMS passed on; any of them is compared as a whole room."), + P("**Cost and people.** The cutting-room block is an estimated USD 200k to 350k (THB 6.6M to " + "11.6M): the SDMS at its published list price of USD 125k (ex tax and shipping, built to order), " + "plus a spare cutterhead and support, the mastering console and chain, monitoring and the room " + "build-out, all estimates. A cutting engineer earns about 50,000 THB a month base (team figure). " + "Mastering is labour-bound: an engineer masters perhaps two to four songs a day, which caps the " + "title-services line (section 9). Payap University wants joint student programmes in mastering " + "and lathe cutting, a possible future source of trained people. SST in Frankfurt, which already " + "cuts Poy Records' lacquers, stays a contact for overflow or a slipping commissioning, not part " + "of the plan."), H2("4.2 Galvanics: silvering and electroforming"), P("**What happens.** The lacquer is cleaned and sprayed with a conductive silver layer, then " "electroplated with nickel to grow a negative metal copy, the 'father'. From the father a positive " - "'mother' is grown (playable, and archived), and from the mother the working 'stampers' that go " - "into the press. This three-step process means a fresh stamper can be pulled from an archived " - "mother in a day or two; a cheaper one-step stamper is single-use and a repress restarts at " - "cutting."), - P("**Why it is the key to the region.** No plating capability has been found in Thailand; the one " - "operating plant buys its stampers abroad. Every title in the country therefore waits on an " - "overseas order, which is the most plausible cause of the incumbent's lead-time penalty on larger " - "runs and its inability to take small ones. Bringing cutting and plating in-house takes an " - "estimated 1.5 to 5 weeks out of the lead time and USD 175 to 665 per title out of the cost, and " - "it is the one capability nobody in the country has."), + "'mother' is grown (playable), and from the mother the working 'stampers' that go into the press. " + "This three-step process means a fresh stamper can be grown from an archived mother in a day or " + "two; a cheaper one-step stamper is single-use and a repress restarts at cutting. The plant keeps " + "the father **and** the mother of every side in its archive, so a worn mother is regrown from the " + "father without a recut."), + P("**Why it is the key to the region.** We have found no plating capability in Thailand; the one " + "plant we have seen buys its stampers abroad (a desk check of Thai electroforming capacity is " + "still to be done). Every title it presses therefore waits on an overseas order, which is the most " + "plausible cause of its lead-time penalty on larger runs and its inability to take small ones. " + "Bringing cutting and plating in-house takes an estimated 1.5 to 5 weeks out of the lead time and " + "USD 175 to 665 per title out of the cost."), P("**What it needs.** A lacquer cleaning and silvering station, a low-stress nickel pre-plate, " - "production electroforming cells for the three generations, an electro-clean and passivation " - "station, a clean room with controlled access, fume extraction and scrubbing, and a closed-loop " - "rinse-water treatment and metal recovery system. The chemistry (silver nitrate, nickel salts) " - "sets the safety and permitting requirements: decontamination procedures, PPE, locked chemical " - "storage, eyewash and emergency shower, and hazardous-substance registration."), - P("**Who supplies it.** Plating Power / Digital Matrix Corporation (New York) is the dominant " - "turnkey vendor for vinyl galvanics (silvering, pre-plate, multi-cell electroforming, " - "passivation). They supply no water treatment: the zero-discharge system comes from an industrial " - "water vendor (Veolia or Hydrotek in Thailand integrating an imported evaporator), following the " - "zero-discharge plating room at Gotta Groove Records in Ohio as the reference model."), - P("**Cost and phasing.** Estimated USD 320k to 650k for the plating line plus USD 90k to 240k for " - "the water plant, plus a clean room. At launch, press-ready stampers come from Stamper Discs " - "(Sheffield, UK), a trade galvanics service that makes stampers to fit Newbilt moulds and ships to " - "30+ countries, under a written turnaround agreement. The roadmap places in-house galvanics in " - "phase 5, but the August 2026 market evidence argues for costing an earlier start: it addresses " - "the market's actual bottleneck, it is a fraction of the full capital, and it could earn from the " - "incumbent's own presses before CNX's press hall exists. Section 11 sets out that question."), + "production electroforming cells for the three generations, a passivation and cleaning bench, a " + "clean room with controlled access, fume extraction, DI water, and a closed-loop rinse-water " + "treatment and metal recovery system. The chemistry (silver nitrate, nickel salts) sets the safety " + "and permitting requirements: decontamination procedures, PPE, locked chemical storage, eyewash " + "and emergency shower, and hazardous-substance registration. Because galvanics is now in the " + "launch plant, the site's zoning and the first factory licence have to allow electroplating from " + "the start."), + P("**Who supplies it.** The plan is a **Pheenix Alpha** line (Sweden): the PASU automatic silvering " + "unit, the PPPU pre-plating unit (four masters at once), one PDPU dual plating unit (two cells, up " + "to 200 A each) and the PMPB passivation and cleaning bench. The plating units are PLC-controlled " + "with recipes and a network connection (the protocol is not stated; data access is a purchasing " + "condition). **Digital Matrix / Plating Power** (New York), the long-standing US turnkey vendor, " + "is the second turnkey candidate. **OMS** (Optical Media Services, Baarlo, Netherlands), named by " + "Sibert, is the third candidate and the price reference: EUR 224,000 for a basic and EUR 311,000 " + "for an advanced 4-cell wet room (installation and water treatment extra), 24 and 32 shells in an " + "8-hour day. No vendor supplies the water treatment: the zero-discharge evaporator and DI water " + "come from an industrial water vendor (an imported core unit with Thai integration), in a small " + "treatment building next to the galvanics room (proposed)."), + P("**How much line the plant needs.** Pheenix publishes no cycle times. Published plating practice " + "gives about 15 to 30 minutes for pre-plate, ~75 minutes for a father, about an hour for a mother " + "and ~45 minutes for a stamper (silvering and bench times are estimates). With loading and rinsing, " + "a cell turns a part in about 1 to 1.5 hours, so one PDPU makes 20 to 32 parts in a two-shift day " + "against 8 to 20 parts a working day even for the larger five-press fleet. **One PDPU covers the " + "demand; a second would buy redundancy, not capacity.** By OMS's rule of thumb (one person runs " + "about 20 stampers a day) that is one galvanics operator per shift."), + P("**Cost and risk.** Estimated USD 320k to 650k (THB 10.6M to 21.4M) for the Pheenix line, with no " + "Pheenix price on file; OMS's reference prices sit at the low end, and pricing near them is one of " + "the four budget levers. The zero-discharge and DI water plant adds an estimated USD 97k to 258k " + "and its building USD 52k to 87k. Galvanics is the hardest skill to hire and it is now on the " + "path to the first release, because the presses need its stampers. Sibert advised getting each " + "main step right and earning some return before every manufacturing step is in place; that advice " + "and the plan's answer to it are in sections 11.2 and 13. Stamper Discs (UK), a trade stamper " + "service, stays a contact for overflow or a slipping commissioning, not part of the plan."), H2("4.3 Stamper preparation"), - P("A raw electroformed shell is not yet a stamper. It is centre-punched to the press spindle, " - "back-finished flat, and trimmed and formed ('coined') to the mould. Sibert Instruments (UK, in " - "this niche since the early 1970s) makes the three machines: the VSP punch, VSF back-finisher and " - "VSC coiner. Estimated USD 60k to 170k, pricing unpublished, bought together with the galvanics " - "line. Concentricity and dimensional checks after each step feed the traceability record."), + P("A raw electroformed shell is not yet a stamper. It is back-finished flat, centre-punched to the " + "groove, and formed ('coined') to the mould. Sibert Instruments (UK, in this niche since the early " + "1970s) makes the three machines, run in that order: the **VSF** back-finisher, the **VSP** punch " + "and the **VSC** coiner, which forms the centre hole and the edge and punches the outer diameter " + "to size. Sibert confirmed in October 2026 that **USD 250k covers all three** (a budget " + "confirmation, with an itemised quotation to follow when we go ahead); its engineer's time, spare " + "parts, shipping and travel are extra and sit in the freight and spares lines. The machines run " + "on single-phase power and compressed air, weigh 200, 250 and 1,000 kg, and stand in a row about " + "5.0 x 0.8 m. They list no data interface, and centring on the punch is manual under x100 optics, " + "so the concentricity check after it stays and feeds the traceability record. Sibert also builds " + "a fully automatic punch (VSPa) and has offered to carry some of its features across to the VSP; " + "which ones is a question for the quotation. The coiner needs tooling per mould type, which the " + "press vendor has to specify. The back-finisher's water carries nickel fines and goes to the " + "galvanics treatment, never the drain. Stamper prep is planned in one clean zone with galvanics."), H2("4.4 Pressing"), P("**What happens.** An extruder melts PVC compound into a 'patty', which is placed with two labels " "between two stampers in a steam-heated mould. The press closes at about 150 tonnes, the mould is " - "then water-cooled, and the record is ejected and trimmed. A cycle takes about 25 to 30 seconds on " - "an automatic press; on a semi-automatic press an operator handles the patty and the record, which " + "then water-cooled, and the record is ejected and trimmed. A cycle takes about 28 seconds on the " + "automatic Classic; on a semi-automatic press an operator handles the patty and the record, which " "is slower but is exactly what colour, splatter and special editions need. The labels are pressed " "into the record, not glued on afterwards: they are pre-dried in an oven (moisture in a label " "causes bubbles) and loaded with the patty every cycle, and the label lot is logged per cycle."), - P("**The fleet strategy: 50/50.** Half the fleet fully automatic for standard volume, half " - "semi-automatic for effects, special editions and small runs, where an operator working the mould " - "directly is an advantage rather than a cost."), + P("**The fleet: all Newbilt, semi-automatic first.** The semi-automatic side carries most of the " + "volume: splatter, marble and other colour effects, special editions and small runs are where an " + "operator working the mould is an advantage rather than a cost, and the colour extruder on the " + "Duplex adds the second colour strand. The Classic takes the long standard runs. Classic and " + "Duplex share mould inserts, so the plant runs one mould family, one set of spares and one service " + "relationship; the cost is a single-vendor dependency."), T(["Machine", "Role", "Basis", "Cost"], [ - ["Newbilt Single 2.1 system (Alsdorf, Germany)", "Launch line: VEX 50 extruder, HRP 12 " - "hydraulic press (~150 t), 12-inch book mould set for 140/180 g, Vario trimmer (7/10-inch " - "upgrade path), label dry oven, shrink wrapper, PVC grinder, label punch, spindles and plates. " - "Hydraulics already sized for a second press.", "Quoted: EUR 200,500 (~USD 232k, ~THB 7.7M) " - "including sea freight and packaging, June 2024, " - "expired; re-quote required with build time and " - "order-book position", "USD 230k to 260k"], - ["Duplex expansion", "Second press and extruder on the same hydraulic aggregate", - "Quoted option", "~USD 115k"], - ["Two fully automatic presses", "Volume production, one operator per four presses. Candidates: " - "Pheenix Alpha AD12 (Sweden, successor of Toolex Alpha, 24 to 26 s cycle, ~140/h, 25 kW, " - "closed platen cooling) or Newbilt Classic 12-inch (28 s cycle, ~128/h, built-in extruder, " - "Siemens PLC with OPC UA, vendor-claimed 95% yield and uptime)", "Estimate: ~USD 340k per " - "press indicative, unverified, " - "plus delivery and commissioning", - "USD 580k to 920k"], - ], widths_mm=[36, 74, 40, 20], font_pt=8.5), - P("**What Newbilt deliberately excludes**, and what will be engineered and sourced in Thailand: a " - "~400 kg/h steam generator at 10 bar / 180 °C with water treatment, and a ~250 kW cooling system. " - "These are the two largest energy systems in the plant and the reason the efficiency architecture " - "in section 5.4 is ours to design."), - P("**Site requirements.** Roughly 200 m² of production floor for the Duplex, 32 kVA connected load, " - "saturated steam, compressed air and cooling circuits, and side rooms for materials, compressor, " - "chiller and finished goods. A press weighs 1,350 kg on under one square metre, so the floor slab " + ["Newbilt Duplex system (Alsdorf, Germany)", "Two HRP 12 hydraulic presses (~150 t), EX 50 main " + "extruder and EX 35 colour extruder, 12-inch book moulds for 140/180 g, trimmer, label dry oven, " + "shrink wrapper, PVC grinder, label punch, spindles and plates; one operator's cell", + "Quoted: EUR 200,500 (~USD 232k) for the Single 2.1 system incl. sea freight, June 2024, plus " + "the quoted second press and extruder (~USD 115k); expired, re-quote required with build time", + "USD 350k to 370k (THB 11.6M to 12.2M)"], + ["Newbilt Classic", "Fully automatic press with built-in extruder, automatic patty, label and " + "record handling; 28 s cycle, ~128 records/h at 180 g; Siemens safety PLC with OPC UA; " + "vendor-claimed 95% yield and uptime", "Estimate: placeholder band; **no Newbilt price on " + "file**", "USD 290k to 460k (THB 9.6M to 15.2M)"], + ["Second Duplex system (growth option)", "Two more semi-automatic presses on the same central " + "hydraulics; floor, utility positions and ring-main tees reserved", "Estimate; not in the " + "investment", + "~USD 230k to 300k"], + ], widths_mm=[34, 66, 42, 28], font_pt=8.5), + P("The Pheenix Alpha AD12 automatic press left the plan in October 2026 and stays the comparison if " + "the Classic re-quote disappoints."), + P("**What Newbilt deliberately excludes**, and what is engineered and sourced locally: steam and " + "cooling. At Newbilt's per-machine figures the three presses draw about 450 to 540 kg/h of steam " + "at 10 bar / 180 °C and up to ~390 kW of cooling on a hot afternoon (estimates; the Classic is " + "counted as one press and extruder until Newbilt states its own figures). They are met by **two " + "500 kg/h boiler modules and two 250 kW chiller modules**, in a boiler hall and an open chiller " + "compound built for four modules each; a second Duplex adds a third chiller module, and the fourth " + "positions are reserve and growth. The presses share one central hydraulic plant and one " + "compressed-air plant through ring mains with a valved tee at every press position, so a new press " + "is connected without stopping the others; the standby pump set, accumulators and ring main are " + "not yet costed. These are the largest energy systems in the plant and the reason the efficiency " + "architecture in section 5.4 is ours to design."), + P("**Site requirements.** Roughly 200 m² of production floor per Duplex system and an estimated 50 " + "to 75 m² for the Classic, saturated steam, compressed air and cooling circuits, and side rooms for " + "materials and finished goods. A press weighs 1,350 kg on under one square metre, so the floor slab " "must carry several tonnes per square metre and is a building-selection criterion; the floor must " "be flat, non-slip and solvent-resistant."), - T(["Phase", "Fleet", "Rough output per year"], [ - ["Launch", "1 semi-automatic press, 1 shift", "~90,000 to 135,000 records"], - ["Duplex", "2 semi-automatic presses, 1 to 2 shifts", "~175,000 to 540,000 records"], - ["Mature", "2 semi-automatic + 2 automatic (50/50 fleet), 2 shifts", "~1.0 to 1.5 million " - "records"], - ], widths_mm=[25, 80, 65], - caption="Basis: AD12 ~140 records/h (datasheet); semi-automatic 60 to 80/h assumed; 16 h/day, " - "300 days/yr, 60 to 70% overall equipment effectiveness. Theoretical ceiling of the mature " - "fleet at 100% uptime is 1.9 to 2.1 million."), - P("**On the 60 to 70% effectiveness figure.** Newbilt publishes 95% yield and 95% uptime for its " - "automatic press. We have not adjusted the plan on that basis, deliberately: a vendor's machine " - "uptime excludes stamper and mould changes, colour changeovers, compound lot changes, " - "first-article QC and breaks, which are exactly the losses that dominate a short-run boutique " - "plant. Both press vendors are being asked for the basis of their figures as part of the " - "re-quote. If they hold, they argue for a higher effectiveness on the automatic half only."), + T(["Stage", "Fleet", "Rough output per year"], [ + ["Launch plant", "1 Duplex system (2 semi-automatic) + 1 Classic, 2 shifts", + "~0.71 to 0.97 million records"], + ["Growth option: second Duplex", "4 semi-automatic + 1 Classic, 2 shifts; room reserved, not in " + "the investment", "~1.0 to 1.5 million records"], + ["Expansion option", "The five-press fleet plus up to ten more Classics; a utility phase of its " + "own", "~4.7 to 5.8 million records (estimate)"], + ], widths_mm=[40, 80, 50], + caption="Basis: semi-automatic 60 to 80 records/h assumed; Classic ~128/h (vendor flyer); 16 h/day, " + "300 days/yr, 60 to 70% overall equipment effectiveness. The launch plant is 248 to 288 " + "records/h at nameplate, ~149 to 202/h after effectiveness; the press fleet calculator at " + "the team's planning rates gives ~0.94 million. Neither option is in the revenue model " + "or the investment."), + P("**On the 60 to 70% effectiveness figure.** Newbilt publishes 95% yield and 95% uptime for the " + "Classic. We have not adjusted the plan on that basis, deliberately: a vendor's machine uptime " + "excludes stamper and mould changes, colour changeovers, compound lot changes, first-article QC " + "and breaks, which are exactly the losses that dominate a short-run boutique plant. It would also " + "apply only to the Classic, because the semi-automatic rate already includes operator handling. " + "Newbilt is being asked for the basis of its figures as part of the re-quote; if they hold, they " + "argue for a higher effectiveness on the Classic only."), H2("4.5 Finishing, packaging and fulfilment"), P("After pressing, records are trimmed inline, sleeved, assembled into jackets, shrink-wrapped and " - "packed. " + "packed; edge trim and rejected records go back through the label punch and grinder as regrind. " "Jackets, sleeves, inserts, J-cards and CD packaging come from **Ploy Printing** (Ploy Karnpim " "Limited Partnership, Pa Daet, Mueang Chiang Mai), an established print house with offset, " "digital, risograph, UV inkjet and latex inkjet presses and vinyl packaging production. That " @@ -412,14 +580,16 @@ def blocks(): "**Packaging is the path that slips.** Printed jackets need 10 to 20 working days from approved " "artwork. The metal path and the packaging path run in parallel and converge at assembly; when " "a label delivers artwork late, jackets become the critical path and every day saved on " - "metalwork is wasted. Artwork deadline is therefore contracted as a fourth approval gate.", + "metalwork is wasted. Artwork deadline is therefore contracted as a fourth approval gate, and " + "the ordering platform checks artwork against our templates at upload (section 4.8).", "**The wrong record in the right jacket is the classic error**, and a misprinted barcode is a " "rejected delivery at the distributor. Each jacket is scanned against the runout matrix code of " "the record going into it, and every unit's barcode is verified.", ]), P("**Fulfilment** covers bulk pallet delivery to labels and distributors, and dropshipping single " - "parcels directly to end customers on behalf of labels and artists with carrier tracking recorded " - "per shipment. Dropshipping fees are charged per parcel and are not in the revenue model."), + "parcels directly to end customers on behalf of labels and artists (one parcel per fan for a " + "fan-funded campaign), with carrier tracking recorded per shipment. Dropshipping fees are charged " + "per parcel and are not in the revenue model."), H2("4.6 Materials: PVC compound"), P("Records are pressed from a vinyl chloride / vinyl acetate copolymer compound, about 150 to 160 g " @@ -428,29 +598,66 @@ def blocks(): "current supplier list is European (Netherlands, UK, Italy, France, Germany) with one US option; " "the preference is a qualified Thai or regional compound if it meets record specifications, " "which cuts freight, cost and footprint. The incumbent's floor was stacked with sacks marked " - "'Made in Thailand', a lead worth following. Every incoming lot passes the material lab gate in " - "section 5.3 before it is released to a press."), + "'Made in Thailand', a lead worth following. Special designs will run in tens of colours, so the " + "plan keeps a racked colour store, with outdoor silos proposed for black and the standard colours. " + "Every incoming lot passes the material lab gate in section 5.3 before it is released to a press."), H2("4.7 The order, end to end: what a customer is promised"), P("A defensible lead time is not the sum of process steps: it carries queue and buffer, and it is " "quoted from the last customer approval, because a plant cannot be held to a clock the customer " - "keeps stopping. The plan's quotable lead times, from test-pressing approval:"), + "keeps stopping. With cutting and plating in-house from the start, there is no external metal " + "block in any of these quotes. The plan's quotable lead times, from test-pressing approval:"), T(["Order type", "Quoted lead time", "Basis"], [ - ["New title, full service, launch configuration (bridge stampers from the UK)", "10 to 14 " - "weeks", "Stage sum plus the external metal queue plus buffer; at parity with the 10 to 16 " - "weeks reported for EU/US plants, but closer and in the customer's time zone"], - ["New title, full service, mature configuration (cutting and plating in-house)", "7 to 9 " - "weeks", "Removes 13 to 27 days of outsourced metal plus freight"], + ["New title, full service (cutting, plating and pressing in-house)", "7 to 9 weeks", + "Stage sum of 11.5 to 22 plant days plus queue and buffer; Record Industry (NL) quotes 9 to 11 " + "weeks after test-pressing and artwork approval; EU/US plants are reported at 10 to 16 weeks"], ["Customer supplies jackets", "1 to 2 weeks less", "Removes the print path"], - ["Repress from an archived mother, no changes", "2 to 3 weeks", "Pull stamper (1 to 2 days), " - "prep, press, finish; the highest-margin order the plant will take"], + ["Repress from an archived mother, no changes", "2 to 3 weeks", "Grow a stamper from the mother " + "(1 to 2 days), prep, press, finish: about 7 to 11 working days in the plant; the highest-margin " + "order the plant will take"], ["Rush slot", "Premium, capped per month", "Only credible with reserved capacity"], - ], widths_mm=[62, 28, 80]), + ], widths_mm=[62, 28, 80], + caption="Estimate: planning figures from the stage table; no order has run through this plant."), + P("Draft 0.1 quoted 10 to 14 weeks for the launch, when stampers were to come from the UK; that row " + "is gone. The figures above are still planning numbers: the first months will run slower while " + "the reject rate settles, which is why fan-funded campaigns open only after the first releases " + "have shipped and lead times are measured."), P("Lead time is a capacity decision, not a process decision. A plant running at 90% quotes 16 weeks " "with the same equipment that quotes 6 weeks at 50%. Any turnaround promise to the market is a " "promise to hold spare capacity, and the revenue model in section 9 is built on that basis."), - H2("4.8 Cassette duplication (new scope)"), + H2("4.8 The artist platform: ordering and fan-funded pressing"), + P("Short runs need a channel, and the plant's transparency needs a front door. The artist platform is " + "a web service where anyone who wants records made, from a bedroom artist to a label, configures a " + "record and gets a **transparent, itemised offer**: what every line costs, which costs are per " + "title and which per copy, how the price per copy falls with quantity, and when it ships. Two " + "clickable demos of it exist, one detailed and one built for investors."), + B([ + "**Calculator and uploads.** Format, weight, colour, labels, jacket with a 3 or 5 mm spine, " + "extras, mastering and test pressings, priced from one price list that also drives the invoice " + "in ERPNext. The master files are checked within minutes (format, sample rate, clipping, side " + "length against the format); artwork is checked against downloadable jacket and label templates " + "(size, spine, bleed, resolution, colour) and can be delivered as PDF, Illustrator (AI) or image " + "files.", + "**Fan-funded campaigns.** The artist sets a fan price and shares a campaign page; fans pre-order " + "their copy. The goal is the larger of a minimum campaign run (100 copies as the planning figure) " + "and the artist's break-even. Fans pay into a **ring-fenced account** that is never working " + "capital, and are refunded automatically if the goal is missed; CNX is the seller of record. The " + "rule comes from Qrates, a crowdfunded pressing platform whose service was suspended with funded " + "projects caught in the wind-down. A Thai legal opinion comes before the first campaign.", + "**Timing.** The calculator goes public early with indicative prices and an interest list but no " + "payments: every configuration is a data point on the run sizes people actually want, which is " + "the open question in market validation. Campaigns open **only after the first paying releases " + "have shipped** and lead times are measured; no fan money is taken against a plant that has not " + "yet delivered.", + ]), + P("In the platform's illustration, a fan price of 1,200 THB breaks even at about 41 copies, so the " + "100-copy minimum sets the goal (an example, not a recommendation). The public side is an estimated " + "USD 40k to 90k, inside the software block of the investment; it runs on the plant's own server " + "fleet, with a payment provider as the only outside service. Its name is undecided (under CNX " + "Vinyl, Poy Records or a brand of its own)."), + + H2("4.9 Cassette duplication"), P("**What happens.** A studio master is duplicated onto tape either in real time on a bank of decks, " "or at high speed on a loop-bin duplicator that copies a running master loop onto reels of blank " "tape ('pancakes') many times faster than real time. The tape is then loaded into empty cassette " @@ -475,10 +682,13 @@ def blocks(): "(National Audio Company in the US is the largest tape source; shell moulders exist in China and " "should be sought in Thailand). Supply risk is real and the plan is to hold stock. **Positioning:** " "cassettes are a boutique add-on for the same indie customers, with shells in colours that match " - "the record. **Effect on the plan:** schedule-neutral; fits inside the building programme; add " - "the activity to the BOI application; recommended to start at tier A or a small tier B in phase 1."), + "the record. **Effect on the plan:** in the launch plant, starting at tier A or a small tier B; " + "cassette and CD-R together are one estimated block of USD 55k to 190k in the investment; " + "schedule-neutral; fits inside the building programme; the activity goes into the BOI " + "application. Moving both later is one of the scope cuts that would be needed to approach " + "180M THB."), - H2("4.9 CD: two very different routes (investor decision)"), + H2("4.10 CD: two very different routes (investor decision)"), P("'CD manufacturing' can mean two things that differ by two orders of magnitude in capital, and the " "investor is asked to choose."), T(["", "Option A: CD-R duplication", "Option B: CD replication"], [ @@ -494,7 +704,7 @@ def blocks(): "metalliser, lacquer coater and scanner, screen or offset disc printer, " "packaging automation, ISO 7/8 clean room"], ["Throughput", "~200 to 800 discs per day per unit", "~10,000 to 30,000 discs per day per line"], - ["Space", "~20 to 40 m²", "~300 to 600 m² plus clean room; realistically the phase 2 building"], + ["Space", "~20 to 40 m²", "~300 to 600 m² plus clean room; realistically the second building"], ["Capital", "USD 15k to 40k", "USD 1.5M to 4.0M (new-build lines); used lines from closed " "plants can halve that at higher risk"], ["Staff", "Shared with cassette line", "6 to 10 across shifts, including a process engineer"], @@ -513,12 +723,12 @@ def blocks(): ], widths_mm=[24, 68, 78], font_pt=8.5, caption="Estimate throughout. Option B figures are order-of-magnitude and would need a dedicated " "feasibility study."), - P("**Recommendation.** Include Option A in phase 1: it is cheap, schedule-neutral, and serves the " + P("**Recommendation.** Option A is in the launch plant: it is cheap, schedule-neutral, and serves the " "plant's customers. Treat Option B as a separate project with its own market study, because CD " "replication is a mature, competitive, declining business outside Asia's strongholds and would " "add USD 1.5M to 4.0M and a second building to a plan whose vinyl economics do not depend on it. " "If the investor wants Option B, the decision must be taken before the BOI application is filed " - "(section 7), and the phase 2 building should be designed for it. This plan's totals include " + "(section 7), and the second building should be designed for it. This plan's totals include " "Option A only; Option B is shown as a separate line."), ] return out diff --git a/docs/business-plan/build/content_b.py b/docs/business-plan/build/content_b.py index 2349e08..d71aa4f 100644 --- a/docs/business-plan/build/content_b.py +++ b/docs/business-plan/build/content_b.py @@ -1,4 +1,5 @@ -"""Part B: what makes it top-notch (traceability, metrology, QC, efficiency); site and building; BOI.""" +"""Part B: what makes it top-notch (traceability, metrology, QC, efficiency); site and building; +regulatory (BOI and licences). Draft 0.2, October 2026.""" from plan_lib import H1, H2, H3, P, B, N, T, KV, IMG, CALL, PB @@ -12,36 +13,90 @@ def blocks(): "capabilities are what a regional customer cannot buy today and what justifies export-grade " "pricing. None of it is exotic: the instruments exist, the data interfaces exist, and the " "engineering is well understood. What is unusual is putting all of it in one plant from the " - "start rather than bolting it on later."), + "start rather than bolting it on later. The launch plant makes that possible: with the cutting " + "room and galvanics in-house from the first release, the whole chain from lacquer to box runs " + "through our own floor, with no bought-in stamper whose history we cannot see."), H2("5.1 Traceability: every record knows its history"), P("Every step of production is logged continuously, so that every record is traceable end to end " - "for the customer. This is a fixed requirement, and it is the core specification for the factory " - "software the project will build. The natural identity of a record is **stamper ID + press ID + " - "cycle timestamp + side**, and everything else hangs off that key."), + "for the customer. This is a fixed requirement and the core specification for the plant's " + "software. The identity of a record is **stamper + press + cycle timestamp + side**, and " + "everything else hangs off that key."), + P("**It is also the part of the plan the industry responds to.** At Making Vinyl Europe 2026 in " + "Haarlem most people the team talked to were strongly interested in full traceability. For " + "Sibert's representative it was one of the reasons to talk to a newcomer at all: without it he " + "would have advised strongly against the plan, and seeing buildfor.life's software and data " + "work told him the project comes from the right direction. That is supplier feedback, not buyer " + "price validation, which is still open; but it shows where a newcomer's credibility comes from, " + "and why the data side leads in every supplier and investor conversation."), T(["Stage", "What is recorded"], [ - ["Audio intake", "File received, checksums, versions, who handled it, approval trail"], - ["Mastering", "Session log, engineer, settings, customer approvals"], - ["Cutting", "Lacquer IDs, lathe parameters, stylus used, inspection result, dead-wax matrix " - "scribe"], - ["Galvanics", "Silvering and plating batch IDs, bath chemistry logs, father/mother/stamper " - "genealogy (which stamper came from which mother from which father), or the " - "external supplier and batch if bridged"], - ["Pressing", "Press ID, operator, shift, mould and stamper IDs, per-cycle temperatures, " - "pressures and cycle time, PVC compound lot and virgin/regrind mix, label lot"], - ["Quality control", "Test-pressing approvals, inspection results, reject counts and reasons"], - ["Finishing and packaging", "Trimming, sleeving, carton lot, packaging partner batch"], + ["Audio intake", "File received, checksums, versions, who handled it, approval trail; the files " + "themselves sit in an encrypted, access-logged client vault"], + ["Mastering", "Session log, engineer, settings, the artist's approvals at the master-plan and " + "master gates"], + ["Cutting", "Lacquer serial, lathe parameters and the Sillitoe lathe's own session files (cue " + "sheet, groove export, stylus hours), microscope check, dead-wax scribe"], + ["Galvanics", "Silvering and plating bath IDs, rectifier current and ampere-hours, bath " + "chemistry, father/mother/stamper genealogy (which stamper came from which mother " + "from which father); all in-house from launch"], + ["Stamper preparation", "Back-finish, punch and coin as station check-ins (the Sibert machines " + "have no data interface); the punched centre slug kept as the stamper's " + "test coupon"], + ["Pressing", "Press, operator, shift, stamper serials, per-cycle temperatures, pressures and " + "cycle time, PVC compound lot and virgin/regrind mix, label lot"], + ["Quality control", "Optical result for every record, audio score for every sampled record, " + "test-pressing approval, reject counts and reasons"], + ["Finishing and packaging", "Trimming, sleeving, carton and sleeve lots; every unit's dead-wax " + "code checked against its jacket barcode"], ["Fulfilment", "Warehouse location, shipment or dropshipping consignment, carrier tracking per " "end customer"], + ["Archive", "Father and mother of every side, with box and shelf position"], ], widths_mm=[38, 132]), - P("**Principles.** Log at the source: machine data comes from the machine (press PLCs, plating " - "rectifiers, the AD12's remote monitoring), never from manual transcription; manual steps get a " - "simple operator check-in. Batch and genealogy first: every physical artefact (lacquer, father, " - "mother, stamper, press run, box) gets an ID and knows its parents. Environment attached: the " - "plant's temperature, humidity and particulate logs sit on the same timeline, so any production " - "window can be correlated with plant conditions. Immutable and retained: logs are append-only " - "and kept for the life of the customer relationship; stamper genealogy for as long as the archive " - "holds the metal."), + H3("How it is built: one system of record, machine data beside it"), + P("**ERPNext is the plant's only system of record** (decided October 2026). ERPNext is an " + "open-source ERP with no licence fee. Every record of the business and of production lives in " + "it: customers, prices, orders and the three artist approval gates, invoices and payments, stock " + "and compound lots, work orders and job cards, quality inspections, and the serial number of " + "every lacquer, father, mother and stamper with its parent. What the project builds are tools " + "and interfaces that read and write ERPNext: station kiosks, the customer portal, the artist " + "platform, instrument adapters and reports. None of them keeps business records of its own, so " + "a trace and an invoice always point at the same order."), + P("**Machine data stays beside it, keyed to it.** What machines produce at machine speed " + "(per-cycle press rows, the optical result of every record, audio captures, instrument raw files, " + "1 Hz time series of temperatures, energy and water) is too much for an ERP. It lives in a " + "machine-data store on the plant's core server, every row carrying the ERPNext job card, batch " + "and serial number it belongs to; ERPNext receives totals and verdicts per run, lot and shipment. " + "Rows are written once and never changed (append-only, each event carrying the hash of the one " + "before), and corrections are new entries that reference the old, so the record a customer sees " + "can be trusted."), + P("**It runs on a fleet B4L already operates.** Every plant server is a NixOS machine declared in " + "B4L's existing fleet repository (its clan), so a failed machine is rebuilt from the repository " + "instead of by hand, and the plant reuses the fleet's mesh network, DNS, monitoring and backups " + "instead of building them again. The factory application (cnx-factory, its own repository) uses " + "the Rust web stack B4L already runs for its other tools. Vendor instrument PCs stay appliances " + "that export into this estate and host nothing of ours. The plant runs without the internet: a " + "WAN outage stops only the customer portal, off-site backup and remote support, which catch up " + "when it returns."), + P("**Machine data access is a purchasing condition.** Every equipment RFQ carries a data clause: " + "for the presses, OPC UA (or Siemens S7) read access licensed and enabled, the full tag list " + "with the cycle counter as a tag, and no vendor cloud agent as a warranty condition; for the " + "boilers, chillers and compressor, Modbus with the register map delivered; for the air " + "conditioning, BACnet or Modbus read access to the building management system. The question is " + "free before a purchase order and expensive after it."), + B([ + "**Log at the source.** Machine data comes from the machine, never from transcription; manual " + "steps get a badge tap and a scan at a station kiosk, not paperwork.", + "**Counters, not clocks.** Every press cycle carries the press's own cycle counter and every " + "measurement the serial of the part it was read from; wall-clock time is recorded, but two " + "systems are never joined on it.", + "**Environment attached.** Temperature, humidity and particulates of every zone are logged on " + "the same timeline, and each press cycle carries a snapshot of them.", + "**Operators see it first.** Every live value is shown at the station where it can change the " + "next cycle before it becomes a report. Sibert's advice after Haarlem was exactly this: " + "feedback loops the staff use to improve production decide whether a plant succeeds.", + "**Kept as long as it matters.** Logs for the life of the customer relationship; genealogy for " + "as long as the archive holds the metal.", + ]), P("**Identity travels with the product.** The matrix code scribed into the lacquer's dead wax " "propagates through father, mother and stamper to every pressed record. A small angular fiducial " "scribed beside it makes each part's rotation camera-readable at any stage, and lets the packing " @@ -49,26 +104,40 @@ def blocks(): "additionally get a laser-marked serial on the back, as the optical-disc industry marked its " "stampers; lacquers are never lasered (nitrocellulose is flammable) and records are never lasered " "(burning PVC releases hydrochloric acid)."), + P("**The metal archive.** Decided in October 2026: the father **and** the mother of every side are " + "archived. As a rule of thumb a mother yields about ten stamper sets and a father five to ten " + "mothers, so a worn mother is regrown from the father without recutting the lacquer, and a " + "repress years later starts from metal the plant already holds. The archive room gets mobile " + "shelving (section 6.2); every box and shelf position has an address, and each part's serial " + "number in ERPNext carries its location, so a repress order says which box to pull."), CALL("Why this is a product feature, not an internal file", [ - "**Customers see their order.** A per-order portal or report covers the full chain above, " - "without exposing other customers' data. Labels ask about pre-release security and provenance " - "before they send masters; this answers both.", + "**Customers see their order.** A per-order portal reads the customer's own records and machine " + "data, without exposing anyone else's: progress through the three gates, copies pressed so far, " + "the compound lot's lab certificate, the listening checks. The investor demo shows the per-copy " + "version, a 'record passport' reached from the code on the sleeve (IDs simulated). Labels ask " + "about pre-release security and provenance before they send masters; this answers both.", "**A complaint resolves backwards.** One noisy record resolves to its stamper, press, cycle, " "operator, compound lot and packaging lot, and from the stamper back through mother and father " "to the lacquer and the approved master. Root cause takes minutes, not a week of guessing.", "**Stampers retire on data.** Audio scores trending down against a stamper's play count become " "an automatic retirement signal instead of a customer complaint.", - "**Machine data access is a purchasing condition.** Newbilt, Pheenix Alpha and Digital Matrix " - "are asked which PLC interfaces they expose before a purchase order is signed. That question " - "is free now and expensive later.", + "**Represses start from the shelf.** The archive location of every father and mother sits on its " + "serial number, so a repress is a regrow, not a recut.", ]), - P("**Cost and build.** The traceability and factory software is estimated at USD 60k to 170k and " - "is a development project, not a purchase; no vendor sells a turnkey version. Version 1 (intake, " - "batch genealogy, press telemetry capture) is built during commissioning so the first test " - "pressings are already in the system. The project repository is the eventual home of this " - "software. Open design work: the data model across all stages, retention and PDPA handling for " - "operator-linked records, and whether test-pressing approval workflows live in the same system " - "from day one."), + P("**Cost and build.** The factory software is estimated at USD 60k to 170k, the ERPNext " + "implementation (configuration with Thai tax through Ecosoft's Thai localisation, the " + "integration, packaging for NixOS) at USD 15k to 50k, and the artist platform's public side at " + "USD 40k to 90k: the 115k to 310k software block in section 8 (estimates). No vendor sells a " + "turnkey version; it is a development project. Version 1 (intake, gates, genealogy, press runs " + "and cycles, the compound lot gate, packaging scan, shipments) goes live during commissioning, " + "and the network, servers and edge collectors go in before the machinery arrives, so vendor " + "engineers plug into a finished network and the first test pressings are already in the system. " + "Running it needs one automation and IT engineer from the build onward. Open design work: whether " + "the semi-automatic HRP 12 presses expose PLC data or need the priced sensor fallback (asked in " + "the Newbilt re-quote); how a press hands its cycle counter to the vision system; reading the " + "scribed dead-wax code with a camera on black and coloured vinyl (tested with samples first); " + "retention and PDPA handling for operator-linked records; Thai payroll and BOI raw-material " + "reporting in ERPNext."), H2("5.2 Metrology: measuring the metal before it presses a single record"), P("A stamper is a 0.2 to 0.3 mm nickel disc carrying a spiral ridge 40 to 80 microns wide and about " @@ -76,62 +145,77 @@ def blocks(): "is to check its thickness with a hand micrometer at ten points on sacrificial blanks, with " "nothing logged. A top-notch plant measures the metal without contact, per serial, and makes an " "accept or reject decision on data before the next plating generation or the press mounting."), - T(["Instrument", "What it measures", "How it is used"], [ - ["3D laser confocal microscope (Keyence VK-X class)", "Groove cross-section, wall roughness, " - "micro-defects; 20 nm vertical, ~120 nm lateral resolution, non-contact", "Sampled radial " - "zones (lead-in, outer, mid, inner) on fathers, mothers and stampers; scanning the full spiral " - "is not feasible and not needed. The optical-disc industry verified its nickel stampers with " - "this instrument class, so the technique transfers directly"], - ["Wide-area optical profiler (Keyence VR-6000 class)", "Form, flatness, gross defects; " - "0.1 micron height resolution, ~1 s per field, HDR mode for mirror-bright nickel", - "Fast whole-part mapping of every part"], + T(["Instrument", "What it measures", "How it is used", "When"], [ ["XRF thickness gauge (Fischer or Bowman class)", "Nickel deposit thickness, non-destructive", "Per serial, read on the outer land zones; replaces the ten-point micrometer. Target total " - "thickness variation 10 to 20 microns"], - ["Stylus profilometer", "Traceable reference", "Calibration of the optical instruments"], - ["Inline machine vision", "Cosmetic screening", "100% of parts, fast"], - ], widths_mm=[42, 58, 70], font_pt=8.5), - P("Integration is real but not turnkey: the instruments export data and support scripting, and " - "the inline sensors speak standard industrial protocols, but there is no off-the-shelf connector " - "to a factory database. A light middleware service stamps each measurement with the part serial " - "and batch ID and writes it to the genealogy record. Budget for the full stack (metrology plus " - "the record-QC layers below, plus the audio station) is USD 350k to 810k, phaseable; a basic " - "tier (microscope, benchtop PVC lab, sampled listening) runs from launch."), + "thickness variation 10 to 20 microns", "Launch tier"], + ["Inline machine vision", "Cosmetic defects", "100% of parts, fast", "Launch tier"], + ["3D laser confocal microscope (Keyence VK-X class)", "Groove cross-section, wall roughness, " + "micro-defects; 20 nm vertical, ~120 nm lateral resolution, non-contact", "Sampled radial " + "zones (lead-in, outer, mid, inner) on fathers, mothers and stampers; the full spiral is not " + "feasible and not needed. The optical-disc industry verified its nickel stampers with this " + "instrument class", "Full stack; from revenue if the lever is used"], + ["Wide-area optical profiler (Keyence VR-6000 class)", "Form, flatness, gross defects; 0.1 " + "micron height resolution, ~1 s per field, HDR mode for mirror-bright nickel", + "Fast whole-part mapping", "Full stack; from revenue if the lever is used"], + ["Stylus profilometer", "Traceable reference", "Calibrates the optical instruments", + "With the optical instruments"], + ], widths_mm=[38, 46, 56, 30], font_pt=8.5), + P("**Hardness comes free with the punch.** The Sibert punch leaves one centre slug per stamper. " + "Marked with the part serial, it is a per-stamper coupon for hardness and thickness, logged " + "against the plating bath, as the optical-disc industry measured stamper hardness on the punched " + "centre rather than on the part. A fresh nickel bath plates soft at first, which changes how " + "stampers punch and finish, so this is the cheapest bath check the plant has. The structure of " + "that industry's stamper specification (thickness, flatness, hardness, back roughness, centre " + "hole, eccentricity, burr, visual defects) is the model for the acceptance specification this " + "plant still has to write."), + P("Integration is real but not turnkey: the instruments export CSV and raw 3D data and support " + "scripting, but there is no off-the-shelf connector to a factory system. A small watcher at the " + "metrology bench stamps each result with the part serial scanned from its back, writes the " + "verdict to the part's quality inspection in ERPNext and the raw file to the machine-data store."), + CALL("Metrology: the investor's choice", [ + "**Full stack at launch.** The metrology and QC block is USD 350k to 810k (11.6M to 26.7M THB, " + "estimate, section 8): XRF, laser confocal, wide-area profiler, inline vision on the three " + "presses and the audio station. Every father, mother and stamper is measured before the next " + "plating generation or the press.", + "**Launch tier.** XRF, inline vision and the audio station at launch; the laser confocal and " + "the wide-area profiler bought from revenue. That saves ~10.1M THB at the midpoint with its " + "share of the contingency, one of the four levers that bring the plant inside 216M THB. Until " + "they arrive, groove geometry on the metal is judged indirectly, through the test pressing and " + "the audio station, as most plants do today; thickness and cosmetics are still measured on " + "every part.", + "Either way the data path is the same, so the later instruments plug in without rework. " + "Distributor quotes for the metrology stack are one of the four requests that settle the " + "budget.", + ]), H2("5.3 Quality control: three layers for every record, one gate for every material"), P("Full automated audio checking of every record is physically impossible: a 12-inch record plays " "for about 40 minutes and a press makes a new one every 25 to 30 seconds, so one press outruns " "roughly 80 to 95 full-time listening stations. No playback-QC robot exists anywhere. The credible " - "maximum-automation design is layered, and it should be described to customers exactly as it is: " - "100% optical plus per-cycle telemetry plus sampled audio, with human ears kept in the loop for " - "test-pressing approval."), + "maximum-automation design is layered, and it is described to customers exactly as it is: 100% " + "optical plus per-cycle telemetry plus sampled audio, with human ears approving every test " + "pressing."), T(["Layer", "What", "Catches", "Status"], [ ["1. 100% inline optical inspection", "Darkfield line-scan cameras at the press unloader " "inspect every record at line speed", "Non-fill (dull patches where PVC did not fill the " "stamper), stitching and flow lines, warp, off-centre spindle holes, surface debris, wrong or " "off-centre labels. Non-fill and stitching correlate with audible defects, so this is a strong " - "proxy for audio quality without playing the record", "Custom integration of general machine " - "vision (Keyence or Cognex class); no " - "vinyl-specific product exists; CNX " - "would be an early adopter"], - ["2. Press telemetry, every cycle", "Nozzle pressure, mould temperatures, cycle time, cake " - "weight, yields and drift alerts streamed from the press PLC", "Process drift before it " - "becomes a defect; the record-level context for every other check", "Proven and deployed " - "in the industry " - "(Viryl ADAPT model); " - "AD12 and Newbilt " - "Classic expose the " - "data"], - ["3. Automated audio comparison, sampled", "A needle-drop capture station with automated " - "analysis: spectral-envelope comparison against the source master, click and pop counting, " - "noise floor from lead-in silence, channel balance; numeric score and pass/fail to the " - "database", "Wrong master cut into good-looking grooves, EQ and mastering errors, speed and " - "pitch problems; the things no camera can see", "Buildable from proven parts " - "(Stamper Discs' Fonograph " - "approach, iZotope-class " - "algorithms); first-of-kind as a " - "whole"], - ], widths_mm=[32, 48, 55, 35], font_pt=8.5), + "proxy for audio quality", "Custom integration of general machine vision (Keyence or Cognex " + "class) on all three presses; no vinyl-specific product exists"], + ["2. Press telemetry, every cycle", "Mould temperatures, pressures, cycle time, extruder values, " + "yields and drift alerts from the press PLC", "Process drift before it becomes a defect; the " + "record-level context for every other check", "Proven in the industry (Viryl's ADAPT model). " + "The Classic's Siemens PLC offers OPC UA (vendor " + "statement); for the HRP 12 the re-quote asks, " + "with a sensor fallback priced"], + ["3. Automated audio comparison, sampled", "Needle-drop capture with automated analysis: " + "spectral-envelope comparison against the source master, click and pop counting, noise floor " + "from lead-in silence, channel balance; score and pass/fail to the record", "Wrong master cut " + "into good-looking grooves, EQ and mastering errors, speed and pitch problems; what no camera " + "can see", "Buildable from proven parts (Stamper Discs' Fonograph approach, iZotope-class " + "algorithms); first of its kind as a whole; in the launch tier"], + ], widths_mm=[30, 46, 54, 40], font_pt=8.5), P("**Sampling rule for layer 3:** every test pressing and first-off per stamper, plus pulled " "samples densifying as the stamper ages (a stamper lasts roughly 1,000 to 2,000 records; the " "industry rule of thumb is a spot-play around every 50th)."), @@ -139,104 +223,192 @@ def blocks(): P("Every incoming compound lot passes a gate before it reaches a press, and its lot ID follows every " "record pressed from it. Per lot, in-house from day one, on benchtop instruments with data " "export: certificate of analysis against the agreed specification, moisture (the most common " - "cause of noisy surfaces), heat stability (PVC degradation releases hydrochloric acid and shows as " - "discoloration and noise), density, colour and gloss, granulate size and dust. New lots, and " - "especially new suppliers, are released only by test pressing. As the lab matures, torque " - "rheometry, DSC and FTIR are added; supplier qualification uses an external lab for K-value, " - "stabiliser identification (legacy lead rejected) and heavy-metals compliance for export. The " - "in-house regrind stream has its own contamination gate. This protocol is how Thai and regional " - "compounds are qualified against the European references."), + "cause of noisy surfaces), heat stability (PVC degradation releases hydrochloric acid and shows " + "as discoloration and noise), density, colour and gloss, granulate size and dust, specks on " + "pressed test plaques. In a climate of 60 to 90% ambient humidity a moisture result is only " + "comparable if the sample is taken sealed and conditioned the same way every time, so sample " + "conditioning is part of the method. New lots, and especially new suppliers, are released only by " + "a test pressing on a production press. This day-one tier is estimated at USD 55k to 150k and is " + "in the launch investment. The mature tier (torque rheometry, DSC, FTIR, ~USD 120k to 240k) is " + "deferred: Payap University's Faculty of Pharmacy and Chiang Mai University's science faculties " + "are the places to ask for contract testing in between (which instruments they hold is " + "unconfirmed). Supplier qualification uses an external lab for K-value, stabiliser " + "identification (legacy lead rejected) and heavy metals for export. The in-house regrind stream " + "has its own contamination gate. This protocol is how Thai and regional compounds are qualified " + "against the European references."), H3("Packaging QC"), P("Incoming cartons and sleeves are checked per delivery: dimensions (records must fit without " "force; spine width per title), board grammage, print quality against the customer-approved " "proof (spectrophotometer Delta E for colour-critical jobs), lamination and seam strength, inner " - "sleeve scuff risk. At assembly, the runout matrix code is scanned against the jacket barcode and " - "every unit's barcode is verified. Results go back to Ploy Printing per packaging lot, which is " - "the practical advantage of a partner ten kilometres away over a supplier ten thousand."), + "sleeve scuff risk. At assembly a camera reads the scribed dead-wax code (a handheld scanner " + "cannot read it reliably on black vinyl) and checks it against the jacket barcode, so a record " + "in the wrong jacket is caught systematically rather than being unlikely, and every unit's " + "barcode is verified. Results go back to Ploy Printing per packaging lot."), H2("5.4 Efficiency: recover before you generate"), - P("The pressing machinery is a modest electrical load (32 kVA connected for a full semi-automatic " - "line). The real energy demand sits in the utilities around it: the steam generator, the 250 kW " - "cooling system, and, in a tropical climate, the whole-plant air conditioning. Because Newbilt " - "excludes steam and cooling from its scope, these systems are ours to design, and the plan's " - "architecture is built on one observation: the steam's job is to heat the moulds and the cooling " - "water's job is to remove that same heat again. Roughly 98% of the cooling load is heat that the " - "steam put into the moulds, and the press cooling return leaves at about 60 °C. That warm return " - "is a premium heat source, and the plant reuses it before generating anything new."), + P("The pressing machinery is a modest electrical load: 32 kVA connected for a full Duplex line. The " + "real demand sits in the utilities around it. At launch the three presses need 450 to 540 kg/h of " + "saturated steam at 10 bar / 180 °C and about 390 kW of cooling at a hot-afternoon peak; the " + "utility backbone is built for the five-press fleet (750 to 900 kg/h of steam, up to ~650 kW of " + "cooling). On top comes whole-plant air conditioning in a tropical climate. Newbilt excludes " + "steam and cooling from its scope, so these systems are ours to design, and the design rests on " + "one observation: the steam's job is to heat the moulds and the cooling water's job is to remove " + "that same heat again. Roughly 98% of the press cooling load is heat the steam put into the " + "moulds, and the press cooling return leaves at about 60 °C. That warm return, the condensate and " + "a fired boiler's flue gas are heat the plant reuses before it generates anything new."), + H3("Utilities: backbone once, modules with the presses"), + P("Everything that is cheap to oversize now and costly to change in a running plant is built once, " + "for the five-press fleet: the boiler hall and the chiller compound with room for four modules " + "each, the steam main and condensate return, the cooling mains, the heat-exchanger frame and " + "tanks, and hydraulic and compressed-air ring mains with a valved, capped tee at every press " + "position. The machines that make steam and cold water come in identical modules: at launch " + "two 500 kg/h boilers (B-1, B-2) and two 250 kW air-cooled chillers rated at 40 °C ambient " + "(CH-1, CH-2), sequenced lead and lag by one controller. Identical modules mean one set of spares " + "and one service routine, N+1 later is one more module rather than a redesign, and the plant " + "never runs one oversized boiler at poor part load. Four boilers carry about eight presses with " + "one in reserve; four 250 kW chillers carry the five-press fleet with the fourth in reserve, and " + "pads for the next chiller frame up (about 350 kW, estimate) are a priced option in the chiller " + "RFQ. The central hydraulic plant around the Newbilt aggregates (standby pump set, accumulator " + "station, ring main) is not costed yet; a Thai hydraulic power unit builder quotes it."), T(["Measure", "What it does", "Effect"], [ - ["Feedwater heat recovery", "A water-to-water heat pump lifts the 60 °C press cooling return " - "into boiler feedwater at 90 to 95 °C", "Each kWh does double duty: cuts the boiler's work " - "and removes load from the chiller. With condensate " - "return, saves roughly 10 to 15% of steam energy and " - "shrinks the cooling system"], - ["Condensate return", "Steam condensate goes back to the treated feedwater cycle", "80% " - "return assumed; less water, less treatment, less fuel"], - ["Waste heat for low-grade consumers", "The label dry oven and the air conditioning's " + ["1. Flue-gas economizer (fired boilers)", "Recovers stack heat into the boiler feedwater; the " + "first measure to investigate on a biomass or LPG bank (an electric boiler has no flue gas)", + "Outlet and stack temperatures are vendor figures; rice-husk ash is abrasive, so the RFQ asks " + "for cleaning, wear protection and a bypass"], + ["2. Condensate return", "As much clean, hot condensate back to the feed tank as possible", + "Less water, treatment and fuel. Steam and cooling water share the mould channels, so the " + "condensate is only as clean as the cooling loop: a conductivity sensor diverts off-spec " + "condensate"], + ["3. Feedwater heat pump, if it pays", "Lifts the ~60 °C press return into feedwater at 90 to " + "95 °C, cutting the boiler's work and the chiller's load at once", "With condensate return, " + "roughly 10 to 15% of steam energy. With most condensate returned the remaining feed-tank load " + "is small, so it may not pay; the press return profile Newbilt is asked for decides"], + ["Waste heat for low-grade loads", "The label dry oven and the air conditioning's " "dehumidification reheat run on recovered press heat", "Displaces fresh electricity in two " "continuous loads"], - ["Solar-thermal feedwater preheat", "Flat-plate or evacuated-tube collectors reach 60 to 90 °C " - "trivially in the Thai sun", "Cheap, proven, stackable with the heat pump"], - ["Steam accumulator", "Presses draw steam in bursts; an accumulator (a Newbilt option) lets a " - "smaller boiler ride the peaks", "Smaller boiler, steadier firing"], - ["Closed-loop cooling", "Chiller or hybrid tower with plate heat exchanger; no open 'dirty " - "water' loop as in the reference schematic", "No process water discharged; the largest " - "water draw (tower evaporation) shrinks with " - "every kW the heat pump removes"], + ["Steam accumulator", "Presses draw steam in bursts; an accumulator (a Newbilt option) lets the " + "boilers ride the peaks", "Steadier firing; whether a modular bank needs it is a re-quote " + "question"], + ["Closed loop, air-cooled chillers", "The press returns drain open into a vented warm tank and " + "go back through a plate heat exchanger to the chillers; no open 'dirty water' loop as in the " + "reference schematic, and no cooling tower", "No process water discharged; the largest water " + "draw of the earlier water-cooled concept (tower " + "evaporation) is gone"], ["Regrind loop", "In-house grinder returns trimmings and rejects to the extruder at 20% of " "the feed", "Scrap is feedstock, not landfill; ~20% less virgin compound"], - ["One operator per four automatic presses", "Automatic patty, label and cooling-plate " - "handling", "Labour per record on the automatic half is a fraction of the semi-automatic " - "line's"], - ], widths_mm=[38, 68, 64], font_pt=8.5), - P("Two things were checked and ruled out: heat pumps cannot make the final 10 bar / 180 °C steam " + ], widths_mm=[38, 66, 66], font_pt=8.5), + P("Three things were checked and ruled out. Heat pumps cannot make the final 10 bar / 180 °C steam " "(commercial units top out around 120 to 165 °C, and core utility reliability is the wrong place " - "to pioneer), and ground-source heat exchange does not work in Thailand (the ground sits at " - "28 to 30 °C, too cold for process heat and warmer than the cooling loop wants). The boiler only " - "does the final lift, from already-hot feedwater."), + "to pioneer). Ground-source heat exchange does not work in Thailand (the ground sits at 28 to " + "30 °C, too cold for process heat and warmer than the cooling loop wants). Solar-thermal " + "feedwater preheat only reaches the 60 to 90 °C the heat recovery already gives for free, " + "concentrating collectors need strong direct sun that northern haze does not give, and the roof " + "earns more as PV. The boiler only does the final lift, from already-hot feedwater."), + H3("The grid tariff, and what it decides"), + P("The plant is on PEA's time-of-use tariff 3.2.2 (medium general service at 22 kV; the flat rate " + "is closed to new customers), never a flat kWh price: a demand charge of 132.93 THB per kW of the " + "highest 15-minute demand in peak hours, 4.1839 THB/kWh in the peak window (09:00 to 22:00 on " + "weekdays) and 2.6037 THB/kWh off-peak, plus the Ft fuel adjustment (+0.1623 THB/kWh for " + "September to December 2026; it resets every four months) and reclaimable VAT. Two shifts put " + "about two thirds of process energy into peak hours: a blended ~3.81 THB/kWh before the demand " + "charge. For the five-press fleet the backbone is built for, without electric steam, that is " + "roughly 4.5M to 6.8M THB a year before solar, 0.7M to 1.1M of it demand charge (estimates), on " + "an 800 to 1,000 kVA connection. Three design consequences:"), + B([ + "**Biomass heat is far cheaper than electric steam** (below): the demand charge follows the " + "boiler's full-power draw, and the peak window covers 13 of the 16 production hours.", + "**The roof gets PV, not solar thermal.** Self-consumed PV is worth ~3.7 THB/kWh; it cannot " + "lower the demand charge, because the peak window runs to 22:00, long after sunset.", + "**The battery is for ride-through, not peak shaving.** Charging off-peak and discharging at " + "peak earns ~70k THB a year for the 271 kWh stack, and it can hold demand down by only ~20 kW " + "(~30k THB a year; estimates). Its case is riding through grid dips and outages.", + ]), H3("Renewable energy"), KV([ - ["Rooftop PV, phase 1", "~247 kWp on the 1,523 m² monopitch roof (425 modules of the current " - "580 W class) plus ~40 kWp on the parking canopies, ~290 kWp total; " - "expected yield ~335 to 360 MWh/yr from the roof, ~25 to 35% of mature " - "two-shift consumption"], - ["Rooftop PV, with phase 2 building", "~498 kWp across both roofs, which removes the need for " - "ground-mount solar"], - ["Battery", "271 kWh Gobel Power LiFePO4 rack (15 stacked 18 kWh packs, 8,000+ cycles), " - "USD 40k to 58k listed, 50 to 60 day lead. Peak shaving and ride-through, roughly " - "two to three hours of the chiller's draw, not off-grid autonomy"], - ["Inverters", "Multiple Deye three-phase hybrid units (30 to 80 kW class), Thai distribution " - "via Solar Nicolo; Deye is a supported protocol on the Gobel battery management"], + ["Rooftop PV", "~247 kWp on the 1,523 m² monopitch roof (425 modules of a generic 580 W " + "placeholder; no module chosen yet), ~335 to 360 MWh a year, ~25 to 35% of mature " + "two-shift use (1,000 to 1,500 MWh). Saves ~1.2M to 1.3M THB a year and pays back " + "in ~4.5 to 7 years at 25,000 to 35,000 THB/kWp (estimates)"], + ["Canopies and the second building", "~40 kWp on the parking canopies (construction RFQ; ~54 " + "kWp if fully covered). A phase 2 building's roof adds " + "~251 kWp, ~498 kWp across both roofs"], + ["Battery", "271 kWh Gobel Power LiFePO4 rack (15 stacked 18 kWh packs, 8,000+ cycles), USD " + "39,900 to 58,000 listed, 50 to 60 day lead. Roughly an hour of the chiller bank's " + "peak draw: ride-through, not off-grid autonomy"], + ["Inverters", "Deye three-phase hybrid units (30 to 80 kW class), Thai distribution via Solar " + "Nicolo; Deye is a supported protocol on the Gobel battery management"], ["Roof design", "Monopitch at 10° falling toward ESE puts the whole roof on one plane at ~98% " - "of ideal yield; at this latitude orientation barely matters (under 2% " - "across a wide azimuth swing) and the building stays aligned with the plot. " - "10° rather than shallower so the rains self-clean burning-season dust"], - ["Open checks", "Battery rack voltage vs the chosen Deye model's window; Gobel safety " - "certifications (not published); EPC warranty on a mixed-vendor DC bus; " - "confirm yield against PVGIS before committing"], + "of ideal yield; at this latitude orientation barely matters (under 2% across a " + "wide azimuth swing). 10° rather than shallower so the rains self-clean " + "burning-season dust"], + ["Open checks", "Battery rack voltage against the chosen Deye model's window; Gobel safety " + "certifications (not published); EPC warranty on a mixed-vendor DC bus; yield " + "against PVGIS before committing"], + ["Solar PPA (option)", "Instead of buying the PV and battery, an EPC owns and finances them and " + "the plant buys the power: ~12.3M THB less capital at the midpoint with " + "its contingency share, one of the four levers in section 8. The PPA " + "price is not quoted yet, and the BOI solar measure (section 7) rewards " + "the plant's own solar investment, so its tax value probably goes with " + "the array (to confirm with the BOI consultant)"], ]), H3("Steam: the open engineering choice"), - P("There is no natural gas pipeline in Northern Thailand, so gas means a bulk LPG tank on site and " - "diesel means a fuel tank with price exposure. The plan keeps two fossil-free routes open. An " - "**electric boiler** (THB 2.5M to 4.0M installed, Miura or Bangkok Industrial Boilers class) is " - "fast, clean to permit, and maximises the solar share, at a ~300 kW draw that pushes the grid " - "connection toward 750 kVA. A **biomass boiler** (THB 4M to 7M, Getabec, Thai-fabricated) burns " - "wood chips, longan orchard prunings (Lamphun is Thailand's longan heartland and prunings are a " - "traded fuel), corn cobs and rice husk, roughly 350 to 400 tonnes a year at maturity; it makes " - "the steam genuinely renewable at the cost of fuel logistics, ash handling and an emissions " - "stack. The team's own 60 rai of forestry-classified land could supply 80 to 135 tonnes a year " - "as short-rotation coppice, most of early operations' need, but only after its legal " - "classification is verified. The staged path is the working assumption: **start electric, " - "plant the coppice now, add biomass at the automatic-line expansion** when demand and fuel supply " - "have both matured. The building already has a boiler hall and a fuel store in its utility yard."), + P("The boilers' fuel is still open; the modular bank works with either. There is no natural gas " + "pipeline in Northern Thailand, so gas means a bulk LPG tank on site with hazardous-storage " + "separation and licensing, and diesel means a fuel tank with price exposure. The two routes " + "without a fossil tank, compared for the same heat (~1,120 to 1,280 MWh a year at about 1.0 " + "million records, the top of the launch plant's range; estimates):"), + T(["", "Electric boiler bank (~98%)", "Biomass boiler bank (~80%)"], [ + ["Price of heat", "~3.9 THB/kWh, plus the demand charge", "~0.5 to 0.9 THB/kWh at 1.35 to 2 " + "THB/kg delivered (reported market prices, October 2026; no supplier quote yet)"], + ["Running cost, mature two shifts", "~5.2M to 6.0M THB a year, including 0.8M to 1.0M of extra " + "demand charge for the five-press bank", "~0.6M to 1.2M THB a year of fuel, plus handling " + "and ash"], + ["Boiler package, 2 × 500 kg/h", "4.5M to 7M THB (Thai suppliers); the investment's baseline", + "~6M to 10M THB, plus the fuel store"], + ["Grid", "Peak ~950 to 1,330 kW: PEA Schedule 4, 1,250 to 1,600 kVA", "Unchanged, ~800 to " + "1,000 kVA"], + ["Also", "Cleanest permitting, no fuel logistics, no stack", "Fuel contracts, a dry store sized " + "for the monsoon, ash handling, a 14 m stack and its emissions"], + ], widths_mm=[36, 64, 70], font_pt=8.5), + P("**Reading it.** The electric boiler is the more efficient machine; biomass is by far the cheaper " + "heat. At maturity the fuel saving of ~4.0M to 5.4M THB a year repays the biomass premium in " + "under a year (estimate), so the earlier staged path (start electric, add biomass later) is a " + "permitting and fuel-logistics choice, not a cost one: every year on electric steam costs roughly " + "1.4M to 5.4M THB more. The site can decide it too: next to the pharmaceutical facility on Payap " + "land a biomass stack would be a hard sell, which favours electric or LPG there (section 6.1)."), + P("**Fuel.** A biomass bank burns roughly 350 to 400 tonnes of air-dry wood a year at about 1.0 " + "million records (~540 to 620 t as fresh chips, which is what the store and the monsoon stock are " + "sized for). Lamphun alone produces more than 900,000 t of farm residues a year (Maejo " + "University), so supply is not the constraint; price is. Reported prices follow diesel, so the " + "fuel contract gets a diesel clause and sources within ~50 km. The local price-setter is Ratch " + "Pathana's biomass buying centre at Pa Sak, Mueang Lamphun, which feeds a 9.6 MW cogeneration " + "plant and competes for the same fuel. The team's own 60 rai of forestry-classified land could " + "supply 80 to 135 t a year as short-rotation coppice once its title is checked; at market prices " + "that is worth only ~0.1M to 0.25M THB a year, so its value is supply security and the story " + "('records pressed with steam from our own trees'), not the fuel bill. Next step: written quotes " + "from Pa Sak and two or three chip suppliers, priced by moisture, before the boiler decision."), + P("**Where the boilers come from.** Chinese makers with Thai references (ZOZEN, Sitong, Fangkuai, " + "Taiguo) could supply the two modules for roughly 2.8M to 5.5M THB installed against 4.5M to 7M " + "from Thai suppliers, about 1.6M THB less at the midpoint (estimates from listings, not quotes). " + "The specification is a 1.25 MPa design to ASME Section I with the S stamp; most Chinese packaged " + "electric units are rated 0.4 to 0.8 MPa and cannot deliver 10 bar. An imported boiler must meet " + "TIS, ASME, JIS, EN or an equivalent standard and be verified by a certification body registered " + "with the Department of Industrial Works (DIW), engaged before the order (section 7). No mainland " + "maker has a verified Thai service partner, so a Thai boiler contractor and the certification " + "body are the service layer either way. Chillers and air conditioning, the larger blocks, have " + "not been checked for a Chinese route yet."), H3("Water"), - P("Estimated demand at mature two-shift operation is about 15 m³ per day, called 20 with margin: " - "cooling tower evaporation and blowdown (over half), boiler makeup, galvanics rinse after " - "recycling, and domestic use for 25 staff. Source is open (PWA mains or a licensed well) and " - "drives part of the utilities budget. Storage is a dedicated ~200 m³ fire reserve plus a ~50 m³ " - "raw-water tank feeding a softener or RO skid. **No process water is discharged:** cooling is a " - "closed loop, condensate is returned, galvanics rinse water goes through closed-loop treatment " - "and metal recovery (an evaporator, THB 3M to 8M, with the galvanics line), and solvents are " - "contained and disposed of as controlled waste. This is a fixed design requirement, not an " + P("Water arriving is still open: no source is confirmed for the candidate site (PWA mains, a " + "licensed deep well, or both), and a water analysis comes before the boiler and chiller RFQs " + "because it decides softener or RO. The earlier demand estimate of ~15 m³ a day (~20 with " + "margin) was over half cooling-tower evaporation and blowdown; the air-cooled chiller bank has " + "no tower, so that figure is now on the safe side until the water balance is redone with the " + "site. Storage is a dedicated ~200 m³ fire reserve plus a ~50 m³ raw-water tank. **No process " + "water is discharged:** cooling is a closed loop, condensate is returned, galvanics rinse water " + "goes through a zero-discharge evaporator with metal recovery and the DI water plant (USD 97k to " + "258k, in the launch investment) in a water-treatment building of its own next to galvanics, " + "the stamper back-finisher's spent water and filters take the same route, the workshop has no " + "floor drain, and solvents leave as controlled waste. This is a fixed design requirement, not an " "aspiration to be traded away during engineering."), H3("Climate control as a product"), P("The whole plant runs under continuous control: 20 to 26 °C, 35 to 60% relative humidity, and " @@ -247,178 +419,393 @@ def blocks(): "Thailand's burning season (February to April) brings some of the world's worst PM2.5 episodes, " "so a plant without filtration would press different records in March than in September. This " "is the plant's largest utility line (THB 7.5M to 15M for ~1,500 m², plus THB 1.2M to 3.4M for " - "the two clean zones) and it is treated here as part of the product, not as overhead. The 35% " - "humidity floor is aggressive for the tropics and drives desiccant cost; if 45% proves " - "acceptable, the cost drops materially, and that question is on the RFQ list."), - CALL("Efficiency in one paragraph, for the investor", "Heat is recovered from the presses before " - "any fuel is burned; a quarter to a third of electricity comes from the roof at phase 1 and " - "up to half with the second building; a battery shaves the peaks; cooling water is never " - "discharged; a fifth of the plastic is reclaimed; and one operator runs four automatic presses. " - "The same choices cut the energy line in the cost model toward its low end, hedge Thai tariff " - "rises, and convert into BOI tax value (section 7). They also make the plant's sustainability " - "story true rather than claimed, which matters to the labels it sells to."), + "the two clean zones, estimates) and it is treated as part of the product, not as overhead. The " + "35% humidity floor is aggressive for the tropics and drives desiccant cost; if 45% proves " + "acceptable the cost drops materially, and that question is on the RFQ list."), + CALL("Efficiency in one paragraph, for the investor", "Steam and cooling are built once as a " + "backbone and filled with identical modules as presses arrive; heat is recovered from the " + "flue gas, the condensate and the press returns before more is generated; the roof carries PV " + "worth a quarter to a third of mature electricity use, with a battery for ride-through; no " + "process water is discharged; a fifth of the plastic is reclaimed; and biomass steam, if " + "chosen, costs a quarter to a tenth of electric steam. The same choices push the energy line " + "toward its low end, hedge Thai tariff rises, and convert into BOI tax value (section 7). They " + "also make the plant's sustainability story true rather than claimed, which matters to the " + "labels it sells to."), # -------------------------------------------- 6 site and building H1("6. Site and building"), - H2("6.1 Land: a long lease in Lamphun"), - P("The project's site strategy has changed from purchase to **long-term lease of raw land**, on " - "which the purpose-built plant is still constructed. This lowers upfront capital by roughly " - "USD 0.4M to 1.0M (THB 12M to 32M at the 2 to 4 million THB per rai the plan carried for " - "purchase), removes land from the balance sheet, and matches how most foreign-invested " - "manufacturing in Thailand actually holds its site. It brings its own conditions, which Thai " - "counsel will resolve before signature:"), + H2("6.1 Land: a long lease, three candidates"), + P("The site strategy is a **long-term lease of raw land**, on which the purpose-built plant is " + "constructed. Compared with buying 6 to 8 rai this keeps ~12M to 32M THB (~0.36M to 0.97M USD, " + "at the 2 to 4 million THB per rai the plan carried for a purchase) out of the capital round, " + "removes land from the balance sheet, and matches how most foreign-invested manufacturing in " + "Thailand holds its site. Three candidates are on file; nothing is signed."), + T(["", "Mueang Chi, Lamphun", "Northern Region Industrial Estate, Lamphun", + "Payap University land, Chiang Mai"], [ + ["Status", "Working candidate: the massing model, PV roof study and construction RFQ are sited " + "here", "Fallback", "New lead (October 2026): the university is interested in " + "leasing land to us. The point it gave fails zoning; its other " + "land is not checked yet"], + ["Plot", "5-0-66.5 rai on the deed, narrow and skewed", "Leased estate plots", "Not known yet: " + "boundary, size and title to come"], + ["To Chiang Mai old city", "~35 km", "Lamphun valley", "~5 km, on the Chiang Mai to Lampang " + "superhighway"], + ["Zoning", "Unverified (agricultural land): the first check", "Industrial estate; licensing " + "through the estate", "At the point given: zone ย.7-1, very high density residential; record " + "pressing not permitted (Chiang Mai city plan in force from 25 May 2026)"], + ["Galvanics effluent", "Ours to permit; zero discharge", "Shared central effluent treatment", + "Lessor's written consent on top of the permit"], + ["Neighbours", "Agricultural", "Industrial", "A pharmaceutical facility under construction on " + "the same land"], + ], widths_mm=[28, 44, 44, 54], font_pt=8.5), + P("**Galvanics now raises the bar for every site.** With the electroplating line in the launch " + "plant, a plot has to permit record pressing with a steam boiler **and** electroplating from day " + "one, not in a later phase. That favours the industrial estate (licensing through the estate, " + "shared effluent treatment) and makes zoning the first check everywhere else."), + P("**Payap University** approached the project and is interested in leasing land next to a " + "pharmaceutical facility under construction. The point it gave was checked on the land-use map " + "of the Department of Public Works and Town and Country Planning on 14 October 2026: zone ย.7-1, " + "very high density residential, where factory type 107 (whose definition names gramophone " + "records) is not permitted and type 72 is allowed only for repair, so a record plant cannot get " + "a factory licence there. The same city plan permits type 107 in its low density residential " + "and rural and agricultural zones, so Payap's other land is worth checking before the lead is " + "dropped (the map data is preliminary; the provincial town planning office confirms). Why it is " + "worth the checks: it is ~5 km from the old city, 25 to 30 km nearer the team, customers and the " + "airport than Mueang Chi, which helps tours, the artist platform and hiring; and Payap is a " + "partner, not only a landlord: it wants joint student programmes with us in mastering, lathe " + "cutting, IT and business administration, and its Faculty of Pharmacy has analytical labs that " + "could back the PVC lab. Any Payap plot is checked in this order, before any design work:"), + N([ + "**Zoning:** the plot's zone in the Chiang Mai city plan allows a record-pressing factory with a " + "steam boiler and electroplating (the neighbour's pharmaceutical permit proves little).", + "**Lease-ability:** Chanote title, university council approval, and whether campus land of a " + "private university can be leased commercially; with Thai counsel, together with the lease " + "terms below.", + "**The GMP neighbour:** a pharmaceutical plant is sensitive to the boiler stack, galvanics " + "extraction, extrusion fumes, noise and trucks; emission and buffer rules go into the lease, " + "not after the first complaint.", + "**Flooding:** Payap describes the land as low-lying when bought; check the plot against the " + "2024 flood extents.", + "**Plot fit:** the building, the detached utility yard and a second building need 6 to 8 rai; " + "the Payap scenario model draws a 150 m square (14.1 rai) with room for ten more Classics.", + "**Galvanics on a campus:** the lessor's written consent; zero discharge becomes a lease " + "condition, not only a commitment.", + ]), + P("Nothing is re-sited until a Payap plot passes zoning and lease-ability: the model, the PV study, " + "the RFQ and the plant's network site code stay on Mueang Chi. The lease itself must meet these " + "conditions, which Thai counsel resolves before signature:"), B([ "**Term and registration.** A lease over three years must be registered at the Land Office to " "be enforceable; the ordinary maximum is 30 years, and for industrial and commercial use the " "Hire of Immovable Property for Commerce and Industry Act allows up to 50 years for qualifying " "projects. The plan assumes a registered 30-year lease with a contractual renewal option, and " "will test the 50-year route with counsel.", - "**Building ownership.** The lease must state clearly that the buildings, foundations, tanks " - "and fixed plant belong to the company for the term, what happens to them at expiry, and that " - "the company may mortgage or assign them. Without this, financing the building is difficult.", + "**Building ownership.** The lease states that the buildings, foundations, tanks and fixed " + "plant belong to the company for the term, what happens to them at expiry, and that the company " + "may mortgage or assign them. Without this, financing the building is difficult.", "**Lessor's title and encumbrances.** A clean Chanote title, no mortgage that could foreclose " - "over the tenant, and consent from any co-owners. A lease of Sor Por Kor or forestry-classified " - "land is not acceptable.", - "**Zoning and factory permission.** The candidate parcel in Mueang Chi, Lamphun is agricultural " - "land whose zoning for factory use is unverified; this gates everything and is the cheapest " - "schedule insurance available. The Northern Region Industrial Estate in Lamphun (IEAT) is the " - "fallback: leased plots, licensing handled by the estate, and shared central effluent treatment " - "that eases the galvanics permitting.", - "**BOI interaction.** BOI's land-ownership privilege for foreign-held promoted companies is " - "simply not used; leasing does not affect the promotion.", - "**Rent.** Not yet negotiated. The plan carries THB 0.3M to 1.0M per year (USD 9k to 30k) as " - "an estimate for 5 to 8 rai of agricultural land converted to industrial use in the Lamphun " - "valley; IEAT plots run higher. The negotiated figure replaces this.", + "over the tenant, consent from any co-owners. A lease of Sor Por Kor or forestry-classified land " + "is not acceptable.", + "**BOI.** BOI's land-ownership privilege for foreign-held promoted companies is simply not " + "used; leasing does not affect the promotion.", + "**Rent.** Not negotiated. The plan carries THB 0.3M to 1.0M a year (USD 9k to 30k) as an " + "estimate for 5 to 8 rai of agricultural land in the Lamphun valley, with the lease deposit and " + "first-year rent in the working-capital block; IEAT plots run higher, and Payap has named no " + "figure.", ]), - P("Land requirements are unchanged: ~4 rai minimum, 6 to 8 rai comfortable with expansion, truck " - "access and turning, parking, the outdoor cooling tower, a separated battery enclosure, and a " - "500 to 1,000 kVA medium-voltage connection from PEA."), + P("Land requirements: ~4 rai minimum, 6 to 8 rai comfortable with expansion; truck access and " + "turning, parking, the detached utility yard, a separated battery enclosure, and a medium-voltage " + "connection from PEA (800 to 1,000 kVA for the five-press backbone without electric steam, 1,250 " + "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: phase 1 " - "main building, detached utility yard, fire and raw water " - "tanks, parking canopies, and the phase 2 building footprint. " - "Source: parametric model, project repository."), - P("The phase 1 building is a single-storey steel portal frame of **60 × 25 m (1,500 m²)** 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², the standard industrial class and what the presses and " - "racking need) raised 1.2 m above ground so that two sealed loading docks work at trailer height " - "and the docked trailer acts as the airlock. The envelope is insulated PIR sandwich panel " - "(100 mm roof, 75 mm walls) on a 2.5 m masonry dado, taped and gasketed, because the building is " - "air-conditioned and must be airtight against smoke-season particulate; mineral-wool panels " - "where fire compartmentation (EI 60 or 120) or acoustics require them."), + 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², " + "the standard industrial class the presses and racking need) raised 1.2 m above ground, so that " + "two sealed loading docks work at trailer height and the docked trailer acts as the airlock. The " + "envelope is insulated PIR sandwich panel (100 mm roof, 75 mm walls) on a 2.5 m masonry dado, " + "taped and gasketed, because the building is air-conditioned and must be airtight against " + "smoke-season particulate; mineral-wool panels where fire compartmentation (EI 60 or 120) or " + "acoustics require them."), T(["Zone", "Area"], [ ["Semi-automatic press hall (Newbilt Duplex specification)", "~200 m²"], ["Automatic press zone", "~100 to 150 m²"], ["Galvanics clean room, water treatment, chemical storage", "~80 to 150 m²"], ["Mastering and cutting room", "~40 to 60 m²"], ["Stamper preparation", "~30 m²"], - ["Cassette duplication and CD-R duplication (new)", "~60 to 100 m²"], - ["Packaging, assembly and finished-goods warehouse", "~300 to 500 m²"], - ["Utility rooms inside (compressor, electrical, IT)", "~50 to 100 m²"], - ["Offices, QC and listening room, archive, entrance", "~150 to 200 m²"], + ["Packaging and finished-goods warehouse", "~300 to 500 m²"], + ["Utility rooms (boiler, compressor, chiller, electrical)", "~100 to 150 m²"], + ["Offices, QC and listening room, archive, IT, entrance", "~150 to 200 m²"], + ["Maintenance workshop and machine bay (crane-served)", "~100 to 150 m²"], + ["Visitor corridor (glazed, ground level)", "~110 to 130 m²"], ["Circulation, walls, miscellaneous", "~150 to 250 m²"], - ["**Total under roof**", "**~1,200 to 1,700 m²**, against 1,500 m² built"], + ["**Total under roof**", "**~1,400 to 2,000 m²**, against 1,500 m² built"], ], widths_mm=[110, 60], - caption="The boiler hall (66 m²), biomass fuel store (42 m²), chiller room (60 m²) and cooling " - "tower pad sit in a detached utility yard, which frees the main floor for production and " - "keeps the boiler in its own room as Thai regulations require."), - P("Site works include a ~444 m perimeter wall, one 10 m sliding gate with a guard house, 4,387 m² " - "of paving in two classes (heavy-duty for trucks, general for parking and yard), roofed parking " - "for 10 cars and 30 scooters with ~40 kWp of PV on the canopies, foundations for a 9 m fire " - "water tank and a 5 m raw-water tank, a fire ring main and hydrants, stormwater drainage " - "(66% of the plot becomes sealed, so a detention pond may be required for the permit), and " - "domestic sanitation."), - P("**A second building is expansion, not a gap.** The whole zone table fits inside the phase 1 " - "building. A 45 × 38 m (1,710 m²) phase 2 building fits the plot's narrowing southern end with a " - "two-bay sawtooth roof carrying ~251 kWp, a 20 m yard between the two for fire separation and " - "shared loading; total coverage stays at 39% of the deed area. It is where a CD replication line " - "would go if that option is chosen (section 4.9), or where finished goods move to free production " - "floor."), + caption="Estimates. The boiler and chillers have since moved to the detached utility yard, which " + "frees floor the workshop and corridor take; water treatment is proposed in its own " + "building next to galvanics; cassette and CD-R duplication (~40 to 80 m² and ~20 to " + "40 m²) are not in the table yet. 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, with the 5 t crane runway over the production compartment up to the " + "warehouse fire wall. It still draws two Classic positions (the launch plant installs one) 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."), + H3("Crane, workshop and visitor corridor"), + B([ + "**A 5 t overhead crane** (single-girder, ~24 m span, inverter drives, radio remote) runs over " + "the whole production compartment, roughly 40 to 48 m of the 60 m, and stops at the fire wall " + "to the finished-goods warehouse. Machines are moved in, out and around without hiring a mobile " + "crane. It shapes the building: a frame designed for crane loads, no full-height cross walls in " + "the crane zone (rooms there are lidded boxes, with removable hatches where heavy kit goes in), " + "and the cutting room kept outside it, away from the frame's vibration. 5 t covers the heaviest " + "known lift (a Newbilt HRP 12 press, 1,350 kg) with margin until Newbilt states the Classic's " + "weight; 3.2 t is the alternative price.", + "**A machine door** of ~4.5 × 5.0 m at the ramp end, opened a few times a year: a truck reverses " + "up the ramp into the machine bay and the crane lifts the machine off the bed inside.", + "**A maintenance workshop** of ~100 to 150 m² beside it, where the crane parks: a service bay " + "for one press-sized machine, benches, a hydraulic hose crimper, a spares store tracked in " + "ERPNext, and a hot-work corner, held at negative pressure so its dust never reaches the " + "presses. Newbilt service comes from Germany and Pheenix from Sweden; spares on the shelf are " + "the uptime lever.", + "**A glazed visitor corridor** at ground level along the car-park wall (~45 to 55 m, ~2.4 m " + "clear), with stations in process order from the cutting-room window to packaging. It has its " + "own filtered air at slight positive pressure and acoustic glazing that brings the 80 to 90 " + "dB(A) near the presses down to roughly 40 to 50 dB(A) (estimates), so a guide talks without a " + "headset and visitors need no PPE; a 1:12 accessible ramp serves the entrance. Tours for " + "artists, labels, investors and schools can run several times a day without stopping " + "production.", + ]), + H3("Utility yard and water-treatment building"), + T(["Detached utility yard (decided October 2026)", "Size (estimate)"], [ + ["Boiler hall, four 500 kg/h module positions (B-1 and B-2 at launch)", "~162 m² (18 × 9 m), " + "6.0 m high"], + ["Biomass fuel store", "42 m²"], + ["Chiller compound, open and screened, four pads (CH-1 and CH-2 at launch)", "~135 m² (12.5 × " + "10.8 m)"], + ["Cooling pump and heat-exchanger room", "~40 m² (8 × 5 m)"], + ["Flue stack", "14 m"], + ["**Yard in all**", "**~379 m²**, against 178 m² before the four-module decision"], + ], widths_mm=[110, 60], + caption="The fired case sets the boiler hall (an electric bank would need about half). No " + "cooling tower: the chillers are air-cooled. The rooms are built once for four modules " + "and the plant goes in one module at a time; the yard sits outside the main building " + "because the boiler must have its own room and biomass deliveries need yard access."), + P("**Water treatment gets its own building** (proposed, October 2026): ~12 × 10 m directly behind " + "galvanics, holding the zero-discharge effluent treatment, the DI water plant and the chemical " + "store. A buried duct carries the effluent by gravity from the galvanics floor at +1.2 m and " + "brings DI water back, and a covered crossing joins the two doors; the galvanics room keeps only " + "a chemical day store."), + P("**The archive room** holds the father and mother of every side, about 1,200 to 2,400 parts a " + "year at full capacity, on mobile archive shelving (A-Z Solutions of Vienna as the reference " + "specification, LPI Rack Range in Thailand to quote against it). In the Payap scenario's office " + "a room of about 4 × 5.75 m with four mobile carriages holds ~150 shelf metres, roughly 50,000 " + "parts or 20 years and more of output (estimates). It asks things of the building early: ~11 " + "kN/m² under the shelving block, so the archive stays on the ground slab at the full rating; " + "rails set into the floor screed at fit-out; clean-agent gas suppression; a water-leak sensor " + "along the rails. One open point: with fathers and mothers in one room, one event takes both, so " + "keeping the rarely pulled fathers in a second fire compartment or off site is on the list."), + H3("Site works and the second building"), + P("On the Mueang Chi parcel the site works are a ~444 m perimeter wall, one 10 m sliding gate with " + "a guard house, 4,387 m² of paving in two classes (1,608 m² heavy-duty for trucks, 2,779 m² " + "general), roofed parking for 10 cars and 30 scooters carrying ~40 kWp of PV, a ring foundation " + "for a 9 m fire-water tank with its pump house and one for a 5 m raw-water tank, a fire ring main " + "and hydrants, stormwater drainage and domestic sanitation. With the buildings, ~6,549 m² or 68% " + "of the modelled plot is sealed, so stormwater attenuation, quite possibly a detention pond, may " + "be a permit condition."), + P("**A second building is expansion, not a gap.** A 45 × 38 m (1,710 m²) phase 2 building fits the " + "plot's narrowing southern end with a two-bay sawtooth roof carrying ~251 kWp and a 20 m yard " + "between the two for fire separation and shared loading; coverage stays at 39% of the deed area. " + "It is where finished goods move to free production floor, where pressing capacity can double, " + "or where a CD replication line would go if that option is chosen (section 4.9). Where the " + "second Duplex system stands on the Mueang Chi footprint is not drawn yet; the Payap scenario " + "model draws the whole five-press fleet with room for ten more Classics."), + H3("What the construction RFQ asks"), + P("The budget-level construction RFQ, with quantities from the parametric model, asks contractors " + "for: the shell rate per m² at the insulated-panel specification (not a bare shed); heavy-duty " + "and general paving separately; a separate rate for mineral-wool panels at fire-compartment and " + "acoustic walls; the crane package separately (runway and frame premium, machine door, the crane, " + "and the hook height achieved under the 7.0 m eave, with +1.0 m on the eave as an option); the " + "utility yard with floors, pads and plinths for all four positions; a lump sum for the rest of " + "the site works; and the foundation assumption behind all of it. It excludes process machinery, " + "PV, air conditioning, boilers, chillers and tanks, sprinklers, fit-out and the PEA transformer, " + "and asks whether permit drawings for the building permit and the factory licence are included."), H3("What the building costs, and what is not known"), - P("Building and civil works are estimated at **USD 650k to 1.1M** (THB 21M to 36M) at 12,000 to " - "20,000 THB/m² for Thai pre-engineered steel construction to the insulated-panel specification, " - "plus ~20% site works. A budget-level price request with quantities from the parametric model is " - "ready to send to contractors. The single largest unknown is the ground: the parcel is likely " - "soft former paddy, and a piled slab can add several hundred to 1,000+ THB/m² across the " - "building, 4,387 m² of paving and a 1,711 m³ fill platform. A soil boring test (THB 30k to 50k) " - "comes before any real number and is in the phase 0 budget."), - IMG("renders/aerial-southwest.png", 150, "Figure 3. Massing render from the south-west: phase 1 " - "building with rooftop PV, utility yard, tanks and parking " - "canopies. Source: parametric model."), + T(["Block (launch plant)", "USD", "THB", "Basis"], [ + ["Building ~1,500 m² plus civil and site works", "650k to 1,100k", "21.4M to 36.3M", + "estimate at 12,000 to 20,000 THB/m² for Thai pre-engineered steel to the insulated-panel " + "specification, plus ~20% site works"], + ["Overhead crane, runway, frame premium, machine door", "97k to 227k", "3.2M to 7.5M", "estimate"], + ["Maintenance workshop and machine bay fit-out", "30k to 76k", "1.0M to 2.5M", "estimate; a " + "workshop lathe and CNC mill not priced"], + ["Visitor corridor and accessible entrance", "67k to 148k", "2.2M to 4.9M", "estimate; " + "building it later is a lever worth ~4.1M THB"], + ["Utility yard for four boiler and four chiller modules", "73k to 122k", "2.4M to 4.0M", + "estimate at the building rate"], + ["Water-treatment building next to galvanics", "52k to 87k", "1.7M to 2.9M", "estimate at the " + "building rate"], + ["**Together**", "**~0.97M to 1.76M**", "**~32M to 58M**", "sum of the blocks, before the 15% " + "contingency (section 8)"], + ], widths_mm=[50, 26, 26, 68], font_pt=8.5), + P("The single largest unknown is the ground. The Mueang Chi parcel is likely soft former paddy, and " + "a piled slab can add several hundred to 1,000+ THB/m² across the building, 4,387 m² of paving " + "and a 1,711 m³ fill platform. A soil boring test (THB 30k to 50k, in the phase 0 budget) comes " + "before any real number, and the building RFQ with a soil test is one of the four requests that " + "settle the budget. Also open: the crane's hook height under the 7.0 m eave; the archive's " + "mobile shelving (to quote); the valved branches and feeders for the empty utility positions; " + "and the fire-water volume, which the hydraulic design and the warehouse racking height set. " + "Renting a crane for the installations while the frame stays crane-ready would save ~3.7M THB, " + "but that is a scope cut toward the 180M THB case, not part of the plan."), H2("6.3 Safety, security and the irreplaceable"), P("Worker safety is a founding priority on equal footing with the environmental commitments. The " - "pressing line combines hydraulics at ~180 bar, saturated steam at 10 bar / 180 °C and hot PVC; " - "the galvanics room handles silver nitrate and nickel salts. The plan provides vendor-led " - "commissioning training extending into an in-house program, mandatory PPE per area, controlled " - "access and decontamination for the clean rooms, eyewash and emergency shower at the plating " - "line, a licensed boiler operator, and fume-extraction interlocks (no extraction, no plating)."), - P("Physical security is zoned: production, galvanics, chemical storage, the master and stamper " - "archive, IT, and shipping each get badge or biometric access with logs; CCTV at entrances, " - "perimeter, dock, production, chemicals and archive under a PDPA-compliant retention policy. Two " - "things are irreplaceable and get their own protection: **the metal archive** (a destroyed father " - "means re-cutting and re-plating a release; fire-rated room, climate control, access logging, " - "clean-agent gas suppression because sprinkler water would destroy lacquers and paper and corrode " - "the metal) and **client audio** (pre-release music is a leak target; isolated encrypted storage, " - "need-to-know access, and a written policy the sales team can show labels)."), + "press floor combines hydraulics at ~180 bar, saturated steam at 10 bar / 180 °C and hot PVC; " + "the galvanics room handles silver nitrate, nickel salts and acids. The plan provides " + "vendor-led commissioning training extending into an in-house programme, mandatory PPE per area, " + "and galvanics as a clean room with controlled access, extraction on every plating unit, " + "decontamination procedures, eyewash and emergency shower at the line, and a hard-wired " + "interlock (no extraction, no plating). A machine is lifted only after lockout (power isolated, " + "steam vented, hydraulics depressurised including the accumulator) and with a lift plan; hot work " + "stays in the workshop under a permit; the boilers run under a licensed boiler controller " + "(section 7)."), + P("Decided in October 2026: every member of staff, office included, gets group health insurance " + "(inpatient and outpatient) and a yearly check-up on top of social security, plus the " + "occupational checks Thai law requires for risk-factor work (press-floor heat and noise, " + "galvanics chemistry, maintenance) within 30 days of starting and yearly after. Everyone wears " + "the same company workwear (Strauss), with process PPE on top. Planning costs, estimates: ~15,000 " + "THB a head a year for insurance, ~2,500 for the check-up plus ~1,500 for risk-factor tests, and " + "workwear ~USD 9k a year at ~20 staff."), + P("Physical security is zoned: production, galvanics, chemical storage, the metal archive, IT, " + "shipping and the visitor corridor each get badge or biometric access with logs; CCTV at " + "entrances, perimeter, dock, production, chemicals and archive under a PDPA-compliant retention " + "policy. Two things are irreplaceable and get their own protection: **the metal archive** (a " + "destroyed father means recutting and re-plating a release; fire-rated room, climate control in " + "the tightest monitoring tier, access logging, clean-agent gas suppression because sprinkler " + "water would destroy paper records and corrode the metal) and **client audio** (pre-release " + "music is a leak target; an isolated, encrypted, access-logged vault, need-to-know access, and a " + "written policy the sales team can show labels)."), P("Fire suppression is zoned, not full-building gas: clean agent only in small sealed high-value " "rooms (archive, IT, switchrooms, control cabinets), water mist or sprinklers in production and " - "the carton-heavy warehouse, detection and containment rather than suppression for the battery " - "enclosure. The site carries its own ~200 m³ fire reserve and pump set because mains flow in " - "Mueang Chi cannot be assumed. The property insurer is involved before the design is fixed."), + "the carton-heavy warehouse, and detection and containment rather than suppression for the " + "battery enclosure. The site carries its own ~200 m³ fire reserve and pump set (electric duty, " + "diesel standby, jockey) because mains flow cannot be assumed; warehouse racking above about " + "3.7 m changes the sprinkler design and raises that volume, so the racking height is fixed " + "before the fire design. The property insurer is involved before the design is fixed."), - # ----------------------------------------------------- 7 BOI + # ----------------------------------------------- 7 regulatory H1("7. Regulatory: BOI promotion and licences"), + H2("7.1 BOI promotion"), P("The project will apply for promotion by the Thailand Board of Investment. In BOI terms vinyl " "pressing is basic plastic consumer-goods manufacturing (incentive Group B): no corporate income " - "tax holiday on the core activity, but the full non-tax package and machinery duty exemption. The " - "tax value is engineered on top through measures where this project happens to be strong, so the " - "application is pitched on solar, automation and technology content, not on pressing plastic " - "discs."), + "tax holiday on the core activity, but the full non-tax package and machinery duty exemption. " + "The tax value is engineered on top through measures where this project happens to be strong, so " + "the application is pitched on solar, automation and technology content, not on pressing plastic " + "discs. The research behind this dates from July 2026, BOI revises its measures roughly every " + "year, and the exact activity sub-code needs confirmation by a BOI-registered consultant before " + "filing."), T(["What BOI gives", "Why it matters here"], [ - ["Machinery import duty exemption", "Almost the entire equipment list is imported (Germany, " - "Sweden, USA, UK, Japan). Significant across every equipment block."], + ["Machinery import duty exemption", "Almost the entire launch equipment list is imported " + "(Germany, Sweden, the UK, Australia, Japan, China). Machinery imported duty-free is also " + "exempt from VAT at import (Revenue Department answer on BOI's FAQ, checked October 2026). The " + "investment blocks assume promotion: without it, ~5% duty on ~2.3M USD of imported machinery " + "(~0.11M USD) plus ~0.17M USD of import VAT, reclaimed only later (estimates)."], ["100% foreign ownership and land privileges", "Overrides Foreign Business Act restrictions " - "for the promoted activity. Land ownership privilege is unused under the lease strategy."], - ["Visas and work permits via One Stop Service", "Foreign commissioning engineers and the " + "for the promoted activity. The land-ownership privilege is unused under the lease strategy."], + ["Visas and work permits via the One Stop Service", "Foreign commissioning engineers and the " "technical consultant, without the four-Thai-employees-per-permit rule."], ["Raw material duty relief", "Exemption for export production; up to 90% reduction for " "domestic sales. Relevant for imported PVC compound until a Thai source is qualified."], - ["Solar and battery measure (alternative-energy, 2025)", "CIT exemption based on the solar " - "investment; PV modules, inverters, battery and mounting explicitly eligible. The planned " - "installation converts directly into tax-exemption headroom."], - ["Smart and Sustainable Industry upgrade measure", "Rewards automation, smart machinery and " - "energy efficiency, typically 3 years of CIT exemption capped around 50% of the qualifying " - "spend. The automatic presses, inline inspection, metrology and heat recovery are the natural " - "fit."], - ["R&D merit", "At least 1% of revenue in Thai R&D adds 1 to 3 exemption years. Galvanics " - "process development, recycled-PVC work and the audio-QC system could be framed as " - "qualifying development."], + ["Solar and battery measure (Announcement 2/2568, April 2025)", "CIT exemption based on the " + "solar investment; PV modules, inverters, battery and battery inverters, and mounting are " + "eligible, capped at THB 12M, 30M or 40M of investment per MW depending on investment type. " + "It rewards a plant-owned array, which matters if the solar PPA lever is used (section 5.4)."], + ["Smart and Sustainable Industry measure (Announcement 15/2565, refreshed July 2025)", + "Rewards automation, smart machinery and energy efficiency, typically 3 years of CIT exemption " + "capped around 50% of the qualifying upgrade spend. The automatic Classic, inline inspection, " + "metrology and heat recovery are the natural fit."], + ["R&D merit", "At least 1% of revenue in Thai R&D adds 1 to 3 exemption years and can lift the " + "cap. Galvanics process development, recycled-PVC work and the audio-QC system could qualify; " + "whether R&D with Payap University and the joint student programmes count is to be checked."], ], widths_mm=[58, 112]), - P("**Requirements:** minimum THB 1M investment excluding land and working capital (cleared by the " - "first press line alone); debt-to-equity no higher than 3:1 for the life of the privileges, which " - "shapes the financing mix; modern machinery and process; progress reporting. BOI promotion does " - "not replace the factory licence (Ror.Ngor. 4), boiler registration, hazardous-substance " - "registration for the plating chemistry, or wastewater permitting. The galvanics effluent is the " - "most likely regulatory friction point regardless of BOI, which is one argument for the " - "industrial estate's shared treatment."), - P("**Process:** file via the e-Investment system and present at an analyst meeting; decision in " - "about 40 working days for projects under THB 200M, roughly 4 to 6 months end to end to the " - "certificate; incorporate the company under it; import machinery within a window commonly 30 " - "months from issuance; reach full operation by about 36 months. The Northern Economic Corridor " + P("**Requirements:** minimum THB 1M investment excluding land and working capital (cleared many " + "times over); debt-to-equity no higher than 3:1 for the life of the privileges, which shapes " + "the financing mix; modern machinery and process; progress reports, annual reports and machinery " + "lists. The plant's asset register and stock ledger in ERPNext are where the record of promoted " + "machinery and raw materials lives, from the first capex invoice."), + P("**Process:** file via the e-Investment system and present at an analyst meeting. BOI quotes " + "about 40 working days to a decision for projects under THB 200M and 60 to 90 working days for " + "larger tiers; at ~161M to 292M THB the launch plant sits around that line, so the consultant " + "confirms which applies. In practice it is roughly 4 to 6 months end to end to the certificate; " + "the company is incorporated under it; machinery is imported within a window commonly 30 months " + "from issuance; full operation is due by about 36 months. The Northern Economic Corridor " "(Chiang Mai, Lamphun, Lampang) is promoted as a creative-economy base, which a music " - "manufacturing story fits; current area add-ons must be confirmed with BOI directly."), - CALL("Two things to settle before filing", [ - "**Scope.** Cassette duplication and CD-R duplication should be in the application from the " - "start. CD replication is a separate activity code and cannot be added casually afterwards; " - "the investor's decision on section 4.9 is needed before the filing date.", + "manufacturing story fits; the current area add-ons for Lamphun must be confirmed with BOI " + "directly."), + H2("7.2 Factory licence, galvanics and boilers"), + P("BOI promotion does not replace the factory licence (Ror.Ngor. 4), hazardous-substance " + "registration for the plating chemistry, wastewater permitting or the boiler rules. **Galvanics " + "is now in the launch plant, so the electroplating line, its chemistry and its zero-discharge " + "effluent system are in the first factory licence application**, not a later amendment. The " + "earlier plan to keep galvanics out of the first licence to protect the schedule no longer " + "applies. Effluent is the most likely regulatory friction point regardless of BOI, and it now " + "sits on the path to the first paying release:"), + B([ + "**The site must permit plating from day one** (section 6.1): zoning has to allow a " + "record-pressing factory with a steam boiler and an electroplating line. The industrial " + "estate's licensing and shared effluent treatment are the easiest path; on Mueang Chi the " + "permit is ours; on Payap land the lessor's written consent comes on top.", + "**Zero discharge is the design, and the application says so:** rinse water through the ZLD " + "evaporator with metal recovery, the back-finisher's spent water and filters by the same route, " + "solvents as controlled waste, no process water to the environment. It is the strongest answer " + "the plant can give to the effluent question.", + "**Permit drawings** for the building permit and the factory licence come from a licensed " + "engineer; the construction RFQ asks whether contractors include them (shell prices usually do " + "not), and stormwater attenuation may be a permit condition.", + ]), + P("**Boilers (DIW rules).** The Ministerial Regulation on boilers B.E. 2549 and the matching " + "notification on boiler safety of the same year apply to every module, Thai or imported: a design " + "to TIS or an international standard (ASME, JIS, EN or equivalent) checked and certified by a " + "DIW-registered certification body or licensed engineer; for an imported boiler, verification by " + "a registered certification body and the manufacturer's data report, design and inspection " + "reports filed with DIW; installation drawings checked and an inspection before first use " + "reported to DIW within 30 days; **a licensed boiler controller on site**; and **inspection at " + "least once a year**. The relief for small once-through units does not apply at ~10.5 bar (our " + "reading), and the labour-side regulation of 2021 adds licensed-engineer installation and " + "testing and a feedwater standard. A Chinese boiler built to the Chinese GB code would rest on " + "'or equivalent' with no precedent found, hence the ASME specification. DIW has announced a " + "revision of the boiler, pressure-vessel and refrigeration rules, so they are rechecked before " + "the RFQ, and a certification body is engaged before any boiler order."), + P("**Other permits and duties:** the same 2021 labour regulation covers the overhead crane (a " + "crane-industry summary puts cranes above 3 t on an engineer inspection every three months; to " + "confirm against the text before the capacity is chosen); hazardous-substance registration and " + "locked, inventoried storage for silver nitrate and nickel salts; the occupational health " + "check-ups (section 6.3); PDPA for CCTV, personnel and operator-linked production data; local " + "fire codes and the building permit during construction; and DIW manifests for used oil and " + "other controlled waste."), + CALL("Three things to settle before filing", [ + "**Zoning before filing.** The BOI clocks (the import window and the deadline for full " + "operation) start at the certificate, and the margin on them is consumed by one scenario: " + "filing early and then finding the site does not work. Verify the chosen plot's zoning, " + "including plating, first.", + "**Scope.** Cassette and CD-R duplication go into the application from the start. CD " + "replication would need new activity codes, which cannot be added casually afterwards, so the " + "investor's decision on CD (section 4.9) is needed before the filing date.", "**Sequencing.** The plan's rule is that no machinery purchase order precedes the certificate, " - "because duty exemption is not retroactive. But the exemption attaches at importation, not " - "at contract signature. If a press can be ordered with a deposit while the application is in " - "review, provided it clears customs after issuance, the launch pulls forward by 6 to 9 " - "months. This is the first question for the BOI consultant and the only item in the plan " - "worth half a year.", + "because duty exemption is not retroactive. But the exemption attaches at importation, not at " + "contract signature. If equipment can be ordered with a deposit while the application is in " + "review, provided it clears customs after issuance and is on the approved machinery list, the " + "launch pulls forward by six to nine months. With the lathe, galvanics and Sibert line now on " + "the critical path alongside the presses, this is the first question for the BOI consultant and " + "the only item in the plan worth half a year.", ]), P("Keep any future label, content or retail arm in a separate entity: media and service activities " "carry different, sometimes Thai-ownership, conditions and would muddy a clean manufacturing " diff --git a/docs/business-plan/build/content_c.py b/docs/business-plan/build/content_c.py index 1f09393..9314b46 100644 --- a/docs/business-plan/build/content_c.py +++ b/docs/business-plan/build/content_c.py @@ -1,4 +1,8 @@ -"""Part C: investment, revenue and operating model, timeline, phasing, team and ownership, risks, next steps.""" +"""Part C: investment, revenue and operating model, timeline, phasing, team and ownership, risks, next steps. + +Draft 0.2, October 2026: re-based on the launch plant (everything in one capital round, +commissioned in sequence), docs/finance/total-investment.md "Launch plant (October 2026)". +""" from plan_lib import H1, H2, H3, P, B, N, T, KV, IMG, CALL, PB @@ -6,544 +10,782 @@ def blocks(): return [ # ------------------------------------------------- 8 investment H1("8. Investment"), - P("Everything priced or estimated so far, rolled into one view. Blocks marked 'estimate' have no " - "vendor confirmation; the rest trace to quotes or researched ranges. Treat all figures as " - "budgetary with a wide margin (plus or minus 30 to 50% on the estimates) until requests for " - "quotation replace them. Land is now a lease and is removed from capital; cassette and CD-R " - "duplication are added."), - H2("8.1 Full vision, all blocks"), - T(["Block", "USD", "THB", "Basis"], [ - ["Newbilt semi-automatic line, full Duplex", "350k to 370k", "11.5M to 12.2M", "Quoted: 2024 " - "offer EUR 200,500 (~USD 232k) plus quoted second press and extruder ~USD 115k; expired, " - "re-quote required"], - ["Two fully automatic presses", "580k to 920k", "19.1M to 30.5M", "Estimate: ~USD 340k per " - "press indicative, unverified, plus delivery and commissioning"], - ["Galvanics line (Digital Matrix)", "320k to 650k", "10.7M to 21.4M", "Estimate: six-figure " - "turnkey inference from vendor research"], - ["Zero-discharge water treatment", "90k to 240k", "3.0M to 8.0M", "Researched: utilities " - "option row"], - ["Stamper preparation (Sibert)", "60k to 170k", "1.9M to 5.7M", "Estimate, pricing unpublished"], - ["Mastering and cutting room", "290k to 580k", "9.6M to 19.1M", "Estimate, bespoke market"], - ["Metrology and QC stack", "350k to 810k", "11.5M to 26.7M", "Estimate, phaseable"], - ["Utilities, solar, battery, HVAC, racking baseline", "730k to 1,270k", "24.0M to 41.6M", - "Researched: Thai supplier ranges, THB-native, plus or minus 30%"], - ["Building ~1,500 m² plus civil and site works", "650k to 1,100k", "21.4M to 36.2M", - "Estimate at 12,000 to 20,000 THB/m² plus ~20% site works; RFQ ready"], - ["Land", "0 (leased)", "0", "Was 360k to 970k for purchase; rent moves to operating cost"], - ["Cassette duplication line", "40k to 150k", "1.3M to 5.0M", "Estimate, section 4.8"], - ["CD-R duplication", "15k to 40k", "0.5M to 1.3M", "Estimate, section 4.9 option A"], - ["Traceability and factory software", "60k to 170k", "1.9M to 5.7M", "Estimate, development " - "project"], - ["Freight, installation, training (non-Newbilt)", "120k to 230k", "3.8M to 7.6M", "Estimate"], - ["Working capital, PVC stock, spares, lease deposit", "135k to 290k", "4.5M to 9.6M", - "Estimate; includes lease deposit and first-year rent"], - ["Subtotal", "~3.8M to 7.0M", "~125M to 231M", ""], - ["Contingency 15%", "~0.6M to 1.0M", "~19M to 35M", ""], - ["**Total, full vision**", "**~4.4M to 8.0M**", "**~144M to 264M**", "Before the lease " - "decision: 4.7M to 8.9M"], - ["Not included: CD replication (option B)", "1.5M to 4.0M", "50M to 132M", "Separate " - "decision, separate feasibility study, phase 2 building"], - ["Not included: phase 2 building", "~750k to 1,250k", "~25M to 41M", "Same THB/m² basis on " - "1,710 m²; expansion " - "beyond the current " - "programme"], - ], widths_mm=[52, 30, 30, 58], font_pt=8.5), + P("Everything priced or estimated so far, rolled into one view of the launch plant decided in October " + "2026: one capital round for the whole chain, from the cutting room to the shrink wrapper, " + "commissioned in sequence. Blocks marked 'estimate' have no vendor confirmation; the rest trace to " + "quotes, published prices or researched ranges. Treat all figures as budgetary with a wide margin " + "(plus or minus 30 to 50 % on the estimates) until requests for quotation replace them. Exchange " + "rates: 1 USD = 33 THB, 1 EUR = 1.155 USD, 1 GBP = 1.35 USD."), + P("The September 2026 draft of this plan priced a phased entry (one press, bridge stampers, outsourced " + "cutting) and a five-press full vision. Both are superseded by the launch plant below and are not " + "repeated here; the planning repository keeps them for the record."), - H2("8.2 Phase 1: what launch actually costs"), - P("The launch configuration is far smaller than the full vision, and it is the number the " - "investor is asked to commit to after the gates clear. It buys a purpose-built, climate-controlled " - "plant with one semi-automatic press line, bridge stampers from the UK, basic QC, first-version " - "traceability, the rooftop solar array and battery, and the cassette and CD-R lines."), - T(["Block", "USD low", "USD high", "Note"], [ - ["Phase 0: consultants, legal, soil test, trade show, re-quotes", "40k", "80k", "Section 14"], - ["Newbilt Single 2.1 system incl. freight", "230k", "260k", "Re-quote drift on the 2024 EUR " - "figure"], - ["Building, civil and site works", "650k", "1,100k", "Soil result is the main variable"], - ["Utilities: electric steam, compressed air, chiller, water treatment, racking, whole-plant " - "HVAC, ~290 kWp PV, 271 kWh battery", "690k", "1,160k", "Clean-room adder deferred to the " - "galvanics phase"], - ["Basic QC, PVC lab, traceability v1", "70k", "180k", "Microscope, benchtop lab, sampled " - "listening, software v1"], - ["Cassette duplication and CD-R lines", "60k", "190k", "Tier A or small tier B cassette"], - ["Freight, installation, commissioning beyond Newbilt's 5 days, training", "40k", "100k", - "Newbilt service EUR 84/h plus travel"], - ["Working capital, PVC stock, spares, lease deposit, first-year rent", "130k", "290k", ""], - ["Subtotal", "~1.9M", "~3.4M", ""], - ["Contingency 15%", "~0.3M", "~0.5M", ""], - ["**Phase 1 total**", "**~2.2M**", "**~3.9M**", "**~THB 73M to 128M**"], - ], widths_mm=[80, 22, 22, 46], font_pt=8.5), - P("Galvanics, the automatic presses, the mastering room, the full metrology stack and the biomass " - "boiler follow as revenue-funded or second-round expansions; the remainder between phase 1 and " - "the full vision is roughly USD 2.2M to 4.1M. The planning already supports the split: the " - "Duplex-ready hydraulics, the bridge role for Stamper Discs, the staged electric-to-biomass " - "steam path and the phaseable metrology stack are all documented for exactly this reason."), + H2("8.1 The launch plant, all blocks"), + T(["Block", "USD", "THB", "Basis"], [ + ["Phase 0: BOI consultant, legal and lease work, soil test, re-quotes", "40k to 80k", + "1.3M to 2.6M", "Estimate"], + ["Newbilt Duplex system (two HRP 12 presses, EX 50 main and EX 35 colour extruder, trimmer, label " + "oven, shrink wrapper, grinder, label punch)", "350k to 370k", "11.6M to 12.2M", + "Quoted: 2024 offer EUR 200,500 for the Single 2.1 plus the quoted second press and extruder " + "~USD 115k; expired, re-quote"], + ["Newbilt Classic, fully automatic press", "290k to 460k", "9.6M to 15.2M", "Placeholder (the old " + "automatic-press band per press); **no Newbilt price on file**"], + ["Pheenix galvanics line (PASU, PPPU, one PDPU, PMPB)", "320k to 650k", "10.6M to 21.4M", + "Estimate; **no Pheenix price on file**; OMS's reference prices for a 4-cell wet room (EUR 224k " + "to 311k, ~USD 259k to 359k) sit at the low end"], + ["Galvanics water: zero-discharge (ZLD) evaporator and DI water", "97k to 258k", "3.2M to 8.5M", + "Researched: utilities rows, now launch scope"], + ["Water-treatment building next to galvanics (~12 × 10 m, proposed)", "52k to 87k", "1.7M to 2.9M", + "Estimate at the building rate below"], + ["Sibert stamper prep: VSF back-finisher, VSP punch, VSC coiner", "250k", "8.3M", "Sibert's budget " + "confirmation, 5 October 2026; its time, spares, shipping and travel sit in the freight and " + "working-capital lines"], + ["Cutting room: Sillitoe SDMS lathe, spare cutterhead and support, mastering console and chain, " + "monitoring, room build-out", "200k to 350k", "6.6M to 11.6M", "SDMS list price USD 125k (ex tax " + "and shipping); the rest estimate"], + ["Metrology and QC stack (XRF, laser confocal, wide-area profiler, inline vision on three presses, " + "audio station)", "350k to 810k", "11.6M to 26.7M", "Estimate, phaseable"], + ["PVC lab, day-one tier", "55k to 150k", "1.8M to 5.0M", "Estimate"], + ["Utilities, solar, battery, HVAC, clean zones, racking", "863k to 1,477k", "28.5M to 48.7M", + "Researched: Thai supplier ranges, re-sized for three presses (two chiller modules instead of " + "three)"], + ["Building ~1,500 m² plus civil and site works", "650k to 1,100k", "21.4M to 36.3M", "Estimate at " + "12,000 to 20,000 THB/m² plus ~20 % site works; soil is the main variable"], + ["Overhead crane, runway, frame premium, machine door", "97k to 227k", "3.2M to 7.5M", "Estimate"], + ["Maintenance workshop and machine bay fit-out", "30k to 76k", "1.0M to 2.5M", "Estimate"], + ["Visitor corridor and accessible entrance", "67k to 148k", "2.2M to 4.9M", "Estimate"], + ["Utility yard built for four boiler and four chiller modules", "73k to 122k", "2.4M to 4.0M", + "Estimate"], + ["Factory software, ERPNext, artist platform public side", "115k to 310k", "3.8M to 10.2M", + "Estimate: factory software 60k to 170k, ERPNext implementation 15k to 50k, artist platform " + "40k to 90k"], + ["Cassette duplication and CD-R duplication", "55k to 190k", "1.8M to 6.3M", "Estimate, sections " + "4.8 and 4.9"], + ["Freight, installation, commissioning, training (Pheenix, Sibert, Sillitoe, Newbilt beyond its " + "quoted 5 days)", "150k to 300k", "5.0M to 9.9M", "Estimate"], + ["Working capital, PVC stock, spares, lease deposit, first-year rent", "135k to 290k", + "4.5M to 9.6M", "Estimate; land is leased, so no land purchase"], + ["Subtotal", "~4.24M to 7.71M", "~140M to 254M", ""], + ["Contingency 15 %", "~0.64M to 1.16M", "~21M to 38M", ""], + ["**Total, launch plant**", "**~4.9M to 8.9M**", "**~161M to 292M**", "**Midpoint ~6.9M USD, " + "~227M THB**"], + ], widths_mm=[52, 30, 30, 58], font_pt=8.5, + caption="Source: docs/finance/total-investment.md, 'Launch plant (October 2026)'. The second Duplex " + "system and further Classics are growth options with room reserved (hall floor, utility " + "module positions, ring-main tees), not part of this total."), + P("**Not in the total:** a reserve for the ramp-up (staff hired before first revenue, overheads until " + "volume covers them), ~10M to 20M THB, estimate; CD replication (section 4.9); financing costs; " + "currency moves; the mobile shelving for the father and mother archive (to quote); and the central " + "hydraulic plant around the Newbilt aggregates (standby pump set, accumulator station, ring main), " + "not costed yet, for a Thai hydraulic power unit builder to quote. The blocks are vendor prices " + "without Thai duty or import VAT, so they assume BOI promotion: without it, ~5 % duty on ~2.3M USD " + "of imported machinery (~0.11M USD) comes on top, plus ~0.17M USD of import VAT paid at the border " + "and reclaimed later (estimates)."), + + H2("8.2 The investor's question: 180M THB, maybe 20 % more"), + P("The lead investor asked in October 2026 whether the plant can be built for **180M THB (~5.45M USD), " + "possibly up to 20 % more (216M THB, ~6.55M USD)**. Against the launch-plant total:"), + T(["Case", "Launch plant", "Against 180M", "Against 216M"], [ + ["Low end of every block", "~161M THB", "Fits, ~19M to spare", "Fits"], + ["Midpoint", "~227M THB", "~47M over", "~11M over"], + ["High end of every block", "~292M THB", "~112M over", "~76M over"], + ], widths_mm=[50, 40, 40, 40]), + P("At the midpoint, four levers bring the plant inside 216M without dropping any of the machines " + "decided above (midpoint values with their share of the contingency, estimates):"), + T(["Lever", "Saves", "Launch plant after it"], [ + ["Rooftop solar and battery through a solar PPA (the installer owns and finances the array, the " + "plant buys the power) instead of buying them", "~12.3M THB", "~214M THB"], + ["Metrology launch tier (XRF, inline vision, audio station); the laser confocal and the wide-area " + "profiler bought from revenue", "~10.1M THB", "~204M THB"], + ["Pheenix galvanics priced near OMS's reference for a 4-cell wet room (EUR 224k to 311k)", + "~6.7M THB", "~198M THB"], + ["Visitor corridor built later; the plant runs without public tours at first", "~4.1M THB", + "~193M THB"], + ], widths_mm=[110, 26, 34]), + CALL("Reading this honestly", [ + "**216M THB is a realistic target for the full equipment list; 180M THB holds only if the open " + "quotes land low.** With the four levers and the ramp-up reserve of ~10M to 20M THB on top, the " + "midpoint comes to ~203M to 213M THB, inside 216M.", + "**180M is a low-quote outcome, not a plan.** Reaching it at the midpoint needs scope cuts on top " + "of the levers: cassette and CD-R later (~4.6M THB) and a rented crane for the installations while " + "the frame stays crane-ready (~3.7M THB) give ~185M before the reserve, still above 180M.", + "**Chinese suppliers do not change the answer.** Boilers, compressed air and hydraulics were " + "checked in October 2026: about 2M THB at the midpoint (~2.5M with contingency), ~1 % of the " + "target. Worth taking for the two boiler modules (ASME-stamped 1.25 MPa design; an imported " + "boiler must be verified by a certification body registered with the Thai Department of " + "Industrial Works) and for the compressor (Kaishan and Denair have Thai offices). The Newbilt " + "hydraulic aggregates stay Newbilt's. Chinese chillers and HVAC, larger blocks, are not checked " + "yet.", + ]), + P("**What decides it.** The Classic and the Pheenix galvanics line have no price on file, and the " + "building depends on the soil. Four requests settle most of the band: the Newbilt re-quote for the " + "Duplex and the Classic, a Pheenix quote for the galvanics line, the building request for quotation " + "with a soil test, and distributor quotes for the metrology stack. Until they are in, the plan " + "quotes **~216M THB as the target** with the levers above, and 180M as the low-quote case."), H2("8.3 Tranches"), - P("Phase 1 capital is released against milestones rather than up front, so that each tranche is " - "spent only once the previous gate has cleared:"), + P("The launch plant is one capital round, but it is not one payment. Capital is released against " + "milestones, so each tranche is spent only once the previous gate has cleared. Because cutting and " + "galvanics are commissioned first and have their own build times, their orders sit in the first " + "long-lead tranche next to the presses. The shares below are estimates for planning the calls on " + "capital, not a payment schedule agreed with any vendor."), T(["Tranche", "Trigger", "Covers", "Approx. share"], [ - ["0", "Now", "Phase 0 work", "2 to 3%"], + ["0", "Now", "Phase 0 work (section 14.1)", "1 to 2 %"], ["1", "BOI certificate issued; lease signed; zoning and soil confirmed; pricing validated", - "Press order deposit, building design and permit, long-lead utility orders", "25 to 30%"], - ["2", "Building permit; press build confirmed", "Construction, utilities, solar", "40 to 45%"], - ["3", "Building watertight; machinery shipped", "Fit-out, HVAC commissioning, QC and software, " - "cassette and CD-R lines, hiring", "15 to 20%"], - ["4", "Commissioning complete", "Working capital, stock, first stamper orders", "8 to 10%"], - ], widths_mm=[16, 62, 66, 26]), + "Deposits on every long-lead order: Pheenix galvanics line, Sillitoe lathe, Sibert line, Newbilt " + "Duplex and Classic; building design and permit; first boiler and chiller modules", "20 to 30 %"], + ["2", "Building permit; vendor build dates confirmed in writing", "Construction, water-treatment " + "building, utility yard, utilities, balance payments as machines are built", "35 to 45 %"], + ["3", "Building watertight; first machinery shipped", "Fit-out, HVAC and clean zones, ZLD and DI " + "water, crane, metrology, factory software and ERPNext, cassette and CD-R lines, the launch team", + "15 to 20 %"], + ["4", "Cutting room and galvanics commissioned; first stampers made", "Working capital, PVC stock, " + "spares, first-year rent; the ramp-up reserve (outside the total) is drawn from here on", + "8 to 12 %"], + ], widths_mm=[16, 54, 74, 26]), H2("8.4 What moves the number"), B([ - "**BOI** machinery duty exemption applies across most of the equipment blocks, and the solar " - "and automation spend converts into tax-exemption headroom; the application precedes every " - "purchase order.", - "**The ground.** Soft paddy soil under the building, paving and fill platform is the single " - "largest cost variable in the building package, and the cheapest to resolve.", - "**Biggest uncertainty bands:** metrology (partly a choice of ambition), the mastering room " - "(bespoke vendor, no public pricing), the automatic presses (one unverified price point), " - "the galvanics line, and every cassette and CD figure.", - "**Every band narrows only with quotes.** The supplier map in the project repository lists who " - "to ask, and the re-quotes are phase 0 work.", + "**BOI promotion.** The machinery duty and import VAT exemption applies across most of the " + "equipment blocks (~0.11M USD of duty and ~0.17M USD of import VAT cash flow, estimates), and the " + "automation and solar spend converts into corporate income tax exemption headroom. The application " + "precedes every purchase order. One interaction to check with the BOI consultant: the solar measure " + "is based on the plant's own solar investment, so the solar PPA lever would likely give that " + "headroom up (our reading).", + "**The ground.** Soft paddy soil under the building, paving and fill platform is the single largest " + "cost variable in the building package, and the cheapest to resolve: a soil boring test costs " + "THB 30k to 50k.", + "**The two missing machine prices.** The Classic and the Pheenix line carry two of the widest " + "machine bands in the table and have no vendor price at all. The Classic band is a placeholder " + "borrowed from another vendor's automatic press.", + "**Chinese suppliers: ~1 %.** Checked for boilers, compressed air and hydraulics, worth about 2M " + "THB (section 8.2). Chillers and HVAC are the larger blocks and have not been checked yet; that is " + "the next Chinese lever to test.", + "**Solar PPA.** The largest single lever (~12.3M THB at the midpoint) moves the array off the " + "capital budget and adds a power price to the energy line instead.", + "**Every band narrows only with quotes.** The supplier map in the planning repository lists who to " + "ask, and the re-quotes are phase 0 work (section 14).", ]), + H2("8.5 Currency exposure"), - P("Revenue will be mostly USD and EUR from export customers; the cost base is mostly THB; the " - "largest single equipment block is EUR-denominated and unhedged against an order that will not " - "be placed for roughly a year. A 10% move in EUR/THB between now and the Newbilt order is worth " - "USD 25k to 35k on that line alone. Operationally, roughly two-thirds of direct cost (labour, " - "energy, cartons, maintenance) is THB, so a 10% baht appreciation takes 0.09 to 0.17 USD off the " - "gross margin per record without any operational change. Two mitigations are planned: ask every " - "re-quote to state its currency and validity period, and decide early whether to quote regional " - "customers in THB. Hedging the press order once the BOI timeline is known is a decision for the " - "investor."), + P("Revenue will be mostly USD and EUR from export customers; the cost base is mostly THB; the equipment " + "is priced in several currencies. Newbilt quotes in EUR, and the Pheenix line is expected in EUR " + "(European vendor, no quote yet; the currency is a stated field in the request). Sibert's budget and " + "Sillitoe's list price are in USD (Sibert is a UK company, Sillitoe Australian). None of it is " + "hedged, and the orders will not be placed for roughly a year. In the September draft a 10 % move " + "in EUR/THB was worth USD 25k to 35k on the Duplex line alone; with the Classic and the galvanics " + "line also in EUR, the three EUR lines come to ~0.96M to 1.48M USD, so the same move is worth " + "roughly USD 0.1M to 0.15M (estimate)."), + P("Operationally, roughly two-thirds of direct cost (labour, energy, local cartons, maintenance) is " + "THB, so a 10 % baht appreciation takes **0.09 to 0.17 USD off the gross margin per record** without " + "any operational change, enough to push the adverse case further under water. Three mitigations " + "are planned: every re-quote states its currency and validity period; decide early whether to " + "quote regional customers in THB; and decide, once the BOI timeline is known, whether to hedge the " + "EUR orders. The hedging decision belongs to the investor."), # ------------------------------------- 9 revenue and operating model H1("9. Revenue and operating model"), - P("A first-pass economic model at mature capacity. Most numbers are estimates from industry pricing " - "norms and the project's own cost research; the point is the shape of the economics and which " - "levers matter, not precision. The pricing assumptions are deliberately held at the conservative " - "Western export benchmark even though the one set of Thai market data (section 3.3) says " - "domestic prices are several times higher: re-basing the whole model on one supplier's price " - "list in a market with one supplier would be worse than leaving it low."), + P("A first-pass economic model of the launch plant in a mature year. Most numbers are estimates from " + "industry pricing norms and the project's own cost research; the point is the shape of the economics " + "and which levers matter, not precision. The price assumption is deliberately held at the " + "conservative Western export level even though the one set of Thai market data (section 3.3) says " + "domestic prices are several times higher: re-basing the whole model on one supplier's price list " + "in a market with one supplier would be worse than leaving it low."), + H2("9.1 Pricing assumptions"), B([ - "**Blended pressing price: USD 3.50 to 4.60 per record** (THB 115 to 150), across run sizes " - "and the standard/colour mix, covering pressing, labels, inner sleeve and assembly into the " - "jacket; deluxe packaging passed through at cost plus margin. Western plants charge roughly " - "USD 2.90 to 5.80 for standard black at volume, with premiums of 0.60 to 1.70 for colour and " - "splatter, 180 g and small runs.", + "**Blended pressing price: USD 3.50 to 4.60 per record** (THB 115 to 150), across run sizes and the " + "standard/colour mix, covering pressing, labels, inner sleeve and assembly into the jacket; deluxe " + "packaging passed through at cost plus margin. Western plants charge roughly USD 2.90 to 5.80 for " + "standard black at volume, with premiums of 0.60 to 1.70 for colour and splatter, 180 g and small " + "runs.", + "**Western benchmark, October 2026.** Record Industry (Haarlem) publishes its prices online: 300 " + "copies of a black 140 g LP with stampers, test pressings, printed labels, a paper inner sleeve, a " + "printed jacket and shrink wrap come to **1,721 EUR all-in (~219 THB a copy)**, ex VAT and freight. " + "Its per-title items (set-up, small-run charge, cutting, stampers, test pressings) total about 580 " + "to 600 EUR, the low end of this plan's title assumption; black pressing with printed labels and a " + "paper inner sleeve comes to about 2.43 USD a copy at 300, below the 2.90 to 5.80 range.", + "**Thai market.** The ResurRec invoices of August 2026 come to **650 to 950 THB a copy all-in at " + "300**, about 3 to 4.3 times Record Industry's ex-works price. The artist ordering demo's price " + "list comes to **~343 THB a copy at 300** with vinyl mastering: above the European ex-works price, " + "well below the Thai market. Both price levels stay open until market validation (roadmap item 1).", "**Per-title services: USD 580 to 1,730 per title** (THB 19k to 57k) for mastering, cutting, " - "stampers and test pressings, at roughly 300 to 600 titles a year at full capacity. Observed " - "Thai rates suggest this is understated by up to three to four times for a full album, but " - "mastering is labour-bound (an engineer masters perhaps two to four songs a day) and the plan " - "staffs one to two engineers, which caps this line.", - "**Cassettes and CD-Rs** are add-on lines, not in the totals: illustratively 20k to 60k " - "cassettes a year at USD 2.50 to 4.00 (USD 50k to 240k) and 10k to 40k CD-Rs at USD 1.50 to " - "3.00 (USD 15k to 120k). Estimates with no market data behind them yet.", - "**Dropshipping fees** per parcel are on top and not modelled.", + "stampers and test pressings. The middle of the range is the **artist-demo per-title fee of 37,836 " + "THB**: mastering 10,000, lacquer 5,336, cutting 4,000, plating 14,000, press set-up 3,000 and " + "tests 1,500. The launch plant models 200 to 400 titles a year; mastering is labour-bound, and the " + "plan staffs one to two engineers, which caps this line.", + "**Cassettes and CD-Rs** are add-on lines, not in the operating picture. The September draft " + "illustrated them at 20k to 60k cassettes a year at USD 2.50 to 4.00 and 10k to 40k CD-Rs at USD " + "1.50 to 3.00; estimates with no market data behind them yet.", + "**Dropshipping fees** per parcel and **stamper supply to other plants** are on top and not " + "modelled.", ]), - H2("9.2 Revenue at full capacity"), - T(["Scenario", "Records/yr", "Pressing revenue", "Title services", "Total USD", "Total THB"], [ - ["Mature, low", "1.0M", "~3.5M", "~0.17M", "**~3.7M/yr**", "**~122M/yr**"], - ["Mature, high", "1.5M", "~6.1M", "~0.69M", "**~6.8M/yr**", "**~224M/yr**"], - ], widths_mm=[26, 22, 30, 28, 32, 32], - caption="Low: 1.0M × USD 3.50 plus 300 titles × 580. High: 1.5M × 4.05 plus 600 titles × 1,155. " - "A pure-volume plant runs at the low per-title end; a boutique-heavy mix pushes titles up " - "and volume down."), + + H2("9.2 Capacity and revenue of the launch plant"), + P("Three presses make **~0.71 to 0.97 million records a year on two shifts** (estimate): the two " + "semi-automatic presses of the Duplex system at 60 to 80 records an hour each and the Classic at " + "~128 an hour (28 s cycle, vendor flyer), at 60 to 70 % effectiveness, 16 hours a day and 300 days " + "a year. The press fleet calculator, at the team's planning rates (3 records a minute per Duplex " + "system, 2 per Classic, 65 % effectiveness), gives ~0.94 million. The central case takes the " + "middle, 0.84 million."), + T(["USD per year", "Adverse", "Central", "Favourable"], [ + ["Records", "0.71M", "0.84M", "0.97M"], + ["Blended price", "3.50", "4.05", "4.60"], + ["Pressing revenue", "~2.49M", "~3.40M", "~4.46M"], + ["Titles × per-title fee", "200 × 580", "300 × 1,155", "400 × 1,730"], + ["Title-services revenue", "~0.12M", "~0.35M", "~0.69M"], + ["**Revenue**", "**2.60M (~86M THB)**", "**3.75M (~124M THB)**", "**5.15M (~170M THB)**"], + ], widths_mm=[50, 40, 40, 40], + caption="Estimate. Pressing and title revenue are records × price and titles × fee; the totals are " + "those of docs/finance/revenue-model.md. A pure-volume plant runs at the low per-title " + "end; a boutique-heavy mix pushes titles up and volume down."), + H2("9.3 Direct cost per record"), T(["Cost element", "USD/record", "THB/record", "Basis"], [ - ["PVC compound", "0.29 to 0.46", "9.6 to 15.2", "~150 to 160 g effective virgin at 1.75 to " - "2.90 USD/kg; regrind loop covers scrap"], + ["PVC compound", "0.29 to 0.46", "9.6 to 15.2", "~150 to 160 g effective virgin at 1.75 to 2.90 " + "USD/kg; regrind loop covers scrap"], ["Labels", "0.03 to 0.09", "1.1 to 3.0", "Printed pairs, volume"], ["Inner sleeve", "0.09 to 0.17", "3.0 to 5.7", "Poly-lined"], - ["Jacket (standard)", "0.40 to 0.92", "13.3 to 30.4", "Ploy Printing; largely pass-through"], + ["Jacket (standard)", "0.40 to 0.92", "13.3 to 30.4", "Ploy Printing and local carton partners; " + "largely pass-through"], ["Shrink wrap", "0.02 to 0.03", "0.8 to 1.1", "Film"], ["Energy", "0.12 to 0.23", "3.8 to 7.6", "~1.5 to 2 kWh blended per record at grid/solar mix"], - ["Production labour", "0.08 to 0.16", "2.6 to 5.4", "13 to 19 direct staff at northern Thai " - "rates, loaded ×1.3, over 1.0 to 1.5M " - "records"], - ["Stamper amortisation", "0.03 to 0.12", "1.0 to 4.0", "In-house three-generation set at " - "~USD 60 to 150 marginal over 1,000 " - "to 2,000 pressings"], + ["Production labour, launch plant", "**0.12 to 0.23**", "4.0 to 7.6", "13 to 19 direct staff, " + "3.7M to 5.4M THB a year, over 0.71 to 0.97M records (0.08 to 0.16 on the five-press fleet)"], + ["Stamper amortisation", "0.03 to 0.12", "1.0 to 4.0", "In-house three-generation set at ~USD 60 " + "to 150 marginal over 1,000 to 2,000 " + "pressings"], ["Maintenance, spares, consumables", "0.12 to 0.23", "3.8 to 7.6", "Estimate"], - ["Reject allowance", "0.12 to 0.17", "3.8 to 5.7", "5 to 10% reject rate carried by good units"], - ["**Total direct cost**", "**~1.30 to 2.58**", "**~43 to 85**", ""], - ], widths_mm=[42, 26, 26, 76], font_pt=8.5), - P("Blended price minus direct cost gives a gross margin of about **USD 2.11 per record at the " - "midpoint (~52%)**. The spread is wide and worth stating: the adverse corner (low price meeting " - "high cost) leaves USD 0.92 (26%), the favourable corner USD 3.30 (72%). Price realisation and " - "cost control each move the margin by more than a third on their own."), - H2("9.4 Operating picture at full capacity"), + ["Reject allowance", "0.12 to 0.17", "3.8 to 5.7", "5 to 10 % reject rate carried by good units"], + ["**Total direct cost, launch plant**", "**~1.34 to 2.65**", "**~44 to 87**", "Central 1.98"], + ], widths_mm=[42, 26, 26, 76], font_pt=8.5, + caption="Estimates, docs/finance/revenue-model.md. THB at 33 per USD."), + P("**Why labour per record is higher than in the September draft.** Two shifts need the full press, " + "finishing, galvanics, QC and maintenance crews whether the hall holds three presses or five, so " + "the direct payroll stays at 3.7M to 5.4M THB a year (113k to 163k USD) while the volume falls from " + "1.0 to 1.5 million records to 0.71 to 0.97 million. Labour per record rises to **0.12 / 0.16 / " + "0.23 USD** (favourable / central / adverse), and the direct cost to 1.34 / 1.98 / 2.65 USD. The " + "build-up, at northern Thai rates loaded ×1.3 for social security, overtime, bonus and PPE:"), + T(["Role", "Heads", "THB/month each, loaded"], [ + ["Press and finishing operators", "8 to 12", "~19,500"], + ["Galvanics", "2 to 3", "~32,500"], + ["QC", "1 to 2", "~26,000"], + ["Maintenance", "2", "~32,500"], + ["**Direct production payroll**", "**13 to 19**", "**~312,000 to 449,000 a month**"], + ], widths_mm=[80, 30, 60]), + P("Mastering and cutting engineers are title-services labour, not per-record (a cutting engineer earns " + "about 50,000 THB a month base, team figure); admin, sales and logistics sit in overheads. Group " + "health insurance with a yearly check-up (~0.35M THB a year for ~20 staff) and unified workwear " + "(~0.3M THB a year) come on top of the ×1.3 and are not yet in the per-record figure."), + + H2("9.4 Operating picture of the launch plant"), P("Built from the components above. Three scenarios, each internally consistent: adverse pairs low " - "volume with the low price and high cost; favourable does the opposite; central takes midpoints. " - "Cash overheads (admin, sales, insurance, facility running, IT, professional fees, marketing, and " - "now the land lease) are estimated at USD 210k to 480k a year and paired high-to-adverse. " - "Depreciation is the 4.4M to 8.0M capital over 10 to 15 years."), - T(["USD per year", "Adverse", "Central", "Favourable"], [ - ["Records", "1.0M", "1.25M", "1.5M"], + "volume with the low price, the high cost, the high capital and the high overheads; favourable does " + "the opposite; central takes midpoints. Cash overheads (admin, sales, insurance, facility running, " + "IT, professional fees, marketing, the land lease) are estimated at USD 0.20M to 0.45M a year and " + "paired high-to-adverse. Depreciation is 8.9M USD over 10 years (adverse), the 216M THB target " + "(~6.55M USD) over 12.5 years (central), and 4.9M USD over 15 years (favourable)."), + T(["USD per year, mature", "Adverse", "Central", "Favourable"], [ + ["Records", "0.71M", "0.84M", "0.97M"], ["Blended price", "3.50", "4.05", "4.60"], - ["Direct cost", "2.58", "1.94", "1.30"], - ["Contribution per record", "0.92", "2.11", "3.30"], - ["Pressing contribution", "0.92M", "2.64M", "4.95M"], - ["Title-services contribution", "0.10M", "0.28M", "0.48M"], - ["**Total contribution**", "**1.02M**", "**2.92M**", "**5.43M**"], - ["Cash overheads incl. lease", "0.48M", "0.35M", "0.21M"], - ["**EBITDA**", "**0.54M**", "**2.57M**", "**5.22M**"], - ["Depreciation", "0.80M", "0.50M", "0.29M"], - ["**Operating profit**", "**−0.26M**", "**2.07M**", "**4.93M**"], - ["Payback on 4.4M to 8.0M capital", "never", "2.1 to 3.9 yr", "0.9 to 1.6 yr"], - ], widths_mm=[60, 36, 36, 38]), + ["Direct cost", "2.65", "1.98", "1.34"], + ["Contribution per record", "0.85", "2.07", "3.26"], + ["Pressing contribution", "0.60M", "1.74M", "3.17M"], + ["Title-services contribution", "0.07M", "0.23M", "0.48M"], + ["**Total contribution**", "**0.67M**", "**1.96M**", "**3.65M**"], + ["Cash overheads", "0.45M", "0.33M", "0.20M"], + ["**EBITDA**", "**0.22M**", "**1.63M**", "**3.45M**"], + ["Depreciation", "0.89M", "0.52M", "0.33M"], + ["**Operating profit**", "**-0.67M**", "**1.11M**", "**3.12M**"], + ["Revenue", "2.60M (~86M THB)", "3.75M (~124M THB)", "5.15M (~170M THB)"], + ["Payback (EBITDA, mature year)", "never", "~4 yr (3.0 to 5.5 on 4.9M to 8.9M)", "~1.4 yr"], + ], widths_mm=[50, 36, 48, 36], + caption="Estimates, docs/finance/revenue-model.md 'Operating picture of the launch plant (October " + "2026)'. Title services at 60 to 70 % contribution after lacquers, styli and nickel."), CALL("Reading this table honestly", [ - "**The adverse case loses money.** At 1.0M records, the low price, the high cost and the high " - "capital, the plant is EBITDA-positive but does not cover depreciation. Utilisation and price " - "realisation are not upside levers; they decide solvency.", - "**The favourable case is not credible**, and that is a finding about the cost table, not the " - "business. A 69% EBITDA margin is roughly triple what pressing plants earn; even the central " - "case at ~47% is well above industry norms of 15 to 25%. The direct cost table counts only " - "per-record consumables and direct payroll and almost certainly understates: missing at " - "minimum are indirect production labour, consumables beyond those listed, scrap above the " - "reject allowance, water and effluent, inbound freight, inventory carrying cost and sales " - "commission. Treat the adverse column as the honest one until those lines exist.", - "**This is a sensitivity, not a forecast.** BOI tax exemptions shield part of early-year " - "profits where there are any. The mix lever is real: colour, splatter and boutique runs carry " - "20 to 50% premiums and suit the semi-automatic line, and the title-services line has " - "software-like margins once the rooms exist.", + "**The central case works on 216M THB.** EBITDA ~1.6M USD (~54M THB) and operating profit ~1.1M " + "USD (~37M THB) a year once the plant runs at volume. It breaks even on operating profit at about " + "**0.3 million records a year, a little over a third of capacity**.", + "**The adverse case cannot cover depreciation at any volume three presses make.** It would need " + "~1.5 million records. It stacks the low price, the high cost, the high capital and the high " + "overheads at once. At the central cost and volume, the price that covers depreciation is only " + "~2.7 to 3.0 USD (~90 to 98 THB) a record, below the low price assumed: price realisation and " + "utilisation decide solvency, not upside.", + "**The central margin is too good to trust yet.** A central EBITDA margin of ~43 % is far above " + "the 15 to 25 % pressing plants earn. The direct cost table counts only per-record consumables and " + "direct payroll and leaves out indirect labour (supervision, planning, warehouse), freight, scrap " + "above the reject allowance and sales commissions. **Treat the adverse column as the honest one " + "until those lines exist.**", + "**This is a sensitivity, not a forecast.** The press fleet calculator, with its own cost build-up, " + "gives a somewhat better central picture at 850k records: revenue 3.75M, EBITDA 1.82M, operating " + "profit 1.29M USD, payback 3.6 years. Not modelled: cassette and CD-R lines, stamper supply to " + "other plants, dropshipping fees, and the ramp year. BOI tax exemptions shield part of early-year " + "profits where there are any.", ]), + H2("9.5 The ramp"), - P("The operating picture above is the mature plant. The launch plant (one line, one shift) presses " - "90k to 135k records a year, which at the same blended price is USD 0.3M to 0.6M of pressing " - "revenue plus title services, cassette and CD-R lines, and possibly stamper supply to the " - "incumbent if galvanics comes early. It will not cover a full overhead base in year one, and " - "early production runs slower and rejects more than any of these figures while the process " - "settles. The Duplex expansion (second press on the existing hydraulics, ~USD 115k) is the " - "first revenue-funded step and roughly doubles capacity for a small sum; it should be planned " - "for year two. A year-by-year cash model belongs to the financing discussion and is a next " - "step, not a claim this plan makes."), + P("The table above is a mature year. The launch plant does not start there. It is commissioned in " + "sequence: first the cutting room and galvanics (the presses need their stampers), then the Duplex " + "system, then the Classic. Early production runs slower and rejects more than any of these figures " + "while the process settles, and the crews of a two-shift plant are on the payroll before the " + "volume is. The **ramp-up reserve of ~10M to 20M THB** (estimate, outside the investment total) is " + "there to carry staff hired before first revenue and overheads until volume covers them. Fan-funded " + "campaigns on the artist platform open only after the first releases have shipped and lead times " + "are measured."), + P("**A year-by-year cash model for the ramp is a next step, not a claim this plan makes.** It belongs " + "to the financing discussion and needs the vendor build times and the commissioning calendar " + "(section 10) first."), + P("**The growth option.** A second Duplex system (two more semi-automatic presses) lifts the plant to " + "~1.0 to 1.5 million records a year, roughly **+0.3 to 0.5 million records**, for **~USD 230k to " + "300k** for the press system (estimate: two presses at the quoted ~115k per press and extruder set, " + "plus hydraulic unit and EX 35, no EX 35 price on file); its utility modules and installation come " + "on top. The hall, the module positions in the boiler hall and chiller compound, and the ring-main " + "tees are reserved for it, so it is a revenue-funded step, not a rebuild."), # ----------------------------------------------- 10 timeline H1("10. Timeline: today to first paying release"), - P("Anchored at September 2026. Every duration is an estimate; one of them is not documented " - "anywhere and governs the whole schedule. **First paying release lands around Q4 2028 to " - "mid-2029, roughly 27 to 33 months from today.** The critical path is not construction:"), - CALL("The critical path", "BOI certificate → press order → press build → sea freight → " - "commissioning. Everything else, including the entire building, has float against that chain. " - "The two things that move the date are the BOI filing date and the press vendor's build time, " - "and the second is not documented anywhere: 9 to 12 months is an industry-typical figure for " - "a built-to-order system from a small German manufacturer and it carries about 40% of the " - "schedule. If the real figure is 15 to 18 months, launch moves to mid-2029. The re-quote now " - "being requested asks for quoted build time and order-book position; it is one line in an " - "email and the single highest-value missing fact in the project."), + P("Every duration is an estimate. The calendar in the planning repository was drawn in August 2026 and " + "has not yet been re-drawn for the launch plant; nothing in phase 0 has started, so it shifts day " + "for day with the BOI consultant engagement. On that calendar, **first paying release lands around " + "Q4 2028 to mid-2029, roughly 27 to 33 months from the start of phase 0.** This plan quotes that " + "as the working figure, not as a re-based date (the executive summary marks it open), and flags " + "the new risk to it: the launch plant puts the metal path on the critical path."), + CALL("The critical path", [ + "**BOI certificate → long-lead orders → vendor builds → sea freight → commissioning of the cutting " + "room and galvanics → first stampers → press commissioning → test pressings → first paying " + "release.** Everything else, including the entire building, has float against that chain.", + "**Galvanics and cutting now come before the first paying release.** There are no bridge stampers " + "and no outsourced cutting in the launch plant, so the presses cannot press a paying title until " + "the cutting room cuts lacquers and the galvanics line grows fathers, mothers and stampers that " + "pass inspection. The August calendar did not contain this step; whether it fits inside the 2 to " + "3 months of installation and commissioning depends on build times nobody has quoted and on two " + "hires.", + "**The press build time is still assumed.** 9 to 12 months is an industry-typical figure for a " + "built-to-order system from a small German manufacturer, and it carries about 40 % of the " + "schedule. If the real figure is 15 to 18 months, launch moves to mid-2029.", + "**The other vendors are unquoted too.** The Sillitoe lathe is built to order, and the Pheenix line " + "and the Sibert machines have no lead time on file. Build time and order-book position are " + "required fields in every re-quote; it is one line in each email and the highest-value missing " + "fact in the project.", + ]), T(["#", "Step", "Duration", "Source"], [ ["1", "Engage BOI consultant, prepare application", "4 to 5 months", "Estimate"], ["2", "BOI review to certificate", "4 to 6 months", "BOI: ~40 working days decision, 4 to 6 " "months in practice"], ["3", "Company incorporation under the certificate", "1 to 2 months", "Roadmap"], - ["4", "Press order to vendor-ready", "**9 to 12 months**", "**Assumed; not yet quoted**"], - ["5", "Sea freight Germany to Thailand", "6 to 8 weeks", "Newbilt quote includes freight"], - ["6", "Install, commission, train", "2 to 3 months", "Newbilt includes 5 days; rest at " - "~USD 97/h plus travel"], + ["4", "Press order to vendor-ready", "**9 to 12 months**", "**Assumed; not yet quoted.** Pheenix, " + "Sillitoe and Sibert build times also unquoted"], + ["5", "Sea freight Europe to Thailand", "6 to 8 weeks", "Newbilt quote includes freight"], + ["6", "Install, commission, train", "2 to 3 months", "Newbilt includes 5 days; rest at ~USD 97/h " + "plus travel"], + ["6a", "Commission the cutting room and galvanics; first stampers pass inspection", "**Not yet " + "estimated**", "**New with the launch plant**; must finish before step 7"], ["7", "Test pressings, QC baseline, reject shakedown", "1.5 to 2 months", "Roadmap"], - ["", "**Total**", "**~27 to 33 months**", ""], - ], widths_mm=[8, 70, 34, 58]), + ["", "**Total**", "**~27 to 33 months**", "August 2026 calendar, before step 6a"], + ], widths_mm=[10, 68, 34, 58]), T(["Track (in parallel)", "Needed by", "Float", "Becomes critical if"], [ - ["Land lease, zoning, soil test", "Design start, ~Q1 2027", "~4 months", "Zoning fails and a " - "new site is needed (~6 months reset)"], - ["Phase 1 construction", "Machinery arrival, ~Q3 2028", "~3 to 5 months", "Soft soil forces " - "piling, or permits stall"], - ["Factory licence (Ror.Ngor. 4)", "First production, Q4 2028", "~4 months", "Galvanics " - "effluent scope is raised early; keep it out of the phase 1 licence scope unless galvanics " - "moves forward"], - ["Solar and battery", "Fit-out, ~Q2 2028", "Large", "Not a risk; battery lead is 50 to 60 " - "days"], + ["Land lease, zoning, soil test", "Design start, ~Q1 2027", "~4 months", "Zoning fails and a new " + "site is needed (~6 months reset); the plot Payap first offered already fails zoning"], + ["Construction, incl. the water-treatment building and utility yard", "Machinery arrival, " + "~Q3 2028", "~3 to 5 months", "Soft soil forces piling, or permits stall; the galvanics room, " + "clean zone and ZLD plant are now needed first, ahead of the press hall"], + ["Factory licence (Ror.Ngor. 4) with galvanics in the first licence", "First production, Q4 2028", + "~4 months", "Galvanics effluent and hazardous-substance registration are now in the first " + "licence scope: the most likely regulatory friction point; ZLD design in the application from " + "the start"], + ["Solar and battery (purchase or PPA)", "Fit-out, ~Q2 2028", "Large", "Not a risk; battery lead " + "time is 50 to 60 days"], ["Cassette and CD-R lines", "Fit-out, ~Q2 2028", "Large", "Not a risk; short lead times"], - ["Hiring and training", "Commissioning, ~Q3 2028", "~2 months", "Galvanics expertise if " - "galvanics moves forward: the " - "hardest skill to hire"], - ], widths_mm=[40, 40, 24, 66]), - P("**BOI windows are comfortable** on this schedule: machinery clears customs ~Q3 2028 against a " - "30-month import window ending ~Q4 2029, and first production ~Q4 2028 against a ~36-month " - "full-operation deadline. The margin is consumed by exactly one scenario: filing early to start " - "the clock and then discovering the site does not work. Verify zoning before filing."), - P("**Leasing does not by itself pull the launch forward.** Construction has only 3 to 5 months of " - "float against the press chain; removing purchase money from the plan does not move the end date. " - "Only the press order moves it, which is the BOI sequencing question in section 7. The two are " - "one lever, not two."), - P("**What a delay costs.** A month lost engaging the BOI consultant costs a month of launch. A " - "month lost on land or construction costs nothing until the float is gone. A month lost getting " - "the press lead time in writing costs nothing today and may cost six months of surprise later."), + ["Hiring: galvanics process engineer and cutting engineer", "Before the metal path commissions", + "**None: now on the critical path**", "Galvanics is the hardest skill to hire; both people must " + "be hired and trained (at the vendors) before step 6a"], + ["Hiring and training: the rest of the launch team", "Commissioning, ~Q3 2028", "~2 months", + "Two shifts are needed from the start of volume production"], + ], widths_mm=[42, 36, 28, 64]), + P("**BOI windows are comfortable** on the August calendar: machinery clears customs ~Q3 2028 against a " + "30-month import window ending ~Q4 2029 (~15 months of margin), and first production ~Q4 2028 " + "against a ~36-month full-operation deadline (~18 months). The launch plant puts four vendors' " + "machines, not one, inside the import window. The margin is consumed by exactly one scenario: " + "filing early to start the clock and then discovering the site does not work. Verify zoning before " + "filing."), + P("**The one lever worth six to nine months** is the BOI sequencing question in section 7: the duty " + "exemption attaches at importation, not at contract signature, so if an order and deposit can be " + "placed while the application is in review, the press build overlaps the BOI process. It is a " + "question for the BOI consultant, not a claim. The land lease cannot pull the launch forward on its " + "own: construction has float against the vendor chain, and only the orders move the end date."), + P("**What a delay costs.** A month lost engaging the BOI consultant costs a month of launch. A month " + "lost on land or construction costs nothing until the float is gone. A month lost getting the " + "vendor build times in writing, or hiring the galvanics and cutting engineers, costs nothing today " + "and may cost months of surprise later."), - # ------------------------------------ 11 phasing and the galvanics question - H1("11. Phasing, and the one sequencing question that matters"), - P("Nothing in phases 2 to 5 starts before its gate clears: no machinery order before the BOI " - "certificate, no large spending before the market validates the price, no coppice planning " - "before the land-title check. The phased entry is the default path; the full vision is reached " - "through it, not instead of it."), + # ------------------------------------ 11 phasing and commissioning sequence + H1("11. Phasing and commissioning sequence"), + P("The plant launches with the whole chain in one capital round. That replaces the September draft's " + "phased entry, in which galvanics, cutting and the automatic press followed from revenue. The " + "gates have not moved: no machinery order before the BOI certificate, no large spending before the " + "market validates the price, no coppice planning before the land-title check. What changed is " + "that the round, once released, buys the full launch plant, and only growth stays revenue-gated."), T(["Phase", "Content", "Gate"], [ - ["0. Validate and clear the gates (now)", "Market validation at Making Vinyl and with regional " - "labels; BOI consultant, activity code, application; lease terms, zoning, soil test; 60 rai " - "title check; re-quotes from Newbilt, Pheenix, Digital Matrix, Stamper Discs, building " - "contractors, Thai utility vendors; solar and battery engineering checks", "Runs in parallel; " - "gates everything"], - ["1. Quotes and site (during the BOI window)", "Firm quotes; site selection between the Mueang " - "Chi lease and the industrial estate; resolve the 35% vs 45% humidity floor", "BOI filed"], - ["2. Commit", "Incorporate under the certificate; sign the press order; sign the lease; order " - "long-lead items; written stamper turnaround agreement with Stamper Discs", "BOI certificate " - "and validated " - "pricing"], - ["3. Build and commission (~6 to 12 months after commitment)", "Construction, utilities, HVAC, " - "solar, battery, security; machinery installation and vendor commissioning; traceability v1; " - "cassette and CD-R lines; hire and train", "Building permit, press build confirmed"], - ["4. Launch (pressing with bridge stampers)", "Test pressings, QC baselines, reject shakedown; " - "first paying releases; per-lot PVC gate live; qualify Thai compound", "Commissioning complete"], - ["5. Expand (revenue-gated)", "Duplex second press; galvanics line with zero-discharge water; " - "automatic presses; full metrology and the audio QC station; biomass boiler; mastering and " - "cutting room; phase 2 building; CD replication if chosen", "Revenue and second-round " - "capital"], + ["0. Validate and clear the gates (now)", "Market validation with regional labels and distributors; " + "BOI consultant, activity code, application; lease terms, zoning, soil test; 60 rai title check; " + "re-quotes and quotes from every launch vendor (section 14.1)", "Runs in parallel; gates " + "everything"], + ["1. Quotes and site (during the BOI window)", "Firm quotes with build times; site selection " + "between the Mueang Chi lease, other Payap land and the industrial estate; resolve the 35 % vs " + "45 % humidity floor", "BOI filed"], + ["2. Commit", "Incorporate under the certificate; sign the lease; order every long-lead item: " + "Pheenix galvanics line, Sillitoe lathe, Sibert line, Newbilt Duplex and Classic, first two " + "boiler and chiller modules", "BOI certificate and validated pricing"], + ["3. Build and commission (~6 to 12 months after commitment)", "Construction, water-treatment " + "building, utilities, HVAC, clean zones, solar, security, crane; machinery installation and " + "vendor commissioning; traceability and ERPNext live before the machines; hire and train", + "Building permit, vendor build dates confirmed"], + ["4. Launch (the whole chain in-house)", "Commission in sequence (table below); test pressings, QC " + "baselines, reject shakedown; first paying releases; per-lot PVC gate live; qualify Thai " + "compound", "Commissioning complete"], + ["5. Expand (revenue-gated)", "Second Duplex system; further Classics; the metrology parts bought " + "from revenue if that lever is used; the visitor corridor if built later; the biomass boiler if " + "steam starts electric; the phase 2 building; CD replication if chosen", "Revenue and, for CD " + "replication, a separate " + "decision"], ], widths_mm=[42, 96, 32], font_pt=8.5), - H2("Should galvanics come first rather than fifth?"), - P("The roadmap places the plating line in phase 5. The August 2026 market evidence argues for " - "costing an earlier start, and the investor should decide with the following in view:"), - T(["For moving galvanics to phase 1", "Against"], [ - ["It addresses the market's actual bottleneck: imported metalwork, not press capacity. The " - "incumbent turns away small runs and adds weeks above 3,000 units, most plausibly because " - "every stamper set is an overseas order.", "It still needs a clean room, zero-discharge water " - "treatment and hazardous-substance permitting, " - "which is the most likely regulatory friction " - "point in the whole project."], - ["It is a fraction of the full capital (USD 320k to 650k plus 90k to 240k water) and is " - "driven by title count, not record volume: payback at 300 titles a year is one to five " - "years depending on which end of the saving range holds.", "It is the hardest skill to hire. " - "No plating expertise exists in " - "the country; the process " - "engineer comes from abroad or is " - "trained abroad."], - ["It could earn before CNX's own press hall exists, by supplying stampers into the incumbent's " - "spare press capacity: 300 titles a year at wholesale might net USD 60k to 100k of " - "contribution, a useful offset against the capital.", "That offset is not a business case: " - "it assumes a competitor moves its " - "entire stamper supply to a new " - "entrant who is also its rival, and " - "the incumbent's actual title count " - "is unknown."], - ["It removes the launch plan's dependence on a single small UK supplier with no documented " - "Asian customers and two international freight legs per job.", "The saving is measured " - "against the wrong supplier: " - "CNX's avoided cost at launch " - "is the Stamper Discs price, " - "which has not been quoted " - "yet."], + H2("11.1 Commissioning sequence"), + T(["Step", "What is commissioned", "Why in this order"], [ + ["1", "Cutting room (Sillitoe SDMS) and galvanics (Pheenix line with ZLD and DI water), with the " + "Sibert stamper-prep line", "The presses need their stampers; no bridge stampers are planned. " + "First lacquers, fathers, mothers and stampers, and the metal archive " + "from the first title"], + ["2", "Newbilt Duplex system (two HRP 12, EX 50 and EX 35), with the steam and cooling plant " + "(boiler modules B-1, B-2; chiller modules CH-1, CH-2)", "The semi-automatic presses suit the " + "colour, splatter and boutique runs " + "that carry the premiums, and they " + "teach the crews the process"], + ["3", "Newbilt Classic, fully automatic", "Volume runs once the metal path and the press process " + "are stable"], + ], widths_mm=[12, 78, 80]), + P("If commissioning of the metal path slips, Stamper Discs (stampers) and SST in Frankfurt (lacquer " + "cutting, already Poy Records' cutter) stay contacts for overflow and for a slipping commissioning, " + "not a plan."), + + H2("11.2 Why the whole chain at launch"), + P("This is the decision with the most consequences in the plan, and the investor should see both sides:"), + T(["For", "Against, and the risks it takes on"], [ + ["**No bridge stampers.** A plant that buys every stamper set abroad waits on two international " + "freight legs per job and on one small overseas supplier; that is the bottleneck this plant " + "exists to remove.", "**Supplier advice.** Sibert, which sells into the galvanics line, advised " + "after Haarlem, against its own interest, to get presses, boilers, operators " + "and live feedback loops right first and to earn some return before every " + "manufacturing step is in place."], + ["**Title services and repress economics.** Cutting and plating in-house earn the per-title fees " + "(the middle price is 37,836 THB a title), and the archived father and mother of every side let " + "a repress, or a worn mother, be regrown without a recut.", "**Galvanics skill.** It is the " + "hardest skill to hire, and the " + "process engineer probably comes " + "from abroad or is trained abroad. " + "The first paying release now waits " + "for it."], + ["**The Thai market gap is metalwork, not presses.** The incumbent turns away small runs and adds " + "weeks above 3,000 units, most plausibly because every stamper set is an import (section 3.3).", + "**Permitting.** Galvanics effluent and hazardous-substance registration move into the first " + "factory licence, the most likely regulatory friction point in the project; zero discharge from " + "the start, and on Payap land the lessor's consent as well."], + ["**The cutting room is a smaller decision than it was.** The Sillitoe SDMS lists at USD 125k with " + "automation in the box, and the Payap programmes in mastering and lathe cutting need a working " + "room.", "**More capital up front.** ~161M to 292M THB in one round, against ~57M to 95M THB for " + "the superseded phased entry; more of it is committed before the market has validated " + "the price."], ], widths_mm=[85, 85], font_pt=8.5), - P("**Recommendation:** get the Stamper Discs quote and a line-itemised full-service invoice from " - "the incumbent in phase 0, cost the galvanics room properly with Digital Matrix and a Thai water " - "vendor, and put the decision to the investor with real numbers before the BOI application is " - "finalised, because the galvanics effluent changes the licence scope."), + P("**How the plan answers the risks:** commission the metal path first and measure it before the " + "presses depend on it; hire the galvanics and cutting engineers early and train them at the " + "vendors; design zero discharge from the start; and release the round in tranches (section 8.3), " + "so that nothing is ordered before the BOI certificate and validated pricing."), # --------------------------------------- 12 team, ownership, governance H1("12. Team, ownership and governance"), H2("12.1 The people"), T(["Who", "Role"], [ - ["Simona Meesaiyati", "Project Lead. Owns the commercial side: market validation, label " - "relationships, the Making Vinyl outreach, the BOI track and the site."], - ["Alexander Grabowski", "Technical Consultant. Owns the plant: equipment selection and " - "vendor negotiation, the utility and efficiency architecture, the parametric building model, " - "the traceability and QC specification, and the factory software."], - ["buildfor.life", "Supports the project in a consulting capacity: engineering, sustainability " - "and project management."], - ["Ploy Printing (Ploy Karnpim Limited Partnership, Chiang Mai)", "Packaging partner and " - "intended strategic co-investor: jackets, sleeves, inserts, J-cards and CD packaging on " - "offset, digital, risograph, UV and latex presses, with existing vinyl packaging production."], - ["To be hired", "Plant manager; galvanics process engineer (when galvanics is built); " - "mastering and cutting engineer (when the room is built); QC lead; maintenance; press and " - "finishing operators; sales and customer service for the label relationship and the " - "traceability portal."], + ["Simona Meesaiyati", "Project Lead: management and the audio side."], + ["Alexander Grabowski", "Technical Consultant: the technical side (equipment selection and vendors, " + "utilities, the building model, the traceability and QC specification, the factory software)."], + ["buildfor.life", "Supports the project in a consulting capacity."], + ["Ploy Printing (Ploy Karnpim Limited Partnership, Chiang Mai)", "Packaging partner and intended " + "strategic co-investor: jackets, sleeves, inserts, J-cards and CD packaging on offset, digital, " + "risograph, UV and latex presses, with existing vinyl packaging production."], + ["Payap University (Chiang Mai)", "Partnership under discussion (October 2026): joint student " + "programmes around the plant in mastering and lathe cutting, IT and business administration, " + "starting small (memorandum, internships, short certificate courses). Nothing is agreed yet; " + "scope, form and money are open. It is a hiring pipeline for the hardest roles, not a substitute " + "for hiring them: the teacher comes before the students."], + ["To be hired, at launch", "**Galvanics process engineer** and **cutting engineer** (both on the " + "critical path, section 10; a cutting engineer earns about 50,000 THB a month base, team " + "figure); plant manager; galvanics operators; QC lead; maintenance; press and finishing operators " + "for two shifts; sales and customer service for labels, artists and the traceability portal."], ["External", "BOI-registered consultant; Thai counsel for the lease, company and shareholder " "agreement; optional vinyl manufacturing consultancy for layout, installation and training " - "(GBP 10k to 20k packages); Newbilt commissioning; property insurer."], + "(GBP 10k to 20k packages); vendor commissioning and training (Newbilt, Pheenix, Sibert, " + "Sillitoe); property insurer."], ], widths_mm=[48, 122]), - P("Headcount at maturity is roughly 15 to 25 across shifts (4 to 6 press and finishing operators " - "per shift, 2 to 3 galvanics, 1 to 2 mastering, 1 to 2 QC, 2 maintenance, 3 to 5 admin, sales " - "and logistics), fewer than half that at launch, plus 1 to 2 for the cassette and CD-R lines."), + P("Headcount: the launch plant runs the whole chain on two shifts, so it needs most of the mature crew " + "from the start: a direct production payroll of 13 to 19 (8 to 12 press and finishing operators, 2 " + "to 3 galvanics, 1 to 2 QC, 2 maintenance), 1 to 2 mastering and cutting engineers, and 3 to 5 in " + "admin, sales and logistics. The revenue model plans on about 20 people at the start (estimate), " + "plus 1 to 2 for the cassette and CD-R lines. A process engineer from abroad can be employed on a " + "BOI work permit (section 7)."), H2("12.2 Ownership and structure"), P("Amounts and percentages are not yet agreed and are deliberately left open here. The intended " "structure is:"), B([ - "**One Thai limited company** holds the plant, the lease, the equipment and the BOI promotion. " - "BOI promotion permits 100% foreign ownership of the promoted manufacturing activity, so the " + "**One Thai limited company** holds the plant, the lease, the equipment and the BOI promotion. BOI " + "promotion permits 100 % foreign ownership of the promoted manufacturing activity, so the " "shareholding can be set on commercial terms rather than to satisfy the Foreign Business Act.", "**Shareholders:** the lead investor; Ploy Printing as strategic co-investor; and the founders. " "Ploy Printing's participation, whether in cash, in kind (print capacity, premises, working " "capital in packaging) or both, is to be discussed; its strategic value is a packaging partner " "whose incentives are aligned with the plant's schedule and quality, within the same province.", - "**Debt-to-equity no higher than 3:1**, maintained for the life of the BOI privileges, which " - "sets the floor on equity in the financing mix.", - "**A shareholders' agreement** covering board composition, reserved matters (capital calls, " - "phase 5 expansions, CD replication), pre-emption and transfer, information rights, and the " - "founders' roles and remuneration.", + "**Debt-to-equity no higher than 3:1**, maintained for the life of the BOI privileges, which sets " + "the floor on equity in the financing mix: at least a quarter of the funding, ~54M THB on the " + "216M target (arithmetic, before financing costs).", + "**A shareholders' agreement** covering board composition, reserved matters (capital calls and " + "tranche releases, the growth options such as a second Duplex, CD replication), pre-emption and " + "transfer, information rights, and the founders' roles and remuneration.", "**Related-party discipline.** Ploy Printing will be both a shareholder and the plant's main " "packaging supplier. The supply agreement is priced at arm's length, benchmarked periodically " - "against other printers, with quality and lead-time terms written down, and Ploy Printing " - "abstains from board decisions on its own contract. This protects both the lead investor and " - "Ploy Printing, and it is what a BOI or bank reviewer will look for.", - "**Any label, content or retail activity (Poy Records as a brand) sits in a separate entity**, " - "so the manufacturing company's BOI application stays clean.", + "against other printers, with quality and lead-time terms written down, and Ploy Printing abstains " + "from board decisions on its own contract. This protects both the lead investor and Ploy Printing, " + "and it is what a BOI or bank reviewer will look for.", + "**Any label, content or retail activity (Poy Records as a brand) sits in a separate entity**, so " + "the manufacturing company's BOI application stays clean.", ]), # ------------------------------------------------------ 13 risks H1("13. Risks and open questions"), P("Every plan has risks; the point of listing them is to say which are being retired, by what, and " - "when. The first column is the plan's own honest severity."), + "when. The first column is the plan's own honest severity. The September draft's bridge-stamper " + "risk is gone with the bridge stampers; the launch plant brings its own in its place."), T(["Severity", "Risk", "What it would do", "Mitigation and status"], [ - ["High", "Pricing power in the region is unproven", "The single biggest assumption in the " - "revenue model; a turnaround advantage nobody pays a premium for is a cost, not a moat", - "Market validation gate: Making Vinyl, regional label conversations, a second Thai data " - "point; no big-block spending before it clears"], - ["High", "Utilisation", "The cost structure is mostly fixed; 60% utilisation at mature size " - "cuts operating profit by more than half; the adverse case is loss-making at full volume", - "Phase capacity behind demand: one line, then Duplex, then automatic presses, each " - "revenue-gated; hold spare capacity as the turnaround promise requires"], - ["High", "Press build time unknown", "Carries ~40% of the schedule; 15 to 18 months would " - "push launch to mid-2029", "Required field in the Newbilt and Pheenix re-quotes, now"], - ["High", "Zoning of the candidate parcel unverified", "Gates phase 1 as much as phase 2; a " - "site reset costs ~6 months", "Verify before the BOI filing; industrial estate as fallback"], - ["Medium", "Lease terms and building ownership", "A weak lease makes the building hard to " - "finance and exposes it at expiry", "Registered 30 to 50 year lease with renewal, explicit " - "building ownership and assignment rights; Thai counsel " - "in phase 0"], - ["Medium", "Soil conditions", "Piling could add several hundred to 1,000+ THB/m² across " - "building, paving and fill", "Soil boring test in phase 0 (THB 30k to 50k)"], - ["Medium", "Bridge stamper supplier", "Launch lead time rests on one small UK supplier with " - "no Asian customers; the 10 to 20 day external metal block is unmeasured", "Written " - "turnaround " - "agreement; cost " - "the galvanics-first " - "option (section 11)"], - ["Medium", "Galvanics permitting and skills", "Effluent permitting is the most likely " - "regulatory friction; plating expertise is the hardest hire", "Zero-discharge design from the " - "start; industrial estate " - "option; recruit or train abroad; " - "keep out of the phase 1 licence " - "unless brought forward"], - ["Medium", "Currency", "EUR equipment, THB costs, USD/EUR revenue; 10% moves are worth tens " - "of thousands on the press order and 0.09 to 0.17 USD per record on margin", "State currency " - "and validity " - "in quotes; " - "consider THB " - "pricing " - "regionally; " - "hedge the press " - "order"], - ["Medium", "Vinyl demand is cyclical", "Global capacity has been added; the model assumes the " - "plant sells what it presses", "Mixed fleet suits boutique work that is less cyclical; " - "cassette and CD-R lines diversify; phase behind demand"], - ["Medium", "Reject rate in early production", "Early runs will be worse than the 5 to 10% " - "allowance while the process settles", "Vendor commissioning, materials lab from day one, " - "QC layers, conservative launch promises"], - ["Medium", "Competitive response", "The incumbent may add plating, or a second entrant may " - "appear; the domestic price ceiling may compress on our arrival", "Compete on capability " - "(traceability, QC, " - "climate), export " - "customers, and the " - "collaboration under " - "discussion"], + ["High", "Pricing power in the region is unproven", "The single biggest assumption in the revenue " + "model; a turnaround advantage nobody pays a premium for is a cost, not a moat", "Market " + "validation gate: regional label conversations, the artist platform's calculator as an interest " + "list, a second Thai data point; no large spending before it clears"], + ["High", "Utilisation and price", "The cost structure is mostly fixed; the adverse case loses " + "money even at the full volume of three presses (it needs ~1.5M records to cover depreciation)", + "Central breaks even at ~0.3M records; commission in sequence; growth options wait for demand; " + "treat the adverse column as the honest one"], + ["High", "Galvanics and cutting on the critical path", "No paying release until the cutting room " + "and galvanics make good stampers; a slow start there delays every press", "Commission the " + "metal path first and measure it; vendor training; Stamper Discs and SST as contacts for a " + "slipping commissioning, not a plan"], + ["High", "Skills: galvanics process engineer, cutting engineer", "Galvanics is the hardest skill to " + "hire; both roles are now needed at launch", "Recruit or train abroad; BOI work permits; vendor " + "training (Pheenix, Sillitoe, OMS as a reference); Payap programmes as a longer-term pipeline"], + ["High", "Missing prices: Classic and Pheenix line", "Two of the largest machine lines have no " + "vendor price; the Classic band is a placeholder", "Newbilt re-quote and Pheenix quote in phase " + "0; OMS's reference prices as the galvanics " + "benchmark"], + ["High", "Budget fit against 216M THB", "Midpoint ~227M is ~11M over; the high end is ~292M", + "Four levers bring the midpoint to ~203M to 213M with the reserve; four requests settle most of " + "the band; tranche release"], + ["High", "Vendor build times unknown", "The press build carries ~40 % of the schedule; 15 to 18 " + "months would push launch to mid-2029; Pheenix, Sillitoe and Sibert lead times also unquoted", + "Required field in every re-quote, now"], + ["High", "Zoning of the chosen plot unverified", "A site reset costs ~6 months; the Payap point " + "already fails zoning; Mueang Chi is unverified", "Verify on the land-use map and with counsel " + "before the BOI filing; industrial estate as " + "fallback"], + ["Medium", "Lease terms and building ownership", "A weak lease makes the building hard to finance " + "and exposes it at expiry", "Registered 30 to 50 year lease with renewal, explicit building " + "ownership and assignment rights; Thai counsel in phase 0"], + ["Medium", "Soil conditions", "Piling could add several hundred to 1,000+ THB/m² across building, " + "paving and fill", "Soil boring test in phase 0 (THB 30k to 50k)"], + ["Medium", "Galvanics permitting", "Effluent and hazardous-substance permitting are the most likely " + "regulatory friction, now in the first factory licence", "Zero-discharge design and the " + "water-treatment building from the " + "start; industrial estate option; " + "lessor's consent on Payap land"], + ["Medium", "Utilities fuel choice open", "Biomass heat costs a quarter to a tenth of electric steam " + "at reported fuel prices; electric steam needs a larger grid connection, biomass a secured fuel " + "supply", "Decide before the boiler request and the grid application; quote electric and fired " + "variants of the same modules"], + ["Medium", "Boiler import compliance (DIW)", "An imported boiler must meet ASME, JIS, EN or " + "equivalent and be verified by a DIW-registered certification body; the modules run above the " + "once-through relief", "ASME Section I design with the S stamp and the full dossier; " + "certification body engaged before the order; the same for a Thai-bought " + "boiler"], + ["Medium", "Single press vendor (Newbilt)", "All three presses, the extruders and the hydraulic " + "aggregates come from one small German manufacturer; build time and order book unknown", "Spares " + "and service terms in the re-quote; the Pheenix automatic press stays the comparison if the " + "Classic quote disappoints"], + ["Medium", "Hydraulic ring-main contamination", "One shared oil system: a contamination event " + "reaches every press", "ISO 4406 target, flushing to ISO 23309, particle counts at acceptance " + "and after flushing, non-bypass branch filters, isolation per press, online particle counter, " + "kidney loop; central plant still to be quoted"], + ["Medium", "Currency", "EUR on Newbilt and Pheenix, USD on Sibert and Sillitoe, THB costs, USD/EUR " + "revenue; a 10 % baht move is worth 0.09 to 0.17 USD per record on margin", "Currency and " + "validity in every " + "quote; THB pricing " + "regionally; hedging " + "decision with the " + "investor"], + ["Medium", "Vinyl demand is cyclical", "Global capacity has been added; the model assumes the plant " + "sells what it presses", "Mixed fleet suits boutique work that is less cyclical; cassette and " + "CD-R lines diversify; growth options wait for demand"], + ["Medium", "Reject rate in early production", "Early runs, and the first stampers from a new " + "galvanics room, will be worse than the 5 to 10 % allowance while the process settles", "Vendor " + "commissioning, stamper metrology, materials lab from day one, QC layers, conservative launch " + "promises; the ramp-up reserve"], + ["Medium", "Competitive response", "The incumbent may add plating, or a second entrant may appear; " + "the domestic price ceiling may compress on our arrival", "Compete on capability (traceability, " + "QC, climate), export customers, and " + "the collaboration under discussion"], ["Low", "Solar and battery integration", "Rack voltage vs inverter window; unpublished " - "certifications; mixed-vendor warranty", "Engineering checks and certificate requests in " - "phase 0; large float"], - ["Low", "Cassette supply chain", "Blank tape and shells come from few suppliers", "Hold " - "stock; qualify two sources"], - ["Low", "CD replication scope creep", "Adds USD 1.5M to 4.0M and a second commissioning " - "programme", "Decide before BOI filing; treat as a separate project if chosen"], + "certifications; mixed-vendor warranty", "Engineering checks and certificate requests in phase " + "0, or a PPA that moves it to the installer; large float"], + ["Low", "Cassette supply chain", "Blank tape and shells come from few suppliers", "Hold stock; " + "qualify two " + "sources"], + ["Low", "CD replication scope creep", "Adds USD 1.5M to 4.0M and a second commissioning programme", + "Decide before BOI filing; treat as a separate project if chosen"], ], widths_mm=[16, 40, 52, 62], font_pt=8), - P("**Open questions with owners and dates** are in the next section. Two standing caveats on the " - "evidence base: the Thai market data is one buyer, one plant and one afternoon, and the " - "underlying invoices and tour notes should be archived with this plan before it goes in front " - "of a bank; and the incumbent is a competitor, so every collaboration scenario assumes they would " - "buy a critical input from a new entrant, which they may decline to do."), + P("**Open questions with owners** are in the next section. Two standing caveats on the evidence base: " + "the Thai market data is one buyer, one plant and one afternoon, and the underlying invoices and " + "tour notes should be archived with this plan before it goes in front of a bank; and the industry " + "interest in traceability at Making Vinyl Europe 2026 is supplier-side evidence, not buyer price " + "validation."), # ------------------------------------------------- 14 next steps H1("14. Next steps and the ask"), H2("14.1 Phase 0: the next three to six months"), T(["#", "Action", "Owner", "Cost", "Retires"], [ - ["1", "Making Vinyl (Haarlem) and regional label conversations; test the 3.50 to 4.60 USD " - "blended price, run sizes, and whether 7 weeks instead of 14 plus freight is worth a premium", - "Simona, Alexander", "Travel", "Pricing risk"], - ["2", "Engage a BOI-registered consultant; confirm the activity sub-code; put the " - "order-before-certificate question first; add cassette and CD-R; decide CD replication", - "Simona", "USD 5k to 15k", "Sequencing, scope"], - ["3", "Thai counsel: lease heads of terms with the Mueang Chi lessor (term, renewal, building " - "ownership, assignment), zoning verification, company and shareholder structure including " - "Ploy Printing", "Simona, counsel", "USD 5k to 15k", "Zoning, lease, ownership"], - ["4", "Soil boring test on the candidate parcel", "Alexander", "THB 30k to 50k", "Ground risk"], - ["5", "Newbilt re-quote with build time, order-book position, PLC data access, currency and " - "validity; same questions to Pheenix Alpha for the AD12 and AD12 Manual", "Alexander", - "Free", "Schedule, price"], - ["6", "Stamper Discs quote and written turnaround terms; line-itemised full-service invoice " - "from the incumbent; Digital Matrix galvanics quote and a Thai water-treatment vendor", - "Alexander", "Free", "Galvanics decision"], - ["7", "Send the construction price request to two or three Thai PEB contractors", "Alexander", - "Free", "Building estimate"], - ["8", "Thai utility RFQs: boiler, chiller, compressed air, HVAC (35% vs 45% humidity floor), " - "solar EPC; Deye and Gobel engineering checks", "Alexander", "Free", "Utilities band"], - ["9", "Cassette and CD-R equipment quotes from two vendors each; tape and shell supply", + ["1", "Market validation with regional labels and distributors: the 3.50 to 4.60 USD blended " + "price, run sizes, and whether faster turnaround earns a premium; publish the artist platform's " + "calculator early with indicative prices and an interest list", "Simona, Alexander", "Travel", + "Pricing risk"], + ["2", "Engage a BOI-registered consultant: activity sub-code; the order-before-certificate question " + "first; galvanics, cassette and CD-R in the application; CD replication decision; whether a solar " + "PPA affects the solar measure; Payap R&D", "Simona", "USD 5k to 15k", "Sequencing, scope"], + ["3", "Thai counsel: lease heads of terms (term, renewal, building ownership, assignment) and zoning " + "of the chosen plot for pressing, a steam boiler and electroplating; company and shareholder " + "structure including Ploy Printing", "Simona, counsel", "USD 5k to 15k", "Zoning, lease, " + "ownership"], + ["4", "Soil boring test on the chosen plot", "Alexander", "THB 30k to 50k", "Ground risk"], + ["5", "Newbilt re-quote: Duplex (EX 50 and EX 35) and Classic, with build time, order-book " + "position, PLC data access, central hydraulic supply and written hydraulic requirements, currency " + "and validity", "Alexander", "Free", "Classic price, schedule"], + ["6", "Pheenix quote for the galvanics line (PASU, PPPU, PDPU, PMPB) with lead time and training; " + "OMS dedicated offer as the reference; ZLD and DI water vendor", "Alexander", "Free", + "Largest unpriced block"], + ["7", "Sillitoe quote and build time (SDMS, spare cutterhead, support terms, DMM question)", + "Alexander", "Free", "Cutting room, schedule"], + ["8", "Sibert itemised quotation and order terms against the USD 250k budget: lead time, " + "installation time, spares, shipping, travel", "Alexander", "Free", "Stamper prep, schedule"], + ["9", "Building request for quotation to two or three Thai pre-engineered building contractors, " + "with the soil result", "Alexander", "Free", "Building estimate"], + ["10", "Utility requests: Thai suppliers; Chinese boiler makers (ZOZEN, Sitong, Fangkuai, Taiguo; " + "1.25 MPa, ASME S stamp, electric and fired variants); compressors from Kaishan and Denair's Thai " + "offices; chillers and HVAC, Chinese makers included; the 35 % vs 45 % humidity floor; a Thai " + "hydraulic builder for the central plant", "Alexander", "Free", "Utilities band, fuel choice"], + ["11", "Metrology distributor quotes (XRF, confocal, profiler, inline vision, audio station)", + "Alexander", "Free", "Metrology band"], + ["12", "Solar PPA offers next to the purchase quote; battery and inverter engineering checks", + "Alexander", "Free", "Solar lever"], + ["13", "Cassette and CD-R equipment quotes from two vendors each; tape and shell supply", "Alexander", "Free", "New-scope estimates"], - ["10", "60 rai title check for the coppice plan", "Simona", "Small", "Biomass path"], - ["11", "Optional: vinyl manufacturing consultancy engagement for layout and installation " - "review", "Alexander", "GBP 10k to 20k", "Layout risk"], - ["12", "Archive the Thai invoices and tour notes with this plan", "Simona", "None", "Evidence " - "base"], + ["14", "Search for the galvanics process engineer and the cutting engineer; next meeting with Payap " + "on the programmes", "Simona, Alexander", "None yet", "Skills risk"], + ["15", "60 rai title check for the coppice plan", "Simona", "Small", "Biomass path"], + ["16", "Optional: vinyl manufacturing consultancy for a layout and installation review", + "Alexander", "GBP 10k to 20k", "Layout risk"], + ["17", "Archive the Thai invoices and tour notes with this plan", "Simona", "None", "Evidence base"], ], widths_mm=[8, 84, 26, 24, 28], font_pt=8), H2("14.2 What the investor is asked for"), KV([ - ["Now", "Approval of Phase 0 spending of ~USD 40k to 80k, and a decision on CD scope (section " - "4.9) before the BOI application is finalised."], - ["On the gates clearing", "Commitment in principle to phase 1 at ~USD 2.2M to 3.9M, released " - "in the tranches of section 8.3, with the financing mix set to hold " - "debt-to-equity at or below 3:1."], - ["Decisions", "Whether galvanics moves into phase 1 (section 11), once the phase 0 quotes are " - "in; the shareholder structure with Ploy Printing and the founders; hedging of " - "the press order."], - ["Later", "Revenue-gated expansion to the full vision (~USD 4.4M to 8.0M in total) as the " - "launch plant proves the market: Duplex, galvanics, automatic presses, full " - "metrology, mastering room, biomass, and the phase 2 building."], + ["Now", "Approval of Phase 0 spending of ~USD 40k to 80k (~1.3M to 2.6M THB, part of the launch-plant " + "total), so the quotes, the soil test, the BOI consultant and counsel can start."], + ["On the gates clearing", "A commitment in principle to the launch plant at a **target of ~216M " + "THB**, released in the tranches of section 8.3, with the financing mix " + "set to hold debt-to-equity at or below 3:1. Told plainly: at the " + "midpoint, 216M holds with the four levers and the ramp-up reserve " + "inside it; 180M holds only if the open quotes land low, because even " + "the levers plus scope cuts (cassette and CD-R later, a rented crane) " + "leave ~185M before the reserve. Until the four requests are back, the " + "honest range is ~161M to 292M THB."], + ["Decisions", "The equity and debt mix; CD replication, yes or no, before the BOI application is " + "finalised; the steam fuel (electric or biomass); which levers to take (solar PPA, " + "metrology launch tier, visitor corridor later); the shareholder structure with Ploy " + "Printing and the founders; hedging of the EUR orders."], + ["Later", "Revenue-funded growth: the second Duplex system (~USD 230k to 300k for the presses, " + "estimate), further Classics, the rest of the metrology stack, the biomass boiler if " + "steam starts electric, and the phase 2 building."], ], widths_mm=[38, 132]), - P("The next version of this plan should carry: firm re-quotes in place of the expired and " - "estimated blocks, the negotiated lease figure, a second market data point, the investor's CD " - "decision, a year-by-year cash model for the ramp, and the shareholder terms. Each of those is " - "a phase 0 output."), + P("The next version of this plan should carry: the Newbilt, Pheenix, Sillitoe and Sibert quotes with " + "their build times in place of the placeholder and estimated blocks; the building quote with the " + "soil result; the negotiated lease; a buyer-side price data point; the investor's CD and fuel " + "decisions; a calendar re-drawn for the launch plant with the metal-path commissioning in it; a " + "year-by-year cash model for the ramp; and the shareholder terms. Each of those is a phase 0 " + "output."), # --------------------------------------------------- 15 appendix H1("15. Appendix: sources and planning documents"), - P("This plan is compiled from the project's planning repository (cnx_vinyl, GitLab), which is the " - "source of truth and holds the detail behind every section:"), + P("This plan is compiled from the project's planning repository (cnx_vinyl, on the project's Gitea " + "server git.b4l.co.th), which is the source of truth and holds the detail behind every section. " + "Paths are relative to docs/:"), T(["Document", "Content"], [ - ["roadmap.md", "Next steps in dependency order, from the three current gates through launch " - "and expansion"], - ["scale.md", "Project sizing on one page: capacity, building, land, electrical, solar, steam, " - "people"], - ["finance/total-investment.md", "Full-vision and phased-entry capital roll-up with the basis " - "of every block"], - ["finance/revenue-model.md", "Pricing, direct cost, margin, operating scenarios, and the " - "August 2026 Thai market data and factory tour"], - ["finance/utilities-investment.csv", "Thai supplier candidates and budgetary ranges for " - "steam, cooling, air, water, HVAC, solar and battery"], + ["roadmap.md", "Next steps in dependency order, from the gates through the launch plant's " + "commissioning sequence to the revenue-gated growth options"], + ["project-timeline.md", "Calendar to first paying release, critical path and float (August 2026 " + "calendar, to be re-drawn for the launch plant)"], + ["scale.md", "Project sizing on one page: capacity per fleet, building zones, electrical, solar, " + "steam and cooling, utility phasing, people"], + ["finance/total-investment.md", "The launch-plant roll-up (October 2026) with the basis of every " + "block, the investor's 180M THB question and the levers; the " + "superseded full vision and phased entry"], + ["finance/revenue-model.md", "Pricing, the Thai market data and factory tour, the Record Industry " + "benchmark, direct cost, the launch-plant operating picture"], + ["finance/utilities-investment.csv", "Thai supplier candidates and budgetary ranges for steam, " + "cooling, air, water, HVAC, solar and battery"], ["finance/phase1-construction-rfq.md", "Contractor price request with quantities from the " "parametric model"], - ["equipment/pressing-line.md and equipment/newbilt/", "Press fleet strategy; Newbilt " - "budgetary offer, site requirements, " - "process schematic, service rates"], - ["suppliers/vendor-landscape.md and equipment-suppliers.md", "Per-vendor narrative and the " - "full needs list with contacts"], - ["process-flow.md, production-timeline.md, project-timeline.md", "The chain and its checks; " - "order turnaround stage by " - "stage; the calendar and " - "critical path"], - ["traceability.md, quality-automation.md", "The traceability specification; metrology, " - "layered record QC, the materials lab, packaging QC"], - ["sustainability.md, biomass.md", "Solar, heat recovery, water, zero discharge, materials; " - "the biomass fuel strategy and the 60 rai coppice"], - ["facility-security.md, worker-safety.md", "Climate control, security, fire and life safety, " - "compliance anchors; safety program"], + ["fleet-calculator.html", "Press fleet calculator: target output and specials share to the " + "Duplex/Classic mix, people, utilities and the operating picture"], + ["equipment/pressing-line.md and equipment/newbilt/", "Press fleet strategy, hydraulic ring mains; " + "Newbilt offer, site requirements, service " + "rates, 2026 product flyers"], + ["equipment/galvanics.md (with pheenix-alpha/, sibert/, oms/)", "Pheenix electroforming line, " + "Sibert stamper prep, OMS reference " + "prices, cycle times, the metal " + "archive"], + ["suppliers/vendor-landscape.md, equipment-suppliers.md", "Per-vendor narrative (lathes, cutting " + "services) and the full needs list with " + "contacts"], + ["suppliers/making-vinyl-europe-2026-exhibitors.md", "Making Vinyl Europe 2026 briefing and what " + "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"], + ["artist-platform.md (demos artist-order.html, make-a-record.html)", "Upload and itemised price " + "calculator, fan-funded " + "campaigns"], + ["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 " + "record QC, the materials lab"], + ["sustainability.md, biomass.md, steam-cooling.html", "Solar, heat recovery, water, zero discharge, " + "the grid tariff; the biomass fuel strategy; " + "the steam and cooling plant"], + ["facility-security.md, worker-safety.md", "Climate control, security, fire and life safety, the " + "archive room; training, clean rooms, PPE"], + ["crane-workshop-tours.md", "Overhead crane, maintenance workshop, visitor corridor"], + ["site-candidates.md and land-listings/", "Mueang Chi, the industrial estate and Payap land; the " + "checks before choosing; zoning records"], + ["payap-partnership.md", "Joint student programmes with Payap University"], ["boi.md", "BOI promotion strategy, requirements, process, open items"], - ["cnx_vinyl_parametric.FCStd and renders/", "The parametric building and site model on the " - "candidate parcel, and its renders"], + ["cnx_vinyl_parametric.FCStd, cnx_vinyl_parametric_payap.FCStd and renders/", "Parametric building " + "and site models on " + "the candidate " + "plots, and their " + "renders"], ], 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."), + 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/business-plan/build/export_pdf.py b/docs/business-plan/build/export_pdf.py new file mode 100644 index 0000000..b9c8d7a --- /dev/null +++ b/docs/business-plan/build/export_pdf.py @@ -0,0 +1,47 @@ + +"""Export CNX-Vinyl-Business-Plan.docx to PDF with LibreOffice, filling in the table of contents. + +Run with LibreOffice's own Python (it ships the uno module): + "C:/Program Files/LibreOffice/program/python.exe" export_pdf.py +A plain `soffice --convert-to pdf` leaves the Word TOC field unfilled. +""" +import uno, sys, time, subprocess, os +from pathlib import Path +HERE = Path(__file__).resolve().parent +DOCX = HERE.parent / "CNX-Vinyl-Business-Plan.docx" +PDF = HERE.parent / "CNX-Vinyl-Business-Plan.pdf" +from com.sun.star.beans import PropertyValue +def pv(n, v): + p = PropertyValue(); p.Name = n; p.Value = v; return p +soffice = r"C:\Program Files\LibreOffice\program\soffice.exe" +proc = subprocess.Popen([soffice, "--headless", "--invisible", "--norestore", "--accept=socket,host=localhost,port=2083;urp;"]) +local = uno.getComponentContext() +resolver = local.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", local) +for i in range(60): + try: + ctx = resolver.resolve("uno:socket,host=localhost,port=2083;urp;StarOffice.ComponentContext"); break + except Exception: + time.sleep(0.5) +smgr = ctx.ServiceManager +desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx) +src = uno.systemPathToFileUrl(str(DOCX)) +doc = desktop.loadComponentFromURL(src, "_blank", 0, (pv("Hidden", True),)) +idx = doc.getDocumentIndexes() +print("indexes", idx.getCount()) +for i in range(idx.getCount()): + idx.getByIndex(i).update() +doc.refresh() +# update fields (page numbers) +doc.getTextFields().refresh() +for i in range(idx.getCount()): + idx.getByIndex(i).update() +out = uno.systemPathToFileUrl(str(PDF)) +doc.storeToURL(out, (pv("FilterName", "writer_pdf_Export"),)) +doc.close(True) +try: + desktop.terminate() +except Exception: + pass +time.sleep(1) +proc.kill() if proc.poll() is None else None +print("done") diff --git a/docs/business-plan/build/plan_lib.py b/docs/business-plan/build/plan_lib.py index 0dcc469..c212221 100644 --- a/docs/business-plan/build/plan_lib.py +++ b/docs/business-plan/build/plan_lib.py @@ -258,6 +258,9 @@ class Renderer: _cell_text(cells[j], val, font_pt) if i % 2 == 1: _shade(cells[j], ALT_FILL) if widths: + t.autofit = False + for j, w in enumerate(widths): + t.columns[j].width = Mm(w) # grid columns: LibreOffice reads these for row in t.rows: for j, w in enumerate(widths): row.cells[j].width = Mm(w) @@ -278,6 +281,9 @@ class Renderer: _shade(cells[0], ALT_FILL) _cell_text(cells[0], k, font_pt, bold=True) _cell_text(cells[1], v, font_pt) + t.autofit = False + for j, w in enumerate(widths): + t.columns[j].width = Mm(w) for row in t.rows: for j, w in enumerate(widths): row.cells[j].width = Mm(w)