Rebrand site visuals from Duke to NYU#57
Merged
Conversation
Move the lab's visual identity toward NYU / Center for Neural Science ahead of the September 2026 move: - Swap Duke Blue (#001A57) for NYU Violet (#57068C) across the navbar, buttons, and header banner, with Deep Violet (#330662) accents. - Paint the top nav NYU Violet (white nav text stays ~11.6:1 contrast). - Replace the Duke chapel jumbotron photo with an NYU violet gradient. - Replace the Duke Neurobiology logo with a placeholder NYU CNS lockup (images/nyu_cns_lockup.svg). Official NYU marks are trademarked and can't be hotlinked; swap in an approved asset from brand@nyu.edu. - Add a bold "We're moving to NYU (Sept 1, 2026)" announcement banner to the landing page (stub copy, easy to edit/remove after the move). - Add TODO-NYU-migration.md cataloguing every remaining Duke-specific reference (identity, emails, bios, recruiting, location, blog posts) for follow-up decisions. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YSdqr7AGPBUzB9HKeeix3h
Contributor
Summary
Errors per inputErrors in _site/join_us.html
Errors in _site/learning.html
Errors in _site/people.html
|
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YSdqr7AGPBUzB9HKeeix3h
Remove the placeholder NYU CNS lockup image from the landing page, and replace the boxed moving announcement with a single bold, moderately sized line sitting directly above the [λ] logo. To guarantee that "directly above" relationship, the logo moves from a fixed background-image to an <img> inside a flex column. The old background-image was centered with background-size: contain, so its top edge shifted with viewport aspect ratio and nothing could be reliably anchored to it. object-fit: contain plus min-height: 0 let the logo shrink on short viewports without distorting. The lockup SVG itself is kept on disk — TODO-NYU-migration.md still tracks replacing it with an approved mark from NYU brand. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013CB1BSCz8YKpK4YyZiN81C
The research card grid rendered every entry in _data/research.yml unconditionally, so the only way to take a project down was to delete it or comment out the whole block. Add an optional `hidden: true` key, letting an entry stay in the file (with its history and prose intact) while dropping off the Research page. Documented in the research.yml header, including the caveat to use the bare YAML boolean rather than a quoted string, since any non-empty string is truthy in Liquid and "false" would hide the entry. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013CB1BSCz8YKpK4YyZiN81C
TODO section 8.
Delete two images left over from the Duke branding, neither referenced
by any page, layout, or stylesheet:
- images/chapel_gradient.jpg — the old jumbotron photo, replaced by
the violet gradient.
- images/DUSOM_Dept_Neurobio_stack.jpg — the Duke Neurobiology logo,
which the landing page no longer shows.
scripts/recover_dibs_web01.py still lists the Neurobiology logo in its
URL manifest. That is a one-time recovery record for issue #33, not a
live dependency, so it is left as-is.
Also stop publishing TODO-NYU-migration.md. It was being rendered to
/TODO-NYU-migration.html and advertised in sitemap.xml, putting ten lab
email addresses and in-progress "who is moving" notes on the live site.
Jekyll's `exclude` replaces its built-in list rather than extending it,
so the defaults are restated to keep Gemfile and vendor/ unpublished —
verified both still 404 after the change.
The third item in section 8 needed no change: .image-size-overrides,
.html5validator.yaml, and lychee.toml reference neither of the removed
images nor any dead Duke host.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013CB1BSCz8YKpK4YyZiN81C
Replace the flat violet gradient in the header banner with a Greenwich Village photo, and delete images/nyu_cns_lockup.svg — the placeholder NYU lockup, unreferenced since the landing page stopped showing it. The violet gradient is kept as a translucent scrim over the photo rather than dropped. The banner renders a white title and a light grey subtitle over whatever is behind them, and the photo is busy enough that the existing text-shadow alone doesn't hold contrast; the scrim also keeps the NYU violet in the header. Image is the 1280x853 Wikimedia thumbnail at 482 KB, which clears the image-size hook's 500 KB warn and 1 MB block. The 4809x3206 original is 7.7 MB and would have been blocked outright. A 3:1 pre-crop was measured at 449 KB — only 33 KB better, not worth baking the framing into the file when background-size: cover already crops it. The photo is CC BY 2.0 (Felix Stahlberg), which requires visible credit, a licence link, and a note of changes, so footer.html gains an attribution line. That include is used by the same layouts that render the banner, so the credit appears on exactly the pages showing the photo. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013CB1BSCz8YKpK4YyZiN81C
Shows more of the Greenwich Village photo through the header. The white title still holds contrast; the light grey subtitle is now closer to the edge of comfortable legibility over the brighter parts of the image. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013CB1BSCz8YKpK4YyZiN81C
The weekly Scholar refresh did re-fetch existing publications, but merge_publications keyed the merge on 'id', and create_id_from_publication builds that id from the publication year. When a preprint appears in a journal the year usually changes, so the refreshed entry produced a new id, missed the existing row, and was appended as a second entry while the stale preprint row was kept. The preprint row is what publications.html renders a preprint badge from, so the paper went on looking unpublished even though the update had been fetched successfully. Match on the normalized title instead, falling back to id and then to a prefix match so a title Scholar has truncated or expanded still lands on the right row rather than forking one. Refreshes are also no longer an unconditional overwrite. A fetch could previously replace good data with worse — commit ab6b0c0 stored a title Scholar had cut off mid-phrase, which would also have broken title matching on the following run and produced a duplicate. merge_entry_fields now refuses a truncated title, refuses to demote a journal venue back to a preprint server, drops trailing volume/issue noise ("Journal, 46 (0)"), and never lets an empty value clobber a stored one. ids are rewritten from each entry's own final data, so an id stays consistent with the row it labels once a year changes. Nothing in the templates references ids, so this is safe; collisions get a suffix. Verified against the current _data/publications.yaml: 93 entries in, 93 out, 0 ids rewritten, 0 fields altered — the change is inert on today's data and only takes effect when a real update arrives. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013CB1BSCz8YKpK4YyZiN81C
Phase 2 refetched every stored publication on each weekly run: one scholarly.fill() per entry, 93 of them, sequentially through free proxies. Scholar rate-limits well before that, and because phase 2 has no retry, everything after the cutoff was silently never refreshed — build_pub_data swallows the error and returns None, so a truncated pass and a run where nothing changed produced identical output. needs_refresh narrows the pass to entries that could actually have changed: a preprint venue, no venue recorded, an unknown year, or published within the last year. On the current data that is 20 of 93, so 73 settled papers are skipped. A paper that has sat in the same journal since 2009 has nothing left to learn from another fetch. The selection is aimed at the case that motivated this work: all 11 entries still carrying a bioRxiv/arXiv venue are in the refresh set, so a preprint that has since appeared in a journal is always re-checked. Also log a WARNING with the count when refresh fetches fail, so a rate-limited run is visible in the Actions log instead of looking like a quiet no-op. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013CB1BSCz8YKpK4YyZiN81C
The author loop emitted ", " between every pair of authors and prefixed "and " to the last, so a two-author paper rendered "A, and B". Three or more authors correctly take the serial comma; two should not. Pick the separator from the author count: " " for exactly two, ", " otherwise. Single-author entries were already unaffected. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013CB1BSCz8YKpK4YyZiN81C
Lets more of the Greenwich Village photo through. The white title still holds contrast; the light grey subtitle (#B5B5B5, set inline in jumbotron.html) is now washing out over the brighter buildings and probably wants either white or a stronger text-shadow. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013CB1BSCz8YKpK4YyZiN81C
The subtitle was pinned to #B5B5B5 inline. That read fine against the flat violet header, but washed out once the banner became a photo behind a lightened scrim. Drop the inline override rather than hardcoding white: .jumbotron already sets color: white, so the subtitle now inherits it along with the title and stays consistent if that colour is ever changed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013CB1BSCz8YKpK4YyZiN81C
The type badge is derived from the venue string, and any venue containing "proceedings" was treated as a conference paper. "Proceedings of the National Academy of Sciences" is a journal, so all five PNAS papers — including the scene-statistics one — were badged conference. Match the journals that happen to be named "Proceedings of ..." before the generic rule. Covers PNAS and, pre-emptively, Proceedings of the Royal Society. Badge counts go from 72/12/9 to 77/7/9 (journal/conference/preprint). The seven remaining conference entries are all genuine: NeurIPS x4, Cognitive Science Society x2, Machine Learning for Healthcare x1. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013CB1BSCz8YKpK4YyZiN81C
Workshop papers usually can't be identified from Scholar's metadata: one of these two carries no venue at all, the other looks like a bare arXiv preprint. So the badge can't be derived — it has to be stated. Add an optional `badge:` key on a publications.yaml entry that overrides the venue-string derivation, and use it to tag the Rosetta VAE paper and "A goal-based movement model for continuous multi-agent tasks" as workshop. Previously they badged as journal (no venue -> fell through to the default) and preprint respectively. The override survives the weekly scrape: merge_entry_fields copies the stored entry and overlays only the fields Scholar returned, and Scholar never returns `badge`. Verified with a test that refreshes both entries from metadata omitting the key. Counts go to 76 journal / 7 conference / 8 preprint / 2 workshop. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013CB1BSCz8YKpK4YyZiN81C
pre-commit (my regression, since 110dd91): the jpegoptim hook rewrote images/greenwich_village.jpg on every run and failed with "files were modified by this hook". jpegoptim isn't installed locally, so the hook never ran before the commit. Its output doesn't converge either — with --max=85 it lossily re-encodes a higher-quality file each pass, shrinking it slightly every time. Re-encoded at q82 instead (djpeg | cjpeg, progressive), which is below the cap, so jpegoptim now does only lossless work and reports "skipped, 0.00%". 493284 -> 408496 bytes. site-health (pre-existing): lychee failed on a [503] from https://www.rstudio.com/ in learning.md. RStudio is now Posit and that URL is a legacy redirect. posit.co/products/open-source/rstudio/ also 503s; posit.co/download/rstudio-desktop/ returns 200, so link there. Bolding: lab_keys took the last space-separated token as the surname, so "Chaichontat Sriworarat (Richard)" in people.yml produced the key "C|(Richard)" and never matched, leaving him unbolded. Skip parenthesised nicknames when building the key. "Lun (Sam) Yin" and "Xin (Cindy) Chen" already worked (mid-name parenthesis) and still do. Add a display-name alias so he shows as Richard Sriworarat, the name he goes by, rather than the published Chaichontat. It lives in the template because the scraper rewrites author fields from Scholar every run. Bolding still matches on the published name. The two undated Kelsey McDonald papers are CCN proceedings; years come from their URLs (2019.ccneuro.org, 2018.ccneuro.org, both verified 200). Fill in year, venue, and CSL type, which also makes the existing venue rule badge them as conference. Note mcdonald2019bayesianb carries a suffix: a 2019 Nature Communications paper by the same first author also begins "Bayesian", so both compute the same id. This matches what reconcile_ids would assign; verified a no-op scrape now rewrites 0 ids and leaves no duplicates. Counts: 74 journal / 9 conference / 8 preprint / 2 workshop. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013CB1BSCz8YKpK4YyZiN81C
"TOWARDS A COMPUTATIONAL PSYCHIATRY OF TRANSDIAGNOSTIC DEFICITS IN
COGNITIVE CONTROL" had no year and no venue, so it sorted to the bottom
of the page and fell through the venue rules to a "journal" badge it
hadn't earned.
It could not be sourced: the Scholar cluster gives only a title and
author list, Crossref has no DOI for it, it is absent from the first
author's own Scholar profile, and it is not her dissertation ("Learning
Context-Sensitive Control", 2021). Grey literature, most likely a poster
or an unpublished manuscript Scholar scraped from a PDF.
John has removed it from the lab Scholar profile, so the scrape no longer
returns it and it won't be re-added; no ignore mechanism is needed.
Verified the profile no longer lists it.
92 entries, none now lacking a year. Counts: 73 journal / 9 conference /
8 preprint / 2 workshop.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013CB1BSCz8YKpK4YyZiN81C
Flip the site identity to NYU: _config.yml title and description, index.html desc, and reword the landing-page notice to "Center for Neural Science at NYU". people.yml: John's bio now describes the NYU Center for Neural Science appointment and the Flatiron Institute CCN affiliation; Shiyang moves to the NYU Center for Data Science; David and Caitlin's affiliations clarified; add Achint's outcome. join_us.md: replace the Duke admissions routes with the NYU Neuroscience PhD program, note postdoc recruiting via the Flatiron Research Fellows Program for 2026-27, and pause undergraduate and high-school intake during the move. location.md: drop the `nav:` key so the stale Duke directions come off the navbar while the page stays live for rewriting later. research.yml: hide the VAE-GAM project via the new `hidden` flag. Also strip trailing whitespace from the touched files: yamllint errors on it and the trim-trailing-whitespace hook rewrites files, either of which fails the pre-commit workflow. Gemfile.lock is deliberately left uncommitted — it is re-resolved locally for Ruby 3.1.3 and would clobber the pinned versions CI uses. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013CB1BSCz8YKpK4YyZiN81C
Remove the recommendation of Cliburn Chan's STA 663, a Duke course only open to Duke students, and the "(Duke uses this for its intro ML class)" aside on the Murphy book. The book recommendations themselves stand on their own and stay. Tick off the corresponding items in TODO-NYU-migration.md, plus Trevor's bio entry. Also strip a trailing space left on the Murphy line; yamllint and the trim-trailing-whitespace hook both fail the pre-commit workflow on it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013CB1BSCz8YKpK4YyZiN81C
John is tracking the remaining items elsewhere. Drop the `exclude` block from _config.yml along with it. That block existed only to keep this file out of the built site; with the file gone it has no purpose, and removing it restores Jekyll's built-in exclude list rather than the hand-copied one. Verified /Gemfile and /Gemfile.lock still 404 afterwards, and the sitemap is unchanged. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013CB1BSCz8YKpK4YyZiN81C
jmxpearson
marked this pull request as ready for review
July 25, 2026 23:52
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Kicks off the Duke → NYU move for the lab site. This PR handles the visual rebrand; the textual/content changes are catalogued in
TODO-NYU-migration.mdfor follow-up (they need your decisions on timing, per-person emails, program pathways, etc.).What changed
#001A57→ NYU Violet#57068Cacross navbar, buttons, and header banner, with Deep Violet#330662accents (from NYU brand guidelines).images/nyu_cns_lockup.svg).Follow-ups (see
TODO-NYU-migration.md)Site title/description,
@duke.eduemails, bios, the entirejoin_us.mdPhD-pathways section,location.md(Bryan Building → Meyer, 4 Washington Place), learning-resource course refs, and a review of historical blog posts (most should stay as-is).Notes
TODO-NYU-migration.mdis intended as a working checklist and can be deleted before final merge.🤖 Generated with Claude Code
https://claude.ai/code/session_01YSdqr7AGPBUzB9HKeeix3h