CLAUDE.md — tyrealq.github.io

CLAUDE.md — tyrealq.github.io

Owner & Site Identity

  • Q = Dr. Yizhou (Tyreal) Qian 钱亦舟, Assistant Professor at Indiana University Bloomington
  • Site title: “Dr. Q”
  • Author display: “Yizhou (Tyreal) Qian” with Chinese name 钱亦舟
  • Email: tyqian@iu.edu
  • Research focus: sport management, esports, NLP/AI, computer vision, datasets, agent skills
  • Academic profiles: Google Scholar, ORCID, GitHub, YouTube, LinkedIn
  • Avatar: images/Ty.png

Build & Serve

# Local development (requires Ruby + Bundler)
bundle install
bundle exec jekyll serve -l -H localhost

# Docker alternative
docker build -t academic-pages .
docker run -p 4000:4000 -v $(pwd):/usr/src/app academic-pages

# Rebuild JS assets (requires Node.js)
npm install
npm run build:js        # one-time bundle
npm run watch:js        # watch mode

Site serves at http://localhost:4000. Changes to _config.yml require a server restart.

The system Ruby (2.6) cannot resolve the github-pages gem (it needs Ruby 3); install Homebrew Ruby first (brew install ruby, put /opt/homebrew/opt/ruby/bin first on PATH, then bundle install). A production check is JEKYLL_ENV=production bundle exec jekyll build; the production config sets the absolute site url, so a local build loads the live stylesheet unless url is overridden.

Homebrew now installs Ruby 4, and github-pages still pins Jekyll 3.9 and Liquid 4.0.3, so a local build needs two workarounds kept outside the repo: a separate Gemfile (selected with BUNDLE_GEMFILE) that runs eval_gemfile on the repo Gemfile and adds csv, base64, bigdecimal, logger, and ostruct, which Ruby 4 no longer bundles; and a small Ruby file loaded through RUBYOPT=-r<path> that defines Object#tainted?, taint, and untaint as no-ops, since Liquid 4.0.3 calls methods Ruby removed. Never commit either to the repo; GitHub Pages builds with its own Ruby.

Architecture

Theme: Academic Pages (fork of Minimal Mistakes)Markdown: Kramdown with GFMPlugins: jekyll-feed, jekyll-sitemap, jekyll-paginate, jemoji

Collections (defined in _config.yml)

CollectionDirectoryPermalinkDescription
publications_publications//publications/:path/Journal articles, conference papers
talks_talks//talks/:path/Podcasts and teaching demos
portfolio_portfolio//portfolio/:path/AI-generated art / fun stuff
teaching_teaching//teaching/:path/Course materials (placeholder)
posts_posts//:categories/:title/Blog posts (placeholder)

Key Directories

  • .claude/ — Claude Code project config: settings.json (SessionStart hook), hooks/session-note.sh (session dashboard)
  • _pages/ — Static pages (about, cv, archive pages); explicitly included via _config.yml
  • _includes/ — Reusable HTML partials (author profile, header, footer)
  • _layouts/ — Page templates (single, talk, etc.)
  • _sass/ — SCSS stylesheets (compressed output); _dark.scss holds the dark-theme override layer
  • _data/navigation.yml — Header navigation links and order
  • _drafts/ — Unpublished content
  • images/ — Site images
  • files/ — Downloadable files (PDFs), self-hosted standalone HTML pages (SMQ_timeline.html and SMQ_cited_works.html, each iframed from its own talk entry), and files/greeting/ (the rendered homepage greeting video: greeting.mp4, greeting.webm, poster.jpg, plus portrait.jpg for the HTML end card) and files/journey/ (the rendered career-path video with its music, embedded with sound by _portfolio/01_Journey.md: journey.mp4, journey.webm, poster.jpg; source in ~/Dropbox/1CV/Brands_Qian/animation/journey/, never edited here)
  • assets/js/ — JavaScript; main.min.js is the bundled output

Dark Mode

The site supports a light/dark theme toggle (sun/moon button in the masthead, right side):

  • _includes/head.html — inline script applies the saved theme before paint; light is the default, and data-theme="dark" is set on <html> only when the visitor previously chose dark
  • _includes/masthead.html — #theme-toggle button
  • _includes/scripts.html — inline handler flips data-theme, persists the choice to localStorage (theme), and swaps the icon
  • _sass/_dark.scss — [data-theme="dark"] override layer, imported last in assets/css/main.scss; it also recolors the sidebar GitHub icon to the dark text color, since GitHub’s near-black brand color (#171516) disappears on the dark background

Greeting Animation

The homepage plays a short code-rendered greeting video (about 30 s, muted, 16:9) directly under the welcome paragraph, then shows an HTML end card with the real links. It follows the same pattern as the theme toggle: markup in an include, a guarded vanilla IIFE in _includes/scripts.html, an SCSS partial, no build step. Both renders carry BT.709 limited-range color tags (--color-space bt709) so the stage matches the HTML end card in every browser.

  • Source: ~/Dropbox/1CV/Brands_Qian/animation/greeting/ (a Remotion project documented in its README.md). The site repo holds only the rendered outputs and the embed. Never edit the video here.
  • Outputs: files/greeting/greeting.mp4, files/greeting/greeting.webm, files/greeting/poster.jpg (poster is the 7.5 s frame, since nothing has entered at frame 0); files/greeting/portrait.jpg is the square studio portrait used by the HTML end card
  • _includes/greeting.html: .greeting wrapper: a 16:9 box (aspect-ratio: 16 / 9, so the page never shifts) holding the <video> (MP4 then WebM sources; H.264 first because every browser decodes it in hardware, muted playsinline preload="metadata", no autoplay attribute) and the replay button, plus the end card .greeting__end (white card, portrait with crimson ring, Dr. Q and 钱亦舟, crimson rule, affiliation caption, Explore., two rows of pill links: CV, Research Highlights, Featured Talks, Fun Stuff; GitHub, Hugging Face, OSF, YouTube). about.md places it with `<div class="greeting">

</div> `.

  • _includes/scripts.html: the IIFE exits when .greeting is absent. On every page load it calls video.play() (muted autoplay; the user wants it to play on each visit, so there is no once-per-session flag). If prefers-reduced-motion: reduce matches, or play() rejects, it shows the end card and does not play. On ended it reveals the end card with a short fade (class greeting--ended). The replay button hides the card, seeks to 0, and plays again. The code carries no explanatory comments; any comment added to this script must be /* */, because production compress_html breaks // comments.
  • _sass/_greeting.scss: imported in assets/css/main.scss immediately before _dark.scss. At 600 px and wider the end card is an overlay inside the box, sized in container query units (cqw) from the 1920 px frame with the frame’s own margins (5 % top and bottom, 10 % left and right) and the corner Dr. Q mark; below 600 px it renders as a block directly under the video with fixed sizes and wrapping pills, and only the replay control stays in the box corner. _dark.scss recolors only the frame border; the video and end card keep their light colors by design.
  • Update: re-render in the source project (npx remotion render there), then copy the three files into files/greeting/. Edit copy, timing, or links in the source project’s story.ts; the end-card link labels and URLs in greeting.html must match its last take.

Content Generation Pipeline

markdown_generator/ contains Python scripts and Jupyter notebooks that convert TSV data into Markdown collection files:

  • publications.tsv → publications.py / publications.ipynb → _publications/*.md
  • talks.tsv → talks.py / talks.ipynb → _talks/*.md
  • PubsFromBib.ipynb / OrcidToBib.ipynb — Import from BibTeX/ORCID

Session Dashboard

.claude/hooks/session-note.sh runs at session start (registered in .claude/settings.json) and prints a summary of the site’s work streams: the last three commits and how long ago they were, uncommitted or unpushed changes (deploy status), content counts with the most recent date per collection, any future-dated items that Jekyll will not render yet, drafts, and project skills. Every figure is computed from the folder and git history at run time, so the dashboard never needs editing. Publication dates in “Month YYYY” format are normalized to ISO for sorting and comparison.

Header links (defined in _data/navigation.yml):

LabelURLMaps to
Curriculum Vitae/cv/_pages/cv.md
Research Highlights/publications/_pages/publications.html
Featured Talks/talks/_pages/talks.html
Fun Stuff/portfolio/_pages/portfolio.html

Homepage: _pages/about.md (permalink: /)

The homepage, CV, Resources & Publications, and Outreach & Presentations pages all use the default single layout (no layout: line), so they share one design and each ## section heading gets the layout’s underline. Sections are separated by that underline alone; do not add --- dividers between them. _sass/_archive.scss removes the right-side padding of .list__item inside .page__content, so the publication and talk listings use the full column. Published Research lists journal articles and then conference papers (the order of publication_category in _config.yml) with no category headings. The talks page has two ## sections written into the page, Public Outreach and then Academic Presentations, each listing the talks with that category newest first.

Content Inventory

Publications (_publications/) — 10 files, ALL ACTIVE

FileTitle (short)VenueCategoryDate
B50.mdTrump’s Break 50 YouTube appearanceNASSM 2025, San Diegoconferences2025-05
CS_Olympics.md2022 Beijing Winter Olympics tweets on XCommunication & Sportmanuscripts2024-07
ESMQ_esports.mdEsports spectator motivation scale (MSES)European Sport Management Quarterlymanuscripts2020-06
HICSS58.mdEsports at 2023 Asian Games (BERTopic + GPT-4)HICSS-58, Big Island, HIconferences2025-01
JBR_gamification.mdGamification in esports livestreamingJournal of Business Researchmanuscripts2022-06
JRCS_Trump.mdHuman-AI analysis of Trump Break 50Journal of Retailing and Consumer Servicesmanuscripts2026-01
JSM_TS.mdTaylor Swift & NFL Instagram analysisJournal of Sport Managementmanuscripts2026-01
SMR_costream.mdTwitch TNF co-streamingSport Management Reviewmanuscripts2021-07
SMR_experience.mdLLM for stadium review sentiment (GPT-3.5 + RoBERTa)Sport Management Reviewmanuscripts2024-08
Smithsonian.mdAutomated ball-strike system fan reactionsSports Technology Symposium, Washington DCconferences2024-10

Publication categories in _config.yml: Books, Journal Articles (manuscripts), Conference Papers (conferences).

Talks (_talks/) — 18 files, ALL ACTIVE

Each talk’s category front matter places it in one of the two sections of the talks page: outreach (Public Outreach) or presentations (Academic Presentations).

Public Outreach (13): podcast episodes (YouTube video discussions of Q’s research), QLearning tutorials, and self-hosted interactive figures.

Podcast episodes (7):

FileTitle (short)Related publicationDate
Podcast_ABS_MLB.mdRobo-Umps: baseball authenticity on RedditSmithsonian.md2024-11-01
Podcast_B50.mdThe Break 50 PhenomenonB50.md / JRCS_Trump.md2025-09-30
Podcast_EXP.mdCollege football game day experienceSMR_experience.md2024-09-27
Podcast_HICSS58.mdEsports at 2023 Asian Games on XHICSS58.md2024-10-30
Podcast_Olympics.md2022 Beijing Winter Olympics on XCS_Olympics.md2024-10-28
Podcast_TS_NFL.mdNFL’s Swift-Kelce Instagram strategyJSM_TS.md2024-11-14
Podcast_Twitch.mdTNF co-streaming on TwitchSMR_costream.md2021-06-16

QLearning tutorials and interactive figures (6):

FileTitle (short)FormatDate
Teaching_Agents.mdQLearning: From Chatbots to AgentsYouTube tutorial2026-03-04
Teaching_LLM101.mdQLearning: LLM 101 (GPT-4o in Colab)YouTube tutorial2025-04-04
Teaching_NLP.mdQLearning: NLP 101 (sentiment analysis)YouTube tutorial2025-03-03
Teaching_TS_NFL.mdQLearning: Swift-Kelce Instagram case studyYouTube tutorial + slides2024-12-02
Interactive_SMQ_Timeline.mdInteractive Visualization: Intellectual lineage of SMQ, 1999 to 2026 (citation timeline; manuscript in preparation)Self-hosted interactive HTML (files/SMQ_timeline.html)2026-09-14
Interactive_SMQ_Cited_Works.mdInteractive Visualization: What SMQ cites beyond itself, 1999 to 2026 (cited works; companion to the timeline)Self-hosted interactive HTML (files/SMQ_cited_works.html)2026-09-17

Academic Presentations (5): conference presentations, workshops, and symposium talks.

FileTitle (short)FormatDate
MMAB_AMA.mdAMA Presentation: Athlete branding via adaptive multimodal strategies (MMAB)Canva slides2026-07-25
Teaching_NASSM_TGL.mdNASSM Presentation: TMRW Golf League pre-launch video analyticsCanva slides2026-05-29
Teaching_SMA_HAI.mdSMA Symposium: Human-AI CollaborationCanva slides + GitHub repo2025-10-23
Teaching_NASSM_NLP.mdNASSM Workshop: NLP4ALL (Zeigler Lectures)Canva slides + GitHub repo2025-05-29
Teaching_NASSM_AI.mdNASSM Conversations: Applied AI in Sport MgmtCanva slides2025-03-03

Portfolio (_portfolio/) — 8 files, ALL ACTIVE

AI-generated art and creative projects. The gallery (_pages/portfolio.html) lists entries in filename order, so each file starts with a two-digit number that sets its place; the web address comes from each file’s permalink, so renumbering does not change it.

FileTitleToolImage(s)
01_Journey.mdFrom Sanming to Bloomington: A Career Journey (68 s bilingual animation of the same six cities, with one instrumental song per city)Claude Opus 5.5 + Remotion (code-rendered video)Journey.jpg teaser; video in files/journey/
02_City.md3D City Landmark Weather VisualizationNano Banana ProSM_FJ.jpeg, XM_FJ.jpeg, SH.jpeg, Athens_GA.jpeg, BR_LA.jpeg, Bloomington_IN.jpeg
03_Logo_Q.mdBrand Logos for Dr. QIdeogram + CanvaLogo_Q.png, Logo_Q_SB.png, and variants (_B, _Horizontal, _OB, _W)
04_Sticker_Q.mdSocial Sticker (chibi LINE-style)Nano Banana ProTy_Q_EN.jpeg, Ty_Q_CN.jpeg
05_Tracy_cute.mdWhispers of Dawn in Tracy’s SmileComfyUI-InstantIDTracy_cute1.png
06_Ty_football.mdTyreal’s Gridiron DreamComfyUI-InstantIDQ.png
07_XL.mdXiaoli’s Radiant Moment: Portrait of a MotherComfyUI-InstantIDXL.png
08_XSP.mdSiping’s Poem: Portrait of a FatherComfyUI-InstantIDSP8.png

Teaching (_teaching/) — 2 files, PLACEHOLDER (theme template)

FileNotes
2014-spring-teaching-1.mdTemplate from Academic Pages theme
2015-spring-teaching-2.mdTemplate from Academic Pages theme

Blog Posts (_posts/) — 5 files, PLACEHOLDER (theme template)

FileNotes
2012-08-14-blog-post-1.mdTemplate
2013-08-14-blog-post-2.mdTemplate
2014-08-14-blog-post-3.mdTemplate
2015-08-14-blog-post-4.mdTemplate
2199-01-01-future-post.mdTemplate (future-dated)

Pages (_pages/) — 18 files

Active pages:

| File | Permalink | Purpose | |—|—|—| | about.md | / | Homepage — bio, greeting animation (`<div class="greeting">

</div> ` under the welcome paragraph), “Join Our Team” PhD recruiting section (lab members, a paragraph on assistantship funding, teaching, resources, and publication expectations, and five questions for prospective students), visitor map under its own “Visitors Around the World” header (MapMyVisitors script at the end of the page) | | cv.md | /cv/ | Academic CV — appointments, education, work in progress, skills | | publications.html | /publications/ | “Resources & Publications” page (menu label: Research Highlights): an “Open Resources” section (five research areas, each technique or task linked inline to a research resource: a GitHub repo, a Hugging Face dataset, a paper, or a q-skills subskill; teaching materials are linked only where the text is about teaching; written in markdown inside a Liquid capture passed through markdownify), then “Published Research” (Google Scholar link and the listing) | | talks.html | /talks/ | “Outreach & Presentations” page (menu label: Featured Talks): “Public Outreach” and “Academic Presentations” sections | | portfolio.html | /portfolio/ | Portfolio gallery | | teaching.html | /teaching/ | Teaching listing | | 404.md | /404.html | Custom 404 page | | sitemap.md | /sitemap/ | HTML sitemap | | terms.md | /terms/ | Terms and privacy |

Archive generators:

FilePurpose
category-archive.htmlPosts by category
collection-archive.htmlAll collections
page-archive.htmlAll pages
tag-archive.htmlPosts by tag
year-archive.htmlPosts by year
talkmap.htmlTalk locations map (disabled via talkmap_link: false)

Template / unused:

FileNotes
archive-layout-with-content.mdTheme example page
markdown.mdMarkdown formatting guide
non-menu-page.mdTheme example of a non-nav page

Images Directory

All images live in images/. Grouped by purpose:

Research infographics (used in publications):

  • B50.png, B50_INFO.jpeg — Break 50 / Trump golf
  • WG_INFO.jpeg — Winter Olympics / Games
  • ESPORTS_INFO.jpg — Esports spectator motivation
  • ESPORTS_GAMIFICATION_INFO.jpg — Gamification in esports
  • EXP_INFO.jpeg — Stadium experience / LLM
  • TS_INFO.png — Taylor Swift & NFL
  • TWITCH_SPORTS_INFO.jpg — Twitch co-streaming

Teaching demo thumbnails:

  • LLM101.png — LLM 101 tutorial
  • NLP4ALL.png — NLP4ALL workshop
  • QLearning101.png — QLearning series

Portfolio / portraits:

  • Q.png — Tyreal football portrait
  • Tracy_cute1.png — Tracy portrait
  • XL.png — Xiaoli portrait
  • SP8.png — Siping portrait
  • Ty_Q_EN.jpeg, Ty_Q_CN.jpeg — Stickers (English/Chinese)

Brand logos:

  • Logo_Q.png, Logo_Q_B.png, Logo_Q_Horizontal.png, Logo_Q_OB.png, Logo_Q_SB.png, Logo_Q_W.png

City weather visualizations:

  • SM_FJ.jpeg (Sanming), XM_FJ.jpeg (Xiamen), SH.jpeg (Shanghai), Athens_GA.jpeg, BR_LA.jpeg (Baton Rouge), Bloomington_IN.jpeg

Site assets (theme defaults):

  • Ty.png — Author avatar (sidebar)
  • bio-photo.jpg, bio-photo-2.jpg, profile.jpg — Stock/theme bios
  • site-logo.png, homepage.png — Site branding
  • favicon.ico, safari-pinned-tab.svg, browserconfig.xml, manifest.json, mstile-*.png — Favicon/PWA
  • 500x300.png — Default teaser
  • Other theme stock images: foo-bar-identity*.jpg, editing-talk.png, paragraph-*.png, image-alignment-*.jpg, 3953273590_704e3899d5_m.jpg

Configuration Files

FilePurpose
_config.ymlSite metadata, author info, collections, plugins, publication categories, defaults
_data/navigation.ymlHeader nav links: CV, Research Highlights, Featured Talks, Fun Stuff
GemfileRuby deps (jekyll, github-pages, webrick)
package.jsonNode deps for JS bundling (jquery, fitvids, magnific-popup)
DockerfileDocker build for local dev

Content Workflow

Add a new publication:

  1. Create _publications/<slug>.md with YAML front matter: title, collection: publications, category (manuscripts/conferences/books), permalink, excerpt, date, venue, optionally paperurl
  2. Add an infographic image to images/ if needed, reference with <img src='/images/...'>
  3. Or: add a row to markdown_generator/publications.tsv and run publications.py

Add a new talk (podcast, teaching demo, or interactive demo):

  1. Create _talks/<Podcast_or_Teaching>_<slug>.md with front matter: title, collection: talks, category (outreach or presentations; a talk without it does not appear on the talks page), excerpt, type: "Talk", permalink, date
  2. Embed YouTube iframe or Canva slides in the body
  3. For a self-hosted interactive page: put the self-contained HTML in files/ with no front matter (Jekyll copies it verbatim; front matter would trigger Liquid and layouts), then embed it with a fixed-height iframe (height: 85vh; min-height: 640px) plus an “open in a new tab” link. fitvids only wraps YouTube/Vimeo, so the iframe carries its own sizing. The SMQ pages are copied from the SMA25 project (~/Dropbox/2026 Fall/SMA25, manuscript/figures/<name>/) with the outreach rewording recorded in that project’s outreach/README.md; edit them there and re-copy, never here

Add a portfolio item:

  1. Create _portfolio/<slug>.md with front matter: title, excerpt (include thumbnail img tag), collection: portfolio, permalink
  2. Add images to images/, reference in body

Update the homepage greeting video:

  1. Edit and re-render in ~/Dropbox/1CV/Brands_Qian/animation/greeting/ (see Greeting Animation above); never edit the video in this repo
  2. Copy outputs/greeting.mp4, outputs/greeting.webm, and outputs/poster.jpg from that project into files/greeting/
  3. If the end card’s links or labels changed, update _includes/greeting.html to match

Deployment

Push to master branch. GitHub Pages builds and deploys automatically.