Files
cnx_vinyl/docs/business-plan/build/content_b.py
T
grabowski 967e6b1c76
Deploy test site / deploy (push) Successful in 2m40s
Payap still an option: rezoning route; order example opaque
User, 20 Oct 2026: Payap University claims they can rezone the land;
update the deck to show it is still an option. And: do not use a
transparent vinyl as the example in the order tool screenshot.

- land-listings/payap/rezoning-2026-10-20.md (new): what a rezoning is
  under the Town Planning Act B.E. 2562 (section 35 amendment started by
  DPT or the local official, Town Planning Commission, 30-day posting
  with objections, Ministry of Interior notification via Cabinet and the
  Royal Gazette; a landowner can ask, not rezone), the DPT's own work
  plan (~70 weeks without objections, ~82 with: ~16 to 19 months), the
  schedule effect (roughly a year on first production unless the request
  starts now; estimate) and what to ask Payap. DPT procedure PDF filed.
- site-candidates.md: Payap "still an option" in the table, rezoning
  paragraph with an Open action, check 1 and the re-siting rule; zoning
  record, payap-partnership.md and README point to it.
- Business plan 6.1, risk table and critical path: Payap's rezoning
  claim and its ~16 to 19 months; A and B rebuilt (63 pages, checked).
- Deck: site slide names Payap as an option once rezoned, notes and
  source line; risk row updated.
- order.html: the "Splatter 12"" preset now has a white base instead of
  clear; deck platform screenshots re-shot in both themes (numbers
  unchanged: 100 fans, break-even 46, ~480 THB kept). Order checks 96/96,
  fan parity 206/206; deck verify clean in both themes, PDFs rebuilt.
2026-10-20 14:58:40 +07:00

1197 lines
108 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Part 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 (~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
from plan_variant import pick, is_a, is_b, label, name
def blocks():
return [
# ------------------------------------------------- 5 top-notch
H1("5. What makes it top-notch: traceability, metrology, QC and efficiency"),
P("A pressing plant makes records. A top-notch plant knows, for every record it has ever made, "
"exactly how it was made, can prove it to the customer, and wastes as little energy, water and "
"material as the physics allows. This section is the heart of the plan, because these four "
"capabilities are what a regional customer cannot buy today and what justifies export-grade "
"pricing. None of it is exotic: the instruments exist, the data interfaces exist, and the "
"engineering is well understood. What is unusual is putting all of it in one plant from the "
"start rather than bolting it on later. The plan makes that possible: with the cutting "
"room and galvanics in-house from the first release, the whole chain from lacquer to box runs "
"through our own floor, with no bought-in stamper whose history we cannot see."),
H2("5.1 Traceability: every record knows its history"),
P("Every step of production is logged continuously, so that every record is traceable end to end "
"for the customer. This is a fixed requirement and the core specification for the plant's "
"software. The identity of a record is **stamper + press + cycle timestamp + side**, and "
"everything else hangs off that key."),
P("**It is also the part of the plan the industry responds to.** At Making Vinyl Europe 2026 in "
"Haarlem most people the team talked to were strongly interested in full traceability. For "
"Sibert's representative it was one of the reasons to talk to a newcomer at all: without it he "
"would have advised strongly against the plan, and seeing buildfor.life's software and data "
"work told him the project comes from the right direction. That is supplier feedback, not buyer "
"price validation, which is still open; but it shows where a newcomer's credibility comes from, "
"and why the data side leads in every supplier and investor conversation."),
T(["Stage", "What is recorded"], [
["Audio intake", "File received, checksums, versions, who handled it, approval trail; the files "
"themselves sit in an encrypted, access-logged client vault"],
["Mastering", "Session log, engineer, settings, the artist's approvals at the master-plan and "
"master gates"],
["Cutting", "Lacquer serial, lathe parameters and the Sillitoe lathe's own session files (cue "
"sheet, groove export, stylus hours), microscope check, dead-wax scribe"],
["Galvanics", "Silvering and plating bath IDs, rectifier current and ampere-hours, bath "
"chemistry, father/mother/stamper genealogy (which stamper came from which mother "
"from which father); all in-house from launch"],
["Stamper preparation", "Back-finish, punch and coin as station check-ins (the Sibert machines "
"have no data interface); the punched centre slug kept as the stamper's "
"test coupon"],
["Pressing", "Press, operator, shift, stamper serials, per-cycle temperatures, pressures and "
"cycle time, PVC compound lot and virgin/regrind mix, label lot"],
["Quality control", "Optical result for every record, audio score for every sampled record, "
"test-pressing approval, reject counts and reasons"],
["Finishing and packaging", "Trimming, sleeving, carton and sleeve lots; every unit's dead-wax "
"code checked against its jacket barcode"],
["Fulfilment", "Warehouse location, shipment or dropshipping consignment, carrier tracking per "
"end customer"],
["Archive", "Father and mother of every side, with box and shelf position"],
], widths_mm=[38, 132]),
H3("How it is built: one system of record, machine data beside it"),
P("**ERPNext is the plant's only system of record** (decided October 2026). ERPNext is an "
"open-source ERP with no licence fee. Every record of the business and of production lives in "
"it: customers, prices, orders and the three artist approval gates, invoices and payments, stock "
"and compound lots, work orders and job cards, quality inspections, and the serial number of "
"every lacquer, father, mother and stamper with its parent. What the project builds are tools "
"and interfaces that read and write ERPNext: station kiosks, the customer portal, the artist "
"platform, instrument adapters and reports. None of them keeps business records of its own, so "
"a trace and an invoice always point at the same order."),
P("**Machine data stays beside it, keyed to it.** What machines produce at machine speed "
"(per-cycle press rows, the optical result of every record, audio captures, instrument raw files, "
"1 Hz time series of temperatures, energy and water) is too much for an ERP. It lives in a "
"machine-data store on the plant's core server, every row carrying the ERPNext job card, batch "
"and serial number it belongs to; ERPNext receives totals and verdicts per run, lot and shipment. "
"Rows are written once and never changed (append-only, each event carrying the hash of the one "
"before), and corrections are new entries that reference the old, so the record a customer sees "
"can be trusted."),
P("**It runs on a fleet B4L already operates.** Every plant server is a NixOS machine declared in "
"B4L's existing fleet repository (its clan), so a failed machine is rebuilt from the repository "
"instead of by hand, and the plant reuses the fleet's mesh network, DNS, monitoring and backups "
"instead of building them again. The factory application (cnx-factory, its own repository) uses "
"the Rust web stack B4L already runs for its other tools. Vendor instrument PCs stay appliances "
"that export into this estate and host nothing of ours. The plant runs without the internet: a "
"WAN outage stops only the customer portal, off-site backup and remote support, which catch up "
"when it returns."),
P("**Machine data access is a purchasing condition.** Every equipment RFQ carries a data clause: "
"for the presses, OPC UA (or Siemens S7) read access licensed and enabled, the full tag list "
"with the cycle counter as a tag, and no vendor cloud agent as a warranty condition; for the "
"boilers, chillers and compressor, Modbus with the register map delivered; for the air "
"conditioning, BACnet or Modbus read access to the building management system. The question is "
"free before a purchase order and expensive after it."),
B([
"**Log at the source.** Machine data comes from the machine, never from transcription; manual "
"steps get a badge tap and a scan at a station kiosk, not paperwork.",
"**Counters, not clocks.** Every press cycle carries the press's own cycle counter and every "
"measurement the serial of the part it was read from; wall-clock time is recorded, but two "
"systems are never joined on it.",
"**Environment attached.** Temperature, humidity and particulates of every zone are logged on "
"the same timeline, and each press cycle carries a snapshot of them.",
"**Operators see it first.** Every live value is shown at the station where it can change the "
"next cycle before it becomes a report. Sibert's advice after Haarlem was exactly this: "
"feedback loops the staff use to improve production decide whether a plant succeeds.",
"**Kept as long as it matters.** Logs for the life of the customer relationship; genealogy for "
"as long as the archive holds the metal.",
]),
P("**Identity travels with the product.** The matrix code scribed into the lacquer's dead wax "
"propagates through father, mother and stamper to every pressed record. A small angular fiducial "
"scribed beside it makes each part's rotation camera-readable at any stage, and lets the packing "
"station read the code on a finished record and match it to the jacket barcode. Nickel parts "
"additionally get a laser-marked serial on the back, as the optical-disc industry marked its "
"stampers; lacquers are never lasered (nitrocellulose is flammable) and records are never lasered "
"(burning PVC releases hydrochloric acid)."),
P("**The metal archive.** Decided in October 2026: the father **and** the mother of every side are "
"archived. As a rule of thumb a mother yields about ten stamper sets and a father five to ten "
"mothers, so a worn mother is regrown from the father without recutting the lacquer, and a "
"repress years later starts from metal the plant already holds. The archive room gets mobile "
"shelving (section 6.2); every box and shelf position has an address, and each part's serial "
"number in ERPNext carries its location, so a repress order says which box to pull."),
CALL("Why this is a product feature, not an internal file", [
"**Customers see their order.** A per-order portal reads the customer's own records and machine "
"data, without exposing anyone else's: progress through the three gates, copies pressed so far, "
"the compound lot's lab certificate, the listening checks. The investor demo shows the per-copy "
"version, a 'record passport' reached from the code on the sleeve (IDs simulated). Labels ask "
"about pre-release security and provenance before they send masters; this answers both.",
"**A complaint resolves backwards.** One noisy record resolves to its stamper, press, cycle, "
"operator, compound lot and packaging lot, and from the stamper back through mother and father "
"to the lacquer and the approved master. Root cause takes minutes, not a week of guessing.",
"**Stampers retire on data.** Audio scores trending down against a stamper's play count become "
"an automatic retirement signal instead of a customer complaint.",
"**Represses start from the shelf.** The archive location of every father and mother sits on its "
"serial number, so a repress is a regrow, not a recut.",
]),
P("**Cost and build.** The factory software is estimated at USD 60k to 170k, the ERPNext "
"implementation (configuration with Thai tax through Ecosoft's Thai localisation, the "
"integration, packaging for NixOS) at USD 15k to 50k, and the artist platform's public side at "
"USD 40k to 90k: the 115k to 310k software block in section 8 (estimates). No vendor sells a "
"turnkey version; it is a development project. Version 1 (intake, gates, genealogy, press runs "
"and cycles, the compound lot gate, packaging scan, shipments) goes live during commissioning, "
"and the network, servers and edge collectors go in before the machinery arrives, so vendor "
"engineers plug into a finished network and the first test pressings are already in the system. "
"Running it needs one automation and IT engineer from the build onward. Open design work: whether "
"the semi-automatic HRP 12 presses expose PLC data or need the priced sensor fallback (asked in "
"the Newbilt re-quote); how a press hands its cycle counter to the vision system; reading the "
"scribed dead-wax code with a camera on black and coloured vinyl (tested with samples first); "
"retention and PDPA handling for operator-linked records; Thai payroll and BOI raw-material "
"reporting in ERPNext."),
H2("5.2 Metrology: measuring the metal before it presses a single record"),
P("A stamper is a 0.2 to 0.3 mm nickel disc carrying a spiral ridge 40 to 80 microns wide and about "
"28 microns high, 200 to 350 turns per inch. Industry practice, even at respected stamper houses, "
"is to check its thickness with a hand micrometer at ten points on sacrificial blanks, with "
"nothing logged. A top-notch plant measures the metal without contact, per serial, and makes an "
"accept or reject decision on data before the next plating generation or the press mounting."),
T(["Instrument", "What it measures", "How it is used", "When"], [
["XRF thickness gauge (Fischer or Bowman class)", "Nickel deposit thickness, non-destructive",
"Per serial, read on the outer land zones; replaces the ten-point micrometer. Target total "
"thickness variation 10 to 20 microns", "At launch"],
["Inline machine vision", "Cosmetic defects", "100% of parts, fast", "At launch"],
["3D laser confocal microscope (Keyence VK-X class)", "Groove cross-section, wall roughness, "
"micro-defects; 20 nm vertical, ~120 nm lateral resolution, non-contact", "Sampled radial "
"zones (lead-in, outer, mid, inner) on fathers, mothers and stampers; the full spiral is not "
"feasible and not needed. The optical-disc industry verified its nickel stampers with this "
"instrument class", pick("From revenue", "At launch")],
["Wide-area optical profiler (Keyence VR-6000 class)", "Form, flatness, gross defects; 0.1 "
"micron height resolution, ~1 s per field, HDR mode for mirror-bright nickel",
"Fast whole-part mapping", pick("From revenue", "At launch")],
["Stylus profilometer", "Traceable reference", "Calibrates the optical instruments",
"With the optical instruments"],
], widths_mm=[38, 46, 56, 30], font_pt=8.5),
P("**Hardness comes free with the punch.** The Sibert punch leaves one centre slug per stamper. "
"Marked with the part serial, it is a per-stamper coupon for hardness and thickness, logged "
"against the plating bath, as the optical-disc industry measured stamper hardness on the punched "
"centre rather than on the part. A fresh nickel bath plates soft at first, which changes how "
"stampers punch and finish, so this is the cheapest bath check the plant has. The structure of "
"that industry's stamper specification (thickness, flatness, hardness, back roughness, centre "
"hole, eccentricity, burr, visual defects) is the model for the acceptance specification this "
"plant still has to write."),
P("Integration is real but not turnkey: the instruments export CSV and raw 3D data and support "
"scripting, but there is no off-the-shelf connector to a factory system. A small watcher at the "
"metrology bench stamps each result with the part serial scanned from its back, writes the "
"verdict to the part's quality inspection in ERPNext and the raw file to the machine-data store."),
CALL(f"Metrology in {name()}: " + pick("the launch tier", "the full stack at launch"), pick([
"**At launch: XRF, inline vision and the audio station**, USD 170k to 460k (5.6M to 15.2M THB, "
"estimate, section 8). Every father, mother and stamper still gets its nickel thickness "
"measured per serial by XRF and its surface screened by vision, and every record is still "
"inspected optically on the three presses, logged per cycle and sampled by the audio station "
"(section 5.3).",
"**From revenue: the laser confocal and the wide-area profiler**, USD 180k to 350k (estimate). "
"Buying them later takes ~8.8M THB out of the capital round at the midpoint, one of the six "
"levers that bring the plan to ~180M THB. Until they arrive, groove geometry and form on the "
"metal are judged indirectly, through the test pressing and the audio station, as most plants "
"do today.",
"The data path is the same from the first day, so the later instruments plug in without "
"rework. Distributor quotes for the metrology stack are one of the four requests that settle "
"the budget.",
], [
"**At launch: the full stack.** The metrology and QC block is USD 350k to 810k (11.6M to 26.7M "
"THB, estimate, section 8): XRF, laser confocal, wide-area profiler, inline vision on the three "
"presses and the audio station. Every father, mother and stamper is measured before the next "
"plating generation or the press, and groove geometry and form on the metal are measured from "
"the first release.",
"**If quotes land high,** the laser confocal and the wide-area profiler (USD 180k to 350k, "
"estimate) are the part that can wait and be bought from revenue: thickness and cosmetics "
"would still be measured on every part, and groove geometry judged through the test pressing "
"and the audio station meanwhile, as most plants do today.",
"Either way the data path is the same, so later instruments plug in without rework. "
"Distributor quotes for the metrology stack are one of the four requests that settle the "
"budget.",
])),
H2("5.3 Quality control: three layers for every record, one gate for every material"),
P("Full automated audio checking of every record is physically impossible: a 12-inch record plays "
"for about 40 minutes and a press makes a new one every 25 to 30 seconds, so one press outruns "
"roughly 80 to 95 full-time listening stations. No playback-QC robot exists anywhere. The credible "
"maximum-automation design is layered, and it is described to customers exactly as it is: 100% "
"optical plus per-cycle telemetry plus sampled audio, with human ears approving every test "
"pressing."),
T(["Layer", "What", "Catches", "Status"], [
["1. 100% inline optical inspection", "Darkfield line-scan cameras at the press unloader "
"inspect every record at line speed", "Non-fill (dull patches where PVC did not fill the "
"stamper), stitching and flow lines, warp, off-centre spindle holes, surface debris, wrong or "
"off-centre labels. Non-fill and stitching correlate with audible defects, so this is a strong "
"proxy for audio quality", "Custom integration of general machine vision (Keyence or Cognex "
"class) on all three presses; no vinyl-specific "
"product exists"],
["2. Press telemetry, every cycle", "Mould temperatures, pressures, cycle time, extruder values, "
"yields and drift alerts from the press PLC", "Process drift before it becomes a defect; the "
"record-level context for every other check", "Proven in the industry (Viryl's ADAPT model). "
"The Classic's Siemens PLC offers OPC UA (vendor "
"statement); for the HRP 12 the re-quote asks, "
"with a sensor fallback priced"],
["3. Automated audio comparison, sampled", "Needle-drop capture with automated analysis: "
"spectral-envelope comparison against the source master, click and pop counting, noise floor "
"from lead-in silence, channel balance; score and pass/fail to the record", "Wrong master cut "
"into good-looking grooves, EQ and mastering errors, speed and pitch problems; what no camera "
"can see", "Buildable from proven parts (Stamper Discs' Fonograph approach, iZotope-class "
"algorithms); first of its kind as a whole; " + pick("in the launch tier",
"at launch")],
], widths_mm=[30, 46, 54, 40], font_pt=8.5),
P("**Sampling rule for layer 3:** every test pressing and first-off per stamper, plus pulled "
"samples densifying as the stamper ages (a stamper lasts roughly 1,000 to 2,000 records; the "
"industry rule of thumb is a spot-play around every 50th)."),
H3("The materials lab"),
P("Every incoming compound lot passes a gate before it reaches a press, and its lot ID follows every "
"record pressed from it. Per lot, in-house from day one, on benchtop instruments with data "
"export: certificate of analysis against the agreed specification, moisture (the most common "
"cause of noisy surfaces), heat stability (PVC degradation releases hydrochloric acid and shows "
"as discoloration and noise), density, colour and gloss, granulate size and dust, specks on "
"pressed test plaques. In a climate of 60 to 90% ambient humidity a moisture result is only "
"comparable if the sample is taken sealed and conditioned the same way every time, so sample "
"conditioning is part of the method. New lots, and especially new suppliers, are released only by "
"a test pressing on a production press. This day-one tier is estimated at USD 55k to 150k and is "
"in the launch investment. The mature tier (torque rheometry, DSC, FTIR, ~USD 120k to 240k) is "
"deferred: Payap University's Faculty of Pharmacy and Chiang Mai University's science faculties "
"are the places to ask for contract testing in between (which instruments they hold is "
"unconfirmed). Supplier qualification uses an external lab for K-value, stabiliser "
"identification (legacy lead rejected) and heavy metals for export. The in-house regrind stream "
"has its own contamination gate. This protocol is how Thai and regional compounds are qualified "
"against the European references."),
H3("Packaging QC"),
P("Incoming cartons and sleeves are checked per delivery: dimensions (records must fit without "
"force; spine width per title), board grammage, print quality against the customer-approved "
"proof (spectrophotometer Delta E for colour-critical jobs), lamination and seam strength, inner "
"sleeve scuff risk. At assembly a camera reads the scribed dead-wax code (a handheld scanner "
"cannot read it reliably on black vinyl) and checks it against the jacket barcode, so a record "
"in the wrong jacket is caught systematically rather than being unlikely, and every unit's "
"barcode is verified. Results go back to Ploy Printing per packaging lot."),
H2("5.4 Efficiency: recover before you generate"),
P("The pressing machinery is a modest electrical load: 32 kVA connected for a full Duplex line. The "
"real demand sits in the utilities around it. " + pick(
"At launch the three presses need 450 to 540 kg/h of saturated steam at 10 bar / 180 °C and "
"~391.5 kW of cooling at a hot-afternoon peak; the utility backbone is built for the "
"five-press fleet (750 to 900 kg/h of steam, up to ~650 kW of cooling). ",
"At launch the three presses need 450 to 540 kg/h of saturated steam at 10 bar / 180 °C and "
"~391.5 kW of cooling at a hot-afternoon peak, on a utility backbone with rooms for four "
"boiler and four chiller modules, so the second Duplex system plugs in when revenue pays for "
"it. ") +
"On top comes whole-plant air conditioning in a tropical climate. Newbilt excludes "
"steam and cooling from its scope, so these systems are ours to design, and the design rests on "
"one observation: the steam's job is to heat the moulds and the cooling water's job is to remove "
"that same heat again. Roughly 98% of the press cooling load is heat the steam put into the "
"moulds, and the press cooling return leaves at about 60 °C. That warm return, the condensate and "
"the biomass boilers' flue gas are heat the plant reuses before it generates anything new."),
H3("Utilities: backbone once, modules with the presses"),
P("Everything that is cheap to oversize now and costly to change in a running plant is built once, "
"for the five-press fleet: the boiler hall and the chiller compound with room for four modules "
"each, the steam main and condensate return, the cooling mains, the heat-exchanger frame and "
"tanks, and hydraulic and compressed-air ring mains with a valved, capped tee at every press "
"position. The machines that make steam and cold water come in identical modules: at launch "
"two 500 kg/h biomass boilers (B-1, B-2) for the 450 to 540 kg/h peak (one ~1 t/h package is "
"the alternative) and two 250 kW air-cooled chillers rated at 40 °C ambient (CH-1, CH-2) for "
"~391.5 kW, sequenced lead and lag by one controller. Either boiler alone carries 93 to 111% of "
"the steam demand; one chiller out leaves ~64% of the cooling peak. Both plans make their steam "
"from biomass (below); " + pick(
"the boilers come from a Thai maker and the compressor from a Chinese brand's Thai office. ",
"the boilers and the compressor come from Thai suppliers, with local service. ") +
"Identical modules mean one set of spares "
"and one service routine, N+1 later is one more module rather than a redesign, and the plant "
"never runs one oversized boiler at poor part load. Four boilers carry about eight presses with "
"one in reserve; four 250 kW chillers carry the five-press fleet with the fourth in reserve, and "
"pads for the next chiller frame up (about 350 kW, estimate) are a priced option in the chiller "
"RFQ. The central hydraulic plant around the Newbilt aggregates (standby pump set, accumulator "
"station, ring main) is not costed yet; a Thai hydraulic power unit builder quotes it."),
T(["Measure", "What it does", "Effect"], [
["1. Flue-gas economizer (fired boilers)", "Recovers stack heat into the boiler feedwater; the "
"first measure to investigate on the biomass bank (an electric boiler has no flue gas)",
"Outlet and stack temperatures are vendor figures; rice-husk ash is abrasive, so the RFQ asks "
"for cleaning, wear protection and a bypass"],
["2. Condensate return", "As much clean, hot condensate back to the feed tank as possible",
"Less water, treatment and fuel. Steam and cooling water share the mould channels, so the "
"condensate is only as clean as the cooling loop: a conductivity sensor diverts off-spec "
"condensate"],
["3. Feedwater heat pump, if it pays", "Lifts the ~60 °C press return into feedwater at 90 to "
"95 °C, cutting the boiler's work and the chiller's load at once", "With condensate return, "
"roughly 10 to 15% of steam energy. With most condensate returned the remaining feed-tank load "
"is small, so it may not pay; the press return profile Newbilt is asked for decides"],
["Waste heat for low-grade loads", "The label dry oven and the air conditioning's "
"dehumidification reheat run on recovered press heat", "Displaces fresh electricity in two "
"continuous loads"],
["Steam accumulator", "Presses draw steam in bursts; an accumulator (a Newbilt option) lets the "
"boilers ride the peaks", "Steadier firing; whether a modular bank needs it is a re-quote "
"question"],
["Closed loop, air-cooled chillers", "The press returns drain open into a vented warm tank and "
"go back through a plate heat exchanger to the chillers; no open 'dirty water' loop as in the "
"reference schematic, and no cooling tower", "No process water discharged; the largest water "
"draw of the earlier water-cooled concept (tower "
"evaporation) is gone"],
["Regrind loop", "In-house grinder returns trimmings and rejects to the extruder at 20% of "
"the feed", "Scrap is feedstock, not landfill; ~20% less virgin compound"],
], widths_mm=[38, 66, 66], font_pt=8.5),
P("Three things were checked and ruled out. Heat pumps cannot make the final 10 bar / 180 °C steam "
"(commercial units top out around 120 to 165 °C, and core utility reliability is the wrong place "
"to pioneer). Ground-source heat exchange does not work in Thailand (the ground sits at 28 to "
"30 °C, too cold for process heat and warmer than the cooling loop wants). Solar-thermal "
"feedwater preheat only reaches the 60 to 90 °C the heat recovery already gives for free, "
"concentrating collectors need strong direct sun that northern haze does not give, and the roof "
"earns more as PV. The boiler only does the final lift, from already-hot feedwater."),
H3("The grid tariff, and what it decides"),
P("The plant is on PEA's time-of-use tariff 3.2.2 (medium general service at 22 kV; the flat rate "
"is closed to new customers), never a flat kWh price: a demand charge of 132.93 THB per kW of the "
"highest 15-minute demand in peak hours, 4.1839 THB/kWh in the peak window (09:00 to 22:00 on "
"weekdays) and 2.6037 THB/kWh off-peak, plus the Ft fuel adjustment (+0.1623 THB/kWh for "
"September to December 2026; it resets every four months) and reclaimable VAT. Two shifts put "
"about two thirds of process energy into peak hours: a blended ~3.81 THB/kWh before the demand "
"charge. For the five-press fleet the backbone is built for, on biomass steam with no electric "
"boiler on the grid, that is roughly 4.5M to 6.8M THB a year before solar, 0.7M to 1.1M of it "
"demand charge, on an 800 to 1,000 kVA connection; the launch plant's peak demand is ~264 kW, "
"against ~980 kW had its steam been electric (estimates). Three design consequences:"),
B([
"**Steam comes from biomass in both plans,** because biomass heat is far cheaper than "
"electric steam (below): an electric boiler's full-power draw would set the demand charge, and "
"the peak window covers 13 of the 16 production hours.",
"**The factory 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)", "") +
"; 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([
["PV on the factory roof", "~520 kWp (decided October 2026: PV on the factory only, the other "
"roofs PV-ready). 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). ~730 to 780 MWh a year at "
"1,400 to 1,500 kWh/kWp, ~87% of it used on site (~633 MWh: two "
"shifts on 300 days, a ~60 kW base load off-shift and the "
"battery), about 61% of the launch plant's ~1,036 MWh a year of "
"electricity with biomass 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.3M to 2.5M THB a year at ~3.7 THB/kWh self-consumed and pays back in ~4.1 to 5.8 "
"years at 20 to 26 THB/W installed (estimates)")],
["Why ~520 kWp", "With biomass steam the running load is ~230 kW, with no electric boilers. An "
"hourly sketch (two shifts on 300 days, ~60 kW off-shift base load, the 271 kWh "
"battery, PEA's time-of-use tariff with Ft, 23,000 THB/kWp, 25 years at 8%) "
"puts the best array at ~500 to 550 kWp: the net present value peaks there, and "
"the kWp above ~550 lose money because more of their yield is curtailed. The "
"factory roof's ~520 kWp sits at that optimum (estimates)"],
["PV-ready: office roof and canopies", "The office roof (~65 kWp) and the car and scooter canopies "
"(~54 kWp: car ~42, scooter ~13) are built ready for panels: structure rated for them (~20 kg/m² "
"plus wind uplift), conduit and a cable route to the main board, and a spare way for a later "
"inverter. Panels go on when the load rises with the second Duplex system: ~120 kWp for ~2.4M "
"to 3.1M THB at 20 to 26 THB/W (estimate). The preparation is small (estimate) and sits in the "
"building and site works; the construction RFQ already specifies canopy steel carrying PV"],
["Zero export", "The ~13% 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 factory roof of the 60 × 25 m hall of section 6.2 takes only "
"~247 kWp (425 modules on the 1,523 m² monopitch roof), about half "
"the optimum; its parking canopies are PV-ready too (~40 to 54 kWp). "
"More 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), ~430 kVA in all (about nine 50 kW "
"units, 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 ~430 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 PPA covers the ~520 kWp factory "
"roof; the calculator carries 3.0 THB/kWh (estimate) for the ~633 MWh used on site, ~1.9M "
"THB or ~0.06M USD a year on the energy line. That keeps the PV EPC (USD 315k to 410k, "
"10.4M to 13.5M THB at 20 to 26 THB/W) and the battery (USD 61k to 106k) out of the capital "
"round: ~14.7M THB less at the midpoint, one of the six levers in section 8. The launch "
"plant's power bill (~0.36M THB a month before solar with biomass steam: ~1,036 MWh at the "
"blended ~3.81 THB/kWh plus the demand charge, 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 315k to 410k "
"(10.4M to 13.5M THB for ~520 kWp on the factory roof, 20 to 26 THB/W installed with "
"inverters at Thai 2026 market prices; the PV-ready canopy steel and conduit are in the "
"building and site works) and the battery, installed, USD 61k to 106k (2.0M to 3.5M THB): "
"~14.7M 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 ~633 MWh "
"used on site, ~1.9M THB or ~0.06M 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 ~14.7M 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: biomass in both plans"),
P("Both plans make their steam from biomass (decided October 2026): two 500 kg/h biomass modules "
"(B-1, B-2) or one ~1 t/h package, Getabec class, 6M to 10M THB installed with the fuel feed, "
"grate and dust control, plus a fuel store and handling block of 1.0M to 2.0M THB (a covered "
"store, a chip bay, ash bins and a compact loader; utilities CSV, estimates). The electric boiler "
"bank (4.5M to 7M THB from Thai suppliers, 2.8M to 5.5M through the Chinese route) is now the "
"alternative, not the plan. There is no natural gas pipeline in Northern Thailand, so gas would "
"mean a bulk LPG tank on site with hazardous-storage separation and licensing, and diesel a fuel "
"tank with price exposure. The two routes without a fossil tank, compared for the launch plant "
"at ~850k records a year (~1,403 t of steam, ~954 MWh of heat; estimates):"),
T(["", "Biomass boiler bank (~80%): the plan", "Electric boiler bank (~98%): the alternative"], [
["Price of heat", "~0.5 to 0.9 THB/kWh at 1.35 to 2 THB/kg delivered (reported market prices, "
"October 2026; no supplier quote yet), ~0.7 planned", "~3.9 THB/kWh, plus the demand charge"],
["Running cost, launch plant", "~0.67M THB a year of fuel at ~0.7 THB/kWh: about 300 t of "
"air-dry wood or ~460 t of fresh chips, plus handling and ash", "~4.9M THB a year: ~973 MWh at "
"the blended ~3.81 THB/kWh plus the demand charge on 2 × 360 kW of boilers"],
["Boiler package, 2 × 500 kg/h", "~6M to 10M THB installed, plus 1.0M to 2.0M for the fuel "
"store and handling", "4.5M to 7M THB from Thai suppliers, ~2.8M to 5.5M through the Chinese "
"route"],
["Grid", "Launch plant peak demand ~264 kW; 800 to 1,000 kVA for the five-press backbone",
"~980 kW at launch; the five presses ~950 to 1,330 kW, PEA Schedule 4, 1,250 to 1,600 kVA"],
["Also", "Fuel contracts and a monsoon stock, ash handling, a 14 m flue stack with a dust "
"collector, more maintenance, a certified boiler attendant, emission limits in the permit",
"Cleanest permitting, no fuel logistics, no stack"],
], widths_mm=[32, 70, 68], font_pt=8.5),
P("**Reading it.** The electric boiler is the more efficient machine; biomass is by far the cheaper "
"heat. At launch biomass saves **~4.2M THB (~0.13M USD) a year** against electric steam, so it "
"repays its higher price and the fuel store (~3.8M to 5.4M THB more at the midpoints than a Thai "
"or a Chinese electric bank) in about a year (estimates). Without electric boilers the plant's "
"demand stays at ~264 kW instead of ~980 kW, which also means a smaller transformer and PEA "
"deposit (not re-priced; an upside). The earlier staged path (start electric, add biomass later) "
"is dropped: each year on electric steam would cost about that ~4.2M THB more. The site still "
"matters: next to the pharmaceutical facility on Payap land a biomass stack is a hard sell, so "
"the GMP-neighbour check (section 6.1) asks about it before any design work, and the electric "
"bank is the fall-back there."),
P("**What biomass brings with it.** Fuel contracts and a dry stock for the monsoon: the 42 m² store "
"drawn in the utility yard holds ~6 to 7 weeks of fresh chips, and a 3-month monsoon stock needs "
"~80 m² (estimates). Ash to handle and dispose of. The 14 m flue stack and the dust collector, "
"already drawn in the utility yard. More maintenance than an electric bank, and a certified boiler "
"attendant from the maintenance team as the licensed boiler controller (section 7.2). Boiler "
"registration and the air-emission limits for a solid-fuel boiler in the permit work (to confirm, "
"section 7.2). And a visible point source in Chiang Mai's burning season (February to April): dust "
"control matters for the story as much as for the permit, and buying farm residues that would "
"otherwise be burned in the fields is the other half of that story."),
P("**Fuel.** The launch plant burns about 300 t of air-dry wood or ~460 t of fresh chips a year at "
"~850k records; the five-press fleet at about 1.0 million records would burn 350 to 400 t air-dry "
"(~540 to 620 t as fresh chips; estimates). Lamphun alone produces more than 900,000 t of farm "
"residues a year (Maejo University), so supply is not the constraint; price is. Reported prices "
"follow diesel, so the fuel contract gets a diesel clause and sources within ~50 km. The local "
"price-setter is Ratch Pathana's biomass buying centre at Pa Sak, Mueang Lamphun, which feeds a "
"9.6 MW cogeneration plant and competes for the same fuel. The team's own 60 rai of "
"forestry-classified land could supply 80 to 135 t a year as short-rotation coppice, an upside "
"once its title is checked; at market prices that is worth only ~0.1M to 0.25M THB a year, so its "
"value is supply security and the story ('records pressed with steam from our own trees'), not "
"the fuel bill. Next step: written quotes from Pa Sak and two or three chip suppliers, priced by "
"moisture, before the boiler order."),
P("**Where the boilers come from.** Both plans price the biomass modules from a Thai maker with "
"Thai fabrication and service (Getabec class, 6M to 10M THB installed; utilities CSV, estimate). "
"Chinese makers build biomass boilers too (ZOZEN DZL, Sitong DZL and SZL, Taiguo, Yongxing), but "
"none is priced yet: the Chinese route checked so far priced only electric boilers. " + pick(
"That makes a Chinese biomass quote a decision point for this plan: one ~2M THB or more below "
"the Thai package would bring Plan A back under 180M THB at the midpoint. What this plan takes "
"through the Chinese route is the compressor, a Chinese brand bought through its Thai office "
"(Kaishan and Denair have one) so service stays local, ~0.25M THB less at the midpoint "
"(estimate from listings, not a quote). ",
"A Chinese biomass quote is a step if quotes land high, and so is a Chinese compressor brand "
"bought through its Thai office (Kaishan and Denair have one), ~0.25M THB less at the midpoint "
"(estimate from listings, not a quote); this plan buys the compressor from a Thai supplier. ") +
"Any module, Thai or imported, is specified as a 1.25 MPa design to ASME Section I with the S "
"stamp (most Chinese packaged electric units are rated 0.4 to 0.8 MPa and cannot deliver 10 bar). "
"An imported boiler must meet TIS, ASME, JIS, EN or an equivalent standard and be verified by a "
"certification body registered with the Department of Industrial Works (DIW), engaged before the "
"order (section 7). No mainland maker has a verified Thai service partner, so for an imported "
"boiler a Thai boiler contractor and the certification body would be the service layer. Chillers "
"and air conditioning, the larger blocks, have not been checked for a Chinese route yet."),
H3("Water"),
P("Water arriving is still open: no source is confirmed for the candidate site (PWA mains, a "
"licensed deep well, or both), and a water analysis comes before the boiler and chiller RFQs "
"because it decides softener or RO. The earlier demand estimate of ~15 m³ a day (~20 with "
"margin) was over half cooling-tower evaporation and blowdown; the air-cooled chiller bank has "
"no tower, so that figure is now on the safe side until the water balance is redone with the "
"site. Storage is a dedicated ~200 m³ fire reserve plus a ~50 m³ raw-water tank. **No process "
"water is discharged:** cooling is a closed loop, condensate is returned, galvanics rinse water "
"goes through a zero-discharge evaporator with metal recovery and the DI water plant (USD 97k to "
"258k, in the launch investment) in a water-treatment building of its own next to galvanics, "
"the stamper back-finisher's spent water and filters take the same route, the workshop has no "
"floor drain, and solvents leave as controlled waste. This is a fixed design requirement, not an "
"aspiration to be traded away during engineering."),
H3("Climate control as a product"),
P("The whole plant runs under continuous control: 20 to 26 °C, 35 to 60% relative humidity, and "
"particulate filtration (F7 to F9 general, HEPA with positive pressure in the cutting room and "
"galvanics clean room), with sensors logging in every zone. Moisture in PVC compound causes "
"bubbles, non-fill and surface defects and drives cooling rate, hence flatness and warp; airborne "
"particulate embeds in the record surface and is the classic source of clicks and pops. Northern "
"Thailand's burning season (February to April) brings some of the world's worst PM2.5 episodes, "
"so a plant without filtration would press different records in March than in September. This "
"is the plant's largest utility line (THB 7.5M to 15M for ~1,500 m², plus THB 1.2M to 3.4M for "
"the two clean zones, estimates) and it is treated as part of the product, not as overhead. The "
"35% humidity floor is aggressive for the tropics and drives desiccant cost; if 45% proves "
"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; steam comes from "
"biomass in both plans, at about a seventh of what electric steam would cost (~0.67M against "
"~4.9M THB a year at launch, estimate); the factory roof carries PV" +
pick(" through a solar PPA", "") + " (~520 kWp, ~61% of the launch plant's electricity, "
"estimate), with the office roof and the canopies ready for more panels and a battery for "
"ride-through; no process water is discharged; and a fifth of the plastic is reclaimed. The "
"same choices push the energy line "
"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."),
H2("5.5 The software: plant overview, factory console and artist platform"),
P("Three pieces of software carry the traceability and the customer promise of this plan into daily "
"work. All three exist today as working demos on the project's test site, run on simulated data: "
"orders, customers, IDs and measurements are invented, while the stages, checks, cycle times and "
"shifts follow the plan. They show investors, vendors and future staff what is being built. The "
"production versions are the development project of section 5.1 (software block USD 115k to 310k, "
"estimate), built on ERPNext as the plant's only system of record."),
H3("Plant overview (SCADA)"),
P("One screen for the whole plant: the metal path from audio intake through mastering, lathe cutting, "
"the Pheenix Alpha galvanics line and Sibert stamper prep to the stamper rack; the press hall with "
"its presses, extruders, material lab and compound silos; inspection, packaging and fulfilment; and "
"underneath them the utilities (steam, process cooling, compressed air, hydraulics, water treatment, "
"energy and PV, HVAC). The demo animates the launch plant at real cycle times, from real time up "
"to 3600× (a day in 24 seconds); every station opens with its figures and the source of each, and "
"the three artist gates show how many titles wait at each. In the plant the same screen is fed "
"from the machine-data store instead of the simulation: the presses over OPC UA, boilers, chillers "
"and compressor over Modbus (the data clause in every equipment RFQ). Alarms go to the shift's "
"phones and keep working with the internet down."),
IMG("renders/demos/scada.png", 170,
"Figure 2. Plant overview (simulated SCADA) of the launch plant, running at 60×: header with shift, "
"presses running, cycles an hour, good records and rejects, metal in work, steam pressure, plant "
"load and solar; metal path on top, press hall and finishing in the middle, utilities below. "
"Demo (docs/plant-operation.html), simulated values."),
H3("Back office: the factory console on ERPNext"),
P("The factory application (working name cnx-factory) is the plant's working interface. It shows the "
"press floor with live counters per press, stamper life and the optical result of every record; "
"work orders per station in kiosk form (badge in, scan what the step asks for, confirm); the "
"material lab gate with lots on hold; stamper metrology and the lacquer, father, mother and stamper "
"genealogy; the hash-chained event log; and the customer portal of the same orders. It keeps no "
"business records of its own: orders, job cards, batches, inspections, metal parts, deliveries and "
"invoices are posted to ERPNext through an outbox, so no press waits for the ERP, and the office "
"works in ERPNext's own desk for purchasing, accounts, stock and planning."),
IMG("renders/demos/factory-floor.png", 165,
"Figure 3. Factory console, press floor: good and rejected records today, presses running, orders "
"in production and waiting at an artist gate, compound on hold; one card per press with its order, "
"progress, stamper set and play count, cycle time and steam temperature; the optical inspection "
"stream keyed by stamper, press and cycle time; what needs attention. Demo "
"(docs/factory-console.html), simulated orders and values; the demo runs one Duplex system and "
"one Classic."),
IMG("renders/demos/factory-erp.png", 165,
"Figure 4. The ERPNext link: every posting the floor makes (job cards, serial numbers of lacquers, "
"fathers, mothers and stampers, quality inspections, artist gates, downtime entries, purchase "
"receipts), its document name in ERPNext and its outbox status. Demo, simulated documents."),
H3("Artist platform: order, fund and follow a record"),
P("The artist platform is the plant's front door for every customer. The customer configures the "
"record against a to-scale mock-up; uploads music and artwork, which are checked in the browser "
"and never uploaded in the demo (format, sample rate and bit depth, clipping, side length; artwork "
"size, spine, bleed, resolution and colour against downloadable templates); approves the master "
"plan, the first of the three artist gates; and receives an itemised offer with its lead time. In "
"the demo's example a 12-inch black LP with a printed jacket costs 37,836 THB once per title and "
"343 THB a copy all in at 300 copies (indicative prices, estimates)."),
IMG("renders/demos/artist-offer.png", 160,
"Figure 5. Artist ordering: the itemised offer, per title (mastering, lacquers, cutting, "
"electroforming with the father and mother kept for represses, press setup, test pressings) and "
"per copy (pressing, sleeve, assembly, printed jacket, shrink wrap), with the mock-up and the "
"lead time. Demo (docs/artist-order.html), price list demo-0.1, indicative."),
P("The artist then orders directly or runs a fan-funded campaign: fans pre-order at the artist's price "
"into a ring-fenced account, the plant presses from 100 copies, and if the goal is missed every fan "
"is refunded. At a fan price of 1,200 THB the artist needs 100 fans, breaks even at 41 and keeps "
"~548 THB a copy at the goal. After delivery each copy has a record passport, reached from the code "
"on its sleeve: the traceability record of that one copy, from the approved master through lacquer, "
"father, mother and stamper to the press cycle and the packing scan. Campaigns go live only after "
"the first paying releases have shipped and lead times are measured. The public side is costed at "
"USD 40k to 90k within the software block (estimate). The platform's name is undecided."),
IMG("renders/demos/fan-funding.png", 160,
"Figure 6. Fan funding in the investor demo of the platform: the artist sets the fan price and "
"the deadline; the fans needed follow from the 100-copy minimum and the break-even, with what the "
"artist keeps. Demo (docs/make-a-record.html), indicative prices."),
IMG("renders/demos/record-passport.png", 160,
"Figure 7. Record passport of one copy: the record key (stamper, press, cycle time, side) and the "
"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"),
P("The site strategy is a **long-term lease of raw land**, on which the purpose-built plant is "
"constructed. Compared with buying 6 to 8 rai this keeps ~12M to 32M THB (~0.36M to 0.97M USD, "
"at the 2 to 4 million THB per rai the plan carried for a purchase) out of the capital round, "
"removes land from the balance sheet, and matches how most foreign-invested manufacturing in "
"Thailand holds its site. Three candidates are on file; nothing is signed."),
T(["", "Mueang Chi, Lamphun", "Northern Region Industrial Estate, Lamphun",
"Payap University land, Chiang Mai"], [
["Status", "Working candidate: the massing model, PV roof study and construction RFQ are sited "
"here", "Fallback", "New lead (October 2026): the university is interested in "
"leasing land to us. The point it gave fails zoning; its other "
"land is not checked yet"],
["Plot", "5-0-66.5 rai on the deed, narrow and skewed", "Leased estate plots", "Not known yet: "
"boundary, size and title to come"],
["To Chiang Mai old city", "~35 km", "Lamphun valley", "~5 km, on the Chiang Mai to Lampang "
"superhighway"],
["Zoning", "Unverified (agricultural land): the first check", "Industrial estate; licensing "
"through the estate", "At the point given: zone ย.7-1, very high density residential; record "
"pressing not permitted (Chiang Mai city plan in force from 25 May 2026)"],
["Galvanics effluent", "Ours to permit; zero discharge", "Shared central effluent treatment",
"Lessor's written consent on top of the permit"],
["Neighbours", "Agricultural", "Industrial", "A pharmaceutical facility under construction on "
"the same land"],
], widths_mm=[28, 44, 44, 54], font_pt=8.5),
P("**Galvanics now raises the bar for every site.** With the electroplating line in the plan, a "
"plot has to permit record pressing with a biomass-fired steam boiler **and** electroplating "
"from day "
"one, not in a later phase. That favours the industrial estate (licensing through the estate, "
"shared effluent treatment) and makes zoning the first check everywhere else."),
P("**Payap University** approached the project and is interested in leasing land next to a "
"pharmaceutical facility under construction. The point it gave was checked on the land-use map "
"of the Department of Public Works and Town and Country Planning on 14 October 2026: zone ย.7-1, "
"very high density residential, where factory type 107 (whose definition names gramophone "
"records) is not permitted and type 72 is allowed only for repair, so a record plant cannot get "
"a factory licence there. The same city plan permits type 107 in its low density residential "
"and rural and agricultural zones, so Payap's other land is worth checking before the lead is "
"dropped (the map data is preliminary; the provincial town planning office confirms). On 20 October "
"2026 Payap said the land can be rezoned, so the lead stays open: a rezoning is an amendment of the "
"city plan under section 35 of the Town Planning Act B.E. 2562, started by the Department of Public "
"Works and Town and Country Planning, approved by the Town Planning Commission, posted 30 days for "
"objections and issued as a new Ministry of Interior notification after Cabinet approval; the "
"department's own work plan schedules ~16 months without objections and ~19 with. Building permit "
"and factory licence wait for it, so a rezoned Payap plot moves first production by roughly a year "
"unless the request starts now (estimate); a written answer from the provincial office is the "
"next step. Why it is "
"worth the checks: it is ~5 km from the old city, 25 to 30 km nearer the team, customers and the "
"airport than Mueang Chi, which helps tours, the artist platform and hiring; and Payap is a "
"partner, not only a landlord: it wants joint student programmes with us in mastering, lathe "
"cutting, IT and business administration, and its Faculty of Pharmacy has analytical labs that "
"could back the PVC lab. Any Payap plot is checked in this order, before any design work:"),
N([
"**Zoning:** the plot's zone in the Chiang Mai city plan allows a record-pressing factory with a "
"biomass-fired steam boiler and electroplating (the neighbour's pharmaceutical permit proves "
"little).",
"**Lease-ability:** Chanote title, university council approval, and whether campus land of a "
"private university can be leased commercially; with Thai counsel, together with the lease "
"terms below.",
"**The GMP neighbour:** a pharmaceutical plant is sensitive to the biomass boiler's stack, galvanics "
"extraction, extrusion fumes, noise and trucks; emission and buffer rules go into the lease, "
"not after the first complaint.",
"**Flooding:** Payap describes the land as low-lying when bought; check the plot against the "
"2024 flood extents.",
"**Plot fit:** the building, the detached utility yard and a second building need 6 to 8 rai; "
"the Payap scenario model draws a 150 m square (14.1 rai) with room for the full press hall.",
"**Galvanics on a campus:** the lessor's written consent; zero discharge becomes a lease "
"condition, not only a commitment.",
]),
P("Nothing is re-sited until a Payap plot passes zoning (as the plan stands or once a rezoning is "
"gazetted) and lease-ability: the model, the PV study, "
"the RFQ and the plant's network site code stay on Mueang Chi. The lease itself must meet these "
"conditions, which Thai counsel resolves before signature:"),
B([
"**Term and registration.** A lease over three years must be registered at the Land Office to "
"be enforceable; the ordinary maximum is 30 years, and for industrial and commercial use the "
"Hire of Immovable Property for Commerce and Industry Act allows up to 50 years for qualifying "
"projects. The plan assumes a registered 30-year lease with a contractual renewal option, and "
"will test the 50-year route with counsel.",
"**Building ownership.** The lease states that the buildings, foundations, tanks and fixed "
"plant belong to the company for the term, what happens to them at expiry, and that the company "
"may mortgage or assign them. Without this, financing the building is difficult.",
"**Lessor's title and encumbrances.** A clean Chanote title, no mortgage that could foreclose "
"over the tenant, consent from any co-owners. A lease of Sor Por Kor or forestry-classified land "
"is not acceptable.",
"**BOI.** BOI's land-ownership privilege for foreign-held promoted companies is simply not "
"used; leasing does not affect the promotion.",
"**Rent.** Not negotiated. The plan carries THB 0.3M to 1.0M a year (USD 9k to 30k) as an "
"estimate for 5 to 8 rai of agricultural land in the Lamphun valley, with the lease deposit and "
"first-year rent in the working-capital block; IEAT plots run higher, and Payap has named no "
"figure.",
]),
P("Land requirements: ~4 rai minimum, 6 to 8 rai comfortable with expansion; truck access and "
"turning, parking, the detached utility yard with truck access for biomass deliveries, a "
"separated battery enclosure, and a medium-voltage connection from PEA (800 to 1,000 kVA for the "
"five-press backbone on biomass steam; electric steam would need 1,250 to 1,600 kVA)."),
H2("6.2 The building"),
P("The main building is a single-storey steel portal frame (pre-engineered) of **60 × 25 m "
"(1,500 m²)**, designed from day one for an overhead crane, with a 10° monopitch roof carrying the "
"PV array, low eave 7.0 m, high side ~11.4 m. The floor is a 200 mm slab rated 30 kN/m² (3 t/m², "
"the standard industrial class the presses and racking need) raised 1.2 m above ground, so that "
"two sealed loading docks work at trailer height and the docked trailer acts as the airlock. The "
"envelope is insulated PIR sandwich panel (100 mm roof, 75 mm walls) on a 2.5 m masonry dado, "
"taped and gasketed, because the building is air-conditioned and must be airtight against "
"smoke-season particulate; mineral-wool panels where fire compartmentation (EI 60 or 120) or "
"acoustics require them."),
T(["Zone", "Area"], [
["Semi-automatic press hall (Newbilt Duplex specification)", "~200 m²"],
["Automatic press zone", "~100 to 150 m²"],
["Galvanics clean room, water treatment, chemical storage", "~80 to 150 m²"],
["Mastering and cutting room", "~40 to 60 m²"],
["Stamper preparation", "~30 m²"],
["Packaging and finished-goods warehouse", "~300 to 500 m²"],
["Utility rooms (boiler, compressor, chiller, electrical)", "~100 to 150 m²"],
["Offices, QC and listening room, archive, IT, entrance", "~150 to 200 m²"],
["Maintenance workshop and machine bay (" + pick("crane-ready", "crane-served") + ")",
"~100 to 150 m²"],
[pick("Visitor corridor (glazed, ground level; built later, its strip kept free)",
"Visitor corridor (glazed, ground level)"), "~110 to 130 m²"],
["Circulation, walls, miscellaneous", "~150 to 250 m²"],
["**Total under roof**", "**~1,400 to 2,000 m²**, against 1,500 m² built"],
], widths_mm=[110, 60],
caption="Estimates. The boiler and chillers have since moved to the detached utility yard, which "
"frees floor the workshop and corridor take; water treatment is proposed in its own "
"building next to galvanics; cassette and CD-R duplication (~40 to 80 m² and ~20 to "
"40 m²" + pick(", a later step in this plan", "") + ") are not in the table yet. "
"At the lower half of the table everything fits in "
"1,500 m²; at the upper half, finished goods move to a second building."),
P("Figures 8 to 10 show the plant as the plant and business plan calculator draws it for " + label() +
". The calculator draws the Payap scenario model (section 6.1): a 128 × 25 m production floor in "
"process order along the glazed visitor corridor, a two-storey office, the detached utility yard "
"and a press hall of ~870 m² laid out for five Duplex bays and four Classic positions, on a "
"150 × 150 m placeholder plot. The building described above and the zone table are the 60 × 25 m "
"hall for Mueang Chi; which layout is built is decided once a plot passes zoning and lease-ability. " +
"The views look at the front of the site: the road, the car park, the office and the "
"visitor-corridor facade are in the foreground. " +
"The calculator itself is interactive: rotate, zoom, switch floors and tap any object for its "
"figures and their source."),
IMG(pick("renders/calculator/plan-a-iso-roof.png", "renders/calculator/plan-b-iso-roof.png"), 170,
"Figure 8. The site from above, " + label() + " preset of the plant and business plan calculator: "
"PV on the factory roof, ~520 kWp" + pick(", supplied through the solar PPA (the battery is drawn "
"too; whether a PPA offer includes it is open)",
", owned with the battery") +
", with the office roof and the car and scooter canopies PV-ready and without panels; the "
"utility yard (biomass boiler hall and chiller compound built for four modules each, the "
"biomass fuel store, the flue stack and dust collector, 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 "
"staff entry, workshop, galvanics (PASU, PPPU, PDPU, PMPB), Sibert stamper prep, metrology" +
pick(" (launch tier)", "") + ", PVC lab and colour store, then the press hall, optical inspection, "
"finishing and packaging, the warehouse and dispatch; the office with reception, lathe and cutting "
"room, listening room and archive. " + pick(
"The frame is crane-ready with the crane rented; the visitor corridor, cassette and CD-R come "
"later. ",
"With the 5 t crane, the visitor corridor and the cassette and CD-R rooms. ") +
"Schematic, estimates."),
IMG(pick("renders/calculator/plan-a-iso-hall.png", "renders/calculator/plan-b-iso-hall.png"), 170,
"Figure 10. The press hall close up, " + label() + " preset: " + pick(
"Duplex system 1 (two HRP 12 presses with their extruders) and the Classic; the dashed "
"outlines are the free Duplex bays and Classic positions for growth. In the yard, biomass "
"boiler modules B-1 and B-2 with the fuel store, flue stack and dust collector, and chillers "
"CH-1 and CH-2, with B-3, B-4, CH-3 and CH-4 free",
"Duplex system 1 (two HRP 12 presses with their extruders) and the Classic, in a hall laid "
"out for five Duplex bays and four Classic positions; the dashed outlines are the free bays "
"and positions for growth. In the yard, biomass boiler modules B-1 and B-2 with the fuel "
"store, flue stack and dust collector, and chillers CH-1 and CH-2, with B-3, B-4, CH-3 and "
"CH-4 free; the 5 t crane over the hall, the visitor corridor "
"and the cassette and CD-R rooms are in place") +
". Schematic, estimates."),
H3("Crane, workshop and visitor corridor"),
B(pick([
"**A crane-ready frame, with the crane rented at first.** The frame, the runway and the machine "
"door are built for a 5 t overhead crane (single-girder, ~24 m span, inverter drives, radio "
"remote) over the whole production compartment, roughly 40 to 48 m of the 60 m, stopping at "
"the fire wall to the finished-goods warehouse. For the installations a mobile crane is hired, "
"and the crane itself is bought later if machine moves and maintenance lifts make it worth it. "
"The building is shaped for it from the start: a frame designed for crane loads, no "
"full-height cross walls in the crane zone (rooms there are lidded boxes, with removable "
"hatches where heavy kit goes in), and the cutting room kept outside it, away from the frame's "
"vibration. 5 t covers the heaviest known lift (a Newbilt HRP 12 press, 1,350 kg) with margin "
"until Newbilt states the Classic's weight; 3.2 t is the alternative price.",
"**A machine door** of ~4.5 × 5.0 m at the ramp end, opened a few times a year. Until a crane "
"is bought, the hired crane sets each machine on skates at the door threshold; with the crane, "
"a truck reverses up the ramp into the machine bay and the crane lifts the machine off the bed "
"inside.",
"**A maintenance workshop** of ~100 to 150 m² beside it, where a bought crane would park: a "
"service bay for one press-sized machine, benches, a hydraulic hose crimper, a spares store "
"tracked in ERPNext, and a hot-work corner, held at negative pressure so its dust never "
"reaches the presses. Newbilt service comes from Germany and Pheenix from Sweden; spares on "
"the shelf are the uptime lever.",
"**A glazed visitor corridor, built later.** The plan runs without public tours at first, but "
"the route is designed in: the strip along the car-park wall stays free and the stations "
"follow the process order, from the cutting-room window to packaging. Built, it is ~45 to 55 m "
"long and ~2.4 m clear, with its own filtered air at slight positive pressure and acoustic "
"glazing that brings the 80 to 90 dB(A) near the presses down to roughly 40 to 50 dB(A) "
"(estimates), so a guide talks without a headset and visitors need no PPE; a 1:12 accessible "
"ramp serves the entrance. Until it is built there are no public tours, and the tour route and "
"the Payap programmes start later.",
], [
"**A 5 t overhead crane** (single-girder, ~24 m span, inverter drives, radio remote) runs over "
"the whole production compartment, roughly 40 to 48 m of the 60 m, and stops at the fire wall "
"to the finished-goods warehouse. Machines are moved in, out and around without hiring a mobile "
"crane. It shapes the building: a frame designed for crane loads, no full-height cross walls in "
"the crane zone (rooms there are lidded boxes, with removable hatches where heavy kit goes in), "
"and the cutting room kept outside it, away from the frame's vibration. 5 t covers the heaviest "
"known lift (a Newbilt HRP 12 press, 1,350 kg) with margin until Newbilt states the Classic's "
"weight; 3.2 t is the alternative price.",
"**A machine door** of ~4.5 × 5.0 m at the ramp end, opened a few times a year: a truck reverses "
"up the ramp into the machine bay and the crane lifts the machine off the bed inside.",
"**A maintenance workshop** of ~100 to 150 m² beside it, where the crane parks: a service bay "
"for one press-sized machine, benches, a hydraulic hose crimper, a spares store tracked in "
"ERPNext, and a hot-work corner, held at negative pressure so its dust never reaches the "
"presses. Newbilt service comes from Germany and Pheenix from Sweden; spares on the shelf are "
"the uptime lever.",
"**A glazed visitor corridor** at ground level along the car-park wall (~45 to 55 m, ~2.4 m "
"clear), with stations in process order from the cutting-room window to packaging. It has its "
"own filtered air at slight positive pressure and acoustic glazing that brings the 80 to 90 "
"dB(A) near the presses down to roughly 40 to 50 dB(A) (estimates), so a guide talks without a "
"headset and visitors need no PPE; a 1:12 accessible ramp serves the entrance. Tours for "
"artists, labels, investors and schools can run several times a day without stopping "
"production, and the tour route and the Payap programmes start with the plant.",
])),
H3("Utility yard and water-treatment building"),
T(["Detached utility yard (decided October 2026)", "Size (estimate)"], [
["Boiler hall, four 500 kg/h biomass module positions (B-1 and B-2 at launch)", "~162 m² (18 × 9 m), "
"6.0 m high"],
["Biomass fuel store (~6 to 7 weeks of fresh chips; ~80 m² would hold a 3-month monsoon "
"stock)", "42 m² drawn"],
["Chiller compound, open and screened, four pads (CH-1 and CH-2"
" at launch)", "~135 m² (12.5 × "
"10.8 m)"],
["Cooling pump and heat-exchanger room", "~40 m² (8 × 5 m)"],
["Flue stack, with the dust collector and fans along the boiler hall's back wall", "14 m"],
["**Yard in all**", "**~379 m²**, against 178 m² before the four-module decision"],
], widths_mm=[110, 60],
caption="The biomass bank of both plans sets the boiler hall (an electric bank would need about half). No "
"cooling tower: the chillers are air-cooled. The rooms are built once for four modules "
"and the plant goes in one module at a time; the yard sits outside the main building "
"because the boiler must have its own room and biomass deliveries need yard access."),
P("**Water treatment gets its own building** (proposed, October 2026): ~12 × 10 m directly behind "
"galvanics, holding the zero-discharge effluent treatment, the DI water plant and the chemical "
"store. A buried duct carries the effluent by gravity from the galvanics floor at +1.2 m and "
"brings DI water back, and a covered crossing joins the two doors; the galvanics room keeps only "
"a chemical day store."),
P("**The archive room** holds the father and mother of every side, about 1,200 to 2,400 parts a "
"year at full capacity, on mobile archive shelving (A-Z Solutions of Vienna as the reference "
"specification, LPI Rack Range in Thailand to quote against it). In the Payap scenario's office "
"a room of about 4 × 5.75 m with four mobile carriages holds ~150 shelf metres, roughly 50,000 "
"parts or 20 years and more of output (estimates). It asks things of the building early: ~11 "
"kN/m² under the shelving block, so the archive stays on the ground slab at the full rating; "
"rails set into the floor screed at fit-out; clean-agent gas suppression; a water-leak sensor "
"along the rails. One open point: with fathers and mothers in one room, one event takes both, so "
"keeping the rarely pulled fathers in a second fire compartment or off site is on the list."),
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 under PV-ready canopies (steel for ~40 "
"kWp of panels in the construction RFQ; panels later), 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 "
"be a permit condition."),
P("**A second building is expansion, not a gap.** A 45 × 38 m (1,710 m²) phase 2 building fits the "
"plot's narrowing southern end with a two-bay sawtooth roof carrying ~251 kWp and a 20 m yard "
"between the two for fire separation and shared loading; coverage stays at 39% of the deed area. "
"It is where finished goods move to free production floor, where pressing capacity can double, "
"or where a CD replication line would go if that option is chosen (section 4.10). **The press "
"hall** is planned for Duplex systems, because the plant focuses on special pressings and "
"specials run only on the Duplex: five Duplex bays and four Classic positions (~73/27 by floor, "
"estimate). This plan installs one Duplex system and one Classic; growth adds Duplex systems "
"first, into bays whose floor, utility positions and ring-main tees are kept from the start. "
"Where the second Duplex system would stand on the Mueang Chi footprint is not drawn yet; "
"the Payap scenario model draws the five-press fleet."),
H3("What the construction RFQ asks"),
P("The budget-level construction RFQ, with quantities from the parametric model, asks contractors "
"for: the shell rate per m² at the insulated-panel specification (not a bare shed); heavy-duty "
"and general paving separately; a separate rate for mineral-wool panels at fire-compartment and "
"acoustic walls; the crane package separately (runway and frame premium, machine door, the crane, "
"and the hook height achieved under the 7.0 m eave, with +1.0 m on the eave as an option); the "
"utility yard with floors, pads and plinths for all four positions; a lump sum for the rest of "
"the site works; and the foundation assumption behind all of it. It excludes process machinery, "
"PV, air conditioning, boilers, chillers and tanks, sprinklers, fit-out and the PEA transformer, "
"and asks whether permit drawings for the building permit and the factory licence are included. "
"The PV-ready provisions (the canopy steel it already specifies, roof loads for panels, conduit to "
"the main board and a spare way for a later inverter) belong to the same works."),
H3("What the building costs, and what is not known"),
T(["Block", "USD", "THB", "Basis"], [
["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² for Thai pre-engineered steel to the insulated-panel "
"specification, plus ~20% site works"],
pick(["Crane-ready frame, runway and machine door; mobile crane rented for the installations",
"39k to 91k", "1.3M to 3.0M", "estimate: 40% of the crane block (USD 97k to 227k); the "
"crane is bought later if needed"],
["Overhead crane, runway, frame premium, machine door", "97k to 227k", "3.2M to 7.5M",
"estimate"]),
["Maintenance workshop and machine bay fit-out", "30k to 76k", "1.0M to 2.5M", "estimate; a "
"workshop lathe and CNC mill not priced"],
pick(["Visitor corridor and accessible entrance", "built later", "built later", "USD 67k to "
"148k (2.2M to 4.9M THB) when built, estimate; not in the plan price"],
["Visitor corridor and accessible entrance", "67k to 148k", "2.2M to 4.9M", "estimate; "
"building it later would take ~3.6M THB out at the midpoint"]),
["Utility yard for four boiler and four chiller modules", "73k to 122k", "2.4M to 4.0M",
"estimate at the building rate; the biomass fuel store and handling (1.0M to 2.0M THB) sit in "
"the utilities block"],
["Water-treatment building next to galvanics", "52k to 87k", "1.7M to 2.9M", "estimate at the "
"building rate"],
pick(["**Together**", "**~0.84M to 1.48M**", "**~28M to 49M**", "sum of the blocks; the plan "
"carries no contingency (section 8)"],
["**Together**", "**~0.97M to 1.76M**", "**~32M to 58M**", "sum of the blocks; the plan "
"carries no contingency (section 8)"]),
], widths_mm=[50, 26, 26, 68], font_pt=8.5),
P("The single largest unknown is the ground. The Mueang Chi parcel is likely soft former paddy, and "
"a piled slab can add several hundred to 1,000+ THB/m² across the building, 4,387 m² of paving "
"and a 1,711 m³ fill platform. A soil boring test (THB 30k to 50k, in the phase 0 budget) comes "
"before any real number, and the building RFQ with a soil test is one of the four requests that "
"settle the budget. Also open: the crane's hook height under the 7.0 m eave; the archive's "
"mobile shelving (to quote); the valved branches and feeders for the empty utility positions; "
"and the fire-water volume, which the hydraulic design and the warehouse racking height set. " +
pick("Renting a crane for the installations while the frame, runway and machine door stay "
"crane-ready takes ~3.2M THB out at the midpoint, one of the six levers; the 5 t crane itself "
"is USD 30k to 76k supplied and installed (estimate) when it is bought.",
"Renting a mobile crane for the installations while the frame, runway and machine door stay "
"crane-ready would take ~3.2M THB out at the midpoint (estimate): a step if quotes land "
"high, not part of the plan.")),
H2("6.3 Safety, security and the irreplaceable"),
P("Worker safety is a founding priority on equal footing with the environmental commitments. The "
"press floor combines hydraulics at ~180 bar, saturated steam at 10 bar / 180 °C and hot PVC; "
"the galvanics room handles silver nitrate, nickel salts and acids. The plan provides "
"vendor-led commissioning training extending into an in-house programme, mandatory PPE per area, "
"and galvanics as a clean room with controlled access, extraction on every plating unit, "
"decontamination procedures, eyewash and emergency shower at the line, and a hard-wired "
"interlock (no extraction, no plating). A machine is lifted only after lockout (power isolated, "
"steam vented, hydraulics depressurised including the accumulator) and with a lift plan; hot work "
"stays in the workshop under a permit; the biomass boilers run under a licensed boiler "
"controller, a certified attendant from the maintenance team (section 7.2)."),
P("Decided in October 2026: every member of staff, office included, gets group health insurance "
"(inpatient and outpatient) and a yearly check-up on top of social security, plus the "
"occupational checks Thai law requires for risk-factor work (press-floor heat and noise, "
"galvanics chemistry, maintenance) within 30 days of starting and yearly after. Everyone wears "
"the same company workwear (Strauss), with process PPE on top. Planning costs, estimates: ~15,000 "
"THB a head a year for insurance, ~2,500 for the check-up plus ~1,500 for risk-factor tests, and "
"workwear ~USD 9k a year at ~20 staff."),
P("Physical security is zoned: production, galvanics, chemical storage, the metal archive, IT, "
"shipping and " + pick("(once built) ", "") + "the visitor corridor each get badge or biometric "
"access with logs; CCTV at "
"entrances, perimeter, dock, production, chemicals and archive under a PDPA-compliant retention "
"policy. Two things are irreplaceable and get their own protection: **the metal archive** (a "
"destroyed father means recutting and re-plating a release; fire-rated room, climate control in "
"the tightest monitoring tier, access logging, clean-agent gas suppression because sprinkler "
"water would destroy paper records and corrode the metal) and **client audio** (pre-release "
"music is a leak target; an isolated, encrypted, access-logged vault, need-to-know access, and a "
"written policy the sales team can show labels)."),
P("Fire suppression is zoned, not full-building gas: clean agent only in small sealed high-value "
"rooms (archive, IT, switchrooms, control cabinets), water mist or sprinklers in production and "
"the carton-heavy warehouse, and detection and containment rather than suppression for the "
"battery enclosure. The site carries its own ~200 m³ fire reserve and pump set (electric duty, "
"diesel standby, jockey) because mains flow cannot be assumed; warehouse racking above about "
"3.7 m changes the sprinkler design and raises that volume, so the racking height is fixed "
"before the fire design. The property insurer is involved before the design is fixed."),
# ----------------------------------------------- 7 regulatory
H1("7. Regulatory: BOI promotion and licences"),
H2("7.1 BOI promotion"),
P("The project will apply for promotion by the Thailand Board of Investment. In BOI terms vinyl "
"pressing is basic plastic consumer-goods manufacturing (incentive Group B): no corporate income "
"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",
"automation, full metrology and energy efficiency") +
", not on pressing plastic "
"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"], [
["Machinery import duty exemption", "Almost the entire launch equipment list is imported "
"(Germany, Sweden, the UK, Australia, Japan, China). Machinery imported duty-free is also "
"exempt from VAT at import (Revenue Department answer on BOI's FAQ, checked October 2026). The "
"investment blocks assume promotion: without it, ~5% duty on ~2.3M USD of imported machinery "
"(~0.11M USD) plus ~0.17M USD of import VAT, reclaimed only later (estimates for the " +
pick("full equipment list; this plan imports less at first", "full equipment list") +
")."],
["100% foreign ownership and land privileges", "Overrides Foreign Business Act restrictions "
"for the promoted activity. The land-ownership privilege is unused under the lease strategy."],
["Visas and work permits via the One Stop Service", "Foreign commissioning engineers and the "
"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."],
["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, "
"metrology and heat recovery are the natural fit."],
["R&D merit", "At least 1% of revenue in Thai R&D adds 1 to 3 exemption years and can lift the "
"cap. Galvanics process development, recycled-PVC work and the audio-QC system could qualify; "
"whether R&D with Payap University and the joint student programmes count is to be checked."],
], widths_mm=[58, 112]),
P("**Requirements:** minimum THB 1M investment excluding land and working capital (cleared many "
"times over); debt-to-equity no higher than 3:1 for the life of the privileges, which shapes "
"the financing mix; modern machinery and process; progress reports, annual reports and machinery "
"lists. The plant's asset register and stock ledger in ERPNext are where the record of promoted "
"machinery and raw materials lives, from the first capex invoice."),
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("~132M to 233M THB with the ramp-up reserve (~182M at the midpoint)",
"~156M to 277M THB with the ramp-up reserve (~217M 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 "
"from issuance; full operation is due by about 36 months. The Northern Economic Corridor "
"(Chiang Mai, Lamphun, Lampang) is promoted as a creative-economy base, which a music "
"manufacturing story fits; the current area add-ons for Lamphun must be confirmed with BOI "
"directly."),
H2("7.2 Factory licence, galvanics and boilers"),
P("BOI promotion does not replace the factory licence (Ror.Ngor. 4), hazardous-substance "
"registration for the plating chemistry, wastewater permitting, the boiler rules or the air-emission "
"limits for the biomass boiler's stack. **Galvanics "
"is in the plant from launch, so the electroplating line, its chemistry and its zero-discharge "
"effluent system are in the first factory licence application**, not a later amendment. The "
"earlier plan to keep galvanics out of the first licence to protect the schedule no longer "
"applies. Effluent is the most likely regulatory friction point regardless of BOI, and it now "
"sits on the path to the first paying release:"),
B([
"**The site must permit plating from day one** (section 6.1): zoning has to allow a "
"record-pressing factory with a biomass-fired steam boiler and an electroplating line. The industrial "
"estate's licensing and shared effluent treatment are the easiest path; on Mueang Chi the "
"permit is ours; on Payap land the lessor's written consent comes on top.",
"**Zero discharge is the design, and the application says so:** rinse water through the ZLD "
"evaporator with metal recovery, the back-finisher's spent water and filters by the same route, "
"solvents as controlled waste, no process water to the environment. It is the strongest answer "
"the plant can give to the effluent question.",
"**Permit drawings** for the building permit and the factory licence come from a licensed "
"engineer; the construction RFQ asks whether contractors include them (shell prices usually do "
"not), and stormwater attenuation may be a permit condition.",
]),
P("**Boilers (DIW rules).** The Ministerial Regulation on boilers B.E. 2549 and the Ministry of "
"Industry notification on boiler safety of the same year apply to every module, Thai or "
"imported: a design "
"to TIS or an international standard (ASME, JIS, EN or equivalent) checked and certified by a "
"DIW-registered certification body or licensed engineer; for an imported boiler, verification by "
"a registered certification body and the manufacturer's data report, design and inspection "
"reports filed with DIW; installation drawings checked and an inspection before first use "
"reported to DIW within 30 days; **a licensed boiler controller on site**; and **inspection at "
"least once a year**. The relief for small once-through units does not apply at ~10.5 bar (our "
"reading), and the labour-side regulation of 2021 adds licensed-engineer installation and "
"testing and a feedwater standard. Both plans price the biomass modules from a Thai maker to the "
"ASME specification of section 5.4. A Chinese biomass boiler" + pick(
" (the open decision point of section 5.4)", "") + " would take the imported-boiler route of "
"the notification: verification by a registered certification body with the full dossier, and an "
"ASME Section I design at 1.25 MPa with the S stamp, because a boiler built to the Chinese GB code "
"would rest on 'or equivalent' with no precedent found. **Biomass adds to the permit work** (to "
"confirm with the permit engineer before the RFQ): the boiler registered with DIW; the air-emission "
"limits for a solid-fuel boiler met at the 14 m stack, with the dust collector in the boiler "
"package; the fuel store and ash handling in the factory licence drawings; and the licensed "
"boiler controller, a certified attendant from the maintenance team. " +
"DIW has announced a "
"revision of the boiler, pressure-vessel and refrigeration rules, so they are rechecked before "
"the RFQ, and a certification body is engaged before any boiler order."),
P("**Other permits and duties:** the same 2021 labour regulation covers the overhead crane" +
pick(" once one is bought", "") + " (a "
"crane-industry summary puts cranes above 3 t on an engineer inspection every three months; to "
"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; 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: "
"filing early and then finding the site does not work. Verify the chosen plot's zoning, "
"including plating, first.",
"**Scope.** " + pick(
"Cassette and CD-R duplication come later in this plan; whether they still go into the "
"first application (their machines then due inside its import window) or into a later "
"amendment is a question for the consultant. ",
"Cassette and CD-R duplication go into the application from the start. ") +
"CD replication would need new activity codes, which cannot be added casually afterwards, so the "
"investor's decision on CD (section 4.10) is needed before the filing date.",
"**Sequencing.** The plan's rule is that no machinery purchase order precedes the certificate, "
"because duty exemption is not retroactive. But the exemption attaches at importation, not at "
"contract signature. If equipment can be ordered with a deposit while the application is in "
"review, provided it clears customs after issuance and is on the approved machinery list, the "
"launch pulls forward by six to nine months. With the lathe, galvanics and Sibert line now on "
"the critical path alongside the presses, this is the first question for the BOI consultant and "
"the only item in the plan worth half a year.",
]),
P("Keep any future label, content or retail arm in a separate entity: media and service activities "
"carry different, sometimes Thai-ownership, conditions and would muddy a clean manufacturing "
"application. Poy Records as a label brand is therefore a separate question from the plant."),
]