Skip to content

Redraw the homepage value-prop videos as D3 diagrams - #195

Merged
marcduiker merged 10 commits into
masterfrom
value-prop-adopt-diagram
Oct 26, 2026
Merged

marcduiker merged 10 commits into
masterfrom
value-prop-adopt-diagram

Conversation

@marcduiker

@marcduiker marcduiker commented Oct 26, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

All four homepage value-prop videos are now 2D D3 diagrams, following the hero diagram (#194). They use the hero's wireframe style and the videos' colors, except for app hexagons. Those take a fixed set in order: light blue, dark blue, teal, orange. There is no yellow, which is too light on white. The adopt diagram has five apps, so it colors them by role: the existing system teal, and the two Dapr apps light and dark blue.

Each one follows its video's layout, order and timing, measured frame by frame. Motion is eased and runs at the display's frame rate instead of 24 fps. Each loop ends with a fade instead of the video's hard cut.

Section Scene What it shows
Durable execution for your business processes automate A workflow builds up step by step:
• started by a pub/sub message
• Activity 1 calls the Secrets API
• waits for an external event
• Activity 2 invokes an app
• Activity 3 writes key/value state
• completion publishes a message
Secure and resilient by default secure Three calls fail (red, with a cross), a resiliency policy retries them (green) and they go through. Colors blend instead of switching.
Integrate with the infrastructure of your choice integrate The same app on Microsoft Azure, AWS, Google Cloud and on-premises, sliding from one platform to the next
Incrementally adopt adopt Three existing apps and Kafka, then a Dapr app with a state store, then a Dapr app sending to RabbitMQ

What changes

  • Diagram script (assets/js/diagrams.js, formerly value-props.js): a small 2D engine and one scene per diagram.
    • The engine draws hexagons and Dapr badges, activity boxes, workflow nodes, envelopes, a message broker, a lock box, a person, and secure-lock, retry and failure marks.
    • Arrows grow, and can change color and drop their head.
  • Data (data/homepage.yml): each feature item has diagram: <scene> and a diagramdesc text description, instead of video. The diagrams are 600×480 like the videos, and the same size on phones.
  • Still diagrams: a feature item with diagramstatic: true shows its scene as a still. It is drawn once at its complete frame, with no animation and no pause button. A scene without a loop length is always drawn as a still. All four current diagrams are animated.
  • Vendor marks (assets/images/icons/):
    • Official icon sets: the Azure, AWS and Google Cloud architecture icon sets, as published by each vendor.
    • Simple Icons (CC0): Kafka, RabbitMQ, Redis and HashiCorp Vault.
    • All files are kept unmodified; sources and terms are listed in its README.md.
    • The template inlines every file there as a <symbol>, prefixing ids and classes so they cannot clash on the page. The Google Cloud files carry <style> blocks with generic class names.
  • Motion and accessibility: each diagram has the same setup as the hero:
    • a pause/play button
    • a still frame under prefers-reduced-motion
    • pauses while offscreen
    • a title and description for screen readers
    • a static fallback without JavaScript, in assets/images/diagrams/. It sits in a <noscript>, so visitors running the scripts never download it (the hero's fallback too)
  • Fallback exporter: npm run export:diagram-fallbacks in tests/ regenerates the hero and all four fallbacks. It drops elements the still frame hides.
  • Hero diagram colors: the hero's three apps follow the same color order: Workflow app light blue, Agent dark blue, App teal. Its fallback is regenerated.
  • Shared D3: the script tags move from the hero partial to the homepage layout. The hero script and tests scope to the hero's own toggle.
  • Deleted: all value-prop MP4s and GIFs, about 8 MB in total (1.4 MB for video 4, 6.7 MB for the other three). Nothing in the repo or on GitHub references them.

APIs overview as a still diagram

"The APIs behind it" showed dapr-apis-overview.png. It is now a still D3 diagram on a 1200×624 canvas that fills the section's width, like the image did.

  • APIs: it adds Binary Store, Search and Vector. The six alpha APIs are grouped at the end of the second row and tagged "alpha", matching the API cards.
  • Languages: C++ is removed.
  • Logos: the languages, runtimes and cloud providers use their official logos from Wikimedia. Every source and license is in assets/images/icons/README.md.
  • Java: its logo is not freely licensed; Wikipedia hosts it as fair use. It is used at the maintainers' request.
  • Generic icons: they are Fluent UI System Icons (MIT), the set the API cards already use.
  • Old image: the PNG is deleted. The Markdown rendering points at the diagram's fallback.

To support diagrams outside the value props:

  • Engine: the script is now diagrams.js.
  • Partials: one shared partial renders a diagram, and another adds the symbols and script once per page.
  • Fallbacks: they moved to assets/images/diagrams/.

Unused images

Every tracked image and video outside styleguides/ and themes/ was checked three ways:

  • Build output: the site was built, and every image path its output references was collected.
  • Repo search: each file name was searched for.
  • Outside links: GitHub code search looked for other repos linking to its dapr.io/images/ URL.

Deleted, 17 files (about 800 KB):

  • Adopter logos referenced only by commented-out entries in data/homepage.yml: amd, apple, ea, ford, jpmorgan, loreal, paloalto, pfizer.
  • Case study images referenced only by commented-out entries: atbay, bosch.
  • Unreferenced files: avatar.png, building-blocks.webp, cta.svg, hero.png, on-prem.png, pubsub.webp, screenshot.svg.

Kept: building-blocks.png and service-invocation.png, because other repos embed them from dapr.io.

The rebuilt site has no image references to missing files. Re-enabling a commented-out entry needs its image restored from git history.

Skill for future diagrams

skills/d3-2d-diagrams/ sits in a generic skills/ folder at the repo root, not under .claude/. It records the rules and workflow behind these diagrams, so new ones match:

  • SKILL.md:
    • Animated or still: videos are always animated; still images and text descriptions follow the user's instructions, and the skill says to ask when there are none.
    • Design rules: 2D wireframe style at 600×480, the palette and the app hexagon color order, no yellow, labels, arrows, motion and smooth loops.
    • Brand marks: where to source them and on what terms.
    • Accessibility: what each diagram must keep working.
    • The workflow: a first step for each starting point (a video or GIF, a still image, or a text description), then build, compare, measure and test.
    • The traps already hit.
  • reference/engine.md: the engine's API, with a minimal scene.
  • scripts/:
    • video-frames.sh: frames and color samples from a source video.
    • scene-frames.mjs: a scene's frames at exact moments, next to the source.
    • smoothness.mjs: checks frame rate, moves and opacity steps against limits.

AGENTS.md points to the skills folder and to this skill.

Tests

  • New tests/specs/diagrams.spec.js. For each scene's still frame, it checks:

    • the title and description
    • every expected label is drawn
    • all symbols resolve
    • nothing visible falls outside the frame
    • the fallback image loads as SVG
    • no script errors

    It also fails if a scene is added to the page without being listed.

  • Existing specs: they cover every diagram, including the pause button, focus ring, animate/pause/play, reduced motion and the no-JavaScript fallback.

  • Still test: diagrams.spec.js marks a diagram as a still in the page's HTML before its script runs, then checks it has no pause button, draws its complete frame, and never changes. The animation and pause tests cover animated diagrams only.

  • Video tests: they now skip when the page has no videos. They stay in place in case a video is added back.

Notes for reviewers

  • Brand marks:
    • Company logos: the Microsoft Azure, AWS and Google Cloud logos are not used; the diagrams name the platforms in text, like the original's "On-Prem". The official icon sets cover product icons for architecture diagrams, not the company logos.
    • Newer designs: the original video used older AWS, Google Cloud and Redis designs. The diagrams use the current official files.
    • Trademarks: Simple Icons is CC0, but the marks remain trademarks of their owners.
  • Reduced motion: the still frame for integrate is the Azure version.
  • Small screens: on phones the diagrams render at 312×250, like the videos. Video 1's box labels get small at that size, as they did in the video.
  • Chrome: tests/playwright.config.js and AGENTS.md said system Chrome was needed for the MP4s. Both now say that reason is gone. The setting is unchanged.
  • Carousel tests: they still time out now and then under parallel load (noted in Replace the homepage hero image with an animated D3 diagram #194).

Test plan

  • Playwright suite on the final code: 219 passed, 9 skipped (visual opt-in, plus video tests with no videos)
  • Each scene compared frame by frame against its video for layout, colors and timing
  • Smoothness: all four at 60 fps, no frame gaps over 17 ms, no visible position jumps
  • Fallbacks render as standalone images; desktop 600×480 and phone 312×250 checked
  • CI run on the pinned Hugo 0.147.9 (local runs used a newer Hugo)

🤖 Generated with Claude Code

marcduiker and others added 2 commits October 26, 2026 09:44
The fourth homepage value-prop video (4_adopt.mp4) is now a 2D diagram
drawn with D3, in the hero diagram's wireframe style and the video's
original colors. It follows the video's layout and timing: an existing
system of three apps and Kafka, then a Dapr app with a state store, then
a Dapr app sending to RabbitMQ. Motion is eased and runs at the display
frame rate, and the loop fades the additions out and slides back instead
of the video's hard cut.

- assets/js/value-props.js holds a small 2D engine (hexagons, Dapr
  badges, growing arrows, a wireframe cylinder, brand marks) and one
  scene per diagram, so the other three videos can follow.
- A feature item in data/homepage.yml with `diagram: <scene>` and
  `diagramdesc` renders a diagram instead of a video, at the videos'
  600x480 size.
- The Kafka and RabbitMQ marks come from Simple Icons (CC0) and are
  inlined as symbols from assets/images/icons/.
- Each diagram has a pause control, starts paused under reduced motion,
  stops offscreen, and shows a static fallback without JavaScript. The
  fallback exporter now covers every diagram:
  `npm run export:diagram-fallbacks` in tests/.
- The D3 script tags move to the homepage layout, as both diagrams use
  them. The hero script and tests now scope to the hero's own toggle.
- Tests cover the new diagram's pause control, focus ring, animation,
  reduced motion and fallback.
- Deletes 4_adopt.mp4 and 4_adopt.gif (about 1.4 MB); nothing else
  references them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Marc Duiker <4191277+marcduiker@users.noreply.github.com>
All four homepage value-prop videos are now 2D D3 diagrams in the hero's
wireframe style and the videos' colors, each following its video's
layout and timing frame by frame, with eased motion and a smooth loop.

- automate (1_automate.mp4): a workflow builds up step by step, from a
  pub/sub message through activities that call the Secrets API, wait for
  an external event, invoke an app and write key/value state.
- secure (2_best_practices.mp4): three calls fail, are retried by a
  resiliency policy and go through; colors blend instead of switching.
- integrate (3_integrate.mp4): the same app on Microsoft Azure, AWS,
  Google Cloud and on-premises, sliding from one platform to the next.
  Platforms are named in text instead of with company logos.

- The engine in value-props.js gains the shapes these need: activity
  boxes, workflow nodes, envelopes, a message broker, a lock box, a
  person, secure lock, retry and failure marks, multi-line labels, and
  arrows that can recolor and drop their head.
- Vendor marks come from the official Azure, AWS and Google Cloud
  architecture icon sets and from Simple Icons, kept unmodified in
  assets/images/icons/ with their sources and terms in its README. The
  template inlines every file there as a symbol, prefixing ids and
  classes so they cannot clash on the page.
- tests/specs/diagrams.spec.js checks each scene's still frame: title and
  description, expected labels drawn, symbols resolved, nothing outside
  the frame, a working fallback image, and no script errors. It fails if
  a scene is added without being listed.
- The video tests skip when the page has no videos. Fallbacks drop
  elements the still frame hides, so they only carry what is shown.
- Deletes the remaining value-prop MP4s and GIFs (about 6.7 MB); nothing
  else references them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Marc Duiker <4191277+marcduiker@users.noreply.github.com>
@marcduiker
marcduiker force-pushed the value-prop-adopt-diagram branch from 7d005be to e35c048 Compare October 26, 2026 09:17
@marcduiker marcduiker changed the title Redraw the "Incrementally adopt" value-prop video as a D3 diagram Redraw the homepage value-prop videos as D3 diagrams Oct 26, 2026
marcduiker and others added 8 commits October 26, 2026 10:24
App hexagons now take light blue, dark blue, teal and orange, in that
order: one app is light blue, two add dark blue, three add teal, four
add orange. Yellow is gone, as it is too light on the white background.

- automate: its one app is light blue.
- integrate: light blue, dark blue, teal.
- secure: light blue, dark blue, teal, orange.
- adopt has five app hexagons, so they are colored by role: the three
  apps of the existing system teal, the two Dapr apps added to it light
  and dark blue.

The colors are defined once (APP in value-props.js); the fallbacks are
regenerated to match.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Marc Duiker <4191277+marcduiker@users.noreply.github.com>
skills/d3-2d-diagrams/ holds the rules and workflow behind the
value-prop diagrams, so new ones match the existing four. It lives in a
generic skills/ folder at the repo root, not under .claude/.

- SKILL.md: where things live, the design rules (2D wireframe style at
  600x480, the color palette and the app hexagon color order, no
  yellow, labels, arrows, motion and smooth loops), brand mark sourcing
  and terms, accessibility, the step-by-step workflow, and the traps
  already hit.
- reference/engine.md: the shape, timing and color API in
  value-props.js, with a minimal scene.
- scripts/video-frames.sh: frame count, contact sheets and full frames
  from a source video, and color sampling.
- scripts/scene-frames.mjs: screenshots a scene at exact moments on a
  local build, optionally next to the source video's frames.
- scripts/smoothness.mjs: measures a scene's frame rate, visible moves
  and opacity steps against limits.

AGENTS.md points to the skills folder and to this skill.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Marc Duiker <4191277+marcduiker@users.noreply.github.com>
The skill's workflow assumed a source video to measure. It now has a
first step for each starting point:

- 1a, a video or GIF: unchanged.
- 1b, a still image: measure layout and colors from it with the same
  scripts, then design the reveal, with an order (along the flow,
  shapes before their arrows, an arrow before its target, existing
  parts first) and pacing taken from the existing scenes.
- 1c, a text description: list components and connections, map them to
  engine shapes, lay them out on the canvas using the existing scenes'
  spacing, get the layout agreed as a still before animating, then
  animate as for a still.

The frontmatter description now names all three starting points.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Marc Duiker <4191277+marcduiker@users.noreply.github.com>
Not every diagram needs to animate. A feature item with
`diagramstatic: true` now shows its scene as a still: the template marks
the svg data-static and leaves out the pause button, and the script
draws the scene's `still` frame once, with no timer. A scene without a
loop length T is always drawn as a still, so a still-only scene cannot
break if the flag is forgotten. Any animated scene can be shown as a
still with the flag.

- Tests: the animation and pause tests cover animated diagrams only, and
  the markup check counts pause buttons for animated diagrams only. A
  new test in diagrams.spec.js marks a diagram as a still in the page's
  HTML before its script runs, and checks it has no pause button, draws
  its complete frame and never changes. It fails if the still path is
  removed from the script.
- The skill starts its design rules with "Animated or still": videos
  are always animated; still images and text descriptions follow the
  user's instructions, and when there are none, it says to ask. The
  workflow, accessibility and testing steps say which parts apply to
  stills, and the engine reference adds a still-only scene.
- AGENTS.md notes `diagramstatic`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Marc Duiker <4191277+marcduiker@users.noreply.github.com>
The hero's three app hexagons now follow the same order as the
value-prop diagrams: Workflow app light blue (#3EA9F5), Agent dark blue
(#0D2192), App teal (#4EA4AF). The four app colors are defined once in
hero-diagram.js, in the same order (light blue, dark blue, teal, then
orange), so a fourth app would be orange. The static fallback is
regenerated to match.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Marc Duiker <4191277+marcduiker@users.noreply.github.com>
Checked every tracked image and video outside styleguides/ and themes/:
built the site and collected every image path its output references
(HTML, CSS, JS, markdown, llms.txt, sitemap, manifest), searched the
repo for each file, and searched GitHub for outside links to the
public /images/ URLs.

Deletes 17 unused files (about 800 KB):

- adopter logos referenced only by commented-out entries in
  data/homepage.yml: amd, apple, ea, ford, jpmorgan, loreal, paloalto,
  pfizer
- case study images referenced only by commented-out entries:
  case-study-atbay, case-study-bosch
- unreferenced: avatar.png, building-blocks.webp, cta.svg, hero.png,
  on-prem.png, pubsub.webp, screenshot.svg

Kept although the site no longer uses them, because other repositories
embed them from dapr.io: building-blocks.png (quarkiverse/quarkus-dapr
and others) and service-invocation.png. The icons in assets/images/icons
are inlined by the template at build time, so they are used.

Re-enabling one of the commented-out entries needs its image restored
from git history.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Marc Duiker <4191277+marcduiker@users.noreply.github.com>
"The APIs behind it" showed dapr-apis-overview.png. It is now a still 2D
diagram drawn with the same engine as the value-prop diagrams, on a
1200x624 canvas that fills the section's width like the image did:

- Three bands: your app in any language or runtime (Node.js, Python,
  .NET, Go, Java, PHP, Rust); Dapr and its APIs over HTTP or gRPC; the
  infrastructure it runs on and integrates with.
- 16 API tiles in two rows of eight, adding Binary Store, Search and
  Vector. The six alpha APIs are grouped at the end of the second row
  and tagged "alpha", as on the API cards. Observability, Security and
  Resiliency are a column of filled tiles.
- C++ is removed. The language section is teal.
- Languages, runtimes and cloud providers use their official logos,
  from Wikimedia, in their own colors and proportions. The Java logo is
  not freely licensed (fair use on Wikipedia) and is used at the
  maintainers' request; the icons README records every source and
  license. Generic icons are Fluent UI System Icons (MIT), the set the
  API cards already use.
- The markdown rendering points at the diagram's fallback. The PNG is
  deleted.

The diagram code is generalized so a diagram can go in any section:

- value-props.js is now diagrams.js and draws every svg[data-scene]. It
  gains panel, pill and tile builders, icons that keep their
  proportions, and left-aligned labels.
- partials/diagram.html renders one diagram; partials/home/
  diagram-assets.html adds the symbols and the script once per page.
- Fallbacks move to assets/images/diagrams/, and symbol ids are
  renamed to match.
- Every class name in an inlined icon file is prefixed, including in its
  <style> block, and a file without a viewBox gets one from its size.

Tests, the fallback exporter and the skill scripts use the generic
names; the diagrams spec covers the new scene. The skill and AGENTS.md
cover placements beyond the value props, Fluent icons, and when and
how to use official logos.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Marc Duiker <4191277+marcduiker@users.noreply.github.com>
The description listed the six alpha APIs after a single "alpha APIs
for", so binary store ended up about 75 characters from the word
"alpha", and content-119.spec.js (alpha features are labeled
everywhere) failed in CI. The stable and alpha APIs now get their own
sentences: "Six more APIs are in alpha: binary store, search, vector,
cryptography, distributed lock, and conversation."

The skill now says to keep alpha APIs labeled close to each mention in a
diagram's description, and names the spec that checks it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Marc Duiker <4191277+marcduiker@users.noreply.github.com>
@marcduiker
marcduiker merged commit 5a65e7c into master Oct 26, 2026
6 checks passed
marcduiker added a commit that referenced this pull request Oct 26, 2026
Every diagram's static fallback was an <image> inside its svg, so every
visitor downloaded all six (about 165 KB) although the scripts draw over
them straight away. Each fallback is now an <img> in a <noscript> next
to its svg, laid over the svg's box by CSS, for the hero and all 2D
diagrams. Browsers running the scripts never fetch them; without
JavaScript they show as before.

Homepage download with JavaScript, measured locally: 937 KB to 772 KB
uncompressed, about 541 KB to 498 KB with text compressed.

- The scripts no longer remove a fallback, and the exporter no longer
  strips one from its copy.
- Tests: with JavaScript, the hero and the 2D diagrams never request
  their fallbacks; without it, each fallback is visible, loads, and
  sits over its svg's box. The still-diagram test's HTML rewrite allows
  for the noscript before the pause button.
- The regenerated fallbacks lose a blank line, and apis.svg picks up the
  reworded alpha sentence from #195, which was merged without it.
- The skill explains why the fallback stays in its noscript.

Signed-off-by: Marc Duiker <4191277+marcduiker@users.noreply.github.com>
Co-authored-by: Marc Duiker <4191277+marcduiker@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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