No article twice
The homepage was mostly blocks that each showed the latest few items of some content type. Which meant the newest article could easily show up in three places on one page. Each view got a contextual filter that excludes specific nodes, and a bit of JavaScript collected the IDs of everything already on the page, then reloaded the views over AJAX with those IDs excluded. Every block still shows fresh content, just never the same content.
Views that know where they are
Everything on the site hung off topics, so I wrote a small module that lets Views figure out its surroundings. On a topic page, it passes that topic into each view’s contextual filters, retitles the view to match (using the short name, like “AI & ML,” where one exists), and adds a “view all” link that carries the topic along. One set of views serves every topic page.
Blocks editors can actually use
A set of custom Layout Builder blocks gave editors the site’s building pieces. The star is the “latest” block: it shows the newest item of a type (or, for events, the next one coming up), and an editor can pin a specific item instead. If nothing’s pinned, an entity query fills the spot automatically. There was also a scholar Twitter embed that finds the handle from the scholar’s own profile, a repeatable logo strip, and a section header in the site’s signature bracket style.
Leaving a map
When the project went on hold, I wrote a handoff doc for whoever picked it back up: every helper function and block, the order the migrations had to run in (scholars first, so articles can find their authors), the drush commands for importing, rolling back and unsticking a stuck migration, and a heads-up that every rerun was pushing node IDs into the hundreds of thousands. That doc is the reason this case study exists.