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.
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.
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.
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.
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).
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.
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.