Target repo: aacharya-cs/aacharya-cs.github.io
Stack: Jekyll 3.9.5 on GitHub Pages, jekyll-theme-minimalist (BDHU fork), vendored into the repo
Audience for this document: Claude Code, executing directly against the repo
Prepared: 26 July 2026
Work the phases in order. P0 through P2 are the ones that matter; P3 onward are polish. Every task lists the exact file to touch and an acceptance test. Do not skip Section 4: three items there are blocked on Ayan and should be raised before starting, not discovered mid-implementation.
Before writing code, read these four files, because the plan references their internals: _sass/colors.scss, _layouts/default.html, _includes/sidebar.html, _config.yml.
Ground rule on tone for all prose you write into the site: plain declarative sentences, no marketing register, no em dashes.
These were confirmed by reading the live page and the repo tree. Do not re-derive them, but do re-verify anything marked (verify) since it may have changed.
| Fact | Detail |
|---|---|
| Site is one page | index.md (1,335 bytes) plus orphaned another-page.md |
| Theme is vendored, not remote | _sass/, _layouts/, _includes/, assets/ all live in-repo, so you can edit anything |
| Color system | Pure HSL greyscale driven by luminosity variables in _sass/colors.scss. The only hue in the entire system is --clr-a-text: hsl(200, 100%, L) |
| Font system | Noto Sans self-hosted in assets/fonts/, 4 weights, 5 formats each including .eot and .svg |
| Color scheme | color-scheme: auto in _config.yml, honors prefers-color-scheme |
| Blog posts exist but are unreachable | _posts/2023-10-16-Deep-and-Cross-Network.html (21 KB, 5 embedded PNGs) is built and published, but nothing links to it. There is no post index |
| Blog sidebar link is broken | Points to https://github.com/aacharya-cs/blog/, which returns 404 (verify) |
| Twitter link is wrong | Points to https://twitter.com/BodunHu, the theme author’s handle, carried over from the template |
| Three nav items are dead | Research, Service, Social Profiles in _config.yml have a name: but no link:, so they render as <a href=""> and reload the current page |
| Publication list is stale | Newest entry is ICLR 2024. Google Scholar shows roughly 1,270 citations across 30-plus papers (verify current count) |
| No paper is linked | Not one arXiv link, PDF, code link, or BibTeX entry on the page |
| Public affiliation is stale | Google Scholar and OpenReview both still say LinkedIn |
| Repo carries template debris | minimalist.png (165 KB), images/step1.gif (976 KB), images/jekyll-*, images/config.png, images/first-post.png, .Rhistory, and the theme’s own README.md |
| Photos are unoptimized | images/ayan.jpg 444 KB, images/ayan-2.png 454 KB, for an image displayed at roughly 260 px wide |
| FontAwesome is loaded in full | _includes/head-custom.html pulls the entire FA Free CSS bundle from jsDelivr to render exactly three glyphs |
| No favicon | _config.yml never sets favicon, so the conditional in head-custom.html never fires, and no favicon.ico exists |
| SEO plugin is under-configured | jekyll-seo-tag is enabled but author, social, twitter, and image are all unset, so no Person JSON-LD and no link-preview image |
| No reproducible build | Gemfile is gitignored. deploy.sh shells out to the unmaintained jekyll/jekyll Docker image |
| No CI | No workflow, no link check, no build verification |
Five independent passes over the same artifact, then consolidated. Findings are ranked within each pass.
The site’s stated purpose is professional credibility, so factual defects outrank aesthetic ones.
News and Talks headers.another-page.md publishes “Welcome to another page / yay” at a crawlable URL..edu address, unlinked, and obfuscated in a way that defeats both scrapers and humans who want to click it._includes/links-mobile.html uses <nobr>, which is non-standard and deprecated. Replace with white-space: nowrap.assets/css/style.scss carries roughly 50 lines of .overlay / .popup modal CSS for a modal that does not exist on any page.alt="Logo" on a photograph of a person.jekyll-seo-tag is generating almost nothing useful because author, social.links, and image are unset. Setting social.links produces Person JSON-LD with sameAs pointing at Scholar, GitHub, and LinkedIn, which is the mechanism by which a personal site consolidates a fragmented academic identity. This is the highest-value SEO change available and it costs six lines of YAML.meta-twitter:card: summary with no image, so every shared link previews as a grey box.loading="lazy", no width/height attributes, so the post reflows as it loads.Gemfile is gitignored, so there is no pinned github-pages version and no reproducible local build. This is the root cause of “I’ll update it later” becoming “I never updated it.”deploy.sh uses the deprecated jekyll/jekyll Docker image and is misnamed, since it serves rather than deploys..Rhistory is committed.The one real fight: keep this theme, or migrate to al-folio / academicpages?
The argument for migrating: al-folio ships publication rendering from BibTeX, a news feed, a CV page, and citation counts, all of which appear on this plan’s wish list.
The argument against, which wins: al-folio is a heavy Ruby dependency graph that regularly breaks on GitHub Pages, and it produces a site that looks identical to several thousand other al-folio sites. Migrating consumes the entire implementation budget and delivers a site whose distinguishing feature is that it is not distinguishable. The current theme is vendored, fast, dark-mode aware, and fully editable. The actual problems here are stale content, broken links, and hardcoded data, and a theme migration fixes none of them.
Resolution: keep the vendored theme. Build the data layer yourself in _data/, which is about 80 lines of Liquid. Spend the design budget on typography and the publication list, which is where a reader’s eye actually goes.
Secondary disagreement, resolved: R2 wanted a full multi-page site immediately; R5 wanted P0 shipped alone first. Resolved in favor of R5’s sequencing. P0 is 30 minutes and removes every actively wrong statement on the site. Ship it as its own commit before touching anything structural.
Do not guess at these. Ask, and if answers are not available, implement the stated fallback and leave a TODO comment.
utexas.edu alumni address, or a forwarding alias shown. (Fallback: keep the utexas.edu address, make it a real mailto: link, keep the “at / dot” spelling in the display text only.)(Fallback: build the sections and data files, populate from Google Scholar and the DBLP entry for what is publicly verifiable, and leave clearly marked placeholders elsewhere. Do not invent biography.)
Note for whoever raises this: the Google Scholar and OpenReview profiles both still list LinkedIn as the affiliation. Updating those two profiles is outside this repo but is arguably higher-leverage than anything in it, since they outrank the personal site for his name.
/ About, current interests, selected work, recent news
/publications/ Full list, reverse chronological, grouped by year
/blog/ Post index
/blog/<post>/ Existing DCN post, plus future posts
/service/ Reviewing, program committees, talks
/cv/ HTML CV, with a PDF download link
Every list on those pages is rendered by a Liquid loop over _data/. No publication, talk, or news item is ever hardcoded into a Markdown file again. This is the single change that determines whether the site is still current in 2028.
Constraint: extend the existing token system in _sass/colors.scss, do not replace it. Add the new variables inside the existing @mixin colors, @mixin light-colors, and @mixin dark-colors blocks so the auto/light/dark switching keeps working. Adding a hue to a system that is currently pure greyscale is the whole design move; do it once, deliberately, in one place.
Six values. The accent is an indigo rather than the terracotta-on-cream or acid-green-on-black that every generated portfolio currently uses. Indigo also happens to be a defensible reference point for a Bengali designer’s palette, and it reads as archival rather than startup.
| Token | Light | Dark | Use |
|---|---|---|---|
--clr-paper |
#FBFAF6 |
#14161A |
Page background |
--clr-ink |
#191C21 |
#E8E6E1 |
Headings, body |
--clr-muted |
#5D6570 |
#9AA0A8 |
Author lists, dates, captions |
--clr-accent |
#27406E |
#7B9DD8 |
Links, venue tags, the rule under section headings |
--clr-rule |
#E2DED6 |
#2A2E35 |
Hairlines, dividers, card edges |
--clr-mark |
#A6552F |
#C9814F |
Reserved exclusively for “new” and “award” markers. If it appears anywhere else, it stops working |
Retire the theme’s hsl(200, 100%, L) link cyan in favor of --clr-accent.
Three roles, which the current site does not distinguish at all:
Self-host all three as WOFF2 only, alongside the existing Noto Sans setup in _sass/fonts.scss. While in that file, delete the .eot, .svg, and .ttf sources from the Noto Sans @font-face blocks and the corresponding files from assets/fonts/. Those formats target IE8 and Android 4. They are roughly 400 KB of the repo and are never served to any browser in use.
The homepage gets a Selected Work section: five papers, each with an explicit ordinal, ranked by Ayan’s own judgment of significance rather than by date, each carrying one line explaining what it changed.
The justification is that the ordinal is not decoration here. Ranked lists with per-item relevance are the literal subject matter of his research, and a hand-ranked list makes a claim a chronological list cannot: it says which work he stands behind. Structural devices should encode something true, and this one does.
Everything else on the page stays quiet: hairline rules, generous leading, no cards, no shadows, no gradients. The ranked list is the only place the design raises its voice.
Responsive to 360 px. Visible keyboard focus rings on every interactive element. prefers-reduced-motion respected. Contrast at AA against both backgrounds; verify --clr-muted in dark mode specifically, since it is the value most likely to fail.
One commit. No refactoring. Roughly 30 minutes.
| # | Task | File | Done when |
|---|---|---|---|
| 0.1 | Fix or delete the Twitter entry | _config.yml |
No URL on the site points to BodunHu |
| 0.2 | Give Research, Service, Social Profiles real link: values, or comment them out until their pages exist in P2 |
_config.yml |
grep -c 'href=""' _site/index.html returns 0 |
| 0.3 | Point Blog at /blog/, or remove it until P2 lands |
_config.yml |
No 404 from any nav item |
| 0.4 | Delete another-page.md, .Rhistory, minimalist.png, images/step1.gif, images/jekyll-logo.png, images/jekyll-now-theme-screenshot.jpg, images/config.png, images/first-post.png, _posts/2024-3-3-Hello-World.md |
repo root | du -sh drops by roughly 1.4 MB |
| 0.5 | Replace the theme README.md with a short repo README |
README.md |
No longer describes jekyll-theme-minimalist |
| 0.6 | Remove “page under active development.” Either write the real paragraph or delete the empty About Me, News, and Talks headers |
index.md |
No empty section headings render |
| 0.7 | Make the email a mailto: link, keeping the obfuscated display text |
_layouts/default.html |
Clicking the address opens a mail client |
| 0.8 | alt="Logo" becomes alt="Ayan Acharya" |
_layouts/default.html |
Passes an alt-text audit |
This is the phase that prevents the site going stale again. Schemas in Section 8.
| # | Task | File |
|---|---|---|
| 1.1 | Create _data/publications.yml. Backfill from Google Scholar. Include every entry currently on the site plus everything published since ICLR 2024 |
_data/publications.yml |
| 1.2 | Create _data/news.yml, _data/talks.yml, _data/service.yml |
_data/ |
| 1.3 | Write _includes/publication-list.html: loops site.data.publications, sorts by year descending, accepts a limit param and a type filter, bolds “A Acharya” in the author string, renders venue as a Plex Mono tag, and emits links for arXiv, PDF, code, and BibTeX when present |
_includes/publication-list.html |
| 1.4 | Write _includes/news-list.html and _includes/selected-work.html. The latter reads selected: <int> and renders the ranked list from Section 6 |
_includes/ |
| 1.5 | Rewrite index.md to consist only of prose plus include calls. Zero hardcoded publication data |
index.md |
Acceptance: adding a paper to the site is a single YAML entry, and it appears in the right place on both the homepage and the publications page with no other edit.
| # | Task | File |
|---|---|---|
| 2.1 | publications.md, layout default, permalink /publications/, grouped by year via `` |
new |
| 2.2 | blog.md at /blog/, iterating site.posts with date, title, and excerpt |
new |
| 2.3 | service.md at /service/, rendering _data/service.yml and _data/talks.yml |
new |
| 2.4 | cv.md at /cv/: HTML CV plus a download link to assets/cv/ayan-acharya-cv.pdf |
new |
| 2.5 | Split the sidebar into external profile links versus internal site nav. They are currently one undifferentiated list, which is why the dead items were not noticed | _includes/sidebar.html, _config.yml |
| 2.6 | Set permalink: /blog/:title/ in _config.yml and confirm the existing DCN post’s old URL still resolves or redirects |
_config.yml |
| # | Task | File |
|---|---|---|
| 3.1 | Add the six palette tokens to all three mixins | _sass/colors.scss |
| 3.2 | Self-host the three new faces as WOFF2, font-display: swap |
_sass/fonts.scss, assets/fonts/ |
| 3.3 | Strip .eot, .svg, .ttf from the Noto Sans blocks and delete those files |
_sass/fonts.scss, assets/fonts/ |
| 3.4 | Build the type scale and the publication-entry styles: title, authors, venue tag, link row | assets/css/style.scss |
| 3.5 | Style the ranked Selected Work list | assets/css/style.scss |
| 3.6 | Delete the unused .overlay and .popup rules |
assets/css/style.scss |
| 3.7 | Replace <nobr> with white-space: nowrap |
_includes/links-mobile.html |
| 3.8 | Verify AA contrast in both schemes, focus rings visible, layout intact at 360 px | all |
| # | Task | Detail |
|---|---|---|
| 4.1 | Convert the remaining three FontAwesome glyphs to inline SVG in _config.yml, matching the pattern already used for Scholar and Twitter. Then delete the jsDelivr <link> from _includes/head-custom.html |
Removes the last third-party render-blocking request |
| 4.2 | Resize images/ayan.jpg to 600 px wide, export WOFF-era-free WebP with a JPEG fallback, target under 60 KB. Delete images/ayan-2.png if unused |
Roughly 850 KB saved |
| 4.3 | Resize the five _posts/*.png diagrams to a 1200 px max width, add loading="lazy" and explicit width/height |
Stops post reflow |
| 4.4 | Add to _config.yml: author, social.name, social.links (Scholar, GitHub, LinkedIn, OpenReview, DBLP), and image |
Produces Person JSON-LD with sameAs. Highest-value SEO change in this plan |
| 4.5 | Create a 1200x630 OG image and set image: in _config.yml. Switch twitter:card to summary_large_image |
Link previews stop being grey boxes |
| 4.6 | Add favicon.ico plus a 180 px apple-touch-icon.png, and set favicon: true in _config.yml so the existing conditional fires |
Tab icon renders |
| 4.7 | Add robots.txt pointing at the sitemap already generated by jekyll-sitemap |
| # | Task | Detail |
|---|---|---|
| 5.1 | Un-ignore Gemfile and Gemfile.lock, commit both with github-pages pinned |
Reproducible builds. This is what makes future updates cheap enough to actually happen |
| 5.2 | Replace deploy.sh with serve.sh running bundle exec jekyll serve --livereload |
|
| 5.3 | Add .github/workflows/ci.yml: build on PR, then run lychee or htmltest over _site/ |
Would have caught every P0 defect |
| 5.4 | Add a CONTRIBUTING-style note in README.md documenting where to add a paper, a post, and a talk |
Three sentences. Makes the data layer discoverable six months from now |
_data/publications.yml:
- title: "A Precise Characterization of SGD Stability Using Loss Surface Geometry"
authors: "G Dexter, B Ocejo, S Keerthi, A Gupta, A Acharya, R Khanna"
venue: "ICLR"
year: 2024
type: conference # conference | journal | workshop | preprint | patent
arxiv: "2401.12345" # optional, id only
pdf: # optional, absolute or site-relative
code: # optional
bibtex: # optional
selected: 2 # optional; presence means it appears in Selected Work, value is the rank
note: "Characterizes SGD stability through the geometry of the loss surface." # one line, shown only for selected entries
Rules the include must enforce:
year descending, then by type with conference before workshop before preprint.A Acharya in authors.preprint and the old ArXiv Submission heading collapse into one type. Do not carry the duplicate taxonomy forward.arxiv as https://arxiv.org/abs/<id>._data/news.yml:
- date: 2026-06-15
text: "Paper accepted at RecSys 2026."
link: # optional
_data/talks.yml:
- title: ""
venue: ""
date: 2026-01-01
slides: # optional
video: # optional
_data/service.yml:
- role: "Reviewer"
venue: "NeurIPS"
years: [2023, 2024, 2025, 2026]
Run before declaring any phase complete.
Automated
bundle exec jekyll build exits 0 with no warnings._site/ finds zero 404s and zero empty hrefs.Manual
_data/publications.yml surfaces it on both / and /publications/ with no other file changed.Named so they do not get picked up opportunistically: