Hi everyone,
Due to the numerous issues VoiceOver users face with the Telegram app on iOS and the frustrating lack of attention from Telegram’s developers regarding accessibility, I decided to take action myself and make Telegram Web more accessible. Now, Telegram is largely usable through Safari.
To get started, follow these steps carefully:
- First, install the Userscripts app from the App Store:
Download Userscripts from the App Store - Next, open the Settings app on your iPhone. Scroll down to your list of apps to find and tap Safari. From there, go to Extensions and enable the Userscripts extension.
- Now, open the Files app, navigate to the Userscripts folder (by default located under the "On My iPhone" path), and place the script file you downloaded from this post into this folder.
- Inside that same folder, you must delete the default demo.js file that is included with the Userscripts app, as it will cause conflicts.
- Finally, completely close Safari (from the app switcher) and re-open it to have the script activated.
From now on, when you visit web.telegram.org/a/, all your channels, groups, and chats will be properly labeled and accessible. Inside groups and channels, you can set the VoiceOver Rotor to Headings to move more easily between messages. To open and access the options related to a message, channel, or group, use the double-tap and hold gesture, which will bring up the context menu to access stuff like copy, forward, etc.
This script also makes it possible to download audio files and access comments.
Please be aware of a few things. If audio playback does not start, you need to select "Close Audio Player" and try again. This issue is not related to the script but comes from Telegram Web on iOS. Sometimes, after recording a voice message, VoiceOver audio may switch to the top earpiece of the iPhone. This is another bug in Telegram Web.
I also want to add that while I have done my best to minimize issues, this script may not be perfect. Given the complexity of Telegram Web, you might still encounter occasional bugs, such as a group being misidentified as a channel.
You are free to modify the source code of this script, and if you add new features, please share them with others. If you encounter problems with the script itself, please leave a comment on this post so we can see whether it is possible to work around them given the limitations of Telegram Web.
Download:
Download the script from Google Drive
Comments
Full Feature List for the Telegram Web Accessibility Script
Core Accessibility & Navigation
Live Announcements
Media & File Handling
Interactive Elements & UI Fixes
Mac OS Compatibility.
So Thanks for all the hard work. Does this script work on Mac OS Safari? I Haven't tried it yet.
re:Mac OS Compatibility.
Hi, and you're very welcome!
It will most likely work on macOS Safari. However, I should mention that the script has been primarily optimized for touch devices like iOS, so I'm not entirely sure how it will perform on a desktop environment.
For example, on Chrome for Windows, it doesn't work as smoothly as it does on iOS, and there can be some issues with clicking on certain options.
If you decide to try it, I would be very interested to hear about your experience!
Big thanks for this script
First of all, I would like to thank the author for resolving the accessibility issues that the developers of the official application should deal with, but I'm not sure that we will ever wait for this.
And there are also several small questions that I would like to clarify:
1) Which version of the Telegram Web Client is preferable to use with this script? The source code indicates that the script is matched with both A and K versions of the client, however, given that they are implemented using significantly different frameworks and libraries, I would like to know which version the script was mainly tested with?
2) Did any of the users turn on the notifications from the Web version of Telegram? As for me, site requests the appropriate permission, a section for this site even appears in the system settings of notifications, however, the notifications are disabled in the settings of the client itself, and when trying to enable a checkbox, a message appears that notifications are not supported in this browser. I use iOS 26, before that there was the same issue on iOS 18.6, the browser, of course, Safari. It is clear that the mobile application copes well with notifications, but when you click on the notification center, I would like to immediately move on to Web version.
Thanks in advanced.
re: Big thanks for this script
Hi, thank you so much for the kind words and for your detailed feedback. It's truly appreciated. I'm glad the script is helpful.
To answer your questions:
1) You are correct to ask about the different versions. The script was developed and tested on the `/a/` version of Telegram Web, which is the default version you are directed to. It is not designed to work with the `/k/` version. Thank you for pointing out that the script is currently set to match the `/k/` URL; this was included for some early testing and will be removed in the next update to avoid confusion. While it doesn't cause any harm, the `/a/` version is the intended environment for the script to function correctly.
2) Regarding your question about notifications, my understanding is that push notifications for Telegram Web on iOS only work correctly when you install the site as a PWA (Progressive Web App) to your Home Screen. That is why you are unable to enable them directly in the browser.
The challenge with this, however, is that an installed PWA runs in its own separate container, which Safari extensions (like Userscripts) cannot access. This means the accessibility script will not function on the PWA version.
However, there is a workaround you could try to get the best of both worlds:
This setup would give you two icons on your home screen. You'll receive timely notifications from the PWA, and when you want to read and reply to messages, you can open the Safari shortcut to use the fully accessible version with the script.
I hope this helps!
re: Big thanks for this script
Hi again,
Just a quick follow-up: I've now removed the match for the /k/ version from the script. If you download it again from the source, the new version will no longer include that URL.
Thanks again for pointing it out!
could someone do a demo?
I think a demo would be helpful especially how to create the two separate shortcuts that are needed.
UNABLE TO IDENTIFY CHANNELS
Hi,
I've never used the web version of Telegram before as I normally use the app so I may well be missing something blindingly obvious!
I've downloaded and enabled the UserScripts app on my phone using iOS 18.6.2 - there seemed to be two similar scripts in the App Store so I chose the one without in-app purchases. I then downloaded the provided JavaScript code from the link and placed it in the UserScripts folder on my phone.
Unfortunately, after logging into Telegram, I don't seem to be able to see things in the format described and can't locate groups or DMs explicitly. I can swipe through various posts but there's no indication of whether they're DMs etc and I can't move from message to message using headings as, I think, is intended.
Any suggestions as to what I may be doing wrong, please?
re: UNABLE TO IDENTIFY CHANNELS
Hi Richard,
Thanks for trying out the script and for the detailed description of the issue. It sounds like the script isn't activating correctly, which is usually due to a small setup issue.
Here are a couple of things to check that should resolve the problem:
1.
Check the Filename: Please make sure the script file you copied into the Userscripts folder has its original, complete name and that the filename ends with the .js extension. Sometimes the name can be changed or cut short during the download or saving process.
2.
Remove the Demo File & Restart Safari: The Userscripts app comes with a default demo.js file. This can sometimes cause conflicts. Please delete that demo file from the Userscripts folder. After you do that, it's very important to fully close Safari (by swiping it up from the app switcher) and then open it again.
The behavior you're describing is exactly what happens when the script itself isn't being loaded, so one of these steps should fix it. Please let me know if that works for you!
Installation Instructions Updated
Hi everyone,
Just a quick note to let you know that the installation guide in the main post has been updated with clearer, step-by-step instructions. This should help resolve any setup issues.
When selecting a chat how do I go to the top of that chat
So in the web client when selecting a particular chat and double tapping on it you have to scroll down to get to that chat messages and all or go to the botom of the screen and flick left to go to the options.
But let's say I want to call that particular person how do I do it?
The only way I can see it being done is going to open menu and then contacts and selecting that person.
Is that correct?
WEB-client issue
I'm not sure, whether it fixable with user scripts, but WEB-version of telegram has strange issue, when chat list remains focusable even if some chat is already open. It seams like list of all chats stays behind currently opened chat, and when sliding over messages, some of other chats can be focused with VO.
re: When selecting a chat how do I go to the top of that chat
You are correct, the focus starts at the bottom of the screen.
For a fast way to get to the top of the chat, simply touch the top of the screen with your finger. VoiceOver will focus on the contact's name in the header. From there, you can swipe right to find the "Call" and "More Options" buttons.
re: WEB-client issue
Hi, thank you for pointing this out. You've described a very frustrating issue with the Telegram Web client itself, and you're right, it can make navigation very confusing. When you open a chat on your phone, you don't expect the chat list to interfere in the background.
I was aware of this problem, and I specifically designed the script to solve it. Here is the solution:
The script works by turning every single message in the chat into a proper, navigable heading. This creates a clean path for VoiceOver to follow, completely ignoring the chat list that is still active in the background.
So, when you open any chat, simply set your VoiceOver Rotor to 'Headings'.
Once you've done that, you can just swipe down with one finger to move cleanly from one message to the next, just like you're reading a document. By navigating this way, you will stay within the message list and will never accidentally focus on the chat list behind it.
This is the intended way to read through chats with the script. I hope you can enjoy a much smoother and more pleasant experience!
re: WEB-client issue
Okay, thank you for the explanations!
I am enjoy to use headings for navigation between messages. The issue is noticeable only when I try to use the explore by touch, instead of Voiceover gestures, however, this is not the most frequent use case for interaction with messages.
Unable to navigate messages by headings
I'm unable to navigate the messages by headings.
when I use the roter to get to headings and swipe down it says that heading not found.
re: Unable to navigate messages by headings
Hi Kushal,
Thank you for reporting this. The behavior you're describing—"heading not found"—is the key indicator that the accessibility script is not running at all. When the script is active, it's impossible for VoiceOver not to find headings, because the script converts every message into one.
This is almost always caused by a small issue during the setup process. Could you please double-check these steps?
1.
Delete the Demo File: Open the Files app and go to the Userscripts folder. Please make sure you have deleted the demo.js file that comes with the app. This file can prevent the Telegram script from running.
2.
Verify the Filename: Ensure the script file you downloaded is named correctly and ends with the .js extension.
3.
Fully Restart Safari: After deleting the demo file, you must completely close Safari (swipe it up from the app switcher) and then reopen it. This forces the extension to reload the correct script.
If you follow those three steps, the heading navigation should start working as expected. Please let me know if that solves it for you!
what about Safari on Mac?
Would it be possible to adapt this to work there? unlike the situation with iOS, there's no telegram client for the Mac at all.
Verified the steps.
Verified the steps and the the .js extention is present in the file name.
Have deleted the dock demo file.
id the whole setup again.
Did the whole setup again and still having heading not found issue.
FYI I am running IOS 26 developer beta 9.
even tried saving the web app to the home screen
Even tried saving the web app to the home screen to see if that would help but still that didn't help with the heading not found issue.
Please look into this.
I followed all the correct steps.
I mean it's not a minor issue but still navigating messages by heading would be great.
But well done on the script and making telegram accessible.
About heading not found issue
I'm also using iOS 26 Developer Beta 9, and script works perfectly.
First of all userscripts doesn't work in web-apps, so you should use safari with opened telegram, not site added to homescreen. But it's still possible to create shortcut to quickly open site from HS.
Another one possibly obvious question: did you try to go to previous message, not to next one? Focus often placed at last message in the chat, so when trying to go to the next heading VO says that there's no one.
Tried going to swiping up for previous heading
tried swiping up for previous heading but still the same issuew
RE: Tried going to swiping up for previous heading
Do you use A version of Telegram client -- the script intended to work with Telegram A, not K.
Does it announce type of chat in chat list (like Group, Channel, et cetera)? If not, script not loaded at all.
How do I check the clients?
How do I check the client? And no, it doesn’t announce the type of chat whether it’s a channel or a group but I have done all the steps correctly so wondering why the script wouldn’t have loaded.
RE: How do I check the clients?
You can go to the address like https://web.telegram.org/a (last part of the path corresponds to client and may be a or k).
Currently it means that script not loaded for this site. It could be due to mismatched telegram client (script matches only to web.telegram.org/a), or to some issue during the installation process.
answer to Kushal Solanki
Hi Kushal,
First, I want to give a big thank you to user26335377 for their excellent help in diagnosing the problem.
They are absolutely correct: if you are not hearing the chat types announced (like "Group" or "Channel"), it's a clear sign that the script has not loaded at all. The "heading not found" issue is just a symptom of this.
The most common reason for this, even when all other steps are correct, is being on the wrong version of Telegram Web. The script is specifically designed to work with the /a/ version.
Let's try a process to force the correct version to load:
1.
First, fully close Safari (swipe it up from the app switcher).
2.
Next, open your Userscripts folder in the Files app. Please double-check that my script file is there and that the demo.js file has been deleted.
3.
Finally, open Safari and manually type the exact address into the address bar: https://web.telegram.org/a. It is crucial to use this specific URL and not rely on a bookmark or browser history.
The page should now load with the script active. To confirm, check if VoiceOver announces the chat types. If it does, heading navigation will now work inside your chats.
I hope this solves the issue for you!
re: what about Safari on Mac?
Hi Tayo,
Thanks for the question. I haven't had the chance to test the script on Safari for macOS myself, so I can't confirm if it works.
The "Userscripts" extension required for the script is also available on the Mac App Store, so it should be possible to install it.
If you're willing, could you please test it out and let us know your results? Your feedback would be very helpful for other Mac users.
Issue resolved – script now working perfectly
I followed your steps exactly and it worked! After switching to the /a/ version of Telegram Web and double-checking the script setup, VoiceOver now announces the chat types and heading navigation works inside chats. Everything is running perfectly. Thank you very much for the clear guidance!
re: Issue resolved – script now working perfectly
That's wonderful news, Qinan!
I'm really happy to hear that the instructions helped and the script is now working perfectly for you. Thank you very much for taking the time to report back and confirm that the /a/ version was the key.
Enjoy using it!
A New Name for the Project: "Accessible Telegram"
Hi everyone,
Just a quick note to let you know that I've updated the title of this post to: "Accessible Telegram: Script to Enhance Telegram Web Accessibility for VoiceOver Users on iOS".
I made this change to better reflect the goal of the project: to let users know that this script offers a new, viable possibility for using the service, not just a minor tweak.
Thank you all for your feedback!
Most important step forward for Telegram accessibility on iOS
This script is the most significant development in Telegram accessibility on iOS in recent years. I had the privilege of testing different versions of it, and I sincerely thank Mahmood for his hard work. It is unfortunate that Telegram’s developers remain so inattentive to accessibility despite years of requests.
re:Most important step forward for Telegram accessibility on iOs
Thank you so much for your very kind and supportive words, Amir. I truly appreciate it.
Your feedback while testing the different versions was incredibly helpful and played a big part in making the script what it is today. I'm just so glad that we finally have a more accessible way to use Telegram.
Thanks again for all your help!
script working correctly now.
So since I went to the web.telegram.org/a the scripts are working perfectly and I can navigate messages by heading"
Thanks so much guys for all your help.
This is a big step forward in telegram accessibility.
Suggestion
suggestion for the playback control
as well as the previous and next buttons is it possible to add the track position?
So like swiping up and down to go forward within a track and back within a track.
to complacated
While it is a nice idea in theory. I spent 30 plus minutes trying to get it to work. I had zero luck. First I tried downloading the file I got a html file and didn't see download when I clicked the link. If I long pressed the link for the Google drive link I got download file. I then deleted the user script file. I then didn't see the user script folder.. If this can be easier and more stream lined it would be great.
I will do a demo
I will do a demo of the process at some point dennis.
It works great once you have everything working.
@ Kushal
Thank you this is probably something I'm missing but when you've tried for 30 minutes and haven't gotten it is frustrating.
When doing the demo please cover how to download the script
I'm sure it is something stupid i'm missing. I click on the link I see nothing no download nothing. any ideas?
Do you have the google drive app?
So do you have the google drive ap?
The download link is at the botom of the post before the comments start.
Anyway when you double tap on the link it will say unsupported file format
You can do a scrub gesture and then you should see the more options.
Double tap on that then select open in and double tap on that.
Go to save to files and then the userscript polder.
Hope this helps.
Link for the script.
Here's the link of the script of the script you can download.
https://drive.google.com/file/d/1L5lZppO9MTNifhwby76Wl3ypbhAO_0lT/view?usp=sharing
I do not have the google drive app
I do not have the Google Drive app is that needed?
Yes would be preferable
Yes this would be preferable so this way you can save the script from the google drive app to files.
Will be an easier way to do it.
The web version of google drive is clunky so don't blame you for getting frustrated.
I'll wait for your demo
I'll wait for your demo. Then I will have no issues :)
the other issue
Once I deleted the user script from the user script folder I didn't see the user script folder anymore.
Voice message not accessible via heading navigation after closin
I noticed that after playing a voice message and then pressing the close button, it can no longer be reached through heading navigation. My guess is that once the message has been played, it no longer keeps the level 3 heading role, while the other messages in the chat still remain as level 3 headings. I am from China and my English is not very good, I am using translation software to communicate here. Please forgive me if any of my wording is inappropriate, and thank you.
re: Suggestion
Hi Kushal,
Thank you for the excellent suggestion regarding track position control.
We have explored this possibility extensively. Unfortunately, after trying every possible method, we've concluded that it's not technically feasible to implement on the current version of the web app.
The audio player component is sandboxed in a way that prevents external scripts from programmatically controlling the playback time. Any attempts to simulate a seek command are ignored by the application.
Essentially, no matter what we tried, it didn't work.
We appreciate you taking the time to provide this valuable feedback.
re: Voice message not accessible via heading navigation after ..
Hi Qinan Su,
Thank you for the detailed bug report.
I have tested for the behavior you described, but I was unable to reproduce the issue.
My "Telegram Web Accessibility Helper" script is specifically designed to address this by ensuring voice messages retain their heading role after being played.
Thank you so much!
I wanted to thank you for your excellent work—Telegram is finally accessible on iPhone. In the past, there was the Brightguide app, but it hasn’t been updated for several years and no longer works. With your script I was able to do practically everything; the only thing is that in one group it opens some messages that are not accessible via the web, but only through the Telegram app. These are private links, not convertible with the web.telegram.org link. They look like this: https://t.me/c/2154320508/31574/31576.
Safari can’t open them, but that’s not a limitation of your script, it’s just a limitation of the Telegram Web platform itself.
In any case, thanks to your script, 90% of Telegram is finally accessible! Thank you!
I also wanted to mention that I took the liberty of using your script and asked Gemini to translate all the messages into Italian, without changing anything in the code itself, and everything works fine. If you ever want to provide multilingual support, or group the various scripts by language, let me know.
Sorry for the double post
After checking again, I noticed that those links which didn’t open in Telegram /a version can actually be opened with the /k version. From what I understand, it seems to be more complete. Would it be possible to try making that version accessible as well? Thanks again!