Files
cnx_vinyl/docs/business-plan/build/content_c.py
T
grabowski ffc6cedbca Business plan: isometric calculator views instead of FreeCAD, software section with screenshots
- Cover and section 6.2 now use the isometric plant view of the plant and
  business plan calculator, drawn with each version's own preset: the
  cover (roofs, no labels), Figure 8 the site from above, Figure 9 the
  ground floor cut open, Figure 10 the press hall close up. The FreeCAD
  aerial render, the Mueang Chi site plan and the hall layout sketch are
  no longer in the plan; the captions say the calculator draws the Payap
  scenario model while the 6.2 text and zone table are the Mueang Chi
  hall.
- New section 5.5 "The software: plant overview, factory console and
  artist platform" with six screenshots of the demos: the plant overview
  (simulated SCADA), the factory console press floor and its ERPNext
  link, the artist ordering offer, fan funding and the record passport.
  Simulated data is marked as such; the platform name stays undecided.
- Figures renumbered (budget card 11, cash 12) and named in the
  section 15 source table. Renders in docs/renders/calculator/ and
  docs/renders/demos/; README bullet updated.
2026-10-17 16:06:04 +07:00

1312 lines
111 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Part C: investment, revenue and operating model, timeline, phasing, team and ownership, risks, next steps.
Draft 0.3, October 2026: two versions built from this one file, Plan A (~180M THB, the launch plant with
six cost levers, three presses) and Plan B (~225M THB, the second Duplex system at launch, five presses,
everything in). Both are priced without contingency and with the ramp-up reserve:
docs/finance/total-investment.md "Two plans: A at ~180M THB and B at ~225M THB (October 2026)" and
docs/finance/revenue-model.md "Operating pictures of Plan A and Plan B (October 2026)".
plan_variant.pick() switches the text; it is called inside blocks() only (build_plan.py sets the plan
before it calls blocks()).
"""
from plan_lib import H1, H2, H3, P, B, N, T, KV, IMG, CALL, PB
from plan_variant import pick, is_a, is_b, label, name
# ------------------------------------------------------------ 8.1 blocks
def _block_rows():
"""This plan's blocks: the calculator rows of its preset, grouped (USD and THB, low to high)."""
a = is_a()
rows = [
["Phase 0: BOI consultant, legal and lease work, soil test, re-quotes", "40k to 80k", "1.3M to 2.6M",
"Estimate"],
["Newbilt Duplex system 1 (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"],
]
if not a:
rows.append(["Newbilt Duplex system 2 (two HRP 12 presses, EX 50 main and EX 35 colour extruder)",
"230k to 300k", "7.6M to 9.9M", "Estimate: two presses at the quoted ~115k per press and "
"extruder set, plus hydraulic unit and EX 35; **no EX 35 price on file**"])
rows += [
["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)", "324k to 445k", "10.7M to 14.7M",
"**OMS's reference plus 20 %**: OMS's 4-cell wet room with the EUR 10k know-how transfer, EUR 234k "
"to 321k (letter of 9 October 2026), × 1.2 = EUR 280.8k to 385.2k; **no Pheenix price on file**"],
["Galvanics water: zero-discharge (ZLD) evaporator and DI water", "97k to 258k", "3.2M to 8.5M",
"Researched: utilities rows, 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"],
pick(["Metrology and QC, launch tier: XRF, inline vision on the presses, audio station", "170k to 460k",
"5.6M to 15.2M", "Estimate; the laser confocal and the wide-area profiler (USD 180k to 350k) are "
"bought from revenue (lever 2, section 8.2)"],
["Metrology and QC, full stack: XRF, laser confocal, wide-area profiler, inline vision, audio "
"station", "350k to 810k", "11.6M to 26.7M", "Estimate, phaseable; the launch-plant figure, not "
"re-sized for the two extra presses"]),
["PVC lab, day-one tier", "55k to 150k", "1.8M to 5.0M", "Estimate"],
pick(["Steam, cooling and compressed air: two 500 kg/h boiler modules (priced electric), cooling "
"backbone for four modules (plate heat exchanger, tanks, pumps, mains), two 250 kW chiller "
"modules (CH-1, CH-2), screw compressor, dryer and receiver", "239k to 416k", "7.9M to 13.7M",
"Researched: utilities rows; boilers and compressor through the Chinese route (lever 6): "
"ASME-stamped 1.25 MPa boiler bodies installed by a Thai contractor, the compressor from a "
"Chinese brand's Thai office"],
["Steam, cooling and compressed air: two 500 kg/h boiler modules (priced electric), cooling "
"backbone for four modules (plate heat exchanger, tanks, pumps, mains), three 250 kW chiller "
"modules (CH-1 to CH-3), screw compressor, dryer and receiver", "344k to 548k", "11.4M to 18.1M",
"Researched: Thai supplier ranges; the two boiler modules carry the five presses' 750 to 900 "
"kg/h"]),
["Whole-factory HVAC, clean-room adder for galvanics and the cutting room, softener, loop treatment, "
"racking", "297k to 627k", "9.8M to 20.7M", "Researched: utilities rows"],
]
if not a:
rows.append(["Rooftop PV (EPC) and the 271 kWh Gobel battery, owned", "269k to 380k", "8.9M to 12.5M",
"Researched: utilities rows; owned, so the BOI solar measure applies"])
rows += [
["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"],
pick(["Crane rented for the installations (mobile crane); frame, runway and machine door stay "
"crane-ready", "39k to 91k", "1.3M to 3.0M", "Estimate: 40 % of the crane block (lever 5)"],
["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"],
]
if not a:
rows.append(["Visitor corridor and accessible entrance", "67k to 148k", "2.2M to 4.9M", "Estimate"])
rows += [
["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"],
]
if not a:
rows.append(["Cassette duplication and CD-R duplication", "55k to 190k", "1.8M to 6.3M", "Estimate, "
"sections 4.8 and 4.9: cassette 40k to 150k, CD-R 15k to 40k"])
rows += [
pick(["Freight, installation, commissioning, training (Pheenix, Sibert, Sillitoe, Newbilt beyond its "
"quoted 5 days)", "150k to 300k", "5.0M to 9.9M", "Estimate"],
["Freight, installation, commissioning, training (Pheenix, Sibert, Sillitoe, Newbilt beyond its "
"quoted 5 days)", "174k to 348k", "5.7M to 11.5M", "Estimate: the launch plant's 150k to 300k "
"plus 24k to 48k for the extra machinery"]),
pick(["Working capital, PVC stock, spares, lease deposit, first-year rent", "137k to 293k",
"4.5M to 9.7M", "Estimate; land is leased, so no land purchase"],
["Working capital, PVC stock, spares, lease deposit, first-year rent", "201k to 432k",
"6.6M to 14.3M", "Estimate, sized for ~1.25M records a year; land is leased, so no land "
"purchase"]),
]
if a:
rows.append(["Not bought at launch (levers, section 8.2): rooftop PV and battery (solar PPA), visitor "
"corridor, cassette and CD-R duplication", "none", "none", "The PPA installer owns and "
"finances the array; the rest are growth steps from revenue"])
rows += [
pick(["**Subtotal, plan investment**", "**~3.56M to 6.25M**", "**~117.4M to 206.1M**",
"**Midpoint ~161.7M THB (~4.90M USD)**"],
["**Subtotal, plan investment**", "**~4.61M to 8.07M**", "**~152.2M to 266.3M**",
"**Midpoint ~209.2M THB (~6.34M USD)**"]),
["Ramp-up reserve: staff hired before first revenue, overheads until volume covers them",
"~0.30M to 0.61M", "10M to 20M", "Estimate; cash the investor puts in, so it is in the plan price"],
pick(["**Plan A price**", "**~3.86M to 6.85M**", "**~127M to 226M**",
"**Midpoint ~177M THB (~5.35M USD): ~180M THB**"],
["**Plan B price**", "**~4.92M to 8.67M**", "**~162M to 286M**",
"**Midpoint ~224M THB (~6.79M USD): ~225M THB**"]),
["Contingency: not in the plan price", "", "", pick(
"For information: at 15 %, ~24M THB at the midpoint",
"For information: at 15 %, ~31M THB at the midpoint")],
]
return rows
def _levers_table():
"""Plan A: the six levers from the launch plant with every block, midpoints, no contingency."""
return T(["Step", "Saves", "Subtotal after it", "What it gives up"], [
["Launch plant, every block, no contingency", "", "~193.8M THB (~5.87M USD)", ""],
["1. Rooftop solar and battery through a solar PPA (the installer owns and finances the array; the "
"plant buys the power)", "~10.7M", "~183.1M", "Owned solar and very likely the BOI solar measure with "
"its tax benefit (our reading, for the BOI consultant); "
"adds the PPA power price to the energy bill, ~0.03M USD a "
"year in the calculator at 3.0 THB/kWh (estimate, to "
"quote)"],
["2. Metrology launch tier: XRF, inline vision and audio station at launch; laser confocal and "
"wide-area profiler (USD 180k to 350k) bought from revenue", "~8.8M", "~174.4M", "Every stamper and "
"record is still measured (XRF, inline vision on the presses, audio station); the confocal and the "
"profiler come later"],
["3. Visitor corridor built later", "~3.6M", "~170.8M", "No public tours at first: the tour route and "
"the Payap programmes around it start later"],
["4. Cassette and CD-R duplication later", "~4.0M", "~166.8M", "No cassette or CD-R at launch; a growth "
"step"],
["5. Crane rented for the installations (mobile crane)", "~3.2M", "~163.6M", "No overhead crane at "
"first; frame, runway and machine door stay crane-ready, so it can be bought later if needed"],
["6. Boilers and compressor through the Chinese route", "~1.9M", "**~161.7M (~4.90M USD)**",
"Imported boilers take the Thai route (Ministry of Industry boiler notification B.E. 2549: design "
"and import rules, a certification body registered with the Department of Industrial Works) with an "
"ASME S stamp at 1.25 MPa"],
["Ramp-up reserve", "", "+10M to 20M", ""],
["**Plan A**", "", "**~177M THB (~5.35M USD)**", "~127M to 226M from the low to the high end of every "
"block"],
], widths_mm=[56, 16, 32, 66], font_pt=8.5,
caption="Midpoint values without contingency, estimates; docs/finance/total-investment.md 'Two plans'. "
"The levers keep every machine of the launch plant.")
def _additions_table():
"""Plan B: what it adds to the launch plant, midpoints, no contingency."""
return T(["Block", "USD", "THB, midpoint"], [
["Launch plant, every block, no contingency", "4.24M to 7.50M", "~193.8M"],
["Second Duplex system: two HRP 12, EX 50 and EX 35 (two presses at the quoted ~115k per press and "
"extruder set, plus hydraulic unit and EX 35; no EX 35 price on file)", "230k to 300k", "+8.7M"],
["Third chiller module, CH-3 (250 kW; the two boiler modules carry 750 to 900 kg/h)", "48k to 78k",
"+2.1M"],
["Freight and installation for the extra machinery", "24k to 48k", "+1.2M"],
["Working capital for ~1.25M records a year instead of 0.85M", "64k to 139k", "+3.4M"],
["**Subtotal**", "**4.61M to 8.07M**", "**~209.2M (~6.34M USD)**"],
["Ramp-up reserve", "", "+10M to 20M"],
["**Plan B**", "", "**~224M THB (~6.79M USD)**; ~162M to 286M from the low to the high end"],
], widths_mm=[100, 30, 40],
caption="Midpoint values without contingency, estimates; docs/finance/total-investment.md 'Two plans'.")
def _tranches():
return T(["Tranche", "Trigger", "Covers", "Approx. share, THB"], [
["0", "Now", "Phase 0 work (section 14.1)", "The Phase 0 block, ~1.3M to 2.6M (1 to 2 %)"],
["1", pick("BOI certificate issued; lease signed; zoning and soil confirmed; pricing validated",
"BOI certificate issued; lease signed; zoning and soil confirmed; pricing and the demand "
"for ~1.25M records a year validated"),
pick("Deposits on every long-lead order: Pheenix galvanics line, Sillitoe lathe, Sibert line, Newbilt "
"Duplex system and Classic; building design and permit; first boiler and chiller modules "
"(boilers and compressor through the Chinese route)",
"Deposits on every long-lead order: Pheenix galvanics line, Sillitoe lathe, Sibert line, both "
"Newbilt Duplex systems and the Classic; building design and permit; first boiler and chiller "
"modules"),
pick("20 to 30 % (~32M to 49M)", "20 to 30 % (~42M to 63M)")],
["2", "Building permit; vendor build dates confirmed in writing",
pick("Construction, water-treatment building, utility yard, utilities, balance payments as machines "
"are built",
"Construction, water-treatment building, utility yard, utilities including the third chiller "
"module, balance payments as machines are built"),
pick("35 to 45 % (~57M to 73M)", "35 to 45 % (~73M to 94M)")],
["3", "Building watertight; first machinery shipped",
pick("Fit-out, HVAC and clean zones, ZLD and DI water, the rented crane for the installations, the "
"metrology launch tier, factory software and ERPNext, the launch team",
"Fit-out, HVAC and clean zones, ZLD and DI water, rooftop PV and battery, crane, visitor "
"corridor, the full metrology stack, factory software and ERPNext, cassette and CD-R lines, the "
"launch team"),
pick("15 to 20 % (~24M to 32M)", "15 to 20 % (~31M to 42M)")],
["4", "Cutting room and galvanics commissioned; first stampers made", "Working capital, PVC stock, "
"spares, first-year rent; the ramp-up reserve (10M to 20M THB, in the plan price) is drawn from here "
"on", pick("8 to 12 % (~13M to 19M), plus the reserve", "8 to 12 % (~17M to 25M), plus the reserve")],
], widths_mm=[14, 46, 78, 32], font_pt=8.5,
caption=pick("Shares of Plan A's investment before the reserve (~161.7M THB at the midpoint); the THB "
"figures are the shares applied to it (arithmetic, estimates).",
"Shares of Plan B's investment before the reserve (~209.2M THB at the midpoint); the THB "
"figures are the shares applied to it (arithmetic, estimates)."))
# ------------------------------------------------------- 9.4 operating picture
def _operating_table():
if is_a():
rows = [
["Records", "0.58M", "0.74M", "0.90M"],
["Blended price, 60 % specials", "3.76", "4.49", "5.27"],
["Direct cost", "2.70", "2.00", "1.35"],
["Contribution per record", "1.06", "2.49", "3.92"],
["Pressing contribution", "0.61M", "1.83M", "3.51M"],
["Title-services contribution", "0.07M", "0.23M", "0.48M"],
["**Total contribution**", "**0.68M**", "**2.06M**", "**3.99M**"],
["Cash overheads", "0.45M", "0.33M", "0.20M"],
["**EBITDA**", "**0.23M**", "**1.73M**", "**3.79M**"],
["Depreciation", "0.62M", "0.39M", "0.24M"],
["**Operating profit**", "**-0.39M**", "**1.34M**", "**3.55M**"],
["Revenue", "2.28M (~75M THB)", "3.65M (~120M THB)", "5.41M (~179M THB)"],
["Payback on the plan price (EBITDA, mature year)", "~30 yr", "~3.1 yr (2.2 to 4.0 on 3.86M to "
"6.85M)", "~1.0 yr"],
]
else:
rows = [
["Records", "1.0M", "1.25M", "1.5M"],
["Blended price, 60 % specials", "3.76", "4.49", "5.27"],
["Direct cost", "2.58", "1.94", "1.30"],
["Contribution per record", "1.18", "2.55", "3.97"],
["Pressing contribution", "1.18M", "3.19M", "5.96M"],
["Title-services contribution", "0.10M", "0.28M", "0.48M"],
["**Total contribution**", "**1.28M**", "**3.47M**", "**6.44M**"],
["Cash overheads", "0.45M", "0.33M", "0.20M"],
["**EBITDA**", "**0.83M**", "**3.14M**", "**6.24M**"],
["Depreciation", "0.81M", "0.51M", "0.31M"],
["**Operating profit**", "**0.02M**", "**2.63M**", "**5.93M**"],
["Revenue", "3.93M (~130M THB)", "6.05M (~200M THB)", "8.60M (~284M THB)"],
["Payback on the plan price (EBITDA, mature year)", "~10.5 yr", "~2.2 yr (1.6 to 2.8 on 4.92M to "
"8.67M)", "~0.8 yr"],
]
return T(["USD per year, mature", "Adverse", "Central", "Favourable"], rows, widths_mm=[50, 36, 48, 36],
caption="Estimates, docs/finance/revenue-model.md 'Operating pictures of Plan A and Plan B (October "
"2026)'. Title services at 60 to 70 % contribution after lacquers, styli and nickel. "
"Contribution per record and total contribution are the table's own arithmetic.")
def _risk_rows():
a = is_a()
rows = [
["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"],
]
if not a:
rows += [
["High", "Demand for ~1.25M records a year", "The central case needs ~1.25M records sold a year, "
"~0.75M of them specials, against 0.74M for the three-press plant; nothing in the market data so "
"far shows that demand", "Market validation (roadmap item 1) before the round is called; the "
"second Duplex system is commissioned last, so its order is the one that can still move back to a "
"growth step"],
["High", "More capital at risk", "~224M THB in one round, ~27 % more than the three-press Plan A, "
"more of it committed before the market has validated the price and the volume", "Gates and "
"tranches (section 8.3): no order before the BOI certificate and validated pricing and demand"],
]
rows += [
["High", "No contingency in the plan price", pick(
"Quotes landing high are not covered: at 15 % a contingency would be ~24M THB at the midpoint, "
"and the high end of every block comes to ~226M with the reserve",
"Quotes landing high are not covered: at 15 % a contingency would be ~31M THB at the midpoint, "
"and the high end of every block comes to ~286M with the reserve"),
"The requests that settle most of the band come before commitment (section 8.4); tranche release; "
"how overruns are funded (outside the plan price or by scope steps) agreed with the investor up "
"front"],
["High", "Utilisation and price", pick(
"The cost structure is mostly fixed; the adverse case loses money: it needs ~0.9M records to cover "
"depreciation and the three presses make 0.58M at that rate; at 60 % specials the Duplex rate and "
"the extra cost of specials decide volume and margin",
"The cost structure is mostly fixed; the adverse case only just covers depreciation (~1.0M records "
"needed, 1.0M made), so any shortfall in price or volume turns it into a loss; the extra cost of "
"specials is not in the direct cost yet"),
pick("Central breaks even at ~0.2M records; commission in sequence; the second Duplex waits for "
"demand; treat the adverse column as the honest one",
"Central breaks even at ~0.22M records; commission in sequence; treat the adverse column as the "
"honest one")],
]
if not a:
rows.append(["Medium", "Ramp length", "The ramp to ~1.25M records is longer than the three-press "
"plant's to 0.74M; the ramp-up reserve is the same 10M to 20M THB estimate", "Break-even at "
"~0.22M records, so a slow ramp costs payback time more than solvency (our reading); a "
"year-by-year cash model for the ramp is a next step (section 9.5)"])
rows += [
["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", pick("Prices not on file: the Classic and the Pheenix line",
"Prices not on file: the Classic, the Pheenix line and the second EX 35"),
pick("The Classic band is a placeholder borrowed from another vendor's automatic press; the Pheenix "
"line is priced at OMS's reference plus 20 %, without a Pheenix figure",
"The Classic band is a placeholder borrowed from another vendor's automatic press; the Pheenix "
"line is priced at OMS's reference plus 20 %, without a Pheenix figure; the second Duplex "
"system's EX 35 has no price"),
"Newbilt re-quote and Pheenix quote in phase 0; OMS's dedicated offer as the galvanics benchmark"],
["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"],
]
if a:
rows.append(["Medium", "Solar PPA and the BOI solar measure", "The PPA very likely gives up the BOI "
"solar measure (owned solar and its tax benefit) and adds a power price, ~0.03M USD a year "
"in the calculator at 3.0 THB/kWh, an estimate to quote", "The BOI consultant's reading "
"and PPA offers next to the purchase quote in phase 0; buying the array, as Plan B does, "
"stays the alternative"])
rows += [
["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)", pick(
"This plan imports its boiler modules from China: 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",
"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)", pick(
"All three presses, the extruders and the hydraulic aggregates come from one small German "
"manufacturer; build time and order book unknown",
"All five 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", pick("Mixed fleet suits boutique work that is less cyclical; cassette and "
"CD-R lines diversify once added; growth options wait for demand",
"Mixed fleet suits boutique work that is less cyclical; cassette and "
"CD-R lines diversify; further growth waits 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"],
pick(["Low", "Solar integration under the PPA", "Rack voltage vs inverter window, certifications and "
"warranty move to the installer, but the plant still depends on the array", "Engineering checks "
"of the installer's design in phase 0; large float"],
["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", pick("Blank tape and shells come from few suppliers, once the lines "
"are added", "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"],
]
return rows
def blocks():
a = is_a()
return [
# ------------------------------------------------- 8 investment
H1("8. Investment"),
P(pick(
"This chapter prices **Plan A (~180M THB)**: the launch plant decided in October 2026, one Newbilt "
"Duplex system and one Classic with the whole chain from the cutting room to the shrink wrapper, "
"in one capital round and commissioned in sequence, brought down with six cost levers that keep "
"every machine. ",
"This chapter prices **Plan B (~225M THB)**: the launch plant decided in October 2026, with the "
"whole chain from the cutting room to the shrink wrapper, plus the second Duplex system at launch: "
"five presses with everything in, in one capital round and commissioned in sequence. ") +
"The plan price carries the ramp-up reserve, because that is cash the investor puts in, and **no "
"contingency**. 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, as is the launch-plant budget with a "
"15 % contingency of the previous draft; they are not repeated here, and the planning repository "
"keeps them for the record."),
H2(pick("8.1 Plan A, all blocks", "8.1 Plan B, all blocks")),
T(["Block", "USD", "THB", "Basis"], _block_rows(), widths_mm=[52, 30, 30, 58], font_pt=8.5,
caption=pick(
"Source: docs/finance/total-investment.md, 'Two plans', and the Plan A preset of the plant and "
"business plan calculator (docs/fleet-calculator.html), whose rows are grouped here; estimates. "
"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 plan.",
"Source: docs/finance/total-investment.md, 'Two plans', and the Plan B preset of the plant and "
"business plan calculator (docs/fleet-calculator.html), whose rows are grouped here; estimates. "
"Further Duplex systems and Classics are growth options: the hall is laid out for five Duplex "
"bays and four Classic positions.")),
P("**Not in the plan price:** a contingency (the blocks are budgetary, so the plan carries no buffer "
"for quotes landing high; at 15 % it would be " + pick("~24M", "~31M") + " THB at the midpoint); CD "
"replication (section 4.10); 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, the launch "
"plant's estimate) comes on top, plus ~0.17M USD of import VAT paid at the border and reclaimed "
"later (estimates)" + pick(
". Plan A imports its boiler modules and buys less metrology at launch; the estimate is not "
"re-sized for either.",
". Plan B's second Duplex system adds ~0.23M to 0.30M USD of imported machinery to that.")),
H2("8.2 Two versions of this plan"),
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**. The answer is two versions of this plan, built from the same documents, "
"both priced without contingency and with the ramp-up reserve: **Plan A** keeps every machine of "
"the launch plant and brings it to ~180M THB with six cost levers; **Plan B** adds the second "
"Duplex system at launch, five presses with everything in, at ~225M THB (Plan A plus 25 %). This "
"document is " + label() + ". How the two differ (estimates):"),
T(["Midpoints, estimates", "Plan A" + pick(" (this plan)", ""), "Plan B" + pick("", " (this plan)")], [
["Plan price: ramp-up reserve in, no contingency", "~177M THB (~5.35M USD): ~180M",
"~224M THB (~6.79M USD): ~225M"],
["Low to high end of every block", "~127M to 226M THB", "~162M to 286M THB"],
["Presses", "3: Duplex system 1 (two HRP 12) and one Classic",
"5: two Duplex systems (four HRP 12) and one Classic"],
["Records a year at 60 % specials", "~0.58 to 0.90M, central 0.74M (Duplex-limited)",
"~1.0 to 1.5M, central 1.25M"],
["Revenue, central", "3.65M USD (~120M THB)", "6.05M USD (~200M THB)"],
["EBITDA, central", "1.73M USD", "3.14M USD"],
["Operating profit, adverse case", "-0.39M USD: loses money", "0.02M USD: just covers depreciation"],
["Payback on the plan price, central (EBITDA, mature year)", "~3.1 yr (2.2 to 4.0)",
"~2.2 yr (1.6 to 2.8)"],
["What it gives up or takes on", "Six levers: solar through a PPA (very likely without the BOI "
"solar measure), confocal and profiler from revenue, no tours at first, cassette and CD-R later, a "
"rented crane, Chinese boilers and compressor; the second Duplex waits for revenue", "No levers; "
"needs ~1.25M records sold a year, ~0.75M of them specials, which the market data does not show "
"yet; a longer ramp on the same reserve; ~27 % more capital"],
], widths_mm=[46, 62, 62], font_pt=8.5,
caption="Estimates: docs/finance/total-investment.md 'Two plans' and docs/finance/revenue-model.md "
"'Operating pictures of Plan A and Plan B'. Section 9 has this plan's operating picture."),
*(
[P("**Plan A: six levers, every machine kept.** From the launch plant with every block, no "
"contingency, midpoint values:"),
_levers_table(),
P("Plan B takes none of these levers and adds the second Duplex system, a third chiller module, "
"their freight and installation and the working capital for ~1.25M records: ~209.2M THB before "
"the reserve, ~224M with it.")]
if a else
[P("**Plan B: the launch plant plus the second Duplex system, no levers.** Midpoint values:"),
_additions_table(),
P("Plan B takes none of Plan A's six levers (~32M THB at the midpoint together): it keeps owned "
"solar and battery, and with them the BOI solar measure, the full metrology stack, the visitor "
"corridor from the start, the bought crane, cassette and CD-R, and Thai-supplied utilities.")]
),
CALL("What decides between Plan A and Plan B", [
"**Demand first.** Plan B needs ~1.25 million records sold a year in its central case, about 70 % "
"more than Plan A's 0.74 million, three fifths of them special editions. Market validation "
"(section 14.1, item 1) is the evidence for that, and it is not in yet.",
"**The quotes.** The Newbilt re-quote for the Classic and the EX 35 (in Plan B also the second "
"Duplex system), the Pheenix quote against the OMS reference, the building quote with the soil "
"test, and, for Plan A, the solar PPA offer.",
"**Neither price carries a contingency.** Quotes landing high are funded outside the plan price or "
"by scope steps (section 8.4).",
pick("**The second Duplex stays a growth step.** Its floor, utility module positions and ring-main "
"tees are reserved, so adding it from revenue is a step, not a rebuild.",
"**The second Duplex is commissioned last.** If validation does not show the demand, it is "
"the part of Plan B that can still return to a growth step, leaving the three-press launch "
"plant."),
]),
P("Figure 11 is the budget check of the plant and business plan calculator with the " + label() +
" preset, contingency kept out of the total as in this plan."),
IMG(pick("renders/calculator/plan-a-budget.png", "renders/calculator/plan-b-budget.png"), 160,
"Figure 11. Budget card of the plant and business plan calculator, " + pick(
"Plan A preset: 161.7M THB at the midpoint without contingency, 171.7M to 181.7M with the "
"ramp-up reserve of 10M to 20M, inside 180M at the midpoint",
"Plan B preset: 209.2M THB at the midpoint without contingency, 219.2M to 229.2M with the "
"ramp-up reserve of 10M to 20M, inside 225M at the midpoint") +
". Bars: the investment at the low end, the midpoint and the high end of every block, the reserve "
"hatched, against 180M and 225M THB. Calculator figures (docs/fleet-calculator.html), estimates."),
H2("8.3 Tranches"),
P("The plan 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."),
_tranches(),
*([] if a else [P("The second Duplex system is commissioned last (section 11.1). Its order sits with "
"the other long-lead items in tranche 1, and it is the one order that could still be "
"moved to a growth step if the demand case weakens before the round is called.")]),
H2("8.4 What moves the number"),
B([
"**No contingency in the price.** " + pick(
"Plan A's ~177M THB is the midpoint of every block with the ramp-up reserve and no buffer: at "
"15 % a contingency would add ~24M THB, and the high end of every block comes to ~226M. ",
"Plan B's ~224M THB is the midpoint of every block with the ramp-up reserve and no buffer: at "
"15 % a contingency would add ~31M THB, and the high end of every block comes to ~286M. ") +
"Quotes landing above the midpoint are funded outside the plan price or by scope steps; how they are "
"funded is a decision for the investor before commitment (section 14.2).",
"**The quotes that decide it.** The Classic has no Newbilt price (its band is a placeholder "
"borrowed from another vendor's automatic press); the Pheenix line is priced at OMS's reference "
"plus 20 %, without a Pheenix figure; " + pick(
"the EX 35 is priced only as the expired 2024 quote's second-extruder option; the building "
"depends on the soil; and the solar PPA lever depends on an offer. The Newbilt re-quote, the "
"Pheenix quote, the building request with a soil test, the metrology distributor quotes and "
"the PPA offers settle most of the band.",
"the second Duplex system's EX 35 has no price on file (the first is priced as the expired "
"2024 quote's second-extruder option); and the building depends on the soil. The Newbilt "
"re-quote, the Pheenix quote, the building request with a soil test and the metrology "
"distributor quotes settle most of the band."),
"**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 on the launch plant, "
"estimates), and the automation and solar spend converts into corporate income tax exemption "
"headroom. The application precedes every purchase order. " + pick(
"The solar measure is based on the plant's own solar investment, so Plan A's solar PPA would "
"likely give that headroom up (our reading, a question for the BOI consultant).",
"Plan B owns its solar array, so it keeps the solar measure."),
"**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.",
pick("**Chinese suppliers: taken where they pay.** Plan A buys the boiler modules and the "
"compressor through the Chinese route (~1.9M THB at the midpoint, about 1 % of the price); the "
"Newbilt hydraulic aggregates stay Newbilt's. Chillers and HVAC, the larger blocks, are not "
"checked yet; that is the next Chinese lever to test.",
"**Chinese suppliers: ~1 %.** Plan B prices Thai-supplied utilities. The Chinese route for the "
"boiler modules and the compressor would take ~1.9M THB off at the midpoint (Plan A takes "
"it); chillers and HVAC, the larger blocks, are not checked yet."),
pick("**Solar PPA.** The largest single lever (~10.7M THB at the midpoint) moves the array off the "
"capital budget and adds a power price to the energy line instead (~0.03M USD a year in the "
"calculator at 3.0 THB/kWh, an estimate to quote).",
"**Solar bought, not leased.** Plan B owns the array and the battery (8.9M to 12.5M THB). A "
"solar PPA would take ~10.7M THB off the price at the midpoint and add a power price to the "
"energy line instead, very likely without the BOI solar measure."),
"**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 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; the plan prices it "
"at OMS's EUR reference plus 20 %, EUR 280.8k to 385.2k). 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; " + pick(
"with the Classic and the galvanics line also in EUR, the three EUR lines come to ~0.96M to "
"1.28M USD, so the same move is worth roughly USD 0.10M to 0.13M (estimate).",
"with the second Duplex system, the Classic and the galvanics line also in EUR, the four EUR "
"lines come to ~1.19M to 1.58M USD, so the same move is worth roughly USD 0.12M to 0.16M "
"(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, " + pick("enough to push the adverse case further under water. ",
"enough to push the adverse case, which only just covers "
"depreciation, 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 of " + pick("Plan A's three presses", "Plan B's five presses") + " 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.76 to 5.27 per record** (THB 124 to 174) at the planned **60 % "
"specials** (splatter, marble and colour effects; the plant focuses on special prints, not mono "
"colours): standard USD 3.40 / 3.80 / 4.25 plus a specials premium of 0.60 / 1.15 / 1.70 on 60 % "
"of the records, covering pressing, labels, inner sleeve and assembly into the jacket; deluxe "
"packaging passed through at cost plus margin. At ~20 % specials the same prices blend to 3.50 to "
"4.60. 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. What specials cost extra "
"(coloured compound, colour-change purge, trim that only goes back into black) is not yet in the "
"direct cost, so the specials gain is an upper bound until the compound quotes arrive.",
"**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. 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. " + pick("Plan A models 200 to 400 titles a year", "Plan B models 300 to 400 titles "
"a year (375 central)") +
"; mastering is labour-bound, and the plan staffs one to two engineers, which caps this line.",
pick("**Cassettes and CD-Rs** come later in Plan A (a growth step, lever 4) and are 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.",
"**Cassettes and CD-Rs** are add-on lines in the plant from launch, 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(pick("9.2 Capacity and revenue of Plan A", "9.2 Capacity and revenue of Plan B")),
P(pick(
"Three presses make **~0.58 to 0.90 million records a year on two shifts at 60 % specials** "
"(estimate). Specials run only on the Duplex system (the Classic has one built-in extruder), so its "
"two semi-automatic presses at 60 to 80 records an hour each set the pace, and the Classic (~128 an "
"hour, 28 s cycle, vendor flyer) presses the standard 40 % at about two thirds load; at 60 to 70 % "
"effectiveness, 16 hours a day and 300 days a year. At ~20 % specials the same presses made 0.71 to "
"0.97 million. The plant and business plan calculator, at the team's planning rates (3 records a "
"minute per Duplex system, 2 per Classic, 65 % effectiveness), stays balanced at ~0.94 million. "
"The central case takes the middle, 0.74 million.",
"Five presses make **~1.0 to 1.5 million records a year on two shifts at 60 % specials** "
"(estimate). Specials run only on the Duplex systems (the Classic has one built-in extruder), but "
"with two of them the plant is not Duplex-limited: the four semi-automatic presses, 240 to 320 "
"records an hour together, carry the specials, and the Classic (~128 an hour, 28 s cycle, vendor "
"flyer) the rest; at 60 to 70 % effectiveness, 16 hours a day and 300 days a year that is ~1.06 to "
"1.5 million. The plant and business plan calculator, at the team's planning rates (3 records a "
"minute per Duplex system, 2 per Classic, 65 % effectiveness), gives ~1.5 million. The central "
"case takes 1.25 million.")),
T(["USD per year", "Adverse", "Central", "Favourable"], pick([
["Records", "0.58M", "0.74M", "0.90M"],
["Blended price, 60 % specials", "3.76", "4.49", "5.27"],
["Pressing revenue", "~2.17M", "~3.31M", "~4.72M"],
["Titles × per-title fee", "200 × 580", "300 × 1,155", "400 × 1,730"],
["Title-services revenue", "~0.12M", "~0.35M", "~0.69M"],
["**Revenue**", "**2.28M (~75M THB)**", "**3.65M (~120M THB)**", "**5.41M (~179M THB)**"],
], [
["Records", "1.0M", "1.25M", "1.5M"],
["Blended price, 60 % specials", "3.76", "4.49", "5.27"],
["Pressing revenue", "~3.76M", "~5.61M", "~7.91M"],
["Titles × per-title fee", "300 × 580", "375 × 1,155", "400 × 1,730"],
["Title-services revenue", "~0.17M", "~0.43M", "~0.69M"],
["**Revenue**", "**3.93M (~130M THB)**", "**6.05M (~200M THB)**", "**8.60M (~284M 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"],
["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 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"],
pick(["Production labour, Plan A", "**0.13 to 0.28**", "4.2 to 9.3", "13 to 19 direct staff, "
"3.7M to 5.4M THB a year, over 0.58 to 0.90M records (0.08 to 0.16 on five presses)"],
["Production labour, Plan B", "**0.08 to 0.16**", "2.6 to 5.4", "13 to 19 direct staff, "
"3.7M to 5.4M THB a year, over 1.0 to 1.5M records (0.13 to 0.28 on three presses)"]),
["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"],
pick(["**Total direct cost, Plan A**", "**~1.35 to 2.70**", "**~45 to 89**", "Central 2.00; no "
"extra cost for specials yet"],
["**Total direct cost, Plan B**", "**~1.30 to 2.58**", "**~43 to 85**", "Central 1.94; no "
"extra cost for specials yet"]),
], widths_mm=[42, 26, 26, 76], font_pt=8.5,
caption="Estimates, docs/finance/revenue-model.md. THB at 33 per USD."),
P(pick(
"**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.58 to 0.90 million. Labour per record rises to **0.13 / 0.19 / "
"0.28 USD** (favourable / central / adverse), and the direct cost to 1.35 / 2.00 / 2.70 USD. The "
"build-up, at northern Thai rates loaded ×1.3 for social security, overtime, bonus and PPE:",
"**Five presses spread the same crews.** 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), and Plan B spreads it over 1.0 to 1.5 million records: "
"**0.08 / 0.11 / 0.16 USD** a record (favourable / central / adverse), against 0.13 / 0.19 / 0.28 "
"on three presses, and a direct cost of 1.30 / 1.94 / 2.58 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(pick("9.4 Operating picture of Plan A", "9.4 Operating picture of Plan B")),
P("Built from the components above. Three scenarios, each internally consistent: adverse pairs low "
"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 on this plan's blocks: " + pick(
"the high end (6.25M USD) over 10 years (adverse), the midpoint (4.90M USD) over 12.5 years "
"(central) and the low end (3.56M USD) over 15 years (favourable). Payback is counted on the "
"whole plan price including the ramp-up reserve (3.86M / 5.35M / 6.85M USD from the low to the "
"high end).",
"the high end (8.07M USD) over 10 years (adverse), the midpoint (6.34M USD) over 12.5 years "
"(central) and the low end (4.61M USD) over 15 years (favourable). Payback is counted on the "
"whole plan price including the ramp-up reserve (4.92M / 6.79M / 8.67M USD from the low to the "
"high end).")),
_operating_table(),
CALL("Reading this table honestly", pick([
"**The central case works on ~177M THB.** EBITDA ~1.7M USD (~57M THB) and operating profit ~1.3M "
"USD (~44M THB) a year once the plant runs at volume. It breaks even on operating profit at about "
"**0.2 million records a year, about a quarter of its central output**. Against the earlier ~20 % "
"specials share (0.84M records, EBITDA 1.63M) more specials earn a higher price on fewer records.",
"**The adverse case loses money.** It would need ~0.9 million records to cover depreciation, and "
"the three presses make 0.58 million at that rate. 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 ~2.7 USD (~88 THB) a record (arithmetic on the table), 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 ~47 % 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, sales commissions and the extra cost of specials. **Treat the adverse "
"column as the honest one until those lines exist.** The plan price carries no contingency either.",
"**This is a sensitivity, not a forecast.** The plant and business plan calculator's Plan A preset, "
"with its own cost build-up (it adds electric steam heat, the cutting engineer and the PPA power "
"price, ~0.03M USD a year, which this table leaves out) and the team's faster Duplex planning rate, "
"at which the three presses are not Duplex-limited, gives at 850k records and 60 % specials: "
"revenue ~4.14M, EBITDA 2.04M USD, payback 2.4 years on the 161.7M THB investment in a mature "
"year; with a ramp of 35, 70 and 90 % in the first three years and the reserve in year 0, cash "
"payback in year ~3.9, ~25 % IRR and an NPV of ~4.9M USD over ten years, pre-tax and "
"pre-financing (estimates). Not modelled here: cassette and CD-R lines (later in Plan A), stamper "
"supply to other plants, dropshipping fees, and the ramp year. BOI tax exemptions shield part of "
"early-year profits where there are any.",
], [
"**Demand comes first.** Plan B earns this only if the records sell: its central case needs ~1.25 "
"million records a year, ~0.75 million of them special editions, against 0.74 million for the "
"three-press Plan A. Nothing in the market data so far shows that demand (roadmap item 1, market "
"validation).",
"**The central case works on ~224M THB.** EBITDA ~3.1M USD (~104M THB) and operating profit ~2.6M "
"USD (~87M THB) a year once the plant runs at volume; it breaks even on operating profit at about "
"**0.22 million records a year, under a fifth of its central output**. Its central EBITDA is ~1.8 "
"times Plan A's for ~27 % more money. On the earlier ~20 % specials share the five-press table "
"showed EBITDA 2.59M at the same 1.25M records: five presses are not Duplex-limited, so more "
"specials raise the price on the same volume.",
"**The adverse case only just covers depreciation** (~1.0 million records needed, 1.0 million "
"made): more presses spread the same crews, overheads and title services over more 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 ~2.4 USD (~79 THB) a record "
"(arithmetic on the table), below the low price assumed.",
"**The central margin is too good to trust yet.** A central EBITDA margin of ~52 % 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, sales commissions and the extra cost of specials. **Treat the adverse "
"column as the honest one until those lines exist.** The plan price carries no contingency either.",
"**This is a sensitivity, not a forecast.** The plant and business plan calculator's Plan B preset, "
"with its own cost build-up (it adds electric steam heat and the cutting engineer, which this "
"table leaves out), gives at 1.25M records and 60 % specials: revenue ~6.09M, EBITDA 3.25M USD, "
"payback 2.0 years on the 209.2M THB investment in a mature year; with a ramp of 35, 70 and 90 % in "
"the first three years and the reserve in year 0, cash payback in year ~3.3, ~32 % IRR and an NPV "
"of ~9.7M USD over ten years, pre-tax and pre-financing (estimates). Not modelled here: 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.",
])),
IMG(pick("renders/calculator/plan-a-cash.png", "renders/calculator/plan-b-cash.png"), 160,
"Figure 12. Ten years of cash in the plant and business plan calculator, " + pick(
"Plan A preset: cash payback in year ~3.9, IRR ~25 %, NPV ~4.9M USD at 10 %",
"Plan B preset: cash payback in year ~3.3, IRR ~32 %, NPV ~9.7M USD at 10 %") +
". Year 0 is the midpoint investment plus the ramp-up reserve; years 1 to 3 sell 35, 70 and 90 % of "
"the mature year's output. Pre-tax, pre-financing, no BOI tax holiday, no terminal value. The "
"calculator's own cost build-up and faster Duplex planning rate, not the table above "
"(docs/fleet-calculator.html); a sketch, not a forecast, estimates."),
H2("9.5 The ramp"),
P(pick(
"The table above is a mature year. Plan A 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, inside the plan price) 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.",
"The table above is a mature year. Plan B does not start there. It is commissioned in sequence: "
"first the cutting room and galvanics (the presses need their stampers), then Duplex system 1, "
"the Classic, and Duplex system 2 last. 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. **Plan B's ramp is longer**: it has to sell ~1.25 million records a year, "
"not 0.74 million, before it reaches the table above. The **ramp-up reserve is the same ~10M to "
"20M THB** estimate as for Plan A (inside the plan price); it carries staff hired before first "
"revenue and overheads until volume covers them, and with break-even at ~0.22 million records a "
"slower ramp costs payback time more than solvency (our reading). 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" + pick(
". The calculator's 35, 70 and 90 % ramp in section 9.4 is a planning assumption, not that model.",
". The calculator's 35, 70 and 90 % ramp in section 9.4 is a planning assumption, the same for "
"both plans, so it does not show Plan B's longer ramp.")),
P(pick(
"**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 at 60 % specials, roughly **+0.4 to 0.6 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). With its chiller module "
"(CH-3, USD 48k to 78k), freight and installation (24k to 48k) and the working capital for the "
"extra records it comes to ~15.4M THB at the midpoint, as Plan B prices it. 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.",
"**Growth beyond five presses.** The hall is laid out for five Duplex bays and four Classic "
"positions, and growth adds Duplex systems first, then Classics, from revenue. The boiler hall and "
"chiller compound are built for four modules each: Plan B fills two boiler and three chiller "
"positions, so a further press stage starts with the next module (scale and utility phasing in the "
"planning repository).")),
# ----------------------------------------------- 10 timeline
H1("10. Timeline: today to first paying release"),
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" + pick("", " or for Plan B's second Duplex system") +
"; 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.",
*([] if a else [
"**Plan B's second Duplex system is commissioned last**, after the Classic, so it is not on the "
"path to the first paying release. It lengthens commissioning and the ramp to full volume; its "
"build time, on top of the first system's at the same vendor, is not quoted yet."]),
]),
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.** 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**", "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); 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"],
pick(["Solar through the PPA (the installer builds and owns the array)", "Fit-out, ~Q2 2028",
"Large", "Not a risk; the PPA offer is phase 0 work; battery lead time is 50 to 60 days"],
["Solar and battery (purchase)", "Fit-out, ~Q2 2028", "Large", "Not a risk; battery lead time "
"is 50 to 60 days"]),
pick(["Cassette and CD-R lines", "Later (growth step)", "Not on the launch calendar", "Not a risk; "
"short lead "
"times"],
["Cassette and CD-R lines", "Fit-out, ~Q2 2028", "Large", "Not a risk; short lead times"]),
["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" + pick(
", and Plan A adds the Chinese boiler modules. ",
", and Plan B's second Duplex system has to clear customs inside it too. ") +
"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 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 " + pick(
"Plan A's plant, the launch plant with its six levers, and only growth and the items the levers "
"move later stay revenue-gated.",
"Plan B's five presses with everything in, and only further growth stays revenue-gated.")),
T(["Phase", "Content", "Gate"], [
["0. Validate and clear the gates (now)", "Market validation with regional labels and distributors" +
pick("", ", including the demand for ~1.25M records a year") + "; 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, " + pick(
"Newbilt Duplex and Classic, first two boiler and chiller modules (boilers through the Chinese "
"route)",
"both Newbilt Duplex systems and the Classic, the boiler modules and the first chiller "
"modules"), pick("BOI certificate and validated pricing",
"BOI certificate, validated pricing and demand")],
["3. Build and commission (~6 to 12 months after commitment)", pick(
"Construction, water-treatment building, utilities, HVAC, clean zones, security, the "
"crane-ready frame (a mobile crane for the installations); the solar array built by the PPA "
"installer; machinery installation and vendor commissioning; traceability and ERPNext live "
"before the machines; hire and train",
"Construction, water-treatment building, utilities, HVAC, clean zones, solar and battery, "
"security, crane, visitor corridor; 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)", pick(
"Second Duplex system; further Classics; the laser confocal and wide-area profiler; the visitor "
"corridor and public tours; cassette and CD-R duplication; an owned crane if needed; the "
"biomass boiler if steam starts electric; the phase 2 building; CD replication if chosen",
"Further Duplex systems first, then Classics (the hall is laid out for five Duplex bays and "
"four Classic positions); 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("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", pick("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)",
"Newbilt Duplex system 1 (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"],
*([] if a else [
["4", "Newbilt Duplex system 2 (two HRP 12, EX 50 and EX 35), with chiller module CH-3; steam "
"from B-1 and B-2", "The crews know the process from system 1; it carries the specials "
"volume that the central case needs"]]),
], 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.", pick("**More capital up front.** ~127M to 226M THB in one round (~177M at the "
"midpoint), against ~57M to 95M THB for the superseded phased entry; more of it is "
"committed before the market has validated the price.",
"**More capital up front.** ~162M to 286M THB in one round (~224M at the midpoint), "
"against ~57M to 95M THB for the superseded phased entry; more of it is committed "
"before the market has validated the price.")],
pick(["**Six levers, no machine dropped.** The levers bring the whole chain to ~180M THB, and the "
"second Duplex waits for demand and revenue on a reserved floor.",
"**What the levers give up.** Owned solar and very likely the BOI solar measure, public tours "
"at first, cassette and CD-R at launch, a bought crane; the boilers are imported from China "
"under the Thai boiler rules. The adverse case still loses money."],
["**Five presses at launch.** The same crews, overheads and title services spread over ~1.25 "
"million records: central EBITDA ~1.8 times the three-press plant's for ~27 % more money, "
"and the adverse case covers its depreciation.",
"**Demand is unproven.** The central case needs ~1.25 million records sold a year, ~0.75 "
"million of them specials; nothing in the market data shows that yet, and the ramp to it is "
"longer."]),
], widths_mm=[85, 85], font_pt=8.5),
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" + pick(
".", " and demand; the second Duplex system is commissioned last.")),
# --------------------------------------- 12 team, ownership, governance
H1("12. Team, ownership and governance"),
H2("12.1 The people"),
T(["Who", "Role"], [
["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); vendor commissioning and training (Newbilt, Pheenix, Sibert, "
"Sillitoe); property insurer."],
], widths_mm=[48, 122]),
P("Headcount: the 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), " + pick(
"and the cassette and CD-R lines add 1 to 2 when they come.",
"plus 1 to 2 for the cassette and CD-R lines; it built that direct crew for the five-press "
"fleet.") +
" 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 "
"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: at least a quarter of the funding, " + pick(
"~44M THB of Plan A's ~177M", "~56M THB of Plan B's ~224M") +
" (arithmetic, before financing costs).",
"**A shareholders' agreement** covering board composition, reserved matters (capital calls and "
"tranche releases, the growth options such as " + pick("a second Duplex", "further Duplex systems") +
", 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.",
]),
# ------------------------------------------------------ 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. The September draft's bridge-stamper "
"risk is gone with the bridge stampers; the launch plant brings its own in its place" + pick(
", and Plan A's levers and its price without contingency add theirs.",
", and Plan B's five presses and its price without contingency add theirs.")),
T(["Severity", "Risk", "What it would do", "Mitigation and status"], _risk_rows(),
widths_mm=[16, 40, 52, 62], font_pt=8),
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", "Market validation with regional labels and distributors: the 3.76 to 5.27 USD blended "
"price at 60 % specials, run sizes, and whether faster turnaround earns a premium" + pick(
"", "; and whether demand reaches ~1.25 million records a year, three fifths of them "
"specials") + "; publish the artist platform's calculator early with indicative prices "
"and an interest list", "Simona, Alexander", "Travel", pick("Pricing risk", "Pricing and demand "
"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; " + pick(
"how the 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: " + pick("Duplex (EX 50 and EX 35)", "two Duplex systems (EX 50 and EX 35 "
"each)") +
" and Classic, with build time, order-book position, PLC data access, central hydraulic supply "
"and written hydraulic requirements, currency and validity", "Alexander", "Free",
"Classic and EX 35 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",
"Galvanics priced on a reference only"],
["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", pick(
"Utility requests: Chinese boiler makers for the plan's boiler modules (ZOZEN, Sitong, Fangkuai, "
"Taiguo; 1.25 MPa, ASME S stamp, electric and fired variants) with a Thai installer; compressors "
"from Kaishan and Denair's Thai offices; Thai suppliers for the rest; chillers and HVAC, Chinese "
"makers included; the 35 % vs 45 % humidity floor; a Thai hydraulic builder for the central "
"plant",
"Utility requests: Thai suppliers; Chinese boiler makers (ZOZEN, Sitong, Fangkuai, Taiguo; "
"1.25 MPa, ASME S stamp, electric and fired variants) and compressors from Kaishan and Denair's "
"Thai offices for comparison; 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", pick("Metrology distributor quotes (XRF, inline vision, audio station; confocal and profiler "
"for later)", "Metrology distributor quotes (XRF, confocal, profiler, inline vision, "
"audio station)"), "Alexander", "Free", "Metrology band"],
["12", pick("Solar PPA offers (the plan's lever) next to a purchase quote; the installer's battery "
"and inverter design checked", "Solar and battery purchase quotes, with a PPA offer for "
"comparison; battery and inverter engineering "
"checks"), "Alexander", "Free",
pick("Solar lever, PPA price", "Solar block")],
["13", pick("Cassette and CD-R equipment quotes from two vendors each, for the growth step; tape and "
"shell supply", "Cassette and CD-R equipment quotes from two vendors each; tape and "
"shell supply"), "Alexander", "Free", "New-scope estimates"],
["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 (~1.3M to 2.6M THB, part of the plan "
"price), so the quotes, the soil test, the BOI consultant and counsel can start."],
["On the gates clearing", pick(
"A commitment in principle to **Plan A at ~180M THB** (~177M at the midpoint, the ramp-up "
"reserve of 10M to 20M included, no contingency), released in the tranches of section 8.3, "
"with the financing mix set to hold debt-to-equity at or below 3:1 (equity of at least ~44M "
"THB). Told plainly: the price carries no contingency (at 15 % it would be ~24M THB more at "
"the midpoint), and from the low to the high end of every block the plan comes to ~127M to "
"226M THB. The Newbilt re-quote, the Pheenix quote, the building quote with the soil test, "
"the metrology quotes and the solar PPA offer decide where in that range it lands.",
"A commitment in principle to **Plan B at ~225M THB** (~224M at the midpoint, the ramp-up "
"reserve of 10M to 20M included, no contingency), released in the tranches of section 8.3, "
"with the financing mix set to hold debt-to-equity at or below 3:1 (equity of at least ~56M "
"THB). Told plainly: the price carries no contingency (at 15 % it would be ~31M THB more at "
"the midpoint), and from the low to the high end of every block the plan comes to ~162M to "
"286M THB. Market validation of the demand for ~1.25 million records a year comes first; "
"then the Newbilt re-quote (two Duplex systems with the EX 35, the Classic), the Pheenix "
"quote, the building quote with the soil test and the metrology quotes decide where in that "
"range it lands.")],
["Decisions", pick(
"The equity and debt mix, and how quotes landing above the plan price are funded; the six "
"levers, the solar PPA first (it very likely gives up the BOI solar measure); CD replication, "
"yes or no, before the BOI application is finalised; the steam fuel (electric or biomass); "
"the shareholder structure with Ploy Printing and the founders; hedging of the EUR orders.",
"The equity and debt mix, and how quotes landing above the plan price are funded; five "
"presses at launch against the market validation (the second Duplex system is commissioned "
"last and can still return to a growth step); CD replication, yes or no, before the BOI "
"application is finalised; the steam fuel (electric or biomass); the shareholder structure "
"with Ploy Printing and the founders; hedging of the EUR orders.")],
["Later", pick(
"Revenue-funded growth: the second Duplex system (~USD 230k to 300k for the press system; "
"~15.4M THB at the midpoint with its chiller module, freight and working capital, as Plan B "
"prices it), the laser confocal and wide-area profiler (USD 180k to 350k), the visitor "
"corridor, cassette and CD-R, an owned crane if needed, further Classics, the biomass boiler "
"if steam starts electric, and the phase 2 building.",
"Revenue-funded growth: further Duplex systems first, then Classics, in the hall laid out for "
"five Duplex bays and four Classic positions; 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: 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; " + pick("the solar PPA offer and the BOI consultant's reading of the solar measure; ",
"market evidence for the 1.25 million records a year; ") +
"the negotiated lease; a buyer-side price data point; the investor's CD and fuel decisions; how "
"overruns are funded, since the price carries no contingency; 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, 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 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; 'Two plans': Plan A at ~180M and Plan B at ~225M THB, "
"the six levers, Plan B's additions and what is not in either "
"price; the superseded investor answer, 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 and the "
"operating pictures of Plan A and Plan B"],
["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"],
["fleet-calculator.html", "Plant and business plan calculator: target output and specials share to "
"the Duplex/Classic mix, people, utilities, investment and the operating "
"picture, with the Plan A and Plan B presets and the isometric plant "
"view (Figures 8 to 12)"],
["equipment/pressing-line.md and equipment/newbilt/", "Press fleet strategy, hydraulic ring mains; "
"Newbilt offer, site requirements, service "
"rates, 2026 product flyers"],
["equipment/galvanics.md (with pheenix-alpha/, sibert/, oms/)", "Pheenix electroforming line, "
"Sibert stamper prep, OMS reference "
"prices (the Pheenix price basis), "
"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 (demos plant-operation.html, factory-console.html)", "Data platform: ERPNext "
"as the only system of record, machine data, the factory application, the "
"NixOS fleet; the plant overview and factory console demos (Figures 2 to 4)"],
["artist-platform.md (demos artist-order.html, make-a-record.html)", "Upload and itemised price "
"calculator, fan-funded "
"campaigns, the record "
"passport (Figures 5 to 7)"],
["process-flow.md, production-timeline.md", "The chain and its checks; order turnaround stage by "
"stage, lead times and the repress path"],
["traceability.md, quality-automation.md", "The traceability specification; metrology, layered "
"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, cnx_vinyl_parametric_payap.FCStd and renders/", "Parametric building "
"and site models on "
"the candidate "
"plots (draft 0.2's "
"figures; this draft "
"uses the "
"calculator's view)"],
], widths_mm=[62, 108], font_pt=8.5),
P("Vendor PDFs and spreadsheets are primary sources and reflect the state of negotiations at their file "
"dates. Treat prices and lead times as snapshots, not commitments."),
]