Plan B re-defined: the launch plant with everything in (~210M THB); front view on the cover
Deploy test site / deploy (push) Successful in 52s

- Plan B now starts like Plan A with one Duplex system and one Classic,
  but takes none of the six levers: owned solar and battery (with the BOI
  solar measure), the full metrology stack, the visitor corridor, cassette
  and CD-R, the bought crane and Thai-supplied utilities (user, 17 October
  2026). ~193.8M THB before the reserve, ~209M with it (~150M to 268M),
  ~32M (~18 %) more than Plan A; the second Duplex is a growth step from
  revenue in both (~15.4M THB, estimate).
- total-investment.md "Two plans" re-based (heading and anchor now
  "B at ~210M THB", README and roadmap links updated); revenue-model.md
  operating pictures: same volume and EBITDA as Plan A, depreciation on
  Plan B's capital (operating profit 1.26M USD central, payback ~3.7 yr);
  the extra earns nothing in the modelled table, which the docs say.
- Calculator: Plan B preset = the launch plant with contingency kept out
  (EBITDA 2.07M USD, cash payback year ~4.3, IRR ~21 %); budget card marks
  180M and 180M plus 25 %; preset label "Plan B (~210M, all in)".
- Business plan draft 0.3, both versions rebuilt: every Plan B branch of
  the three content files rewritten; renders regenerated with the
  isometric view turned to the front of the site (road, car park, office,
  corridor facade) for the cover and Figures 8 to 10.
This commit is contained in:
grabowski committed 2026-10-17 16:33:18 +07:00
1 parent ffc6cedbca
commit 3f33babdaa
28 files changed
+528 -604

No files matched your search

+7 -7
View File
@@ -75,9 +75,9 @@ steps are open planning items.
([total investment](docs/finance/total-investment.md#launch-plant-october-2026)).
For the investor the business plan comes in two versions, priced
without contingency and with the ramp-up reserve
([two plans](docs/finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-225m-thb-october-2026)):
([two plans](docs/finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-210m-thb-october-2026)):
**Plan A, ~177M THB**, the launch plant with six cost levers, and
**Plan B, ~224M THB**, five presses with the second Duplex at launch.
**Plan B, ~209M THB**, the same launch plant with everything in.
Chinese boilers, compressor and hydraulics save about 2M THB of that
([Chinese suppliers](docs/suppliers/china-utilities.md)).
The business plan is re-based on it (draft 0.2).
@@ -282,7 +282,7 @@ The detail lives in dedicated documents:
- [Total investment](docs/finance/total-investment.md): the launch plant
decided in October 2026 (~161M to 285M THB, ~4.9M to 8.6M USD, midpoint
~223M THB) with the basis of every block, the two plans for the investor
(Plan A ~180M, Plan B ~225M THB, without contingency), and the earlier
(Plan A ~180M, Plan B ~210M THB, without contingency), and the earlier
answer to the 180M / 216M question; the earlier full vision and phased
entry are kept as superseded
- [Phase 1 construction RFQ](docs/finance/phase1-construction-rfq.md):
@@ -292,14 +292,14 @@ The detail lives in dedicated documents:
and margin per record, the launch plant's operating picture at the
planned 60 % specials (central revenue ~3.65M USD a year on ~0.74M
records, EBITDA ~1.7M; the adverse case loses money), the operating
pictures of Plan A (payback ~3.1 years on ~177M THB) and Plan B
(1.25M records, EBITDA ~3.1M USD, payback ~2.2 years on ~224M THB, if
the records sell), the five-press table, and the levers and
pictures of Plan A (payback ~3.1 years on ~177M THB) and Plan B (the
same output, payback ~3.7 years on ~209M THB: its extra pays back
through what the table leaves out), the five-press table, and the levers and
caveats behind the numbers
- Business plan, draft 0.3 (October 2026), in two versions:
[Plan A, ~180M THB](docs/business-plan/CNX-Vinyl-Business-Plan-A.pdf)
([docx](docs/business-plan/CNX-Vinyl-Business-Plan-A.docx)) and
[Plan B, ~225M THB](docs/business-plan/CNX-Vinyl-Business-Plan-B.pdf)
[Plan B, ~210M THB](docs/business-plan/CNX-Vinyl-Business-Plan-B.pdf)
([docx](docs/business-plan/CNX-Vinyl-Business-Plan-B.docx)): the
investor-facing roll-up of everything above, each a complete plan with
one table comparing it with the other, both priced without contingency
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -4,7 +4,7 @@
python build_plan.py A -> ../CNX-Vinyl-Business-Plan-A.docx
python build_plan.py B out.docx -> Plan B to a custom path
Plan A (~180M THB) and Plan B (~225M THB) share every chapter; the content modules
Plan A (~180M THB) and Plan B (~210M THB) share every chapter; the content modules
switch the plan-specific text with plan_variant.pick(). Images are resolved relative
to docs/ (the parent of business-plan/).
"""
+127 -152
View File
@@ -1,6 +1,6 @@
"""Part A: cover, reading guide, executive summary, opportunity, anatomy of the plant.
Builds Plan A (~180M THB) or Plan B (~225M THB): plan-specific text is switched with
Builds Plan A (~180M THB) or Plan B (~210M THB): plan-specific text is switched with
plan_variant.pick() inside blocks(), never at import time.
"""
from plan_lib import H1, H2, H3, P, B, N, T, KV, IMG, CALL, PB, TOC, COVER
@@ -23,17 +23,18 @@ def blocks():
"**Prepared by:** Simona Meesaiyati (Project Lead) and Alexander Grabowski (Technical Consultant), "
"supported by buildfor.life, with Ploy Printing (Chiang Mai) as packaging partner and "
"strategic co-investor",
f"**Version:** Draft 0.3, October 2026: **{name()}, {pick('~180M THB', '~225M THB')}**",
f"**Version:** Draft 0.3, October 2026: **{name()}, {pick('~180M THB', '~210M THB')}**",
],
note="Confidential. All figures in USD and THB at 1 USD = 33 THB (August 2026). Vendor quotes are "
"snapshots at their file dates, not commitments. Every number in this plan is labelled as quoted, "
"researched, or estimated; see section 2. " + pick(
"This version is Plan A: the launch plant with the whole chain, cutting and galvanics "
"included, three presses, brought to ~180M THB (~177M) with six cost levers. A second "
"version, Plan B (~225M THB), launches with five presses and takes none of the levers. ",
"This version is Plan B: the whole chain, cutting and galvanics included, with five presses "
"at launch and everything in, at ~225M THB (~224M). A second version, Plan A (~180M THB), "
"launches with three presses and six cost levers. ")
"version, Plan B (~210M THB), builds the same plant and takes none of the levers. ",
"This version is Plan B: the launch plant with the whole chain, cutting and galvanics "
"included, three presses, with everything in and none of the cost levers taken, at ~210M "
"THB (~209M). A second version, Plan A (~180M THB), builds the same plant with six cost "
"levers. ")
+ "The plan price includes the ramp-up reserve and carries no contingency. Cover picture: the "
"plant as the plant and business plan calculator draws this plan (schematic, Payap scenario "
"layout, section 6.2). Draft 0.3 replaces "
@@ -62,7 +63,7 @@ def blocks():
"sequence. There are no bridge stampers and no outsourced cutting in the plan any more. Draft 0.3 "
"prices that plant in **two versions**, both including the ramp-up reserve and neither carrying a "
"contingency: **Plan A (~180M THB)**, the launch plant's three presses with six cost levers, and "
"**Plan B (~225M THB)**, five presses with everything in. " + pick(
"**Plan B (~210M THB)**, the same three presses with everything in. " + pick(
"**This document is Plan A**, and every section below is written for it; a short table after "
"the numbers compares the two versions.",
"**This document is Plan B**, and every section below is written for it; a short table after "
@@ -72,21 +73,13 @@ def blocks():
"**The complete vinyl chain under one roof:** mastering, lacquer cutting, galvanics (growing the "
"nickel stampers), stamper preparation, pressing, finishing, packaging with our Chiang Mai print "
"partner Ploy Printing, and fulfilment including direct-to-fan dropshipping.",
pick(
"**Three presses at launch:** one Newbilt Duplex system (two semi-automatic presses with a main "
"and a colour extruder, for colour, splatter and short runs) and one Newbilt Classic fully "
"automatic press for long standard runs. Special prints are the focus (60 % and more of the "
"records), and specials run only on the Duplex, so together they make about 0.58 to 0.90 "
"million records a year on two shifts (0.71 to 0.97 million at a standard-heavy mix; "
"estimates). A second Duplex system is a growth step from revenue, with its floor, utility "
"positions and pipe connections reserved, not part of the investment.",
"**Five presses at launch:** two Newbilt Duplex systems (each two semi-automatic presses with a "
"main and a colour extruder, for colour, splatter and short runs) and one Newbilt Classic fully "
"automatic press for long standard runs. Special prints are the focus (60 % and more of the "
"records) and run only on the Duplex systems; with four semi-automatic presses they no longer "
"set the pace, so the five presses make about 1.0 to 1.5 million records a year on two shifts "
"(1.25 million in the central case; estimates). The press hall keeps room for more Duplex "
"systems and Classics as an option, not part of the investment."),
"**Three presses at launch:** one Newbilt Duplex system (two semi-automatic presses with a main "
"and a colour extruder, for colour, splatter and short runs) and one Newbilt Classic fully "
"automatic press for long standard runs. Special prints are the focus (60 % and more of the "
"records), and specials run only on the Duplex, so together they make about 0.58 to 0.90 "
"million records a year on two shifts (0.71 to 0.97 million at a standard-heavy mix; "
"estimates). A second Duplex system is a growth step from revenue, with its floor, utility "
"positions and pipe connections reserved, not part of the investment.",
"**The metal path in-house:** a Sillitoe SDMS cutting room, a Pheenix Alpha galvanics line with "
"zero-discharge water treatment, and the Sibert stamper-prep line. The father and the mother of "
"every side are archived, so represses start from our own metal.",
@@ -94,7 +87,8 @@ def blocks():
"each, with " + pick(
"two 500 kg/h boiler modules (B-1, B-2, bought through the Chinese route) and two 250 kW "
"chiller modules (CH-1, CH-2)",
"two 500 kg/h boiler modules (B-1, B-2) and three 250 kW chiller modules (CH-1 to CH-3)")
"two 500 kg/h boiler modules (B-1, B-2, from Thai suppliers) and two 250 kW chiller modules "
"(CH-1, CH-2)")
+ " installed at launch; further presses add modules, not rooms. The steam fuel (electric or "
"biomass) is still open.",
pick("**Cassette duplication and CD-R duplication as a growth step** after launch, not in the "
@@ -109,7 +103,8 @@ def blocks():
+ " and room for a second building.",
"**Commissioned in sequence:** the cutting room and galvanics first (the presses need their "
"stampers), then " + pick("the Duplex system, then the Classic",
"Duplex system 1, then the Classic, then Duplex system 2")
"the Duplex system, then the Classic, with cassette and CD-R "
"duplication alongside")
+ ". That puts galvanics, the hardest skill to "
"hire, on the path to the first paying release. Sibert, the stamper-prep supplier in the plan, "
"advised after the Haarlem trade show to get presses, boilers, operators and feedback loops "
@@ -125,10 +120,14 @@ def blocks():
"with frame, runway and machine door kept crane-ready; boilers and compressor through the "
"Chinese route. Every press, the cutting room, the galvanics line and the stamper-prep line "
"stay in.",
"**Everything in, no cost levers:** owned rooftop solar and battery (and with them the BOI "
"solar measure), the full metrology stack from launch, the visitor corridor and public tours "
"from the start, a bought overhead crane, cassette and CD-R duplication, and Thai-supplied "
"boilers and compressor."),
"**Everything in, none of the cost levers: ~210M THB**, ~194M THB at the midpoint before the "
"ramp-up reserve and ~32M THB more than Plan A (estimates, section 8): owned rooftop solar and "
"battery (and with them the BOI solar measure); the full metrology stack from launch (XRF, "
"laser confocal, wide-area profiler, inline vision, audio station); the visitor corridor and "
"accessible entrance, so public tours and the Payap student programmes are possible from the "
"start; cassette and CD-R duplication; a bought 5 t overhead crane; boilers and compressor "
"from Thai suppliers, with local service. Every press, the cutting room, the galvanics line "
"and the stamper-prep line are the same as in Plan A."),
]),
H2("What makes it top-notch"),
P("Four things separate this plant from a pressing shop, and they are the reason it can charge "
@@ -178,10 +177,10 @@ def blocks():
"~0.58M to 0.90M records/yr at 60 % specials (2 semi-automatic presses + 1 Classic, 2 shifts; "
"the Duplex sets the pace; estimate; the press fleet calculator gives ~0.94M at our planning "
"rates). Second Duplex as a growth step from revenue: ~1.0M to 1.5M",
"~1.0M to 1.5M records/yr at 60 % specials, central case 1.25M (4 semi-automatic presses + 1 "
"Classic, 2 shifts; the four semi-automatic presses carry the specials, so the Duplex does not "
"set the pace; estimate; the press fleet calculator gives ~1.5M at our planning rates). Full "
"hall as a later option: ~2.9M to 4.4M")],
"~0.58M to 0.90M records/yr at 60 % specials, central 0.74M (2 semi-automatic presses + 1 "
"Classic, 2 shifts; the Duplex sets the pace; estimate; the press fleet calculator gives ~0.94M "
"at our planning rates). Second Duplex as a growth step from revenue (section 4.4); full hall "
"as a later option: ~2.9M to 4.4M")],
["Site", "~1,500 m² main building plus a ~379 m² utility yard built for four boiler and four "
"chiller modules, on leased land (~4 rai minimum, 6 to 8 rai with expansion); second "
"building as expansion"],
@@ -191,13 +190,14 @@ def blocks():
"(staff and overheads before volume covers them). From the low to the high end of every "
"block: ~THB 127M to 226M. Estimates: no quote yet for the Classic, the galvanics line "
"(priced at OMS's reference plus 20 %) or the building",
"**~THB 224M (~USD 6.79M), rounded to ~225M THB**: the plan investment, ~THB 209.2M (~USD "
"6.34M) at the midpoint with everything in, plus a ramp-up reserve of ~THB 10M to 20M (staff "
"and overheads before volume covers them). From the low to the high end of every block: ~THB "
"162M to 286M. Estimates: no quote yet for the Classic, the galvanics line (priced at OMS's "
"reference plus 20 %), the EX 35 or the building")],
"**~THB 209M (~USD 6.33M), rounded to ~210M THB**: the plan investment, ~THB 193.8M (~USD "
"5.87M) at the midpoint with everything in, plus a ramp-up reserve of ~THB 10M to 20M (staff "
"and overheads before volume covers them); at the midpoint within the investor's 180M THB "
"plus 20 %. From the low to the high end of every block: ~THB 150M to 268M. Estimates: no "
"quote yet for the Classic, the galvanics line (priced at OMS's reference plus 20 %) or the "
"building")],
["Not in the plan price", "**No contingency** (at the 15 % used in the cost documents, ~THB "
+ pick("24M", "31M") + " at the midpoint): quotes that land high are "
+ pick("24M", "29M") + " at the midpoint): quotes that land high are "
"funded outside the plan or by scope steps (section 8). Also not in "
"it: the central hydraulic plant (not yet costed), the archive's mobile "
"shelving (to quote), CD replication, financing costs, currency moves, "
@@ -212,76 +212,75 @@ def blocks():
"presses make 0.58M at that rate. The solar PPA's power price (~USD 0.03M a year in the "
"calculator) is not in these figures. Utilisation and price decide the outcome, not upside "
"(section 9)",
"Central case at 60 % specials: revenue ~USD 6.05M (~THB 200M), EBITDA ~USD 3.14M (~THB "
"104M), operating profit ~USD 2.63M (~THB 87M); break-even on operating profit at ~0.22M "
"records a year. **The adverse case only just covers depreciation:** EBITDA ~USD 0.83M, "
"operating profit ~USD 0.02M. **All of it needs the records to sell:** ~1.25M a year in the "
"central case, ~0.75M of them specials, and no market evidence shows that demand yet. "
"Central case at 60 % specials: revenue ~USD 3.65M (~THB 120M), EBITDA ~USD 1.73M (~THB "
"57M), operating profit ~USD 1.26M (~THB 42M); break-even on operating profit at ~0.23M "
"records a year. **The adverse case loses money:** EBITDA ~USD 0.23M, operating loss ~USD "
"0.52M (~THB 17M); it would need ~1.1M records a year to cover depreciation and the three "
"presses make 0.58M at that rate. Cassette, CD-R and tour revenue are not in these figures. "
"Utilisation and price decide the outcome, not upside (section 9)")],
["Payback", pick(
"~3.1 years on the plan price in the central case (2.2 to 4.0 from the low to the high end of "
"the price); ~1.0 year in the favourable case, ~30 years in the adverse case (EBITDA, mature "
"year, ramp-up reserve included; estimates)",
"~2.2 years on the plan price in the central case (1.6 to 2.8 from the low to the high end of "
"the price); ~0.8 year in the favourable case, ~10.5 years in the adverse case (EBITDA, mature "
"~3.7 years on the plan price in the central case (2.6 to 4.7 from the low to the high end of "
"the price); ~1.2 years in the favourable case, ~35 years in the adverse case (EBITDA, mature "
"year, ramp-up reserve included; estimates)")],
["First paying release", "**Open.** The August 2026 calendar gives Q4 2028 to mid-2029 (27 to 33 "
"months from the start of phase 0), but it was drawn for a one-press "
"launch. Commissioning the cutting room and galvanics before the presses "
"is not yet in it, and the lathe, galvanics line and stamper-prep build "
"times are not on file, so the date stays open until those vendors "
"quote." + pick("", " Plan B commissions its second Duplex system last, "
"after the Classic.")
+ " Ordering machinery before the BOI certificate, if allowed, could "
"quote. Ordering machinery before the BOI certificate, if allowed, could "
"still pull it forward by 6 to 9 months (section 10)"],
["People", pick(
"~15 to 25 across shifts at volume (estimate); the launch plant needs most of that "
"crew, because two shifts still need press, finishing, galvanics, QC and maintenance "
"staff (13 to 19 direct production staff in the revenue model)",
"~15 to 25 across shifts at volume (estimate); two shifts need press, finishing, galvanics, QC "
"and maintenance staff whether the plant runs three presses or five, so Plan B's five presses "
"run on the same direct crews (13 to 19 direct production staff in the revenue model) and "
"spread them over more records")],
["People", "~15 to 25 across shifts at volume (estimate); the launch plant needs most of that "
"crew, because two shifts still need press, finishing, galvanics, QC and maintenance "
"staff (13 to 19 direct production staff in the revenue model)"],
["The ask", pick(
"~THB 177M (~USD 5.35M), the ~180M THB plan, released in tranches against milestones "
"(section 8), starting with phase 0 (~THB 1.3M to 2.6M). BOI caps debt-to-equity at 3:1, so "
"at least a quarter is equity: ~THB 44M (arithmetic, before financing costs)",
"~THB 224M (~USD 6.79M), the ~225M THB plan, released in tranches against milestones "
"~THB 209M (~USD 6.33M), the ~210M THB plan, released in tranches against milestones "
"(section 8), starting with phase 0 (~THB 1.3M to 2.6M). BOI caps debt-to-equity at 3:1, so "
"at least a quarter is equity: ~THB 56M (arithmetic, before financing costs)")],
"at least a quarter is equity: ~THB 52M (arithmetic, before financing costs)")],
]),
H2("Two versions of this plan"),
P("This plan comes in two versions, built from the same documents and the same machine choices. " + pick(
"This document is **Plan A**. The other version, **Plan B (~225M THB)**, puts the second Duplex "
"system in at launch, for five presses, and takes none of the six levers. ",
"This document is **Plan B**. The other version, **Plan A (~180M THB)**, launches with three "
"presses (one Duplex system and the Classic), takes six cost levers and keeps the second Duplex "
"as a growth step from revenue. ")
+ "Both carry the ramp-up reserve and neither carries a contingency. What decides between them is "
"demand: Plan B's central case needs about 70 % more records sold than Plan A's (1.25 against 0.74 "
"million a year), and the market validation gate (section 3.2) is the evidence for that. Section 8 "
"sets the two side by side."),
"This document is **Plan A**. The other version, **Plan B (~210M THB)**, builds the same three "
"presses and takes none of the six levers. ",
"This document is **Plan B**. The other version, **Plan A (~180M THB)**, builds the same three "
"presses (one Duplex system and the Classic) and takes six cost levers. ")
+ "Both carry the ramp-up reserve and neither carries a contingency, and in both the second Duplex "
"system is a growth step from revenue. What decides between them is no longer demand, because both "
"make the same records: it is whether the investor funds ~THB 32M (~18 %) more at launch for what "
"Plan A leases or buys from revenue. Plan B keeps the BOI solar measure (only an owned array "
"qualifies), measures every stamper fully from the first release, makes tours and the Payap "
"programmes possible from the start, sells cassette and CD-R from launch, owns its crane and buys "
"its utilities with local service. On the modelled numbers that extra earns nothing (the same "
"EBITDA, more depreciation, a longer payback, a deeper adverse case), so Plan A has the better "
"modelled return and Plan B the more complete plant. Most of Plan B's items can be added to Plan A "
"later from revenue; the BOI solar measure and the corridor are cheaper to have from the start. "
"Section 8 sets the two side by side."),
T(["", "Plan A", "Plan B"], [
["Plan price (ramp-up reserve in, no contingency)", "~THB 177M (~USD 5.35M); ~127M to 226M from "
"the low to the high end", "~THB 224M (~USD 6.79M); ~162M to 286M from the low to the high end"],
["Presses", "3: one Duplex system (2 semi-automatic) and one Classic",
"5: two Duplex systems (4 semi-automatic) and one Classic"],
["Records a year at 60 % specials", "~0.58M to 0.90M (central 0.74M)",
"~1.0M to 1.5M (central 1.25M)"],
["EBITDA, central case", "~USD 1.73M (~THB 57M)", "~USD 3.14M (~THB 104M)"],
["Operating profit, central case", "~USD 1.34M (~THB 44M)", "~USD 2.63M (~THB 87M)"],
["Payback on the plan price, central case", "~3.1 years (2.2 to 4.0)", "~2.2 years (1.6 to 2.8)"],
"the low to the high end", "~THB 209M (~USD 6.33M); ~150M to 268M from the low to the high end"],
["Presses", "3: one Duplex system (2 semi-automatic) and one Classic", "The same 3"],
["Records a year at 60 % specials", "~0.58M to 0.90M (central 0.74M)", "The same"],
["EBITDA, central case", "~USD 1.73M (~THB 57M)", "~USD 1.73M (~THB 57M); cassette and CD-R "
"not modelled"],
["Operating profit, central case", "~USD 1.34M (~THB 44M)", "~USD 1.26M (~THB 42M)"],
["Payback on the plan price, central case", "~3.1 years (2.2 to 4.0)", "~3.7 years (2.6 to 4.7)"],
["Adverse case", "Loses money: EBITDA ~USD 0.23M, operating loss ~USD 0.39M",
"Just covers depreciation: EBITDA ~USD 0.83M, operating profit ~USD 0.02M"],
["What Plan A gives up, what Plan B needs", "At launch: solar through a PPA (very likely without "
"Loses money: EBITDA ~USD 0.23M, operating loss ~USD 0.52M"],
["What Plan A gives up, what Plan B buys", "At launch: solar through a PPA (very likely without "
"the BOI solar measure), no confocal or profiler, no visitor corridor or tours, no cassette or "
"CD-R, a rented crane; Chinese-made boilers and compressor",
"~1.25M records sold a year, ~0.75M of them specials, against 0.74M for Plan A; no market "
"evidence of that demand yet"],
"~THB 32M more at launch: owned solar and battery with the BOI solar measure, the full "
"metrology stack, the visitor corridor and tours, cassette and CD-R, a bought crane; "
"Thai-supplied boilers and compressor"],
], widths_mm=[42, 64, 64], font_pt=8.5,
caption="Estimates: mature year at 60 % specials, from the revenue model; payback counted on the "
"whole plan price including the reserve. Central EBITDA margins of ~47 % (A) and ~52 % (B) "
"are far above the 15 to 25 % pressing plants earn; read the adverse case as the honest one."),
"whole plan price including the reserve. A central EBITDA margin of ~47 % (both plans) is "
"far above the 15 to 25 % pressing plants earn; read the adverse case as the honest one."),
H2("Where we are, and what we ask"),
P("The project is at the planning stage. Industry outreach has run for several years. Alexander and "
"Simona attended **Making Vinyl Europe in Haarlem** (30 September to 2 October 2026): most people "
@@ -308,7 +307,7 @@ def blocks():
"the Newbilt re-quote for the Duplex system (with an EX 35 price) and the Classic, a Pheenix "
"quote for the galvanics line, the building price request with the soil test, metrology "
"distributor quotes and a solar PPA offer.",
"the Newbilt re-quote for both Duplex systems (with an EX 35 price) and the Classic, a Pheenix "
"the Newbilt re-quote for the Duplex system (with an EX 35 price) and the Classic, a Pheenix "
"quote for the galvanics line, the building price request with the soil test, and metrology "
"distributor quotes."),
pick(
@@ -318,17 +317,18 @@ def blocks():
"boiler and chiller modules), building contract, fit-out, commissioning in sequence "
"(section 8). From the low to the high end of every block the plan runs from ~THB 127M to "
"226M; quotes that land high are funded outside the plan or by scope steps.",
"**Then the Plan B round, ~THB 224M (~USD 6.79M), rounded to ~225M THB**, including the "
"ramp-up reserve and without contingency, released in tranches against milestones: BOI "
"certificate and lease signed, long-lead orders (lathe, galvanics, stamper prep, both Duplex "
"systems and the Classic, boiler and chiller modules), building contract, fit-out, "
"commissioning in sequence (section 8). From the low to the high end of every block the plan "
"runs from ~THB 162M to 286M; quotes that land high are funded outside the plan or by scope "
"steps."),
"**Decisions needed from the investor:** which version to fund, Plan A or Plan B (demand decides "
"first, from market validation; then the Classic, Pheenix and EX 35 quotes, the solar PPA offer "
"and the building quote); the equity/debt mix (BOI requires debt-to-equity of at most 3:1, so at "
"least ~THB " + pick("44M of Plan A's ~177M", "56M of Plan B's ~224M") + " is equity); CD "
"**Then the Plan B round, ~THB 209M (~USD 6.33M), rounded to ~210M THB**, including the "
"ramp-up reserve and without contingency, within the investor's 180M THB plus 20 % at the "
"midpoint, released in tranches against milestones: BOI certificate and lease signed, "
"long-lead orders (lathe, galvanics, stamper prep, presses, boiler and chiller modules), "
"building contract, fit-out, commissioning in sequence (section 8). From the low to the high "
"end of every block the plan runs from ~THB 150M to 268M; quotes that land high are funded "
"outside the plan or by scope steps."),
"**Decisions needed from the investor:** which version to fund, Plan A or Plan B (both make the "
"same records, so the choice is ~THB 32M more at launch for what Plan A leases or defers; the "
"Classic, Pheenix and EX 35 quotes, the solar PPA offer and the building quote settle the "
"numbers); the equity/debt mix (BOI requires debt-to-equity of at most 3:1, so at "
"least ~THB " + pick("44M of Plan A's ~177M", "52M of Plan B's ~209M") + " is equity); CD "
"replication, yes or no (it must be in the BOI application from the start); and the steam fuel, "
"electric or biomass.",
"**Co-investment:** Ploy Printing, the Chiang Mai print and packaging house that will produce "
@@ -340,10 +340,10 @@ def blocks():
H1("2. How to read the numbers"),
P("**Two versions.** This business plan comes in two versions, built from the same documents: "
"**Plan A (~180M THB)**, the launch plant's three presses with six cost levers, and **Plan B "
"(~225M THB)**, five presses with everything in. Both plan prices include the ramp-up reserve and "
"neither carries a contingency. This document is **" + label() + "**. Chapters that do not depend "
"on the choice read the same in both; where the plans differ, this version gives its own figures, "
"and sections 1 and 8 compare the two."),
"(~210M THB)**, the same three presses with everything in. Both plan prices include the ramp-up "
"reserve and neither carries a contingency. This document is **" + label() + "**. Chapters that "
"do not depend on the choice read the same in both; where the plans differ, this version gives "
"its own figures, and sections 1 and 8 compare the two."),
P("Every figure in this plan carries one of three confidence levels. Where a table does not say, "
"the basis column or caption does."),
T(["Label", "Meaning", "Examples"], [
@@ -394,9 +394,7 @@ def blocks():
"is the gap. It is also the plan's biggest assumption: that enough regional customers will pay for "
"a closer, faster, more accountable plant at a price that works. That pricing power is unproven. "
"The Haarlem trade show produced strong supplier interest but no buyer prices, and the market "
"validation gate exists to test it before capital is committed." + pick(
"", " Plan B makes the assumption heavier: its central case sells ~1.25 million records a year, "
"~0.75 million of them special editions, against 0.74 million for the three-press Plan A.")),
"validation gate exists to test it before capital is committed."),
H2("3.3 What the market shows: two price points"),
P("Two sets of real prices now exist: invoices from the one Thai pressing shop we have seen, and the "
"published calculator of a European plant. Neither is used to re-base the financial model, which "
@@ -420,12 +418,9 @@ def blocks():
P("What the tour showed: the shop operates from a small non-industrial premises; it does not plate "
"(stampers are bought in from abroad and resold); there is no temperature, humidity or particulate "
"control on the pressing floor; and it runs two Newbilt presses, a Classic fully automatic and one "
"semi-automatic, about 190 to 210 records an hour at nameplate. That is a real capital fleet. " + pick(
"Our launch plant's three presses (248 to 288 records an hour at nameplate, planned for two "
"shifts) ",
"Plan B's five presses (four semi-automatic at 60 to 80 records an hour each plus the Classic at "
"~128, 368 to 448 records an hour at nameplate, planned for two shifts) ")
+ "out-press it on paper, which the one-press launch of draft 0.1 did not. Neither figure is "
"semi-automatic, about 190 to 210 records an hour at nameplate. That is a real capital fleet. "
"Our launch plant's three presses (248 to 288 records an hour at nameplate, planned for two "
"shifts) out-press it on paper, which the one-press launch of draft 0.1 did not. Neither figure is "
"measured output: their shifts and order book were not observed."),
H3("A European plant: Record Industry's calculator"),
P("Record Industry (Haarlem, Netherlands) publishes an online calculator. For a 12-inch 140 g black "
@@ -514,15 +509,12 @@ def blocks():
["Stamper preparation machines", "Turns a raw nickel shell into a press-ready part",
"Sibert back-finisher, punch, coiner (USD 250k budget confirmed)", LP + ", with galvanics"],
["A mixed press fleet", "Semi-automatic for colour and short runs, automatic for long runs",
pick("Newbilt Duplex system (2 presses, main + colour extruder) and one Newbilt Classic",
"Two Newbilt Duplex systems (4 presses, each system with main + colour extruder) and one "
"Newbilt Classic"),
pick("Launch plant; second Duplex as growth option",
"At launch, second Duplex system commissioned last; full hall as an option")],
"Newbilt Duplex system (2 presses, main + colour extruder) and one Newbilt Classic",
pick("Launch plant; second Duplex as growth option", "At launch; second Duplex as growth option")],
["Steam, cooling and compressed air engineered locally", "The largest energy loads; efficiency "
"lives here", "Boiler hall and chiller compound for four modules each; " + pick(
"2 x 500 kg/h boilers (Chinese route) and 2 x 250 kW chillers",
"2 x 500 kg/h boilers and 3 x 250 kW chillers") + "; heat recovery designed in",
"2 x 500 kg/h boilers (Thai suppliers) and 2 x 250 kW chillers") + "; heat recovery designed in",
LP + "; modules added with presses"],
["Whole-plant climate and particulate control", "Moisture and dust are the two classic record "
"defects", "20 to 26 °C, 35 to 60% RH, filtration for the burning season, tighter in clean "
@@ -638,7 +630,7 @@ def blocks():
"and ~45 minutes for a stamper (silvering and bench times are estimates). With loading and rinsing, "
"a cell turns a part in about 1 to 1.5 hours, so one PDPU makes 20 to 32 parts in a two-shift day "
"against 8 to 20 parts a working day "
+ pick("even for the larger five-press fleet", "for Plan B's five presses")
+ pick("even for the larger five-press fleet", "even with the second Duplex system added from revenue")
+ ". **One PDPU covers the "
"demand; a second would buy redundancy, not capacity.** By OMS's rule of thumb (one person runs "
"about 20 stampers a day) that is one galvanics operator per shift."),
@@ -684,27 +676,21 @@ def blocks():
"Duplex share mould inserts, so the plant runs one mould family, one set of spares and one service "
"relationship; the cost is a single-vendor dependency."),
T(["Machine", "Role", "Basis", "Cost"], [
[pick("Newbilt Duplex system (Alsdorf, Germany)", "Newbilt Duplex system 1 (Alsdorf, Germany)"),
["Newbilt Duplex system (Alsdorf, Germany)",
"Two HRP 12 hydraulic presses (~150 t), EX 50 main "
"extruder and EX 35 colour extruder, 12-inch book moulds for 140/180 g, trimmer, label dry oven, "
"shrink wrapper, PVC grinder, label punch, spindles and plates; one operator's cell",
"Quoted: EUR 200,500 (~USD 232k) for the Single 2.1 system incl. sea freight, June 2024, plus "
"the quoted second press and extruder (~USD 115k); expired, re-quote required with build time",
"USD 350k to 370k (THB 11.6M to 12.2M)"],
*pick([], [[
"Newbilt Duplex system 2", "Two more HRP 12 presses with an EX 50 main and an EX 35 colour "
"extruder, on the same central hydraulics; commissioned after the Classic",
"Estimate on the 2024 quote: two presses at the quoted ~USD 115k per press and extruder set, "
"plus a hydraulic unit and the EX 35; no EX 35 price on file",
"USD 230k to 300k (THB 7.6M to 9.9M)"]]),
["Newbilt Classic", "Fully automatic press with built-in extruder, automatic patty, label and "
"record handling; 28 s cycle, ~128 records/h at 180 g; Siemens safety PLC with OPC UA; "
"vendor-claimed 95% yield and uptime", "Estimate: placeholder band; **no Newbilt price on "
"file**", "USD 290k to 460k (THB 9.6M to 15.2M)"],
*pick([["Second Duplex system (growth option)", "Two more semi-automatic presses on the same central "
"hydraulics; floor, utility positions and ring-main tees reserved", "Estimate; not in the "
"investment",
"~USD 230k to 300k"]], []),
["Second Duplex system (growth option)", "Two more semi-automatic presses on the same central "
"hydraulics; floor, utility positions and ring-main tees reserved", "Estimate; not in the "
"investment",
"~USD 230k to 300k"],
], widths_mm=[34, 66, 42, 28], font_pt=8.5),
P("The Pheenix Alpha AD12 automatic press left the plan in October 2026 and stays the comparison if "
"the Classic re-quote disappoints."),
@@ -719,12 +705,13 @@ def blocks():
"modules through the Chinese route: ASME-stamped 1.25 MPa units from makers with Thai "
"references, installed by a Thai contractor and verified under the Thai rules for imported "
"boilers (section 5.4). ",
"At Newbilt's per-machine figures the five presses draw about 750 to 900 kg/h of steam "
"at 10 bar / 180 °C and up to ~650 kW of cooling with extruders and hydraulics on a hot "
"afternoon (estimates; the Classic is counted as one press and extruder until Newbilt states "
"its own figures). They are met by **two 500 kg/h boiler modules (B-1, B-2) and three 250 kW "
"chiller modules (CH-1 to CH-3)**, in a boiler hall and an open chiller compound built for four "
"modules each; the fourth positions are reserve and growth. ")
"At Newbilt's per-machine figures the three presses draw about 450 to 540 kg/h of steam "
"at 10 bar / 180 °C and up to ~390 kW of cooling on a hot afternoon (estimates; the Classic is "
"counted as one press and extruder until Newbilt states its own figures). They are met by **two "
"500 kg/h boiler modules (B-1, B-2) and two 250 kW chiller modules (CH-1, CH-2)**, in a boiler "
"hall and an open chiller compound built for four modules each; a second Duplex adds a third "
"chiller module, and the fourth positions are reserve and growth. Plan B buys the boiler "
"modules and the compressor from Thai suppliers, with local service. ")
+ "The presses share one central hydraulic plant and one "
"compressed-air plant through ring mains with a valved tee at every press position, so a new press "
"is connected without stopping the others; the standby pump set, accumulators and ring main are "
@@ -735,34 +722,22 @@ def blocks():
"materials and finished goods. A press weighs 1,350 kg on under one square metre, so the floor slab "
"must carry several tonnes per square metre and is a building-selection criterion; the floor must "
"be flat, non-slip and solvent-resistant."),
T(["Stage", "Fleet", "Rough output per year"], pick([
T(["Stage", "Fleet", "Rough output per year"], [
["Launch plant", "1 Duplex system (2 semi-automatic) + 1 Classic, 2 shifts",
"~0.58 to 0.90 million records at 60 % specials (0.71 to 0.97 at ~20 %)"],
["Growth option: second Duplex", "4 semi-automatic + 1 Classic, 2 shifts; room reserved, not in "
"the investment", "~1.0 to 1.5 million records"],
"the investment",
"~1.0 to 1.5 million records"],
["Full hall (option)", "5 Duplex systems + 4 Classics, the press hall laid out for Duplex "
"(special pressings first, ~73/27 by floor); a utility phase of its own",
"~2.9 to 4.4 million records at 60 % specials (estimate)"],
], [
["Plan B at launch", "2 Duplex systems (4 semi-automatic) + 1 Classic, 2 shifts",
"~1.0 to 1.5 million records at 60 % specials (central case 1.25 million)"],
["Full hall (option)", "5 Duplex systems + 4 Classics, the press hall laid out for Duplex "
"(special pressings first, ~73/27 by floor); a utility phase of its own",
"~2.9 to 4.4 million records at 60 % specials (estimate)"],
]), widths_mm=[40, 80, 50],
caption=pick(
"Basis: semi-automatic 60 to 80 records/h assumed; Classic ~128/h (vendor flyer); 16 h/day, "
"300 days/yr, 60 to 70% overall equipment effectiveness; specials (60 % and more) only on the "
"Duplex. The launch plant is 248 to 288 records/h at nameplate, but at 60 % specials the "
"Duplex caps it at 200 to 267/h, ~120 to 187/h after effectiveness; the press fleet calculator "
"at the team's planning rates gives ~0.94 million. Neither option is in the revenue model "
"or the investment.",
"Basis: semi-automatic 60 to 80 records/h assumed; Classic ~128/h (vendor flyer); 16 h/day, "
"300 days/yr, 60 to 70% overall equipment effectiveness; specials (60 % and more) only on the "
"Duplex systems. The five presses are 368 to 448 records/h at nameplate; the four "
"semi-automatic presses (240 to 320/h) carry the specials, so at 60 % the Duplex does not "
"limit the output; the press fleet calculator at the team's planning rates gives ~1.5 million. "
"The full hall is in neither the revenue model nor the investment.")),
], widths_mm=[40, 80, 50],
caption="Basis: semi-automatic 60 to 80 records/h assumed; Classic ~128/h (vendor flyer); 16 h/day, "
"300 days/yr, 60 to 70% overall equipment effectiveness; specials (60 % and more) only on the "
"Duplex. The launch plant is 248 to 288 records/h at nameplate, but at 60 % specials the "
"Duplex caps it at 200 to 267/h, ~120 to 187/h after effectiveness; the press fleet "
"calculator at the team's planning rates gives ~0.94 million. Neither option is in the "
"revenue model or the investment."),
P("**On the 60 to 70% effectiveness figure.** Newbilt publishes 95% yield and 95% uptime for the "
"Classic. We have not adjusted the plan on that basis, deliberately: a vendor's machine uptime "
"excludes stamper and mould changes, colour changeovers, compound lot changes, first-article QC "
+37 -43
View File
@@ -1,7 +1,8 @@
"""Part B: what makes it top-notch (traceability, metrology, QC, efficiency); site and building;
regulatory (BOI and licences). Draft 0.3, October 2026: one text for both versions, Plan A (~180M
THB, the launch plant with six cost levers) and Plan B (~225M THB, five presses, everything in); the
plan-specific passages switch with plan_variant.pick(), called inside blocks()."""
THB, the launch plant with six cost levers) and Plan B (~210M THB, the same launch plant with
everything in, none of the levers); the plan-specific passages switch with plan_variant.pick(),
called inside 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
@@ -192,10 +193,10 @@ def blocks():
"the budget.",
], [
"**At launch: the full stack.** The metrology and QC block is USD 350k to 810k (11.6M to 26.7M "
"THB, estimate, section 8): XRF, laser confocal, wide-area profiler, inline vision on the presses "
"and the audio station. Every father, mother and stamper is measured before the next plating "
"generation or the press. The block was priced with inline vision on three presses, so the "
"cameras for the second Duplex system are to quote.",
"THB, estimate, section 8): XRF, laser confocal, wide-area profiler, inline vision on the three "
"presses and the audio station. Every father, mother and stamper is measured before the next "
"plating generation or the press, and groove geometry and form on the metal are measured from "
"the first release.",
"**If quotes land high,** the laser confocal and the wide-area profiler (USD 180k to 350k, "
"estimate) are the part that can wait and be bought from revenue: thickness and cosmetics "
"would still be measured on every part, and groove geometry judged through the test pressing "
@@ -218,7 +219,7 @@ def blocks():
"stamper), stitching and flow lines, warp, off-centre spindle holes, surface debris, wrong or "
"off-centre labels. Non-fill and stitching correlate with audible defects, so this is a strong "
"proxy for audio quality", "Custom integration of general machine vision (Keyence or Cognex "
"class) on all " + pick("three", "five") + " presses; no vinyl-specific "
"class) on all three presses; no vinyl-specific "
"product exists"],
["2. Press telemetry, every cycle", "Mould temperatures, pressures, cycle time, extruder values, "
"yields and drift alerts from the press PLC", "Process drift before it becomes a defect; the "
@@ -269,9 +270,10 @@ def blocks():
"At launch the three presses need 450 to 540 kg/h of saturated steam at 10 bar / 180 °C and "
"~391.5 kW of cooling at a hot-afternoon peak; the utility backbone is built for the "
"five-press fleet (750 to 900 kg/h of steam, up to ~650 kW of cooling). ",
"At launch the five presses need 750 to 900 kg/h of saturated steam at 10 bar / 180 °C and "
"~652.5 kW of cooling at a hot-afternoon peak, on a utility backbone with rooms for four "
"boiler and four chiller modules. ") +
"At launch the three presses need 450 to 540 kg/h of saturated steam at 10 bar / 180 °C and "
"~391.5 kW of cooling at a hot-afternoon peak, on a utility backbone with rooms for four "
"boiler and four chiller modules, so the second Duplex system plugs in when revenue pays for "
"it. ") +
"On top comes whole-plant air conditioning in a tropical climate. Newbilt excludes "
"steam and cooling from its scope, so these systems are ours to design, and the design rests on "
"one observation: the steam's job is to heat the moulds and the cooling water's job is to remove "
@@ -289,12 +291,11 @@ def blocks():
"lag by one controller. Either boiler alone carries 93 to 111% of the steam demand; one "
"chiller out leaves ~64% of the cooling peak. The boiler bodies come through the Chinese "
"route and the compressor from a Chinese brand's Thai office (below). ",
"at launch two 500 kg/h boilers (B-1, B-2) for the 750 to 900 kg/h peak and three 250 kW "
"air-cooled chillers rated at 40 °C ambient (CH-1 to CH-3) for ~652.5 kW, sequenced lead "
"and lag by one controller; the boilers and the compressor come from Thai suppliers "
"(below). Five presses on two boilers leave no spare: a third module (B-3) is an RFQ option "
"outside the plan price, and without it a boiler fault costs about two presses until it is "
"fixed; one chiller out leaves ~77% of the cooling peak. ") +
"at launch two 500 kg/h boilers (B-1, B-2) for the 450 to 540 kg/h peak and two 250 kW "
"air-cooled chillers rated at 40 °C ambient (CH-1, CH-2) for ~391.5 kW, sequenced lead and "
"lag by one controller. Either boiler alone carries 93 to 111% of the steam demand; one "
"chiller out leaves ~64% of the cooling peak. The boilers and the compressor come from Thai "
"suppliers, with local service (below). ") +
"Identical modules mean one set of spares "
"and one service routine, N+1 later is one more module rather than a redesign, and the plant "
"never runs one oversized boiler at poor part load. Four boilers carry about eight presses with "
@@ -343,7 +344,7 @@ def blocks():
"weekdays) and 2.6037 THB/kWh off-peak, plus the Ft fuel adjustment (+0.1623 THB/kWh for "
"September to December 2026; it resets every four months) and reclaimable VAT. Two shifts put "
"about two thirds of process energy into peak hours: a blended ~3.81 THB/kWh before the demand "
"charge. " + pick("For the five-press fleet the backbone is built for", "For the five presses") +
"charge. For the five-press fleet the backbone is built for" +
", without electric steam, that is "
"roughly 4.5M to 6.8M THB a year before solar, 0.7M to 1.1M of it demand charge (estimates), on "
"an 800 to 1,000 kVA connection. Three design consequences:"),
@@ -404,8 +405,7 @@ def blocks():
"pipeline in Northern Thailand, so gas means a bulk LPG tank on site with hazardous-storage "
"separation and licensing, and diesel means a fuel tank with price exposure. The two routes "
"without a fossil tank, compared for the same heat (~1,120 to 1,280 MWh a year at about 1.0 "
"million records, " + pick("the top of the plant's range", "the low end of the five presses' "
"range") + "; estimates):"),
"million records, the top of the plant's range; estimates):"),
T(["", "Electric boiler bank (~98%)", "Biomass boiler bank (~80%)"], [
["Price of heat", "~3.9 THB/kWh, plus the demand charge", "~0.5 to 0.9 THB/kWh at 1.35 to 2 "
"THB/kg delivered (reported market prices, October 2026; no supplier quote yet)"],
@@ -429,9 +429,7 @@ def blocks():
"land a biomass stack would be a hard sell, which favours electric or LPG there (section 6.1)."),
P("**Fuel.** A biomass bank burns roughly 350 to 400 tonnes of air-dry wood a year at about 1.0 "
"million records (~540 to 620 t as fresh chips, which is what the store and the monsoon stock are "
"sized for)" + pick("", ", up to ~550 t air-dry at 1.5 million (fuel follows records pressed, "
"not presses)") +
". Lamphun alone produces more than 900,000 t of farm residues a year (Maejo "
"sized for). Lamphun alone produces more than 900,000 t of farm residues a year (Maejo "
"University), so supply is not the constraint; price is. Reported prices follow diesel, so the "
"fuel contract gets a diesel clause and sources within ~50 km. The local price-setter is Ratch "
"Pathana's biomass buying centre at Pa Sak, Mueang Lamphun, which feeds a 9.6 MW cogeneration "
@@ -519,8 +517,6 @@ def blocks():
"Figure 2. Plant overview (simulated SCADA) of the launch plant, running at 60×: header with shift, "
"presses running, cycles an hour, good records and rejects, metal in work, steam pressure, plant "
"load and solar; metal path on top, press hall and finishing in the middle, utilities below. "
+ pick("", "The demo draws the launch plant (Duplex system 1 and the Classic); Plan B adds the "
"second Duplex system to the same screen. ") +
"Demo (docs/plant-operation.html), simulated values."),
H3("Back office: the factory console on ERPNext"),
P("The factory application (working name cnx-factory) is the plant's working interface. It shows the "
@@ -687,10 +683,7 @@ def blocks():
caption="Estimates. The boiler and chillers have since moved to the detached utility yard, which "
"frees floor the workshop and corridor take; water treatment is proposed in its own "
"building next to galvanics; cassette and CD-R duplication (~40 to 80 m² and ~20 to "
"40 m²" + pick(", a later step in this plan", "") + ") are not in the table yet. " + pick(
"", "The press rows size one Duplex system and the Classic; the second Duplex "
"system needs its own bay on top (~110 m² at the calculator's floor figure, "
"estimate). ") +
"40 m²" + pick(", a later step in this plan", "") + ") are not in the table yet. "
"At the lower half of the table everything fits in "
"1,500 m²; at the upper half, finished goods move to a second building."),
P("Figures 8 to 10 show the plant as the plant and business plan calculator draws it for " + label() +
@@ -698,7 +691,9 @@ def blocks():
"process order along the glazed visitor corridor, a two-storey office, the detached utility yard "
"and a press hall of ~870 m² laid out for five Duplex bays and four Classic positions, on a "
"150 × 150 m placeholder plot. The building described above and the zone table are the 60 × 25 m "
"hall for Mueang Chi; which layout is built is decided once a plot passes zoning and lease-ability. "
"hall for Mueang Chi; which layout is built is decided once a plot passes zoning and lease-ability. " +
"The views look at the front of the site: the road, the car park, the office and the "
"visitor-corridor facade are in the foreground. " +
"The calculator itself is interactive: rotate, zoom, switch floors and tap any object for its "
"figures and their source."),
IMG(pick("renders/calculator/plan-a-iso-roof.png", "renders/calculator/plan-b-iso-roof.png"), 170,
@@ -725,9 +720,11 @@ def blocks():
"Duplex system 1 (two HRP 12 presses with their extruders) and the Classic; the dashed "
"outlines are the free Duplex bays and Classic positions for growth. In the yard, boiler "
"modules B-1 and B-2 and chillers CH-1 and CH-2, with B-3, B-4, CH-3 and CH-4 free",
"Duplex systems 1 and 2 (four HRP 12 presses with their extruders) and the Classic; the "
"dashed outlines are the free Duplex bays and Classic positions. In the yard, boiler modules "
"B-1 and B-2 (B-3 and B-4 free) and chillers CH-1 to CH-3 (CH-4 free)") +
"Duplex system 1 (two HRP 12 presses with their extruders) and the Classic, in a hall laid "
"out for five Duplex bays and four Classic positions; the dashed outlines are the free bays "
"and positions for growth. In the yard, boiler modules B-1 and B-2 and chillers CH-1 and "
"CH-2, with B-3, B-4, CH-3 and CH-4 free; the 5 t crane over the hall, the visitor corridor "
"and the cassette and CD-R rooms are in place") +
". Schematic, estimates."),
H3("Crane, workshop and visitor corridor"),
B(pick([
@@ -780,14 +777,14 @@ def blocks():
"dB(A) near the presses down to roughly 40 to 50 dB(A) (estimates), so a guide talks without a "
"headset and visitors need no PPE; a 1:12 accessible ramp serves the entrance. Tours for "
"artists, labels, investors and schools can run several times a day without stopping "
"production.",
"production, and the tour route and the Payap programmes start with the plant.",
])),
H3("Utility yard and water-treatment building"),
T(["Detached utility yard (decided October 2026)", "Size (estimate)"], [
["Boiler hall, four 500 kg/h module positions (B-1 and B-2 at launch)", "~162 m² (18 × 9 m), "
"6.0 m high"],
["Biomass fuel store", "42 m²"],
["Chiller compound, open and screened, four pads (" + pick("CH-1 and CH-2", "CH-1 to CH-3") +
["Chiller compound, open and screened, four pads (CH-1 and CH-2"
" at launch)", "~135 m² (12.5 × "
"10.8 m)"],
["Cooling pump and heat-exchanger room", "~40 m² (8 × 5 m)"],
@@ -827,12 +824,9 @@ def blocks():
"or where a CD replication line would go if that option is chosen (section 4.10). **The press "
"hall** is planned for Duplex systems, because the plant focuses on special pressings and "
"specials run only on the Duplex: five Duplex bays and four Classic positions (~73/27 by floor, "
"estimate). " + pick(
"This plan installs one Duplex system and one Classic; growth adds Duplex systems first, into "
"bays whose floor, utility positions and ring-main tees are kept from the start. Where the "
"second Duplex system would stand on the Mueang Chi footprint is not drawn yet; ",
"This plan installs two Duplex systems and one Classic at launch; growth adds Duplex systems "
"first. Where the second Duplex system stands on the Mueang Chi footprint is not drawn yet; ") +
"estimate). This plan installs one Duplex system and one Classic; growth adds Duplex systems "
"first, into bays whose floor, utility positions and ring-main tees are kept from the start. "
"Where the second Duplex system would stand on the Mueang Chi footprint is not drawn yet; "
"the Payap scenario model draws the five-press fleet."),
H3("What the construction RFQ asks"),
P("The budget-level construction RFQ, with quantities from the parametric model, asks contractors "
@@ -938,8 +932,8 @@ def blocks():
"exempt from VAT at import (Revenue Department answer on BOI's FAQ, checked October 2026). The "
"investment blocks assume promotion: without it, ~5% duty on ~2.3M USD of imported machinery "
"(~0.11M USD) plus ~0.17M USD of import VAT, reclaimed only later (estimates for the " +
pick("full equipment list; this plan imports less at first",
"three-press equipment list; the second Duplex system adds to both") + ")."],
pick("full equipment list; this plan imports less at first", "full equipment list") +
")."],
["100% foreign ownership and land privileges", "Overrides Foreign Business Act restrictions "
"for the promoted activity. The land-ownership privilege is unused under the lease strategy."],
["Visas and work permits via the One Stop Service", "Foreign commissioning engineers and the "
@@ -971,7 +965,7 @@ def blocks():
P("**Process:** file via the e-Investment system and present at an analyst meeting. BOI quotes "
"about 40 working days to a decision for projects under THB 200M and 60 to 90 working days for "
"larger tiers; at " + pick("~127M to 226M THB with the ramp-up reserve (~177M at the midpoint)",
"~162M to 286M THB with the ramp-up reserve (~224M at the midpoint)") +
"~150M to 268M THB with the ramp-up reserve (~209M at the midpoint)") +
" the plan sits around that line, so the consultant "
"confirms which applies. In practice it is roughly 4 to 6 months end to end to the certificate; "
"the company is incorporated under it; machinery is imported within a window commonly 30 months "
+261 -310
View File
@@ -1,10 +1,11 @@
"""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)".
six cost levers, three presses) and Plan B (~210M THB, the same launch plant and three presses with
everything in, none of the levers taken; re-defined by the user on 17 October 2026). In both the second
Duplex system is a growth step from revenue. 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 ~210M 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()).
"""
@@ -24,10 +25,6 @@ def _block_rows():
"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**"],
@@ -48,8 +45,8 @@ def _block_rows():
"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"]),
"station", "350k to 810k", "11.6M to 26.7M", "Estimate; all of it at launch (Plan A buys the laser "
"confocal and the wide-area profiler from revenue)"]),
["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 "
@@ -58,10 +55,9 @@ def _block_rows():
"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"]),
"backbone for four modules (plate heat exchanger, tanks, pumps, mains), two 250 kW chiller "
"modules (CH-1, CH-2), screw compressor, dryer and receiver", "296k to 470k", "9.8M to 15.5M",
"Researched: utilities rows; boilers and compressor from Thai suppliers, with local service"]),
["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"],
]
@@ -89,16 +85,10 @@ def _block_rows():
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"]),
["Freight, installation, commissioning, training (Pheenix, Sibert, Sillitoe, Newbilt beyond its "
"quoted 5 days)", "150k to 300k", "5.0M to 9.9M", "Estimate"],
["Working capital, PVC stock, spares, lease deposit, first-year rent", "137k to 293k",
"4.5M to 9.7M", "Estimate; 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 "
@@ -107,17 +97,17 @@ def _block_rows():
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)**"]),
["**Subtotal, plan investment**", "**~4.24M to 7.50M**", "**~140.0M to 247.6M**",
"**Midpoint ~193.8M THB (~5.87M 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**"]),
["**Plan B price**", "**~4.55M to 8.11M**", "**~150M to 268M**",
"**Midpoint ~209M THB (~6.33M USD): ~210M 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")],
"For information: at 15 %, ~29M THB at the midpoint")],
]
return rows
@@ -154,56 +144,60 @@ def _levers_table():
"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)**"],
def _keeps_table():
"""Plan B: what it keeps that Plan A's six levers move off the launch budget, midpoints, no contingency."""
return T(["In at launch in Plan B", "What it gives the plant", "THB, midpoint (Plan A's lever)"], [
["Rooftop PV and the 271 kWh battery, owned (EPC and Gobel battery)", "The BOI solar measure (only an "
"owned array qualifies; our reading, for the BOI consultant) and no PPA power bill", "~10.7M"],
["Metrology, full stack: XRF, laser confocal, wide-area profiler, inline vision, audio station",
"Every stamper measured fully from the first release, the core of the traceability pitch", "~8.8M"],
["Visitor corridor and accessible entrance", "Public tours and the Payap programmes possible from the "
"start", "~3.6M"],
["Cassette and CD-R duplication", "Both formats sold from launch", "~4.0M"],
["5 t overhead crane, runway, frame premium, machine door, bought", "Its own crane over the press "
"hall; no mobile crane to rent for "
"the installations", "~3.2M"],
["Boilers and compressor from Thai suppliers", "Local service; no import route for the boilers",
"~1.9M"],
["**Together**", "", "**~32M (193.8M minus Plan A's 161.7M)**"],
["Launch plant, every block, no contingency: Plan B's subtotal", "", "~193.8M (~5.87M 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'.")
["**Plan B**", "", "**~209M THB (~6.33M USD)**; ~150M to 268M from the low to the high end"],
], widths_mm=[62, 70, 38], font_pt=8.5,
caption="Midpoint values without contingency, estimates; docs/finance/total-investment.md 'Two plans'. "
"Each figure is what the matching Plan A lever saves; rounded, the six add to ~32.2M, and the "
"two subtotals differ by ~32.1M.")
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"),
["1", "BOI certificate issued; lease signed; zoning and soil confirmed; pricing 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)")],
"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 from Thai suppliers)"),
pick("20 to 30 % (~32M to 49M)", "20 to 30 % (~39M to 58M)")],
["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)")],
"Construction, water-treatment building, utility yard, utilities, balance payments as machines are "
"built",
pick("35 to 45 % (~57M to 73M)", "35 to 45 % (~68M to 87M)")],
["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)")],
pick("15 to 20 % (~24M to 32M)", "15 to 20 % (~29M to 39M)")],
["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")],
"on", pick("8 to 12 % (~13M to 19M), plus the reserve", "8 to 12 % (~16M to 23M), 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 "
"Shares of Plan B's investment before the reserve (~193.8M THB at the midpoint); the THB "
"figures are the shares applied to it (arithmetic, estimates)."))
@@ -228,20 +222,20 @@ def _operating_table():
]
else:
rows = [
["Records", "1.0M", "1.25M", "1.5M"],
["Records", "0.58M", "0.74M", "0.90M"],
["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**"],
["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.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"],
["**EBITDA**", "**0.23M**", "**1.73M**", "**3.79M**"],
["Depreciation", "0.75M", "0.47M", "0.28M"],
["**Operating profit**", "**-0.52M**", "**1.26M**", "**3.51M**"],
["Revenue", "2.28M (~75M THB)", "3.65M (~120M THB)", "5.41M (~179M THB)"],
["Payback on the plan price (EBITDA, mature year)", "~35 yr", "~3.7 yr (2.6 to 4.7 on 4.55M to "
"8.11M)", "~1.2 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 "
@@ -257,23 +251,12 @@ def _risk_rows():
"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"),
"Quotes landing high are not covered: at 15 % a contingency would be ~29M THB at the midpoint, "
"and the high end of every block comes to ~268M 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"],
@@ -281,19 +264,14 @@ def _risk_rows():
"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"),
"The cost structure is mostly fixed; the adverse case loses money: it needs ~1.1M 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"),
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")],
"Central breaks even at ~0.23M records; commission in sequence; the second Duplex waits for "
"demand; 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 "
@@ -302,13 +280,9 @@ def _risk_rows():
["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"),
["High", "Prices not on file: the Classic and the Pheenix line",
"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",
"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",
@@ -324,6 +298,16 @@ def _risk_rows():
"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"])
else:
rows.append(["Medium", "The extra ~32M THB earns nothing in the model", "Plan B's operating picture is "
"Plan A's (same presses, records, revenue and EBITDA): the ~32M THB more at launch adds "
"depreciation, so central operating profit is 1.26M against 1.34M USD, payback ~3.7 against "
"~3.1 years and the adverse corner deeper; its case rests on what the table leaves out (the "
"BOI solar measure, cassette and CD-R sales, tours and the Payap programmes, full stamper "
"metrology for the traceability pitch)", "Phase 0 prices each item against its lever (PPA "
"offer next to the purchase quote, the BOI consultant's reading of the solar measure, "
"cassette and CD-R quotes); most items can also come later from revenue, as in Plan A, while "
"the solar measure and the corridor are cheaper to have from the start"])
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 "
@@ -347,11 +331,8 @@ def _risk_rows():
"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"),
["Medium", "Single press vendor (Newbilt)", "All three presses, the extruders and the hydraulic "
"aggregates come from one small German manufacturer; build time and order book unknown",
"Spares and service terms in the re-quote; the Pheenix automatic press stays the comparison if the "
"Classic quote disappoints"],
["Medium", "Hydraulic ring-main contamination", "One shared oil system: a contamination event "
@@ -402,9 +383,10 @@ def blocks():
"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. ") +
"This chapter prices **Plan B (~210M 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, with everything in: none of Plan A's six cost "
"levers taken. ") +
"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 "
@@ -424,10 +406,10 @@ def blocks():
"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.")),
"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.")),
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 "
"for quotes landing high; at 15 % it would be " + pick("~24M", "~29M") + " 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 "
@@ -437,33 +419,34 @@ def blocks():
"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.")),
". Plan B is the launch plant that estimate was made for.")),
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):"),
"the launch plant and brings it to ~180M THB with six cost levers; **Plan B** builds the same "
"launch plant with everything in, none of the levers taken, at ~210M THB, within 180M plus 20 %. "
"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"],
"~209M THB (~6.33M USD): ~210M"],
["Low to high end of every block", "~127M to 226M THB", "~150M to 268M THB"],
["Presses", "3: Duplex system 1 (two HRP 12) and one Classic", "The same 3"],
["Records a year at 60 % specials", "~0.58 to 0.90M, central 0.74M (Duplex-limited)", "The same"],
["Revenue, central", "3.65M USD (~120M THB)", "The same (cassette and CD-R not modelled)"],
["EBITDA, central", "1.73M USD", "1.73M USD (calculator: 2.07M against Plan A's 2.04M, no PPA "
"power bill)"],
["Operating profit, adverse case", "-0.39M USD: loses money", "-0.52M USD: loses more (more "
"depreciation on the same EBITDA)"],
["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)"],
"~3.7 yr (2.6 to 4.7; calculator: 2.8 yr against Plan A's 2.4)"],
["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"],
"rented crane, Chinese boilers and compressor; the second Duplex waits for revenue", "No levers: "
"buys at launch what Plan A leases or defers, ~32M THB more (owned solar and battery with the BOI "
"solar measure, the full metrology stack, the visitor corridor, cassette and CD-R, a bought crane, "
"Thai boilers and compressor); the second Duplex waits for revenue"],
], 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."),
@@ -471,30 +454,33 @@ def blocks():
[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.")]
P("Plan B takes none of these levers: it buys at launch what they lease or defer, ~32M THB more "
"at the midpoint, so ~193.8M THB before the reserve and ~209M (~210M THB) 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.")]
[P("**Plan B: the launch plant with everything in, no levers.** What Plan B keeps that Plan A's six "
"cost levers lease, defer or source abroad, midpoint values:"),
_keeps_table(),
P("The plant itself is Plan A's: the same three presses, the same output and the same operating "
"picture (section 9). The second Duplex system is a growth step from revenue in both plans, on a "
"reserved floor bay with its utility module positions and ring-main tees.")]
),
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.",
"**No longer demand.** Both plans are the same three presses making the same ~0.58 to 0.90 million "
"records a year (central 0.74 million); market validation (section 14.1, item 1) gates both alike.",
"**~32M THB more at launch, for what Plan A leases or buys from revenue.** Plan B keeps the BOI "
"solar measure (only an owned array qualifies), measures every stamper fully from the first release "
"(the traceability pitch), opens tours and the Payap programmes from day one, sells cassette and "
"CD-R from the start, owns its crane and buys utilities with local service.",
"**On the modelled numbers the extra earns nothing.** The same EBITDA, more depreciation, a longer "
"payback (~3.7 against ~3.1 years) and a deeper adverse corner: Plan A has the better modelled "
"return, Plan B the more complete plant. Most of Plan B's items can be added to Plan A later from "
"revenue; the BOI solar measure and the corridor are cheaper to have from the start.",
"**The quotes.** The Newbilt re-quote for the Classic and the EX 35, 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."),
"**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.",
]),
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."),
@@ -502,8 +488,8 @@ def blocks():
"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") +
"Plan B preset: 193.8M THB at the midpoint without contingency, 203.8M to 213.8M with the "
"ramp-up reserve of 10M to 20M, 16.2M to spare under the 225M mark (180M plus 25 %)") +
". 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."),
@@ -514,17 +500,14 @@ def blocks():
"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. ") +
"Plan B's ~209M THB is the midpoint of every block with the ramp-up reserve and no buffer: at "
"15 % a contingency would add ~29M THB, and the high end of every block comes to ~268M. ") +
"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 "
@@ -534,10 +517,10 @@ def blocks():
"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."),
"the EX 35 is priced only 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, the metrology distributor quotes and the solar and battery purchase 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 "
@@ -572,24 +555,19 @@ def blocks():
"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).")),
"to 35k on the Duplex line alone; with the Classic and the galvanics line also in EUR, the three EUR "
"lines come to ~0.96M to 1.28M USD, so the same move is worth roughly USD 0.10M to 0.13M "
"(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. ") +
"any operational change, enough to push the adverse case further under water. "
"Three mitigations are planned: every re-quote states its currency and validity period; decide early "
"whether to quote regional customers in THB; and decide, once the BOI timeline is known, whether to "
"hedge the EUR orders. The hedging decision belongs to the investor."),
# ------------------------------------- 9 revenue and operating model
H1("9. Revenue and operating model"),
P("A first-pass economic model of " + pick("Plan A's three presses", "Plan B's five presses") + " in a "
P("A first-pass economic model of " + pick("Plan A's three presses", "Plan B's three 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 "
@@ -621,8 +599,8 @@ def blocks():
"**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)") +
"tests 1,500. " + pick("Plan A models 200 to 400 titles a year", "Plan B models 200 to 400 titles "
"a year") +
"; 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 "
@@ -637,7 +615,7 @@ def blocks():
]),
H2(pick("9.2 Capacity and revenue of Plan A", "9.2 Capacity and revenue of Plan B")),
P(pick(
P(
"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 "
@@ -645,30 +623,15 @@ def blocks():
"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([
"The central case takes the middle, 0.74 million."),
T(["USD per year", "Adverse", "Central", "Favourable"], [
["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],
], 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."),
@@ -685,8 +648,8 @@ def blocks():
["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)"]),
["Production labour, Plan B", "**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, as in Plan A"]),
["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"],
@@ -694,7 +657,7 @@ def blocks():
["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 "
["**Total direct cost, Plan B**", "**~1.35 to 2.70**", "**~45 to 89**", "Central 2.00; 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."),
@@ -705,12 +668,12 @@ def blocks():
"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:")),
"**Labour per record.** Two shifts need the full press, finishing, galvanics, QC and maintenance "
"crews whatever the press count, so the direct payroll stays at 3.7M to 5.4M THB a year (113k to "
"163k USD), and Plan B spreads it over the same 0.58 to 0.90 million records as Plan A: **0.13 / "
"0.19 / 0.28 USD** a record (favourable / central / adverse), and a direct cost of 1.35 / 2.00 / "
"2.70 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"],
@@ -733,9 +696,9 @@ def blocks():
"(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 "
"the high end (7.50M USD) over 10 years (adverse), the midpoint (5.87M USD) over 12.5 years "
"(central) and the low end (4.24M USD) over 15 years (favourable). Payback is counted on the "
"whole plan price including the ramp-up reserve (4.55M / 6.33M / 8.11M USD from the low to the "
"high end).")),
_operating_table(),
CALL("Reading this table honestly", pick([
@@ -764,39 +727,41 @@ def blocks():
"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 central case works on ~209M THB.** EBITDA ~1.73M USD (~57M THB) and operating profit ~1.26M "
"USD (~42M THB) a year once the plant runs at volume. It breaks even on operating profit at about "
"**0.23 million records a year, about a third 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 ~1.1 million records to cover depreciation, and "
"the three presses make 0.58 million at that rate; the operating loss is ~17M THB a year. 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.8 USD (~91 THB) a record (arithmetic on "
"the table), below the low price assumed: price realisation and utilisation decide solvency, not "
"upside.",
"**What the extra ~32M THB buys is not in this table.** Plan B is Plan A's plant with the six levers "
"not taken, so revenue, direct cost and EBITDA are Plan A's; only the depreciation (0.47M against "
"Plan A's 0.39M USD at the centre) and the payback (~3.7 against ~3.1 years) move. Not modelled: "
"cassette and CD-R revenue, tour and Payap revenue, stamper supply to other plants, and the tax "
"benefit of the BOI solar measure.",
"**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 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 "
"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.07M USD, "
"payback 2.8 years on the 193.8M 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 ~4.3, ~21 % IRR and an NPV "
"of ~4.1M USD over ten years, pre-tax and pre-financing (estimates). Its EBITDA is 0.03M above "
"Plan A's 2.04M because the owned array carries no PPA power price. 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 %") +
"Plan B preset: cash payback in year ~4.3, IRR ~21 %, NPV ~4.1M 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 "
@@ -812,41 +777,41 @@ def blocks():
"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.")),
"first the cutting room and galvanics (the presses need their stampers), then the Duplex system, "
"then the Classic, with the cassette and CD-R lines alongside. 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, the same as in Plan A) is there to carry staff hired before first "
"revenue and overheads until volume covers them. Fan-funded campaigns on the artist platform open "
"only after the first releases have shipped and lead times are measured.")),
P("**A year-by-year cash model for the ramp is a next step, not a claim this plan makes.** It belongs "
"to the financing discussion and needs the vendor build times and the commissioning calendar "
"(section 10) first" + 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.")),
"(section 10) first. The calculator's 35, 70 and 90 % ramp in section 9.4 is a planning assumption, "
"not that model."),
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).")),
"extra records it comes to ~15.4M THB at the midpoint (estimate). 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.",
"**The growth option, the same as in Plan A.** A second Duplex system (two more semi-automatic "
"presses) adds roughly **+0.4 to 0.6 million records** a year at 60 % specials, 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 a third chiller module (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 (estimate). The floor bay, the module positions in the boiler "
"hall and chiller compound (built for four modules each; the launch plant fills two of each), and "
"the ring-main tees are reserved for it, so it is a revenue-funded step, not a rebuild. Beyond it, "
"the hall is laid out for five Duplex bays and four Classic positions, and growth adds Duplex "
"systems first, then Classics.")),
# ----------------------------------------------- 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 "
"has not yet been re-drawn for the launch plant; nothing in phase 0 has started, so it shifts day for day with the BOI consultant engagement. On "
"that calendar, **first paying release lands around Q4 2028 to mid-2029, roughly 27 to 33 months "
"from the start of phase 0.** This plan quotes that as the working figure, not as a re-based date "
"(the executive summary marks it open), and flags the new risk to it: the launch plant puts the "
@@ -868,10 +833,6 @@ def blocks():
"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"],
@@ -917,7 +878,7 @@ def blocks():
"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 "
@@ -939,10 +900,10 @@ def blocks():
"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.")),
"Plan B's plant, the launch plant with everything in, and only 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, "
["0. Validate and clear the gates (now)", "Market validation with regional labels and distributors"
"; BOI consultant, activity code, "
"application; lease terms, zoning, soil test; 60 rai title check; re-quotes and quotes from every "
"launch vendor (section 14.1)", "Runs in parallel; gates everything"],
["1. Quotes and site (during the BOI window)", "Firm quotes with build times; site selection "
@@ -952,9 +913,8 @@ def blocks():
"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")],
"Newbilt Duplex and Classic, first two boiler and chiller modules (boilers and compressor "
"from Thai suppliers)"), "BOI certificate and validated pricing"],
["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 "
@@ -971,9 +931,9 @@ def blocks():
"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"),
"Second Duplex system, then further Duplex systems and 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"),
@@ -982,18 +942,15 @@ def blocks():
"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)"),
["2", "Newbilt Duplex system (two HRP 12, EX 50 and EX 35), with the steam and cooling plant "
"(boiler modules B-1, B-2; chiller modules CH-1, CH-2)",
"The semi-automatic presses suit the colour, splatter and boutique runs that carry the premiums, "
"and they teach the crews the process"],
["3", "Newbilt Classic, fully automatic", "Volume runs once the metal path and the press process "
"are stable"],
*([] 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"]]),
["Alongside", "Cassette and CD-R duplication lines", "Independent of the metal path and the "
"presses; short lead times"]]),
], 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, "
@@ -1026,7 +983,7 @@ def blocks():
"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), "
"**More capital up front.** ~150M to 268M THB in one round (~209M 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 "
@@ -1034,18 +991,18 @@ def blocks():
"**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."]),
["**Everything in at launch.** Owned solar with the BOI solar measure, the full metrology stack "
"from the first release, tours and the Payap programmes from day one, cassette and CD-R, its "
"own crane and locally serviced utilities; the second Duplex waits for demand and revenue on a "
"reserved floor.",
"**~32M THB more that the model does not repay.** The same EBITDA as Plan A with more "
"depreciation and a longer payback (~3.7 against ~3.1 years); the adverse case still loses "
"money."]),
], 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.")),
"so that nothing is ordered before the BOI certificate and validated pricing."),
# --------------------------------------- 12 team, ownership, governance
H1("12. Team, ownership and governance"),
@@ -1077,8 +1034,7 @@ def blocks():
"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.") +
"plus 1 to 2 for the cassette and CD-R lines from launch.") +
" 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 "
@@ -1093,11 +1049,10 @@ def blocks():
"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") +
"~44M THB of Plan A's ~177M", "~52M THB of Plan B's ~209M") +
" (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 "
"tranche releases, the growth options such as a second Duplex, CD replication), pre-emption and transfer, information rights, and the founders' roles and "
"remuneration.",
"**Related-party discipline.** Ploy Printing will be both a shareholder and the plant's main "
"packaging supplier. The supply agreement is priced at arm's length, benchmarked periodically "
@@ -1114,7 +1069,7 @@ def blocks():
"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.")),
", and Plan B's extra launch capital 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: "
@@ -1128,11 +1083,9 @@ def blocks():
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")],
"price at 60 % specials, run sizes, and whether faster turnaround earns a premium; publish the "
"artist platform's calculator early with indicative prices and an interest list", "Simona, "
"Alexander", "Travel", "Pricing risk"],
["2", "Engage a BOI-registered consultant: activity sub-code; the order-before-certificate question "
"first; galvanics, cassette and CD-R in the application; CD replication decision; " + pick(
"how the solar PPA affects the solar measure; ", "") + "Payap R&D", "Simona", "USD 5k to 15k",
@@ -1142,9 +1095,7 @@ def blocks():
"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 "
["5", "Newbilt re-quote: Duplex (EX 50 and EX 35) and Classic, with build time, order-book position, PLC data access, central hydraulic supply "
"and written hydraulic requirements, currency and validity", "Alexander", "Free",
"Classic and EX 35 price, schedule"],
["6", "Pheenix quote for the galvanics line (PASU, PPPU, PDPU, PMPB) with lead time and training; "
@@ -1197,39 +1148,40 @@ def blocks():
"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 "
"A commitment in principle to **Plan B at ~210M THB** (~209M 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.")],
"with the financing mix set to hold debt-to-equity at or below 3:1 (equity of at least ~52M "
"THB). Told plainly: the price carries no contingency (at 15 % it would be ~29M THB more at "
"the midpoint), and from the low to the high end of every block the plan comes to ~150M to "
"268M THB. The Newbilt re-quote, the Pheenix quote, the building quote with the soil test, "
"the metrology quotes and the solar and battery purchase 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 "
"The equity and debt mix, and how quotes landing above the plan price are funded; the ~32M "
"THB of items Plan A leases or defers (owned solar with the BOI solar measure, the full "
"metrology stack, the visitor corridor, cassette and CD-R, the bought crane, Thai boilers and "
"compressor), each weighed against its lever; 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 "
"~15.4M THB at the midpoint with its chiller module, freight and working capital, estimate), "
"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.")],
"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, estimate), "
"then further Duplex systems and 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 BOI consultant's reading of the solar measure on the owned array; ") +
"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 "
@@ -1248,10 +1200,9 @@ def blocks():
["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"],
"block; 'Two plans': Plan A at ~180M and Plan B at ~210M THB, "
"the six levers 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"],
+2 -2
View File
@@ -1,7 +1,7 @@
"""Which version of the business plan is being built (October 2026).
Plan A, ~180M THB: the launch plant (1 Duplex system + 1 Classic, every machine) with six cost levers.
Plan B, ~225M THB: five presses (the second Duplex system at launch), everything in.
Plan B, ~210M THB: the same launch plant with everything in (none of the six levers).
Both are priced without contingency and with the ramp-up reserve
(docs/finance/total-investment.md, "Two plans").
@@ -11,7 +11,7 @@ helpers inside blocks(), never at import time.
PLAN = "A"
NAME = {"A": "Plan A", "B": "Plan B"}
PRICE = {"A": "~180M THB", "B": "~225M THB"}
PRICE = {"A": "~180M THB", "B": "~210M THB"}
def is_a() -> bool:
+42 -50
View File
@@ -669,44 +669,38 @@ What it says:
## Operating pictures of Plan A and Plan B (October 2026)
The business plan comes in two versions
([total investment](total-investment.md#two-plans-a-at-180m-thb-and-b-at-225m-thb-october-2026)):
**Plan A** (~177M THB, the launch plant with six cost levers, three
presses) and **Plan B** (~224M THB, the second Duplex at launch, five
presses), both priced without contingency and with the ramp-up reserve.
Same method and cases as above, at the planned 60 % specials (estimates):
([total investment](total-investment.md#two-plans-a-at-180m-thb-and-b-at-210m-thb-october-2026)):
**Plan A** (~177M THB, the launch plant with six cost levers) and
**Plan B** (~209M THB, the same launch plant with everything in), both
priced without contingency and with the ramp-up reserve. Both run the
same three presses, so volume, price, direct cost, title services and
overheads are those of the launch-plant table above; only the
depreciation follows each plan's capital (estimates):
- **Plan A** runs the launch plant, so volume, price, direct cost, title
services and overheads are those of the table above; only the
depreciation follows its lower capital: the high end of Plan A's blocks
(6.25M USD) over 10 years, the midpoint (4.90M USD) over 12.5, the low
end (3.56M USD) over 15. The solar PPA adds its power price to the
energy line (~0.03M USD a year in the calculator), not shown here.
- **Plan B**'s five presses are not Duplex-limited at 60 % specials: the
four semi-automatic presses (240 to 320 records an hour) carry the
specials and the Classic the rest, so volume is the five-press band,
**1.0 / 1.25 / 1.5M** records. Direct cost per record is the five-press
table's 2.58 / 1.94 / 1.30 USD (the same payroll over more records);
title services 300 / 375 / 400 titles at 580 / 1,155 / 1,730 USD and 60
/ 65 / 70 % contribution (the five-press table's 0.10 / 0.28 / 0.48M);
depreciation on Plan B's blocks: 8.07M USD over 10 years, 6.34M over
12.5, 4.61M over 15.
- **Plan A**: the high end of its blocks (6.25M USD) over 10 years, the
midpoint (4.90M USD) over 12.5, the low end (3.56M USD) over 15. The
solar PPA adds its power price to the energy line (~0.03M USD a year in
the calculator), not shown here.
- **Plan B**: 7.50M USD over 10 years, 5.87M over 12.5, 4.24M over 15.
Its owned solar saves the PPA power bill; cassette and CD-R sales, tours
and the Payap programmes it opens from the start are not modelled.
- **Payback** is counted on the whole plan price including the ramp-up
reserve (Plan A 3.86M / 5.35M / 6.85M USD, Plan B 4.92M / 6.79M /
8.67M USD from the low to the high end).
reserve (Plan A 3.86M / 5.35M / 6.85M USD, Plan B 4.55M / 6.33M /
8.11M USD from the low to the high end).
| USD/yr | A adverse | A central | A favourable | B adverse | B central | B favourable |
|---|---|---|---|---|---|---|
| Records | 0.58M | 0.74M | 0.90M | 1.0M | 1.25M | 1.5M |
| Records | 0.58M | 0.74M | 0.90M | 0.58M | 0.74M | 0.90M |
| Blended price (60 % specials) | 3.76 | 4.49 | 5.27 | 3.76 | 4.49 | 5.27 |
| Direct cost | 2.70 | 2.00 | 1.35 | 2.58 | 1.94 | 1.30 |
| Pressing contribution | 0.61M | 1.83M | 3.51M | 1.18M | 3.19M | 5.96M |
| Title-services contribution | 0.07M | 0.23M | 0.48M | 0.10M | 0.28M | 0.48M |
| Direct cost | 2.70 | 2.00 | 1.35 | 2.70 | 2.00 | 1.35 |
| Pressing contribution | 0.61M | 1.83M | 3.51M | 0.61M | 1.83M | 3.51M |
| Title-services contribution | 0.07M | 0.23M | 0.48M | 0.07M | 0.23M | 0.48M |
| Cash overheads | 0.45M | 0.33M | 0.20M | 0.45M | 0.33M | 0.20M |
| **EBITDA** | **0.23M** | **1.73M** | **3.79M** | **0.83M** | **3.14M** | **6.24M** |
| Depreciation | 0.62M | 0.39M | 0.24M | 0.81M | 0.51M | 0.31M |
| **Operating profit** | **-0.39M** | **1.34M** | **3.55M** | **0.02M** | **2.63M** | **5.93M** |
| Revenue | 2.28M (~75M THB) | 3.65M (~120M THB) | 5.41M (~179M THB) | 3.93M (~130M THB) | 6.05M (~200M THB) | 8.60M (~284M THB) |
| Payback on the plan price (EBITDA, mature year) | ~30 yr | ~3.1 yr (2.2 to 4.0) | ~1.0 yr | ~10.5 yr | ~2.2 yr (1.6 to 2.8) | ~0.8 yr |
| **EBITDA** | **0.23M** | **1.73M** | **3.79M** | **0.23M** | **1.73M** | **3.79M** |
| Depreciation | 0.62M | 0.39M | 0.24M | 0.75M | 0.47M | 0.28M |
| **Operating profit** | **-0.39M** | **1.34M** | **3.55M** | **-0.52M** | **1.26M** | **3.51M** |
| Revenue | 2.28M (~75M THB) | 3.65M (~120M THB) | 5.41M (~179M THB) | 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) | ~1.0 yr | ~35 yr | ~3.7 yr (2.6 to 4.7) | ~1.2 yr |
What it says:
@@ -714,29 +708,27 @@ What it says:
year**; its adverse corner still loses money, because it would need
~0.9 million records to cover depreciation and the three presses make
0.58 million at that rate.
- **Plan B** breaks even at ~0.22 million records and its adverse corner
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. Its central EBITDA is ~1.8 times Plan A's for ~27 %
more money.
- **But Plan B only earns this 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 Plan A; nothing in the market data
so far shows that demand (roadmap item 1). The ramp to that volume is
longer, and the ramp-up reserve (10M to 20M THB) is the same estimate
as for Plan A.
- **The caveats above hold for both:** central EBITDA margins of ~47 %
(A) and ~52 % (B) are far above the 15 to 25 % pressing plants earn,
the cost of specials is not in the direct cost yet, and neither plan
carries a contingency. Treat the adverse columns as the honest ones.
- **Plan B** breaks even at **~0.23 million records**, and its adverse
corner loses more (~1.1 million records needed to cover depreciation).
At the central cost and volume the price that covers its depreciation
is ~2.8 USD (~91 THB) a record.
- **On these numbers Plan B's extra ~32M THB earns nothing**: the same
EBITDA, more depreciation and a longer payback. Its case rests on what
the table leaves out: the BOI solar measure on the owned array, the
PPA power bill it avoids, full stamper metrology from the first
release, tours, the Payap programmes, and cassette and CD-R sales.
- **The caveats above hold for both:** a central EBITDA margin of ~47 %
is far above the 15 to 25 % pressing plants earn, the cost of specials
is not in the direct cost yet, and neither plan carries a contingency.
Treat the adverse columns as the honest ones.
The [calculator](../fleet-calculator.html) presets, at the team's
planning rates (3 records a minute per Duplex system) and its own cost
build-up, give: **Plan A** at 850k records EBITDA 2.04M USD, payback 2.4
build-up, give at 850k records: **Plan A** EBITDA 2.04M USD, payback 2.4
years on the investment, cash payback in year ~3.9 and ~25 % IRR over ten
years with the reserve in year 0; **Plan B** at 1.25M records EBITDA
3.25M USD, payback 2.0 years, cash payback in year ~3.3 and ~32 % IRR
(pre-tax, pre-financing, estimates).
years with the reserve in year 0; **Plan B** EBITDA 2.07M USD, payback 2.8
years, cash payback in year ~4.3 and ~21 % IRR (pre-tax, pre-financing,
estimates).
## Operating picture at full capacity (five-press fleet)
+37 -26
View File
@@ -78,7 +78,7 @@ import VAT paid at the border and reclaimed later (estimates).
### The investor's question: 180M THB, maybe 20 % more (October 2026)
*Superseded by [Two plans](#two-plans-a-at-180m-thb-and-b-at-225m-thb-october-2026)
*Superseded by [Two plans](#two-plans-a-at-180m-thb-and-b-at-210m-thb-october-2026)
below. Written against the earlier Pheenix estimate (USD 320k to 650k,
total ~227M THB at the midpoint); its galvanics lever is now the base
price.*
@@ -131,7 +131,7 @@ building RFQ with a soil test, and distributor quotes for the metrology
stack. Until they are in, quote **~216M THB** to the investor as the
target with the levers above, and 180M as the low-quote case.
## Two plans: A at ~180M THB and B at ~225M THB (October 2026)
## Two plans: A at ~180M THB and B at ~210M THB (October 2026)
Decided (user, October 2026): the business plan comes in **two
versions** for the investor, built from the same documents:
@@ -139,8 +139,12 @@ versions** for the investor, built from the same documents:
- **Plan A, ~180M THB**: the launch plant with every machine decided
above (one Duplex system, one Classic, galvanics, Sibert, the cutting
room), brought down with six cost levers.
- **Plan B, ~225M THB (Plan A plus 25 %)**: the second Duplex system at
launch, so five presses, with everything in.
- **Plan B, ~210M THB**: the same launch plant, one Duplex system and
one Classic, with everything in: none of Plan A's six levers taken.
First drawn as five presses at ~225M THB (Plan A plus 25 %); re-defined
by the user on 17 October 2026 ("plan b should also only start with 1
duplex and 1 classic, but with all levers"). In both plans the second
Duplex system is a growth step from revenue.
Both are priced **without contingency** (user decision) and **with the
ramp-up reserve**, because the reserve is cash the investor puts in
@@ -159,24 +163,21 @@ reference plus 20 % in both. Midpoints, estimates:
| 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 |
| Plan B: five presses, everything in | USD | THB, midpoint |
| Plan B: the launch plant, everything in | USD | THB |
|---|---|---|
| Launch plant, every block, no contingency | 4.24M – 7.50M | ~193.8M |
| Second Duplex system: two HRP 12, EX 50 and EX 35 (calculator basis: two presses at the quoted ~115k per press and extruder set, plus hydraulic unit and EX 35; no EX 35 price on file) | 230k – 300k | +8.7M |
| Third chiller module, CH-3 (250 kW; the two boiler modules carry 750 to 900 kg/h) | 48k – 78k | +2.1M |
| Freight and installation for the extra machinery | 24k – 48k | +1.2M |
| Working capital for ~1.25M records a year instead of 0.85M | 64k – 139k | +3.4M |
| Subtotal | **4.61M – 8.07M** | **~209.2M (~6.34M USD)** |
| Launch plant, every block, no contingency (the six lever items included: owned solar and battery ~10.7M, full metrology ~8.8M, visitor corridor ~3.6M, cassette and CD-R ~4.0M, bought crane ~3.2M, Thai boilers and compressor ~1.9M, together ~32M THB at the midpoint) | 4.24M – 7.50M | ~140M – 248M, **~193.8M (~5.87M USD)** at the midpoint |
| Ramp-up reserve | | +10M to 20M |
| **Plan B** | | **~224M THB (~6.79M USD)**, ~162M to 286M from the low to the high end of every block |
| **Plan B** | | **~209M THB (~6.33M USD): ~210M**, ~150M to 268M from the low to the high end of every block |
Plan B keeps what Plan A gives up: owned solar and battery (and with
them the BOI solar measure), the full metrology stack, the visitor
corridor, the bought crane, cassette and CD-R, Thai-supplied utilities.
Its five presses make ~1.0 to 1.5 million records a year at the planned
60 % specials (the [scale](../scale.md#production-capacity) basis; not
Duplex-limited), against ~0.58 to 0.90 million for Plan A's three; the
operating pictures of both are in the
Plan B costs ~32M THB (~18 %) more than Plan A and, at the midpoint,
stays within the investor's 180M THB plus 20 % (its high end, ~268M, does
not). It keeps what Plan A leases or defers:
owned solar and battery (and with them the BOI solar measure), the full
metrology stack from the first release, the visitor corridor and tours
from the start, cassette and CD-R, the bought crane, Thai-supplied
utilities with local service. Both plans have the same three presses and
make the same ~0.58 to 0.90 million records a year at the planned 60 %
specials (Duplex-limited); the operating pictures are in the
[revenue model](revenue-model.md#operating-pictures-of-plan-a-and-plan-b-october-2026).
The [plant and business plan calculator](../fleet-calculator.html) has
both as presets.
@@ -185,17 +186,27 @@ both as presets.
- **Contingency.** The blocks are budgetary (plus or minus 30 to 50 % on
the estimates, top of this page), so the plans carry no buffer for
quotes landing high. At this page's 15 % that would be ~24M THB on
Plan A and ~31M on Plan B at the midpoint.
Plan A and ~29M on Plan B at the midpoint.
- The central hydraulic plant (not costed yet), the archive's mobile
shelving (to quote), CD replication, financing costs, currency moves,
and Thai duty and import VAT (the blocks assume BOI promotion).
**What decides between them:** demand. 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
(roadmap item 1) is the evidence for that. Plan A keeps the second Duplex
as a growth step from revenue, with its floor, utility positions and
ring-main tees reserved.
**What decides between them:** not demand, since both make the same
records, but whether the investor funds ~32M THB more at launch for what
Plan A leases or buys from revenue. On the modelled numbers Plan B's
extra earns nothing (same EBITDA, more depreciation, a longer payback);
its case rests on what the operating table leaves out: the BOI solar
measure (only an owned array qualifies), full stamper metrology for the
traceability pitch from the first release, tours and the Payap
programmes from day one, cassette and CD-R sales, and utilities with
local service. Most of Plan B's items can be added to Plan A later from
revenue; the solar measure and the corridor are cheaper to have from
the start. Both plans keep the second Duplex as a growth step, with its
floor, utility positions and ring-main tees reserved: ~15.4M THB at the
midpoint for the system (~8.7M), a third chiller module CH-3 (~2.1M),
their freight and installation (~1.2M) and the working capital for the
extra records (~3.4M), estimates on the calculator's basis, as first
priced for the five-press Plan B.
## Full vision, all blocks (July 2026, superseded)
+10 -9
View File
@@ -599,7 +599,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
presses, an EX 50 and an EX 35 colour extruder each) and Newbilt Classic
automatic presses, starting from the launch plant: one Duplex system and one
Classic. It builds the investment from the blocks in total-investment.md,
checks it against Plan A's 180M and Plan B's 225M THB, runs the P&L and a
checks it against 180M THB and 180M plus 25 % (Plan A ~180M, Plan B ~210M), runs the P&L and a
ten-year cash sketch, and lists what the plant needs: people, power, central
hydraulics, steam, cooling, compressed air, floor, compound and stampers.
Vendor figures are marked as such; the rest are planning figures and
@@ -610,7 +610,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
<span>Presets:</span>
<button type="button" data-p="launch">Launch plant (decided)</button>
<button type="button" data-p="planA">Plan A (~180M)</button>
<button type="button" data-p="planB">Plan B (~225M, five presses)</button>
<button type="button" data-p="planB">Plan B (~210M, all in)</button>
<button type="button" data-p="lean">Lean: bought stampers, outsourced cutting</button>
<button type="button" data-p="full">Full hall (5 D + 4 C)</button>
</div>
@@ -732,8 +732,9 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
<section class="card">
<h2>Budget: Plan A and Plan B</h2>
<p class="note" style="margin-top:0">Two plans for the investor (October 2026): Plan A at ~180M THB keeps every
machine of the launch plant with six cost levers, Plan B at ~225M THB (+25 %) launches with the second Duplex
system and everything in; both priced without contingency and with the ramp-up reserve. Bars: the investment
machine of the launch plant with six cost levers, Plan B at ~210M THB keeps the same launch plant (one Duplex system
and one Classic) with everything the levers cut; both priced without contingency and with the ramp-up reserve,
the second Duplex a growth step in both. Marks at 180M and 180M plus 25 % (225M). Bars: the investment
at the low end, the midpoint and the high end of every block (contingency as set under Plant configuration),
plus the ramp-up reserve when it is in the budget (hatched).</p>
<div class="kpis" id="budK"></div>
@@ -3051,7 +3052,7 @@ grp("Investment rules", [
["wcRef", "Records a year the working capital is sized for", 840000, "", "doc", "revenue-model.md launch plant, central volume"],
["wcMin", "Working capital never below", 60, "%", "est", "Estimate"],
["budgetLo", "Plan A budget", 180000000, "THB", "doc", "total-investment.md: Plan A, ~180M THB without contingency, ramp-up reserve included"],
["budgetHi", "Plan B budget, Plan A plus 25 %", 225000000, "THB", "doc", "total-investment.md: Plan B, ~225M THB (user, October 2026)"],
["budgetHi", "Upper budget mark, 180M plus 25 %", 225000000, "THB", "doc", "total-investment.md: the +25 % envelope set for Plan B (user, October 2026); Plan B is ~210M"],
]);
grp("Ten years of cash", [
["ramp1", "Sold output in year 1", 35, "% of the mature year", "est", "Estimate"],
@@ -3091,9 +3092,9 @@ const CFG0 = Object.fromEntries(CFGK.map(k => [k, S0[k]]));
const LAUNCH = { mode: "target", target: 850000, grow: "classic", dMin: 1, cMin: 1, dFleet: 1, cFleet: 1, ...CFG0 };
const PRESETS = {
launch: LAUNCH,
// Plan A (~180M THB) and Plan B (~225M THB): total-investment.md "Two plans", priced without contingency
// Plan A (~180M THB, six levers) and Plan B (~210M THB, the launch plant all in): total-investment.md "Two plans", priced without contingency
planA: { ...LAUNCH, solar: "ppa", metro: "launch", corridor: "later", cass: "off", cdr: "off", crane: "rent", sourcing: "china", cont: "sep" },
planB: { mode: "target", target: 1250000, grow: "classic", dMin: 2, cMin: 1, dFleet: 2, cFleet: 1, ...CFG0, cont: "sep" },
planB: { ...LAUNCH, cont: "sep" },
lean: { ...LAUNCH, galv: "bought", cut: "out" },
full: { mode: "fleet", dFleet: 5, cFleet: 4, ...CFG0 },
};
@@ -3709,7 +3710,7 @@ function renderInvest(e, r) {
H.push(`<tr class="grp"><td colspan="5">Totals</td></tr>`);
TR("Subtotal", cx.sub, "", true);
TR(cx.ctgIn ? `Contingency ${f1(A.contPct)} %` : `Contingency ${f1(A.contPct)} % (not in the total)`, cx.ctg, cx.ctgIn ? "total-investment.md" : "shown separately, as in Plan A and Plan B");
TR("Total investment", cx.tot, "for reference, total-investment.md: the launch plant ~161M to 285M THB with contingency (midpoint ~223M); Plan A ~162M and Plan B ~209M at the midpoint without it, plus the ramp-up reserve", true);
TR("Total investment", cx.tot, "for reference, total-investment.md: the launch plant ~161M to 285M THB with contingency (midpoint ~223M); Plan A ~162M and Plan B ~194M at the midpoint without it, plus the ramp-up reserve", true);
if (!cx.boiOn) {
TR(`Import duty without BOI, ${f1(A.dutyMach)} %`, cx.duty, `on ${money(cx.imp.lo)} to ${money(cx.imp.hi)} of imported machinery; import VAT ${money(cx.vat.mid)} at the midpoint, reclaimable`);
TR("Total with import duty", cx.all, "", true);
@@ -3743,7 +3744,7 @@ function renderBudget(e) {
`<div class="bgap">against ${M(B1)}: ${gap(tot, B1)} · against ${M(B2)}: ${gap(tot, B2)}</div>`;
}).join("");
const mid = V[1], mt = mid.cap + mid.res, rLo = cx.res.lo * fx, rHi = cx.res.hi * fx;
const tgt = mt <= B1 ? B1 : B2; // the tightest budget the midpoint fits (Plan A: 180M, Plan B: 225M)
const tgt = mt <= B1 ? B1 : B2; // the tightest budget the midpoint fits (Plan A: 180M, Plan B: the 225M mark)
$("budK").innerHTML = kpi(M(mid.cap) + " THB", `investment at the midpoint, ${cx.ctgIn ? "contingency included" : "without contingency"}`) +
kpi(`${M(mid.cap + rLo)} to ${M(mid.cap + rHi)}`, `THB with the ramp-up reserve (${M(rLo)} to ${M(rHi)})`) +
kpi(mt <= tgt ? M(tgt - mt) : "+" + M(mt - B2), `${mt <= tgt ? "to spare under" : "over"} ${M(tgt)} THB at the midpoint${inB ? ", reserve included" : ""}`);
Binary file not shown.

Before

Width:  |  Height:  |  Size: 175 KiB

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 483 KiB

After

Width:  |  Height:  |  Size: 491 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 556 KiB

After

Width:  |  Height:  |  Size: 565 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 854 KiB

After

Width:  |  Height:  |  Size: 866 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 506 KiB

After

Width:  |  Height:  |  Size: 542 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 KiB

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 485 KiB

After

Width:  |  Height:  |  Size: 487 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 569 KiB

After

Width:  |  Height:  |  Size: 569 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 888 KiB

After

Width:  |  Height:  |  Size: 884 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 509 KiB

After

Width:  |  Height:  |  Size: 542 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 335 KiB

After

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 KiB

After

Width:  |  Height:  |  Size: 295 KiB

+4 -4
View File
@@ -10,8 +10,8 @@ These three run in parallel and gate everything downstream:
1. **Market validation**: test the blended pressing price (3.76 to 5.27
USD at the planned 60 % specials; 3.50 to 4.60 at a standard-heavy mix)
and regional demand, which decides between Plan A (~0.74M records a year)
and Plan B (~1.25M) in [total investment](finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-225m-thb-october-2026),
and regional demand (~0.74M records a year in both Plan A and Plan B, and
when the second Duplex follows from revenue) in [total investment](finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-210m-thb-october-2026),
with Asian labels and distributors, starting at
Making Vinyl in Haarlem (Alexander and Simona). This is the biggest
assumption in the [revenue model](finance/revenue-model.md); the
@@ -174,8 +174,8 @@ before the BOI certificate, no big-block spending before the market
validates the price, no coppice fuel planning before the land title check.
Since October 2026 the plant launches with everything in one capital
round (~161M to 285M THB with contingency; for the investor Plan A at
~180M and Plan B at ~225M THB without it, in
[total investment](finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-225m-thb-october-2026));
~180M and Plan B at ~210M THB without it, in
[total investment](finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-210m-thb-october-2026));
the gates still come before the round is spent, and the growth options
(more Duplex systems first, then Classics, in a press hall laid out for
five Duplex systems and four Classics) are funded from revenue.