User (October 2026): "the factory should have more space for duplex
setups than classic, we will mainly focus on special prints and not mono
colours plan it to be 60/40 duplex classic".
- Press hall (~870 m2) planned 60/40 by floor: four Duplex bays along the
visitor corridor and six Classic positions in the second row (440 + 300
= ~740 m2 at 110 / 50 m2), the rest open for mould carts and staging;
the launch plant fills one of each, growth adds Duplex systems first.
Replaces "room for ten more Classics".
- Full hall: 8 semi-automatic presses + 6 Classics, 57/43 by press count,
~1,250 to 1,410 records/h gross, ~3.6 to 4.7M a year on the scale.md
basis (was 4.7 to 5.8M for 2 Duplex + 11 Classics); ~2.1 to 2.5 t/h
steam and up to ~1.8 MW cooling, still a utility phase of its own.
By hourly output the six automatic Classics still press more than the
eight semi-automatic presses (estimate).
- pressing-line.md, scale.md (capacity table, utilities), site-candidates
.md, crane-workshop-tours.md, roadmap.md, README (the FreeCAD Payap
model still draws the earlier layout; noted, not redrawn).
- Calculator: preset "Full hall 60/40 (4 D + 6 C)", fleet ladder Duplex
first (1+1, 2+1, 3+2, 4+3, 4+6) plus the same floor Classic-led (2+11)
and Duplex-only (7+0) for comparison; plant view reserves 4 Duplex
bays and 6 Classic positions.
- Business plan draft 0.2 rebuilt (capacity table row, plot fit, layout).
Checks: renderer 720 checks pass (node budget 2,700 for the Duplex-heavy
stress preset, 60 fps), calculator regression 0 fails, level selector and
page checks clean at 390 / 1024 / 1440 px dark and light; PDF 47 pages
with a filled table of contents.
User feedback on the isometric view (October 2026):
- "the production hall is missing toilets": two sets. At the staff
entry: women 2 WC, men 1 WC and 1 urinal, an accessible WC, basins.
At the east end of the back aisle in the finishing block: women 2 WC,
men 1 WC and 1 urinal, basins (proposed, not yet in the parametric
plans). site-candidates.md gets a Toilets bullet with the Thai minimum
(Ministerial Regulation No. 39 B.E. 2537, table 2; separate toilets for
men, women and disabled staff under the welfare regulation B.E. 2548).
- "the door and the corridor is not aligned": the covered link now lands
on doors at both ends, centred on it (factory entrance at the start of
the visitor corridor, office lobby door on the north face, windows
cleared); the corridor glass starts after the door; the stray staff
door with no path is gone; the link deck ramps up to the factory floor.
- "we also dont need a extra trimmer with the optical, this is included
in the duplex and the classics": the finishing block keeps only the
optical inspection station; site-candidates.md, the tour route and the
process flow say the presses trim inline.
Checks: renderer 720 checks and functional checks pass (max 2,485 SVG
nodes); calculator regression 0 fails; level selector works in the page;
no page errors or overflow at 390 / 1024 / 1440 px, dark and light.
User feedback on the isometric view (October 2026):
- "a light pole in the middle of the truck apron": a PAVED list of the
drive areas (gate road, aprons, east road, lane, access road, car
park, yard); every lamp now stands on a kerb or verge (the apron lamp
to the south kerb, three more moved off drive areas, one added on the
east road); one LAMPS list feeds poles and light pools.
- "the office building also has 2 levels, can we make a selector for GF
1 2": the Roof / Inside toggle becomes GF | 1F | Roof. 1F shows the
office first floor (+4.0 m: offices, meeting and training, meeting
room, IT and server, toilets, pantry, flexible room, stair and lift)
and the finishing and print block's upper floor (+3.8 m: print room in
reserve, print stock, packaging materials, stair and goods lift), the
rest ghosted. Office ground floor re-split after the floor plans
(site-candidates.md). setMode('inside'/'roof') still works; new
setLevel / getLevel / onLevel; the level survives calculator updates.
- "the pipe bridge to the pump and HX room also stops mid air": both
pipe bridges now drop down the wall faces at the factory and at the
yard building to low-level wall sleeves, with a second support post.
Checks: renderer 720 checks (presets x GF/1F/Roof x 390/1024/1440 x
dark/light) and functional checks pass; calculator regression 0 fails;
level selector works in the page; screenshots reviewed in all rotations.
User feedback on the isometric view (October 2026):
- "the cars are above the car park roof": cars and scooters were their
own sprites and the depth sort put some above the canopy; they are now
drawn inside the canopy sprite before the posts and the roof, so the
roof always covers them in every rotation.
- "a light pole in the middle of the yard": the two yard lamps at the
service-lane edge (one in front of the boiler hall) move to the yard's
back fence; one LAMPS list feeds both the poles and the light pools.
- "add solar panels to the car park": the car and scooter canopies now
take PV first (107 modules, ~48 kWp; construction RFQ has canopy PV),
the factory roof the rest (560 of 667 modules at 300 kWp); canopy
tooltips give their kWp.
- "arrange the pvc storage outside to be black, red, yellow": the silos
read black, black, red, yellow from the default north-east view.
Renderer checks rerun (288 + functional, no failures); calculator
regression 62 checks pass; 390 / 1024 / 1440 px, dark and light, no page
errors or overflow.
User (October 2026): "launch plant should be 1x duplex system and 1x
classic". The calculator already did; these two pages did not.
- steam-cooling.html: default case is now "Launch plant" (D1-A, D1-B,
Classic; B-1 and B-2; CH-1 and CH-2: 450 to 540 kg/h on 1,000 kg/h,
391.5 kW on 500 kW). Other cases: Duplex first (commissioning), Second
Duplex (growth option, five presses), One module down (launch plant
with B-2 and CH-2 out). Idle boxes say "reserved position" / "growth
option". Phasing table: launch plant, second Duplex, options;
galvanics cooling is launch scope. Five-press figures labelled as the
growth case or backbone sizing; chiller cost per the CSV 2-module row.
- plant-operation.html: the launch plant: Classic C2 removed everywhere
(press, trimmer, routes, conveyor, lamps, texts), Classic re-centred;
one PDPU (2 cells) as in total-investment; boilers 2 x 500 kg/h,
chillers 2 x 250 kW; title arrivals scaled to three presses; phone
legend in one column.
- Landing entries and README bullets for both pages.
Verified headless (Edge): skill checks pw_sc_check and pw_plant_check
with launch-plant expectations, 90-day runs, perf unchanged; 390 / 1024
/ 1440 px dark and light without page errors or overflow.
User request (October 2026): a SimCity / Factorio style render in the
calculator for an overview of the factory, solar and utilities.
New card "The plant at a glance" at the top of the plant and business
plan calculator: an isometric SVG scene (CNXIso, inlined with its iso-
prefixed CSS) of the Payap-scenario site driven by the calculator state:
Duplex systems and Classics (r.D, r.C; overflow into the phase 2
building), galvanics in-house or "stampers bought in", cutting in-house
or "cut abroad", metrology tier, cassette and CD-R benches, solar buy /
PPA / none (300 kWp, 271 kWh battery), electric or biomass steam (fuel
store, chip pile, smoking stack), boiler and chiller modules out of the
four positions each (r.nb, r.nc), crane, visitor corridor.
Roof / Inside cutaway, four rotations with a north arrow, zoom, pan,
pinch, tap for figures from the docs; dusk in the dark theme, day in the
light theme; CSS-only animation that pauses off-screen and respects
reduced motion. The scene only rebuilds when its config changes.
Verified headless on Edge: 390 / 1024 / 1440 px, dark and light, no page
errors, no overflow, presets map to the scene (lean, five-press, full
hall); the calculator's 62-check regression still passes; node --check
on all scripts. Renderer built and tested separately (288 checks).
User request (October 2026): an interactive business plan calculator
where the plant configuration is chosen and everything follows. Built
into the fleet calculator (same page and URL, one model):
- Plant configuration card: galvanics in-house or bought stampers (and
Pheenix estimate vs OMS reference), mastering and cutting in-house or
outsourced, metrology full or launch tier, cassette and CD-R, solar
buy / PPA / none, electric or biomass steam, Thai or Chinese utilities,
crane buy or rent, visitor corridor now or later, ramp-up reserve;
stamper supply to other plants; disabled-not-hidden controls.
- Investment built from the total-investment blocks (low / mid / high,
sources and kind badges); boiler and chiller modules sized from the
fleet and flagged past the four positions; phase 2 building past the
870 m2 press hall. Default reproduces 160.9 / 226.7 / 292.5M THB.
- Budget card against 180M and 216M THB; "Investor levers" preset gives
193.6M mid, 203.6 to 213.6M with the reserve.
- Money follows the configuration: outsourced title steps passed through
at cost (fee split 51.1 / 37.0 / 11.9 %), electric steam energy and
demand charge, PPA power price, optional cassette/CD-R revenue.
- Ten-year cash view: editable ramp and discount rate, payback, NPV, IRR,
chart and table; pre-tax, pre-financing sketch.
- Presets: launch plant, investor levers, lean, five-press, full hall.
- Verified headless on Edge: 62 checks, 390 / 1024 / 1440 px, dark and
light, no overflow, no page errors.
Business plan 9.4 cross-check updated to the calculator's figures
(EBITDA 1.68M, payback 4.1 yr; cash payback year ~5.7, IRR ~13 %);
docx and pdf rebuilt. README and landing entry renamed.
The investor business plan (docx + pdf) rebuilt for the launch plant
decided in October 2026: one Duplex system and one Classic, Pheenix
galvanics with zero discharge, the Sibert line, a Sillitoe cutting room,
modular steam and cooling (rooms for four), cassette and CD-R; no bridge
stampers, no outsourced cutting; second Duplex as a growth option.
- Part A: executive summary (what changed since 0.1, the numbers, the
180M / 216M answer, first release marked open), reading guide, two
price points (ResurRec and Record Industry), anatomy rewritten for
Sillitoe, Pheenix, Sibert, Duplex + Classic, lead times without bridge
stampers, new 4.8 artist platform, cassette 4.9, CD 4.10.
- Part B: traceability with ERPNext as system of record, metrology launch
tier as the investor's choice, QC, efficiency (PEA tariff, utility
modules, fuel open, Chinese boilers and DIW rules), site (Mueang Chi,
Payap zoning result), building blocks, safety, BOI and licences with
galvanics in the first factory licence.
- Part C: launch-plant investment table, the investor's question and
levers, tranches, currency, operating picture of the launch plant,
timeline with the metal path on the critical path, commissioning
sequence and why the whole chain at launch, team, 22 risks, 17 phase 0
actions, the ask.
- plan_lib: grid column widths so LibreOffice keeps table widths.
- export_pdf.py: LibreOffice UNO export that fills the table of
contents (47 pages).
- README: total investment, revenue model and business plan bullets.
Launch plant (user, October 2026): one Duplex system and one Classic,
with cutting and galvanics in-house, everything in one capital round.
- scale.md: capacity table now launch plant 0.71-0.97M records/yr, the
second Duplex as a growth option; launch utilities (450-540 kg/h on
B-1/B-2, ~390 kW on 2 x 250 kW); calculator figure ~0.94M.
- pressing-line.md: launch plant section on top; five-press fleet kept as
the layout fleet the hall and backbone are built for.
- roadmap.md: long-lead orders for the launch plant, no bridge stampers
or outsourced cutting, commissioning order, what stays revenue-gated.
- revenue-model.md: operating picture of the launch plant: central
revenue ~3.75M USD, EBITDA ~1.6M, operating profit ~1.1M, payback ~4
yr on 216M THB, break-even ~0.3M records; adverse corner cannot cover
depreciation. Five-press table kept and labelled.
- fleet-calculator.html: start fleet 1 Duplex + 1 Classic, target 850k,
capex base 6.55M (cases 8.9 / 6.55 / 4.9M), Duplex beyond one, chiller
500 kW, imported machinery 2.3M, ladder from the launch plant.
- total-investment.md: superseded note updated.
Checked October 2026 on the investor's budget question. New
docs/suppliers/china-utilities.md: boiler makers (ZOZEN, Sitong,
Fangkuai, Taiguo, Yuanda, Yongxing, Taishan, Nobeth) with fit for 500
kg/h at 1.25 MPa, claimed certificates, Thai references and listing
prices; the Thai rules for an imported boiler (MR and MOI notification
B.E. 2549: ASME/JIS/EN or equivalent, certification-body verification,
once-through relief does not reach 10.5 bar, licensed controller, annual
inspection); compressor makers with Thai offices (Kaishan, Denair) and
sizing; hydraulic pump sets and accumulators (Huade, Yuci, Hengli, WMD,
Renowell, Inovance, NXQ makers), the shared-ring-main risks and Thai HPU
builders; duty and freight; open RFQs.
Result: about 2M THB at the midpoint (~2.5M with contingency), ~1 % of
the 216M target, mostly the boilers; Newbilt aggregates stay Newbilt's.
total-investment notes it and lists the uncosted central hydraulic
plant; utilities CSV gets the Chinese candidates and route estimates;
backlinks from equipment-suppliers, pressing-line, README.
Decided (user, October 2026): the plant launches with everything in one
capital round, commissioned in sequence: one Newbilt Duplex system, one
Classic, a Pheenix galvanics line with ZLD water, the Sibert line, a
Sillitoe cutting room, and the modular steam and cooling plant (2 x 500
kg/h boilers, 2 x 250 kW chillers, rooms for four each). No bridge
stampers, no outsourced cutting; cassette and CD-R stay; the second
Duplex and further Classics are growth options, not in the investment.
total-investment.md: new 'Launch plant' roll-up, 4.9M to 8.9M USD,
161M to 292M THB incl. 15 % contingency (midpoint ~227M), with what is
left out (ramp-up reserve ~10-20M THB, CD replication, financing, FX,
archive shelving) and the BOI assumption. The investor's question (180M
THB, maybe +20 % = 216M): fits at the low end only; at the midpoint four
levers that keep every machine (solar via PPA, metrology launch tier,
galvanics near OMS's reference, visitor corridor later) give ~193M, plus
reserve ~203-213M, inside 216M; 180M needs low quotes. The quotes that
decide it: Newbilt (Duplex, Classic), Pheenix galvanics, building with
soil test, metrology. Old full vision and phased entry marked superseded
until the mirrors are re-based.
Utilities CSV: chiller bank two modules (4.9-7.9M THB), boiler note for
B-1 and B-2 at launch, ZLD and DI rows now launch scope (carried with
galvanics); baseline 28.47M-48.73M THB. README project status.
User request (October 2026): the order tool needs a thin / thick spine
selection, templates for the jacket and label upload, and must accept AI
and PDF files.
Both artist demos (artist-order, make-a-record):
- Spine: thin 3 mm (one record) or thick 5 mm (two records, or a thick
insert); a double album in a single jacket takes 5 mm, thin is then
disabled; 7", gatefold (7 or 9 mm) and own jacket disable the row with
the reason. Quote line 'Thick 5 mm spine' (R.spine 12 / 10 THB per
copy, estimate from QRP 0.90 vs 0.55 USD and Kudos 137.50 GBP/order).
Mock-up draws the spine edge to scale; caption names it.
- Templates: vector PDFs written in the browser for the current choice:
jacket spread (back, spine, front; 633/635 x 315 mm for 12" from
Mighty Media Discs), gatefold with an inside page, labels with a page
per side and the dinked hole; trim and bleed boxes set, 3 mm bleed,
5 mm safe area, folds, crop marks, guidance notes.
- Uploads accept PDF, AI (PDF-compatible) and images. PDFs are read in
the browser (object streams inflated with DecompressionStream): page
boxes, pages, PDF/X, creator, colour spaces, font embedding; checks
against the chosen spine (a 5 mm spread on a 3 mm order is flagged),
bleed, CMYK, fonts; old PostScript-only AI files are refused with the
fix. Image spreads are measured the same way. Preview via pdf.js
(jsDelivr, loaded only when a PDF arrives); the front panel goes into
the mock-up.
artist-platform.md: new section 'Artwork templates and files' with the
sources; preflight step links it; RI 'left out' list updated. README
demo bullet. Checked headless on Edge: fixtures (3/5 mm spreads, no
bleed, AI, legacy AI, front only, labels, 150 dpi PNG), downloaded
templates parsed with PyMuPDF, 390/1024/1280 px no overflow, dark and
light, no page errors; pw_mr_check --tour and pw_ri unchanged
(37,836 / 232).
User (October 2026): we only build tools and interfaces that interact
with ERPNext; invoices, stock and the rest are kept there, except
telemetry and other machine data.
digital-factory.md: standing decision, decisions 2, 3, 6, 7 and 10
rewritten (ERPNext holds every record of the business and of production,
including artist gates, metal-part genealogy as serial numbers with
parents, and quality inspections; the machine-data store keeps only
cycle and record rows, the hash chain and time series, keyed to ERPNext
names; ERPNext first, then custom fields or document types in cnx_erp,
then a tool, never a second business database). Systems table,
architecture labels, factory application section (modules as a table:
records in ERPNext, what we build, machine data outside; our only tables
are the machine-data ones), ownership table, integration rules 4 and 8,
phasing and estimates (cnx_erp app 2 to 3 person-months; total 3.5 to 6).
artist-platform.md: campaigns are an ERPNext document from launch, pledges
post as advance payment entries; traceability, README, facility security
(archive location on the serial number), production timeline (sets per
mother on the mother's serial number), crane-workshop spares store,
total-investment.
Factory console: KPI row no longer touches the postings card (user
screenshot); ERPNext page, order card, sidenote and ledger say every
record lives in ERPNext and only machine data stays outside; new
postings for artist gates, stamper metrology inspections, stamper set
serial numbers (grown, retired with play count). Checked headless:
Edge dark and light, 1440/1024/390, no overflow or page errors, rows
aligned, pw_fc, pw_wo, pw_feed and pw_erp pass.
Follows the decision that the whole plant runs ERPNext and every tool
we build interacts with it (e12ad2e).
- New page #erp (nav: ERPNext): every posting the floor makes, derived
from the same event log: sales orders in by webhook, work orders,
job cards per station, serial numbers for lacquers, fathers and
mothers (warehouse Archive), purchase receipts, quality inspections
and stock entries per compound batch, manufacture entries per run,
downtime entries per stop, delivery notes and invoices. Outbox status
per row (sent within a minute, held during the nightly backup
01:00 to 01:15), KPIs, who-owns-what table, counts by document type.
Rows use fixed ch grid columns; on phones a two-line row.
- Order page: ERPNext card (customer, sales order, work order with
produced quantity, job cards completed, batches, delivery note and
invoice). Work order page: its job card, quality inspection or asset
maintenance log.
- Names follow ERPNext's default naming series and are simulated;
nothing uses the simulation's random stream, so the seed is unchanged.
- Phones: the nav strip scrolls the current tab into view. Work order
IDs on the order page no longer wrap (wider fixed column).
digital-factory.md demo paragraph. Checked: node --check, Edge dark and
light at 1440/1024/390 (no overflow, no page errors, rows aligned), and
the pw_fc, pw_wo and pw_feed regressions.
Decided by the user (October 2026): the whole plant runs ERPNext, and
all tooling we develop has to interact with it.
digital-factory.md: standing decision in the summary; decision 10
(ERPNext owns the business documents, the factory application owns the
floor; ERPNext names are the shared keys); new section 'ERPNext: the
plant's ERP' with the ownership table (customers, prices, sales orders,
items and BOMs, work orders and job cards per station, batches and
quality inspections per compound lot, serial numbers for metal parts,
downtime entries, delivery notes, assets, accounting, payroll vs. cycles,
per-record inspection, genealogy and the hash-chained log staying in the
factory application), the integration rules (one typed Frappe REST
client in cnx-factory, an integration user per tool, webhooks in,
transactional outbox with idempotent postings so the floor never waits
on the ERP, business-sized postings, customisation as a Frappe app in
Gitea, nightly reconciliation, no public ERPNext endpoint, new tools use
the same client), hosting on NixOS (no nixpkgs module, NixOS/nixpkgs
#241921; Avunu frappe-nix as the start, frappe_docker as
oci-containers fallback; MariaDB + Redis; vinyl-erp on site behind the
gateway proxy; OIDC sign-on; upgrades on a restored copy), Thai
localisation (Ecosoft erpnext_thailand: VAT, WHT, PND, billing notes;
Ecosoft as partner to quote; payroll and BOI reporting to check),
phasing (dev ERPNext now; accounting and assets from the first capex
invoice; manufacturing at commissioning) and estimates. ERPNext added
to the architecture diagram, services, machines (vinyl-erp), module
list, backup, cost, build order and open decisions; the old 'ERP out of
scope, decide after launch' line replaced.
artist-platform.md: price list, customers, sales orders, campaign
pledges as payment entries, through the plant's outbox. traceability.md:
one ERP, one set of keys. README summary. total-investment.md added
scope: ERPNext (to quote, not in the sum, no licence fee).
Added at the user's request (October 2026): LPI Rack Range (Thailand)
Corp., Ltd., Bangkok head office, plants in Bangplee Industrial Estate
and Bangpla (Samut Prakan); office mobile shelving for documents, pallet
racking (selective, drive-in, mobile, shuttle, pallet flow), picking
shelves and mezzanines, mould-and-die racking, mini-load AS/RS; no specs
or prices published (lpi.co.th, checked October 2026).
equipment-suppliers.md section 8 entry; the Thai supplier the archive
shelving is quoted against (facility-security.md open points, supplier
map archive line); racking candidate in the utilities CSV.
Planned (October 2026, user): the archive in the office gets mobile
archive shelving, A-Z Solutions (Vienna) as the reference
(a-z-solutions.eu, checked October 2026: hand wheel or electric drive,
lockable, rails need early floor planning; no published prices).
facility-security.md, new section under Protecting the irreplaceable:
what it holds (fathers and mothers, ~1,200 to 2,400 parts a year; a
reference pressing per title only as a proposal), sizing estimates (about
0.2 kg per part, ~3 mm and ~75 kg per shelf metre; in the Payap office's
~4 x 5.75 m room two fixed runs, four double carriages and one aisle hold
~150 shelf metres, ~50,000 parts, 20+ years), what it asks of the
building (ground slab at full rating, ~11 kN/m2 under the block; rails in
the screed fixed before the floor finish; geared hand wheel; gas,
climate, leak sensor, access control; barcoded box addresses), open
points (quotes from A-Z and a Thai supplier, storage format from the
galvanics vendors, fathers in a second compartment or off site).
Mirrors: site-candidates.md (office ground floor), phase 1 RFQ (archive
keeps the full slab rating if the slab is zoned), digital-factory.md
(archive location as box and shelf position, sets per mother),
equipment-suppliers.md (section 8 entry), total-investment.md added scope
(to quote, not in the sum).
Decided (October 2026): the plant keeps the father and the mother of every
side. production-timeline.md (repress section) records the decision and the
rule of thumb with sources: about 10 stamper sets per mother before it
degrades (Third Man Pressing FAQ, a Nashville plater via WPLN), fewer in
quality-minded sources (5 VinyLab, 6 to 8 Stereo Review 1962); a father
grows about 5 to 10 mothers. So a mother covers roughly ten represses
(10,000 to 20,000 records a side) and a worn one is replaced from the
archived father without a new cut. galvanics.md: 4 archived parts per
title, ~1,200 to 2,400 a year; new open question to all galvanics
candidates (sets per mother, mothers per father, storage).
artist-platform.md repress paragraph.
Demos: make-a-record and artist-order say father and mother are archived;
factory console archives the father on represses too, counts stamper sets
per mother (shown in the genealogy and the customer's metal card), and the
metal archive counts fathers and mothers.
The live inspection feeds (floor, quality, press, customer's latest
copies) were one run-on string, so a shorter press ID (C1 vs D1-A)
shifted everything after it and the cycle time showed twice. Each row
is now a grid of fixed columns sized in characters of the mono font:
time, stamper, press, order, result, with a header row (the row keeps
the mono font so its columns match; only the labels change font). On
phones the order column (factory) or press column (customer) drops.
The full record key stays in the stamper cell's tooltip.
Work order cards: station chip left, work order ID right-aligned in the
header, the assignee moves to the time line, so card headers no longer
shift with the ID length.
New "Work orders" section in the factory console (#work), derived from
the same simulated records as the rest of the page, one work order per
station and job:
- order stages: mastering, lacquer cutting, electroforming, stamper prep,
test pressings, press run, packing, dispatch
- stamper changes (planned when a set nears its life, in progress during
the change), fault clearing on a stopped press (maintenance)
- material lab: lab gate per compound lot, release test pressing, and the
held lot's re-dry and retest (button starts it)
- audio QC: each sampled copy's listening check
Board: In progress (press floor first) / Next up (planned press runs and
stamper changes with time and press, jobs arriving at the next station)
/ Done today, filter per station, KPIs. Each work order opens a kiosk
view: the steps an operator follows (badge in, scan what the step asks
for, with the IDs to scan, confirm), confirmation times and who did it,
the order, lot or press it belongs to, and what it writes to the log.
Order detail lists the order's work orders by station. Mastering and
cutting are booked to the engineers, the lab, QC and maintenance to
technicians, the rest to numbered operators; jobs finishing at night are
booked to the late shift.
README, digital-factory.md demo paragraph and the landing page mention
the work orders.
Three presses for now (D1-A, D1-B on one Newbilt Duplex system, C1
Classic) instead of the plan's two Duplex systems. Order arrivals scaled
to the smaller fleet (about 3,000 to 4,600 good records a day); press
row fills the width; landing page text updated.
New page docs/factory-console.html (site /demos/factory/): the factory
application of digital-factory.md on a simulated plant day, with a
switch to the customer portal of the same orders.
Factory console (sidebar: Floor, Orders, Quality, Lab, Metal, Ledger):
- floor: five presses of the launch fleet (two Newbilt Duplex systems,
one Classic) with the mounted order, live good / rejected counters,
stamper plays against life, cycle time and steam; KPIs for the day;
live optical inspection stream with record keys; alerts (stops, lab
holds, stampers near end of life, listening reviews, long gate waits);
stations (cutting, galvanics, stamper prep, lab, packing); orders by
stage; good records per day
- orders list with stage filters and search; order detail with stage
track, approvals, metal genealogy and stamper metrology, press run
telemetry, compound lot certificate, rejects by reason, audio samples,
packing and shipping, and the order's events
- press detail with telemetry sparklines; quality (rejects by reason,
yield per press, audio comparison); lab (compound lots with results
against illustrative limits, one lot on hold with re-dry and retest,
regrind batches, hoppers); metal (baths, mounted stampers, metrology,
archive); hash-chained event log
Customer portal (four demo customers: pressing now, waiting to approve
the test pressing, in plating, delivered): progress through every step
and the three gates, copies pressed so far with the latest copies and
their record keys, approving the test pressing books the press slot
(greedy plan of the queue gives the start time and press), and a quality
report that fills in step by step: files, lacquers, metal parts with
metrology, test pressings, the compound lot's lab results, pressing and
inspection, listening checks, packing.
Simulation: 60 days warmed up at load (about 0.7 s), then 1x to 3600x.
Stages and durations from the production timeline, Newbilt cycle times,
two shifts 06:00 to 22:00, unplanned stops, stamper life 1,000 to 2,000
plays, audio sampling first-off plus about 1 in 50 (1 in 25 near end of
life), compound lots through the lab gate and release test pressing.
All orders, values and IDs are simulated; limits are illustrative.
Linked from digital-factory.md (the factory application), traceability.md
(customer-facing view), the README and the landing page.
Reviewed Record Industry's (Haarlem, NL) public vinyl calculator: a
seven-step wizard with a live itemised cost list priced on its server.
Read its prices for a reference 12" LP at 200 / 300 / 500 / 1,000 copies
and for each option worth copying (checked October 2026).
Both artist demos (make-a-record and artist-order):
- audio arrives as digital files, analog tape (+ tape transfer) or a cut
lacquer (no blanks, cutting or mastering; mastering choice disabled with
the reason; cutting and mastering stages skipped in the timeline; the
passport starts at "Lacquer received")
- labels printed, plain white or plain black (credit line; the label
artwork drop is disabled for plain labels; the mock-up shows the plain
label)
- press cleaning before a colour run, on by default, disabled for black
- 7" dinked (large centre hole), 7" only, drawn in the mock-up
- download card and barcode sticker extras
- run-out inscription (A-Z, 0-9, up to 15), scribed along the dead wax in
the mock-up and named in the passport
- new rates (tape 3,800, cleaning 2,300 per title; plain labels -12 per
disc; download card 43, barcode 6 per copy) are estimates with Record
Industry's prices as the basis, each listed in the detailed demo
- make-a-record investor notes: Record Industry's 9 to 11 week quote after
test-pressing approval against the 7 to 9 week CNX quote, and its 2 %
reject allowance against 100 % optical inspection
Defaults unchanged (37,836 THB per title, 232 per copy at 100, break-even
41, goal 100, 548 kept).
Docs: artist-platform.md (choices table, benchmark section: what was
taken, what was left out, commercial terms worth deciding);
revenue-model.md (second Western data point: 219 THB a copy at 300
ex-works, per-title and per-copy reading against the assumptions, not a
re-base); production-timeline.md (its published lead times).
After Launch the campaign page opens at day 0 with Play ready; the
artist (or presenter) starts it. The quick "Run the demo campaign" path
behaves the same; only the guided tour presses play itself.
The artist sets only the fan price; the number of fans needed follows from
it: the plant's 100-copy minimum, or the break-even if that is higher. The
goal selector of 6a62505 is removed from both demos.
make-a-record.html:
- step 4 leads with "Your price to fans" (input, slider from 300 THB,
presets 800 to 2,000) and a live "You need N fans to press it, X THB in
pre-orders", plus the price below which the minimum no longer covers
the costs (about 640 THB at the defaults)
- limited edition is now a switch, off by default; the edition size stays
visible but disabled until it is on, and switching it on adds the
numbered edition to the record
- "per title" renamed for end users: "One-off, for this release", "once +
per copy", "One-off setup", with a note that one-off costs count sides,
not songs (a double LP has four)
- the tour lowers the price to 500 THB and back to show the fans needed
rising from 100 to 152
artist-order.html: goal field removed, "Fans needed" label and hint.
artist-platform.md: the price-sets-the-goal decision (October 2026).
The goal is no longer fixed at the larger of the plant minimum and the
break-even; that is now the floor, and the artist sets any goal above it.
- make-a-record.html: "Goal: how many fans you need" with number input,
slider and chips (Lowest, 150, 200, 300, 500, 1,000); chips below the
floor or above the edition cap stay visible but disabled with the
reason; the goal also shows as the pre-order amount (fans x fan price);
typing below the floor snaps back with a note; the campaign, the
outcome and the stage run against the chosen goal; the tour shows the
goal being raised to 150
- artist-order.html: goal field in the campaign card, same floor rule
- artist-platform.md: the floor rule and that a higher goal is all or
nothing as well
Defaults unchanged (goal 100 = the plant minimum at 1,200 THB, break-even
41, 548 THB kept a copy).
Side length "at most" per format is now the table the team supplied
(October 2026, from recordplayerexpert.com, songs counted at an average
4:32): 12" 22 / 15 min, 10" 15 / 12 min, 7" 7 / 5 min at 33 1/3 / 45 rpm.
Changes against the earlier microcut.studio figures: 10" 33 1/3 16 -> 15,
10" 45 11 -> 12, 7" 45 6 -> 5. The comfortable column stays the lower end
of microcut.studio's ranges.
- artist-platform.md: table with a songs column, both sources, and the
three formats where cutting rooms disagree (10" 45 is now more generous
than microcut.studio and Diggers Factory) as re-check points for the
cutting engineer
- artist-order.html: LIM and the side-length table (songs column, sources)
- make-a-record.html: LIM; format cards show the at-most time and about
how many songs a side; step 2 hint adds the songs; the last control in
each colour row is now a labelled "Palette" pill with a colour wheel,
showing the chosen colour and "Your colour" when a custom colour is set
New static page docs/make-a-record.html (test site /demos/make-a-record/):
the artist platform as a customer would see it, polished for presenting.
- five steps (design, music and art, price, fan funding, track) with a
sticky stage: to-scale mock-up (record spins at 33 1/3 or 45 rpm on
hover), spec chips, price per copy, ship month and the next action
- design as option cards and swatches; options that do not apply stay
visible and disabled (weight and gatefold off 12", colour pickers for
black vinyl)
- masters and artwork read in the browser as in the detailed demo, side
bars per side, checks in plain words, approval 1 of 3
- price with the curve, itemised lines folded under one summary, lead time
as two bars (approvals, then the 7 to 9 week quote)
- fan funding: goal, break-even and what the artist keeps, money rules;
the campaign on a phone with a pre-order ticker, funded or missed ends,
production timeline with the artist's approvals, updates feed
- record passport for one delivered copy (stamper, press, cycle time and
side; stage dates; optical inspection and sampled audio), per
traceability.md and quality-automation.md, IDs simulated; repress card
- "Investor notes" switch with the business case per step (market
research, vault, short-run economics and the Thai price gap, plant-owned
vs broker and the Qrates lesson, traceability and represses); guided
tour of about a minute (#tour, #notes in the URL)
- light/dark theme shared with the other pages; phone layout with a
bottom bar
Same price list (demo-0.1) and stage table as artist-order.html, so the
defaults reproduce the artist platform example: 37,836 THB per title,
232 THB per copy at 100, break-even 41, goal 100, 548 THB kept a copy.
artist-platform.md: investor demo paragraph. traceability.md: the record
passport as the per-copy customer view. README bullet and layout line,
site DEMOS line and landing-page entry.
Phased build list for steam, cooling and hydraulics (launch, Duplex 1,
Duplex 2, Classic, options): everything cheap to oversize and costly to
retrofit (rooms, pads, headers and ring mains with a valved branch per
press position, tanks, HX frame, feeders, one sequencer) is built for the
five-press fleet at launch; boilers, chillers and hydraulic pump sets come
in identical modules as presses arrive. The Single 2.1 aggregate is
proposed as the first central pump set; per-branch isolation and filters.
Rooms sized for four modules each (user decision, estimates until vendor
footprints): boiler hall ~18 x 9 m for four 500 kg/h positions (fired case,
AIX DZL0.5 body), open screened chiller compound ~12.5 x 10.8 m with four
pads (250 kW at 40 C ~ Carrier 30RB 080-090), ~40 m2 pump and HX room; the
cooling tower pad of the water-cooled concept is dropped. Yard 178 -> ~379
m2. Four boilers carry ~8 presses with N+1; four 250 kW chillers carry the
five presses with CH-4 as reserve and no growth position unless the pads
take the ~350 kW frame (RFQ option).
- scale.md: yard table and basis, utility phasing section
- pressing-line.md: hydraulics phasing and re-quote questions
- steam-cooling.html: B-4 position, phasing and rooms card, details, RFQ
questions (pw_sc_check clean)
- construction RFQ: yard table, sealed area 6,549 m2 (68 %)
- total-investment: added-scope row +73k to +122k USD (building rate on
the ~200 m2 the yard grows by)
- Payap parts model: yard rebuilt from Params (blr_n, blr_inst, ch_*,
bh_*, cy_*, pr_*), renders updated
New FreeCAD model docs/cnx_vinyl_parametric_payap_parts.FCStd: the Payap
scenario rebuilt from plain Part solids and Draft (arrays, labels,
dimensions) on the same Params sheet, no BIM objects, plus:
- monopitch roof 10 deg, low eave 7.0 m south, high side 11.4 m north
(phase 1 RFQ geometry); gables and the fire wall follow the roof
- rooftop PV: 901 x 580 W placeholder modules, ~523 kWp, 17 rows in
blocks of four with walkways, 1 m edge strip, 2.5 m clear over the
fire wall (estimate)
- car canopy (10 bays, 72 modules) and scooter canopy (30 spaces,
22 modules), ~54 kWp, RFQ footprints and heights
- module counts and kWp as sheet expressions; ~577 kWp in all
FreeCAD 26.3 RC1 does not propagate spreadsheet edits: CNX_apply_Params
macro touches the dependents and recomputes; parametric test (factory
length, pitch, car bays, walkway) matches the sheet counts.
site-candidates.md: roof/PV/canopy section with the export, battery and
BOI questions a 577 kWp array raises; mirrors in sustainability.md and
scale.md; README layout lines.
With black vinyl the colour pickers are greyed out and cannot be used;
with solid colour only the first is active, marbled and splatter use
both. The weight buttons are disabled for 10" and 7" (140 or 180 g is a
12" option). Both rows were meant to hide, but .row display:flex
overrode the hidden attribute; a [hidden] rule now guards that too.
The record and jacket in the mock-up (sidebar and fan campaign page) now
scale with the chosen format: record diameters 302 / 250 / 175 mm
(IEC 60098), jackets 314 / 260 / 184 mm, labels 100 / 100 / 90 mm, so a
7" label is relatively larger as on the real disc. Smaller formats show
a dashed 12" jacket outline for scale and a caption with the sizes.
New static page docs/artist-order.html (test site /demos/artist-order/)
walking the artist platform flow end to end:
- record configurator (format, speed, discs, weight, colour, packaging,
extras, mastering, test pressings) with a live mock-up
- track list or dropped masters read in the browser (WAV/FLAC/AIFF
headers, sample peak and clipping), side length against the format,
jacket and label preflight (size, dpi, CMYK), rights and gate 1
- itemised offer (per title / per copy, pass-through jacket), price per
copy against quantity, lead time from the production timeline
- direct order or fan-funded campaign: goal = max(minimum run,
break-even), what the artist keeps, the money rules, a simulated
campaign (sells out / just makes it / falls short) with refund or
go-ahead-at-minimum, and the production tracker with the three gates
and the fan update feed
Price list demo-0.1 splits the doc's 38,000 THB per title and 132 THB per
copy into lines (estimates, each listed with its basis); defaults
reproduce the artist platform example (break-even 41, goal 100, ~548 THB
kept per copy at 100).
artist-platform.md: demo paragraph, side length per format table with
sources, VAT note on the campaign example. README bullet and layout line,
site DEMOS line and landing-page entry.
The annex row for type 72 in the very high density residential zone
carries the orange "permitted with conditions" mark; the condition as
printed is "ให้ดำเนินการหรือประกอบกิจการได้เฉพาะดัดแปลงหรือซ่อมแซม"
(may operate only for modification or repair). Added verbatim to the
source record.
Point 18.797678 N, 99.038272 E, queried on the DPT land-use plan map:
Chiang Mai comprehensive city plan in force from 25 May 2026, zone
ย.7-1, very high density residential. The zone prohibits every factory
under the Factory Act except the types in the plan's annex, and
prohibits warehouse and silo businesses.
Annex for this zone: type 107 (CD production, whose definition names
gramophone records and recorded tapes) is not permitted here, only in
the low density residential, special industrial, agricultural land
reform and rural and agricultural zones; type 72 (sound recording,
record players, gramophone records) only for modification or repair;
plastics products and metal plating are not on the list. A record
pressing plant cannot get a factory licence at that point.
Caveats recorded: point, not parcel; DPT data is preliminary, the
provincial office confirms; the pharmaceutical neighbour may be in
another zone or type. Since type 107 is permitted in the plan's low
density residential and rural zones, other Payap land is worth checking
before the lead is dropped.
- docs/land-listings/payap/: source record (zone rules, annex rows,
the 51 types permitted in the zone) and the Thai panel text.
- site-candidates.md: plot point, zoning row, status, the result with
caveats, check 1 marked failed for this point.
- README: project status line, layout line for land-listings/.
The order to investigate for a fired boiler (biomass such as rice
husk, or LPG): first a flue-gas economizer, second as much clean, hot
condensate back to T-1 as possible, third the heat pump HP-1 where the
press return has enough heat and the combined heating and cooling
economics justify it.
- Diagram: new ECON-1 (option, fired boilers only) between the feed
pumps and the boiler manifold, with a bypass for an electric bank and
the flue-gas path from the boilers; feed in 90 to 95 C, outlet and
stack temperature are vendor figures. HP-1 is now drawn as an option
and labelled the third measure. AT conductivity on the condensate
return to T-1; off-spec condensate goes to the warm tank.
- Found in Newbilt's offer 240620-04: steam and cooling water share the
mould channels, with one steam/water outlet valve and steam trap per
mould, so the condensate is only as clean as the cooling loop. Noted
in the T-1 detail, sustainability.md and as a Newbilt RFQ question.
- With most condensate returned (about 15 % flashes at atmospheric
pressure, estimate) the feed tank needs only a fraction of the ~70 kW
that heating all make-up takes, so HP-1 may not pay.
- RFQ: economizer outlet feed and stack temperature, corrosion limit,
pressure drop; rice husk ash is high in silica and abrasive, so
fouling, cleaning, wear protection and a bypass.
- sustainability.md: the order, before the exclusions. biomass.md: new
"Recovering heat at the boiler".
Checked headless (scripts/pw_sc_check.py): 33 boxes, 20 tags, no
overlap or overflow, no unstyled pipes, no card or page overflow at
1600, 1258 and 390 px in all four cases, every box opens its detail, no
errors.
Twenty temperature tags on the pipes, each styled by its basis: green
border for a Newbilt figure, amber for a design target or estimate,
dashed for a value the vendor or a measurement still has to set.
- Newbilt: steam main 10 bar ~180 C, header to the presses ~180 C,
press outlets ~60 C (one per press, dimmed with the press when it is
not installed in the selected case), supply header 20 to 25 C, oil
cooler return <= 35 C (supply plus max. 10 K).
- Design target or estimate: raw water ~28 to 30 C (ground
temperature), feed to the boilers 90 to 95 C, heat pump feed loop
<= 95 C, condensate after the traps <= 100 C (atmospheric return),
extruder returns <= 35 C (2 to 3 kW at 4 l/min), heat pump source in
<= 60 C, return header up to ~60 C mixed, chiller loop to HX-1 ~18
to 23 C (~2 K approach).
- To be set: heat pump source out, warm tank mixed temperature, chiller
loop return.
The clicked details say where each figure comes from, including that
Newbilt's 180 C is saturation at 10 bar absolute (~184 C at 10 bar
gauge, to confirm). Legend explains the three tag styles.
Checked headless (scripts/pw_sc_check.py, now also tag overflow and tag
overlap with boxes, labels, symbols and each other): 20 tags, none
overlapping or overflowing; no SVG or HTML overflow at 1600, 1258 and
390 px in all four cases; 32 boxes open their detail; no unstyled pipes;
no errors.
- The feedwater loop between HP-1 and T-1 was drawn with class "hr",
which had no stroke rule, so it was invisible. It now has its amber
stroke, flow arrows both ways and a "feed loop" label.
- Number cells were white-space:nowrap, so the operating-case table ran
up to 33 px past its card, the design basis table up to 312 px, and a
phone page was 842 px wide. Numbers may wrap now (only the coverage
percentages stay on one line), the side column and grid tracks may
shrink, and units moved into the case table's row labels. Only the
diagram scrolls sideways on a phone.
Checked headless (scripts/pw_sc_check.py, now also HTML card/table
overflow, document width and unstyled pipes): before, 'p hr' unstyled
and card overflow at 1600, 1258 and 390 px in every case; after, no
unstyled pipes, no card or table overflow and document width equal to
the viewport at all three sizes and four cases, no SVG overlap or
overflow, 32 boxes open their detail, no errors.
New page docs/steam-cooling.html (site /demos/steam-cooling/): the
utility plant as a clickable process diagram. Steam side: raw water,
softener and dosing, feed tank with heat-pump feedwater recovery, feed
pumps, a bank of two 500 kg/h boilers (third for N+1 as an option),
separator and metering, optional accumulator, blowdown, the 10 bar
header with a valved, metered branch and trap per press, drip legs and
condensate return. Cooling side: Newbilt's press outlets are open (max.
2 bar), so returns drain to a warm tank, pass the heat pump, an optional
dry cooler and a plate heat exchanger to a cold buffer tank, and VFD
pumps feed the 20 to 25 C header at ~10 bar to every press, the
extruders and the central hydraulic oil cooler; the chiller loop
(three 250 kW air-cooled modules at 40 C ambient, fourth as option) stays
closed and clean. Galvanics cooling (12 to 20 C) is a separate circuit.
Operating cases (launch, Duplex system 1, five presses, one module down)
show demand against installed capacity; design basis with sources,
equipment schedule, RFQ questions. Static SVG, no per-frame work.
Design basis at Newbilt's per-machine figures: steam 750 to 900 kg/h,
cooling 652.5 kW (625 presses, 15 extruders, 12.5 hydraulics), 305 to
540 l/min circulating. Also found: Newbilt's 53 l/min at ~60 C out is
~140 kW, above its 125 kW peak; listed as a re-quote question.
Re-based in the same commit:
- scale.md: electrical table (chiller bank ~210 to 325 kW electrical,
plant peak ~430 to 700 kW, ~950 to 1,330 kW with electric steam),
grid 800 to 1,000 kVA (1,250 to 1,600 with electric steam, Schedule
4 past 1,000 kW), tariff 4.5M to 6.8M THB/yr, battery ~1 h of chiller
peak, boiler and chiller banks, biomass up to ~550 t/yr at 1.5 M
records, utilities money line.
- sustainability.md, biomass.md: same figures; electric steam 5.2M to
6.0M THB/yr mature, 1.6M to 1.8M early; fuel saving 4.0M to 5.4M.
- utilities CSV: boiler bank, chiller bank with HX and tanks, softener
and loop treatment re-sized; baseline 23.98M-41.63M -> 30.07M-51.33M.
- total-investment.md: re-size as an added-scope row (+185k / +294k
USD); headline 4.7M to 8.9M unchanged until the investment re-base.
- pressing-line, equipment-suppliers, facility-security, fleet
calculator (boiler 1000 kg/h, chiller 750 kW), plant page detail
texts; README, landing page, build.sh.
Every machine box has rounded corners (rx 4), but its header band was
a square rect inset by 1, painted over the box. At both top corners the
band's square corner covered the inside of the curved border, so the
border looked thin and squared off there, most visibly on a selected
box. The band is now a path with top corners of radius 3, concentric
with the box.
Measured on zoomed crops in headless Edge (light theme, selected
border): border thickness along the 45-degree diagonal against the
straight edge was 0.26 to 0.42 on the Traceability box, Classic C1 and
the VEX 50; now 0.9 to 1.13. Full UI check unchanged: all press states,
47 stations, demo buttons, no overflow, canvas alignment, no errors.
The page spent most of each second laying out the SVG, not simulating:
the simulation itself costs ~26 ms per simulated hour. Profiled headless
on Edge (CDP metrics and a timeline trace with invalidation tracking):
- tokens asked the DOM for getPointAtLength right after writing a
transform, which forced a layout of the whole SVG for every token,
every frame (540 to 630 ms/s);
- ~55 CSS stroke-dashoffset animations repainted the drawing all the
time;
- the press platens were SVG rects moved every frame, and any geometry
write re-lays-out the whole SVG with its 275 text labels.
Now the SVG holds only the machines and labels. Pipes, flow dashes and
the conveyor are drawn on a canvas under it; tokens, records, platens,
cakes, the extruder screw and plating bubbles on a canvas over it, both
with the SVG's own viewBox transform, so pan and zoom need nothing extra.
Routes are measured polylines (ptAt) instead of DOM path queries, and
the 5 Hz tag, lamp and KPI writes only touch the DOM when the value
changes.
Headless Edge, 1600 x 900, before -> after:
1x 26 -> 60 fps, layout 842 -> 26 ms/s, long tasks 19 -> 0
60x 19 -> 59 fps, layout 858 -> 29 ms/s
600x 18 -> 60 fps, layout 855 -> 30 ms/s
3600x 33 -> 60 fps, layout 726 -> 29 ms/s
Behaviour unchanged: all press states seen at 3600x, 47 stations open
their detail, steam dip holds and recovers, lot and repress log, no text
overflow at 1600 x 900 and 1258 x 800, canvas and SVG agree within
0.2 px at fit, zoomed, 1258 x 800 and phone size, both themes, no
errors.
User, October 2026: we want unified Engelbert Strauss work clothes.
- worker-safety.md: decision recorded; everyone, office included, in the
same Strauss workwear with the company logo, process PPE on top. Kit at
Strauss catalogue prices checked October 2026 (incl. 19 % German VAT,
which drops out on export): production 3 trousers e.s.motion 2020, 3
polo shirts, 2 T-shirts, a sweatshirt, S1 safety shoes e.s. Vasegus II
low, ~293 EUR before VAT, ~338 with embroidered logos (embroidery price
an estimate); office 4 polos and a softshell jacket, ~127 EUR. Ordering:
Strauss ships outside Germany where customs law allows, shipping quoted
with the order, prepayment, duty and taxes charged to the recipient;
Thai duty on work trousers 13.8 %, BOI does not cover clothing. About
9k USD (~0.3M THB) a year at the start fleet. Check lighter lines for
the press hall heat with samples.
- revenue-model.md: workwear noted on top of the x1.3.
- Fleet calculator: workwear line under labour (production and office
kits a year, shipping and Thai duty), six new assumptions; 8,573 USD a
year at the defaults.
User, October 2026: take the BOI duty-free import and VAT exemption into
consideration.
- boi.md: import VAT goes with the BOI duty exemption (Revenue Department
answer on the BOI OSOS FAQ, checked October 2026); what it is worth:
~2.75M USD of imported machinery at the start fleet (block midpoints)
would otherwise carry ~5 % duty (Thai MFN averages 4.1 % on HS 8477,
0 to 10 % across HS 84; estimate until the HS codes are set), ~0.14M
USD, and 7 % import VAT, ~0.2M paid at the border and recovered later
as input tax, mostly as a refund claim since exports are zero-rated.
- total-investment.md: the blocks are vendor prices without duty or
import VAT, so the headline already assumes promotion.
- Fleet calculator: BOI promoted / not promoted switch and export share.
Not promoted adds the machinery duty to capex and depreciation, shows the
import VAT as cash at the border, and charges duty on imported PVC
compound; promoted exempts both, with no compound duty on exported
records and 90 % off for domestic sales (sections 36(1) and 30). A note
under the KPIs shows what promotion saves either way. Defaults: payback
3.1 years with BOI, 3.2 without; adverse case operating result -31k
with BOI, -68k without. CIT and BOI CIT exemptions still not modelled.
User, October 2026: option to enter base salaries; the company should
provide proper extra health care with check-ups for all staff.
- worker-safety.md: new "Health care for all staff" policy (decided
October 2026): group health insurance (inpatient and outpatient) and a
yearly check-up for everyone, office included, on top of social
security; the occupational checks Thai law requires for risk-factor
work (Ministerial Regulation B.E. 2547: within 30 days, then yearly, by
an occupational physician, records kept 2 years after the job ends) for
the press floor, galvanics and maintenance; planning costs with sources
checked October 2026 (group insurance ~8,000 to 18,006 THB a head a
year, plan ~15,000; Rajavej Chiang Mai check-ups 1,290 to 5,990 THB,
plan ~2,500 plus ~1,500 risk-factor tests, estimates); social security
5 % up to the 17,500 THB ceiling since 1 January 2026.
- revenue-model.md: cutting engineer 50,000 THB is base salary; health
care on top of the x1.3 (~0.35M THB a year at the start fleet); what the
x1.3 is made of.
- Fleet calculator: base salaries per role (the revenue model loaded
rates / 1.3; cutting engineer 50,000), employer social security 5 %
capped at 17,500, 25 % overtime, bonus and PPE, health insurance and
check-ups for all staff incl. 4 office staff (scale.md 3 to 5), risk-
factor tests for the press floor, galvanics and maintenance; all as
editable assumptions; people table gains office and all-staff rows.
Defaults: labour 5.25M THB (was 4.67M loaded), direct cost 1.90 USD a
record, EBITDA 2.19M USD.
Team figures, October 2026:
- revenue-model.md: a lacquer blank costs about 70 EUR, one per side, so
~160 USD a two-sided title before recuts; a cutting engineer costs about
50,000 THB a month;
- fleet calculator: the lacquer assumption is now in EUR (70, one per
side, converted at 1.155 USD per EUR; styli and recuts not included)
and the cutting engineer 50,000 THB a month, both marked as team
figures instead of estimates. At the defaults lacquers come to ~54k USD
a year and direct cost to 1.88 USD a record (was 1.86).
User, October 2026: add calculation for material cost, PVC, carton,
chemicals, labour etc. and revenue from sales.
New "Money a year" card (and a "Prices and money" input card):
- revenue: standard records at the standard price, specials with the
premium, title services per title (revenue-model.md 3.50 to 4.60
blended, +0.60 to 1.70, 580 to 1,730 USD a title);
- materials and packaging: PVC from the compound tonnage (rejects in,
trim back as regrind), labels per pressed record, inner sleeves,
printed jackets, shrink wrap, shipping cartons (estimate), maintenance;
- stamper making: lacquer blanks and styli per side (estimate), nickel,
silver and chemistry per electroformed part (revenue model: 60 to 150
USD a three-generation set);
- energy from the fleet: machines, chiller and compressors at the hours
run plus an estimated base load, roof PV off, PEA 3.2.2 blended rate and
demand charge; steam from the presses running time at the biomass heat
price (biomass.md); the start fleet lands in scale.md 4.3 to 6.4M THB;
- loaded labour per role (revenue-model.md wages; cutting engineer an
estimate), headcount now also counts QC, maintenance and cutting;
- overheads, EBITDA, depreciation of capex (total-investment.md start
fleet plan plus or minus each Duplex system and Classic), operating
profit, payback; per-record cost bar;
- Adverse / Central / Favourable presets from the revenue model ranges,
USD / THB / EUR display; ladder gains revenue and EBITDA columns.
At the defaults (1 M records, 20 % specials): revenue 4.42M USD, direct
cost 1.86 USD a record (revenue model central 1.94), EBITDA 2.23M.
README bullet; revenue-model.md links the calculator from its operating
picture.
User, October 2026: add a visualization of the machine park and the
connected stamper production to the tool.
- New card "Machine park and stamper production": one live SVG that
follows every input. Top: the stamper line, lathe, Pheenix PASU, PPPU,
PDPU (2 cells), PMPB, Sibert VSF, VSP, VSC, each with its count, flow a
day and how busy it is. Middle: the press hall, each Duplex cell drawn as
in the cell sketch (presses either side of the operator, EX 50 and EX 35
behind, trimmer in front) and each Classic with its built-in extruder,
wrapping into rows and scaling down for big fleets; compound in on the
left, stamper rack in and finishing out on the right. Bottom: central
hydraulics, boiler, cooling, air and electrical piped up into the hall,
amber where they exceed the plant as planned today.
- Stamper production is now counted per station from the cycle times in
galvanics.md (silvering, pre-plate four at a time, father, mother,
stamper plus handling per PDPU cell, PMPB, Sibert steps; usable share of
the hours 80 %, estimate) instead of a flat 20 to 32 parts per PDPU.
At the defaults: 1 PDPU at ~43 % busy, as galvanics.md concludes.
New assumptions with sources; the lathe rate (8 sides a day) is an
estimate.
- Requirements table: per-station counts and load; the URL hash now also
reloads in an open tab (hashchange).
Checked headless in Edge, both themes: no JS errors, no text overlap or
overflow in the schematic at the default, 8 M and 30 M records, no
horizontal overflow at 390 px.
User, October 2026: add bright/dark mode to the site for both tools.
- Each page sets data-theme on <html> before first paint: the saved choice
(localStorage "cnx-theme", shared by all cnxvinyl.lol pages) or, without
one, the system setting (prefers-color-scheme), which it keeps following
until the user picks a mode. Toggle: header button (sun / moon).
- Plant overview: light overrides for every SVG class; pipe colours are
now CSS variables (--p-*), used by the pipes and the legend, darkened in
light mode where the dark-mode tints were too pale (DI water, granulate,
stamper sets, cooling return); press state text and the VEX zone fills
use variables instead of inline hex, so they flip with the theme.
- Fleet calculator and landing page: light palettes; input, flag, badge
and ladder-highlight colours moved to variables.
Checked headless in Edge: both system schemes pick the right mode, the
toggle persists across pages, computed colours flip (press text, zones,
pipes, legend), no text overflow in either mode, no JS errors.
User, October 2026: calculations for the later business plan, starting
from 2 Duplex + 1 Classic at 3 records a minute per Duplex and 2 per
Classic, as an interactive tool on the website: pick the yearly output
and the share of splatter/specials, get the machine mix and all the
requirements (people, hydraulics, power, ...).
docs/fleet-calculator.html (single static page, no dependencies):
- target mode sizes the fleet (specials only on Duplex with its EX 35;
grow with Classics or with Duplex systems; start fleet as the floor);
fleet mode takes a fleet and gives its output at the specials share;
- output, capacity, utilisation and the mix bar per machine type;
- needs: people per shift and in total, galvanics operators, machines,
connected kVA and average kW, MWh/yr, central hydraulics (flow, motor,
oil, accumulator), steam, cooling and cooling water, compressed air,
press floor, room climate, compound, trim, titles, electroformed parts
and plating units; checks against the 400 kg/h boiler, 250 kW chiller
and the 870 m2 Payap press hall;
- ladder from the start fleet to a full Payap press hall, click to load;
- every assumption editable with its source (Newbilt Duplex site
requirements V14 and offer 240620-04, scale.md, galvanics.md, revenue
model, Payap model; estimates labelled), shareable link via the hash.
The Classic counts as one HRP 12 press plus one extruder until Newbilt
states figures (Toolex Alpha leaflet as a cross-check).
Site: DEMOS entry (/demos/fleet-calculator/) and landing-page entry.
README bullet and layout line; backlinks from scale.md (capacity) and
pressing-line.md (current plan).
User, October 2026: add the guard house and the gate; the truck apron is
far too big.
Model (changed live in FreeCAD 26.3):
- main gate as in the phase 1 RFQ: piers and two 5 m sliding leaves (shown
open, parked inside the wall), 10 m clear (gate_width 8 -> 10 m);
- guard house as in the RFQ: 4 x 3 m (guard room 8.4 m2 + WC 3.6 m2),
window wall to the gate, guard desk, on the gate's north-west side;
- boom barrier just inside the gate (cars and trucks both pass it);
- truck paving: the 42 x 101 m apron (~4,240 m2) replaced by an 8 m gate
road (550 m2) and a 32 m deep apron and dock face (1,600 m2) that joins
the east service road; new params apron_depth, road_w.
Docs: site-candidates Access bullet (~2,150 m2 heavy-duty paving against
1,608 m2 in the Mueang Chi RFQ).
User, October 2026: the Duplex sketch is not to scale, check it against
the documents; the fire water tank is too small.
Model (changed live in the open FreeCAD 26.3 document):
- both Duplex cells rebuilt in the sketched arrangement at the documented
sizes: presses 0.95 m square (0.9 m2) turned 45 deg, EX 50 0.5 x 1.0 m
(0.5 m2), EX 35 0.4 x 0.8 m and trimmer 0.6 x 0.6 m (estimates),
operator position marked; 0.6 to 0.8 m between machines;
- fire water: the ~25 m3 yard tank replaced by the facility-security
planning tank, 9 m x 4 m (254 m3 gross, ~200 m3 usable), new params
fw_dia, fw_h, fw_x, fw_y, at the front by the access road, outside the
production yard, on a ring foundation, with a pump house (duty electric,
standby diesel, jockey); the yard process water tank is now the 5 x 3 m
raw water tank of the phase 1 RFQ.
Docs: site-candidates (cell, raw water, fire water bullet),
facility-security (the Payap model draws the tank; 6 m racking and twice
the floor area make ~200 m3 a floor there).
User sketch, October 2026 (filed as docs/equipment/
duplex-cell-layout-sketch.png; arrangement only, the user notes it is not
to scale): operator in the middle, the two presses either side turned 45
degrees towards him, EX 50 and EX 35 side by side behind him, one trimmer
per cell in front on the left.
Sized from the Newbilt site requirements p. 10 (press ~0.9 m2, extruder
~0.5 m2, hydraulic aggregate ~1.0 m2, walk-around space, >= 60 cm to
walls, room height >= 2.5 m): cell ~5 x 3 m, 0.6 to 0.8 m between
machines; EX 35 and trimmer footprints are estimates. The layout drawing
the site requirements refer to on p. 11 is missing from our copy: ask
for it with the re-quote. README layout line for the sketch.
User, October 2026: ground-floor colour store plus outdoor silos; a
two-storey block at the east end with packaging below and printing plus
print and packaging stock above; in-house printing not decided, so the
print room is reserved only.
Model (rebuilt live in FreeCAD 26.3 after checking a copy of the saved
file for user edits; parametric check plot 150->160 m and upper floor
3.8->4.2 m passed):
- factory 128 x 25 m, plot 150 m (14.1 rai), corridor 98 m, fire wall
at 106 m, new params crane_x (runway end = press hall end, 92 m) and
mezz_z (+3.8 m);
- galvanics open to stamper prep (wall kept only on the material area
and electrical side);
- colour store 10 m bay (~180 m2): two racking rows, ~100 pallet
positions on 4 levels (estimate), weighing and mixing, vacuum
conveying station; indoor silos replaced by regrind bins;
- 4 outdoor PVC silos (2 black, 2 standard colours, ~50 m3 each,
estimate), big-bag filling station, buried conveying lines;
- finishing and print block 14 x 25 m: ground floor trim, optical
inspection, QC, packaging (tables, shrink wrap, pallet wrapper), stair
(Arch Stairs) and goods lift; upper floor print room (reserved), print
stock, packaging materials.
New docs/cnx_vinyl_parametric_payap-block.png with both block levels.
Docs: site-candidates Payap section rewritten (areas ~3,800 m2 under
roof, ~4,630 m2 of floor), crane doc (98 m corridor, runway ends at the
press hall), README bullet and layout line.
User, October 2026: special designs will need tens of colours, so the
compound store needs far more space, with maybe a few silos for black and
the standard colours; and the wall between stamper prep and galvanics is
to go.
- pressing-line: "Compound storage" bullet (colour store with pallet
racking, ~100 positions in the Payap model, estimate; outdoor silos
proposed; compound stays on the ground floor, ~160 to 270 t a year at
the mature fleet; sacks vs big bags decides the silo filling).
- galvanics: stamper prep open to galvanics, one clean zone.
User, October 2026: the office building also houses several showers, a
changing room, toilets and a canteen; the office area itself about
150 m2; the building can be multi-storey.
Model (office rebuilt live in FreeCAD 26.3; factory and site untouched):
- 32 x 15 m on two storeys (off_storey 3.6 m), ~960 m2 of floor, Arch
Stairs plus a lift, first floor slab with the stair and lift void;
- ground floor: reception and lobby (entrance and link door), canteen
~40 seats with kitchen and servery, changing rooms women and men with
4 showers each and lockers, toilets, mastering and cutting (acoustic
lining), listening room, archive;
- first floor: offices 147 m2 (16 desks), training room (Payap
programmes), meeting room, IT and server, toilets, pantry, flexible
room;
- factory staff entry relabelled "PPE, WC" (changing is in the office).
New docs/cnx_vinyl_parametric_payap-office.png with both floor plans.
Docs: site-candidates Payap section (office bullet, staff entry, area
~3,400 m2 footprint / ~3,880 m2 floor), README bullet and layout line.
User, October 2026: the factory is too small and needs room to grow
(possibly ten more Classics), one shared hydraulic and air supply, water
treatment perhaps in a separate building connected to the galvanics lab,
and a fully equipped workshop (maintenance tools, 3D printers, maybe a
lathe and a small CNC mill).
Model (rebuilt live in FreeCAD 26.3, BIM objects, Params-driven,
parametric check plot 135->145 m and factory 112->120 m passed):
- plot 135 m (11.4 rai) with a reserve; factory 112 x 25 m, 16 bays,
82 m visitor corridor, fire wall at 90 m;
- press hall ~870 m2: two Duplex systems (EX 50 + EX 35), the Classic,
ten future Classic positions in two rows on a service trench;
- central hydraulics and compressed-air plant room (~62 m2);
- water treatment building 12 x 10 m behind galvanics: buried duct
(gravity from the +1.2 m floor), covered crossing 6 m clear;
- workshop ~200 m2 with benches, tool cabinets, 3D printers, lathe,
small CNC mill, drill, saw, welding bay, press, washer, measuring table.
Docs: galvanics (water treatment building, proposed), crane doc (workshop
fit-out; lathe and CNC mill not yet priced; corridor now 82 m),
site-candidates Payap section rewritten, README bullet.
User, October 2026: the presses run from one shared hydraulic supply
and one compressed-air supply, and the plant may add up to ten more
Newbilt Classics at some point.
- pressing-line: fleet table and intro (shared central supply), new
bullets on the shared supply and the expansion option, re-quote point
(central supply for the whole fleet, extendable, can the Classic run
from it), Hydraulics bullet now the plan.
- scale: "Expansion (option)" capacity row, ~4.7 to 5.8M records/yr on
the same basis, explicitly outside revenue model and investment;
utilities note: fifteen presses would need ~2.3 to 2.7 t/h steam and
up to ~1.9 MW cooling, a utility phase of its own.
A separate FreeCAD 26.3 model (the Mueang Chi model is untouched) sites
the plant on a 110 m square placeholder plot of Payap land, built from
BIM objects (Arch Site, Buildings and Levels, walls, slabs, columns,
beams, a ramp, Spaces with computed areas, Equipment). Every object sits
on an expression-driven base, so the Params sheet drives plot, setbacks,
floor level, building sizes, fire wall line and office gap (checked:
plot 110 to 120 m and factory 84 to 90 m, everything followed).
- Factory 84 x 25 m, production only, in process order along a 54 m
glazed corridor; press hall 465 m2 with the October fleet (two Duplex
systems, each EX 50 + EX 35, and the Classic); crane to the fire wall;
machine door and 12 m ramp at the north-west corner.
- Office building 24 x 15 m, 12 m away on its own slab with a covered
link: reception, offices, meeting/training, mastering and cutting,
listening, IT, archive. Resolves the crane-zone conflict of the old
sketch.
- Utility yard behind the press hall (boiler and chiller flagged for
re-sizing), gate, truck apron, car park, service road.
- site-candidates: new section and plot-fit note; crane doc: conflict
resolved, 54 m corridor; README bullet and layout lines; the old
sketch is labelled as Mueang Chi with the earlier fleet.
Correction from the user: the two Duplex systems are not in the
two-extruder configuration. Each runs two HRP 12 presses from an EX 50
main extruder with an EX 35 auxiliary extruder beside it for a second
colour; the Classic stays. Fleet still five presses. Updated in
pressing-line (table, phasing, re-quote: EX 50 vs the VEX 50 of the 2024
quote, and whether one EX 50 keeps both presses at full rate), scale,
total investment (wording; estimates unchanged), roadmap item 4, README.
The current plan (user decision, October 2026) replaces the 50/50 target
(two semi-automatic presses and two Pheenix AD12s) with an all-Newbilt
fleet of five presses: two Duplex systems in Newbilt's two-extruder
configuration (two HRP 12 presses, an extruder each, one hydraulic unit)
and one Classic fully automatic press.
- pressing-line.md: new "Current plan" section (fleet table, what it
means, phasing from the Single 2.1 as the first half of system 1,
re-quote questions); site requirements per Duplex system.
- scale.md: capacity table and basis (368 to 448 records/h, ~1.06 to 1.5M
a year on two shifts, same range as before); pressing electrical row;
steam and cooling flagged, not re-based: five presses draw ~750 to 900
kg/h of steam and up to ~625 kW of cooling at Newbilt's per-press
figures, against the 400 kg/h / 250 kW sized for one Duplex.
- total-investment.md: fleet change as an added-scope row (system 2
~230k-300k and the Classic ~290k-460k, estimates; -60k / -160k against
the two blocks it replaces); headline unchanged until the re-base.
- roadmap items 4, 5 and 24, revenue model mature row, crane doc (the
Classic's weight now decides 5 t or 3.2 t), vendor landscape (AD12 is
the comparison for the Classic), README.
The business plan docx is not regenerated.
OMS (Lou Wullms) sent its introduction letter, filed in
docs/equipment/oms/: wet-room units with reference prices, two 4-cell
configurations (EUR 224,000 basic with two EFS2-200, EUR 311,000 advanced
with one AEFS4-250 and PLC; installation days extra), capacities of 24
and 32 shells in an 8-hour day, utilities, rooms, staffing, used
equipment, and five contacts for buying a cutting lathe. Recorded in
galvanics.md (tables, our reading: the advanced units add up to EUR
314,000, know-how transfer is left out of both totals although CNX has no
plating know-how, the basic set has no passivation unit), the exhibitor
follow-ups, vendor landscape (new section on used lathes and cutting-room
contacts, plus Lou's three websites), supplier map, roadmap items 6 and
13, total investment (basis note only, block unchanged) and the scale
people estimate. Open: forward the letter to Simona, as Lou asked.
Sibert (Ian Locke, 9 October): footprints and formal quotations when we
are ready; settle the pressing side first, hopefully with Pheenix, and
mention his recommendation if we do; impressed by the green-factory
plans (supplier feedback). Open: pass on the recommendation if Pheenix is
chosen.
CNX-01 in proplan: OMS basic and advanced added as options to D-002 with
their reference prices in THB; budget line 3 notes the OMS range.
- Sibert: back in Thailand, investor meeting in preparation, his OMS/Pheenix
advice noted; itemised quotation not yet requested.
- OMS: met in Haarlem; role split given to Lou (Simona management and audio,
Alexander technical); waiting for his calculation material.
- README: team roles, investor meeting in the status list.
- Pheenix Alpha (Robert Gunnarsson, 5 Oct; Simona's reply 9 Oct): offers
a Teams call, reference clients and a factory visit near Stockholm;
300+ presses (vendor figure); we call once questions are concrete,
next Europe trip planned for February 2027. CEO contact and Marsta
address added.
- OMS (Lou Wullms, 7 Oct): first email contact, company data, contacts
(Lou Wullms technical, Wilma Peeters accounting/logistics); open: reply
to confirm, then OMS sends material to calculate from.
- SST Frankfurt (Daniel Krieger, 7 Oct): cut the lacquers for POY003,
005, 006 and 013; on good terms with ResurRec; offered help. New cutting
service entry in the supplier map and vendor landscape; corrected the
briefing, which had SST as DMM (its site lists lacquer and dubplates).
- Roadmap items 5, 6 and 14 and the production timeline launch basis
updated accordingly.
No public price index exists; DEDE lists buyers, not prices. Reported
market prices: fresh chips 1,350-1,800 THB/t (LH Bank, Mar 2026),
rubberwood firewood >1 THB/kg farm gate (OIE RIU 2026, doubled since late
2025), corn residue 2 THB/kg (Sunsweet, Mae Chaem), rice husk ~1.5 THB/kg,
pellets 3,000-5,000 THB/t. Planning price 1.35-2 THB/kg delivered, so the
mature fuel bill is ~0.6M-1.2M THB/yr (was 0.35M-0.8M): still a quarter
to a tenth of electric steam. Prices follow diesel; Ratch Pathana's Pa Sak
(Lamphun) buying centre is the local price-setter. Sources filed under
docs/finance/biomass/; sustainability.md and README follow.
PEA tariff schedule (May 2023 onward, still current) filed under
docs/finance/pea/; Ft 0.1623 THB/kWh for Sep-Dec 2026 from the PEA Ft page.
The plant falls under Schedule 3.2.2 (Medium General Service, TOU, 22 kV).
New section in sustainability.md: blended ~3.81 THB/kWh for two-shift
production plus 132.93 THB/kW demand charge; electric steam ~4.7M-5.5M
THB/yr at maturity against ~0.35M-0.8M of biomass fuel; self-consumed PV
worth ~3.7 THB/kWh (~4.5-7 yr payback); solar thermal not recommended;
the battery earns little from TOU arbitrage or peak shaving. biomass.md,
scale.md, the utilities CSV note and the README follow.
FreeCAD BIM (Arch) sketch of the 60 x 25 m phase 1 hall:
Building > Ground floor with Spaces for every zone (areas computed),
room-in-room partitions, the fire wall at 48 m, the 5 t crane runway,
and the main equipment as BIM Equipment (Pheenix line, Sibert row,
Newbilt Duplex and two Classic presses, silos, racking). Zones run in
process order along the visitor corridor. Top-view PNG alongside.
Linked from the README and from the crane doc, with the one conflict it
shows: reception and cutting room under the crane travel.
Ian Locke's email of 5 October 2026 after Making Vinyl Europe:
- Budget of USD 250k for VSP, VSF and VSC confirmed; his time, spares,
shipping and travel extra; itemised quotation on request. The
total-investment block keeps its estimate until the re-base, the
difference (+190k low case / +80k high case) goes into the
not-yet-rolled-up table.
- Current specifications filed (VSF and VSC 2022, VSP 2023) plus the
VSF/VSP/VSC line-up drawing (4958 x 833 mm); the 2021 issues move to
sibert/specs-2021/. VSC is now 1000 kg with split OD hydraulic / ID
pneumatic forming; VSF 0-30 psi, 4-station head. Crane table, supplier
map, vendor landscape and the plant page details updated.
- Fully automatic VSPa exists; Sibert offers to move features to the VSP.
- Electroforming: OMS (Optical Media Services, Lou Wullms) named next to
Pheenix; added as a third galvanics candidate with open questions.
- Sequencing advice (presses, boilers, operators and live feedback loops
first) recorded in the exhibitor briefing, roadmap item 23, and as
digital-factory design decision 9 (operators see the data first).
Rebuild docs/plant-operation.html from the single P1 press into the mature
plant: Newbilt Duplex (two HRP 12 on a VEX 50, EX 35 for splatter), two
Newbilt Classic automatic presses with edge trimmers, label punch and
Granulator 400; Pheenix Alpha PASU, PPPU, two PDPU and PMPB; Sibert VSF,
VSP and VSC in that order; father and mother archive and the stamper rack.
Time runs at 1x real time with speeds up to 3600x. Press cycles are
Newbilt's (Classic 28 s, Duplex ~30 s), plating follows Faraday's law at
the PDPU current, and the operator steps use the galvanics.md table, with
unpublished times marked as estimates. Titles flow through the three artist
gates in days; test pressings unmount and the presses run approved work
meanwhile; worn stampers and represses come from the archived mothers.
Two shifts, unplanned press stops sized to scale.md's 60 to 70 %
effectiveness, and demos for a steam dip, a new PVC lot and a repress.
The boiler and chiller are shown at 800 kg/h and 500 kW (estimates) and
the detail panels flag that scale.md's 400 kg/h and 250 kW are Duplex
figures; scale.md itself is unchanged.
Also commits the galvanics.md cycle-time table the page runs on (one PDPU
covers demand, the second is redundancy) and updates the README and the
test-site descriptions.
quality-automation.md: the day-one per-lot tier becomes a table with an
instrument class and a rough price per check (moisture analyzer, strip
oven, density balance, spectrophotometer, gloss, sieves, muffle furnace,
stereo microscope), plus what was missing: a lab plaque press or two-roll
mill so speck, color and DSC tests do not tie up a production press;
sample conditioning as part of the method at 60 to 90 % ambient humidity;
magnets for metal in lots and regrind. Day-one tier ~USD 55k to 150k
(estimate); Karl Fischer and the ISO 182 Thermomat as options. Mature tier
priced (~120k to 240k), handheld XRF as an option, and partner labs (Payap
pharmacy, CMU science) to defer it.
total-investment.md: the day-one tier goes into "Added scope, not yet in
the roll-up" (55k to 150k USD, 1.8M to 5.0M THB); added total now ~290k
to 690k USD, about 7 to 9 % on the subtotal. Headline total unchanged.
Most people the team talked to in Haarlem were strongly interested in the
full-traceability approach. For Sibert it was one of the reasons to talk to
us at all; without it their representative would strongly advise against
the plan, and seeing buildfor.life's development and data work convinced
him the project comes from the right direction.
Exhibitor briefing gets an "After the show" section (feedback, what has
been filed since); traceability.md opens with the market signal; roadmap
item 1 notes it as supply-side evidence, with buyer prices still missing;
README project status updated (show attended, Payap lead).
Payap also wants to work closely with the project on new student
programmes: audio engineering (mastering, lathe cutting), IT, business
administration and more.
New docs/payap-partnership.md: why it fits (mastering/cutting engineers
are the hardest hires; Payap has music, IT, business, communication arts,
an English-language International College and pharmacy labs; the plant has
a lathe, production data and a real factory application), programme areas
mapped to the docs they draw on, and what it changes: a reason to bring
the cutting room (roadmap item 27) forward, a cutting engineer before the
students, lacquer and stylus cost of teaching, pre-release security for
customer audio, student access and safety, IT work on staging only, the
link to the Payap land, BOI R&D merit. Suggested form: MOU, internships,
short certificate courses first, degree tracks later; what to settle in
writing and questions for the next meeting.
Links from README (bullet, layout), site-candidates, roadmap item 27, the
supplier map's open training item and the BOI open items.
Payap University (Chiang Mai) is interested in leasing land to the
project; a pharmaceutical facility is under construction on the same land.
New docs/site-candidates.md puts the three options side by side (Mueang
Chi lease, Northern Region Industrial Estate, Payap) with the public facts
on Payap (Mae Khao campus on the Chiang Mai-Lampang superhighway, bought
as low-lying land, ~275 acres; Faculty of Pharmacy cosmetics production
facility tendered July 2024; RPAH cannabis/herbal bioreactor centre), why
it is attractive (5 km from the old city, a university partner with music,
pharmacy and labs, production already being built there) and the checks
that could rule it out, in order: zoning for pressing, boiler and later
electroplating; whether the university can lease to a company; the GMP
neighbour's sensitivity to our emissions (argues against biomass steam
there); flooding; plot fit; galvanics consent. Questions for the next
meeting listed. Nothing re-sited: model, RFQ and site code stay on
Mueang Chi until a plot is known.
README (intro, bullet, layout), roadmap item 9 and the lease fork in
project-timeline link to it.
docs/equipment/pheenix-alpha/: the four Pheenix Alpha electroforming flyers
(2024: PASU silvering, PPPU pre-plating, PDPU dual-cell plating, PMPB
passivation bench), renamed from their download hashes.
docs/equipment/sibert/: the VSP, VSF and VSC technical specifications
(2021), plus Sibert's 2008-09 optical-disc SPS literature and the 2008
Blu-ray stamper characteristics paper in sps-optical-disc-2009/. Two
byte-identical duplicates in the download were dropped.
New docs/equipment/galvanics.md, the metal-path counterpart to
pressing-line.md: datasheet tables for both ranges and what they change.
Pheenix is a second turnkey galvanics vendor next to Digital Matrix and
can quote lacquer-to-record as one vendor; neither range includes water
treatment. Utilities from the sheets (~27 kVA connected per line, DI water,
12-20 C cooling water, extraction sizes), ~5.6 m2 of footprint, and a cell
count estimate (one PDPU at the low end, two at the high end). The Sibert
machines are single-phase, 200/250/600 kg on castors, centre manually and
list no data interface; the VSC locates on the punched hole; the finisher's
water carries nickel. Weights, cycle times, prices and mould fit are listed
as quote questions.
Backlinks and small updates: README (bullet, layout tree, vendor list),
roadmap items 6 and 23, vendor landscape, supplier map, exhibitor briefing
(on-file notes, Sibert three-phase question answered), digital factory
(Pheenix PLC data, Sibert data question, RFQ clause 5), quality automation
(hardness on the centre slug, BD paper as the acceptance-spec model),
sustainability (finisher water), total investment block label (numbers
unchanged), scale (galvanics feeder note), crane weight table, process
flow, pressing-line stamper-fit question, plant page detail lines.
docs/equipment/newbilt/flyers-2026/: the six 2026 product flyers
(Classic, Duplex, EX 35, Edge Trimmer, Granulator 400, Label Punch) and
the 2024 Classic print flyer, collected at the booth in Haarlem.
pressing-line.md gets a range table with the flyer figures and what they
change: Classic and Duplex share inserts (one mould family for a
Newbilt-only fleet, Classic now named as automated candidate next to the
Pheenix AD12), edge trim of 20 to 40 g per 12" 180 g record brackets the
~20 % regrind share, the Granulator 400 runs in batches, central
hydraulics is an option, and the EX 35 is not in the 2024 quote.
Sources disagree on the Classic's panel (two 21" vs one 10"), extruder
power (7.5 kW drive in the 2024 flyer vs 15 kW noted earlier) and 10"
support; recorded as re-quote points instead of picking one. Supplier
table and exhibitor briefing corrected to match and given Erwin Neubauer
as a second contact; plant page grinder detail cites the flyer figures.
The header no longer forces a 1,600 px layout: it wraps on tablets and
narrow desktops (all nine KPIs now fit at 1,600 px, one was clipped
before), and on short screens (max-height 560 px, i.e. phones in
landscape) it collapses to one row with a scrolling KPI strip. There the
detail, event log and legend move into a side sheet (Info button, opens
by itself when a station is tapped), so the drawing gets the full height.
The drawing pans and zooms by viewBox, so the sim coordinates are
untouched: pinch and drag on touch, wheel and drag with a mouse, plus
zoom buttons and +/-/0 keys. A drag or pinch never selects the station
under the finger. Uses 100dvh and disables iOS landscape text inflation.
Upright phones get a hint to turn sideways.
Checked in Chrome device emulation at 667x375, 740x360, 844x390,
932x430, 1024x768, 1180x820, 1366x1024, 1258x800, 1600x900, 1920x1080
(no horizontal overflow, zoom controls clear of every station) with real
touch input (tap, tab switching, pinch, drag) and a 10x sim run without
errors.
A first run failed with "Permission denied (publickey)": s1 accepts only
the blog key (deploy@s1.b4l.co.th, SHA256:o4w7HL...) for the deploy user,
and the secret held a different key. The SSH step now strips CR, refuses
a secret that is not an unencrypted private key, and logs the key's
fingerprint for comparison with authorized_keys. The ssh host alias is
renamed so the masked VPS_USER value no longer hides it in the log.
site/ builds the internal test site: public/ served as is (landing page,
robots.txt, static sites) plus demo pages copied out of docs/ (the plant
operation page at /demos/plant-operation/). build.sh fails on dead
internal links and stamps version.txt.
.gitea/workflows/deploy-site.yml rsyncs site/dist to the buildfor.life
web server with the blog's two-directory rename swap, checks version.txt
on the server, purges Cloudflare when a token is set, and checks the
public URL. Secret names match the blog's workflow.
site/Caddyfile is the virtual host to append on s1 (noindex everywhere,
Cloudflare-only like the blog apex, www redirect). site/README.md has the
one-time setup: DNS, Caddy, web root, secrets, runner.
New docs/artist-platform.md: upload master and artwork with automatic
audio, artwork and rights checks; an itemised price calculator for every
customer (per-title vs per-copy lines, price-per-copy curve, lead time
from the production-timeline quote table, versioned price list); and
fan-funded campaigns that press and dropship per fan once the goal is
reached, refund otherwise. Covers goal maths, payments (charge into a
ring-fenced account, CNX as seller of record, legal opinion first; the
Qrates failure as the design rule), repress pre-orders, architecture on
the cnx-factory stack with the public side on a fleet machine, PDPA,
phasing (calculator public early as a run-size probe, campaigns only
after first releases ship), cost and open decisions.
Backlinks from README, process flow, production timeline, revenue model,
digital factory and roadmap items 1 and 20; total investment added-scope
table gains the platform line.
New docs/crane-workshop-tours.md: a 5 t single-girder EOT crane over the
whole production compartment (stops at the warehouse fire wall), a
machine door and crane-served workshop/machine bay at the ramp end, and
a glazed ground-level visitor corridor along the car-park elevation with
stations in process order, its own air and acoustic glazing so tours
need no PPE. Covers what each changes in the shell (crane-ready frame,
hook height under the 7.0 m eave, no full-height cross walls in the
crane zone, room lids and crane hatches), safety, costs and open
decisions.
Propagated: construction RFQ (crane-ready frame, new section 1c, machine
door, accessible 1:12 entrance now required), scale zone table (+210 to
280 m2, total ~1,400 to 2,000 m2), facility security, worker safety,
roadmap items 9 and 15, total investment added-scope table, README.
Sillitoe Audio Technology (Australia) sells a complete cutting system:
lathe, MMFB feedback cutterhead, cutting amplifier, Space / Time Control
automation with a virtual groove, vacuum and microscope, at a published
USD 125,000 ex tax and shipping. Vendor landscape gets the narrative and
an Agnew-or-Sillitoe comparison; supplier map, total investment basis,
roadmap item 13 and the digital factory's no-telemetry section (STC cue
sheet, Open Groove export, stylus hours) follow.
Rewrite docs/digital-factory.md against the fleet that already exists at
git.b4l.co.th/B4L/cnx-network-clan instead of a plant-only clan:
- The plant is one more site: gw-lpn-1 from the cnx.router module, plant
machines in the same inventory, reached over the existing ZeroTier mesh
(no VPS, no moon, no port forwards).
- Fleet pieces reused as-is: control for host metrics, journals and host
alerts; ns1/ns2 for the gateway wildcard cert; web01 as the public
proxy for the customer portal; clan borgbackup with a plant server.
- Process time series move from TimescaleDB to a plant-local
VictoriaMetrics (same modules and rules as control); PostgreSQL keeps
everything with identity. Object storage dropped for ZFS datasets.
- VLAN table on the fleet addressing convention (siteId 3 assumed, ids
above 40); OT segments as dual-homed islands behind the collectors;
stations reach the app only through the gateway Caddy proxy.
- New section listing every file that changes in the clan repo, the
modules/vinyl/* to write, and three router-module extensions (NTP
serving, static VLANs, second WAN).
- Gaps the plant closes for the fleet: Alertmanager delivery, off-site
backup destination, TSDB backup.
- Repository layout decided: infra in cnx-network-clan, app in
cnx-factory as a flake input, this repo stays documents.
README bullet updated to match.
New docs/digital-factory.md: every system needed for environmental,
machine, QC and genealogy data to land in one database keyed to one
record identity. Standing decision: all services run on NixOS machines
declared and deployed as a single clan.lol inventory (mesh, backups,
host monitoring, secrets from clan services).
Covers machine list and roles, VLAN zoning, Telegraf/MQTT acquisition
source by source with the RFQ clause for each, environment sensor zones,
QC instrument integration paths, the factory application modules and
entities, alerting tiers, backup and retention, security, procurement
clauses, build order aligned with the roadmap phases, rough cost and
open questions.
README index and layout tree updated; roadmap item 17 and the
traceability spec link to the new document.
The docs and the plant page had labelling as a finishing step after the
press. On a record press the bottom label, the cake and the top label go
in between the stampers every cycle and the mold bonds the paper into the
vinyl; the oven only pre-dries them. Corrected everywhere the process is
described:
- process-flow.md: labels are a parallel input to pressing with their own
row (print inspection, oven, lot per cycle); stage 6 loads label, cake,
label; stage 7 is trim, sleeve, shrink
- process-flow.drawio (+ regenerated png/pdf): label input now feeds
stage 6, not stage 7
- README vision list and the business plan source (regenerated docx/pdf):
pressing paragraph explains the pressed-in label, finishing no longer
claims to label
- plant-operation.html: label dry oven station feeds two label discs
into the press with every cake, the cake in the mold shows its labels,
the cycle log records the label lot, finishing is sleeve + shrink
docs/plant-operation.html: one self-contained static page showing the
whole plant running, from PVC intake and the material lab gate through
extruder, press cycle (load/close/steam/cool/open/eject), trimmer, 100%
optical inspection, sampled audio comparison, finishing, packaging
(matrix code vs barcode) and fulfillment. The metal path (audio intake,
mastering, cutting, silvering, father/mother/stamper, stamper prep) runs
above with the three artist gates; utilities (steam, cooling, air,
hydraulics, grinder/regrind, energy, traceability, HVAC) below with
live-looking tags.
Numbers are taken from the repo (Newbilt site requirements, scale.md,
quality-automation.md, process-flow.md). Every station is clickable for
what happens there and the checks that gate it. Two demo buttons show a
steam pressure dip holding the press and a new PVC lot held by the lab
until a test pressing releases it. README links the page.
Leased land instead of purchase, in-house cassette duplication, CD-R
duplication with CD replication shown as a separate investor decision,
Ploy Printing as packaging partner and intended co-investor, and a
dedicated section on traceability, metrology, QC and efficiency.
The project has a standing style rule against em dashes that was missed
when these docs were written. This removes the 42 occurrences where the
substitution is mechanical and cannot change meaning:
- table cells using an em dash as a placeholder, now a hyphen
- em dashes immediately followed by a conjunction or subordinator
(but, and, or, so, though, while, which, where, because, since),
where a comma is simply correct
115 remain. Those join independent clauses, where a comma would create a
splice and a colon often reads wrong, so each needs a judgement call
rather than a pattern. A blanket regex over them was attempted and
reverted: it produced double colons and broken sentences.
Both were flagged in the review and deferred; fixing them properly
changes what the model says.
Labour
- The 0.23-0.40 USD/record line implied 44,000-63,000 THB per head per
month, far above northern Thai production rates.
- Rebuilt from headcount and wages: 13-19 direct production staff
(operators, galvanics, QC, maintenance) at loaded northern Thai rates
gives 3.7M-5.4M THB/yr, or 0.08-0.16 USD per record. Build-up shown.
- Mastering and cutting engineers excluded as title-services labour;
admin and sales moved to overheads where they belong.
- Stamper amortisation widened to 0.03-0.12 to match the in-house
marginal cost assumed elsewhere on the page.
- Direct cost total is now 1.30-2.58 USD (43-85 THB).
Operating roll-up
- The old EBITDA and operating-profit figures did not reconcile with
their own components and showed no loss case anywhere. Replaced with
a three-scenario table built from the components, each column
internally consistent, with cash overheads and depreciation separated.
- The adverse case is EBITDA-positive but does NOT cover depreciation:
operating profit -0.32M USD at 1.0M records on the low price and high
cost. The previous figures quoted 0.6-1.2M and hid this entirely.
Utilisation and price realisation decide solvency, not just upside.
- The favourable case is not credible and that is a finding about the
cost table rather than the business: 69% EBITDA margin against
industry norms of 15-25%, and 47% even at the centre. The direct cost
table counts only per-record consumables and direct payroll. Named
what is missing (indirect labour, scrap above the reject allowance,
water and effluent, inbound freight, inventory carrying, sales
commission) and marked the adverse column as the honest one until
those lines exist.
- Payback restated per scenario: never / 2.3-4.4 yr / 1.0-1.8 yr. The
old "5 to 8 years" came from the pre-correction margin.
- FX sensitivity and the utilisation bullet updated to match.
The table is a sensitivity, not a forecast, and now says so.
A four-agent review audited arithmetic, cross-document consistency,
epistemic honesty and style. It found substantially more than the
manual pass in the previous commit. Errors that changed conclusions,
not decimals:
Arithmetic
- production-timeline: the headline lead times did not reconcile with
the stage table on the same page. Launch is 22-49 days (was 21-39),
mature 11.5-22 (was 14-20), repress 6.5-11.5. Including gates,
launch is 6-17 weeks, not 8-14.
- Consequence: at 17 weeks the launch configuration is at parity with
EU/US plants, not ahead of them. The page now compares quote to
quote rather than a stage sum to a quoted lead time, and says so.
- The galvanics turnaround saving is 1.5-5 weeks, not 3-5.
- scale.md Duplex capacity 300-600k/yr did not reproduce from its own
stated basis; corrected to 175-540k. production-timeline disagreed
with scale.md on the same fleet; both now agree.
- "300 units is under an hour of pressing" was out by an order of
magnitude on the semi-auto line: 5-8 hours.
- project-timeline carried two totals for the same quantity. Now
27-33 months throughout, with the Gantt's two ordering breaks fixed.
- scale.md: 300 kWp covers 28-45% of consumption, not 20-35%; roof PV
stated as both 150-200 and 247 kWp for the same roof; parking canopy
dimensions and PV disagreed with the RFQ.
- RFQ: fire tank stated 200 m3 where both its geometry (254 m3) and
its own mass (250 t) say 250. Drainage now gives total sealed area
66%, not the 46% paving figure, since that is what attenuation needs.
- Galvanics payback used only the top of the saving range: 1-5 years,
not 1-4.
Inference marked as inference
- The 22,000 THB stamper figure is an invoice RESIDUAL. It carries
lacquer cutting, test pressings, setup and margin, so it is an upper
bound on the stamper component, not a measurement. Everything derived
from it now says so, and a line-itemised invoice is the top question.
- The saving was also benchmarked against the wrong supplier: CNX buys
from Stamper Discs, not a Thai reseller. Stated as 175-665 USD until
that quote exists.
- The stamper-bottleneck hypothesis now names its alternatives. Jacket
print runs would produce the same symptom and would constrain CNX
equally, which would remove the competitive read entirely.
- Competitor capacity relabelled as nameplate times an assumed OEE,
with the assumed shift pattern stated; all rows on one 300-day basis.
- The fixed/variable decomposition keeps the shape and drops the point
estimates: the solve point inside the flat 1000-3000 tier is
arbitrary and moves the fixed component by nearly half.
- "Nobody in Thailand plates" reduced to "we have found no evidence",
with a desk check named as the action.
- Cut the USD 450-700k valuation of a competitor's presses entirely.
It extrapolated a semi-auto quote onto a different machine, ignored
the used market, and supported no decision.
- The collaboration payback divided capex by revenue where the same
page uses contribution elsewhere: 5-10 years, not 1-3.
Missing caveats added
- No financing is committed or modelled anywhere in this repo;
project-timeline previously asserted money was not a constraint.
- Leasing cannot pull the launch forward on its own, since the press
chain governs and construction has float against it.
- The whole competitive analysis is one buyer, one plant, one
afternoon, and the primary evidence is not archived in the repo.
- ResurRec is a competitor and may decline to buy from a new entrant.
Currency
- Base currency moves from EUR to USD and THB throughout. Rates at
5 Aug 2026: 1 USD = 33 THB, 1 EUR = 1.155 USD, 1 GBP = 1.35 USD.
EUR/THB lands at ~38, so existing THB research needed no change.
- Vendor quotes keep their original currency with a USD/THB equivalent
alongside, so they stay checkable against the source PDFs.
- Full vision ~4.7-8.9M USD; phased entry ~1.7-2.9M USD.
New documents
- production-timeline.md: order turnaround stage by stage. Launch
8-14 weeks, mature 5-10, repress 2-3. Quantifies the in-house
galvanics turnaround claim the repo had asserted without a number,
and flags artwork as an unmodelled fourth approval gate.
- project-timeline.md: calendar to first paying release, ~Q4 2028.
Critical path is BOI certificate to press order to build to
commissioning. Two findings: Newbilt build time is absent from the
repo yet carries ~40% of the schedule, and the BOI rule may be
over-serialised since duty exemption attaches at importation rather
than at contract signature.
First market data (ResurRec, Bangkok)
- Invoice-derived prices, a factory tour, and a confirmed fleet of one
Newbilt Classic 12" automatic plus one semi-automatic.
- Price ladder recorded at 300/500/1000-3000/3000+ units. Decomposes
to roughly 34-50k THB fixed per title and 535-780 THB variable per
unit, which is 4-7x the price this model assumes.
- The incumbent presses 230-350k records/yr but buys every stamper as
an import. That single constraint plausibly explains their 150-unit
floor, their flat discount ladder and their large-run lead time, and
it is what an in-house galvanics line attacks. Logged as an open
question on whether galvanics should move from phase 5 to phase 1.
- Inferences are marked as inferences; the whole set is one buyer and
one plant, and the model is deliberately left unrebased until a
second data point exists.
Corrections
- Gross margin arithmetic did not follow from its own inputs. Restated
as ~1.95 USD at the midpoint with the 0.75-3.15 spread shown; the
previous "40 to 55%" was not supported.
- Direct cost low total 1.50 to 1.45 USD; contingency THB high 40M
to 38M.
- README indexes the construction RFQ, which was missing.
The parametric model (docs/cnx_vinyl_parametric.FCStd) is now tracked. It
is the spreadsheet-driven Arch/BIM rebuild that supersedes the hard-coded
massing in factory_building_rough.FCStd, which is kept because the current
renders still come from it.
Site works. The two gates are consolidated into a single 10.0 m bi-parting
opening, with the wall plugged where the second one stood. The guard house
sits beside it clear of the entry corridor, and was raised out of the
ground - it had been modelled sunk half a storey. The fire water tank moved
to the north-west corner of the plot, taking utility-yard clearance from
5.6 m to 18.6 m; the fire pump house follows it. The site is now paved
continuously from the frontage through to phase 2: 4,387 m², split 1,608
heavy-duty and 2,779 general so the two can be priced apart.
Phase 1 envelope. The walls stopped flat at 8.2 m while the roof rose to
12.6 m, leaving the entire high-side wall and both gable triangles open -
about 366 m². Walls now follow the roof underside exactly. The rebuild also
starts the sandwich panel on top of the masonry dado, clearing a 31.9 m³
overlap that had been double-counting 425 m² of envelope. A vehicle ramp
(10.5 m at 1:10) and three stair flights are added, since with FFL at
+1.2 m the building had no means of access at grade.
Phase 2. Built from the design already documented in scale.md: 45 x 38 m,
two-bay sawtooth at 10.35/7.0 m with a 3.35 m glazed riser, bays falling
ESE. A three-storey office cube - canteen, office, office plus sleeping -
stands at the yard end of the west tooth, 1.65 m proud of the ridge. Its
walls and the hall walls are Arch Walls, and the yard glazing is Arch
Windows, so both carry IFC types and cut their own openings.
RFQ updated against the model throughout, with a new section on where
mineral-wool core is required instead of PIR, for compartmentation and for
acoustics.
Site model: two sealed dock positions on the north gable (depressed
12 m pit + 12 m ramp cut into ground and paving), water treatment
moved clear of the cooling tower, second car/staff gate on the NE
edge with access road to parking, guard house relocated between the
gates, perimeter wall rebuilt continuous on its 0.4 m inset line,
leftover door recesses filled on both envelopes, loading-apron
marking removed. Renders re-exported.
Docs: phase 1 contractor pricing request (PEB spec, PIR envelope,
dock, site works, exclusions, soil caveats).