Migration: Project Site → GitHub User Site
Migration: Project Site → GitHub User Site
Migrating this academicpages (Jekyll) site from a project site served under a subdirectory to a user site served at the domain root.
| Old (project site) | New (user site) | |
|---|---|---|
| Repository | Rasikamurali/Rasikamurali.github.io | Rasikamurali/Rasikamurali.github.io |
| Production URL | https://rasikamurali.github.io/Rasikamurali.github.io/ | https://rasikamurali.github.io/ |
baseurl | "" | "" (unchanged) |
The repository name must be exactly rasikamurali.github.io for GitHub Pages to serve it at the root of https://rasikamurali.github.io/.
Changes made (code)
All internal links, asset paths, CSS/JS, the CV iframe, favicons, and the sitemap page already use the theme’s base_path helper (derived from site.url + site.baseurl), so correcting site.url fixes every path at once. No hard-coded subdirectory paths existed anywhere except _config.yml.
_config.ymlurl→https://rasikamurali.github.io(was the old subdirectory URL).repository→Rasikamurali/Rasikamurali.github.io(new repo name; drivessite.githubmetadata).baseurl→ left""(correct for a root-served user site).description→ updated to a research-focused summary (also the SEO/OG fallback).og_description→ set to the provided research description (Open Graph fallback).og_image→ intentionally left blank (setting it makes the theme emit a misleadingOrganizationJSON-LD; the share image +Personschema are set in custom head instead).
_includes/seo.html— added support for a per-pageseo_titlefront-matter key that fully overrides the<title>(falls back to the theme’s default behavior otherwise). Non-invasive: only pages that setseo_titleare affected._pages/about.md(homepage) — added front matter:seo_title: "Rasika Muralidharan | LLM Multi-Agent Systems, Social Norms, and AI Safety"description:a grounded research summary for the meta description / OG / Twitter card.- Visible page content and design are unchanged.
_includes/head/custom.html- Added a default
og:image, andtwitter:card/twitter:title/twitter:description/twitter:image(the theme only emitted Twitter tags when a Twitter username was set). - Added a homepage-only schema.org
PersonJSON-LD block. Every field is grounded in_config.ymlor the info provided (name,jobTitle, affiliations,knowsAboutresearch areas,description,email, andsameAs: Google Scholar, GitHub, Bluesky). No awards, extra titles, or profiles were invented. - Changed the one favicon line that used a root-absolute path (
/images/favicon.ico) to usebase_pathfor consistency.
- Added a default
robots.txt(new, repo root) — allows all crawlers and points to the sitemap:User-agent: * Allow: / Sitemap: https://rasikamurali.github.io/sitemap.xml
Not changed (already correct)
- Sitemap — generated automatically by the
jekyll-sitemapplugin at/sitemap.xml. - Navigation (
_data/navigation.yml) — already uses root-relative URLs (/publications/, etc.). - Favicons — already present in
images/and referenced in custom head. - No
noindexdirective exists anywhere in the site.
Local build / validation command
The project builds with Jekyll via the included Docker/devcontainer setup (no local Ruby needed):
# Option A — Docker Compose (serves at http://localhost:4000)
docker compose up
# Option B — VS Code: "Reopen in Container" (uses .devcontainer), then it serves automatically
# Option C — local Ruby toolchain
bundle install
bundle exec jekyll build # production build into _site/
bundle exec jekyll serve -l -H localhost # live preview at http://localhost:4000
Note:
_config.ymlchanges are not hot-reloaded — restart the server after editing it.
In this migration, _config.yml (YAML) and the new Person JSON-LD were validated as well-formed; the full Jekyll build must be run in the devcontainer/Docker or with a local Ruby install, as no Ruby toolchain was available in the editing environment.
GitHub Pages deployment steps
This site uses GitHub Pages’ native Jekyll build (no custom Actions deploy workflow — the only workflow, scrape_talks.yml, just scrapes talk data).
- ✅ Done — the repository was renamed on GitHub to
Rasikamurali.github.io(Settings → General → Repository name). GitHub serves the Pages host in lowercase, so the site URL is stillhttps://rasikamurali.github.io/. - Update your local remote to match:
git remote set-url origin https://github.com/Rasikamurali/Rasikamurali.github.io.git - Commit and push these changes to the default branch (
master). - Settings → Pages: set Source = Deploy from a branch, Branch =
master(ormain), folder =/ (root). - Wait for the Pages build to finish, then load https://rasikamurali.github.io/.
- (Optional) The old project URL will 404 after the rename. GitHub auto-redirects the old repo name to the new one for git operations, but not for Pages URLs.
Google Search Console
- Go to https://search.google.com/search-console and add a property.
- Easiest: URL prefix property for
https://rasikamurali.github.io/.
- Easiest: URL prefix property for
- Verify ownership using the HTML tag method: Search Console gives a
google-site-verificationcontent string. Paste it into_config.yml:google_site_verification : "YOUR_TOKEN_HERE"(The theme already renders this meta tag when the value is set — see
_includes/seo.html.) Commit, push, wait for deploy, then click Verify. - Submit the sitemap: in Search Console → Sitemaps, submit
sitemap.xml(full URLhttps://rasikamurali.github.io/sitemap.xml).
Request indexing
- In Search Console, use the URL Inspection tool: enter
https://rasikamurali.github.io/, then click Request Indexing. Repeat for key pages (/publications/,/cv/,/talks/). - Indexing is not instant — allow days to weeks.
Verify the canonical URL
- Load the homepage, View Source, and confirm:
<link rel="canonical" href="https://rasikamurali.github.io/"> <title>Rasika Muralidharan | LLM Multi-Agent Systems, Social Norms, and AI Safety</title> <meta property="og:url" content="https://rasikamurali.github.io/"> - Confirm the canonical does not contain
/rasikamuralidharan.github.io/. - Validate the structured data at https://validator.schema.org/ or https://search.google.com/test/rich-results (paste the live URL) and confirm the
Personentity is detected with the expected fields. - Confirm no
noindex:curl -s https://rasikamurali.github.io/ | grep -i noindexreturns nothing. - Confirm
robots.txt: openhttps://rasikamurali.github.io/robots.txt.
Test for broken links
After deploy, run a link checker against the live site:
# html-proofer against the built _site (run in the devcontainer / with Ruby)
bundle exec htmlproofer ./_site --disable-external
# or a crawler against the live URL
npx linkinator https://rasikamurali.github.io/ --recurse
# or
npx broken-link-checker https://rasikamurali.github.io/ -ro
Pay special attention to: the CV PDF iframe (/files/cv.pdf), navigation links, publication/talk links, the profile image, and favicons.
Assumptions
- GitHub username is
rasikamurali; the repo will be renamed torasikamurali.github.ioand served at the root. (The current git remote owner isRasikamurali; GitHub owner names are case-insensitive.) - Default branch is
master(current) — adjust the Pages source if you switch tomain. - The Bluesky
sameAsURL was derived from the handle in_config.yml(https://bsky.app/profile/rasikamurali.bsky.social). Correct it if your handle differs. orcid/pubmedin_config.ymlare still template placeholders and were excluded from the structured data (not invented). Fill them in and add tosameAswhen ready.
