Custom div-based buttons may not be keyboard operable
Keyboard-only users may be unable to activate the 'Smaller text', 'Larger text', and 'Toggle light or dark mode' controls because they are implemented as <div role="button"> elements rather than native <button> elements. Divs are not natively focusable or triggerable via Enter/Space unless tabindex and keydown handlers are explicitly added. Without inspecting the JS, this is a high-risk pattern that frequently fails 2.1.1 Keyboard. Fix: use native <button> elements, or ensure tabindex="0" plus keydown handlers for Enter/Space are implemented.
The site's CSP appears weak (e.g., broad allowances such as 'unsafe-inline'/'unsafe-eval' or missing directives like script-src/object-src/base-uri), which reduces its effectiveness as a mitigation against XSS. On a content-heavy site with third-party embeds and no visible auth surface, the practical impact is moderate rather than critical, but a weak CSP fails to compensate for any future injection bugs (e.g., in comment/search features). Remediation: adopt a strict CSP with nonce- or hash-based script-src, restrict object-src 'none', default-src 'self', and explicit frame-ancestors to also cover clickjacking, avoiding 'unsafe-inline'/'unsafe-eval'.
[
{
"url": "https://artificialatheist.com",
"severity": "moderate",
"title": "Weak or permissive Content-Security-Policy",
"evidence": {
"selector": "header:Content-Security-Policy",
"snippet": "CSP present but permissive",
"note": "Exact header value not provided; assessed from triage flag description"
}
},
{
"url": "https://artificialatheist.com/posts/the-argument-from-morality-does-ethics-need-a-divine-anchor/",
"severity": "moderate",
"title": "Weak or permissive Content-Security-Policy",
"evidence": {
"snippet": "N/A"
}
},
{
"url": "https://artificialatheist.com/posts/secularism-and-the-political-party-when-movements-organise/",
"severity": "moderate",
"title": "Weak or overly permissive Content-Security-Policy",
"evidence": {
"note": "Policy observed as weak/permissive per triage; exact header value not shown in provided evidence."
}
},
{
"url": "https://artificialatheist.com/topics/philosophy/",
"severity": "minor",
"title": "Weak or overly permissive Content-Security-Policy",
"evidence": {
"note": "CSP header value not fully provided; flagged as weak per triage — recommend confirming directive-by-directive."
}
},
{
"url": "https://artificialatheist.com/posts/the-concept-of-supervenience-when-one-level-rests-on-another/",
"severity": "moderate",
"title": "Weak or permissive Content-Security-Policy",
"evidence": {
"note": "CSP header present but permissive per triage flag; exact directive values not provided in skeleton"
}
},
{
"url": "https://artificialatheist.com/posts/what-the-nervous-system-of-c-elegans-actually-taught-us/",
"severity": "moderate",
"title": "Weak or missing Content-Security-Policy",
"evidence": {
"selector": "response headers",
"note": "No CSP header value was supplied in the evidence; treated as absent/weak based on triage flag."
}
},
{
"url": "https://artificialatheist.com/posts/secularism-and-the-court-witness-truth-without-god/",
"severity": "moderate",
"title": "Weak or missing Content-Security-Policy",
"evidence": {
"selector": "header/CSP",
"note": "CSP header absent or overly permissive; no frame-ancestors/script-src restriction confirmed in provided headers"
}
},
{
"url": "https://artificialatheist.com/faq/",
"severity": "moderate",
"title": "Weak or absent Content-Security-Policy",
"evidence": {
"note": "No strong CSP directives observed in response headers; page has a client-side search feature (/search/) increasing reflected-input surface"
}
},
{
"url": "https://artificialatheist.com/about/",
"severity": "moderate",
"title": "Weak or permissive Content-Security-Policy",
"evidence": {
"note": "specific header value not provided in evidence; assessed as weak based on triage flag"
}
},
{
"url": "https://artificialatheist.com/search/",
"severity": "moderate",
"title": "Weak Content-Security-Policy allows injection/clickjacking exposure",
"evidence": {
"note": "reported as weak CSP by triage; header value not fully specified"
}
},
{
"url": "https://artificialatheist.com/quiz/",
"severity": "moderate",
"title": "Weak or missing Content-Security-Policy",
"evidence": {
"note": "absent or weak Content-Security-Policy header value not shown as strict"
}
},
{
"url": "https://artificialatheist.com/topics/news/",
"severity": "moderate",
"title": "Weak or permissive Content-Security-Policy",
"evidence": {
"note": "CSP flagged as weak by triage; specific directive values not provided in headers snapshot"
}
},
{
"url": "https://artificialatheist.com/posts/the-afterlife-assumption-what-immortality-costs-moral-reason/",
"severity": "moderate",
"title": "Weak Content-Security-Policy permits inline script execution",
"evidence": {
"note": "CSP directive weakness flagged in triage; no frame-ancestors or nonce-based script-src confirmed to compensate"
}
},
{
"url": "https://artificialatheist.com/posts/what-the-multiverse-hypothesis-actually-predicts/",
"severity": "moderate",
"title": "Weak or overly permissive Content-Security-Policy",
"evidence": {
"note": "Actual CSP header value not provided in evidence; assessment based on triage flag reasoning."
}
},
{
"url": "https://artificialatheist.com/topics/secularism/",
"severity": "minor",
"title": "Weak or missing Content-Security-Policy",
"evidence": {
"selector": "response headers",
"note": "CSP header absent or weak per triage flag"
}
},
{
"url": "https://artificialatheist.com/posts/the-gambler-s-fallacy-and-the-limits-of-intuitive-probabilit/",
"severity": "moderate",
"title": "Weak or permissive Content-Security-Policy",
"evidence": {
"note": "CSP directive weakness inferred from triage flag; exact header value not provided in evidence"
}
},
{
"url": "https://artificialatheist.com/topics/science/",
"severity": "moderate",
"title": "Weak or ineffective Content-Security-Policy",
"evidence": {
"note": "policy directives observed as overly permissive or incomplete based on triage flag; no strong script-src/object-src restrictions confirmed"
}
}
]
moderatewcagwcag/1.1.110 pages
Article thumbnail images lack meaningful alt text
Article card images (e.g. what-the-nervous-system-of-c-elegans...png, secularism-and-the-court-witness...png) have empty alt="" while being wrapped in links to the articles. Since adjacent text (headline) already conveys the link purpose in most cards, the empty alt is acceptable per 1.1.1 as long as the image is purely decorative. However, in cases where the image is the ONLY content inside a link (e.g. the top featured article's image link with aria-label present, that one is fine), any card image-link that lacks an accessible name/adjacent text label leaves screen reader users with an unlabeled link announced only as the URL or nothing, violating 2.4.4 Link Purpose and 4.1.2 Name/Role/Value. Fix: keep alt="" only when the image is inside a link that also contains descriptive text; otherwise add descriptive alt text or aria-label identifying the article the image links to.
[
{
"url": "https://artificialatheist.com",
"severity": "moderate",
"title": "Article thumbnail images lack meaningful alt text",
"evidence": {
"selector": "section img[alt='']",
"note": "Some image links (e.g. secularism-and-the-court-witness) appear to combine image+title text in a single <a>, which is acceptable; but if any purely image-only links exist without text/aria-label, they fail 2.4.4/4.1.2."
}
},
{
"url": "https://artificialatheist.com/posts/secularism-and-the-political-party-when-movements-organise/",
"severity": "minor",
"title": "Decorative hero image alt text likely appropriate",
"evidence": {
"selector": "article img[alt='']",
"note": "secularism-and-the-political-party-when-movements-organise.png"
}
},
{
"url": "https://artificialatheist.com/posts/the-concept-of-supervenience-when-one-level-rests-on-another/",
"severity": "minor",
"title": "Hero image alt text is empty but likely appropriate as decorative",
"evidence": {
"selector": "img[alt='']",
"note": "the-concept-of-supervenience-when-one-level-rests-on-another.png and the-gambler-s-fallacy...png both have alt=''"
}
},
{
"url": "https://artificialatheist.com/posts/what-the-nervous-system-of-c-elegans-actually-taught-us/",
"severity": "minor",
"title": "Article hero image uses empty alt text",
"evidence": {
"selector": "article img[alt='']",
"note": "Downgraded from 'serious' since empty alt on hero/thumbnail images is a common valid decorative pattern; severity depends on actual image content which cannot be confirmed from skeleton alone."
}
},
{
"url": "https://artificialatheist.com/posts/secularism-and-the-court-witness-truth-without-god/",
"severity": "minor",
"title": "Empty alt text on decorative-looking hero and article thumbnail images likely acceptable, but should be verified",
"evidence": {
"selector": "img[alt='']",
"note": "Applies to secularism-and-the-court-witness... hero image and secularism-and-the-political-party... thumbnail"
}
},
{
"url": "https://artificialatheist.com/topics/religion/",
"severity": "minor",
"title": "Decorative-style empty alt on article card thumbnails is acceptable but redundant link text should be checked",
"evidence": {
"selector": "main a img[alt='']",
"note": "criterion 1.1.1"
}
},
{
"url": "https://artificialatheist.com/posts/the-afterlife-assumption-what-immortality-costs-moral-reason/",
"severity": "minor",
"title": "Decorative-looking hero image correctly given empty alt, but verify content relevance",
"evidence": {
"selector": "article img[alt='']",
"note": "Same pattern repeated on related-post thumbnail image, also empty alt - consistent decorative treatment suggests intentional design choice."
}
},
{
"url": "https://artificialatheist.com/posts/what-the-multiverse-hypothesis-actually-predicts/",
"severity": "minor",
"title": "Hero image alt text likely acceptable as decorative",
"evidence": {
"selector": "img[src='what-the-multiverse-hypothesis-actually-predicts.png']",
"note": "escalate:false"
}
},
{
"url": "https://artificialatheist.com/topics/secularism/",
"severity": "minor",
"title": "Decorative bullet character not hidden from assistive tech",
"evidence": {
"selector": "main a",
"note": "Link text begins with '● Title...' repeated pattern"
}
},
{
"url": "https://artificialatheist.com/topics/science/",
"severity": "minor",
"title": "Decorative empty alt on post-card thumbnails is likely acceptable but should be verified for content-bearing images",
"evidence": {
"selector": "main a img[alt='']",
"note": "18+ similar cards on page, all with empty alt"
}
}
]
moderatewcagwcag/4.1.23 pages
Toggle mode button lacks accessible name and state text
The 'Toggle light or dark mode' button has an aria-label but no visible text content, and unlike the text-size buttons it lacks aria-pressed, so screen reader users cannot determine whether dark mode is currently on or off. Fix: add aria-pressed reflecting current state, consistent with the other two buttons.
[
{
"url": "https://artificialatheist.com/topics/philosophy/",
"severity": "moderate",
"title": "Toggle mode button lacks accessible name and state text",
"evidence": {
"selector": "div[role=button][aria-label='Toggle light or dark mode']",
"note": "criterion 4.1.2"
}
},
{
"url": "https://artificialatheist.com/faq/",
"severity": "moderate",
"title": "aria-pressed state may not update correctly on custom buttons",
"evidence": {
"selector": "div[role=button][aria-pressed='false']",
"note": "State management should be verified via testing"
}
},
{
"url": "https://artificialatheist.com/quiz/",
"severity": "moderate",
"title": "Toggle-style quiz option buttons lack ARIA state for selection",
"evidence": {
"selector": "button:contains('Random mix'), button:contains('By topic')",
"note": "No aria-pressed or role attributes shown in skeleton, unlike header buttons which correctly use aria-pressed"
}
}
]
moderatewcagwcag/2.4.42 pages
Truncated article preview link text may reduce clarity
Screen reader users navigating by links or link lists will hear the full concatenated text (title plus truncated excerpt ending mid-sentence, e.g. 'it's worth asking what a p') since the entire preview block is wrapped in a single anchor. While the article title itself is present and likely sufficient to satisfy 2.4.4 at a minimum level, the abrupt truncation of the excerpt is confusing and adds noise, making the link's purpose harder to parse quickly. Fix: truncate excerpt text at a natural word/sentence boundary with an ellipsis, or move the excerpt outside the anchor (or mark it aria-hidden) so only the article title is announced as the link text, with the full excerpt available as visible supplementary text.
[
{
"url": "https://artificialatheist.com/topics/news/",
"severity": "moderate",
"title": "Truncated article preview link text may reduce clarity",
"evidence": {
"selector": "main a[href*='/posts/machine-authored-inquiry/']",
"snippet": "'News What Machine-Authored Inquiry Can Be Now that AI can write clearly about hard questions, it's worth asking what a p'"
}
},
{
"url": "https://artificialatheist.com/topics/secularism/",
"severity": "minor",
"title": "Redundant topic name repeated inside link text",
"evidence": {
"selector": "main a[href*='/posts/']",
"note": "Link text: 'Secularism Secularism and the Court Witness...'"
}
}
]
moderatewcagwcag/2.4.72 pages
Missing visible focus indicator on custom buttons
Low-vision and keyboard-only users rely on a visible focus outline to track their position on the page. Custom div-based buttons often have default browser focus styles suppressed by CSS resets without a replacement, meaning users tabbing through the header cannot see which control is focused. Fix: ensure a clearly visible focus outline (e.g. via :focus-visible) is present on all three custom controls, meeting 2.4.7 Focus Visible.
[
{
"url": "https://artificialatheist.com/feed.xml",
"severity": "moderate",
"title": "Document should have one main landmark",
"evidence": {
"impact": "moderate",
"nodes": [
{
"selector": "html",
"snippet": "<html>"
}
],
"node_count": 1,
"tags": [
"cat.semantics",
"best-practice"
]
}
}
]
moderatewcagpage-has-heading-one1 page
Page should contain a level-one heading
Ensure that the page, or at least one of its frames contains a level-one heading https://dequeuniversity.com/rules/axe/4.10/page-has-heading-one?application=axeAPI
Each preview link begins with the topic name ('News') duplicating the page context already conveyed by the h1 and nav, which adds redundant verbosity to link announcements for screen reader users and could be better marked up as a separate, non-linked category label distinct from the link name.
The 'Toggle light or dark mode' div-button has no aria-pressed or aria-checked attribute to communicate current mode state to assistive technology users, unlike the text-resize buttons. This is a minor Name/Role/Value gap (4.1.2) that should be reviewed alongside the resize controls fix for consistency.
Search input relies on placeholder/aria-label only, no visible label
Low-vision users and users with cognitive disabilities benefit from a persistent visible label rather than a placeholder that disappears on input; the aria-label 'Search articles' does satisfy 4.1.2 Name, Role, Value and provides an accessible name for screen readers, so this is a minor usability concern rather than a hard barrier. Fix: add a visible <label> (can be visually styled minimally) associated with the input in addition to the aria-label to aid all users, especially those who zoom or have memory/cognitive impairments.
could not parse lighthouse output (rc=1): Unterminated string starting at: line 806 column 21 (char 130799). stderr: Runtime error encountered: The page provided is not HTML (served as MIME type text/plain).