Dasher is an information-efficient text-entry interface, driven by continuous pointing gestures. It lets you write using eye gaze, a mouse, a switch, a joystick, or touch — designed for accessibility and augmentative communication (AAC).
This is the Apple frontend — iOS, macOS, and visionOS — built on the shared DasherCore engine.
dasher.at — downloads, user docs, and live demo Feature status — what each platform supports All repos — engine, frontends, design guide
Beta — the macOS app is available as a beta; the iOS app, keyboard extension, and visionOS targets are in active development. See the feature matrix for per-target status.
| Target | Platform | Description |
|---|---|---|
| DasherApp | iOS 17+ | Flagship iPhone/iPad app |
| DasherKeyboard | iOS 17+ | System-wide custom keyboard extension |
| DasherMac | macOS 14+ | Mac app with direct-mode (accessibility API) |
| DasherVision | visionOS 1.0+ | Apple Vision Pro app with hand-tracking |
Shared Swift lives in DasherShared/ (access/input configuration, shared UI)
and DasherSpeech/ (TTS via swift-tts-wrapper),
managed as local Swift Package Manager targets.
Beta builds are on the Releases page. Not yet on the App Store. See the feature status for availability.
- Xcode 16+, Swift 5.9+
- XcodeGen and SwiftLint —
brew install xcodegen swiftlint - Git (with submodules)
git clone --recurse-submodules https://github.com/dasher-project/Dasher-Apple.git
cd Dasher-Apple
xcodegen generate # produces Dasher.xcodeproj
open Dasher.xcodeprojSelect a scheme (DasherApp, DasherKeyboard, DasherMac, or
DasherVision) and build.
The
.xcodeprojis not committed — it is regenerated fromproject.ymlby XcodeGen on every clone. SwiftLint runs as a build phase (config in.swiftlint.yml). Xcode Cloud runs the above automatically viaci_scripts/ci_post_clone.sh.
Each frontend talks to DasherCore only through its flat C API
(dasher.h)
via per-target bridging headers (#import "dasher.h"). DasherCore is compiled
from source as a per-platform static library; the frontend owns input capture,
canvas rendering (Metal / CoreGraphics), and platform UI (SwiftUI).
flowchart TD
subgraph Frontend["Apple frontend - this repo"]
UI["SwiftUI / AppKit / RealityKit<br/>platform UI + input capture"]
Bridge["DasherBridge (Swift)<br/>bridging header: dasher.h"]
Canvas["Metal / CoreGraphics canvas"]
end
subgraph Engine["DasherCore - submodule"]
CAPI["dasher.h - flat C API"]
Core["C++17 engine<br/>language model · node tree · rendering"]
end
UI -- "pointer / switch / tilt input" --> Bridge
Bridge -- "mouse_move · down · up · key_event · frame()" --> CAPI
CAPI --> Core
Core -- "draw commands (int32[] quads)" --> Bridge
Bridge --> Canvas
Core -- "output text · speech · clipboard" --> Bridge
Bridge -- "entered text" --> UI
See the architecture overview and DasherCore's C API for the engine contract.
| Directory | Purpose |
|---|---|
DasherApp/ |
iOS app (SwiftUI) |
DasherKeyboard/ |
iOS custom keyboard extension (memory-constrained, standalone) |
DasherMac/ |
macOS app (SwiftUI + AppKit) |
DasherVision/ |
visionOS app (SwiftUI + RealityKit) |
DasherShared/ |
Shared Swift — access config, input methods, UI |
DasherSpeech/ |
Shared TTS wrapper (swift-tts-wrapper) |
DasherEngine/ |
Resource bundle (DasherCore data files) |
DasherCore/ |
Submodule — the C++ engine (PR upstream, don't edit here) |
See CONTRIBUTING.md for build details, code style, the DasherCore submodule policy, and DCO sign-off. For project-wide conventions (code of conduct, RFCs, security), see the org contributing guide.
- Developer handbook — architecture, build, contributing, RFCs
- Feature status matrix — what's supported where
Crash reports. If DasherMac crashes, macOS writes a report to
~/Library/Logs/DiagnosticReports/Dasher-*.ips. On the next launch Dasher
offers to reveal this folder — attaching the .ips to a
GitHub issue is the
fastest way to help us fix it. (Anonymous crash events are also sent to PostHog
if you've opted in to analytics.)
MIT — see LICENSE. The bundled DasherCore submodule retains its
own MIT license.