Accessibility engineering project
Pulsar: a screen reader for Android, rebuilt for speed.
Pulsar is a fork of Google's TalkBack. I use a screen reader every day, and the thing that wears me down is not missing features, it is latency: the pause before a swipe speaks, the wait for the reading-controls menu, the lag on play and pause. Pulsar is where I fix that, while keeping everything TalkBack already does.
What this project shows
I did not want new features. I wanted the old ones to keep up.
TalkBack is open source under the Apache license, so I forked it. Pulsar keeps everything TalkBack does and rebuilds the parts that felt slow next to iOS VoiceOver: speech that starts before you finish the gesture, a reading-controls menu that opens in under a second, play and pause that responds on the first tap.
Skills demonstrated
- Android accessibility service internals (AccessibilityService, node trees, event handling)
- Profiling and removing latency in a real, in-use screen reader
- Java, Kotlin, and JNI / C++ across one codebase
- Working inside a large existing codebase, not a green field
- Built because I use it every day
What is different
Same screen reader. Less waiting.
Speech that starts early
On a swipe, Pulsar works out the next element and starts speaking it before your finger lifts, with the element you were on cached so it never has to look twice. The result is much closer to how VoiceOver feels on an iPhone.
A menu that opens now
The reading-controls menu used to take a beat to appear. I traced most of that delay to the screen reader enumerating every installed voice on the way up. Pulsar caches that result, and the menu opens in well under a second.
Play and pause on the first tap
Two-finger double tap to pause your audio used to sit through a half-second window meant for catching a second tap. Pulsar talks to the media session directly, so it stops when you tell it to.
Faster web reading
Jumping by heading or by link in Chrome used to round-trip through the browser each time. Pulsar walks the page locally and preheats speech, so heading-to-heading navigation drops from roughly a third of a second to about a tenth.
Gestures that fit how I work
A twist gesture for reading controls, a both-volume-keys tap to toggle the screen reader off and back on, keyboard typing that speaks the key before the rule chain catches up. Small things, but I reach for them constantly.
Better voices
Pulsar can use the higher-quality Google text-to-speech voices that are normally gated off, so the voice you hear all day sounds less robotic.
The result
Day to day, Pulsar is the difference between a screen reader you wait on and one that keeps up. Everything TalkBack could do, with the lag taken out of the parts you touch most.
Why this matters
Speed is an accessibility feature.
If a screen reader is a half-second behind on every action, that half-second is the interface. I cannot fix that by filing a bug, so I rebuilt it. Same instinct as everything else here: I needed the software to work, so I made it work.
Built with
- Forked from Google's TalkBack (Apache 2.0)
- Java and Kotlin
- JNI / C++ for the audio and braille layers
- Android AccessibilityService and related framework APIs
- A lot of profiling on a real Pixel
Where to get it
Pulsar is going up on Google Play. It installs as your accessibility service the same way TalkBack does, and it does not need root. There is a privacy policy that covers exactly what the app touches: the Pulsar privacy policy.
Want to see more of my work?
The portfolio has accessibility audits alongside engineering projects like this one.