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
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:
1 parent
ffc6cedbca
commit
3f33babdaa
28 files changed
+528
-604
No files matched your search
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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/).
|
||||
"""
|
||||
|
||||
@@ -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 "
|
||||
|
||||
@@ -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 "
|
||||
|
||||
@@ -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"],
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user