Solar on every roof, BOI solar correction, open source section
Deploy test site / deploy (push) Successful in 54s

Solar (user, 17 Oct 2026: "use as much roof space as possible")
- PV on every roof and canopy: ~640 kWp on the Payap scenario plot
  (factory roof ~523, canopies ~54, flat office roof ~65 kWp around the
  AC units); ~300 kWp on the Mueang Chi hall. Calculator: pvKWp 640,
  new pvSelf 85 % (zero export, hourly sketch), PV cost per kWp times the
  array, office-roof PV in the iso view, roofs drawn full.
- 12.8M to 16.6M THB at 20 to 26 THB/W; CSV baseline 34.37M to 56.34M;
  launch plant ~168M / 231M / 294M THB with contingency; Plan B ~216M
  (label ~215M), ~39M above Plan A; Plan A unchanged (it leases the
  array), its solar lever ~17.5M. PV payback ~4.2 to 5.9 years.
- Permits (rooftop solar no factory licence since 28 Dec 2024, ERC
  exemption under 1,000 kVA, PEA zero export) and PPA discounts sourced
  in sustainability.md.

BOI correction
- Announcement 3/2568 (in force 1 July 2025) ended BOI promotion for
  solar installations; only the battery may qualify (12M THB per MW cap).
  Removed the "BOI solar measure" from boi.md, total-investment,
  revenue-model, sustainability, site-candidates and both plan versions;
  Plan B's case for owning the array is the PPA bill it avoids
  (~0.07M USD a year).

Open source (user, 17 Oct 2026)
- digital-factory.md "Open source throughout, and working with other
  plants": everything we run and build is open source on NixOS, our code
  published (licence to decide), vendor firmware the stated exception;
  later the stack and factory-automation services for other pressing
  plants, not in the revenue.
- Business plan section 5.6 plus an executive-summary bullet, reading
  guide and not-modelled mentions; draft 0.3 rebuilt (A 60, B 61 pages),
  renders re-made with the roofs full.
This commit is contained in:
grabowski committed 2026-10-17 17:22:57 +07:00
1 parent ab303618d8
commit 9ff5feef11
32 files changed
+693 -367

No files matched your search

+26 -12
View File
@@ -15,13 +15,25 @@ no corporate income tax holiday on the core pressing activity, but the full
non-tax package and machinery duty exemption. The tax value is engineered on
top through the upgrade measures, where this project happens to be strong:
- **Solar and battery**: the alternative-energy measure (Announcement
2/2568, April 2025, under the Smart and Sustainable Industry framework)
grants CIT exemption based on the solar investment. Eligible spend
explicitly includes PV modules, inverters, BESS and BESS inverters, and
mounting structures, capped at THB 12M/30M/40M of investment value per MW
depending on investment type. The planned Deye + Gobel installation
converts directly into CIT-exemption headroom.
- **Solar: no longer promoted; the battery may be.** The alternative-energy
measure (Announcement 2/2568, April 2025, under the Smart and Sustainable
Industry framework) granted a CIT exemption on the solar investment,
capped at THB 12M/30M/40M per MW. **Announcement 3/2568** (5 June 2025,
in force 1 July 2025) ended promotion for installing solar power
generation under that measure for applications from 1 July 2025; what
remains is machinery modified to use other renewable energy, and battery
storage (BESS) with its inverters, the eligible investment capped at
THB 12M per MW
([B Global Law](https://bgloballaw.com/2026/01/18/boi-announcement-no-3-2568-amendment-to-renewable-energy-efficiency-enhancement-measures),
[Smarter Energy Solution](https://smarterenergysolution.com/blog/boi-solar-thailand-2026),
checked October 2026). So owning the ~640 kWp array earns no BOI
benefit; its case is the bill (see [sustainability](sustainability.md)).
Whether the 271 kWh battery qualifies is for the BOI consultant. A PPA
developer selling solar power (200 kW or more per distribution point)
can still be promoted under activity 7.1.2 (8-year CIT exemption); that
benefit is the developer's, and how much of it reaches the PPA price is
a negotiation
([CapSolar](https://capsolar.co.th/en/knowledge/boi-solar-incentives-2026)).
- **Automation and metrology**: the Smart and Sustainable Industry upgrade
measure (Announcement 15/2565, refreshed July 2025) rewards automation,
smart machinery, and energy efficiency, typically 3 years of CIT
@@ -33,8 +45,8 @@ top through the upgrade measures, where this project happens to be strong:
galvanics process development, and recycled-PVC work could be framed as
qualifying development.
So the application is pitched on solar, automation, and technology content,
not on "we press plastic discs."
So the application is pitched on automation and technology content (and
the battery, if it qualifies), not on "we press plastic discs."
## What Group B still delivers (the core value)
@@ -119,11 +131,13 @@ project timeline, ahead of equipment contracts.
- Confirm the exact activity sub-code and tier for vinyl/PVC consumer-goods
pressing (Group B assumption is well supported but not code-verified)
- Confirm the live versions and per-MW caps of the solar and
smart-and-sustainable measures at filing time
- Confirm the live version of the smart-and-sustainable measures at
filing time, and whether the battery qualifies under the BESS part of
the alternative-energy measure (THB 12M per MW cap); solar itself is out
since 1 July 2025 (Announcement 3/2568)
- Confirm current NEC/Lamphun area add-ons
- Engage a BOI-registered consultant to structure the application so the
solar, automation, and R&D measures stack on the base promotion
automation and R&D measures (and the battery) stack on the base promotion
- Check whether R&D contracted with Payap University and the joint student
programmes ([Payap partnership](payap-partnership.md)) count toward the
R&D merit or a skills-development measure
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -4,7 +4,7 @@
python build_plan.py A -> ../CNX-Vinyl-Business-Plan-A.docx
python build_plan.py B out.docx -> Plan B to a custom path
Plan A (~180M THB) and Plan B (~210M THB) share every chapter; the content modules
Plan A (~180M THB) and Plan B (~215M 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/).
"""
+88 -62
View File
@@ -1,6 +1,6 @@
"""Part A: cover, reading guide, executive summary, opportunity, anatomy of the plant.
Builds Plan A (~180M THB) or Plan B (~210M THB): plan-specific text is switched with
Builds Plan A (~180M THB) or Plan B (~215M 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,17 @@ 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', '~210M THB')}**",
f"**Version:** Draft 0.3, October 2026: **{name()}, {pick('~180M THB', '~215M 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 (~210M THB), builds the same plant and takes none of the levers. ",
"version, Plan B (~215M 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 (~208M). A second version, Plan A (~180M THB), builds the same plant with six cost "
"included, three presses, with everything in and none of the cost levers taken, at ~215M "
"THB (~216M). 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 "
@@ -63,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 (~210M THB)**, the same three presses with everything in. " + pick(
"**Plan B (~215M 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 "
@@ -98,9 +98,18 @@ def blocks():
"(injection-moulded discs) is a separate, much larger decision, outside the totals; both CD "
"routes are set out in section 4.10 for the investor to decide.",
"**A purpose-built ~1,500 m² plant on long-term leased land**, with a detached utility yard, "
+ pick("rooftop solar through a solar power purchase agreement (PPA)",
"owned rooftop solar with a battery")
+ pick("solar on every roof and canopy (~640 kWp, estimate) through a solar power purchase "
"agreement (PPA)",
"owned solar on every roof and canopy (~640 kWp, estimate) with a battery")
+ " and room for a second building.",
"**Open source throughout:** every plant server runs NixOS, declared in one repository in the "
"fleet B4L already operates, so any machine is rebuilt from it; ERPNext (no licence fee) is the "
"only system of record; and our own code (the factory console, the plant overview, the artist "
"platform, the calculator) is published as open source, licence to be chosen. The exception is "
"the vendors' own firmware and control software in the machines, instruments and inverters, "
"kept as appliances that export data into our systems and run none of our services. Once the "
"plant has run this stack in production for at least a year, it and our factory-automation "
"services can be offered to other pressing plants; that is not in the revenue (section 5.6).",
"**Commissioned in sequence:** the cutting room and galvanics first (the presses need their "
"stampers), then " + pick("the Duplex system, then the Classic",
"the Duplex system, then the Classic, with cassette and CD-R "
@@ -111,18 +120,20 @@ def blocks():
"right first; " + pick("the launch plant", "the whole chain at launch")
+ " was decided anyway, and that advice is carried as a risk (sections 11.2 and 13).",
pick(
"**Six cost levers bring the plant to ~180M THB**, from ~193M to ~162M THB at the midpoint "
"before the ramp-up reserve (estimates, section 8): rooftop solar and battery through a solar "
"PPA (the installer owns and finances the array, the plant buys the power); metrology in two "
"**Six cost levers bring the plant to ~180M THB**, from ~201M to ~162M THB at the midpoint "
"before the ramp-up reserve (estimates, section 8): solar on every roof and canopy (~640 kWp) "
"and the battery through a solar PPA (the installer owns and finances the array, the plant "
"buys the power); metrology in two "
"steps (XRF, inline vision and the audio station at launch, the laser confocal and the "
"wide-area profiler bought from revenue); the visitor corridor built later, so no public tours "
"at first; cassette and CD-R duplication later; a mobile crane rented for the installations, "
"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, none of the cost levers: ~210M THB**, ~193M THB at the midpoint before the "
"ramp-up reserve and ~31M 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, "
"**Everything in, none of the cost levers: ~215M THB**, ~201M THB at the midpoint before the "
"ramp-up reserve and ~39M THB more than Plan A (estimates, section 8): owned solar on every "
"roof and canopy (~640 kWp) and the battery, so no PPA power bill (~2.3M THB a year in Plan "
"A, estimate); 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 "
@@ -154,13 +165,17 @@ def blocks():
"master.",
"**Efficiency designed in.** Heat is recovered before energy is generated: in order, a flue-gas "
"economiser if the boiler is fired, as much condensate back to the feed tank as possible, then a "
"heat pump that lifts the presses' ~60 °C cooling return into boiler feedwater. The main roof "
"carries **~247 kWp** of solar (about 335 to 360 MWh a year, a quarter to a third of mature "
"two-shift use; a second building's roof would take the total to ~498 kWp), with a 271 kWh "
"battery for ride-through" + pick(
", both through the solar PPA: the installer owns and finances them, the plant buys the "
"power. ",
", both owned by the plant. ")
"heat pump that lifts the presses' ~60 °C cooling return into boiler feedwater. Every roof and "
"canopy carries solar: **~640 kWp** on the Payap scenario layout (factory roof ~523 kWp, "
"parking canopies ~54 kWp, office roof ~65 kWp), about 900 MWh a year, of which ~85 % is used "
"on site (~760 MWh, ~38 % of the launch plant's electricity with electric steam); the rest is "
"curtailed, because a factory on PEA's grid runs zero export and is not paid for surplus "
"(estimates). On the Mueang Chi hall the roof and canopies hold ~300 kWp, so the rest would be "
"ground-mounted or wait for the second building's roof. A 271 kWh battery gives ride-through"
+ pick(
"; array and battery come through the solar PPA: the installer owns and finances them, the "
"plant buys the power. ",
"; array and battery are owned by the plant. ")
+ "Cooling runs as a closed loop, no process water is discharged, "
"galvanics rinse water goes through a zero-discharge evaporator, and 20% of the feedstock is "
"in-house regrind. Boilers and chillers come in identical modules, so spares and service are one "
@@ -190,14 +205,15 @@ 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 208M (~USD 6.30M), rounded to ~210M THB**: the plan investment, ~THB 192.8M (~USD "
"5.84M) 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 149M to 266M. Estimates: no "
"**~THB 216M (~USD 6.53M), rounded to ~215M THB**: the plan investment, ~THB 200.6M (~USD "
"6.08M) 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 just within the investor's 180M "
"THB plus 20 % (216M). From the low to the high end of every block: ~THB 156M to 275M. "
"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", "29M") + " at the midpoint): quotes that land high are "
+ pick("24M", "30M") + " 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, "
@@ -209,21 +225,21 @@ def blocks():
"57M), operating profit ~USD 1.34M (~THB 44M); break-even on operating profit at ~0.2M "
"records a year. **The adverse case loses money:** EBITDA ~USD 0.23M, operating loss ~USD "
"0.39M (~THB 13M); it would need ~0.9M records a year to cover depreciation and the three "
"presses make 0.58M at that rate. The solar PPA's power price (~USD 0.03M a year in the "
"presses make 0.58M at that rate. The solar PPA's power price (~USD 0.07M 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 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 "
"57M), operating profit ~USD 1.24M (~THB 41M); break-even on operating profit at ~0.24M "
"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 "
"0.54M (~THB 18M); 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)",
"~3.6 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 "
"~3.8 years on the plan price in the central case (2.7 to 4.8 from the low to the high end of "
"the price); ~1.2 years in the favourable case, ~36 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 "
@@ -239,42 +255,46 @@ def blocks():
"~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 208M (~USD 6.30M), the ~210M THB plan, released in tranches against milestones "
"~THB 216M (~USD 6.53M), the ~215M 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 52M (arithmetic, before financing costs)")],
"at least a quarter is equity: ~THB 54M (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 (~210M THB)**, builds the same three "
"This document is **Plan A**. The other version, **Plan B (~215M 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 31M (~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 "
"make the same records: it is whether the investor funds ~THB 39M (~22 %) more at launch for what "
"Plan A leases or buys from revenue. Plan B owns its solar array (no PPA power bill), 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. "
"its utilities with local service. On the modelled numbers that extra earns little (the same "
"EBITDA in the revenue model, ~USD 0.07M a year more in the calculator for the PPA power bill the "
"owned array avoids; 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 corridor is cheaper to build in from the start, and owning the array "
"saves the PPA bill from the first year. BOI no longer promotes solar installations (since 1 July "
"2025, section 7.1), so neither plan earns a tax benefit on the array. "
"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 208M (~USD 6.30M); ~149M to 266M from the low to the high end"],
"the low to the high end", "~THB 216M (~USD 6.53M); ~156M to 275M 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.6 years (2.6 to 4.7)"],
["Operating profit, central case", "~USD 1.34M (~THB 44M)", "~USD 1.24M (~THB 41M)"],
["Payback on the plan price, central case", "~3.1 years (2.2 to 4.0)", "~3.8 years (2.7 to 4.8)"],
["Adverse case", "Loses money: EBITDA ~USD 0.23M, operating loss ~USD 0.39M",
"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",
"~THB 31M more at launch: owned solar and battery with the BOI solar measure, the full "
"Loses money: EBITDA ~USD 0.23M, operating loss ~USD 0.54M"],
["What Plan A gives up, what Plan B buys", "At launch: solar through a PPA (a power bill of "
"~USD 0.07M a year instead of owning the array), no confocal or profiler, no visitor corridor "
"or tours, no cassette or CD-R, a rented crane; Chinese-made boilers and compressor",
"~THB 39M more at launch: owned solar (~640 kWp, every roof and canopy covered) and battery, "
"so no PPA bill, 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,
@@ -317,18 +337,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 208M (~USD 6.30M), 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, "
"**Then the Plan B round, ~THB 216M (~USD 6.53M), rounded to ~215M THB**, including the "
"ramp-up reserve and without contingency, just within the investor's 180M THB plus 20 % "
"(216M) 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 149M to 266M; quotes that land high are funded "
"end of every block the plan runs from ~THB 156M to 275M; 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 31M more at launch for what Plan A leases or defers; the "
"same records, so the choice is ~THB 39M 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 ~208M") + " is equity); CD "
"least ~THB " + pick("44M of Plan A's ~177M", "54M of Plan B's ~216M") + " 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,7 +360,7 @@ 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 "
"(~210M THB)**, the same three presses with everything in. Both plan prices include the ramp-up "
"(~215M 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."),
@@ -361,7 +381,8 @@ def blocks():
"Pheenix price on file; priced at OMS's reference plus "
"20 %) and the Newbilt Classic (no price on file); the "
"cutting room beyond the lathe; metrology stack; land "
"lease; " + pick("the solar PPA power price; ", "")
"lease; the solar yield and the share used on "
"site; " + pick("the solar PPA power price; ", "")
+ "all cassette and CD figures"],
], widths_mm=[22, 70, 78]),
P("Currency: USD and THB at 1 USD = 33 THB (5 August 2026). Vendor quotes issued in EUR or GBP are "
@@ -371,7 +392,10 @@ def blocks():
"structure or terms (to be agreed with the investor); "
"a signed customer; a signed lease; firm quotes for the Classic, the galvanics line, the metrology "
"stack or the building; a price for the central hydraulic plant; and a year-by-year cash model. "
"Each of these is a named next step in section 14."),
"Each of these is a named next step in section 14. The revenue also leaves out two upsides that "
"have no price or volume yet: supplying stampers to other plants (section 3.3), and services to "
"other pressing plants built on the plant's open-source software and factory automation "
"(section 5.6)."),
# ------------------------------------------------- 3 opportunity
H1("3. The opportunity"),
@@ -540,10 +564,12 @@ def blocks():
["An archive for fathers and mothers", "Irreplaceable metal; repress economics",
"Father and mother of every side; fire-rated, climate-controlled room, clean-agent suppression, "
"mobile shelving (to quote)", LP],
["Renewable energy and closed-loop water", "Cost, resilience, brand, BOI tax value",
pick("~247 kWp roof PV and 271 kWh battery through a solar PPA (installer-owned), closed cooling "
"loop, zero process discharge",
"~247 kWp roof PV and 271 kWh battery (owned), closed cooling loop, zero process discharge"),
["Renewable energy and closed-loop water", "Cost, resilience, brand" + pick(
"", "; the owned battery may qualify for BOI as storage"),
pick("PV on every roof and canopy (~640 kWp) and a 271 kWh battery through a solar PPA "
"(installer-owned), closed cooling loop, zero process discharge",
"PV on every roof and canopy (~640 kWp) and a 271 kWh battery (owned), closed cooling "
"loop, zero process discharge"),
pick("Launch plant (PV and battery through a solar PPA)", "At launch")],
["Trained people and a safety program", "Steam at 10 bar, hydraulics at 180 bar, plating "
"chemistry", "Vendor commissioning training, in-house program, PPE, clean rooms",
+153 -57
View File
@@ -1,6 +1,6 @@
"""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 (~210M THB, the same launch plant with
THB, the launch plant with six cost levers) and Plan B (~215M 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
@@ -351,56 +351,91 @@ def blocks():
B([
"**Biomass heat is far cheaper than electric steam** (below): the demand charge follows the "
"boiler's full-power draw, and the peak window covers 13 of the 16 production hours.",
"**The roof gets PV, not solar thermal.** Self-consumed PV is worth ~3.7 THB/kWh" + pick(
"**Every roof gets PV, not solar thermal.** Self-consumed PV is worth ~3.7 THB/kWh" + pick(
" of grid power displaced, less the PPA price the plant pays for it (below)", "") +
"; it cannot lower the demand charge, because the peak window runs to 22:00, long after "
"sunset.",
"; surplus earns nothing, because a factory on PEA's grid runs zero export (below); and PV "
"cannot lower the demand charge, because the peak window runs to 22:00, long after sunset.",
"**The battery is for ride-through, not peak shaving.** Charging off-peak and discharging at "
"peak earns ~70k THB a year for the 271 kWh stack, and it can hold demand down by only ~20 kW "
"(~30k THB a year; estimates). Its case is riding through grid dips and outages.",
]),
H3("Renewable energy"),
KV([
["Rooftop PV", "~247 kWp on the 1,523 m² monopitch roof (425 modules of a generic 580 W "
"placeholder; no module chosen yet), ~335 to 360 MWh a year, ~25 to 35% of mature "
"two-shift use (1,000 to 1,500 MWh). " + pick(
"Taken through a solar PPA (below): the plant pays the PPA price for this "
"power instead of buying the array, so its saving is the gap between that "
"price and the ~3.7 THB/kWh of grid power it displaces",
"Saves ~1.2M to 1.3M THB a year and pays back in ~3.8 to 5.4 years at 20,000 "
"to 26,000 THB/kWp installed (estimates)")],
["Canopies and the second building", "~40 kWp on the parking canopies (construction RFQ; ~54 "
"kWp if fully covered). A phase 2 building's roof adds "
"~251 kWp, ~498 kWp across both roofs"],
["PV on every roof and canopy", "~640 kWp (decided October 2026: as much roof as possible). In "
"the Payap scenario model the calculator draws the factory roof "
"at ~523 kWp (901 modules of a generic 580 W placeholder; no "
"module chosen yet), the car and scooter canopies at ~54 kWp and "
"the office roof at ~65 kWp; the covered link and the utility "
"yard are left out. ~900 MWh a year at 1,400 to 1,500 kWh/kWp, "
"~85% of it used on site (~760 MWh: two shifts on 300 days, a "
"~60 kW base load off-shift and the battery), about 38% of the "
"launch plant's ~2,000 MWh a year with electric steam "
"(estimates). " + pick(
"Taken through a solar PPA (below): the plant pays the PPA price for this power instead of "
"buying the array, so its saving is the gap between that price and the ~3.7 THB/kWh of "
"grid power it displaces",
"Saves ~2.8M to 3.0M THB a year at ~3.7 THB/kWh self-consumed and pays back in ~4.2 to 5.9 "
"years at 20 to 26 THB/W installed; the last ~340 kWp beyond the first ~300 pay back in "
"~4.9 to 6.3 years, because more of their yield is curtailed on Sundays (estimates)")],
["Zero export", "The ~15% the plant cannot use, mostly on Sundays and holidays, is curtailed, not "
"sold: a factory on PEA's grid runs zero export, with no payment for surplus and "
"a zero-export controller (reverse-power relay) as part of the interconnection "
"(CapSolar and Sahawatthanakit, 2026)"],
["On the Mueang Chi hall", "The 60 × 25 m hall of section 6.2 takes only ~300 kWp: ~247 kWp on "
"the 1,523 m² monopitch roof (425 modules) and ~40 to 54 kWp on the "
"parking canopies. The rest would need ground mount on the ~70 m of "
"plot behind the building (not covered by the rooftop exemption, so "
"it may still need a factory permit) or the phase 2 roof (~251 "
"kWp)"],
["Battery", "271 kWh Gobel Power LiFePO4 rack (15 stacked 18 kWh packs, 8,000+ cycles), USD "
"39,900 to 58,000 listed (battery only; ~2.0M to 3.5M THB installed with enclosure, fire protection and "
"controls, estimate), 50 to 60 day lead. Roughly an hour of the chiller bank's "
"peak draw: ride-through, not off-grid autonomy"],
["Inverters", "Deye three-phase hybrid units (30 to 80 kW class), Thai distribution via Solar "
"Nicolo; Deye is a supported protocol on the Gobel battery management"],
["Inverters", "Deye three-phase hybrid units (30 to 80 kW class), ~500 kVA in all (estimate); "
"Thai distribution via Solar Nicolo; Deye is a supported protocol on the Gobel "
"battery management"],
["Roof design", "Monopitch at 10° falling toward ESE puts the whole roof on one plane at ~98% "
"of ideal yield; at this latitude orientation barely matters (under 2% across a "
"wide azimuth swing). 10° rather than shallower so the rains self-clean "
"burning-season dust"],
["Permits", "Since Ministerial Regulation No. 3 B.E. 2567 (in force 28 December 2024) rooftop "
"solar outside industrial estates is not a factory, so it needs no Ror.Ngor. 4 "
"licence at any size. At ~500 kVA of inverters, under the 1,000 kVA line of the "
"Energy Regulatory Commission (ERC), an ERC exemption notification replaces a "
"generation licence. PEA approves the interconnection with zero-export control in 3 "
"to 6 months, filed in parallel with procurement (CapSolar, 2026); the roof load is "
"in the building permit. Inside an industrial estate IEAT rules apply on top"],
["Open checks", "Battery rack voltage against the chosen Deye model's window; Gobel safety "
"certifications (not published); EPC warranty on a mixed-vendor DC bus; yield "
"against PVGIS before committing" + pick("; the PPA offer itself, price and "
"terms", "")],
pick(["Solar PPA (this plan)", "An installer owns and finances the PV and the battery, and the "
"plant buys the power at a price still to quote (the calculator carries 3.0 THB/kWh, an "
"estimate, ~0.03M USD a year on the energy line). That keeps the PV EPC (USD 182k to "
"236k) and the battery (USD 61k to 106k) out of the capital round: ~9.7M THB less at the "
"midpoint, one of the six levers in section 8. The BOI solar measure (section 7) rewards "
"the plant's own solar investment, so its tax value very likely goes with the array (to "
"confirm with the BOI consultant). The PPA offer is asked against the specification "
"above"],
["Owned (this plan)", "The plant buys the array and the battery: rooftop PV EPC USD 182k "
"to 236k (6.0M to 7.8M THB, 20 to 26 THB/W at Thai 2026 market prices) and the battery, installed, "
"USD 61k to 106k (2.0M to 3.5M THB), "
"estimates, section 8. Owning them is what the BOI solar measure rewards (section 7). A "
"solar PPA (an installer owns and finances them, the plant buys the power at a price "
"still to quote) would take ~9.7M THB out of the capital round at the midpoint, but "
"very likely gives up that measure"]),
"plant buys the power at a price still to quote. The PPA covers the full ~640 kWp; the "
"calculator carries 3.0 THB/kWh (estimate) for the ~760 MWh used on site, ~2.3M THB or "
"~0.07M USD a year on the energy line. That keeps the PV EPC (USD 388k to 504k, 12.8M to "
"16.6M THB at 20 to 26 THB/W) and the battery (USD 61k to 106k) out of the capital round: "
"~17.5M THB less at the midpoint, one of the six levers in section 8. The launch plant's "
"power bill (~0.75M THB a month before solar, estimate) is well above the 100,000 THB a "
"month CapSolar asks of a PPA site; PPA discounts run 10 to 15 % off the tariff at MEAei "
"and 10 to 30 % at CapSolar, so the calculator's ~21 % is to be quoted. Leasing gives up no BOI benefit on the array: BOI stopped promoting solar "
"installations on 1 July 2025 (Announcement 3/2568, section 7.1). A PPA developer selling "
"the power can still be promoted (activity 7.1.2); whether that shows in the price is for "
"the negotiation (CapSolar, 2026). What the PPA costs against owning is the power bill "
"above and, if the PPA includes the battery, the battery's possible BOI eligibility as "
"storage (to confirm with the BOI consultant). The PPA offer is asked against the "
"specification above"],
["Owned (this plan)", "The plant buys the array and the battery: PV EPC USD 388k to 504k "
"(12.8M to 16.6M THB for ~640 kWp, 20 to 26 THB/W installed with inverters at Thai 2026 "
"market prices; the canopy steel is in the building and site works) and the battery, "
"installed, USD 61k to 106k (2.0M to 3.5M THB): ~17.5M THB together at the midpoint, "
"estimates, section 8. Owning them saves the power bill a PPA would carry: at the "
"calculator's 3.0 THB/kWh (estimate, to quote) for the ~760 MWh used on site, ~2.3M THB "
"or ~0.07M USD a year. A solar PPA (an installer owns and finances them, the plant buys "
"the power at a price still to quote) would take ~17.5M THB out of the capital round at "
"the midpoint at the cost of that bill. The array itself carries no BOI benefit: BOI "
"stopped promoting solar installations on 1 July 2025 (Announcement 3/2568, section "
"7.1); the owned battery may still qualify as storage (to confirm with the BOI "
"consultant)"]),
]),
H3("Steam: the open engineering choice"),
P("The boilers' fuel is still open; the modular bank works with either. There is no natural gas "
@@ -487,13 +522,16 @@ def blocks():
"acceptable the cost drops materially, and that question is on the RFQ list."),
CALL("Efficiency in one paragraph, for the investor", "Steam and cooling are built once as a "
"backbone and filled with identical modules as presses arrive; heat is recovered from the "
"flue gas, the condensate and the press returns before more is generated; the roof carries PV "
"worth a quarter to a third of mature electricity use" + pick(" (through a solar PPA)", "") +
", with a battery for ride-through; no "
"flue gas, the condensate and the press returns before more is generated; every roof and "
"canopy carries PV" + pick(" through a solar PPA", "") + " (~640 kWp, over a third of the "
"launch plant's electricity even with electric steam, estimate), with a battery for "
"ride-through; no "
"process water is discharged; a fifth of the plastic is reclaimed; and biomass steam, if "
"chosen, costs a quarter to a tenth of electric steam. The same choices push the energy line "
"toward its low end, hedge Thai tariff rises, and convert into BOI tax value" + pick(
" through the Smart and Sustainable Industry measure", "") + " (section 7). They "
"toward its low end and hedge Thai tariff rises; the heat recovery and automation can count "
"toward BOI's Smart and Sustainable Industry measure" + pick(
"", " and the owned battery may qualify as storage") + " (section 7.1; BOI no longer "
"promotes solar installations). They "
"also make the plant's sustainability story true rather than claimed, which matters to the "
"labels it sells to."),
@@ -570,6 +608,59 @@ def blocks():
"chain from master to shipment, with the repress path from the archived father and mother. IDs "
"and times are simulated."),
H2("5.6 Open source throughout, and a service for other plants"),
P("**Everything the plant runs and everything the project builds is open source,** with a short "
"list of exceptions named below. Every server is a NixOS machine declared in one repository, "
"B4L's fleet repository built on clan-core; the fleet it declares already runs B4L's DNS, mail, "
"monitoring, backups, a public reverse proxy and the first site gateway. The plant adds a gateway, a core "
"server, a backup server, edge collectors and station kiosks to the same inventory. Any machine "
"is rebuilt from the repository, and a second plant is one more inventory entry. ERPNext is the "
"only system of record (section 5.1), self-hosted on NixOS through the community packaging "
"frappe-nix."),
T(["Component", "What it does", "Licence"], [
["NixOS (nixpkgs), clan-core", "Every server, declared and deployed from one repository",
"MIT"],
["ERPNext on the Frappe framework", "The only system of record: orders, gates, stock, job "
"cards, metal genealogy, inspections, accounts", "GPLv3 (ERPNext), MIT (Frappe); no licence "
"or per-seat fee"],
["PostgreSQL, VictoriaMetrics, Telegraf, Mosquitto (MQTT)", "Machine-data store, time series, "
"collection and messaging from presses, utilities and instruments", "PostgreSQL licence, "
"Apache-2.0, MIT, EPL-2.0"],
["Grafana, Caddy, BorgBackup", "Dashboards and alerts, the web proxy, encrypted backups",
"AGPLv3, Apache-2.0, BSD"],
["cnx-factory (ours)", "Kiosks, press floor, QC, genealogy, customer portal; Rust (axum, SQLx, "
"minijinja, HTMX), packaged as a Nix flake", "To be published"],
["Plant overview, artist platform (name undecided), plant and business plan calculator (ours)",
"The software of section 5.5", "To be published"],
["FreeCAD, LibreOffice", "The plant model; this business plan's build", "LGPL, MPL-2.0"],
], widths_mm=[52, 82, 36], font_pt=8.5,
caption="Licences as published by each project, checked October 2026. Firmware inside the "
"machines is not in the table (below)."),
B([
"**Our own code is published as open source.** The licence is still to decide: AGPL-3.0 keeps "
"hosted copies open as well; Apache-2.0 or MIT is the easiest for other plants to adopt.",
"**What is not open, said plainly:** the firmware and HMIs inside the machines and instruments "
"(Newbilt's Siemens PLC, Pheenix's Beckhoff PLC, Keyence and the vision controllers), the "
"inverter and battery firmware, the vendors' OPC UA licences, and the access-point controller "
"in the fleet's router module. They are treated as appliances: they export data into the NixOS "
"estate under the data clause of every equipment RFQ (section 5.1) and host none of our "
"services.",
"**What it gives the business:** no licence fees (ERPNext charges no fee per seat, so a new "
"kiosk or office user costs nothing in licences); no lock-in to a software vendor; every "
"machine reproducible from the repository; and a record customers can audit, because the "
"hash-chained event log and the code that writes it can both be inspected.",
]),
P("**Later: a service for other pressing plants.** Once the plant has run the stack in production "
"for at least a year, the project can work with other pressing plants worldwide in three ways: "
"an open vinyl plant stack (the NixOS modules, an ERPNext app for pressing with stampers, test "
"pressings and genealogy, and press adapters for Newbilt and Pheenix machines over OPC UA, S7 "
"and ADS); services (factory automation and data acquisition integration and commissioning at "
"other plants, remote monitoring and support, hosting of ERPNext and the factory application, "
"training); and shared development, with each plant contributing the adapters for its own "
"machines. **None of this is in the plan's revenue:** like stamper supply to other plants, it is "
"an upside with no price or volume yet, and it starts only after the plant has proved the stack "
"on its own floor."),
# -------------------------------------------- 6 site and building
H1("6. Site and building"),
H2("6.1 Land: a long lease, three candidates"),
@@ -700,12 +791,11 @@ def blocks():
"figures and their source."),
IMG(pick("renders/calculator/plan-a-iso-roof.png", "renders/calculator/plan-b-iso-roof.png"), 170,
"Figure 8. The site from above, " + label() + " preset of the plant and business plan calculator: "
"the factory with roof PV" + pick(" supplied through the solar PPA (the battery is drawn too; "
"whether a PPA offer includes it is open)",
" and battery, owned") +
", the office, the utility yard (boiler hall and chiller compound built for four modules each, "
"pump and heat-exchanger room, transformer, water treatment, PVC silos), parking with PV canopies "
"and the phase 2 reserve. Schematic render of the Payap scenario model (docs/fleet-calculator.html); "
"every roof and canopy carries PV, ~640 kWp on the factory, the office and the car and scooter "
"parking" + pick(", supplied through the solar PPA (the battery is drawn too; whether a PPA offer "
"includes it is open)", ", owned with the battery") +
"; the utility yard (boiler hall and chiller compound built for four modules each, pump and "
"heat-exchanger room, transformer, water treatment, PVC silos) and the phase 2 reserve. Schematic render of the Payap scenario model (docs/fleet-calculator.html); "
"positions and envelopes are estimates."),
IMG(pick("renders/calculator/plan-a-iso-gf.png", "renders/calculator/plan-b-iso-gf.png"), 170,
"Figure 9. Ground floor with the roofs cut away, " + label() + " preset: from the west end the "
@@ -814,7 +904,8 @@ def blocks():
H3("Site works and the second building"),
P("On the Mueang Chi parcel the site works are a ~444 m perimeter wall, one 10 m sliding gate with "
"a guard house, 4,387 m² of paving in two classes (1,608 m² heavy-duty for trucks, 2,779 m² "
"general), roofed parking for 10 cars and 30 scooters carrying ~40 kWp of PV, a ring foundation "
"general), roofed parking for 10 cars and 30 scooters with its canopies fully covered in PV (~54 "
"kWp; ~40 kWp in the construction RFQ), a ring foundation "
"for a 9 m fire-water tank with its pump house and one for a 5 m raw-water tank, a fire ring main "
"and hydrants, stormwater drainage and domestic sanitation. With the buildings, ~6,549 m² or 68% "
"of the modelled plot is sealed, so stormwater attenuation, quite possibly a detention pond, may "
@@ -923,9 +1014,10 @@ def blocks():
"tax holiday on the core activity, but the full non-tax package and machinery duty exemption. "
"The tax value is engineered on top through measures where this project happens to be strong, so "
"the application is pitched on " + pick("automation, technology content and energy efficiency",
"solar, automation and technology content") +
"automation, full metrology and energy efficiency") +
", not on pressing plastic "
"discs. The research behind this dates from July 2026, BOI revises its measures roughly every "
"discs. The research behind this dates from July 2026 (the solar rules rechecked in October "
"2026); BOI revises its measures roughly every "
"year, and the exact activity sub-code needs confirmation by a BOI-registered consultant before "
"filing."),
T(["What BOI gives", "Why it matters here"], [
@@ -942,15 +1034,17 @@ def blocks():
"technical consultant, without the four-Thai-employees-per-permit rule."],
["Raw material duty relief", "Exemption for export production; up to 90% reduction for "
"domestic sales. Relevant for imported PVC compound until a Thai source is qualified."],
["Solar and battery measure (Announcement 2/2568, April 2025)", "CIT exemption based on the "
"solar investment; PV modules, inverters, battery and battery inverters, and mounting are "
"eligible, capped at THB 12M, 30M or 40M of investment per MW depending on investment type. "
"It rewards a plant-owned array. " + pick(
"This plan takes the PV and the battery through a solar PPA, so the installer owns them "
"and the plant very likely gives up this measure (to confirm with the BOI consultant; "
"section 5.4).",
"This plan buys the ~247 kWp array and the 271 kWh battery, so their cost is the base of "
"the exemption (section 5.4).")],
["Battery storage, alternative-energy measure (Announcement 3/2568, in force 1 July 2025)",
"BOI no longer promotes solar installations, rooftop or farm, for applications from 1 July "
"2025: Announcement 3/2568 took them out of the measure and ended the per-MW solar caps set in "
"April 2025, so the array earns no CIT exemption whoever owns it. What remains is battery "
"energy storage and its inverters, with the investment eligible for the CIT exemption capped "
"at THB 12M per MW (B Global Law, January 2026; to confirm with the BOI consultant). " + pick(
"In this plan the battery comes through the solar PPA if the offer includes it, and then "
"the plant owns nothing that qualifies; bought by the plant, the 271 kWh battery (2.0M to "
"3.5M THB installed, estimate) may qualify (section 5.4).",
"This plan owns the 271 kWh battery (2.0M to 3.5M THB installed, estimate), which may "
"qualify; its eligible value under the cap is for the BOI consultant (section 5.4).")],
["Smart and Sustainable Industry measure (Announcement 15/2565, refreshed July 2025)",
"Rewards automation, smart machinery and energy efficiency, typically 3 years of CIT exemption "
"capped around 50% of the qualifying upgrade spend. The automatic Classic, inline inspection, "
@@ -967,7 +1061,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)",
"~149M to 266M THB with the ramp-up reserve (~208M at the midpoint)") +
"~156M to 275M THB with the ramp-up reserve (~216M 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 "
@@ -1022,8 +1116,10 @@ def blocks():
"confirm against the text before the capacity is chosen); hazardous-substance registration and "
"locked, inventoried storage for silver nitrate and nickel salts; the occupational health "
"check-ups (section 6.3); PDPA for CCTV, personnel and operator-linked production data; local "
"fire codes and the building permit during construction; and DIW manifests for used oil and "
"other controlled waste."),
"fire codes and the building permit during construction; the solar papers (no factory licence "
"for rooftop PV since 28 December 2024, an ERC exemption notification under 1,000 kVA, and PEA "
"interconnection approval with zero-export control in 3 to 6 months; section 5.4); and DIW "
"manifests for used oil and other controlled waste."),
CALL("Three things to settle before filing", [
"**Zoning before filing.** The BOI clocks (the import window and the deadline for full "
"operation) start at the certificate, and the margin on them is consumed by one scenario: "
+196 -135
View File
@@ -1,10 +1,10 @@
"""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 (~210M THB, the same launch plant and three presses with
six cost levers, three presses) and Plan B (~215M 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)"
reserve: docs/finance/total-investment.md "Two plans: A at ~180M THB and B at ~215M 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()).
@@ -62,8 +62,12 @@ def _block_rows():
"racking", "297k to 627k", "9.8M to 20.7M", "Researched: utilities rows"],
]
if not a:
rows.append(["Rooftop PV (EPC) and the 271 kWh Gobel battery, owned", "243k to 342k", "8.0M to 11.3M",
"Researched: utilities rows; owned, so the BOI solar measure applies"])
rows.append(["Solar PV (EPC) on every roof and canopy, ~640 kWp, and the 271 kWh Gobel battery, owned",
"449k to 610k", "14.8M to 20.1M",
"Researched: utilities rows; PV at 20 to 26 THB/W installed, inverters included (12.8M to "
"16.6M), battery 2.0M to 3.5M; ~85 % of the yield used on site under zero export (estimate); "
"owned, so the plant keeps the whole bill saving (no BOI promotion for solar installations "
"since 1 July 2025, section 8.4)"])
rows += [
["Building ~1,500 m² plus civil and site works", "650k to 1,100k", "21.4M to 36.3M", "Estimate at "
"12,000 to 20,000 THB/m² plus ~20 % site works; soil is the main variable"],
@@ -91,23 +95,23 @@ def _block_rows():
"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 "
"corridor, cassette and CD-R duplication", "none", "none", "The PPA installer owns and "
rows.append(["Not bought at launch (levers, section 8.2): solar PV on every roof and canopy (~640 kWp) "
"and the battery (solar PPA), visitor corridor, cassette and CD-R duplication", "none", "none", "The PPA installer owns and "
"finances the array; the rest are growth steps from revenue"])
rows += [
pick(["**Subtotal, plan investment**", "**~3.56M to 6.25M**", "**~117.4M to 206.1M**",
"**Midpoint ~161.7M THB (~4.90M USD)**"],
["**Subtotal, plan investment**", "**~4.22M to 7.47M**", "**~139.1M to 246.4M**",
"**Midpoint ~192.8M THB (~5.84M USD)**"]),
["**Subtotal, plan investment**", "**~4.42M to 7.73M**", "**~145.9M to 255.2M**",
"**Midpoint ~200.6M THB (~6.08M 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.52M to 8.07M**", "**~149M to 266M**",
"**Midpoint ~208M THB (~6.30M USD): ~210M THB**"]),
["**Plan B price**", "**~4.72M to 8.34M**", "**~156M to 275M**",
"**Midpoint ~216M THB (~6.53M USD): ~215M THB**"]),
["Contingency: not in the plan price", "", "", pick(
"For information: at 15 %, ~24M THB at the midpoint",
"For information: at 15 %, ~29M THB at the midpoint")],
"For information: at 15 %, ~30M THB at the midpoint")],
]
return rows
@@ -115,13 +119,11 @@ def _block_rows():
def _levers_table():
"""Plan A: the six levers from the launch plant with every block, midpoints, no contingency."""
return T(["Step", "Saves", "Subtotal after it", "What it gives up"], [
["Launch plant, every block, no contingency", "", "~192.8M THB (~5.84M USD)", ""],
["1. Rooftop solar and battery through a solar PPA (the installer owns and finances the array; the "
"plant buys the power)", "~9.7M", "~183.1M", "Owned solar and very likely the BOI solar measure with "
"its tax benefit (our reading, for the BOI consultant); "
"adds the PPA power price to the energy bill, ~0.03M USD a "
"year in the calculator at 3.0 THB/kWh (estimate, to "
"quote)"],
["Launch plant, every block, no contingency", "", "~200.6M THB (~6.08M USD)", ""],
["1. Solar on every roof and canopy (~640 kWp) and the battery through a solar PPA (the installer owns "
"and finances the array; the plant buys the power)", "~17.5M", "~183.1M", "Owned solar and its whole "
"bill saving: adds the PPA power price to the energy bill, ~0.07M USD (~2.3M THB) a year in the "
"calculator for ~760 MWh used on site at 3.0 THB/kWh (estimate, to quote)"],
["2. Metrology launch tier: XRF, inline vision and audio station at launch; laser confocal and "
"wide-area profiler (USD 180k to 350k) bought from revenue", "~8.8M", "~174.4M", "Every stamper and "
"record is still measured (XRF, inline vision on the presses, audio station); the confocal and the "
@@ -147,8 +149,10 @@ def _levers_table():
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", "~9.7M"],
["Solar PV on every roof and canopy (~640 kWp) and the 271 kWh battery, owned (EPC and Gobel battery)",
"No PPA power bill: the whole saving on the ~760 MWh used on site (~2.8M to 3.0M THB a year) stays "
"with the plant instead of ~2.3M THB (~0.07M USD) a year going to a PPA installer; payback ~4.2 to "
"5.9 years (estimates)", "~17.5M"],
["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 "
@@ -159,14 +163,14 @@ def _keeps_table():
"the installations", "~3.2M"],
["Boilers and compressor from Thai suppliers", "Local service; no import route for the boilers",
"~1.9M"],
["**Together**", "", "**~31M (192.8M minus Plan A's 161.7M)**"],
["Launch plant, every block, no contingency: Plan B's subtotal", "", "~192.8M (~5.84M USD)"],
["**Together**", "", "**~39M (200.6M minus Plan A's 161.7M)**"],
["Launch plant, every block, no contingency: Plan B's subtotal", "", "~200.6M (~6.08M USD)"],
["Ramp-up reserve", "", "+10M to 20M"],
["**Plan B**", "", "**~208M THB (~6.30M USD)**; ~149M to 266M from the low to the high end"],
["**Plan B**", "", "**~216M THB (~6.53M USD)**; ~156M to 275M 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 ~31.2M, and the "
"two subtotals differ by ~31.1M.")
"Each figure is what the matching Plan A lever saves; rounded, the six add to ~39.0M, and the "
"two subtotals differ by ~38.9M.")
def _tranches():
@@ -179,25 +183,25 @@ def _tranches():
"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)")],
pick("20 to 30 % (~32M to 49M)", "20 to 30 % (~40M to 60M)")],
["2", "Building permit; vendor build dates confirmed in writing",
"Construction, water-treatment building, utility yard, utilities, balance payments as machines are "
"built",
pick("35 to 45 % (~57M to 73M)", "35 to 45 % (~67M to 87M)")],
pick("35 to 45 % (~57M to 73M)", "35 to 45 % (~70M to 90M)")],
["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 "
"Fit-out, HVAC and clean zones, ZLD and DI water, solar PV on every roof and canopy and the "
"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 % (~29M to 39M)")],
pick("15 to 20 % (~24M to 32M)", "15 to 20 % (~30M to 40M)")],
["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 % (~15M to 23M), plus the reserve")],
"on", pick("8 to 12 % (~13M to 19M), plus the reserve", "8 to 12 % (~16M to 24M), 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 (~192.8M THB at the midpoint); the THB "
"Shares of Plan B's investment before the reserve (~200.6M THB at the midpoint); the THB "
"figures are the shares applied to it (arithmetic, estimates)."))
@@ -231,11 +235,11 @@ def _operating_table():
["**Total contribution**", "**0.68M**", "**2.06M**", "**3.99M**"],
["Cash overheads", "0.45M", "0.33M", "0.20M"],
["**EBITDA**", "**0.23M**", "**1.73M**", "**3.79M**"],
["Depreciation", "0.75M", "0.47M", "0.28M"],
["**Operating profit**", "**-0.52M**", "**1.26M**", "**3.51M**"],
["Depreciation", "0.77M", "0.49M", "0.29M"],
["**Operating profit**", "**-0.54M**", "**1.24M**", "**3.50M**"],
["Revenue", "2.28M (~75M THB)", "3.65M (~120M THB)", "5.41M (~179M THB)"],
["Payback on the plan price (EBITDA, mature year)", "~35 yr", "~3.6 yr (2.6 to 4.7 on 4.52M to "
"8.07M)", "~1.2 yr"],
["Payback on the plan price (EBITDA, mature year)", "~36 yr", "~3.8 yr (2.7 to 4.8 on 4.72M to "
"8.34M)", "~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 "
@@ -255,8 +259,8 @@ def _risk_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 ~29M THB at the midpoint, "
"and the high end of every block comes to ~266M with the reserve"),
"Quotes landing high are not covered: at 15 % a contingency would be ~30M THB at the midpoint, "
"and the high end of every block comes to ~275M 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"],
@@ -269,7 +273,7 @@ def _risk_rows():
"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.23M records; commission in sequence; the second Duplex waits for "
"Central breaks even at ~0.24M records; commission in sequence; the second Duplex waits for "
"demand; treat the adverse column as the honest one")],
]
rows += [
@@ -293,21 +297,23 @@ def _risk_rows():
"fallback"],
]
if a:
rows.append(["Medium", "Solar PPA and the BOI solar measure", "The PPA very likely gives up the BOI "
"solar measure (owned solar and its tax benefit) and adds a power price, ~0.03M USD a year "
"in the calculator at 3.0 THB/kWh, an estimate to quote", "The BOI consultant's reading "
"and PPA offers next to the purchase quote in phase 0; buying the array, as Plan B does, "
"stays the alternative"])
rows.append(["Medium", "Solar PPA price", "The PPA gives up owning the bill saving and adds a power "
"price, ~0.07M USD (~2.3M THB) a year in the calculator at 3.0 THB/kWh, an estimate to "
"quote. No BOI benefit is lost: the BOI dropped solar installations from its promotion on "
"1 July 2025 (Announcement 3/2568); a PPA developer may itself be promoted (activity 7.1.2, "
"an 8-year corporate income tax exemption), which may or may not show in its price",
"PPA offers next to the purchase quote in phase 0, the developer's BOI promotion raised in "
"the price negotiation; buying the array, as Plan B does, stays the alternative"])
else:
rows.append(["Medium", "The extra ~31M THB earns nothing in the model", "Plan B's operating picture is "
"Plan A's (same presses, records, revenue and EBITDA): the ~31M THB more at launch adds "
"depreciation, so central operating profit is 1.26M against 1.34M USD, payback ~3.6 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 "
rows.append(["Medium", "The extra ~39M THB earns little in the model", "Plan B's operating picture is "
"Plan A's (same presses, records, revenue and EBITDA; the calculator puts it ~0.07M USD a "
"year ahead, the PPA bill its owned array avoids): the ~39M THB more at launch adds "
"depreciation, so central operating profit is 1.24M against 1.34M USD, payback ~3.8 against "
"~3.1 years and the adverse corner deeper; its case rests on that bill and on what the "
"table leaves out (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"])
"offer next to the purchase quote, cassette and CD-R quotes); most items can also come "
"later from revenue, as in Plan A, while the corridor is 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 "
@@ -362,8 +368,9 @@ def _risk_rows():
"warranty move to the installer, but the plant still depends on the array", "Engineering checks "
"of the installer's design in phase 0; large float"],
["Low", "Solar and battery integration", "Rack voltage vs inverter window; unpublished "
"certifications; mixed-vendor warranty", "Engineering checks and certificate requests in phase "
"0; large float"]),
"certifications; mixed-vendor warranty; under PEA's zero export ~15 % of the ~640 kWp array's "
"yield is curtailed (estimate)", "Engineering checks and certificate requests in phase 0; PEA "
"interconnection approval (3 to 6 months) filed alongside procurement; large float"]),
["Low", "Cassette supply chain", pick("Blank tape and shells come from few suppliers, once the lines "
"are added", "Blank tape and shells come from few suppliers"),
"Hold stock; qualify two sources"],
@@ -383,7 +390,7 @@ 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 (~210M THB)**: the launch plant decided in October 2026, one Newbilt "
"This chapter prices **Plan B (~215M 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. ") +
@@ -409,7 +416,7 @@ def blocks():
"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", "~29M") + " THB at the midpoint); CD "
"for quotes landing high; at 15 % it would be " + pick("~24M", "~30M") + " 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 "
@@ -426,27 +433,28 @@ def blocks():
"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** builds the same "
"launch plant with everything in, none of the levers taken, at ~210M THB, within 180M plus 20 %. "
"launch plant with everything in, none of the levers taken, at ~215M THB, just within 180M plus "
"20 % (216M). "
"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",
"~208M THB (~6.30M USD): ~210M"],
["Low to high end of every block", "~127M to 226M THB", "~149M to 266M THB"],
"~216M THB (~6.53M USD): ~215M"],
["Low to high end of every block", "~127M to 226M THB", "~156M to 275M 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 "
["EBITDA, central", "1.73M USD", "1.73M USD (calculator: 2.12M against Plan A's 2.05M, no PPA "
"power bill)"],
["Operating profit, adverse case", "-0.39M USD: loses money", "-0.52M USD: loses more (more "
["Operating profit, adverse case", "-0.39M USD: loses money", "-0.54M 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)",
"~3.6 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 "
"~3.8 yr (2.7 to 4.8; calculator: 2.9 yr against Plan A's 2.4)"],
["What it gives up or takes on", "Six levers: solar through a PPA (a power bill of ~0.07M USD a "
"year), 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: "
"buys at launch what Plan A leases or defers, ~31M 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"],
"buys at launch what Plan A leases or defers, ~39M THB more (owned solar and battery, ~640 kWp on "
"every roof and canopy with no PPA bill, 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."),
@@ -454,8 +462,8 @@ 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: it buys at launch what they lease or defer, ~31M THB more "
"at the midpoint, so ~192.8M THB before the reserve and ~208M (~210M THB) with it.")]
P("Plan B takes none of these levers: it buys at launch what they lease or defer, ~39M THB more "
"at the midpoint, so ~200.6M THB before the reserve and ~216M (~215M THB) with it.")]
if a else
[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:"),
@@ -467,14 +475,16 @@ def blocks():
CALL("What decides between Plan A and Plan B", [
"**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.",
"**~31M 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 "
"**~39M THB more at launch, for what Plan A leases or buys from revenue.** Plan B owns its array "
"and keeps the whole bill saving (no PPA bill), 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.6 against ~3.1 years) and a deeper adverse corner: Plan A has the better modelled "
"**On the modelled numbers the extra earns little.** The same EBITDA in the revenue model (the "
"calculator puts Plan B ~0.07M USD a year ahead, the PPA bill its owned array avoids), more "
"depreciation, a longer payback (~3.8 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.",
"revenue; the corridor is cheaper to have from the start, and every year the array is leased "
"costs the PPA bill.",
"**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 "
@@ -488,8 +498,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: 192.8M THB at the midpoint without contingency, 202.8M to 212.8M with the "
"ramp-up reserve of 10M to 20M, 17.2M to spare under the 225M mark (180M plus 25 %)") +
"Plan B preset: 200.6M THB at the midpoint without contingency, 210.6M to 220.6M with the "
"ramp-up reserve of 10M to 20M, 9.4M 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."),
@@ -506,8 +516,8 @@ def blocks():
"**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 ~208M 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 ~266M. ") +
"Plan B's ~216M THB is the midpoint of every block with the ramp-up reserve and no buffer: at "
"15 % a contingency would add ~30M THB, and the high end of every block comes to ~275M. ") +
"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 "
@@ -523,11 +533,19 @@ def blocks():
"the band."),
"**BOI promotion.** The machinery duty and import VAT exemption applies across most of the "
"equipment blocks (~0.11M USD of duty and ~0.17M USD of import VAT cash flow on the launch plant, "
"estimates), and the automation and solar spend converts into corporate income tax exemption "
"headroom. The application precedes every purchase order. " + pick(
"The solar measure is based on the plant's own solar investment, so Plan A's solar PPA would "
"likely give that headroom up (our reading, a question for the BOI consultant).",
"Plan B owns its solar array, so it keeps the solar measure."),
"estimates), and the automation and metrology spend converts into corporate income tax exemption "
"headroom (the Smart and Sustainable Industry upgrade measure). The application precedes every "
"purchase order. Solar is not part of it in either plan: since 1 July 2025 the BOI no longer "
"promotes solar installations, rooftop or farm (Announcement 3/2568, amending the alternative-energy "
"measure of Announcement 15/2565). What that measure keeps for energy is battery storage with its "
"inverters, the eligible investment for the corporate income tax exemption capped at 12M THB per MW "
"(our reading, to confirm with the BOI consultant). " + pick(
"In Plan A the battery comes with the PPA and belongs to the installer, so the plant claims "
"nothing for it; the installer may itself be promoted as a power producer (activity 7.1.2, an "
"8-year corporate income tax exemption), and whether that shows in the PPA price is for the "
"negotiation.",
"Plan B owns the 271 kWh battery (2.0M to 3.5M THB installed), so it may qualify; the case for "
"owning the array itself is the power bill (below)."),
"**The ground.** Soft paddy soil under the building, paving and fill platform is the single largest "
"cost variable in the building package, and the cheapest to resolve: a soil boring test costs "
"THB 30k to 50k.",
@@ -538,12 +556,25 @@ def blocks():
"**Chinese suppliers: ~1 %.** Plan B prices Thai-supplied utilities. The Chinese route for the "
"boiler modules and the compressor would take ~1.9M THB off at the midpoint (Plan A takes "
"it); chillers and HVAC, the larger blocks, are not checked yet."),
pick("**Solar PPA.** The largest single lever (~9.7M THB at the midpoint) moves the array off the "
"capital budget and adds a power price to the energy line instead (~0.03M USD a year in the "
"calculator at 3.0 THB/kWh, an estimate to quote).",
"**Solar bought, not leased.** Plan B owns the array and the battery (8.0M to 11.3M THB). A "
"solar PPA would take ~9.7M THB off the price at the midpoint and add a power price to the "
"energy line instead, very likely without the BOI solar measure."),
pick("**Solar PPA.** The largest single lever (~17.5M THB at the midpoint) moves the array, ~640 kWp "
"on every roof and canopy, and the battery off the capital budget and adds a power price to the "
"energy line instead: ~760 MWh a year used on site at 3.0 THB/kWh, ~2.3M THB or ~0.07M USD a "
"year in the calculator, an estimate to quote (~21 % off the tariff; MEAei names 10 to 15 % as "
"usual, CapSolar 10 to 30 %). The plant's bill (~0.75M THB a month before solar, estimate) "
"is well above the 100,000 THB a month CapSolar asks of a PPA site.",
"**Solar bought, not leased.** Plan B owns the array, ~640 kWp on every roof and canopy, and "
"the 271 kWh battery: 14.8M to 20.1M THB (PV at 20 to 26 THB/W installed, inverters included; "
"battery 2.0M to 3.5M). Factories on PEA's grid run zero export, so ~85 % of the ~900 MWh a "
"year is used on site and the rest curtailed; the array saves ~2.8M to 3.0M THB a year and "
"pays back in ~4.2 to 5.9 years (estimates). A solar PPA would take ~17.5M THB off the price "
"at the midpoint and add a power price to the energy line instead: owned, the ~760 MWh used on "
"site save the full ~3.8 THB/kWh; through a PPA at ~3.0 THB/kWh (estimate, to quote) only ~0.8 "
"THB/kWh, so the PPA bill is ~2.3M THB (~0.07M USD) a year."),
"**The array follows the site.** ~640 kWp is what every roof and canopy carries on the Payap "
"scenario plot the calculator draws (factory roof ~523 kWp, office roof ~65 kWp, car and scooter "
"canopies ~54 kWp); on the Mueang Chi hall of section 6.2 the roof and canopies take ~300 kWp, and "
"the rest would need ground mount behind the building (which the rooftop permit exemption does not "
"cover) or the phase 2 roof (estimates).",
"**Every band narrows only with quotes.** The supplier map in the planning repository lists who to "
"ask, and the re-quotes are phase 0 work (section 14).",
]),
@@ -610,8 +641,8 @@ def blocks():
"picture. The September draft illustrated them at 20k to 60k cassettes a year at USD 2.50 to "
"4.00 and 10k to 40k CD-Rs at USD 1.50 to 3.00; estimates with no market data behind them "
"yet."),
"**Dropshipping fees** per parcel and **stamper supply to other plants** are on top and not "
"modelled.",
"**Dropshipping fees** per parcel, **stamper supply to other plants**, and **automation services "
"and the open plant stack for other pressing plants** (section 5.6) are on top and not modelled.",
]),
H2(pick("9.2 Capacity and revenue of Plan A", "9.2 Capacity and revenue of Plan B")),
@@ -696,9 +727,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 (7.47M USD) over 10 years (adverse), the midpoint (5.84M USD) over 12.5 years "
"(central) and the low end (4.22M USD) over 15 years (favourable). Payback is counted on the "
"whole plan price including the ramp-up reserve (4.52M / 6.30M / 8.07M USD from the low to the "
"the high end (7.73M USD) over 10 years (adverse), the midpoint (6.08M USD) over 12.5 years "
"(central) and the low end (4.42M USD) over 15 years (favourable). Payback is counted on the "
"whole plan price including the ramp-up reserve (4.72M / 6.53M / 8.34M USD from the low to the "
"high end).")),
_operating_table(),
CALL("Reading this table honestly", pick([
@@ -718,30 +749,32 @@ def blocks():
"column as the honest one until those lines exist.** The plan price carries no contingency either.",
"**This is a sensitivity, not a forecast.** The plant and business plan calculator's Plan A preset, "
"with its own cost build-up (it adds electric steam heat, the cutting engineer and the PPA power "
"price, ~0.03M USD a year, which this table leaves out) and the team's faster Duplex planning rate, "
"price, ~0.07M USD a year, which this table leaves out) and the team's faster Duplex planning rate, "
"at which the three presses are not Duplex-limited, gives at 850k records and 60 % specials: "
"revenue ~4.14M, EBITDA 2.04M USD, payback 2.4 years on the 161.7M THB investment in a mature "
"revenue ~4.14M, EBITDA 2.05M USD, payback 2.4 years on the 161.7M THB investment in a mature "
"year; with a ramp of 35, 70 and 90 % in the first three years and the reserve in year 0, cash "
"payback in year ~3.9, ~25 % IRR and an NPV of ~4.9M USD over ten years, pre-tax and "
"pre-financing (estimates). Not modelled here: cassette and CD-R lines (later in Plan A), stamper "
"supply to other plants, dropshipping fees, and the ramp year. BOI tax exemptions shield part of "
"supply to other plants, automation services and the open plant stack for other pressing plants "
"(section 5.6), dropshipping fees, and the ramp year. BOI tax exemptions shield part of "
"early-year profits where there are any.",
], [
"**The central case works on ~208M 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 % "
"**The central case works on ~216M THB.** EBITDA ~1.73M USD (~57M THB) and operating profit ~1.24M "
"USD (~41M THB) a year once the plant runs at volume. It breaks even on operating profit at about "
"**0.24 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 three presses make 0.58 million at that rate; the operating loss is ~18M 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 "
"cost and volume the price that covers depreciation is ~2.8 USD (~92 THB) a record (arithmetic on "
"the table), below the low price assumed: price realisation and utilisation decide solvency, not "
"upside.",
"**What the extra ~31M 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.6 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.",
"**What the extra ~39M 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.49M against "
"Plan A's 0.39M USD at the centre) and the payback (~3.8 against ~3.1 years) move. Not modelled: "
"cassette and CD-R revenue, tour and Payap revenue, stamper supply to other plants, automation "
"services and the open plant stack for other pressing plants (section 5.6), and the PPA power bill "
"the owned array avoids (~0.07M USD a year in the calculator).",
"**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 "
@@ -750,18 +783,19 @@ def blocks():
"**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) 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 192.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 "
"Duplex-limited, gives at 850k records and 60 % specials: revenue ~4.14M, EBITDA 2.12M USD, "
"payback 2.9 years on the 200.6M 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.4, ~21 % IRR and an NPV "
"of ~4.1M USD over ten years, pre-tax and pre-financing (estimates). Its EBITDA is 0.07M above "
"Plan A's 2.05M because the owned array carries no PPA power price. Not modelled here: cassette "
"and CD-R lines, stamper supply to other plants, automation services and the open plant stack for "
"other pressing plants (section 5.6), 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 ~4.3, IRR ~21 %, NPV ~4.1M USD at 10 %") +
"Plan B preset: cash payback in year ~4.4, 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 "
@@ -860,9 +894,12 @@ def blocks():
"licence scope: the most likely regulatory friction point; ZLD design in the application from "
"the start"],
pick(["Solar through the PPA (the installer builds and owns the array)", "Fit-out, ~Q2 2028",
"Large", "Not a risk; the PPA offer is phase 0 work; battery lead time is 50 to 60 days"],
["Solar and battery (purchase)", "Fit-out, ~Q2 2028", "Large", "Not a risk; battery lead time "
"is 50 to 60 days"]),
"Large", "Not a risk; the PPA offer is phase 0 work; PEA interconnection approval takes 3 to "
"6 months, filed alongside procurement; battery lead time is 50 to 60 days"],
["Solar and battery (purchase)", "Fit-out, ~Q2 2028", "Large", "Not a risk; rooftop solar "
"outside industrial estates needs no factory licence since 28 December 2024; PEA "
"interconnection approval takes 3 to 6 months, filed alongside procurement; battery lead time "
"is 50 to 60 days"]),
pick(["Cassette and CD-R lines", "Later (growth step)", "Not on the launch calendar", "Not a risk; "
"short lead "
"times"],
@@ -983,20 +1020,21 @@ 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.** ~149M to 266M THB in one round (~208M at the midpoint), "
"**More capital up front.** ~156M to 275M THB in one round (~216M at the midpoint), "
"against ~57M to 95M THB for the superseded phased entry; more of it is committed "
"before the market has validated the price.")],
pick(["**Six levers, no machine dropped.** The levers bring the whole chain to ~180M THB, and the "
"second Duplex waits for demand and revenue on a reserved floor.",
"**What the levers give up.** Owned solar and very likely the BOI solar measure, public tours "
"**What the levers give up.** Owned solar (a PPA bill of ~0.07M USD a year instead), 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."],
["**Everything in at launch.** Owned solar with the BOI solar measure, the full metrology stack "
["**Everything in at launch.** Owned solar on every roof and canopy (~640 kWp) with no PPA "
"bill, 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.",
"**~31M THB more that the model does not repay.** The same EBITDA as Plan A with more "
"depreciation and a longer payback (~3.6 against ~3.1 years); the adverse case still loses "
"**~39M THB more that the model does not repay.** The same EBITDA as Plan A with more "
"depreciation and a longer payback (~3.8 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 "
@@ -1049,7 +1087,7 @@ 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", "~52M THB of Plan B's ~208M") +
"~44M THB of Plan A's ~177M", "~54M THB of Plan B's ~216M") +
" (arithmetic, before financing costs).",
"**A shareholders' agreement** covering board composition, reserved matters (capital calls and "
"tranche releases, the growth options such as a second Duplex, CD replication), pre-emption and transfer, information rights, and the founders' roles and "
@@ -1088,7 +1126,11 @@ def blocks():
"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",
"whether the battery would qualify for BOI as battery storage (12M THB per MW cap, Announcement "
"3/2568) if bought instead of leased with the PPA; ",
"whether the battery qualifies for BOI as battery storage (12M THB per MW cap, Announcement "
"3/2568); ") +
"Payap R&D", "Simona", "USD 5k to 15k",
"Sequencing, scope"],
["3", "Thai counsel: lease heads of terms (term, renewal, building ownership, assignment) and zoning "
"of the chosen plot for pressing, a steam boiler and electroplating; company and shareholder "
@@ -1148,21 +1190,23 @@ 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 ~210M THB** (~208M at the midpoint, the ramp-up "
"A commitment in principle to **Plan B at ~215M THB** (~216M 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 ~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 ~149M to "
"266M THB. The Newbilt re-quote, the Pheenix quote, the building quote with the soil test, "
"with the financing mix set to hold debt-to-equity at or below 3:1 (equity of at least ~54M "
"THB). Told plainly: the price carries no contingency (at 15 % it would be ~30M THB more at "
"the midpoint), and from the low to the high end of every block the plan comes to ~156M to "
"275M 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, "
"levers, the solar PPA first (~17.5M THB off the price for a power bill of ~0.07M USD a year); "
"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; the ~31M "
"THB of items Plan A leases or defers (owned solar with the BOI solar measure, the full "
"The equity and debt mix, and how quotes landing above the plan price are funded; the ~39M "
"THB of items Plan A leases or defers (owned solar on every roof and canopy with no PPA bill, "
"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 "
@@ -1180,8 +1224,10 @@ def blocks():
], 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; ",
"the BOI consultant's reading of the solar measure on the owned array; ") +
"soil result; " + pick("the solar PPA offer, with whether the installer's own BOI promotion shows in "
"its price; ",
"the BOI consultant's reading on the battery (battery storage, capped at 12M THB "
"per MW); ") +
"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 "
@@ -1200,7 +1246,7 @@ 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 ~210M THB, "
"block; 'Two plans': Plan A at ~180M and Plan B at ~215M 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 "
@@ -1231,6 +1277,12 @@ def blocks():
["digital-factory.md (demos plant-operation.html, factory-console.html)", "Data platform: ERPNext "
"as the only system of record, machine data, the factory application, the "
"NixOS fleet; the plant overview and factory console demos (Figures 2 to 4)"],
["digital-factory.md, 'Open source throughout, and working with other plants'", "Open source and "
"services to other plants: every server on NixOS, declared in one clan repository; ERPNext on "
"Frappe and the open machine-data stack; our own code published as open source; the closed "
"exceptions (firmware and HMIs inside the machines and instruments); and, later, automation "
"services and an open plant stack for other pressing plants (section 5.6; not in this plan's "
"revenue)"],
["artist-platform.md (demos artist-order.html, make-a-record.html)", "Upload and itemised price "
"calculator, fan-funded "
"campaigns, the record "
@@ -1242,6 +1294,15 @@ def blocks():
["sustainability.md, biomass.md, steam-cooling.html", "Solar, heat recovery, water, zero discharge, "
"the grid tariff; the biomass fuel strategy; "
"the steam and cooling plant"],
["sustainability.md ('What ~640 kWp means on the grid'), finance/utilities-investment.csv (solar "
"rows), boi.md", "Solar on every roof and canopy (~640 kWp) and its sources: the installed price of "
"20 to 26 THB/W (DEDE's Thailand PV Status survey, CapSolar 2026, Saimai Solar's 2026 list); zero "
"export for factories on PEA's grid (CapSolar, rooftop solar regulations, 2026; Sahawatthanakit, "
"2026); the permits (Ministerial Regulation No. 3 B.E. 2567, in force 28 December 2024; ERC's "
"1,000 kVA line; PEA interconnection; CapSolar, factory solar and the RG.4 permit, 2026); the BOI: "
"no promotion for solar installations since 1 July 2025, battery storage kept at a 12M THB per MW "
"cap (Announcement 3/2568; B Global Law, 18 January 2026; Smarter Energy Solution, 2026), and a PPA "
"developer's own promotion under activity 7.1.2 (CapSolar, BOI solar incentives, 2026)"],
["facility-security.md, worker-safety.md", "Climate control, security, fire and life safety, the "
"archive room; training, clean rooms, PPE"],
["crane-workshop-tours.md", "Overhead crane, maintenance workshop, visitor corridor"],
+2 -2
View File
@@ -1,7 +1,7 @@
"""Which version of the business plan is being built (October 2026).
Plan A, ~180M THB: the launch plant (1 Duplex system + 1 Classic, every machine) with six cost levers.
Plan B, ~210M THB: the same launch plant with everything in (none of the six levers).
Plan B, ~215M 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": "~210M THB"}
PRICE = {"A": "~180M THB", "B": "~215M THB"}
def is_a() -> bool:
+44
View File
@@ -35,6 +35,50 @@ rows, instrument raw files and images, audio captures. That stays in the
machine-data store on the plant core, keyed to ERPNext's document names
([ERPNext](#erpnext-the-plants-erp)).
## Open source throughout, and working with other plants
Decided (user, 17 October 2026): **everything the plant runs and
everything we build is open source**, and our own code is published.
| Layer | What runs | Licence |
|---|---|---|
| Operating system and deployment | NixOS on every server, gateway, collector and kiosk, declared in the cnx-network clan (clan-core) | nixpkgs: MIT |
| System of record | ERPNext on the Frappe framework, self-hosted ([ERPNext](#erpnext-the-plants-erp)) | ERPNext: GPLv3; Frappe: MIT |
| Machine data | PostgreSQL, VictoriaMetrics, Grafana, Mosquitto (MQTT), Telegraf | PostgreSQL licence, Apache-2.0, AGPLv3, EPL-2.0, MIT |
| Edge and backup | Caddy, BorgBackup, ZFS | Apache-2.0, BSD, CDDL |
| Our applications | the factory application (`cnx-factory`, Rust: axum, SQLx, minijinja, HTMX), the plant overview, the artist platform (name undecided), the plant and business plan calculator, instrument adapters, NixOS modules | ours, to be published |
| Design and documents | FreeCAD for the plant model, python-docx and LibreOffice for the business plan | LGPL, MIT, MPL-2.0 |
- **Our licence is a decision point.** AGPL-3.0 keeps hosted copies of the
factory application open; Apache-2.0 or MIT is the easiest for another
plant to adopt. Decide before the first public release.
- **The exceptions are inside the machines.** The presses' PLCs and HMIs
(Newbilt's Siemens, Pheenix's Beckhoff), the instruments (Keyence, the
vision controllers), inverter and battery firmware and the vendors'
OPC UA licences are closed. They are appliances: they export data into
the NixOS estate and host none of our services. The fleet's access-point
controller in the router module is closed too.
- **What it gives the plant:** no licence fees (ERPNext has no per-seat
fee), no vendor lock-in, every machine rebuilt from the repository, and
a record a customer can audit (the hash-chained event log).
**Later: a service for other pressing plants.** Once the plant has run
the stack in production (at least a year), it can be offered to other
plants around the world:
1. **An open vinyl plant stack**: the NixOS modules, an ERPNext app for
pressing (stampers and their genealogy, test pressings, the three
gates), the press adapters for Newbilt and Pheenix over OPC UA, S7 or
ADS, the kiosk and QC tools.
2. **Services**: factory automation and data acquisition for another
plant (integration and commissioning), remote monitoring and support,
hosting of ERPNext and the factory application, training.
3. **Shared development**: each plant that joins contributes the adapters
for its own machines, so the stack covers more presses over time.
None of this is in the business plan's revenue: no price or volume is
set, and it is an upside like stamper supply to other plants.
## What the fleet already provides
Read the clan's own runbook (`docs/` in the repo, served on `control`) for
+22 -20
View File
@@ -669,9 +669,9 @@ What it says:
## Operating pictures of Plan A and Plan B (October 2026)
The business plan comes in two versions
([total investment](total-investment.md#two-plans-a-at-180m-thb-and-b-at-210m-thb-october-2026)):
([total investment](total-investment.md#two-plans-a-at-180m-thb-and-b-at-215m-thb-october-2026)):
**Plan A** (~177M THB, the launch plant with six cost levers) and
**Plan B** (~208M THB, the same launch plant with everything in), both
**Plan B** (~216M THB, the same launch plant with everything in), both
priced without contingency and with the ramp-up reserve. Both run the
same three presses, so volume, price, direct cost, title services and
overheads are those of the launch-plant table above; only the
@@ -679,14 +679,14 @@ depreciation follows each plan's capital (estimates):
- **Plan A**: the high end of its blocks (6.25M USD) over 10 years, the
midpoint (4.90M USD) over 12.5, the low end (3.56M USD) over 15. The
solar PPA adds its power price to the energy line (~0.03M USD a year in
the calculator), not shown here.
- **Plan B**: 7.47M USD over 10 years, 5.84M over 12.5, 4.22M over 15.
Its owned solar saves the PPA power bill; cassette and CD-R sales, tours
solar PPA adds its power price to the energy line (~0.07M USD a year in
the calculator for the ~640 kWp array), not shown here.
- **Plan B**: 7.73M USD over 10 years, 6.08M over 12.5, 4.42M over 15.
Its owned solar (~640 kWp, every roof and canopy) saves the PPA power bill; cassette and CD-R sales, tours
and the Payap programmes it opens from the start are not modelled.
- **Payback** is counted on the whole plan price including the ramp-up
reserve (Plan A 3.86M / 5.35M / 6.85M USD, Plan B 4.52M / 6.30M /
8.07M USD from the low to the high end).
reserve (Plan A 3.86M / 5.35M / 6.85M USD, Plan B 4.72M / 6.53M /
8.34M USD from the low to the high end).
| USD/yr | A adverse | A central | A favourable | B adverse | B central | B favourable |
|---|---|---|---|---|---|---|
@@ -697,10 +697,10 @@ depreciation follows each plan's capital (estimates):
| Title-services contribution | 0.07M | 0.23M | 0.48M | 0.07M | 0.23M | 0.48M |
| Cash overheads | 0.45M | 0.33M | 0.20M | 0.45M | 0.33M | 0.20M |
| **EBITDA** | **0.23M** | **1.73M** | **3.79M** | **0.23M** | **1.73M** | **3.79M** |
| Depreciation | 0.62M | 0.39M | 0.24M | 0.75M | 0.47M | 0.28M |
| **Operating profit** | **-0.39M** | **1.34M** | **3.55M** | **-0.52M** | **1.26M** | **3.51M** |
| Depreciation | 0.62M | 0.39M | 0.24M | 0.77M | 0.49M | 0.29M |
| **Operating profit** | **-0.39M** | **1.34M** | **3.55M** | **-0.54M** | **1.24M** | **3.50M** |
| Revenue | 2.28M (~75M THB) | 3.65M (~120M THB) | 5.41M (~179M THB) | 2.28M (~75M THB) | 3.65M (~120M THB) | 5.41M (~179M THB) |
| Payback on the plan price (EBITDA, mature year) | ~30 yr | ~3.1 yr (2.2 to 4.0) | ~1.0 yr | ~35 yr | ~3.6 yr (2.6 to 4.7) | ~1.2 yr |
| Payback on the plan price (EBITDA, mature year) | ~30 yr | ~3.1 yr (2.2 to 4.0) | ~1.0 yr | ~36 yr | ~3.8 yr (2.7 to 4.8) | ~1.2 yr |
What it says:
@@ -708,14 +708,16 @@ What it says:
year**; its adverse corner still loses money, because it would need
~0.9 million records to cover depreciation and the three presses make
0.58 million at that rate.
- **Plan B** breaks even at **~0.23 million records**, and its adverse
- **Plan B** breaks even at **~0.24 million records**, and its adverse
corner loses more (~1.1 million records needed to cover depreciation).
At the central cost and volume the price that covers its depreciation
is ~2.8 USD (~91 THB) a record.
- **On these numbers Plan B's extra ~31M THB earns nothing**: the same
EBITDA, more depreciation and a longer payback. Its case rests on what
the table leaves out: the BOI solar measure on the owned array, the
PPA power bill it avoids, full stamper metrology from the first
is ~2.8 USD (~92 THB) a record.
- **On these numbers Plan B's extra ~39M THB earns little**: the same
EBITDA here (the calculator, which splits energy by plan, puts it ~0.07M
USD a year ahead for the PPA bill the owned array avoids), more
depreciation and a longer payback. Its case rests on what
the table leaves out: the PPA power bill it avoids (the BOI no longer
promotes solar installations since July 2025), full stamper metrology from the first
release, tours, the Payap programmes, and cassette and CD-R sales.
- **The caveats above hold for both:** a central EBITDA margin of ~47 %
is far above the 15 to 25 % pressing plants earn, the cost of specials
@@ -724,10 +726,10 @@ What it says:
The [calculator](../fleet-calculator.html) presets, at the team's
planning rates (3 records a minute per Duplex system) and its own cost
build-up, give at 850k records: **Plan A** EBITDA 2.04M USD, payback 2.4
build-up, give at 850k records: **Plan A** EBITDA 2.05M USD, payback 2.4
years on the investment, cash payback in year ~3.9 and ~25 % IRR over ten
years with the reserve in year 0; **Plan B** EBITDA 2.07M USD, payback 2.8
years, cash payback in year ~4.3 and ~21 % IRR (pre-tax, pre-financing,
years with the reserve in year 0; **Plan B** EBITDA 2.12M USD, payback 2.9
years, cash payback in year ~4.4 and ~21 % IRR (pre-tax, pre-financing,
estimates).
## Operating picture at full capacity (five-press fleet)
+34 -26
View File
@@ -51,7 +51,7 @@ on two shifts (estimate: the [scale](../scale.md) basis gives ~0.71 to
| Cutting room: Sillitoe SDMS, spare cutterhead and support, mastering console and chain, monitoring, room build-out | 200k – 350k | 6.6M – 11.6M | SDMS list price USD 125k (ex tax and shipping); the rest estimate |
| Metrology and QC stack (XRF, laser confocal, wide-area profiler, inline vision on three presses, audio station) | 350k – 810k | 11.6M – 26.7M | estimate, phaseable ([quality automation](../quality-automation.md)) |
| PVC lab, day-one tier | 55k – 150k | 1.8M – 5.0M | estimate, [quality automation](../quality-automation.md) |
| Utilities, solar, battery, HVAC, clean zones, racking | 835k – 1,439k | 27.6M – 47.5M | [utilities CSV](utilities-investment.csv) baseline re-sized for three presses: chiller bank two modules instead of three; solar at 20 to 26 THB/W installed and the battery installed (Thai market prices checked October 2026, sources in the CSV) |
| Utilities, solar, battery, HVAC, clean zones, racking | 1,042k – 1,707k | 34.4M – 56.3M | [utilities CSV](utilities-investment.csv) baseline re-sized for three presses: chiller bank two modules instead of three; PV on every roof and canopy (~640 kWp, user decision 17 October 2026) at 20 to 26 THB/W installed and the battery installed (Thai market prices checked October 2026, sources in the CSV) |
| Building ~1,500 m² plus civil and site works | 650k – 1,100k | 21.4M – 36.3M | estimate at 12,000 – 20,000 THB/m² plus ~20 % site works; soil is the main variable |
| Overhead crane, runway, frame premium, machine door | 97k – 227k | 3.2M – 7.5M | estimate, [crane, workshop and tours](../crane-workshop-tours.md) |
| Maintenance workshop and machine bay fit-out | 30k – 76k | 1.0M – 2.5M | estimate, same |
@@ -61,9 +61,9 @@ on two shifts (estimate: the [scale](../scale.md) basis gives ~0.71 to
| Cassette duplication and CD-R duplication | 55k – 190k | 1.8M – 6.3M | estimate, business plan sections 4.8 and 4.9 |
| Freight, installation, commissioning, training (Pheenix, Sibert, Sillitoe, Newbilt beyond its quoted 5 days) | 150k – 300k | 5.0M – 9.9M | estimate |
| Working capital, PVC stock, spares, lease deposit, first-year rent | 135k – 290k | 4.5M – 9.6M | estimate; land is leased, so no land purchase |
| Subtotal | ~4.22M – 7.47M | ~139M – 246M | midpoint ~5.84M USD, ~193M THB |
| Contingency 15 % | ~0.63M – 1.12M | ~21M – 37M | |
| **Total, launch plant** | **~4.85M – 8.6M USD** | **~160M – 283M THB** | midpoint ~6.72M USD, ~222M THB |
| Subtotal | ~4.42M – 7.73M | ~146M – 255M | midpoint ~6.08M USD, ~201M THB |
| Contingency 15 % | ~0.66M – 1.16M | ~22M – 38M | |
| **Total, launch plant** | **~5.1M – 8.9M USD** | **~168M – 294M THB** | midpoint ~6.99M USD, ~231M THB |
Not in the total: a **reserve for the ramp-up** (staff hired before first
revenue, overheads until volume covers them; ~10M to 20M THB, estimate),
@@ -78,7 +78,7 @@ import VAT paid at the border and reclaimed later (estimates).
### The investor's question: 180M THB, maybe 20 % more (October 2026)
*Superseded by [Two plans](#two-plans-a-at-180m-thb-and-b-at-210m-thb-october-2026)
*Superseded by [Two plans](#two-plans-a-at-180m-thb-and-b-at-215m-thb-october-2026)
below. Written against the earlier Pheenix estimate (USD 320k to 650k,
total ~227M THB at the midpoint); its galvanics lever is now the base
price.*
@@ -131,7 +131,7 @@ building RFQ with a soil test, and distributor quotes for the metrology
stack. Until they are in, quote **~216M THB** to the investor as the
target with the levers above, and 180M as the low-quote case.
## Two plans: A at ~180M THB and B at ~210M THB (October 2026)
## Two plans: A at ~180M THB and B at ~215M THB (October 2026)
Decided (user, October 2026): the business plan comes in **two
versions** for the investor, built from the same documents:
@@ -139,12 +139,16 @@ versions** for the investor, built from the same documents:
- **Plan A, ~180M THB**: the launch plant with every machine decided
above (one Duplex system, one Classic, galvanics, Sibert, the cutting
room), brought down with six cost levers.
- **Plan B, ~210M THB**: the same launch plant, one Duplex system and
- **Plan B, ~215M THB**: the same launch plant, one Duplex system and
one Classic, with everything in: none of Plan A's six levers taken.
First drawn as five presses at ~225M THB (Plan A plus 25 %); re-defined
by the user on 17 October 2026 ("plan b should also only start with 1
duplex and 1 classic, but with all levers"). In both plans the second
Duplex system is a growth step from revenue.
Duplex system is a growth step from revenue. On 17 October 2026 the
solar array was sized to every roof and canopy (~640 kWp, "use as much
roof space as possible"); that raised Plan B from ~208M to ~216M and
Plan A's solar lever from ~9.7M to ~17.5M, and left Plan A's price as
it was, because Plan A leases the array.
Both are priced **without contingency** (user decision) and **with the
ramp-up reserve**, because the reserve is cash the investor puts in
@@ -153,8 +157,8 @@ reference plus 20 % in both. Midpoints, estimates:
| Plan A: launch plant with six levers | Saves | Subtotal after it |
|---|---|---|
| Launch plant, every block, no contingency | | ~192.8M THB (~5.84M USD) |
| Rooftop solar and battery through a solar PPA (the installer owns and finances the array, the plant buys the power) | ~9.7M | ~183.1M |
| Launch plant, every block, no contingency | | ~200.6M THB (~6.08M USD) |
| Solar (~640 kWp on every roof and canopy) and battery through a solar PPA (the installer owns and finances the array, the plant buys the power) | ~17.5M | ~183.1M |
| Metrology launch tier: XRF, inline vision and audio station at launch; laser confocal and wide-area profiler (USD 180k to 350k) bought from revenue | ~8.8M | ~174.4M |
| Visitor corridor built later; no public tours at first | ~3.6M | ~170.8M |
| Cassette and CD-R duplication later | ~4.0M | ~166.8M |
@@ -165,14 +169,14 @@ reference plus 20 % in both. Midpoints, estimates:
| Plan B: the launch plant, everything in | USD | THB |
|---|---|---|
| Launch plant, every block, no contingency (the six lever items included: owned solar and battery ~9.7M, full metrology ~8.8M, visitor corridor ~3.6M, cassette and CD-R ~4.0M, bought crane ~3.2M, Thai boilers and compressor ~1.9M, together ~31M THB at the midpoint) | 4.22M – 7.47M | ~139M – 246M, **~192.8M (~5.84M USD)** at the midpoint |
| Launch plant, every block, no contingency (the six lever items included: owned solar (~640 kWp) and battery ~17.5M, full metrology ~8.8M, visitor corridor ~3.6M, cassette and CD-R ~4.0M, bought crane ~3.2M, Thai boilers and compressor ~1.9M, together ~39M THB at the midpoint) | 4.42M – 7.73M | ~146M – 255M, **~200.6M (~6.08M USD)** at the midpoint |
| Ramp-up reserve | | +10M to 20M |
| **Plan B** | | **~208M THB (~6.30M USD): ~210M**, ~149M to 266M from the low to the high end of every block |
| **Plan B** | | **~216M THB (~6.53M USD): ~215M**, ~156M to 275M from the low to the high end of every block |
Plan B costs ~31M THB (~18 %) more than Plan A and, at the midpoint,
stays within the investor's 180M THB plus 20 % (its high end, ~266M, does
not). It keeps what Plan A leases or defers:
owned solar and battery (and with them the BOI solar measure), the full
Plan B costs ~39M THB (~22 %) more than Plan A and, at the midpoint,
stays just within the investor's 180M THB plus 20 % (216M; its high end,
~275M, does not). It keeps what Plan A leases or defers:
owned solar on every roof and canopy and the battery, the full
metrology stack from the first release, the visitor corridor and tours
from the start, cassette and CD-R, the bought crane, Thai-supplied
utilities with local service. Both plans have the same three presses and
@@ -186,22 +190,26 @@ both as presets.
- **Contingency.** The blocks are budgetary (plus or minus 30 to 50 % on
the estimates, top of this page), so the plans carry no buffer for
quotes landing high. At this page's 15 % that would be ~24M THB on
Plan A and ~29M on Plan B at the midpoint.
Plan A and ~30M on Plan B at the midpoint.
- The central hydraulic plant (not costed yet), the archive's mobile
shelving (to quote), CD replication, financing costs, currency moves,
and Thai duty and import VAT (the blocks assume BOI promotion).
**What decides between them:** not demand, since both make the same
records, but whether the investor funds ~31M THB more at launch for what
records, but whether the investor funds ~39M THB more at launch for what
Plan A leases or buys from revenue. On the modelled numbers Plan B's
extra earns nothing (same EBITDA, more depreciation, a longer payback);
its case rests on what the operating table leaves out: the BOI solar
measure (only an owned array qualifies), full stamper metrology for the
traceability pitch from the first release, tours and the Payap
programmes from day one, cassette and CD-R sales, and utilities with
local service. Most of Plan B's items can be added to Plan A later from
revenue; the solar measure and the corridor are cheaper to have from
the start. Both plans keep the second Duplex as a growth step, with its
extra earns little: the same EBITDA in the revenue model (the calculator
puts Plan B ~0.07M USD a year ahead, the PPA power bill its owned array
avoids), more depreciation and a longer payback;
its case rests on that bill and on what the operating table leaves out:
full stamper metrology for the traceability pitch from the first release,
tours and the Payap programmes from day one, cassette and CD-R sales, and
utilities with local service. The BOI no longer promotes solar
installations (Announcement 3/2568, in force 1 July 2025; only the
battery may still qualify, see [BOI](../boi.md)), so owning the array
earns no tax benefit, only the bill. Most of Plan B's items can be added
to Plan A later from revenue; the corridor is cheaper to have from the
start. Both plans keep the second Duplex as a growth step, with its
floor, utility positions and ring-main tees reserved: ~15.4M THB at the
midpoint for the system (~8.7M), a third chiller module CH-3 (~2.1M),
their freight and installation (~1.2M) and the working capital for the
+2 -2
View File
@@ -13,6 +13,6 @@ water,Galvanics ZLD evaporator,"Small MVR or low-temp vacuum evaporator for plat
storage,Pallet racking and shelving,"100-200 pallet positions selective/heavy-duty (beams sized 1000-1500 kg/pallet, records are dense) + archive and finished-goods shelving, installed","Jenbunjerd; LPI Rack Range (Thailand), Bangkok/Samut Prakan, racking and office mobile shelving; local fabricators (Sahawatthanakit, UPR, SD Shelf); SSI Schaefer (premium)",800000,1500000,published list prices + engineering estimate,SSI Schaefer premium tier ~1.5-3M for same scope; ~1000-2000 THB per pallet position at local tier
hvac,Whole-factory HVAC,"~1500 m2 at 20-26 C, 35-60% RH, ePM1/F7-F9 filtration sized for burning-season PM2.5, ducting and controls","Daikin Thailand; Trane; Mitsubishi Electric; Carrier; filtration: Camfil Thailand, AAF",7500000,15000000,engineering estimate at 5000-10000 THB/m2,"RH low end of 35% is aggressive for tropics and drives desiccant cost; if 45-60% RH acceptable, cost drops materially"
hvac,Clean-room-grade zone adder,"Cutting room + galvanics clean room, ~2 x 60 m2, ISO 7/8 with HEPA terminals, positive pressure, airlocks",Same HVAC vendors + clean-room contractors; Camfil HEPA,1200000,3400000,engineering estimate at 10000-28000 THB/m2 adder,Applied only to the two tight zones
solar,PV rooftop EPC (illustrative 300 kWp),"Turnkey C&I rooftop EPC incl. Deye hybrid inverters, at 20000-26000 THB/kWp",Solar Nicolo (Deye tier-1 distributor); Banpu NEXT; SCG Cleanergy; Sermsang; CapSolar; local Chiang Mai installers,6000000,7800000,"market rate per kWp (October 2026 check): DEDE Thailand PV Status (Mahidol survey) 22-25 THB/W for 10 kW-1 MW C&I systems in 2023; CapSolar 2026 20-25 THB/W under 1 MWp (20-23 at 500 kWp); Saimai Solar 2026 list 5.4M THB for 300 kW (18 THB/W); top of range covers Deye SUN-50K-SG01HP3 hybrid inverters (160,500 THB each at Supsaringkan, six units); size illustrative","Final kWp open until site selection; canopy PV over parking needs its own steel structure (not priced); PEA TOU 3.2.2 plus Ft (Sep-Dec 2026): self-consumed PV worth ~3.7 THB/kWh, ~3.8-5.4 yr payback (sustainability.md, grid tariff)"
solar,"PV EPC, every roof and canopy covered (~640 kWp on the Payap scenario plot)","Turnkey C&I EPC on the factory roof (~523 kWp), the office roof (~65 kWp) and the car and scooter canopies (~54 kWp), incl. inverters (Deye hybrids where the battery connects), at 20000-26000 THB/kWp",Solar Nicolo (Deye tier-1 distributor); Banpu NEXT; SCG Cleanergy; Sermsang; CapSolar; local Chiang Mai installers,12800000,16640000,"market rate per kWp (October 2026 check): DEDE Thailand PV Status (Mahidol survey) 22-25 THB/W for 10 kW-1 MW C&I systems in 2023; CapSolar 2026 20-25 THB/W under 1 MWp (20-23 at 500 kWp); Saimai Solar 2026 list 5.4M THB for 300 kW (18 THB/W); top of range covers Deye SUN-50K-SG01HP3 hybrid inverters (160,500 THB each at Supsaringkan, about ten 50 kW units for ~500 kVA); size: the roofs full, user decision 17 Oct 2026 (was an illustrative 300 kWp)","Size follows the site: on the Mueang Chi hall the roof and canopies take ~300 kWp (scale.md), the rest would be ground mount; canopy steel is in the construction RFQ site works; ~85% of the yield used on site under PEA zero export (hourly sketch, estimate); self-consumed PV worth ~3.7 THB/kWh, ~4.2-5.9 yr payback (sustainability.md, grid tariff)"
solar,Battery stack 271 kWh (Gobel) installed,"GP-SRA-HV314 HV LiFePO4 rack, 15 x 18 kWh packs, direct from Shenzhen, 50-60 day lead; plus enclosure, fire detection and suppression, controls and installation",Gobel Power (no Thai distributor; integration by solar EPC),2000000,3500000,"battery: vendor listed price USD 39900-58000 at ~35 THB/USD = 1.40-2.03M THB, in line with DEDE's 5000-7000 THB/kWh for LiFePO4 (Mahidol survey); installed: estimate below CapSolar's 12000-15000 THB/kWh for a fully installed factory BESS (2026), because the Deye hybrid inverters in the PV row do the power conversion",Confirm Deye BMS protocol compatibility and that the EPC warrants a mixed-vendor DC bus; certs (UN38.3/IEC 62619/CE) to be requested
total,BASELINE TOTAL,Electric steam bank (2 modules) + oil-injected air + chiller bank (2 modules) + softener + loop treatment + local racking + HVAC + clean zones + 300 kWp solar + 271 kWh BESS,,27570000,47500000,sum of baseline rows,"Launch plant, one Duplex system and one Classic (October 2026; solar and battery re-priced from Thai market data 17 Oct 2026, was 28.47M-48.73M; was 30.07M-51.33M THB for five presses, 23.98M-41.63M for one Duplex); ~750k-1280k EUR at 38 THB/EUR; excludes options rows and the galvanics water rows (ZLD, DI), which total-investment.md carries with galvanics; all figures budgetary +/- 30%, get RFQs before BOI"
total,BASELINE TOTAL,Electric steam bank (2 modules) + oil-injected air + chiller bank (2 modules) + softener + loop treatment + local racking + HVAC + clean zones + ~640 kWp solar + 271 kWh BESS,,34370000,56340000,sum of baseline rows,"Launch plant, one Duplex system and one Classic (October 2026; solar and battery re-priced from Thai market data and the array sized to every roof and canopy 17 Oct 2026, was 27.57M-47.50M at 300 kWp and 28.47M-48.73M before the re-price; was 30.07M-51.33M THB for five presses, 23.98M-41.63M for one Duplex); ~750k-1280k EUR at 38 THB/EUR; excludes options rows and the galvanics water rows (ZLD, DI), which total-investment.md carries with galvanics; all figures budgetary +/- 30%, get RFQs before BOI"
1 category item spec_summary candidate_thai_suppliers cost_low_thb cost_high_thb cost_basis notes
13 storage Pallet racking and shelving 100-200 pallet positions selective/heavy-duty (beams sized 1000-1500 kg/pallet, records are dense) + archive and finished-goods shelving, installed Jenbunjerd; LPI Rack Range (Thailand), Bangkok/Samut Prakan, racking and office mobile shelving; local fabricators (Sahawatthanakit, UPR, SD Shelf); SSI Schaefer (premium) 800000 1500000 published list prices + engineering estimate SSI Schaefer premium tier ~1.5-3M for same scope; ~1000-2000 THB per pallet position at local tier
14 hvac Whole-factory HVAC ~1500 m2 at 20-26 C, 35-60% RH, ePM1/F7-F9 filtration sized for burning-season PM2.5, ducting and controls Daikin Thailand; Trane; Mitsubishi Electric; Carrier; filtration: Camfil Thailand, AAF 7500000 15000000 engineering estimate at 5000-10000 THB/m2 RH low end of 35% is aggressive for tropics and drives desiccant cost; if 45-60% RH acceptable, cost drops materially
15 hvac Clean-room-grade zone adder Cutting room + galvanics clean room, ~2 x 60 m2, ISO 7/8 with HEPA terminals, positive pressure, airlocks Same HVAC vendors + clean-room contractors; Camfil HEPA 1200000 3400000 engineering estimate at 10000-28000 THB/m2 adder Applied only to the two tight zones
16 solar PV rooftop EPC (illustrative 300 kWp) PV EPC, every roof and canopy covered (~640 kWp on the Payap scenario plot) Turnkey C&I rooftop EPC incl. Deye hybrid inverters, at 20000-26000 THB/kWp Turnkey C&I EPC on the factory roof (~523 kWp), the office roof (~65 kWp) and the car and scooter canopies (~54 kWp), incl. inverters (Deye hybrids where the battery connects), at 20000-26000 THB/kWp Solar Nicolo (Deye tier-1 distributor); Banpu NEXT; SCG Cleanergy; Sermsang; CapSolar; local Chiang Mai installers 6000000 12800000 7800000 16640000 market rate per kWp (October 2026 check): DEDE Thailand PV Status (Mahidol survey) 22-25 THB/W for 10 kW-1 MW C&I systems in 2023; CapSolar 2026 20-25 THB/W under 1 MWp (20-23 at 500 kWp); Saimai Solar 2026 list 5.4M THB for 300 kW (18 THB/W); top of range covers Deye SUN-50K-SG01HP3 hybrid inverters (160,500 THB each at Supsaringkan, six units); size illustrative market rate per kWp (October 2026 check): DEDE Thailand PV Status (Mahidol survey) 22-25 THB/W for 10 kW-1 MW C&I systems in 2023; CapSolar 2026 20-25 THB/W under 1 MWp (20-23 at 500 kWp); Saimai Solar 2026 list 5.4M THB for 300 kW (18 THB/W); top of range covers Deye SUN-50K-SG01HP3 hybrid inverters (160,500 THB each at Supsaringkan, about ten 50 kW units for ~500 kVA); size: the roofs full, user decision 17 Oct 2026 (was an illustrative 300 kWp) Final kWp open until site selection; canopy PV over parking needs its own steel structure (not priced); PEA TOU 3.2.2 plus Ft (Sep-Dec 2026): self-consumed PV worth ~3.7 THB/kWh, ~3.8-5.4 yr payback (sustainability.md, grid tariff) Size follows the site: on the Mueang Chi hall the roof and canopies take ~300 kWp (scale.md), the rest would be ground mount; canopy steel is in the construction RFQ site works; ~85% of the yield used on site under PEA zero export (hourly sketch, estimate); self-consumed PV worth ~3.7 THB/kWh, ~4.2-5.9 yr payback (sustainability.md, grid tariff)
17 solar Battery stack 271 kWh (Gobel) installed GP-SRA-HV314 HV LiFePO4 rack, 15 x 18 kWh packs, direct from Shenzhen, 50-60 day lead; plus enclosure, fire detection and suppression, controls and installation Gobel Power (no Thai distributor; integration by solar EPC) 2000000 3500000 battery: vendor listed price USD 39900-58000 at ~35 THB/USD = 1.40-2.03M THB, in line with DEDE's 5000-7000 THB/kWh for LiFePO4 (Mahidol survey); installed: estimate below CapSolar's 12000-15000 THB/kWh for a fully installed factory BESS (2026), because the Deye hybrid inverters in the PV row do the power conversion Confirm Deye BMS protocol compatibility and that the EPC warrants a mixed-vendor DC bus; certs (UN38.3/IEC 62619/CE) to be requested
18 total BASELINE TOTAL Electric steam bank (2 modules) + oil-injected air + chiller bank (2 modules) + softener + loop treatment + local racking + HVAC + clean zones + 300 kWp solar + 271 kWh BESS Electric steam bank (2 modules) + oil-injected air + chiller bank (2 modules) + softener + loop treatment + local racking + HVAC + clean zones + ~640 kWp solar + 271 kWh BESS 27570000 34370000 47500000 56340000 sum of baseline rows Launch plant, one Duplex system and one Classic (October 2026; solar and battery re-priced from Thai market data 17 Oct 2026, was 28.47M-48.73M; was 30.07M-51.33M THB for five presses, 23.98M-41.63M for one Duplex); ~750k-1280k EUR at 38 THB/EUR; excludes options rows and the galvanics water rows (ZLD, DI), which total-investment.md carries with galvanics; all figures budgetary +/- 30%, get RFQs before BOI Launch plant, one Duplex system and one Classic (October 2026; solar and battery re-priced from Thai market data and the array sized to every roof and canopy 17 Oct 2026, was 27.57M-47.50M at 300 kWp and 28.47M-48.73M before the re-price; was 30.07M-51.33M THB for five presses, 23.98M-41.63M for one Duplex); ~750k-1280k EUR at 38 THB/EUR; excludes options rows and the galvanics water rows (ZLD, DI), which total-investment.md carries with galvanics; all figures budgetary +/- 30%, get RFQs before BOI
+39 -27
View File
@@ -599,7 +599,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
presses, an EX 50 and an EX 35 colour extruder each) and Newbilt Classic
automatic presses, starting from the launch plant: one Duplex system and one
Classic. It builds the investment from the blocks in total-investment.md,
checks it against 180M THB and 180M plus 25 % (Plan A ~180M, Plan B ~210M), runs the P&L and a
checks it against 180M THB and 180M plus 25 % (Plan A ~180M, Plan B ~215M), runs the P&L and a
ten-year cash sketch, and lists what the plant needs: people, power, central
hydraulics, steam, cooling, compressed air, floor, compound and stampers.
Vendor figures are marked as such; the rest are planning figures and
@@ -610,7 +610,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
<span>Presets:</span>
<button type="button" data-p="launch">Launch plant (decided)</button>
<button type="button" data-p="planA">Plan A (~180M)</button>
<button type="button" data-p="planB">Plan B (~210M, all in)</button>
<button type="button" data-p="planB">Plan B (~215M, all in)</button>
<button type="button" data-p="lean">Lean: bought stampers, outsourced cutting</button>
<button type="button" data-p="full">Full hall (5 D + 4 C)</button>
</div>
@@ -732,7 +732,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
<section class="card">
<h2>Budget: Plan A and Plan B</h2>
<p class="note" style="margin-top:0">Two plans for the investor (October 2026): Plan A at ~180M THB keeps every
machine of the launch plant with six cost levers, Plan B at ~210M THB keeps the same launch plant (one Duplex system
machine of the launch plant with six cost levers, Plan B at ~215M THB keeps the same launch plant (one Duplex system
and one Classic) with everything the levers cut; both priced without contingency and with the ramp-up reserve,
the second Duplex a growth step in both. Marks at 180M and 180M plus 25 % (225M). Bars: the investment
at the low end, the midpoint and the high end of every block (contingency as set under Plant configuration),
@@ -884,8 +884,8 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
line, Sibert, cutting room, metrology, ZLD and DI water) to the capex and shows the import VAT as cash
paid at the border, reclaimable as input tax. Raw material: no duty on compound for exported
records, 90 % off for domestic sales. Revenue is net of VAT (exports zero-rated, 7 % on domestic
sales passed on). Corporate income tax and BOI's CIT exemptions (solar, automation, R&D) are not
modelled.</p>
sales passed on). Corporate income tax and BOI's CIT exemptions (automation, R&D, possibly the battery; solar
installations are no longer promoted since July 2025) are not modelled.</p>
<p><b>Labour.</b> Base salaries per role (revenue-model.md, its loaded rates divided by 1.3; the cutting
engineer a team figure), plus the employer's 5 % social security up to the 17,500 THB ceiling, 25 %
for overtime, bonus and PPE, and the company's health care for every member of staff, office
@@ -931,7 +931,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
var VERSION = "1.1";
var DEF = {
duplex: 1, classic: 1, galvanics: true, cutting: true, metrology: "full",
cassette: true, cdr: true, solar: "buy", pvKwp: 300, batteryKwh: 271,
cassette: true, cdr: true, solar: "buy", pvKwp: 640, batteryKwh: 271,
fuel: "electric", boilerModules: 2, chillerModules: 2, crane: "buy",
corridor: true, phase2: false, running: true, labels: true
};
@@ -1314,6 +1314,9 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
// ------------------------------------------------------------ PV placement
var PV_ROWS = [1, 3, 5, 7, 10, 12, 14, 16, 19, 21];
// kWp per drawn module place (~2 m2): every place on the factory roof, the office roof and the two canopies
// together (1,467) is the ~640 kWp design (site-candidates.md parts model plus the office roof)
var PV_MOD = 0.4363;
function pvFields(cfg, al) {
var f = [];
// the parking canopies carry PV first (construction RFQ: canopy PV), the factory roof takes the rest
@@ -1321,12 +1324,17 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
f.push({ key: "scoot", x0: 20.35, cols: 13, y0: 26, rows: [0.4, 2.85], z: function (y) { return 2.45 + (y - 26) / 5.5 * 1.05 + 0.08; } });
f.push({ key: "roofW", x0: X(1), cols: 103, y0: FY, rows: PV_ROWS, z: function (y) { return roofZ(y - FY) + 0.12; } });
f.push({ key: "roofE", x0: X(107.25), cols: 19, y0: FY, rows: PV_ROWS, z: function (y) { return roofZ(y - FY) + 0.12; } });
// office roof: flat, the three AC units in the middle keep a clear strip around them
var oz = function () { return OFC.z1 + 0.14; };
f.push({ key: "offW", x0: OFC.x0 + 1, cols: 18, y0: OFC.y0, rows: [0.8, 3.1, 5.4, 7.7, 10.0, 12.3], z: oz });
f.push({ key: "offM", x0: OFC.x0 + 20, cols: 7, y0: OFC.y0, rows: [0.8, 12.3], z: oz });
f.push({ key: "offE", x0: OFC.x0 + 28, cols: 3, y0: OFC.y0, rows: [0.8, 3.1, 5.4, 7.7, 10.0, 12.3], z: oz });
if (al.p2show) f.push({ key: "p2", x0: P2.x0 + 1, cols: 40, y0: P2.y0, rows: [1, 3, 5, 7, 10, 12, 14, 16, 19, 21, 23],
z: function (y) { return FFL + P2.eave + (P2.high - P2.eave) * (y - P2.y0) / (P2.y1 - P2.y0) + 0.12; } });
return f;
}
function pvPlace(cfg, al) {
var want = cfg.solar === "none" ? 0 : Math.round(cfg.pvKwp / 0.45), left = want, out = {}, fields = pvFields(cfg, al), i, k, r, c;
var want = cfg.solar === "none" ? 0 : Math.round(cfg.pvKwp / PV_MOD), left = want, out = {}, fields = pvFields(cfg, al), i, k, r, c;
for (i = 0; i < fields.length; i++) {
var F = fields[i], list = [];
for (r = 0; r < F.rows.length && left > 0; r++) {
@@ -1535,8 +1543,8 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
sp.prism(rect(20, 26, 33.7, 31.5), [2.3, 2.3, 3.35, 3.35], [2.45, 2.45, 3.5, 3.5], "iso-canopy");
pvDraw(sp, pv.by.scoot.F, pv.by.scoot.panels);
var nc = pv.by.cars.panels.length, ns = pv.by.scoot.panels.length;
sc.inf("canopy-cars", "Car canopy, 10 bays", "27.7 x 7.0 m at 4.1 m (construction RFQ)" + (nc ? "; " + nc + " PV modules (~" + fmt(nc * 0.45) + " kWp)" : ""));
sc.inf("canopy-scooters", "Scooter canopy, ~30 spaces", "13.7 x 5.5 m at 3.5 m (construction RFQ)" + (ns ? "; " + ns + " PV modules (~" + fmt(ns * 0.45) + " kWp)" : ""));
sc.inf("canopy-cars", "Car canopy, 10 bays", "27.7 x 7.0 m at 4.1 m (construction RFQ)" + (nc ? "; " + nc + " PV modules (~" + fmt(nc * PV_MOD) + " kWp)" : ""));
sc.inf("canopy-scooters", "Scooter canopy, ~30 spaces", "13.7 x 5.5 m at 3.5 m (construction RFQ)" + (ns ? "; " + ns + " PV modules (~" + fmt(ns * PV_MOD) + " kWp)" : ""));
}
// ------------------------------------------------------------ factory
@@ -2253,7 +2261,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
});
s.open(S.N[0], S.N[1], [[o.x1 - LINK.x1 + 0.7, o.x1 - LINK.x0 - 0.7, o.z0, o.z0 + 2.5]], "iso-door", "link");
}
function office(sc, cfg, level) {
function office(sc, cfg, level, pv) {
var o = OFC, x0 = o.x0, y0 = o.y0, x1 = o.x1, y1 = o.y1, S = sides(x0, y0, x1, y1);
officeInfo(sc, cfg);
// covered link (all levels)
@@ -2267,6 +2275,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
s.box(x0, y0, x1, y1, o.z0, o.z1, "iso-office", { top: "iso-roof3" });
officeWindows(s, S, o, true);
s.flat(rect(x0 + 0.4, y0 + 0.4, x1 - 0.4, y1 - 0.4), o.z1 + 0.01, "iso-roofin");
if (pv) ["offW", "offM", "offE"].forEach(function (k) { if (pv.by[k]) pvDraw(s, pv.by[k].F, pv.by[k].panels); });
s.seq([[x0 + 20.8, y0 + 5.6], [x0 + 23.4, y0 + 5.6], [x0 + 26, y0 + 9.4]].map(function (p) {
return [p[0], p[1], function (q) { q.box(p[0] - 0.8, p[1] - 0.6, p[0] + 0.8, p[1] + 0.6, o.z1, o.z1 + 1.0, "iso-ac"); q.disc(p[0], p[1], o.z1 + 1.01, 0.42, "iso-fanring"); }];
}));
@@ -2486,7 +2495,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
factoryInfo(sc, cfg, al);
if (inside) { sc.dim = up; factoryInside(sc, ctx, al, pv, up); sc.dim = false; if (up) blockUpper(sc, cfg); }
else factoryRoof(sc, cfg, pv);
office(sc, cfg, level);
office(sc, cfg, level, pv);
var y = yard(sc, cfg, inside, pv);
if (al.p2show) { sc.dim = up; phase2(sc, ctx, inside, al, pv); sc.dim = false; }
else {
@@ -2496,14 +2505,16 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
vehicles(sc, cfg);
// PV info and roof tags
var ppa = cfg.solar === "ppa", onRoof = pv.by.roofW.panels.length + pv.by.roofE.panels.length,
onCp = pv.by.cars.panels.length + pv.by.scoot.panels.length, onP2 = pv.by.p2 ? pv.by.p2.panels.length : 0;
onCp = pv.by.cars.panels.length + pv.by.scoot.panels.length, onP2 = pv.by.p2 ? pv.by.p2.panels.length : 0,
onOf = pv.by.offW.panels.length + pv.by.offM.panels.length + pv.by.offE.panels.length;
if (cfg.solar !== "none" && pv.want > 0) {
var kwp = cfg.pvKwp, parts = [onRoof + " on the factory roof"];
if (onOf) parts.push(onOf + " on the office roof");
if (onCp) parts.push(onCp + " on the parking canopies");
if (onP2) parts.push(onP2 + " on the phase 2 roof");
sc.inf("pv", "PV " + fmt(kwp) + " kWp, " + fmt(cfg.batteryKwh) + " kWh battery" + (ppa ? " (PPA)" : ""),
fmt(pv.want) + " modules of ~0.45 kWp (~2 m2 each): " + parts.join(", ") + (pv.left ? "; " + fmt(pv.left) + " do not fit the roofs (ground mount)" : "") +
". About " + fmt(kwp * 1.4) + " to " + fmt(kwp * 1.5) + " MWh a year at 1,400 to 1,500 kWh/kWp (scale.md)" + (ppa ? ". PPA: the EPC owns the panels, the plant buys the power." : "."));
fmt(pv.want) + " modules of ~" + PV_MOD.toFixed(2) + " kWp (~2 m2 each): " + parts.join(", ") + (pv.left ? "; " + fmt(pv.left) + " do not fit the roofs (ground mount)" : "") +
". About " + fmt(kwp * 1.4) + " to " + fmt(kwp * 1.5) + " MWh a year at 1,400 to 1,500 kWh/kWp (scale.md), ~85 % of it used on site (zero export)" + (ppa ? ". PPA: the EPC owns the panels, the plant buys the power." : "."));
if (!inside && onRoof) {
sc.tag(X(52), Y(10), roofZ(10) + 1.5, "PV " + fmt(kwp) + " kWp", 10, "pv");
if (ppa) sc.tag(X(80), Y(6), roofZ(6) + 1.0, "PPA panels", 100, "pv", "iso-signtag");
@@ -2955,8 +2966,9 @@ grp("Energy", [
["kwhPrice", "Electricity, blended", 3.81, "THB/kWh", "doc", "scale.md: PEA TOU 3.2.2 at two shifts, before the demand charge (Ft September to December 2026)"],
["demandPrice", "Demand charge", 132.93, "THB/kW a month", "doc", "PEA 3.2.2 (scale.md)"],
["restKW", "Rest of the plant while running", 120, "kW", "est", "Estimate: HVAC, lighting, galvanics, finishing, offices; puts the start fleet in scale.md's 4.5 to 6.8M THB a year before PV"],
["pvKWp", "Roof PV", 247, "kWp", "doc", "scale.md"],
["pvYield", "PV yield, all self-consumed", 1400, "kWh/kWp", "doc", "scale.md: 1,400 to 1,500 kWh/kWp a year in northern Thailand"],
["pvKWp", "PV array: factory roof, office roof and parking canopies, all full", 640, "kWp", "est", "Payap scenario: factory roof ~523 kWp and canopies ~54 kWp (site-candidates.md parts model, 580 W placeholder module) plus the office roof ~65 kWp (estimate from this drawing); on the Mueang Chi hall the roof and canopies take ~300 kWp (scale.md)"],
["pvYield", "PV yield", 1400, "kWh/kWp", "doc", "scale.md: 1,400 to 1,500 kWh/kWp a year in northern Thailand"],
["pvSelf", "Share of the PV yield used on site", 85, "%", "est", "Hourly sketch (October 2026): two shifts on 300 days, ~60 kW off-shift base load, the 271 kWh battery; the rest is curtailed, because a factory on PEA's grid runs zero export (sustainability.md)"],
["heatPrice", "Steam heat from biomass", 0.7, "THB/kWh", "doc", "biomass.md: 0.5 to 0.9 at 1.35 to 2 THB/kg delivered"],
["steamKWh", "Heat per kg of steam", 0.68, "kWh/kg", "est", "Estimate: 10 bar saturated steam from ~80 °C feed water"],
["eBoilEff", "Electric boiler efficiency", 98, "%", "est", "Estimate for an electric steam boiler (~98 %)"],
@@ -3028,8 +3040,8 @@ rng("Investment blocks (USD unless THB)", [
["airT", "Compressed air, Thai supplier", 350000, 600000, "THB", "est", "Utilities CSV: screw compressor skid, dryer, receiver"],
["airC", "Compressed air, Chinese brand through its Thai office", 150000, 300000, "THB", "est", "china-utilities.md: PM VSD screw set 0.15 to 0.3M THB installed"],
["clR", "Clean-room adder (galvanics and cutting room)", 1200000, 3400000, "THB", "est", "Utilities CSV, ~2 × 60 m² ISO 7/8; half with only one of the two rooms (estimate)"],
["uRest", "Rest of the utilities baseline: softener, loop treatment, racking, whole-factory HVAC", 8620000, 17300000, "THB", "est", "Utilities CSV baseline 27.57 to 47.50M THB less boilers, chillers, air, clean room, PV and battery"],
["pv", "Rooftop PV EPC", 6000000, 7800000, "THB", "est", "Utilities CSV: illustrative 300 kWp at 20 to 26 THB/W installed (DEDE Thailand PV status: factories 10 kW to 1 MW 22 to 25 THB/W, 2023; installers 18 to 25 in 2026) incl. Deye hybrid inverters; final kWp open (scale.md 247 kWp for the yield)"],
["uRest", "Rest of the utilities baseline: softener, loop treatment, racking, whole-factory HVAC", 8620000, 17300000, "THB", "est", "Utilities CSV baseline 34.37 to 56.34M THB less boilers, chillers, air, clean room, PV and battery"],
["pv", "PV EPC per kWp, roofs and canopies", 20000, 26000, "THB", "est", "Utilities CSV: 20 to 26 THB/W installed (DEDE Thailand PV status: factories 10 kW to 1 MW 22 to 25 THB/W, 2023; installers 18 to 25 in 2026) incl. the inverters; times the array size above; canopy steel is in the building and site works (construction RFQ)"],
["bat", "Battery 271 kWh (Gobel), installed", 2000000, 3500000, "THB", "est", "Utilities CSV: Gobel list price USD 39,900 to 58,000 (battery only, matches DEDE's 5,000 to 7,000 THB/kWh for LiFePO4) plus enclosure, fire protection, controls and installation, below the 12,000 to 15,000 THB/kWh of a fully installed factory BESS because the hybrid inverters do the power conversion (estimate)"],
["bld", "Building ~1,500 m² plus civil and site works", 650000, 1100000, "USD", "est", "total-investment.md: 12,000 to 20,000 THB/m² plus ~20 % site works; soil is the main variable"],
["ph2", "Phase 2 building, when the press floor outgrows the press hall", 750000, 1250000, "USD", "est", "Business plan draft 0.1: ~750k to 1,250k on 1,710 m², estimate"],
@@ -3052,7 +3064,7 @@ grp("Investment rules", [
["wcRef", "Records a year the working capital is sized for", 840000, "", "doc", "revenue-model.md launch plant, central volume"],
["wcMin", "Working capital never below", 60, "%", "est", "Estimate"],
["budgetLo", "Plan A budget", 180000000, "THB", "doc", "total-investment.md: Plan A, ~180M THB without contingency, ramp-up reserve included"],
["budgetHi", "Upper budget mark, 180M plus 25 %", 225000000, "THB", "doc", "total-investment.md: the +25 % envelope set for Plan B (user, October 2026); Plan B is ~210M"],
["budgetHi", "Upper budget mark, 180M plus 25 %", 225000000, "THB", "doc", "total-investment.md: the +25 % envelope set for Plan B (user, October 2026); Plan B is ~215M"],
]);
grp("Ten years of cash", [
["ramp1", "Sold output in year 1", 35, "% of the mature year", "est", "Estimate"],
@@ -3092,7 +3104,7 @@ const CFG0 = Object.fromEntries(CFGK.map(k => [k, S0[k]]));
const LAUNCH = { mode: "target", target: 850000, grow: "classic", dMin: 1, cMin: 1, dFleet: 1, cFleet: 1, ...CFG0 };
const PRESETS = {
launch: LAUNCH,
// Plan A (~180M THB, six levers) and Plan B (~210M THB, the launch plant all in): total-investment.md "Two plans", priced without contingency
// Plan A (~180M THB, six levers) and Plan B (~215M THB, the launch plant all in): total-investment.md "Two plans", priced without contingency
planA: { ...LAUNCH, solar: "ppa", metro: "launch", corridor: "later", cass: "off", cdr: "off", crane: "rent", sourcing: "china", cont: "sep" },
planB: { ...LAUNCH, cont: "sep" },
lean: { ...LAUNCH, galv: "bought", cut: "out" },
@@ -3239,7 +3251,7 @@ function capexOf(r, c = S, boiOn = c.boi !== "off") {
if (cr > 0) blk("Utilities", "clR", cr === 1 ? "Clean-room adder: galvanics and cutting room" : `Clean-room adder, half: ${galvIn ? "galvanics" : "cutting room"} only`, cr, true);
blk("Utilities", "uRest", "Rest of the utilities baseline: softener, loop treatment, racking, whole-factory HVAC", 1, true);
if (c.solar === "buy") {
blk("Utilities", "pv", "Rooftop PV, EPC", 1, true);
blk("Utilities", "pv", `PV on the roofs and canopies, ${f0(A.pvKWp)} kWp, EPC`, A.pvKWp, true);
blk("Utilities", "bat", "Battery 271 kWh (Gobel)", 1, true);
}
blk("Building and site", "bld", "Building ~1,500 m² plus civil and site works");
@@ -3319,10 +3331,10 @@ function econ(r, b, boiOn = S.boi !== "off") {
const steamT = r.P * (A.steamLo + A.steamHi) / 2 * runH / 1000;
const heatMWh = steamT * A.steamKWh;
const elecMWh = X > 0 ? r.mwh + heatMWh / Math.max(0.5, A.cop) + (r.compKW + A.restKW) * b.hoursYr / 1000 : 0;
const pvMWh = S.solar === "none" ? 0 : Math.min(elecMWh, A.pvKWp * A.pvYield / 1000);
const pvMWh = S.solar === "none" ? 0 : Math.min(elecMWh, A.pvKWp * A.pvYield / 1000 * Math.min(100, Math.max(0, A.pvSelf)) / 100);
const demandKW = X > 0 ? r.kw + r.chillerKW + r.compKW + A.restKW : 0;
add("energy", "Electricity", t2u((elecMWh - pvMWh) * 1000 * A.kwhPrice + demandKW * A.demandPrice * 12),
`${f0(elecMWh - pvMWh)} MWh from the grid after ${f0(pvMWh)} MWh roof PV${S.solar === "none" ? " (no PV)" : S.solar === "ppa" ? " (PPA)" : ""}; ~${f0(demandKW)} kW demand`);
`${f0(elecMWh - pvMWh)} MWh from the grid after ${f0(pvMWh)} MWh of PV used on site${S.solar === "none" ? " (no PV)" : S.solar === "ppa" ? " (PPA)" : ""}; ~${f0(demandKW)} kW demand`);
if (S.solar === "ppa") add("energy", "Solar PPA power", t2u(pvMWh * 1000 * A.ppaPrice), `${f0(pvMWh)} MWh at ${f2(A.ppaPrice)} THB/kWh (estimate, to quote)`);
if (S.steamFuel === "biomass")
add("energy", "Steam heat (biomass)", t2u(heatMWh * 1000 * A.heatPrice), `${f0(steamT)} t of steam, ${f0(heatMWh)} MWh of heat at ${f2(A.heatPrice)} THB/kWh`);
@@ -3634,9 +3646,9 @@ const CFG = [
h: { off: "Illustrative volumes and prices with no market data; left out of the money.",
on: "Counted at the illustrative volumes and prices, with no running costs on file: it flatters the result." },
dis: () => S.cass === "off" && S.cdr === "off" ? "Not applicable: neither line is in the plant." : "" },
{ k: "solar", t: "Solar PV and 271 kWh battery", sub: "utilities CSV: illustrative 300 kWp EPC plus the Gobel battery",
{ k: "solar", t: "Solar PV and 271 kWh battery", sub: "every roof and canopy covered (~640 kWp) plus the Gobel battery",
o: [["buy", "Buy"], ["ppa", "Solar PPA"], ["none", "None"]],
h: { buy: () => `${mT("pv")} THB PV plus ${mT("bat")} battery; the yield offsets the bill.`,
h: { buy: () => `${nf(1).format(A.pvLo * A.pvKWp / 1e6)}M to ${nf(1).format(A.pvHi * A.pvKWp / 1e6)}M THB for ${f0(A.pvKWp)} kWp plus ${mT("bat")} battery; the yield offsets the bill.`,
ppa: "No capex: the EPC owns the array, the plant pays the PPA price on the yield.",
none: "No PV: the whole bill comes from the grid." },
extra: `<label class="row" id="row_ppa"><span>PPA power price, THB/kWh<br><small>estimate, to quote</small></span><input type="number" id="ppaIn" data-a="ppaPrice" min="0" step="0.05"></label>` },
@@ -3710,7 +3722,7 @@ function renderInvest(e, r) {
H.push(`<tr class="grp"><td colspan="5">Totals</td></tr>`);
TR("Subtotal", cx.sub, "", true);
TR(cx.ctgIn ? `Contingency ${f1(A.contPct)} %` : `Contingency ${f1(A.contPct)} % (not in the total)`, cx.ctg, cx.ctgIn ? "total-investment.md" : "shown separately, as in Plan A and Plan B");
TR("Total investment", cx.tot, "for reference, total-investment.md: the launch plant ~160M to 283M THB with contingency (midpoint ~222M); Plan A ~162M and Plan B ~193M at the midpoint without it, plus the ramp-up reserve", true);
TR("Total investment", cx.tot, "for reference, total-investment.md: the launch plant ~168M to 294M THB with contingency (midpoint ~231M); Plan A ~162M and Plan B ~201M at the midpoint without it, plus the ramp-up reserve", true);
if (!cx.boiOn) {
TR(`Import duty without BOI, ${f1(A.dutyMach)} %`, cx.duty, `on ${money(cx.imp.lo)} to ${money(cx.imp.hi)} of imported machinery; import VAT ${money(cx.vat.mid)} at the midpoint, reclaimable`);
TR("Total with import duty", cx.all, "", true);
@@ -3790,7 +3802,7 @@ function renderCash(e, r) {
let ISO = null, ISOK = "";
function isoCfg(r) {
return { duplex: r.D, classic: r.C, galvanics: S.galv, cutting: S.cut, metrology: S.metro,
cassette: S.cass, cdr: S.cdr, solar: S.solar, pvKwp: 300, batteryKwh: 271, fuel: S.steamFuel,
cassette: S.cass, cdr: S.cdr, solar: S.solar, pvKwp: A.pvKWp, batteryKwh: 271, fuel: S.steamFuel,
boilerModules: r.nb, chillerModules: r.nc, crane: S.crane, corridor: S.corridor, phase2: r.floor > A.hall };
}
function isoUpdate(r) {
Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 KiB

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 491 KiB

After

Width:  |  Height:  |  Size: 654 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 866 KiB

After

Width:  |  Height:  |  Size: 866 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 542 KiB

After

Width:  |  Height:  |  Size: 697 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 KiB

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 487 KiB

After

Width:  |  Height:  |  Size: 648 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 884 KiB

After

Width:  |  Height:  |  Size: 884 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 541 KiB

After

Width:  |  Height:  |  Size: 699 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 335 KiB

After

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 KiB

After

Width:  |  Height:  |  Size: 293 KiB

+4 -4
View File
@@ -11,7 +11,7 @@ These three run in parallel and gate everything downstream:
1. **Market validation**: test the blended pressing price (3.76 to 5.27
USD at the planned 60 % specials; 3.50 to 4.60 at a standard-heavy mix)
and regional demand (~0.74M records a year in both Plan A and Plan B, and
when the second Duplex follows from revenue) in [total investment](finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-210m-thb-october-2026),
when the second Duplex follows from revenue) in [total investment](finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-215m-thb-october-2026),
with Asian labels and distributors, starting at
Making Vinyl in Haarlem (Alexander and Simona). This is the biggest
assumption in the [revenue model](finance/revenue-model.md); the
@@ -173,9 +173,9 @@ Nothing in Phases 2 to 5 starts before its gate clears: no machinery order
before the BOI certificate, no big-block spending before the market
validates the price, no coppice fuel planning before the land title check.
Since October 2026 the plant launches with everything in one capital
round (~160M to 283M THB with contingency; for the investor Plan A at
~180M and Plan B at ~210M THB without it, in
[total investment](finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-210m-thb-october-2026));
round (~168M to 294M THB with contingency; for the investor Plan A at
~180M and Plan B at ~215M THB without it, in
[total investment](finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-215m-thb-october-2026));
the gates still come before the round is spent, and the growth options
(more Duplex systems first, then Classics, in a press hall laid out for
five Duplex systems and four Classics) are funded from revenue.
+9 -3
View File
@@ -298,13 +298,19 @@ small against the connection, but its own feeder and meter.
roof plane, per the [construction RFQ](finance/phase1-construction-rfq.md)).
This supersedes the older rule of thumb of 150 to 200 kWp on a
~1,500 m² building, which the massing model has overtaken
- **Decided 17 October 2026: every roof and canopy carries PV.** On this
hall that is the 247 kWp roof plus the canopies' ~40 to 54 kWp, ~300
kWp; on the Payap scenario plot ~640 kWp, the size the investment and
the business plan carry
([sustainability](sustainability.md#roof-design-for-pv-candidate-mueang-chi-site))
- Northern Thailand yield ~1,400 to 1,500 kWh/kWp/yr, so 300 kWp produces
roughly **420 to 450 MWh/yr**
roughly **420 to 450 MWh/yr** and ~640 kWp ~900 to 960 MWh/yr
- Plant consumption at mature two-shift operation: roughly **1,000 to
1,500 MWh/yr** without electric steam, up to **~2,500 MWh/yr** with it
(estimate), so 300 kWp covers roughly **28 to 45%** of consumption
without electric steam, falling to **~17%** with it; a bigger array
shifts that up
without electric steam, falling to **~17%** with it; ~640 kWp, at
~85 % used on site under zero export, covers ~38 % of the launch
plant's ~2,000 MWh with electric steam (calculator, estimate)
- Battery: **271 kWh** Gobel stack (ride-through, roughly
an hour of the chiller bank's peak electrical draw; peak shaving earns
little under PEA's time-of-use tariff, see
+10 -1
View File
@@ -349,7 +349,16 @@ parameter does.
shift), so PEA's export terms decide whether the surplus is sold or
curtailed;
- the 271 kWh battery is sized for ride-through, not to absorb it;
- the BOI solar measure caps eligible spend per MW ([BOI](boi.md)).
- the BOI no longer promotes solar installations (since 1 July 2025;
only the battery may qualify, [BOI](boi.md)).
Decided 17 October 2026: every roof and canopy carries PV. With the
flat office roof (~65 kWp around its AC units, estimate from the
[calculator](fleet-calculator.html) drawing) that is **~640 kWp**, the
size in the investment and the business plan. PEA's zero-export rule
answers the first point (surplus curtailed, ~85 % used on site in an
hourly sketch); the permits and the BOI position are in
[sustainability](sustainability.md#roof-design-for-pv-candidate-mueang-chi-site).
FreeCAD 26.3.0 RC1 does not pass a cell edit on to the parts that read
the cell (a normal recompute updates only the sheet). After editing
+51 -5
View File
@@ -47,8 +47,10 @@ process cooling (up to ~650 kW), drawn in [steam and cooling](steam-cooling.html
[facility systems](facility-security.md)) adds a major tropical-climate
load on top of process cooling and must be part of the PV and battery
sizing.
- System sizing (kWp, storage, grid-connection model) is open until the site
is chosen.
- **Array size, decided 17 October 2026: every roof and canopy carries PV**
("use as much roof space as possible"), so the kWp follows the site:
~640 kWp on the Payap scenario plot, ~300 kWp on the Mueang Chi hall
(below). Storage beyond the 271 kWh ride-through battery stays open.
### Roof design for PV (candidate Mueang Chi site)
@@ -108,8 +110,49 @@ the electric-boiler route is chosen.
On the Payap scenario plot the 128 m factory roof takes ~901 modules
(~523 kWp) and the car and scooter canopies another ~54 kWp, ~577 kWp in
all; what that size means for export, the battery and BOI is in
[site candidates](site-candidates.md#roof-pv-and-parking-canopies-part-and-draft-model-october-2026).
all ([site candidates](site-candidates.md#roof-pv-and-parking-canopies-part-and-draft-model-october-2026)).
The flat office roof adds ~65 kWp around its three AC units (estimate
from the [calculator](fleet-calculator.html) drawing), so covering every
roof and canopy gives **~640 kWp**, the size the investment and both
business plan versions carry since 17 October 2026. On the Mueang Chi
hall the same rule gives only ~300 kWp (the 247 kWp roof above plus the
canopies); more there means ground mount on the plot behind the building
or the phase 2 roof.
**What ~640 kWp means on the grid** (October 2026):
- **Zero export.** A factory on PEA's grid cannot sell its surplus: the
interconnection needs a zero-export controller or reverse-power relay,
and net billing is limited to small users
([CapSolar, rooftop solar regulations 2026](https://capsolar.co.th/en/knowledge/rooftop-solar-regulations-thailand)).
An hourly sketch (two shifts on 300 days, ~60 kW off-shift base load,
the 271 kWh battery; estimate) puts **~85 % of the ~900 MWh yield to
use on site**; the rest, mostly on Sundays and holidays, is curtailed.
With electric steam the launch plant draws ~2,000 MWh a year, so the
array covers ~38 % of it.
- **Permits.** Since Ministerial Regulation No. 3 B.E. 2567 (in force
28 December 2024) rooftop solar outside industrial estates is not a
factory at any size, so no Ror.Ngor.4 licence; at ~500 kVA of inverters
the array stays under the ERC's 1,000 kVA line and needs an exemption
notification, not a generation licence; PEA's interconnection review
takes 3 to 6 months and is filed alongside procurement
([CapSolar, factory solar and the RG.4 permit](https://capsolar.co.th/en/knowledge/factory-solar-rg4-permit-thailand)).
Ground mount is not covered by the rooftop exemption and is checked
case by case.
- **No BOI benefit for the panels.** Since 1 July 2025 (Announcement
3/2568) the BOI no longer promotes solar installations; the battery and
its inverters may still qualify, capped at 12M THB per MW
([BOI](boi.md)). The array is justified by the bill alone.
- **Leasing instead (Plan A).** Under a solar PPA the developer funds,
installs and maintains the array and sells its power at a discount to
the PEA tariff: usually 10 to 15 % over 15 to 20 years at MEAei
([MEAei](https://meaei.com/en/best-solar-rooftop-businesses-thailand)),
10 to 30 % over 15 to 25 years for bills of 100,000 THB a month and up
at CapSolar ([CapSolar PPA](https://capsolar.co.th/en/services/ppa)).
The calculator's 3.0 THB/kWh is ~21 % below the ~3.8 THB/kWh blended
rate, inside CapSolar's range but above MEAei's usual discount (estimate,
to quote); the launch plant's bill (~0.75M THB a month before solar, calculator)
clears the threshold.
### Energy efficiency architecture: recover before generating
@@ -252,7 +295,10 @@ not a cost one.
(weekday daytime at the peak rate, weekends and early mornings at
off-peak, Ft included), so the 247 kWp roof saves ~1.2M to 1.3M THB a year
and pays back in **~3.8 to 5.4 years** at 20,000 to 26,000 THB/kWp
installed (estimate; Thai market prices checked October 2026 in the
installed. The full ~640 kWp array uses ~85 % of its yield on site, saves
~2.8M to 3.0M THB a year and pays back in **~4.2 to 5.9 years**; the
last ~340 kWp, more of whose yield is curtailed, take ~4.9 to 6.3 years
(estimates; Thai market prices checked October 2026 in the
[utilities CSV](finance/utilities-investment.csv): DEDE's PV status report
gives 22 to 25 THB/W for factory systems of 10 kW to 1 MW in 2023,
installers quote 18 to 25 THB/W in 2026). It does not lower the demand charge, because the peak window