Skip to content

Astro + Tailwind foundation for the devitocodes.com redesign#1

Open
ggorman wants to merge 19 commits into
mainfrom
init/astro-foundation
Open

Astro + Tailwind foundation for the devitocodes.com redesign#1
ggorman wants to merge 19 commits into
mainfrom
init/astro-foundation

Conversation

@ggorman
Copy link
Copy Markdown
Contributor

@ggorman ggorman commented May 23, 2026

Rebuilds devitocodes.com as a modern Astro + Tailwind marketing site for DevitoPRO. The current Jekyll site is untouched.

What's here

  • IA: hero → trust bar → HPC trilemma → solution (symbolic Python → native kernels) → benchmarks → use cases → DevitoPRO vs open-source → case studies → team → CTA.
  • Pages: /, /features, /about, /case-studies, /contact, /blog (+ posts), /Code_of_Conduct, /Data_Protection_Policy.
  • Content migrated: 15 Jekyll posts → Astro content collection (slugs preserved); feature table ported from features.md; team from about.md; real benchmark/seismic imagery reused.
  • Token-driven theming so the 3 design variants are mostly a palette swap.
  • GitHub Pages CI: deploy.yml (main → root) and preview.yml (variant/** → preview/<name>/).

Notes / follow-ups

  • Contact form posts to a Formspree endpoint carried over from the old site (email-style id); the real project hashid should be confirmed before go-live.
  • Trust-bar partners are rendered as text wordmarks (not official logos) pending logo-use confirmation.
  • One blog post (benchmarking) uses a Mermaid code block — renders as code until a Mermaid integration is added (optional).

Review

This PR is the shared foundation. The three design directions land as separate variant/* PRs, each with its own preview URL.

ggorman added 15 commits May 23, 2026 16:37
…ew CI

- Token-driven theming (src/styles/tokens.css) so design variants are a palette swap
- Shared content/data layer (src/data/*.ts) consumed by all components
- 15 Jekyll posts migrated to an Astro content collection (slugs preserved)
- DevitoPRO vs open-source feature comparison ported from features.md
- Marketing IA: hero, trust bar, trilemma, solution, benchmarks, use cases,
  comparison, case studies, team, CTA; plus features/about/case-studies/contact/
  blog and policy pages
- Base-path aware (links, assets, Markdown images) for subpath previews
- GitHub Pages CI: deploy.yml (main -> root) and preview.yml (variant/** -> preview/<name>/)
…mailto

On submit, JS opens the visitor's mail client with name/email/company/message
pre-filled (subject + body), going straight to our inbox — no third-party form
service or account. Direct email link + noscript note as fallback. Removes the
unused formspreeId from site config.

Addresses the [high] finding from the Codex adversarial review.
…t research

- Position against building/maintaining an in-house FD compiler (hero, trilemma)
- Benchmarks framed vs in-house baselines; reproducible + supported
- Add 'Embed in your stack' (decoupler) use case for ISV buyers; sharpen multi-GPU/
  GPU-aware MPI and very-large-model (compression/streaming/mixed precision)
- Final CTA speaks to operators, ISVs and hardware partners

No client names, quotes or specific benchmark numbers (sanitised per data-handling policy).
… kernels vs DSL+compiler

The previous VOC line implied clients maintain FD compilers (they don't — no one in the
sector does). Reframe to the real status quo: hand-coded RTM/FWI kernels locked to one
physics, one discretization, one programming model, rewritten for every new processor
generation. Lean on the 'painting the Golden Gate Bridge — and building several at once'
analogy. DevitoPRO's edge = the only DSL + compiler in seismic imaging that regenerates
the optimized kernel for every architecture and processor generation.

Edits: hero.subtitle, trilemma.intro, benchmarks.intro, finalCta.body. No new components,
no client names/numbers.
…c imaging built for production'

Small accent kicker under the subtitle, before the CTAs, using the existing .eyebrow
style for a stamped-credential feel. Makes the uniqueness claim explicit on first view.
Adversarial review (Claude + Codex + Gemini) drove this consolidated foundation
update before the team vote — all approved decisions + consensus polish in one
commit so variants only need one more rebase.

Aquawax Pro typography (Zetafonts EULA 1wp3-855llosp/94575, web tier, single
domain devitocodes.com, WOFF2 only, self-hosted, =< 25k pageviews/month):
- src/assets/fonts/: Regular/Medium/Demibold/Bold/Heavy (5 weights, ~353KB)
- @font-face in global.css + --font-sans token => 'Aquawax Pro'
- Drop Inter from Google Fonts <link>; keep JetBrains Mono for code/mono utilities
- public/robots.txt disallows /fonts/ and /_astro/ (anti-extraction hygiene)
- EULA archived at licenses/Aquawax-Pro-EULA-94575.pdf (not under public/)

User-approved decisions from the trio interview:
- Brand teal #55c6a3 locked as primary accent (tokens.css + recolored
  devito-logo.svg #62C2A4 -> #55c6a3 to match)
- Differentiator promoted from eyebrow style to a hero badge above the CTAs
- CTA naming aligned: 'Compose email' button -> 'Email to schedule a call'
- Hero subtitle tightened to one sentence + new supporting line below

Consensus polish (applied automatically):
- Hero section gets 'isolate' so the wavefield image is actually visible
  (was hidden by the section's opaque bg-base because the -z-10 wrapper
  was escaping the section's stacking context)
- Integrate real logo SVG in Nav + Footer (was generic CSS accent square)
- Remove 'Built with Astro / deployed on GitHub Pages' footer tagline;
  replace with company registration (no. 12437078, England & Wales)
- Fix migrated typo 'Propogators' -> 'Propagators' in IM.md
- Move public/images/sources/*.graffle out of public/ (design-sources/)
  so OmniGraffle source files don't ship on the live site
- Neutralise content.ts header comment (drop 'Slack market research'
  provenance leak)
- Benchmark charts wrapped in <a target=_blank> for full-size view +
  h-56 -> h-80; 'click for full size' caption
Per team feedback (Jack Betteridge, Mathias Louboutin): light/dark switch is a
standard 2026 dev-tool pattern (projector use case in particular).

- src/styles/tokens.css: dual-mode (:root for light, :root[data-theme="dark"] for
  dark, @media (prefers-color-scheme: dark) :root:not([data-theme="light"]) for
  system-pref fallback). Brand teal #55c6a3 unchanged in both modes.
- src/layouts/Base.astro: inline FOUT-prevention <script is:inline> in <head>;
  sets <html data-theme> from localStorage or matchMedia before paint.
- src/components/Nav.astro: sun/moon toggle button (a11y: aria-label, aria-pressed,
  focus-visible). Always-visible; rearranged into a right-cluster wrapper so flex
  layout stays clean on desktop + mobile.
- src/styles/global.css: .theme-icon-{sun,moon} display rules track [data-theme].

Variants will get their own dual-mode tokens.css in the next batch (preserving
each variant's character in its primary mode).
Fabio:
- Unbold 'Devito' wordmark in nav + footer (font-extrabold -> font-medium)
- Benchmarks: qualitative cards, no numbers in copy, vendor-balanced
  (GPU portability across NVIDIA/AMD/Intel + CPU portability + cloud
  price-performance + large-model scale). Inline 'Request benchmark
  report' CTA replaces the chart-image cards.
- Solution 'How it works': replace OSS code snippet with an inline SVG
  architecture diagram (Physics -> Devito compiler -> Optimized kernels
  per architecture, with a dashed regenerate-loop). Vendor- and
  entry-point-neutral.
- Blog dates removed from /blog index listing and homepage CaseStudies
  cards. Post-page header still shows the date for context once opened.
- Blog audit: hide 5 posts via draft:true in front-matter — v4.8.7
  (point release), image2023 (past event), cluster (superseded by
  cluster-v2), thematrix (superseded by benchmarking), launch (2020
  origin — relocated to /about as the company's origin story).
  draft field added to the blog schema; /blog index + CaseStudies
  filter !draft; [...slug] route still serves all URLs so backlinks
  to /blog/launch (and the others) keep working.

Mathias:
- /features restructured: simplified main capabilities list on top
  (FeatureHighlights component, 6 groups), full vs-OSS comparison
  table tucked into a collapsed <details> below at #compare.
- Homepage's condensed vs-OSS table replaced with the same highlights
  list (4 groups) + 'Compare with open-source Devito' link.

Holds (NOT in this batch, per Gerard's caution about unannounced items):
- DevitoHorizon — wait for launch sign-off.
- Audience segmentation (per-client entry-point preferences) — needs
  fuller IA work post-vote.
- Team page additions — awaiting names.
…o Codes' wordmark + show all 6 team members

- tokens.css: promote dark-enterprise dual-mode palette into the foundation
  (cool-white in light, deep-navy in dark). Brand teal #55c6a3 unchanged.
  Header comment updated to reflect the consolidation context.
- Nav + Footer: 'Devito Codes' is one company name — drop the
  <span class='text-muted'>Codes</span> split that made 'Codes' look like
  a separate muted afterword. Single weight, single colour, plain text.
  Logo img alt updated from '' to 'Devito Codes' since the wordmark text
  no longer redundantly carries the name.
- TeamTeaser: small team — show all 6 members on the homepage rather than
  truncating to 4. Grid widens to grid-cols-2 sm:grid-cols-3 lg:grid-cols-6
  so 6 members fit one row at desktop, 3 × 2 at tablet, 2 × 3 at mobile.
  Name + role typography compresses one notch to suit the smaller cell.
… widen grid to grid-cols-2 sm:grid-cols-3 lg:grid-cols-6

Followup to the round-2 consolidation commit — the TeamTeaser update should have
been part of that commit but the Write tool rejected the file (no prior Read),
so it landed separately.
ROOT CAUSE
Tailwind v4 auto-generates a text-{name} *colour* utility for every --color-*
key in @theme. Our @theme declared --color-base, which created a custom
.text-base { color: var(--color-base) } rule that collides with Tailwind's
built-in .text-base { font-size: 1rem } typography utility.

Both rules apply (different properties), but since the colour rule sits inside
the auto-generated utilities layer it overrides any earlier text-{colour} on
the same element. Any element with md:text-base + text-{colour} silently
flipped its text to var(--color-base) — the *page background* — producing
invisible same-on-same text.

Verified bug:
  · HeroEnterprise spec strip <dd>:  contrast 1.09 (dark) / 1.06 (light)
  · Hero.astro supporting line:       text-base text-muted/80
  · LogoBar partner wordmarks at md+: md:text-base text-ink/60

FIX
- @theme: --color-base → --color-page (so the colliding utility is no longer
  generated). The internal token --c-base stays — only the Tailwind-facing
  key changed.
- bg-base → bg-page across all components/pages (Nav, Hero, LogoBar, CTA,
  Section, contact form). text-base in Hero + LogoBar now correctly resolves
  to font-size only, and the colour comes from the explicit text-{colour}
  utility.
- Added a long block comment in global.css documenting the footgun so future
  edits don't reintroduce it.
Team review (Mathias + Ed) ranked variant/enterprise #1 — 'Better to the
point, no clutter' / 'still has some wonky phrasing but most clear'.
Promoted that variant's homepage + HeroEnterprise to the foundation; the
other three variant branches are being retired in a follow-up commit.

Content polish in the same commit:

· Vendor lists alphabetised everywhere (Gerard) — removes any signal of
  bias toward one partner:
  - Architectures: AMD · Arm · Intel · NVIDIA
  - Backends:      CUDA · HIP · MPI · OpenMP · SYCL
  - Deploy:        AWS · Azure · GCP · On-prem
  - trustBar:      AMD · Arm · AWS · Azure · Google Cloud · Intel · NVIDIA

· Workloads slot reframed (Gerard) — 'RTM · FWI · Elastic · VTI · TTI'
  was too narrow. New value: 'RTM · FWI · custom propagators and workflows'
  — keeps the familiar acronym anchors, opens the door explicitly to
  build-your-own (implicitly covers MP-FWI, EFWI, LS-RTM etc without
  enumeration). 'and workflows' gestures at the Decoupler / embed-in-
  your-stack story.

· Custom-solver story now FIRST in FeatureHighlights (Ed: 'never mentions
  that you can actually write your own custom solvers!'). New top group
  'Symbolic DSL · custom physics' with three items covering symbolic
  Python authoring, customisable stencils/BCs/sources/adjoints, and the
  Decoupler integration path.

· Section order on the homepage (Ed: 'fairly random'): now
  Hero → LogoBar → Capabilities → UseCases → Benchmarks → Specification
  → CaseStudies → Team → CTA. Reads as what → where → proof → spec
  deep-dive → social. Anchors #capabilities and #compare preserved.

Codex copy-review on content.ts / features.ts / 3 components is queued
as a follow-up.
ggorman added a commit that referenced this pull request May 27, 2026
…e,two-tier} subdirs

After Round 3 consolidation, variant/enterprise (the team's #1 choice) was
promoted into the foundation; variants dev-tool, narrative and two-tier
were retired. This commit removes the four corresponding deployed preview
directories from gh-pages so the deployed tree matches the active branch
set — only the consolidated foundation preview remains at
/preview/astro-foundation/.
ggorman added 4 commits May 27, 2026 11:32
KEPT (per Gerard's call on the 3 judgement items surfaced):
- hero.differentiator: 'The only DSL + compiler in seismic imaging built for production'
  stays — defensible from the Slack market research, distinctive, owned by sales.

APPLIED (mechanical / error / consistency):
- trilemma.title: 'Stop trading performance for portability for productivity.'
  → 'Stop choosing between performance, portability and productivity.'
  ('for...for...' cadence was awkward)

- trilemma.intro: dropped the Golden Gate metaphor for a more direct rewording
  (Gerard's preferred wording — keeps the concrete RTM/FWI 'tied to a specific
  physics, discretisation, programming model and processor' point but drops
  the bridge analogy that was reading as decorative).

- benchmarks.intro first sentence: 'Iso-acoustic and acoustic-TTI propagators,
  autotuned per target — including against hand-coded in-house kernels.'
  → 'Isotropic acoustic and acoustic TTI propagators are autotuned per target
  and benchmarked against comparable hand-coded kernels where available.'
  ('Iso-acoustic' was non-standard; 'including against' was awkward.)

- benchmarks.cards 'Cloud price-performance' body: dropped the unclear
  'DevitoPRO keeps both portable' — workload-portability across instance
  families now stated directly.

- benchmarks.cards 'Large-model scale' body: fixed ungrammatical
  'disk-host-GPU transfer' → 'disk-to-host-to-GPU transfers'; 'biggest models'
  → 'large production models' (less marketing inflation).

- useCases 'Embed in your stack': capitalised Decoupler API consistently
  ('decoupler' → 'Decoupler API'); softened the casual 'drop ... into an
  existing inversion engine' to 'integrate ... into existing inversion
  engines'.

- HeroEnterprise spec strip 'Backends' label → 'Programming models' + added
  OpenACC (was missing relative to the trilemma copy that already lists it).
  Value remains alphabetical: CUDA · HIP · MPI · OpenACC · OpenMP · SYCL.
  ('Backends' was technically inaccurate for MPI, which is a communication
  runtime not a backend.)

- featureIntro: cut 'an advanced extension of' and the clunky 'features
  demanding production workflows require'; tighter wording.

- featureCategories: fixed 'Source/receivers' (singular/plural mismatch)
  → 'Sources and receivers'.

- featureCategories FLOP-reduction row (the most consequential bug Codex
  caught): the table read oss='Comprehensive', pro='Advanced' — making OSS
  Devito look STRONGER than DevitoPRO on this row. That's almost certainly
  a porting typo from the legacy Jekyll source. Per Gerard's call: change to
  oss='Standard', pro='Comprehensive' (Pro should be the stronger qualifier;
  matches the FeatureHighlights line that already says 'Comprehensive FLOP
  reduction').
…ata streaming (disk → host → GPU)'

Followup to the Codex copy review. The benchmarks card body and useCases
copy were fixed in the previous commit, but the row label in the vs-OSS
table (rendered inline on the homepage Spec section + on /features#compare)
still read the ungrammatical 'Intelligent data-streaming disk-host-GPU'.
The arrow form matches the Codex rewrite of the homepage card body.
(Blog post src/content/blog/elastic.md keeps its original wording — legacy
technical content is out of scope for this round.)
Alphabetical between Intel and NVIDIA. NextSilicon is a target architecture
DevitoPRO supports; the spec strip should reflect that.

(Note: OpenACC was already added to the Programming models slot in the
Codex copy review pass yesterday — confirmed live before this edit.)
…t-unrendered copy

Adds NextSilicon to all the surfaces where it should appear alongside the
spec strip:

- src/data/content.ts trustBar.partners: inserted alphabetically between
  Intel and NVIDIA. Visible on the homepage LogoBar.

- src/data/features.ts featureCategories: the 'Support for all major CPUs
  and GPUs' category becomes 'Support for all major CPUs, GPUs and
  accelerators' (the existing scope was already wrong — Intel KNC/KNL are
  accelerators, not CPUs/GPUs). NextSilicon added as its own row with
  oss=false / pro=true (assumed PRO-only; happy to flip if it's also in
  the OSS path). The old Intel KNC/KNL row is relabelled '(legacy)' so
  evaluators see at a glance it's not the recommended path.

- src/data/content.ts hero.supporting + trilemma.pillars[1].body: the
  vendor list in each was updated and alphabetised
  ('AMD, Arm, Intel, NextSilicon and NVIDIA'). Neither string is rendered
  by the current consolidated HeroEnterprise homepage, but both stay in
  the data layer for /about, Trilemma re-use, or any future hero variant.

(GPU portability benchmark card body still names 'NVIDIA, AMD and Intel
GPUs' deliberately — NextSilicon is not a GPU and was left out of that
specific sentence.)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant