23 Commits

Author SHA1 Message Date
7ed6a51d9f Rewrite page copy across the site, fix nav/blog polish, resize SDK explorer
Some checks are pending
CI / build (push) Waiting to run
Restores and rewrites content on Home, Mobile SDK, DNS Protect, Halo CPE,
For Operators, Financial Services, Why BlackDice, Investors and Contact to
match the approved source copy, removing stray dashes site-wide in favour
of plain punctuation. Removes an unreachable duplicate Contact page block
that left a stray unclosed <div> in the markup. Shrinks and repads the
Guardian Mobile SDK explorer widget so it fits without excess scrolling.
Also includes in-progress nav, blog seed and demo scenario tweaks.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 05:31:37 +05:00
25423c15d1 Trim home page sections, fill in APP fraud stat, cap content width
Some checks failed
CI / build (push) Has been cancelled
Removes the Retina Dashboard and Stats sections from the home page,
repositions the newsroom section after the CTA cards, and fills in
the blank "£bn" APP-fraud stat with "£3.3bn". Caps .bd-hero-in and
.bd-si at 1120px max-width so content stops stretching edge to edge
on wide viewports.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-07 22:46:27 +05:00
065847e67a Remove voiceover from the Mobile SDK explorer
Some checks failed
CI / build (push) Has been cancelled
Drops speechSynthesis narration, the per-module mute toggle, and the
spoken tab-click announcement. Each module's timing reverts to its
original snappy pace (e.g. Location zones: 32s -> 11s), since the
longer durations were only there to give the voice room to finish.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-03 21:15:32 +05:00
c00ce6a58d Replace Mobile SDK hero demo with the Guardian explorer widget
Some checks failed
CI / build (push) Has been cancelled
Ports the 9-tab Guardian Mobile SDK phone-demo mockup (mobile-sdk.html)
into a React component and swaps it into #mobile-sdk-demo-mount in
place of ThreatDemosSlider, keeping the site's real header/nav/footer
around it.

- Adds voiceover per module, spoken via speechSynthesis and paced to
  the actual speech (each step waits for its utterance to finish
  before advancing, instead of a fixed guess at timing), plus a
  per-module mute toggle and a spoken announcement on tab click.
- Never autoplays — playback only starts on an explicit tap, matching
  the rest of the embedded demos on the site.
- Enhances the Location safety zones module with a full create-a-
  boundary -> leave-the-zone -> notified-of-the-alert flow (banner,
  breach-colored geofence, updated activity feed).
- Layout polish: floating/glow phone, centred max-width content,
  fading tab-strip edges; fixes a CSS grid min-width bug that blew the
  hero out to ~1450px on narrow viewports.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-02 23:00:44 +05:00
5b966688e9 Make favicon background transparent, whiten line-art
Some checks failed
CI / build (push) Has been cancelled
favicon.ico/-32/-192 had an opaque white square behind the cube mark.
Removed the white matte and recoloured the navy line-art to white
(teal accent dots kept) so it reads cleanly on dark browser tabs.
apple-touch-icon.png is left as-is since iOS fills transparent PNGs
with black.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-02 20:28:00 +05:00
041a53417a Shrink Halo CPE product screenshots ~25%
Some checks failed
CI / build (push) Has been cancelled
The Retina and Angel dashboard images ran full-bleed edge to edge.
Cap them at 75% width and centre, scoped to the Halo CPE page only
(home page keeps its full-width dash-frame). Reverts to 100% under
900px so mobile isn't cramped.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-02 19:59:21 +05:00
7024269bf6 Add family safe-zone location demo, wire into Mobile SDK demo slider
Some checks failed
CI / build (push) Has been cancelled
Cinematic 30s player showing safe-zone creation and leave-zone alerts,
matching the existing threat-demo pattern. Added as a 6th rotating
slide in ThreatDemosSlider (live on /mobile-sdk and /threat-demos),
plus a standalone /location-demo route for recording.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-02 19:06:53 +05:00
84605dcf1a Fix white border flash on first paint
Route CSS (src/site/styles.css, admin.css) is code-split and only loads once
its lazy route's chunk arrives, so the default browser body margin showed as
a white ring around the dark Suspense fallback until then. Reset html/body
margin directly in index.html so it applies before any JS runs.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-02 18:03:39 +05:00
490b5fe55f Update contact page company name to Cyber Intelligence Group Ltd
Some checks failed
CI / build (push) Has been cancelled
The registered-office block and the "Company" details line on the contact
page still read "BlackDice Cyber Ltd" — updated both, plus their cached CMS
field previews.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-02 16:53:04 +05:00
9bc2a49f7c Remove the Angel text from the logo, keep the cube mark and BlackDice wordmark
The svg combined a raster BlackDice lockup (icon + wordmark) with a separate
vector "Angel" glyph group appended to the right. Dropped that group and
cropped the viewBox from 417x71 to 280x71 to match. All 12 usages across the
site set height with width:auto, so the narrower logo scales correctly with
no markup/CSS changes needed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-02 16:52:48 +05:00
a10305f5a5 Update footer copyright to Cyber Intelligence Group Ltd
Some checks failed
CI / build (push) Has been cancelled
All 11 page footers carried "© 2026 BLACKDICE CYBER LTD." — updated the
copyright line and its cached CMS field preview to match.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-01 21:15:43 +05:00
11a709744e Enforce CSP without unsafe-inline, and close out the remaining retest items
Some checks failed
CI / build (push) Has been cancelled
F-03: the legacy markup's 77 onclick="" attributes were the reason script-src
still needed 'unsafe-inline', which let injected inline script/handlers run
right past the policy. Migrated them to data-page/data-action markers handled
by a single delegated click listener in siteController.js, dropped
'unsafe-inline' from script-src, and switched both server/index.mjs and
vercel.json from Content-Security-Policy-Report-Only to enforcing. style-src
keeps 'unsafe-inline' — that governs inline style="" attributes used
throughout, a separate CSS-injection concern out of scope here.

Verified against the built site with a real headless-Chromium run: nav,
company dropdown, mobile menu, the demo modal (open/close/overlay-click/
inner-click), the modal's contact-page link, and the scroll-hint all still
work, with zero console errors.

F-10: confirmed via npm audit fix --dry-run that no non-breaking update
remains (vite and react-router-dom both need a major bump, left deferred).
Added npm audit to CI — full report for visibility, gated on critical only
so it doesn't block on the already-tracked moderate/high advisories.

F-11: uploaded PDFs now serve with Content-Disposition: attachment instead
of rendering inline from the site's own origin.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-20 21:02:53 +05:00
2baac6eab4 Sanitise inline content fields on snapshot restore and content import
Some checks failed
CI / build (push) Has been cancelled
Post bodies were already re-sanitised on the way back in from a version
snapshot or an imported content file, but content.content{} (the inline
text-field map) wasn't. applyContent() writes that map straight into the
DOM via innerHTML as soon as it loads into the editor, before the admin
ever publishes, so a crafted content file or tampered snapshot could carry
a stored-XSS payload there and execute it in the admin's session on import
alone.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 20:15:33 +05:00
764f5c8761 Remove the demos-p2-mount DemoSection portal from the Mobile SDK page
Some checks failed
CI / build (push) Has been cancelled
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 18:12:04 +05:00
28d0addfc0 Address High/Medium findings from the web app security assessment
Some checks failed
CI / build (push) Has been cancelled
Fixes the two High-severity findings from Isaac Hague's 19/08/2026 review
(F-01, F-02) plus F-03 through F-09:

- F-01: content writes are now sanitised server-side (sanitize-html) as the
  real security boundary — the browser-side sanitiser is UX, not enforcement,
  and a direct API write bypassed it entirely. Also closes the javascript:
  href gap in sanitiseInline().
- F-02: refusing the factory admin password no longer depends on NODE_ENV;
  it's the unconditional default now, with an explicit ALLOW_DEV_PASSWORD=1
  opt-in for local dev.
- F-03: adds CSP (report-only — the legacy inline onclick="" handlers would
  break under enforcement) and HSTS, in both server/index.mjs and vercel.json.
- F-04/F-05: rate-limits /api/leads and rotates leads.jsonl past 5MB; CSV
  export neutralises leading =+-@ so exports can't carry live formulas.
- F-06: sessions drop from 12h to 4h and are tied to a per-boot random epoch,
  so a restart now actually revokes outstanding tokens.
- F-07/F-08/F-09: generic messages on 5xx, fixed-length password comparison
  (no more length disclosure via the short-circuit), periodic throttle-map
  cleanup.

F-10 (dependency advisories): applied the two non-breaking patches (nanoid,
postcss); the vite/react-router-dom major bumps are left for a separate pass,
per the report's own recommendation. F-11 (PDF Content-Disposition) and a
CAPTCHA/honeypot on the enquiry form are deliberately left open — both are
product/UX calls, not pure security fixes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 18:08:24 +05:00
5570eb0a9d Restore article hero images wiped by the GSMA seed regeneration
Some checks failed
CI / build (push) Has been cancelled
Publishing the GSMA release re-ran scripts/seed-content.mjs, which
fully rebuilds seedContent.json from the studio draft. The hero,
heroAlt, and photo-credit fields added for 12 placeholder images in
f02461b lived only in the generated file, not its source, so the
regeneration silently dropped them again even though the image files
were still on disk.

Restores the 12 posts' hero data and, this time, persists it in
content-seed/additional-posts.json, which seed-content.mjs treats as
an authoritative override that survives re-import.
2026-08-14 16:06:58 +05:00
54c02d7c74 Use the BlackDice cube mark as the favicon
Some checks failed
CI / build (push) Has been cancelled
Replaces the wide wordmark SVG, which was unreadable at tab size, with
the cube mark: a multi-resolution favicon.ico (16-256px) plus PNGs for
modern browsers and mobile home screens.

Also fixes the share image while touching the same tags — og:image and
twitter:image pointed at logo.svg, and no major platform renders SVG
share images, so link previews were coming up blank. Adds a 1200x630
og-default.png and points the JSON-LD organisation logo at a raster URL
too. Articles still override the default with their own hero.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 15:35:58 +05:00
e3c4c8d1f7 Publish the GSMA Open Gateway press release
Some checks failed
CI / build (push) Has been cancelled
Replaces the placeholder draft with the approved final copy from
"2026_0308_BlackDice GSMA PR_V1 GSMA final.docx": real quotes from Paul
Hague and Henry Calvert, the 10 August release date, and the press
contacts. Status flipped to published, so it appears in the newsroom,
the home page strip and sitemap.xml.

Hero is the GSMA Open Gateway logo composed onto a 16:9 white canvas so
it reads correctly both full-width on the article and cropped in card
thumbnails.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 15:17:57 +05:00
5c314306a5 Lower threat-demo voiceover volume for a softer feel
Some checks failed
CI / build (push) Has been cancelled
2026-08-13 14:28:07 +05:00
51c05ccc3a Don't autoplay the embedded threat-demo voiceover on page load
Some checks failed
CI / build (push) Has been cancelled
ThreatDemosSlider always passed autoPlay to ThreatCinematic, so the
Mobile SDK page's embedded demo — including its speech-synthesis
narration — started 450ms after the page loaded rather than waiting
for a visitor to tap the phone. Autoplay is now standalone-only
(/threat-demos); the embedded instance stays idle until tapped.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-13 14:03:41 +05:00
f02461b456 Harden CMS security, fix SEO/a11y gaps, and fill in missing article images
Some checks failed
CI / build (push) Has been cancelled
Server: refuse to start in production with the default admin password,
drop SVG from the upload allow-list (stored-XSS risk), add baseline
security headers, make the login rate limiter proxy-aware via TRUST_PROXY,
and auto-load .env.local/.env in dev.

Admin: sanitise post bodies on content import/snapshot restore (previously
bypassed sanitiseBody), confirm before discarding a draft, drop back to the
login screen on a mid-session 401 instead of a stuck error, add hero-image
alt text and a title/excerpt search to the articles panel.

Site: replace the soft-404-to-homepage fallback with a real noindex 404
page, add a focus trap/Escape handling/aria-modal to the enquiry modal,
aria-expanded on the mobile nav toggle, ItemList/breadcrumb structured data
for the newsroom and articles, and wire sitemap generation into the build
so it can't go stale. Extract the duplicated NewsGrid/ArticlePage card
markup into a shared PostCard component.

Content: 13 of 18 seed articles shipped with no hero image (one pointed at
a dead WordPress URL); the live blackdice.ai site turned out to still be
the old blackdice-studio.html export, so recovering the originals wasn't
feasible. Filled the gap with freely-licensed Unsplash placeholders,
credited in the author field, until real photography is ready.

Also adds a Gitea Actions CI workflow (typecheck + build).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-13 13:54:38 +05:00
410463e0ed Fix admin studio article preview always showing "moved" error
ArticlePage and NewsGrid called useContent() directly, bypassing the
draft content SiteApp resolves for admin previews. Since /admin is
rendered outside ContentProvider, this always returned an empty post
list, so every article in the studio looked unpublished.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-13 12:18:13 +05:00
63a36e0dca Initial commit: BlackDice site rebuild with integrated CMS
Rebuilds content management around a single admin route (/admin —
"BlackDice Studio"), replacing blackdice-studio.html. Publishing writes
one JSON content document instead of regenerating HTML files, so it can
no longer overwrite hand-made site changes the way the old tool did.

- /admin: click-to-edit copy/images, article CRUD with a Word-safe rich
  text editor, demo clip management, per-page SEO, enquiry log, publish
  history with rollback
- Real per-page URLs for all pages and articles, each with its own
  meta/canonical/OG/JSON-LD
- Newsroom + article pages driven by the CMS post library, seeded from
  the old studio's export (17 articles) plus a drafted GSMA Open Gateway
  press release awaiting approval
- Demo sections on Mobile SDK and Halo CPE, interactive by default and
  upgradable to an uploaded clip per slot
- Dependency-free Node API server (auth, publish, uploads, snapshots,
  leads, live sitemap)
- Deployment configs for Node/nginx/IIS, Vercel and Netlify

See docs/ARCHITECTURE.md, docs/PROJECT-STRUCTURE.md, docs/CMS-GUIDE.md
and docs/DEPLOYMENT.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-12 23:52:44 +05:00