Install
openclaw skills install @oasiseng/ephemeral-engBuild single-file HTML engineering tools where the calculation interface IS the client deliverable (input panel on the left, print-ready paginated report on the right). Use this skill whenever the user asks for an engineering calculator, calc tool, letter generator, calculation report, load check, beam/column/footing/header/fastener/anchor/wind/guardrail/canopy check, evaluation letter, or any "input-to-deliverable" tool — even if they don't say "ephemeral-eng" or "HTML". Also use it when revising or extending any existing single-file tool that has a form-panel / report-page structure.
openclaw skills install @oasiseng/ephemeral-engYou are building a single self-contained HTML file that is simultaneously an engineering calculator and the final client deliverable. No build step, no dependencies, no server. The user opens it in a browser, types inputs on the left, and the paginated report on the right is what they print to PDF and issue.
Start from the template. Read template/ephemeral-template.html in this repo (or ask the user for their latest tool as a base). Never invent a new layout — consistency across tools is the product.
<span class="hint">enter from Table X</span>) instead of hard-coding a guess. A blank the engineer must fill is safe; a wrong constant is not.The template marks five slots. Fill only these; leave framework chrome alone.
| Slot | What goes there | Rules |
|---|---|---|
| 1. Brand tokens | :root CSS variables + FIRM JS object | Only place colors/fonts/firm identity live. Re-skinning a tool = editing this slot only. |
| 2. Input schema | <fieldset> groups in .form-panel | Every input id="f_camelCase". Group logically (Branding / Project / Geometry & Loads / Section & Material / Criteria / Exhibits / Output options). Units in <span class="hint">. Sensible non-trivial defaults that PASS. Include the template's Branding fieldset (firm name/lines, logo drag-drop, live brand-color picker) unless the user says their tokens are already set. |
| 3. Calc engine | Pure JS functions | No DOM access. Units in a comment on every assignment. Code reference in a comment on every check (e.g. // [NDS 2018 §3.4]). One flat result object. Plus a validate(inp) returning warning strings for zero/negative/absurd inputs. |
| 4. Live diagram | drawDiagram(inp, r) → SVG string | To-scale-ish sketch of the physical thing, dimensioned from live inputs, with a PASS/FAIL readout. Screen-only (.no-print). |
| 5. Report pages | buildReport(d, r) → .report-page divs | See "Report standards" below. |
.report-page at 8.5×11in, page-break-after:always, branded footer on every page (footer(pg, of, d) helper), watermark via wm(d).M = wL²/8 = 100 × 12²/8 = 1,800 lb·ft — never just the answer..calc-step blocks with .ref code citations → summary .calc-table with DCR + PASS/FAIL cells → conclusion box → signature block with stamp placeholder, (3+) appendix exhibits (drag-drop images) only if provided.num(x, dp); all user text through esc(s). Never interpolate raw user input into HTML.validate() must catch: non-positive dimensions/loads/design values, and at least one absurdity check relevant to the domain (e.g. span-to-depth > 50).Every tool keeps the template's JSON module (serializeInputs / exportJSON / importJSON + the "Save inputs / Load inputs" buttons). It exports every f_* input (and dropped images) to a portable file:
{
"_meta": { "framework": "ephemeral-eng", "tool": "<FIRM.toolName>", "toolVersion": "V1.2",
"saved": "ISO-8601", "source": "user" },
"inputs": { "f_L": "12", "f_w": "100", "f_draft": true },
"images": { "logoData": null, "imgData": null }
}
Why it matters: the calculator can be disposable because the project state is portable — archived with the job, re-loaded next revision, or moved into the next version of the tool.
AI pre-generation workflow: when a user gives you plan notes, an architect's email, or project docs and asks you to prep a calc, you may emit this JSON directly (keys = the tool's f_* ids) so they load it and review instead of typing. Rules:
"_meta.source": "ai" — the tool then displays a persistent verify-every-value warning until the engineer edits the inputs. Never set "user" for machine-generated files.File name: {ProjectNo_}ToolName_vX_Y.html (e.g. V26150_Footing_Check_v1_0.html). Version appears in <title>, the panel version-badge, FIRM.toolVersion, and the report footer. Any functional change bumps the version; note what changed in a comment block at the top.
For evaluation/compliance letters (vs calc reports): first page is prose letterhead (addressee block, purpose & scope, numbered sections, conditions of acceptance, conclusion), calc detail moves to an "Exhibit — Calculations" appendix of .calc-step blocks, and exhibits get cover pages. Same slots, same rules.