Self-hosted AltStore / SideStore / LiveContainer repository that streams IPA files from Telegram channels.
No IPA files are stored in this repo. The local server reads Telegram with your own account session and streams files.
Note
If you are looking to have an IPA repository from Github repos, check out GithubStore.
Important
Don't know where to find Telegram channels with IPAs? Check out this collection.
- Create
docker-compose.yml:
services:
app:
image: ghcr.io/yazdipour/telestore:latest
ports:
- "8080:8080" # if port 8080 is in use, change to another port, for example "9090:8080", and set server.base_url to http://localhost:9090
volumes:
- telegram-session:/data
- ./config.yml:/app/config.yml
restart: unless-stopped
volumes:
telegram-session:-
Create Telegram API credentials at https://my.telegram.org/apps.
-
Create
config.yml:cp config.example.yml config.yml
telegram:
api_id: 123456
api_hash: your_api_hash
session: /data/telegram.session
limit: 100
server:
base_url: http://localhost:8080
ui_config: true
cache_seconds: 600
ipa_cache_dir: /data/ipa-cache
ipa_cache_workers: 4
ipa_cache_global_workers: 8
ipa_cache_part_size: 8388608
channels:
- blatants
- dvntms- Start the server:
docker compose up -dFirst run starts even without a Telegram session. Open this URL and log in: http://localhost:8080/login
The session is saved in the telegram-session Docker volume, so later docker compose up runs skip login.
Each configured channel gets its own source JSON, named from the source slug:
http://localhost:8080/blatants.json
http://localhost:8080/dvntms.json
On an iPhone on the same Wi-Fi, set server.base_url to the reachable URL. For example, if your computer LAN IP is 192.168.1.50 and Docker maps host port 8080:
http://192.168.1.50:8080/blatants.json.
server:
cache_seconds: 600
ipa_cache_dir: /data/ipa-cache
ipa_cache_workers: 4
ipa_cache_global_workers: 8
ipa_cache_part_size: 8388608Source JSON is cached for server.cache_seconds. IPA downloads are cached under server.ipa_cache_dir after the first request. Range requests then serve from local disk instead of re-fetching the same bytes from Telegram. On cold range requests, server.ipa_cache_workers downloads cache parts concurrently using server.ipa_cache_part_size byte chunks. server.ipa_cache_global_workers caps total Telegram cache downloads across files.
The channel editor is enabled by default. To disable editing, set:
server:
ui_config: falseOpen http://localhost:8080 to add or remove channels and copy each channel source URL. New channels are saved as plain strings, use the Telegram handle as the display name, use a deterministic random tint color, and use the Telegram channel photo as the icon.
Use local build when changing source:
cp config.example.yml config.yml
docker compose -f docker-compose.local.yml up --buildRun tests locally from a virtualenv or other Python environment with dependencies installed:
python -m pip install -r requirements.txt
python -m unittest discover -s testsThis project was built with the assistance of AI tools for code generation and refactoring.
MIT License. See LICENSE for details.



