The Accessibility Filesystem
Find a file
Nolan Darilek f2aea2677f
All checks were successful
Test / test (push) Successful in 1m27s
chore: Upgrade polyfuse.
2025-12-05 08:07:28 -05:00
.forgejo/workflows refactor: Remove REPL and CLI commands, and rename to acfs. 2025-12-04 13:25:35 -05:00
src refactor: Remove REPL and CLI commands, and rename to acfs. 2025-12-04 13:25:35 -05:00
.envrc chore: Add additional build and development environment setup 2025-11-13 15:33:20 -05:00
.gitignore feat: Add FUSE filesystem view of accessibility tree 2025-11-29 13:27:53 -06:00
.pre-commit-config.yaml chore: Move lint configuration into Cargo.toml 2025-11-26 14:30:41 -06:00
Cargo.lock chore: Upgrade polyfuse. 2025-12-05 08:07:28 -05:00
Cargo.toml refactor: Remove REPL and CLI commands, and rename to acfs. 2025-12-04 13:25:35 -05:00
CHANGELOG.md chore: Add initial release tooling 2025-11-30 11:38:03 -06:00
cliff.toml refactor: Remove REPL and CLI commands, and rename to acfs. 2025-12-04 13:25:35 -05:00
flake.lock chore: Update Nix environment 2025-11-29 16:31:14 -06:00
flake.nix refactor: Remove REPL and CLI commands, and rename to acfs. 2025-12-04 13:25:35 -05:00
LICENSE chore: Add license and README 2025-11-29 14:05:51 -06:00
README.md refactor: Remove REPL and CLI commands, and rename to acfs. 2025-12-04 13:25:35 -05:00

acfs

Mount the AT-SPI2 accessibility tree as a read-only FUSE filesystem.

Repository: https://dev.thewordnerd.info/nolan/acfs

Installation

With a Rust toolchain:

cargo install --git https://dev.thewordnerd.info/nolan/acfs

To upgrade, re-run with --force.

Or with Nix:

nix profile install git+https://dev.thewordnerd.info/nolan/acfs

To upgrade:

nix profile upgrade acfs --refresh

Usage

Mount to a temporary directory:

$ acfs
Mounted at: /tmp/acfs-a1b2c3
Press Ctrl+C to unmount and exit.

Mount to a specific path:

$ acfs ./a11y
Mounted at: /home/user/a11y
Press Ctrl+C to unmount and exit.

Enable verbose logging:

$ acfs -v      # info
$ acfs -vv     # debug
$ acfs -vvv    # trace

Filesystem Structure

Each accessible application appears as a directory at the mount root. Within each application, the accessibility tree is exposed as nested directories with property files:

/tmp/acfs-xxx/
├── firefox-1.45/
│   ├── name           # "Firefox"
│   ├── role           # "application"
│   ├── states         # ["enabled", "sensitive", ...]
│   ├── interfaces/    # Supported AT-SPI interfaces
│   ├── events.json.sock -> /run/user/.../events.sock
│   └── frame-2/
│       ├── name
│       ├── role
│       └── ...
└── gnome-terminal-1.20/
    └── ...

The events.json.sock symlink points to a Unix socket that streams JSON-formatted accessibility events for that subtree.

Warning: Some development tools (IDEs, game engines, build systems) recursively scan the current working directory. Mounting within a project directory can cause these tools to traverse the entire accessibility tree, saturating D-Bus with lookups. The default temporary directory avoids this issue.

License

MIT