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

+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"],