Skip to content

Add axle — Accessibility Scanner#27308

Closed
asafamos wants to merge 24 commits into
raycast:mainfrom
asafamos:add-axle-extension
Closed

Add axle — Accessibility Scanner#27308
asafamos wants to merge 24 commits into
raycast:mainfrom
asafamos:add-axle-extension

Conversation

@asafamos
Copy link
Copy Markdown

Adds axle — Accessibility Scanner to the Raycast store. Scan any URL for WCAG 2.1 / 2.2 AA accessibility violations without leaving Raycast. Results show in a native list; pick any violation to see the offending element and the axe-core help URL.

Commands

  • Scan URL for Accessibility (view) — run an axe-core 4.11 scan against any public URL and show the violations grouped by severity.
  • Open Hebrew Accessibility Statement Generator (no-view) — opens the free generator aligned with Israeli תקנה 35.

Screencast

A screencast + store screenshots are attached below (or in the next comment on this PR).

Why this belongs in the Raycast store

Accessibility compliance has become a live ship-stopper in 2025:

  • EAA 2025 enforceable across the EU since 28 June
  • ADA demand letters up 320% in 2023-24
  • Israeli תקנה 35 tightened in October 2024

Developers currently have to leave their flow, open a browser devtools panel, and wait for Lighthouse/axe-core to boot. This extension is a keystroke + URL away — same engine axe-core reviewers use in courts.

Ecosystem

axle also ships as a GitHub Action, an npm CLI, and plugins for Netlify / Cloudflare Pages / Vercel. Source code is MIT, open on GitHub.

Checklist

  • Uses @raycast/api@^1.78.0
  • command-icon.png — 512×512 PNG included
  • Two commands: scan (view mode) + statement (no-view)
  • Works fully offline apart from the URL being scanned
  • No data collection, no analytics ping
  • MIT licensed

Happy to adjust copy, icon, or commands if anything doesn't fit the store style guide.

@raycastbot raycastbot added the new extension Label for PRs with new extensions label Apr 20, 2026
@raycastbot
Copy link
Copy Markdown
Collaborator

Congratulations on your new Raycast extension! 🚀

We're currently experiencing a high volume of incoming requests. As a result, the initial review may take up to 10-15 business days.

Once the PR is approved and merged, the extension will be available on our Store.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Apr 20, 2026

Greptile Summary

This PR adds the axle Raycast extension, which scans any URL for WCAG 2.1/2.2 AA violations via the public axle-iota.vercel.app API and presents results in a native list, plus a no-view command to open a Hebrew accessibility statement generator.

Two store-submission blockers need to be resolved before merge:

  • CHANGELOG.md is missing — required for every PR in this repo (use ## [Initial Release] - {PR_MERGE_DATE}).
  • A metadata/ folder with Raycast-styled screenshots is required for the view-mode scan command.

Confidence Score: 4/5

Not ready to merge — two required store artifacts (CHANGELOG.md and metadata/ screenshots) are missing.

The core logic in scan.tsx and statement.tsx is straightforward and correct. The two P1 findings are missing required files that are mandatory for all Raycast store submissions; fixing them is mechanical. The P2 issues are minor cleanup.

extensions/axle/package.json — CHANGELOG.md and metadata/ folder with screenshots must be added before the extension can be published to the store.

Important Files Changed

Filename Overview
extensions/axle/package.json Extension manifest is well-formed with $schema, correct categories, and a single @raycast/api dependency. Missing required CHANGELOG.md and metadata/ folder with store screenshots for the view-mode scan command.
extensions/axle/src/scan.tsx Main scan command — fetches violations from external axle API and renders them as a list. Has an unused useNavigation import and manually types its argument props instead of using the auto-generated Arguments.Scan type.
extensions/axle/src/statement.tsx Simple no-view command that opens the Hebrew accessibility statement generator URL and shows a HUD confirmation. No issues.
extensions/axle/raycast-env.d.ts Auto-generated type declarations correctly reflecting the manifest; Arguments.Scan exports the url string argument but it's not yet referenced in scan.tsx.
extensions/axle/README.md Concise README covering commands, the external API endpoint, and dev setup. No issues.
Prompt To Fix All With AI
This is a comment left during a code review.
Path: extensions/axle/package.json
Line: 1-37

Comment:
**Missing `CHANGELOG.md`**

Every PR to this repo must include a `CHANGELOG.md` file. For an initial release it should follow the standard pattern:

```markdown
## [Initial Release] - {PR_MERGE_DATE}

- Initial release of axle — Accessibility Scanner
```

The `{PR_MERGE_DATE}` placeholder is filled in automatically when the PR merges.

**Rule Used:** What: Ensure that CHANGELOG.md is created or updat... ([source](https://app.greptile.com/review/custom-context?memory=97cd51bc-963b-43f5-acc3-9ba85fe7bb2d))

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: extensions/axle/package.json
Line: 14

Comment:
**Missing `metadata/` folder with screenshots**

The `scan` command has `"mode": "view"`, so the store requires Raycast-styled screenshots in a `metadata/` directory. Without them the extension will be rejected from the store. See the [Raycast docs](https://developers.raycast.com/basics/prepare-an-extension-for-store#screenshots) for the expected format and dimensions.

**Rule Used:** What: Extensions with view-type commands must incl... ([source](https://app.greptile.com/review/custom-context?memory=87059ac1-c601-487f-9f1c-bce8a3cb6209))

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: extensions/axle/src/scan.tsx
Line: 1-10

Comment:
**Unused `useNavigation` import**

`useNavigation` is imported but never called in this file. `Action.Push` handles navigation internally and doesn't require it directly.

```suggestion
import {
  ActionPanel,
  Action,
  List,
  Detail,
  Icon,
  showToast,
  Toast,
} from "@raycast/api";
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: extensions/axle/src/scan.tsx
Line: 47

Comment:
**Use auto-generated argument types instead of manual typing**

The `raycast-env.d.ts` file already exports `Arguments.Scan` which covers the `url` argument. Prefer `LaunchProps` with the generated type to stay in sync with the manifest automatically.

```suggestion
export default function Scan(props: LaunchProps<{ arguments: Arguments.Scan }>) {
```

You'll also need to add `LaunchProps` to the `@raycast/api` import.

**Rule Used:** What: Don't manually define `Preferences` for `get... ([source](https://app.greptile.com/review/custom-context?memory=d93fc9fb-a45d-4479-a6a4-b1b4af98ebc8))

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "Add axle command-icon.png" | Re-trigger Greptile

Comment on lines +1 to +37
{
"$schema": "https://www.raycast.com/schemas/extension.json",
"name": "axle",
"title": "axle — Accessibility Scanner",
"description": "Scan any URL for WCAG 2.1 / 2.2 AA accessibility violations without leaving Raycast. Results appear as a list; pick any violation to see the offending element and suggested fix.",
"icon": "command-icon.png",
"author": "asafamos",
"categories": ["Developer Tools", "Web"],
"license": "MIT",
"commands": [
{
"name": "scan",
"title": "Scan URL for Accessibility",
"subtitle": "axle",
"description": "Run an axe-core scan against any public URL and show violations.",
"mode": "view",
"arguments": [
{
"name": "url",
"type": "text",
"placeholder": "https://example.com",
"required": true
}
]
},
{
"name": "statement",
"title": "Open Hebrew Accessibility Statement Generator",
"subtitle": "axle",
"description": "Opens the free Hebrew statement generator — aligned with Israeli תקנה 35.",
"mode": "no-view"
}
],
"dependencies": {
"@raycast/api": "^1.78.0"
}
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Missing CHANGELOG.md

Every PR to this repo must include a CHANGELOG.md file. For an initial release it should follow the standard pattern:

## [Initial Release] - {PR_MERGE_DATE}

- Initial release of axle — Accessibility Scanner

The {PR_MERGE_DATE} placeholder is filled in automatically when the PR merges.

Rule Used: What: Ensure that CHANGELOG.md is created or updat... (source)

Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/axle/package.json
Line: 1-37

Comment:
**Missing `CHANGELOG.md`**

Every PR to this repo must include a `CHANGELOG.md` file. For an initial release it should follow the standard pattern:

```markdown
## [Initial Release] - {PR_MERGE_DATE}

- Initial release of axle — Accessibility Scanner
```

The `{PR_MERGE_DATE}` placeholder is filled in automatically when the PR merges.

**Rule Used:** What: Ensure that CHANGELOG.md is created or updat... ([source](https://app.greptile.com/review/custom-context?memory=97cd51bc-963b-43f5-acc3-9ba85fe7bb2d))

How can I resolve this? If you propose a fix, please make it concise.

{
"name": "scan",
"title": "Scan URL for Accessibility",
"subtitle": "axle",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Missing metadata/ folder with screenshots

The scan command has "mode": "view", so the store requires Raycast-styled screenshots in a metadata/ directory. Without them the extension will be rejected from the store. See the Raycast docs for the expected format and dimensions.

Rule Used: What: Extensions with view-type commands must incl... (source)

Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/axle/package.json
Line: 14

Comment:
**Missing `metadata/` folder with screenshots**

The `scan` command has `"mode": "view"`, so the store requires Raycast-styled screenshots in a `metadata/` directory. Without them the extension will be rejected from the store. See the [Raycast docs](https://developers.raycast.com/basics/prepare-an-extension-for-store#screenshots) for the expected format and dimensions.

**Rule Used:** What: Extensions with view-type commands must incl... ([source](https://app.greptile.com/review/custom-context?memory=87059ac1-c601-487f-9f1c-bce8a3cb6209))

How can I resolve this? If you propose a fix, please make it concise.

Comment thread extensions/axle/src/scan.tsx Outdated
Comment on lines +1 to +10
import {
ActionPanel,
Action,
List,
Detail,
Icon,
showToast,
Toast,
useNavigation,
} from "@raycast/api";
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Unused useNavigation import

useNavigation is imported but never called in this file. Action.Push handles navigation internally and doesn't require it directly.

Suggested change
import {
ActionPanel,
Action,
List,
Detail,
Icon,
showToast,
Toast,
useNavigation,
} from "@raycast/api";
import {
ActionPanel,
Action,
List,
Detail,
Icon,
showToast,
Toast,
} from "@raycast/api";
Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/axle/src/scan.tsx
Line: 1-10

Comment:
**Unused `useNavigation` import**

`useNavigation` is imported but never called in this file. `Action.Push` handles navigation internally and doesn't require it directly.

```suggestion
import {
  ActionPanel,
  Action,
  List,
  Detail,
  Icon,
  showToast,
  Toast,
} from "@raycast/api";
```

How can I resolve this? If you propose a fix, please make it concise.

minor: { source: Icon.Circle, tintColor: "#2563eb" },
};

export default function Scan(props: { arguments: { url: string } }) {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Use auto-generated argument types instead of manual typing

The raycast-env.d.ts file already exports Arguments.Scan which covers the url argument. Prefer LaunchProps with the generated type to stay in sync with the manifest automatically.

Suggested change
export default function Scan(props: { arguments: { url: string } }) {
export default function Scan(props: LaunchProps<{ arguments: Arguments.Scan }>) {

You'll also need to add LaunchProps to the @raycast/api import.

Rule Used: What: Don't manually define Preferences for `get... (source)

Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/axle/src/scan.tsx
Line: 47

Comment:
**Use auto-generated argument types instead of manual typing**

The `raycast-env.d.ts` file already exports `Arguments.Scan` which covers the `url` argument. Prefer `LaunchProps` with the generated type to stay in sync with the manifest automatically.

```suggestion
export default function Scan(props: LaunchProps<{ arguments: Arguments.Scan }>) {
```

You'll also need to add `LaunchProps` to the `@raycast/api` import.

**Rule Used:** What: Don't manually define `Preferences` for `get... ([source](https://app.greptile.com/review/custom-context?memory=d93fc9fb-a45d-4479-a6a4-b1b4af98ebc8))

How can I resolve this? If you propose a fix, please make it concise.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

@raycastbot
Copy link
Copy Markdown
Collaborator

This pull request has been automatically marked as stale because it did not have any recent activity.

It will be closed if no further activity occurs in the next 7 days to keep our backlog clean 😊

@raycastbot raycastbot added the status: stalled Stalled due inactivity label May 4, 2026
@raycastbot
Copy link
Copy Markdown
Collaborator

This pull request has been automatically closed due to inactivity.

Feel free to comment in the thread when you're ready to continue working on it 🙂

You can also catch us in Slack if you want to discuss this.

@raycastbot raycastbot closed this May 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new extension Label for PRs with new extensions status: stalled Stalled due inactivity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants