Repository navigation
Releases
Releases · royh1122/academic-project-page-skill
v1.4.1
Fixes
- Link contrast on tinted bands: links in running text used Bulma's blue (
#3273dc), which is 4.3:1 on the tinted section background, below WCAG AA. They now use the theme's#2563eb(4.7:1 or better on every background). Found by the held-out eval and an earlier Codex run. check_numbers.pyandcheck_links.py: a page with no source files is now an error incheck_numbers.py(it used to print its help and exit 0), and a missing page or source file gives a one-line error instead of a traceback. Newer PyMuPDF no longer prints a deprecation warning.style-fidelity.mdnamed a Font Awesome class for the award icon; it now points to the bundled SVG icons.
Behaviour
- BibTeX as given: the user's entry is shown unchanged; corrections are suggested in the report.
- After a Build, the report says how to publish: repository Settings, then Pages, deploying from the branch and folder that hold the page. The agent still never publishes by itself.
- Preview servers: the report says whether the preview server is still running, and the agent stops any other server it started.
check_links.py --allownever takes the page's own links: without source files, the links are reported as unverified.- One affiliation, no superscripts: the template's author block says to drop the number superscripts when every author shares one affiliation.
- Description: now also covers asking whether a project page is ready to publish or whether its links and buttons work. In the activation eval, the skill triggered on all 18 matching requests (17 before) and still on none of the 18 near misses.
Maintenance
check_numbers.pyandcheck_links.pyshare one source reader (scripts/source_files.py) and useargparse; their output is otherwise unchanged.- The check scripts' headers no longer mention a
playwright-cli run-coderoute that the skill does not use. - CI checks that the theme tokens in
style-fidelity.md,index.cssandtheme-profile.jsonagree (evals/check_theme_tokens.py).
Tested
- Antigravity with Gemini: a build and a polish of the evaluation kit passed the browser audit, on a par with Claude Code. Install there through
npx skills add. - New test material: a held-out evaluation kit from a different kind of project (H1, a gated dataset with a benchmark, eval 15), a fixture with defects only in CSS and JavaScript (flawed-v4, eval 16), and an activation eval (
evals/activation.json,evals/check_activation.py). - Eval round 14 (all core evals and the held-out kit with and without the skill): no regressions against the previous rounds.
v1.4.0
The audit scrolls, tabs and taps through the page. New checks, all warnings, each ending with its fix:
- Covered or cut-off text: a heading or caption with another element on top of it (
text-covered); an in-page jump (the Contents menu, a skip link) that lands its heading under a fixed bar becausescroll-padding-topis missing (anchor-covered); text cut off by a box with a fixed height and hidden overflow, such as an abstract squeezed into a "read more" box with no button (text-clipped). - Text hidden under reduced motion: content a scroll-reveal animation never shows to visitors who prefer reduced motion (
hidden-reduced-motion). - Focus under a fixed bar: a control that keyboard focus moves to ends up mostly covered by a fixed or sticky header or banner (
focus-covered, WCAG 2.4.11). The audit replays Tab down and Shift+Tab up the page with the least scrolling, as most browsers do. - Small tap targets: links and buttons under 24 x 24 px with other targets within reach (
target-small, WCAG 2.5.8); inline links in running text are exempt. - Blank bands and uneven margins: an empty stretch taller than half a screen, such as a video wrapper left after its embed was removed (
blank-band); a section whose column sits off-centre (margin-uneven). - Serving problems: dev-server markup such as a Vite client script left in the page (
dev-server); a page audited at/whose canonical URL names a repository subpath (wrong-base); a doubled<body>or<head>in the source, which browsers merge silently, so a second skip link shows (malformed-source).
Easier to act on and compare
- Finding ids and a summary line: every finding prints as
FAIL [id]orWARN [id], and the run ends withSummary: FAIL n / WARN m: ids. A report cites a defended warning by its id. - Slice guide: the screenshot list names the sections each slice shows (
page-1440-03.png: Video (cont.), Method), so a finding can be matched to the slice that shows it. - Screenshots after scrolling: the audit scrolls through the page once before each set of screenshots, so scroll-revealed content is not blank in them.
check_links.py --allowis for links the user gave in the chat only, never to quiet the check.
Tested
- flawed-v3 fixture: ten planted defects, one or more per new check, built by
eval-kit/fixtures/make_flawed_page_v3.py. The audit reports all ten. flawed-v2's carousel gap is now caught too (5 of its 10 defects by the audit; the rest still need looking). - Coverage in CI:
evals/check_fixtures.py --coveragefails when an audit finding id has no planted flaw and no stated reason, so new checks ship with a fixture. - No false alarms: the full audit gives no findings on nine clean built pages from earlier eval rounds (current and previous template).
- Eval round 11 (core evals plus the new eval 14, Polish of flawed-v3): builds unchanged or better; scoped Polish now gives before and after counts with ids. Two problems found in the new checks during the round, a false focus warning on rounded controls and blank scroll-revealed content in screenshots, were fixed and rechecked.
v1.3.0
Lighter pages and a leaner skill
- Icons are inline SVG: the template no longer loads Font Awesome's 1.2 MB script (or the Academicons stylesheet from a CDN). Its icons are inline SVG from Font Awesome Free 6.7.2 and Academicons, about 0.5 KB each, so a built page loads 36 KB of JavaScript instead of about 1.2 MB, and icons appear without waiting for a script. The look is unchanged apart from Font Awesome 6's PDF icon.
references/icons.mdlists 35 icons for academic pages, one small file each, and explains how to take any other Font Awesome Free icon. The full library is still available when the user asks for it. - The audit fails icons that draw nothing:
<i class="fa-...">or Academicons markup with no icon font loaded is now a failure that names the icon. Existing pages that load Font Awesome are not affected, and Polish keeps them as they are. - SKILL.md is 28% shorter (2,807 to 2,013 words; its longest line is 514 characters instead of 1,390). Each rule now has one home: content truth and reporting in SKILL.md, layout and media in
layout-polish.md, theme values instyle-fidelity.md. Repeated rules, the list of every audit check, and rows that repeated the references are gone; no behaviour was dropped. - The skill folder is 73% smaller (1.64 MB to 445 KB). Maintainer material moved out: the typography-check internals and the list of defects fixed relative to APT are in
MAINTAINING.md, and the evals moved toevals/at the repository root.
Behaviour
- Coverage starts with a list of the work's main parts, and a part whose code is private is still shown from the report.
- Every screenshot slice at both widths is opened before a Build or Polish is reported; "not run" is only for a slice the audit could not make.
check_links.pyworks on a page alone: with no source files it lists the links as unverified and fails only on placeholder or empty links, so Polish and Audit can use it.- Helper scripts and temporary files the agent made are deleted before reporting.
Repository
- CI enforces a size budget: a warning when the SKILL.md body passes 2,200 words, a failure at 2,500 words or for any line over 700 characters. It also fails on icon-font markup in the template.
- Eval 13: add a button with an icon to a finished page. Eval round 10 reran evals 1-3 and 9-13 on the new skill against earlier rounds; it found two regressions from the shortening (coverage and screenshot completeness), which were fixed and confirmed in reruns.
v1.2.0
Reports you can trust
- Every check is labelled: the report says which checks passed, which ran with findings, and which did not run and why. A check that could not start, an empty result, or a skipped screenshot is "not run", never a pass. When the browser check cannot run at all, the report opens with
DEGRADED: <reason>. - Results go stale: an edit after the last check run means running it again before reporting; a blank, half-loaded, or wrong-width screenshot is retaken, not counted.
- Unverified items are named: a number traced to no source, a link the user did not give, or an optional block kept without matching material is reported as unverified instead of left out.
- Audit findings ranked P0 to P3 (blocks publishing, accessibility or interaction, layout, cosmetic), each with a way to fix it, and any question to the user last.
Polish
- Scope: "polish the teaser" touches only the teaser; other defects are listed, not fixed, and do not hold back the report.
- Pasted reviewer notes are reproduced on the live page before any fix; notes that do not reproduce are reported with what was seen, not "fixed".
- Before and after: the audit runs on the untouched page first, and the report gives both counts.
- Triage order: broken content, then accessibility, then layout, then cosmetics, each fixed at the narrowest level.
- Before you finish: a short final check per mode (Build: numbers and links traced, omissions named; Polish: nothing changed outside the named defects; Audit: nothing edited).
Build and content
- External link check: new
scripts/check_links.pylists every external link on the page (buttons, embeds, meta tags, JSON-LD) and flags any found in none of the sources, plus empty and placeholder links. arXiv, DOI and YouTube links match on their identifier; links the user gives in the chat are passed with--allow. It runs in the gate besidecheck_numbers.py. - Page brief: before filling the template, the agent writes three to five lines in its working notes (audience, takeaway, first screen, section order, why this teaser), then checks the result is not what it would produce for any paper.
- Structure only where the content has it: no numbered steps, eyebrow labels, badges, or "key contributions" boxes on content without that structure.
- Button wording: buttons say what they do or where they go, one action keeps one name, one capitalisation style.
Repository
- CI checks the release files agree: the version in
SKILL.md, the Claude Code marketplace entry and the Codex plugin must match, every manifest must point at a realSKILL.md, and the frontmatter must parse without duplicate keys. - Evals 11 and 12: a scoped Polish from pasted reviewer notes (one of which does not reproduce), and a build where the user asks for Paper, Code and Dataset buttons the materials cannot support. The audit and polish evals now expect P0-P3 findings, labelled checks and before/after counts.
v1.1.1
- Smaller plugin install: the Claude Code and Codex plugins now install only the skill folder (1.7 MB) instead of a copy of the whole repository (eval kit, examples and README media, about 26 MB). Both marketplaces point at
./skills; the Codex manifest moved toskills/.codex-plugin/plugin.json, and the Claude Code plugin's details live in its marketplace entry. - Codex plugin:
skills/.codex-plugin/plugin.jsonand.agents/plugins/marketplace.json, so Codex installs it withcodex plugin marketplace add royh1122/academic-project-page-skillandcodex plugin add academic-project-page@royh1122-skills. Tested with Codex: the skill triggered on its own, Codex asked to run the browser audit outside its sandbox, fixed the contrast issue and missing video posters the audit found, and passed it on the rerun. Unattended runs (codex exec) cannot ask, so the browser check does not run there unless the user opts in (below). - Clear error inside an agent's sandbox: when Chrome starts but its tab never answers (Chrome cannot start its own sandbox inside the agent's), the audit stops after 10 seconds and says to run it outside the sandbox, instead of exiting with only "unsettled top-level await".
SKILL.mdtells the agent to ask for that permission instead of skipping the check. A user running an agent unattended can setPAGE_AUDIT_NO_SANDBOX=1to run Chrome without its sandbox; the agent never sets it. - Interaction check no longer fails working zoom buttons: it scrolled smoothly (the template's default) and could click before the page stopped moving, reporting "a click does not open the figure viewer" for figures further down the page. It now scrolls instantly.
v1.1.0
Page and template
- Teaser shows the main finding: the visual a visitor would most want to see first, in whatever form the project has it (a result image or plot, a demo clip, a qualitative example, a screenshot of the working system). The method diagram is the teaser only when the method itself is the contribution or nothing else reads at phone width.
- Contents menu: the optional back-to-top button is replaced by a floating Contents and back-to-top pill. It builds its list from the page's
h2headings, marks the current section, closes with Esc, and follows re-themed colours. It appears after the header and steps aside while the reader scrolls down wherever it would cover the text. Keep it on long pages; delete it on short ones. - Award style: the award line is a quiet warm pill in the venue pill's shape with an optional trophy icon, instead of a red alert-style box.
- Acknowledgments: a new optional block for advisors who are not authors, funding, and data or compute providers.
- Re-theming by tokens: every colour in
index.cssandfigure-viewer.csscomes from a palette token, with new tokens for text on accent fills (--on-primary), buttons, links, strong text and the award. A dark theme or a custom accent is a:rootoverride block only;style-fidelity.mdhas the recipe. The default look is unchanged apart from the figure viewer's greys, which now match the palette.
Content rules
- Give each main part of the work comparable depth, in proportion to the sources.
- The byline lists authors only; an advisor who is not an author goes in Acknowledgments by default, in the user's wording.
- An award is verified when the awarding body says the work received, won, or was selected for it; a finalist, shortlist, nomination, or hope is not. Ambiguous wording: show nothing and ask.
Checks
- Interaction check:
audit.mjsdrives the page with real key presses and clicks: zoomable figures (open, caption, zoom, Esc, focus return), carousels (buttons, arrow keys, inert slides, dots), the BibTeX copy button, the contents and More Works menus, and a Tab pass for visible focus and traps. It tests only the components a page has. - Readable screenshots: besides the full-page shots, the audit saves screen-height slices at 1440 and 375 px (
page-<width>-NN.png,--max-slices), and a viewport shot of each embedded PDF (page-<width>-pdf<N>.png), which full-page shots leave blank. - New audit checks: a title that breaks inside a hyphenated term fails; a title ending in one word on its own line, a blank or near-black video poster, and a numeric table column aligned left are warnings.
- Reporting: a report names any screenshot or check that was skipped.
check_numbers.pyreads PDFs withpdftotextwhen PyMuPDF is not installed, and reads factors written with a trailing x ("1.36x") in sources.
Evals and examples
- A second Polish and Audit fixture,
flawed-v2, with ten defects that mostly show only when looking at the page (evals 9 and 10). The answer keys expect a result teaser for the fictional kit. - Examples rebuilt from fresh single runs on 1.1.0.
Distribution
- Installable as a Claude Code plugin:
/plugin install academic-project-page --marketplace royh1122/academic-project-page-skill(.claude-plugin/). - README: a live demo, a before/after clip, a quick start, how the skill differs from the template, how it is tested, a showcase section and an FAQ. Issue templates for bugs and showcase pages.
eval-kit/README.mdreports the 1.1.0 results.
v1.0.1
preview_server.pyrefuses a port that another server is still listening on, instead of binding it alongside (Windows) and leaving requests to reach the old server. It exits with a message naming the port.audit.mjsfails at once when the page does not load (HTTP error or no server), instead of auditing the server's error page and reporting a pass.
v1.0.0
First release.
Install
npx skills add royh1122/academic-project-page-skill
What's in it
- Build, polish, or audit an academic project page from a folder of materials (paper or report PDF, figures, tables, videos, poster, BibTeX).
- Template based on the Academic Project Page Template and Nerfies, with their accessibility and layout defects fixed: heading order, labels, contrast, reduced motion, carousel controls, phone layout.
- Components: teaser, abstract, method figure, image and video carousels, results tables, embedded PDF poster, BibTeX with copy button, figure zoom viewer. Optional blocks are removed when the project lacks them.
- Checks before handing back: a browser audit using your installed Chrome (zero install), a typography check against the theme, a number check against your source files, and screenshots at 375, 768 and 1440 px.
- Evals: 8 evals on a fictional, generated evaluation kit (CC0), with results for the first five in
eval-kit/README.md.
See CHANGELOG.md for the full list.