Allyfix

Can people with disabilities use your app?

Allyfix tests your iOS app with synthetic people, each given only what they can perceive. It fixes what stops them in your code, then keeps a test that replays with no AI.

Watch the demo 2:49 View the code

Before

Today screen under X-ray before the fix. The flashcard's buttons have orange frames: buried inside one big element. The tab bar has red frames.

5 of 25 reachable

After

The same screen after the fix. The card's buttons now have green frames: VoiceOver reaches each by its own name.

13 of 24 reachable

What is drawn to be pressed, set against what VoiceOver can reach. A real run on the example app.

See one run

Also on YouTube

Read what is said in the video
  1. Can people with disabilities use your app? Allyfix finds out, and fixes it.
  2. It runs on four Meta models, each with one job.
  3. First, SAM 3.1 looks at the screen like a sighted person: 25 things drawn to be pressed. VoiceOver can press only five.
  4. Then Muse Spark becomes a screen reader user. Listen to what they get.
  5. VoiceOver reads the whole card as one button: A1, Save Bahnhof, der, Bahnhof, Plural: die Bahnhöfe, Der Bahnhof ist gleich um die Ecke. Wir treffen uns am Bahnhof. the train station, der Bahnhof, Learn again, I know it, button.
  6. Then everyone else, each with only what they can perceive.
  7. The deaf person taps the speaker. The app says “der Bahnhof”. They're only told that a sound played.
  8. Muse Voice Transcribe writes down what was said. Nothing on screen shows it. Stuck.
  9. One click: Muse Wonder fixes the app's code on a git branch.
  10. The app reloads, the same people try again, and both get through.
  11. VoiceOver reached five things before. Now thirteen. VoiceOver reads: I know it, button.
  12. Keep the fix, and what got them through becomes a test with no AI.
  13. Re-testing is free: every screen, every saved test.
  14. Someone brings the old code back. Allyfix notices by itself, and the test turns red before anyone ships it.
  15. It also writes the reports: for coding agents, and for the European accessibility law.

Four Meta models, one job each

SAM 3.1

Sees what is drawn to be pressed

Everything on the screen that looks pressable is found in the picture, then set against what VoiceOver has there: reachable by its own name, buried inside something bigger, or not there at all.

Allyfix showing the X-ray of the Today screen, 25 things drawn to press and 5 reached, beside a screen reader user's list of what VoiceOver reads.

Muse Spark

Is each person, with only what they can perceive

It works out what a screen is for, then plays each person step by step. The screen reader user gets VoiceOver's words and no picture. A separate judge decides after every step whether the task got done. Someone without a disability goes first: a task even they cannot do is not counted.

A test in progress: the deaf or hard of hearing person's current step and reasoning, with a row of results per person.

Muse Voice Transcribe

Writes down what the app says out loud

Allyfix listens to the Simulator's own audio. In the demo the app says “der Bahnhof”. A hearing person is told the words; the deaf person is told only that a sound played. If nothing on screen says the same thing, they are stuck, and the report can say exactly what was missing.

“der Bahnhof”

What the app said

a sound played

All the deaf person gets

Muse Wonder

Fixes the code on a git branch

It reads your source and the failures, and answers with exact edits on a new branch. The app reloads and the same people try again. You see who gets through now and what changed on screen, then keep the fix or undo it.

Fix page: checked after the fix, all 2 get through now, 1 of 1 problems gone. VoiceOver reached 5 of 25 before and 13 of 24 after, with before and after close-ups.

No model at all

A test that stays, and catches it coming back

What got someone through is saved in your repository and replays with no AI, so re-testing is free. It can run on its own whenever the code changes. Put the old code back, and the test fails.

App overview: 9 of 9 screens reachable, 0 of 1 saved tests pass, after the code changed. A table lists screens and a result per person.

The people

Chosen after EN 301 549 §4.2, the standard the European Accessibility Act points to. Named only by access need and tool.

§PersonGetsActs
4.2.1Screen reader userWhat VoiceOver reads, in swipe order; no pictureActivates elements, as a double tap does
4.2.2Low visionThe screen at text size 235%, blurredTouches and swipes what can be made out
4.2.3Color vision deficiencyThe screenshot through a deuteranopia filterTouches and swipes
4.2.4Deaf or hard of hearingThe plain screenshot, and only that a sound playedTouches and swipes
4.2.7Limited dexterityThe plain screenshotReal taps, off their aim by a fixed tremor
4.2.10Cognitive and learningThe plain screenshotActs only on what the words on screen say

The blur and the color filter are test conditions, not a claim about how any one person sees.

Reports, from what was tested

  • For coding agents: every problem with its screen, the way there from launch, what VoiceOver reads, and how to check a fix.
  • For the law and buyers: drafts of the accessibility information the German BFSG requires, and a VPAT 2.5 EU conformance report. Only what was examined is judged; the rest is marked Not Evaluated.

What it is not

  • Not a replacement for testing with real people. It is a fast first pass; confirm its findings with people who use assistive technology.
  • Reports are drafts to review, not certificates.
  • Runs on iOS apps in the Simulator, not on devices yet. The people can't type into text fields yet, so tasks that need typing aren't tested. Hearing is modeled as none, so partial hearing loss isn't covered.

Run it

You need a Mac with macOS 15 or later, Xcode 26 with an iOS Simulator, Node.js 20 or later, and a Meta Model API key.

  1. Get the code and add your key

    git clone https://github.com/vladbars/allyfix.git && cd allyfix
    echo 'MODEL_API_KEY=your-key' > .env
  2. Start an app to test

    Vokabeln is the example, with accessibility problems to find. It opens in the Simulator; leave this terminal running.

    cd examples/vokabeln && npm install && npx expo run:ios
  3. Start Allyfix

    In a second terminal, from the allyfix folder:

    xcodebuild -project Allyfix.xcodeproj -scheme Allyfix -configuration Release \
      -derivedDataPath build CODE_SIGN_IDENTITY=- CODE_SIGN_STYLE=Manual \
      DEVELOPMENT_TEAM= PROVISIONING_PROFILE_SPECIFIER= build
    open build/Build/Products/Release/Allyfix.app
  4. Walk through the app

    Keep the Simulator window visible, then in Allyfix:

    1. Press Explore App. The first time, macOS needs Accessibility access: press Open System Settings, turn on Allyfix, come back and press I've Allowed It, then Explore App again. Allyfix walks every screen by itself.
    2. In the sidebar, select Today and press Test People. Watch who gets stuck. macOS asks once to capture system audio; allow it for the deaf person's test.
    3. Select Vokabeln at the top of the sidebar. Press Choose Screens…, select Today, keep Blocking only, and press Fix 1. When asked for the source, choose the examples/vokabeln folder.
    4. When the same people have tried again, press Keep Fix or Undo Fix. Then back on Vokabeln, press Re-test Now: it replays every screen and saved test with no model.

More in the README, including how to test your own app.