CLAUDE.md — ValpoMEBE

CLAUDE.md — ValpoMEBE

Project Overview

Static site for the Valparaiso University Mechanical Engineering & Bioengineering department. Hosted on GitHub Pages at valpomebe.github.io. Built with Jekyll — no npm, no build tools, no JS frameworks.

Tech Stack

Dev Server

The dev config uses baseurl: "/dev" so all pages are served at /dev/... in development.

bundle exec jekyll serve --config _config.yml,_config.dev.yml

The .claude/launch.json is configured for preview_start with the jekyll-dev server on port 4000.

Gotcha: Stale Ruby processes can hold port 4000. Kill with taskkill //F //IM ruby.exe if the server won’t start.

File Structure

_config.yml              # Production config (baseurl: "")
_config.dev.yml           # Dev overrides (baseurl: "/dev")
_data/
  courses/                # Course catalog — split by subject (me.yml, ge.yml, etc.)
                          #   Each entry: id, code, title, credits, tags, prereqs, coreqs, desc
                          #   Used by: degree map, prereq web, transcript audit matching
  curriculum/             # Per-program semester placements (flat map: course_id → semester)
                          #   Controls which courses appear in a program's degree map/timeline
                          #   Used by: degree map rendering, transcript audit timeline view
    me.yml                # ME semester layout
    be_biomech.yml        # BE Biomechanical semester layout
    be_bioelec.yml        # BE Bioelectrical semester layout
    be_biomed.yml         # BE Biomedical semester layout
    music_ba.yml          # Music BA semester layout (for degree map timeline)
    physics_bs.yml        # Physics BS semester layout
    # Also: ce.yml, cpe.yml, ee.yml, ene.yml, math_bs.yml, cs_bs.yml, chemistry_bs.yml
  major_reqs/             # Requirements definitions for non-engineering majors
                          #   Defines complex requirements (repeatable courses, applied credits,
                          #   track options) that curriculum files can't express
                          #   Used by: transcript audit requirements view, Excel export
    music_ba.yml          # Music BA requirements (musicianship, performance, tracks)
  aliases/                # Course code mappings and department renames
    course_aliases.yml    #   Maps transcript codes to course IDs (lab bundling, honors subs)
    department_renames.yml #   Maps old dept prefixes to new (STAT → DATA)
    world_languages.yml   #   List of world language department codes
  minors/                 # Minor program definitions (15 minors)
                          #   Each: id, name, min_credits, requirements[]
                          #   Used by: transcript minor audit
  cc_scholar.yml          # Christ College Scholar requirements
  transcript/             # Approved elective lists (from Undergraduate Catalog 2025-2026)
    me_electives.yml      # ME technical elective approved courses
    be_electives.yml      # BE technical elective approved courses
    humanities.yml         # Approved Humanities courses
    social_sciences.yml    # Approved Social Sciences courses
    cultural_diversity.yml # Approved Cultural Diversity courses
    world_languages.yml    # World Language courses (102+ level)
    theology.yml           # Theology/Religious Studies courses
    professional_electives.yml # ME professional elective approved courses
_includes/
  inject-courses.html     # Shared include: aggregates courses + merges curriculum data
  degree-map/             # Degree map page partials (flowchart, detail-panel, etc.)
  transcript/             # Transcript audit page partials (upload, results)
_layouts/
  degree-map.html         # Degree map layout (uses inject-courses.html)
  transcript.html         # Transcript audit layout (uses inject-courses.html)
_pages/
  curriculum.html         # Degree map page (/curriculum/)
  transcript.html         # Transcript audit page (/transcript/)
assets/
  js/
    degree-map.js         # Degree map rendering, arrows, selection, zoom
    transcript-audit.js   # Audit engine: matching, elective grouping, arrows, panel
    transcript-parser.js  # PDF text extraction, course parsing, retake resolution
  css/
    degree-map.css
    transcript.css
    style.css             # Shared site styles
ReferenceDocuments/
  Undergraduate Catalog 2025-2026.pdf  # Source for all curriculum data

Key Concepts

courses/ (Course Catalog)

Split by subject into _data/courses/*.yml. Each entry has: id, code, title, credits, tags, prereqs, coreqs, desc, and optionally isPlaceholder, eligible, offered.

curriculum/ (Semester Placements)

Per-program files in _data/curriculum/ map course IDs to semester numbers (1–8). Each program has its own file (me.yml, be_biomech.yml, be_bioelec.yml, be_biomed.yml). To move a course to a different semester, edit the number in the relevant curriculum file. The shared include _includes/inject-courses.html merges these into COURSES[id].semesters[program] at build time.

Elective Groups (Transcript Audit)

Multiple placeholder course slots (e.g., 4× ME Elective) are combined into a single grouped tally card. Defined in ELECTIVE_GROUPS in transcript-audit.js. Each group has:

Data Injection (Liquid → JS)

The shared include _includes/inject-courses.html aggregates all course files and merges curriculum semester placements, providing COURSES_ARRAY and COURSES globals. Layouts add page-specific globals (SEMESTERS, ELECTIVE_DATA, etc.) in separate script blocks.

Transcript Parser

Client-side PDF parsing using pdf.js. Uses y-coordinate bucketing to reconstruct table rows from position-aware text items. Handles retakes (best passing grade wins), W (withdrawal) exclusion, and code aliasing (e.g., CORE 110VUE_101).

Programs & Tracks

Lab Bundling

Lab courses on transcripts are bundled with their lecture course in courses.yml via CODE_ALIASES:

Reading the Catalog PDF

The reference document ReferenceDocuments/Undergraduate Catalog 2025-2026.pdf (1299 pages) is the source of truth for all curriculum data. The built-in PDF reader does NOT work on Windows (missing pdftoppm). Use Python with PyMuPDF (fitz) instead:

import fitz
doc = fitz.open('G:/GitHubProjects/valpomebe.github.io/ReferenceDocuments/Undergraduate Catalog 2025-2026.pdf')
# Read specific pages (0-indexed)
page = doc[276]  # page 277
print(page.get_text())
# Search for content
for i in range(doc.page_count):
    if 'Physics, B.S.' in doc[i].get_text():
        print(f'Found on page {i+1}')
        break

Conventions

Working with the user