Implementation Plan: aacharya-cs.github.io

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


0. How to use this document

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.


1. Verified repository facts

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

2. Review pass findings

Five independent passes over the same artifact, then consolidated. Findings are ranked within each pass.

R1: Correctness and integrity

The site’s stated purpose is professional credibility, so factual defects outrank aesthetic ones.

  1. The Twitter link sends visitors to a stranger. This is the single worst defect on the site. A hiring manager or collaborator who clicks it lands on someone else’s profile, which reads as carelessness in a way nothing else here does.
  2. Three of seven nav items are dead links. They look clickable, do nothing.
  3. The Blog link 404s while an actual, substantive blog post sits published and unlinked in the same repo.
  4. “page under active development” has been the About Me text long enough to be indexed. An empty section is worse than an absent one, because it advertises abandonment. Same for the empty News and Talks headers.
  5. another-page.md publishes “Welcome to another page / yay” at a crawlable URL.
  6. The publication list is both incomplete and mis-taxonomized. “Pre-prints” and “ArXiv Submission” are the same category under two headings. Seven papers are listed where Scholar shows 30-plus. The 2018 KDD paper and the 2020 arXiv sit adjacent to 2024 work with no ordering logic a reader can infer.
  7. The email is a stale .edu address, unlinked, and obfuscated in a way that defeats both scrapers and humans who want to click it.

R2: Information architecture and content

  1. A single flat page is the wrong container for this career. There are at least five distinct content types (bio, publications, blog, service, talks) collapsed into one scroll, and the one with real depth (publications) is the one rendered most thinly.
  2. Publications are hardcoded Markdown. Every new paper is a manual edit in a bulleted list with hand-typed author strings. This is the reason the list is stale: the cost of updating is high enough to defer indefinitely. The fix is structural, not editorial.
  3. There is no “what I actually work on” statement anywhere. The description field says “Research Scientist, Machine Learning,” which describes several hundred thousand people. Nothing on the page tells a reader that the work is in ranking and retrieval systems, sequential user modeling, and content integrity at scale.
  4. No CV. For an industry researcher this is the most-requested artifact and it is absent in both PDF and HTML form.
  5. Industry trajectory is invisible. UT Austin PhD, Cognitive Scale, Netflix, LinkedIn, Meta. None of it appears. For someone whose value proposition is production ML at scale, the deployment history is the differentiator and it is entirely missing.
  6. The blog post that does exist (Deep and Cross Network) is genuinely good technical writing and is the strongest single asset on the site. It is invisible.

R3: Design and frontend

  1. The theme is competent and fast. It is also visibly a template, and it is a template with a well-known silhouette. The photo-and-links sidebar over a greyscale body reads as “GitHub Pages academic default.”
  2. The type system does exactly one job and no more. Noto Sans at four weights, greyscale, no scale, no differentiation between a paper title, a venue, and an author list. In a publication list, that distinction is the entire readability problem.
  3. There is no accent color. The only hue in the system is the link cyan inherited from the theme. Nothing draws the eye anywhere on purpose.
  4. _includes/links-mobile.html uses <nobr>, which is non-standard and deprecated. Replace with white-space: nowrap.
  5. assets/css/style.scss carries roughly 50 lines of .overlay / .popup modal CSS for a modal that does not exist on any page.
  6. alt="Logo" on a photograph of a person.

R4: Performance, SEO, accessibility

  1. Roughly 1.4 MB of dead images ship in the repo and at least 900 KB of live payload is spent on an avatar that renders at 260 px.
  2. A full FontAwesome bundle for three icons is the largest single render-blocking third-party request on a page whose entire text content is under 2 KB. Two of the five sidebar icons are already inline SVG, which is the correct pattern. Extend it to all five and drop the CDN link.
  3. 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.
  4. meta-twitter:card: summary with no image, so every shared link previews as a grey box.
  5. No favicon, so every open tab shows the generic globe.
  6. The five blog-post PNGs are 100 KB to 325 KB each, unresized, no loading="lazy", no width/height attributes, so the post reflows as it loads.

R5: Build, tooling, maintenance

  1. 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.”
  2. deploy.sh uses the deprecated jekyll/jekyll Docker image and is misnamed, since it serves rather than deploys.
  3. No CI. A link checker in a GitHub Action would have caught the Twitter handle, the dead nav items, and the 404ing blog link on the day they were introduced.
  4. .Rhistory is committed.

3. Reviewer disagreement, and the resolution

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.


4. Blocked on Ayan, raise before starting

Do not guess at these. Ask, and if answers are not available, implement the stated fallback and leave a TODO comment.

  1. Twitter/X. Does he have a handle he wants linked? If not, delete the entry entirely rather than pointing it anywhere. (Fallback: delete.)
  2. Affiliation and email. Confirm the exact public affiliation string and whether he wants a current work email, the 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.)
  3. Content he must supply, which cannot be inferred:
    • A 100 to 150 word About Me paragraph.
    • A “current research interests” list, three to five items.
    • Any talks, with venue and date.
    • Service record: program committees, journals, review load.
    • A CV PDF.

    (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.


5. Target architecture

/                     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.


6. Design system

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.

Palette

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.

Type

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 signature element

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.

Quality floor, not negotiable

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.


7. Phased implementation

P0: Remove everything that is actively wrong

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

P1: Data layer

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.

P2: Information architecture

# 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

P3: Design

# 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

P4: Performance and SEO

# 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  

P5: Build and CI

# 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

8. Data schemas

_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:

_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]

9. Verification

Run before declaring any phase complete.

Automated

Manual


10. Out of scope

Named so they do not get picked up opportunistically: