diff --git a/.github/workflows/deploy-jmb-second-half-portal.yml b/.github/workflows/deploy-jmb-second-half-portal.yml new file mode 100644 index 0000000..d36731c --- /dev/null +++ b/.github/workflows/deploy-jmb-second-half-portal.yml @@ -0,0 +1,23 @@ +name: Deploy JMB Second-Half Portal to Cloudflare + +on: + push: + branches: [main, master] + paths: + - 'workers/jmb-second-half-portal/**' + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + name: Deploy jmb-second-half-portal + steps: + - uses: actions/checkout@v4 + + - name: Deploy to Cloudflare Workers + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: bafa242dd95d3fdce72540d20accd0a2 + workingDirectory: workers/jmb-second-half-portal + command: deploy diff --git a/workers/jmb-second-half-portal/portal.html b/workers/jmb-second-half-portal/portal.html new file mode 100644 index 0000000..70113e7 --- /dev/null +++ b/workers/jmb-second-half-portal/portal.html @@ -0,0 +1,235 @@ + + + + + + JMB — 2nd Test Schedule Portal + + + + + + + +
+
+
+

JMB Clean Truck Check: 2nd Test Portal

+

Schedule: July – December 2026 · 25 trucks

+
+
+ JMB Construction + Fleet Portal +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MonthClientTruck #VINTestLast ResultLikely Mfr*
JULY 2026
JMB951FVHCYCY8FHGE7317OBDPassFreightliner
JMB1162NPLLZ0X15M874818OVIPassPeterbilt (CA)
JMB1171NKDX4TX0EJ966975OBDPassUnconfirmed†
JMB99A1FVACWDT2CDBN8881OVIPassFreightliner
AUGUST 2026
JMB1091FVACWDT3CHBM2780OVIPassFreightliner
JMB1101FVACWDT5CHBM2781OVIPassFreightliner
JMB1111FVACWDT7CHBM2782OVIPassFreightliner
JMB39A3ALACWDT1EDFK0314OBDFailFreightliner (MX)
JMB47A3ALACWDT1EDFK0300OBDPassFreightliner (MX)
SEPTEMBER 2026
JMB33JALE5W16XC7900346OVIPassIsuzu
JMB1131FVACWDU5HHHX6804OBDPassFreightliner
OCTOBER 2026
JMB40A1FVACWBS5CDBK0023OVIPassFreightliner
JMB49A1FDWF7DC3GDA02393OBDPassFord
JMB108A3FRWF7FA5FV679560OBDPassFord (MX)
NOVEMBER 2026
JMB961XKDD49X0DJ958752OVIPassKenworth
JMB1001FVACWDT5CHBP7790OVIPassFreightliner
JMB1121FVACWDT2CHBM2785OVIPassFreightliner
JMB1151XPTP4EX5DD181499OVIPassPeterbilt
JMB1191XPCD40X1PD859833OBDPassPeterbilt
JMB1211NKZX4TX9MJ972021OBDPassUnconfirmed†
JMB107A1FDNF7DC0HDB09172OBDPassFord
DECEMBER 2026
JMB1201FVHCYCY4GHGY9831OBDPassFreightliner
JMB23BJALE5W168E7300847OBDPassIsuzu
JMB44A3ALACWDT3DDFJ0690OVIPassFreightliner (MX)
JMB98A1FVACXDT8CDBD8975OVIPassFreightliner
+
+ + +
+ + diff --git a/workers/jmb-second-half-portal/worker.js b/workers/jmb-second-half-portal/worker.js new file mode 100644 index 0000000..5675e42 --- /dev/null +++ b/workers/jmb-second-half-portal/worker.js @@ -0,0 +1,37 @@ +// worker.js — JMB 2nd Test Schedule Portal +// +// Routes: +// GET / -> schedule portal HTML +// GET /api/health -> JSON health check +// * -> 404 +// +// portal.html is bundled at build time via wrangler [[rules]] Text import. + +import PORTAL_HTML from "./portal.html"; + +export default { + async fetch(request) { + const url = new URL(request.url); + + if (url.pathname === "/api/health") { + return Response.json({ + status: "ok", + service: "jmb-second-half-portal", + client: "JMB", + trucks: 25, + schedule: "2026-07..2026-12", + }); + } + + if (url.pathname === "/" || url.pathname === "/index.html") { + return new Response(PORTAL_HTML, { + headers: { + "content-type": "text/html; charset=utf-8", + "cache-control": "public, max-age=300", + }, + }); + } + + return new Response("Not found", { status: 404 }); + }, +}; diff --git a/workers/jmb-second-half-portal/wrangler.toml b/workers/jmb-second-half-portal/wrangler.toml new file mode 100644 index 0000000..ecbf85c --- /dev/null +++ b/workers/jmb-second-half-portal/wrangler.toml @@ -0,0 +1,17 @@ +name = "jmb-second-half-portal" +main = "worker.js" +compatibility_date = "2026-03-01" +account_id = "bafa242dd95d3fdce72540d20accd0a2" + +# Bundle portal.html as a string import. +[[rules]] +type = "Text" +globs = ["**/*.html"] +fallthrough = true + +# workers.dev preview URL after first deploy: +# https://jmb-second-half-portal.silverbackai.workers.dev/ +# Optional custom domain (uncomment + attach DNS when ready): +# routes = [ +# { pattern = "jmb-portal.silverbackai.agency", custom_domain = true } +# ]