Closes the first of the two future-wave candidates left open by wave 8 by
rewriting both AccountSpecificCacheStorageSettings preferences-view
observation sites in StorageUsageScreen.swift using engine APIs, and
drops import Postbox from that file.
Site 1 — cacheSettingsExceptionCount (former 1047-1087):
postbox.combinedView(keys: [.preferences(keys: Set([...]))]) +
PreferencesView ->
context.engine.data.subscribe(TelegramEngine.EngineData.Item
.Configuration.ApplicationSpecific-
Preference(key: ...))
+ preferencesEntry?.get(...)
Site 2 — peerExceptions (former 3131-3196):
- Same preferences-observation replacement as Site 1.
- postbox.transaction { transaction.getPeer / getPeerCachedData as?
CachedGroupData / CachedChannelData; FoundPeer(peer:subscribers:) }
-> context.engine.data.get(EngineDataMap(...TelegramEngine.Engine-
Data.Item.Peer.Peer.init(id:))) + pattern match on EnginePeer
.user / .secretChat / .legacyGroup / .channel
- Signal element: [(peer: FoundPeer, value: Int32)] -> [(peer: Engine-
Peer, value: Int32)]. FoundPeer wrapper and its `subscribers` field
dropped — computed but never read downstream (consumers only read
.isEmpty, .count, and .prefix(3).map { EnginePeer($0.peer.peer) }).
Consumer update:
peerExceptions.prefix(3).map { EnginePeer($0.peer.peer) } ->
.prefix(3).map { $0.peer }
Typealias fixup (caught by first-pass build failure):
var mergedMedia: [MessageId: Int64] -> [EngineMessage.Id: Int64]
(MessageId is raw Postbox; must use the EngineMessage.Id typealias
when import Postbox is removed.)
Reusable pattern documented in CLAUDE.md: TelegramEngine.EngineData.Item
.Configuration.ApplicationSpecificPreference(key: ValueBoxKey) is the
general-purpose engine replacement for the postbox.combinedView(keys:
[.preferences(keys: Set([key]))]) + PreferencesView idiom. Works from
any module importing TelegramCore (without import Postbox) because
passing PreferencesKeys.<name> keeps ValueBoxKey as an inferred-only
type that never gets named in the consumer.
Net: 1 file changed, +30 / -54.
StorageUsageScreen.swift is now Postbox-free. The wave 8 outcome's other
future candidate (StorageFileListPanelComponent.swift's Icon.media(Media,
...) enum case) remains — trivial future wave will land the whole-module
drop.
Plan: docs/superpowers/plans/2026-04-20-postbox-to-telegramengine-wave-9.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
||
|---|---|---|
| .github | ||
| .vscode | ||
| build-system | ||
| buildbox | ||
| docs | ||
| scripts | ||
| submodules | ||
| Telegram | ||
| Tests | ||
| third-party | ||
| tools | ||
| .bazelrc | ||
| .cursorignore | ||
| .gitattributes | ||
| .gitignore | ||
| .gitlab-ci.yml | ||
| .gitmodules | ||
| BUILD.bazel | ||
| build_number_offset | ||
| CLAUDE.md | ||
| MODULE.bazel | ||
| MODULE.bazel.lock | ||
| Random.txt | ||
| README.md | ||
| versions.json | ||
| WORKSPACE | ||
Telegram iOS Source Code Compilation Guide
We welcome all developers to use our API and source code to create applications on our platform. There are several things we require from all developers for the moment.
Creating your Telegram Application
- Obtain your own api_id for your application.
- Please do not use the name Telegram for your app — or make sure your users understand that it is unofficial.
- Kindly do not use our standard logo (white paper plane in a blue circle) as your app's logo.
- Please study our security guidelines and take good care of your users' data and privacy.
- Please remember to publish your code too in order to comply with the licences.
Quick Compilation Guide
Get the Code
git clone --recursive -j8 https://github.com/TelegramMessenger/Telegram-iOS.git
Setup Xcode
Install Xcode (directly from https://developer.apple.com/download/applications or using the App Store).
Adjust Configuration
- Generate a random identifier:
openssl rand -hex 8
- Create a new Xcode project. Use
Telegramas the Product Name. Useorg.{identifier from step 1}as the Organization Identifier. - Open
Keychain Accessand navigate toCertificates. LocateApple Development: your@email.address (XXXXXXXXXX)and double tap the certificate. UnderDetails, locateOrganizational Unit. This is the Team ID. - Edit
build-system/template_minimal_development_configuration.json. Use data from the previous steps.
Generate an Xcode project
python3 build-system/Make/Make.py \
--cacheDir="$HOME/telegram-bazel-cache" \
generateProject \
--configurationPath=build-system/template_minimal_development_configuration.json \
--xcodeManagedCodesigning
Advanced Compilation Guide
Xcode
- Copy and edit
build-system/appstore-configuration.json. - Copy
build-system/fake-codesigning. Create and download provisioning profiles, using theprofilesfolder as a reference for the entitlements. - Generate an Xcode project:
python3 build-system/Make/Make.py \
--cacheDir="$HOME/telegram-bazel-cache" \
generateProject \
--configurationPath=configuration_from_step_1.json \
--codesigningInformationPath=directory_from_step_2
IPA
- Repeat the steps from the previous section. Use distribution provisioning profiles.
- Run:
python3 build-system/Make/Make.py \
--cacheDir="$HOME/telegram-bazel-cache" \
build \
--configurationPath=...see previous section... \
--codesigningInformationPath=...see previous section... \
--buildNumber=100001 \
--configuration=release_arm64
FAQ
Xcode is stuck at "build-request.json not updated yet"
Occasionally, you might observe the following message in your build log:
"/Users/xxx/Library/Developer/Xcode/DerivedData/Telegram-xxx/Build/Intermediates.noindex/XCBuildData/xxx.xcbuilddata/build-request.json" not updated yet, waiting...
Should this occur, simply cancel the ongoing build and initiate a new one.
Telegram_xcodeproj: no such package
Following a system restart, the auto-generated Xcode project might encounter a build failure accompanied by this error:
ERROR: Skipping '@rules_xcodeproj_generated//generator/Telegram/Telegram_xcodeproj:Telegram_xcodeproj': no such package '@rules_xcodeproj_generated//generator/Telegram/Telegram_xcodeproj': BUILD file not found in directory 'generator/Telegram/Telegram_xcodeproj' of external repository @rules_xcodeproj_generated. Add a BUILD file to a directory to mark it as a package.
If you encounter this issue, re-run the project generation steps in the README.
Tips
Codesigning is not required for simulator-only builds
Add --disableProvisioningProfiles:
python3 build-system/Make/Make.py \
--cacheDir="$HOME/telegram-bazel-cache" \
generateProject \
--configurationPath=path-to-configuration.json \
--codesigningInformationPath=path-to-provisioning-data \
--disableProvisioningProfiles
Versions
Each release is built using a specific Xcode version (see versions.json). The helper script checks the versions of the installed software and reports an error if they don't match the ones specified in versions.json. It is possible to bypass these checks:
python3 build-system/Make/Make.py --overrideXcodeVersion build ... # Don't check the version of Xcode