Skip to content

Rebrand site visuals from Duke to NYU#57

Merged
jmxpearson merged 20 commits into
masterfrom
worktree-nyu-rebrand
Jul 25, 2026
Merged

Rebrand site visuals from Duke to NYU#57
jmxpearson merged 20 commits into
masterfrom
worktree-nyu-rebrand

Conversation

@jmxpearson

Copy link
Copy Markdown
Member

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.md for follow-up (they need your decisions on timing, per-person emails, program pathways, etc.).

What changed

  • Color scheme: Duke Blue #001A57NYU Violet #57068C across navbar, buttons, and header banner, with Deep Violet #330662 accents (from NYU brand guidelines).
  • Navbar: now NYU Violet (white nav text ≈ 11.6:1 contrast — accessible).
  • Header banner: Duke chapel photo → NYU violet gradient.
  • Logo: Duke Neurobiology stack → placeholder NYU Center for Neural Science lockup (images/nyu_cns_lockup.svg). ⚠️ Official NYU marks are trademarked and return 403 on hotlink — request an approved asset from brand@nyu.edu / CNS comms and drop it in.
  • Landing page: bold, large-font "We're moving to NYU — effective September 1, 2026" announcement (stub copy, easy to edit or remove after the move).

Follow-ups (see TODO-NYU-migration.md)

Site title/description, @duke.edu emails, bios, the entire join_us.md PhD-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

  • Jekyll build passes cleanly.
  • TODO-NYU-migration.md is intended as a working checklist and can be deleted before final merge.

🤖 Generated with Claude Code

https://claude.ai/code/session_01YSdqr7AGPBUzB9HKeeix3h

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
@github-actions

github-actions Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Summary

Status Count
🔍 Total 911
🔗 Unique 316
✅ Successful 239
⏳ Timeouts 0
🔀 Redirected 50
👻 Excluded 667
❓ Unknown 0
🚫 Errors 5
⛔ Unsupported 0

Errors per input

Errors in _site/join_us.html

Errors in _site/learning.html

Errors in _site/people.html

Full Github Actions output

jmxpearson and others added 19 commits July 22, 2026 16:33
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
jmxpearson marked this pull request as ready for review July 25, 2026 23:52
@jmxpearson
jmxpearson merged commit 469db36 into master Jul 25, 2026
2 checks passed
@jmxpearson
jmxpearson deleted the worktree-nyu-rebrand branch July 26, 2026 00:33
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