cas-docs-site
Skill11k starsChanged yesterdayApache-2.0View on GitHub
Edit the CAS documentation site (docs/cas-server-documentation, Jekyll plugins, site.js/site.css, ci/docs/publish.sh, the docs data generator) and release notes: page titles and descriptions, setting links, settings rules, release-notes front matter and tags, Quick Start wizard, sidebar, mobile layout. Use when editing any documentation page or release_notes/RC*.md.
We split this skill into the rules it gives an agent
2 rules. About 0 are common, 1 is distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 30
Do not dim muted text with opacity: --docs-muted on its own meets 4.5:1 in both themes, and opacity drops it below.
- Distinctive: line 72
Every documentation page needs an opening paragraph right after the H1 that the layout can use as its description: at least 40 characters, …
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
CAS documentation site
Practical boundaries
- Documentation pages on gh-pages are pre-rendered per version, but they load the stylesheet and script from the shared site root, and every publish overwrites those root files. The current design ships as
stylesheets/site.css,stylesheets/site-print.cssandjavascripts/site.js; the rootstylesheet.css,print.cssandmain.jsbelong to the released versions' old markup. A redesign that changes page markup must use new asset names, never replace the ones older versions link. - The documentation data generator (
docs/cas-server-documentation-processor) runs asjava @build/casdocsgen.args ..., an argument file written by itsdocsGeneratorArgumentstask fromsourceSets.main.runtimeClasspath;publish.shno longer builds the ~1 GBcasdocsgen.jarboot jar. Its Gradle run adds-DskipErrorProneCompiler=true(override withDOCS_GENERATOR_GRADLE_OPTIONS, an empty value restores Error Prone). It still needs every CAS module compiled: actuators, feature toggles and shell commands are found by ClassGraph scans of the runtime classpath, and third-party settings come from the dependencies' metadata. Those lookups go throughCasDocumentationClassIndex, one ClassGraph scan oforgshared by the exporters; add new class lookups there rather than callingReflectionUtils, which scans the whole classpath on every call. ci/docs/publish.shexit codes carry meaning for the workflow retry (retry_on_exit_code: 1): 1 is a failure worth another attempt, 3 is broken internal links/images/scripts (fails at once, nothing is published), 4 is broken external links only (the site is published first, then the job fails). Keep new failure paths on 1 unless a rerun cannot help. External links are checked only on the weekly schedule or when asked (--proof-external, theproofReadExternalinput orvars.DOCS_PROOF_EXTERNAL), with successful results cached for 7 days inbuild/htmlproofer.- Actuator endpoint blocks (
_includes_site/actuators.html) take their operations from thecas_actuator_operationsfilter in_plugins/cas_actuators.rb(sorted, parameters normalized, curl built there), and settings snippets fromcas_actuator_enable_snippet/cas_actuator_security_snippetviacas-actuator-snippet.htmlin all three formats. Per operation, render only what differs (parameters, response, example); setup, security, settings and troubleshooting are rendered once per include in the shared tabs. The operations table is excluded fromresponsiveTables(). - Settings search:
ci/docs/index.jswritesassets/data/<version>/index.jsonas{generated, docs}(no lunr index; each doc carries name, short type, description, default, kind required/optional/thirdparty, module, duration, deprecation).site.jssearches it directly (searchCasSettings, shared by the Configuration Properties page and the Shift-Shift palette); the page state lives in the URL (?q=&exact=1&scope=name&kind=cas|thirdparty&deprecated=hide). The layout exposesdata-docs-base,data-docs-versionanddata-docs-buildon<body>for these URLs. - Feature toggles (
Configuration-Feature-Toggles.md) render through_includes_site/cas-feature-toggles.htmlfrom thecas_feature_catalogfilter in_plugins/cas_features.rb, which derives feature and module from theCasFeatureModule.<Feature>[.<module>].enabledproperty, groups features by area and links docs only when the target page exists for that version. Add title overrides, groups or docs links there, not in the include. The environment variable form maps both.and-to_(CasFeatureEnabledConditionreads throughEnvironment.getProperty), unlike the relaxed-binding form used for regular settings. - Module dependency tabs (
_includes_site/casmodule.html, included throughinclude_cached) are plain Bootstrap tabs: no inline script, the default tab and pane are chosen together in Liquid, and pane ids use the full coordinates plus the variant options. Do not add per-include scripts or truncated ids; either one lets the selected tab and the visible pane drift apart. - Local serving (
publish.sh --serve true) keeps the configuredbaseurl: /cas, so the site answers athttp://localhost:4000/cas/<version>/exactly like production.variables.htmlalways setsbasePathto/casandsite.jshas no localhost path branches; do not reintroduce--baseurl ""or localhost-specific paths. - Release notes (
release_notes/RC<n>.md) carry arelease:front matter block (summary, facts, upgrade notes, highlights, optional spotlight over a front matter image list) and open with{% include release-digest.html %}and end with{% include release-footer.html %}. Tag New & Noteworthy topics with a block IAL on the line after the heading and Other Stuff bullets with a list item IAL (- {: .fixed} ...): types arenew,changed,fixed,action,removed; adddata-area="..."only when the first link does not identify the area. The area must be a key ofAREASin_plugins/cas_release_notes.rb(SSO cookies and sessions aretickets; there is nosso)._plugins/cas_release_notes.rbnormalizes the tags, groups Other Stuff by area and resolvessection:names to kramdown GFM heading ids before rendering; asection:that names no heading logs a warning. Upgrade notes may point at an Other Stuff area group by its label.release_notes/RC.md(front matterrelease_aggregate:) is generated from every RC page in the same folder: topics with the same title are merged and show each release candidate's notes, identical Other Stuff items are listed once with all their release candidates, and the<!-- release-changes -->marker is where the generated changes go. Never edit changes into that page by hand. - Section heading icons come from
CAS_SECTION_ICONSinsite.jsand apply only to directh2children of the article whose id is in that map; add an entry there rather than icons in markdown. - In the development docs,
site.jswraps every table inside#cas-docs-containerin a framed.table-scrollcard, so do not use<table>for layout inside components (buttons, headers, badges); use flex markup instead. - Documentation property blocks get their settings from the
cas_properties/cas_third_party_propertiesfilters indocs/cas-server-documentation/_plugins/cas_properties.rb; do not loop oversite.datain Liquid for this, it scans ~14k entries per block. Liquidassigninside an include writes to the page scope, so acaspropertiesinclude nested inside another block's panels must passtopics="false"(and usuallyintro="false") or it resets the outer block's state. Their output is wrapped in{::nomarkdown}, so include them at the start of a line in markdown or pass the capture throughmarkdownify(with|, not||). Catalog descriptions carry raw</>(for examplemanagement.endpoint.<id>.access); the plugin escapes every tag outsideINLINE_TAGSintodescriptionHtml/summaryText, so print those fields and never unescape descriptions in Liquid: one stray tag inside the actuator modal makes kramdown drop the closing tags and everything after it on the page. - Documentation page titles must be unique: use
title: CAS - <page H1>, and give overview pages adescription:front matter entry (under 160 characters). Pages without one get their meta description from the first paragraph in_layouts/default.html, which skips dependency boilerplate, short or colon-ended lead-ins and "see this guide" lines. - The Versions menu lists
documentation_versionsfromdocs/cas-server-documentation/_config.yml(development plus maintained releases); update it together with the EOL schedule indeveloper/Maintenance-Policy.md. - Third-party CSS and JS in
_layouts/default.htmlare pinned to exact versions withintegrity(sha384) andcrossorigin="anonymous". Recompute the hash whenever a version changes; Google Fonts and the gtag script cannot carry one. Analytics is the GA4 tagG-W3M8JXP7GP, loaded only onapereo.github.io. - Do not dim muted text with
opacity:--docs-mutedon its own meets 4.5:1 in both themes, and opacity drops it below.--docs-amberis darker in light mode for the same reason. - In
casmodule.html, only the tab links sit insiderole="tablist"; the Resources dropdown is a sibling<button>. - Mobile layout: content must never run past the 1.25rem gutter. A flex or grid child that holds long inline
codeneedsmin-width: 0, and the code needsoverflow-wrap: anywhere(break-worddoes not lower the min-content width, so the item still overflows). Bootstrap.rowblocks in content lose their negative margins below 760px. To check, load pages in 375px iframes and look for elements whose right edge passes#cas-docs-containeroutside a scrolling ancestor. - Release notes pages carry
docs-release-noteson<body>(set in_layouts/default.htmlfrom the page URL); their prose, footer included, is justified and hyphenated, while stats, facts, the release switcher and inline code are left alone. - Docs sidebar:
sidebar.mdstays a plain nested list;buildSidebarTree()insite.jsturns it into the grouped tree. A section's group comes fromCAS_SIDEBAR_GROUPS(by the section's#anchor), so add a new top-level section there too; one left out lands in the last group. A parent whose first child is anOverviewlink becomes that link (the row is dropped); other parents only toggle. Only the current path opens, siblings close as another opens, open rows are sticky at--sidebar-filter-h + depth × --sidebar-row-h, and.docs-sidebarhas no top padding so the filter can pin at the very top. - Settings in docs (required, standing rule from the maintainer): never refer to a configuration setting by name in
documentation pages, neither inline nor in fenced
propertiesblocks. Describe the feature, say that it is available, and say that it is enabled, disabled or tuned through CAS settings; the page'scaspropertiesinclude lists them. The only exception is release notes, which may name CAS or other settings. - Setting links in release notes (required): every setting named in release notes must be marked so readers can look
it up in place. Inline, write
`cas.server.name`{: .cas-setting}(an assignment such as`cas.tgc.secure=false`{: .cas-setting}works too; the value is ignored for the lookup). For a fencedpropertiesblock of settings, put{: .cas-settings-linked}on the line right after the closing fence. Mark only real CAS or Spring setting names, not prefixes used as headings, removed settings, JSON fields or registered-service properties.initializeCasSettingLinks()insite.jsturns these into buttons that callopenCasSettingsPalette(name): an exact match opens the setting's details inside the Shift-Shift palette, a partial name shows the matches; the page never changes. Linked blocks are rebuilt line by line from their text (key, separator, value), because Rouge's properties lexer splits keys with[0]into separate tokens.casSettingsFlat()drops anything in brackets and any purely numeric name segment, so[0],[], the catalog's map notation.[key],.0.and the environment variable form_0_all match the same setting. No catalog name has a numeric segment of its own; recheck that if one is ever added.planning/Quick-Start.mdis the reference page. - Quick Start wizard (
planning/Quick-Start.md,javascripts/quick-start.js): the page needs exactly eight## N.steps; anything else on the page is an###inside one of them, or it shows on every step.data-quick-featuretakes a space-separated list and shows the section when any listed feature is selected. Each checkbox'sdata-modulemust match thecasmoduleinclude in its recipe (the fieldset'sdata-modulesholds the always-included ones): step 2's Initializr command and step 6'sdependenciesblock are built from them, and step 6'scas.propertiesfrom every visible.cas-settings-linkedblock in steps 3–5, in page order, under the nearest heading. Generated blocks are plain fenced blocks inside[data-quick-output]; the script rewrites their text and gutter and callslinkCasSettingsBlock()fromsite.jsagain. The selection is page state: popstate restores the step only, and a link into a recipe selects its first feature with a notice. Checkboxes may declaredata-requiresanddata-excludes(space-separated feature values; Interrupt requires Groovy, Redis and Hazelcast exclude each other, declared on both sides): checking selects requirements and clears conflicts, clearing a feature clears its dependents, Check All adds only what fits, and a selection from the address is normalized with earlier features winning. Test the wizard in headless Chromium against a rendered copy (Back/Forward, deep links, rules, Check All output) after changes. - Every documentation page needs an opening paragraph right after the H1 that the layout can use as its description: at least 40 characters, not ending in a colon, and not a "see this guide" or dependency lead-in.
- On phones (
max-width: 760px) the sticky header is offset by--docs-masthead-heightso only the navigation bar stays visible, andsite.jssets--docs-header-heightto that bar alone; keep both in step when changing the masthead. - The docs load two web fonts only, Bricolage Grotesque (headings) and DM Sans (everything else);
--font-monois the system monospace stack. Do not add font families or hotlink images from third-party hosts; keep images underimages/. - Large topics are split into one page per concern with a sidebar submenu (see
authorization/Heimdall-Authorization-*.mdandmultitenancy/Multitenancy-*.md); when moving a section, update cross-page anchors and links in release notes.
FIDO2 WebAuthn / passkeys review discipline
- JSON examples pasted into the documentation are pretty-printed (one member per line, two-space indent), never minified.
Trending
Quiet since August.about the whole repository
Who's talking about apereo/cas
- Stack Overflow“What is the relation between CAS vs SAML?”Stack Overflow · Apr 28, 2017 · 23 votes
- strapi/strapi“Add support for login via cas - github.com/apereo/cas”GitHub · Sep 26, 2020 · 8 reactions
- Stack Overflow“Opensaml error receiving correct unmarshaller”Stack Overflow · Apr 10, 2017 · 6 votes
- Stack Overflow“How to enable file-based authentication in CAS 5”Stack Overflow · Apr 14, 2017 · 5 votes
- google/error-prone“ErrorProne 2.37: StringConcatToTextBlock causes java.util.NoSuchElementException”GitHub · Mar 19, 2025 · 3 reactions
The biggest 5 of 27 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 27
Talked about on Stack Overflow, GitHub, Hacker News and the web (27 times).
On Stack Overflow · 14
- Apr 28, 2017What is the relation between CAS vs SAML?23 votes
- Apr 10, 2017Opensaml error receiving correct unmarshaller6 votes
- Apr 14, 2017How to enable file-based authentication in CAS 55 votes
- Aug 2, 2021How to create a SAML IDP that authenticates with an API from scratch2 votes
- Feb 3, 2020CAS 6.1 - State Parameter null with Pac4J2 votes
9 more on Stack Overflow
- Jul 4, 2017CAS Spnego - KrbException: Checksum failed2 votes · 3 answers
- Dec 11, 2023What happened "org.apereo.cas.web.security" in 7.0.0-RC9 of org.apereo.cas?1 vote
- Jul 23, 2020Cas - configure Principal transformation1 vote · 1 answer
- Nov 25, 2019CAS Disable Service X-Frame-Options not work1 vote
- Apr 24, 2019inject model data into spring webflow in cas1 vote
- Mar 4, 2019Prevent CAS authentication if X.509 user isn't registered1 vote
- Nov 10, 2021CAS Apereo 6.1.x importing PasswordEncoderUtils0 votes · 1 answer
- Aug 2, 2021How to SSO to a directory server from a python application0 votes
- Nov 7, 2016using CAS with with custom login page0 votes
On GitHub · 9
- Sep 26, 2020Add support for login via cas - github.com/apereo/cas — strapi/strapi8 reactions · 21 comments
- Mar 19, 2025ErrorProne 2.37: StringConcatToTextBlock causes java.util.NoSuchElementException — google/error-prone3 reactions · 3 comments
- Mar 26, 2020Renovate crash: JavaScript heap out of memory (many Gradle dependencies) — renovatebot/renovate1 reaction · 8 comments
- Aug 10, 2026Add Apereo CAS project to regression testing project lists — checkstyle/test-configssays it tested it0 reactions · 1 comment
- Jul 17, 2026[Argus] CVE-2026-59099: Apereo CAS 7.3.0 < 8.0.0-RC6 - AES-GCM 논스(Nonce) 재사용으로 인한 정보 노출 — LEEKIYOON-SEC/Argus-DEV0 reactions
4 more on GitHub
- Dec 5, 2024Extract Attr within moved file — pouryafard75/RM-ASTDiff0 reactions · 14 comments
- Jan 18, 2023Authentication/Authorization: We need a API-friendly strategy — wolpert/svarm0 reactions · 1 comment
- Apr 19, 2020COMPARAISON KEYCLOAK / CAS — pegasus-io/belenios-containers0 reactions
- Mar 20, 2018apereo/cas OAuth endpoints need @Controller annotations — easy-software-ufal/annotations_repos0 reactions
On Hacker News · 3
- Feb 20, 2017Enterprise Single Sign on for all3 points
- Aug 8, 2023The Central Authentication Service Project2 points
- Oct 16, 2016Apereo CAS: Single Sign-On for the Web1 point
On the web · 1
- Apr 11, 2025apereo/cas - Where software is built — google.com
In this repository30 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- .github/copilot-instructions.mdCopilot instructions
- cas-actuatorsSkill
- cas-attribute-consentSkill
- cas-build-ciSkill
- cas-google-authenticatorSkill
- cas-groovy-scriptingSkill
- cas-handoffSkill
- cas-heimdall-authzenSkill
- cas-import-prSkill
- cas-interrupt-notificationsSkill
- cas-ldapSkill
- cas-mcp-serverSkill
- cas-oauth-oidc-authenticationSkill
- cas-oauth-oidcSkill
- cas-oid4vcSkill
- cas-passwordless-webauthnSkill
- cas-protocolSkill
- cas-puppeteer-scenariosSkill
- cas-samlSkill
- cas-sandbox-verificationSkill
- cas-service-registriesSkill
- cas-session-storesSkill
- cas-startup-performanceSkill
- cas-storage-backendsSkill
- cas-testingSkill
- cas-ticket-registriesSkill
- cas-uiSkill
- cas-web-securitySkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

