chore: prepare wintergram 1.1 release

This commit is contained in:
PAVEL IVANOV 2026-06-15 21:46:25 -07:00
parent c37205ebc7
commit f6bb33d193
253 changed files with 21000 additions and 67780 deletions

View file

@ -1,2 +0,0 @@
# Add directories or file patterns to ignore during indexing (e.g. foo/ or *.csv)
spm-files

130
.gitignore vendored
View file

@ -1,8 +1,33 @@
fastlane/README.md # WinterGram — files that should never be committed
fastlane/report.xml
fastlane/test_output/* # -----------------------------------------------------------------------------
fastlane/fastlanematch # Build outputs and caches
build/* # -----------------------------------------------------------------------------
build/
build-input/
bazel-bin
bazel-bin/*
bazel-genfiles
bazel-genfiles/*
bazel-out
bazel-out/*
bazel-testlogs
bazel-testlogs/*
bazel-telegram-ios
bazel-telegram-ios/*
bazel-WinterGram
bazel-WinterGram/*
buck-out/*
.buckd/*
DerivedData
*.hmap
*.dSYM
*.dSYM.zip
*.ipa
# -----------------------------------------------------------------------------
# Xcode / IDE user state
# -----------------------------------------------------------------------------
*.pbxuser *.pbxuser
!default.pbxuser !default.pbxuser
*.mode1v3 *.mode1v3
@ -15,28 +40,52 @@ xcuserdata
*.xccheckout *.xccheckout
*.xcscmblueprint *.xcscmblueprint
*.moved-aside *.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate *.xcuserstate
.DS_Store
*.dSYM
*.dSYM.zip
*.ipa
*/xcuserdata/* */xcuserdata/*
buck-out/*
.buckd/*
tools/buck
tools/bazel
AppBinary.xcworkspace/*
Project.xcodeproj/*
Watch/Watch.xcodeproj/*
AppBundle.xcworkspace/*
*.xcworkspace *.xcworkspace
*.xcodeproj *.xcodeproj
!*_Xcode.xcodeproj !*_Xcode.xcodeproj
.idea .idea
*/.idea/* */.idea/*
# -----------------------------------------------------------------------------
# WinterGram local configuration
# -----------------------------------------------------------------------------
build-system/wintergram-development-configuration.json
build-system/fake-codesigning-wintergram/
# -----------------------------------------------------------------------------
# Editor / AI assistant / local tooling
# -----------------------------------------------------------------------------
.vscode/
.claude/
**/.claude/settings.local.json
.xcodebuildmcp/
tools/buck
tools/bazel
# -----------------------------------------------------------------------------
# OS and swap files
# -----------------------------------------------------------------------------
.DS_Store
*.swp
*/*.swp
# -----------------------------------------------------------------------------
# Python / Node artifacts
# -----------------------------------------------------------------------------
**/*.pyc
*.pyc
**/node_modules/
tools/sim-watcher/dist/
# -----------------------------------------------------------------------------
# Submodule-generated headers and prebuilt binaries
# -----------------------------------------------------------------------------
submodules/OpusBinding/SharedHeaders/*
submodules/FFMpegBinding/SharedHeaders/*
submodules/OpenSSLEncryptionProvider/SharedHeaders/*
submodules/TelegramCore/FlatSerialization/Sources/*
submodules/MtProtoKit/TON/macOS/lib/libtonlibjson.0.5.dylib submodules/MtProtoKit/TON/macOS/lib/libtonlibjson.0.5.dylib
submodules/MtProtoKit/TON/macOS/lib/libtonlibjson.dylib submodules/MtProtoKit/TON/macOS/lib/libtonlibjson.dylib
submodules/MtProtoKit/TON/macOS/lib/cmake/Tonlib/TonlibConfig.cmake submodules/MtProtoKit/TON/macOS/lib/cmake/Tonlib/TonlibConfig.cmake
@ -49,37 +98,26 @@ submodules/MtProtoKit/TON/macOS/lib/fift/Lisp.fif
submodules/MtProtoKit/TON/macOS/lib/fift/Lists.fif submodules/MtProtoKit/TON/macOS/lib/fift/Lists.fif
submodules/MtProtoKit/TON/macOS/lib/fift/Stack.fif submodules/MtProtoKit/TON/macOS/lib/fift/Stack.fif
submodules/MtProtoKit/TON/macOS/lib/fift/TonUtil.fif submodules/MtProtoKit/TON/macOS/lib/fift/TonUtil.fif
bazel-bin
bazel-bin/* # -----------------------------------------------------------------------------
bazel-genfiles # Bazel / SPM / LSP generated files
bazel-genfiles/* # -----------------------------------------------------------------------------
bazel-out
bazel-out/*
bazel-telegram-ios
bazel-telegram-ios/*
bazel-testlogs
bazel-testlogs/*
xcodeproj.bazelrc xcodeproj.bazelrc
*/*.swp
*.swp
build-input/*
**/*.pyc
*.pyc
submodules/OpusBinding/SharedHeaders/*
submodules/FFMpegBinding/SharedHeaders/*
submodules/OpenSSLEncryptionProvider/SharedHeaders/*
submodules/TelegramCore/FlatSerialization/Sources/*
buildServer.json buildServer.json
.build/** .build/**
Telegram.LSP.json
**/.build/** **/.build/**
Telegram.LSP.json
spm-files spm-files
xcode-files xcode-files
.bsp/** .bsp/**
.sourcekit-lsp/** .sourcekit-lsp/**
/.claude/
**/.claude/settings.local.json # Legacy / tool-specific
**/.vscode/launch.json fastlane/README.md
/buildbox/* fastlane/report.xml
**/node_modules/ fastlane/test_output/*
tools/sim-watcher/dist/ fastlane/fastlanematch
AppBinary.xcworkspace/*
Project.xcodeproj/*
Watch/Watch.xcodeproj/*
AppBundle.xcworkspace/*

View file

@ -1,196 +0,0 @@
stages:
- build
- deploy
- verifysanity
- verify
- submit
variables:
LANG: "en_US.UTF-8"
LC_ALL: "en_US.UTF-8"
GIT_SUBMODULE_STRATEGY: normal
internal:
tags:
- ios_internal
stage: build
only:
- master
except:
- tags
script:
- export PATH=/opt/homebrew/opt/ruby/bin:$PATH
- export PATH=`gem environment gemdir`/bin:$PATH
- python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="build-system/appcenter-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=adhoc --configuration=release_arm64 --embedWatchApp --watchApiId="$TELEGRAM_WATCHOS_APP_ID" --watchApiHash="$TELEGRAM_WATCHOS_APP_HASH"
- python3 -u build-system/Make/DeployBuild.py --configuration="$TELEGRAM_PRIVATE_DATA_PATH/deploy-configurations/internal-configuration.json" --ipa="build/artifacts/Telegram.ipa" --dsyms="build/artifacts/Telegram.DSYMs.zip"
- rm -rf build-input/configuration-repository-workdir
- rm -rf build-input/configuration-repository
- python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="$TELEGRAM_PRIVATE_DATA_PATH/build-configurations/enterprise-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=enterprise --configuration=release_arm64 --embedWatchApp --watchApiId="$TELEGRAM_WATCHOS_APP_ID" --watchApiHash="$TELEGRAM_WATCHOS_APP_HASH"
- python3 -u build-system/Make/DeployBuild.py --configuration="$TELEGRAM_PRIVATE_DATA_PATH/deploy-configurations/enterprise-configuration.json" --ipa="build/artifacts/Telegram.ipa" --dsyms="build/artifacts/Telegram.DSYMs.zip"
environment:
name: internal
internal_testflight:
tags:
- ios_internal
stage: deploy
only:
- master
except:
- tags
script:
- python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="build-system/appstore-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=appstore --configuration=release_arm64 --embedWatchApp --watchApiId="$TELEGRAM_WATCHOS_APP_ID" --watchApiHash="$TELEGRAM_WATCHOS_APP_HASH"
- python3 -u build-system/Make/Make.py remote-deploy-testflight --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --ipa="build/artifacts/Telegram.ipa" --dsyms="build/artifacts/Telegram.DSYMs.zip"
environment:
name: testflight_llc
artifacts:
when: always
paths:
- build/artifacts
expire_in: 1 week
appstore_development:
tags:
- ios_internal
stage: build
only:
- appstore-development
except:
- tags
script:
- python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="$TELEGRAM_PRIVATE_DATA_PATH/build-configurations/enterprise-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=enterprise --configuration=release_arm64
environment:
name: appstore-development
artifacts:
paths:
- build/artifacts/Telegram.DSYMs.zip
expire_in: 1 week
experimental_i:
tags:
- ios_experimental
stage: build
only:
- experimental-3
except:
- tags
script:
- export PATH=/opt/homebrew/opt/ruby/bin:$PATH
- export PATH=`gem environment gemdir`/bin:$PATH
- python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="build-system/appcenter-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=adhoc --configuration=release_arm64
- python3 -u build-system/Make/Make.py remote-deploy-testflight --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --ipa="build/artifacts/Telegram.ipa" --dsyms="build/artifacts/Telegram.DSYMs.zip"
environment:
name: experimental
artifacts:
paths:
- build/artifacts/Telegram.DSYMs.zip
expire_in: 1 week
experimental:
tags:
- ios_internal
stage: build
only:
- experimental-2
except:
- tags
script:
- python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="$TELEGRAM_PRIVATE_DATA_PATH/build-configurations/enterprise-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=enterprise --configuration=release_arm64
environment:
name: experimental-2
artifacts:
paths:
- build/artifacts/Telegram.DSYMs.zip
expire_in: 1 week
beta_testflight:
tags:
- ios_beta
stage: build
only:
- beta
- hotfix
except:
- tags
script:
- export PATH=/opt/homebrew/opt/ruby/bin:$PATH
- export PATH=`gem environment gemdir`/bin:$PATH
- python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="build-system/appstore-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=appstore --configuration=release_arm64 --embedWatchApp --watchApiId="$TELEGRAM_WATCHOS_APP_ID" --watchApiHash="$TELEGRAM_WATCHOS_APP_HASH"
environment:
name: testflight_llc
artifacts:
paths:
- build/artifacts
expire_in: 3 weeks
deploy_beta_testflight:
tags:
- ios_beta
stage: deploy
only:
- beta
- hotfix
except:
- tags
script:
- python3 -u build-system/Make/Make.py remote-deploy-testflight --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --ipa="build/artifacts/Telegram.ipa" --dsyms="build/artifacts/Telegram.DSYMs.zip"
environment:
name: testflight_llc
verifysanity_beta_testflight:
tags:
- ios_beta
stage: verifysanity
only:
- beta
- hotfix
except:
- tags
script:
- rm -rf build/verify-input && mkdir -p build/verify-input && mv build/artifacts/Telegram.ipa build/verify-input/TelegramVerifySource.ipa
- python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="build-system/appstore-configuration.json" --codesigningInformationPath=build-system/fake-codesigning --configuration=release_arm64
- python3 -u build-system/Make/Make.py remote-ipa-diff --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --ipa1="build/artifacts/Telegram.ipa" --ipa2="build/verify-input/TelegramVerifySource.ipa"
- if [ $? -ne 0 ]; then echo "Verification failed"; mkdir -p build/verifysanity_artifacts; cp build/artifacts/Telegram.ipa build/verifysanity_artifacts/; exit 1; fi
environment:
name: testflight_llc
artifacts:
when: on_failure
paths:
- build/artifacts
expire_in: 1 week
verify_beta_testflight:
tags:
- ios_beta
stage: verify
only:
- beta
- hotfix
except:
- tags
script:
- rm -rf build/verify-input && mkdir -p build/verify-input && mv build/artifacts/Telegram.ipa build/verify-input/TelegramVerifySource.ipa
- python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --configurationPath="build-system/appstore-configuration.json" --codesigningInformationPath=build-system/fake-codesigning --configuration=release_arm64
- python3 -u build-system/Make/Make.py remote-ipa-diff --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --ipa1="build/artifacts/Telegram.ipa" --ipa2="build/verify-input/TelegramVerifySource.ipa"
- if [ $? -ne 0 ]; then echo "Verification failed"; mkdir -p build/verify_artifacts; cp build/artifacts/Telegram.ipa build/verify_artifacts/; exit 1; fi
environment:
name: testflight_llc
artifacts:
when: on_failure
paths:
- build/artifacts
expire_in: 1 week
submit_appstore:
tags:
- deploy
only:
- beta
- hotfix
stage: submit
needs: []
when: manual
script:
- sh "$TELEGRAM_SUBMIT_BUILD"
environment:
name: testflight_llc

4
.gitmodules vendored
View file

@ -1,7 +1,7 @@
[submodule "submodules/rlottie/rlottie"] [submodule "submodules/rlottie/rlottie"]
path = submodules/rlottie/rlottie path = submodules/rlottie/rlottie
url=../rlottie.git url = https://github.com/TelegramMessenger/rlottie.git
[submodule "build-system/bazel-rules/rules_apple"] [submodule "build-system/bazel-rules/rules_apple"]
path = build-system/bazel-rules/rules_apple path = build-system/bazel-rules/rules_apple
url=https://github.com/ali-fareed/rules_apple.git url=https://github.com/ali-fareed/rules_apple.git
@ -13,7 +13,7 @@ url=https://github.com/bazelbuild/rules_swift.git
url = https://github.com/bazelbuild/apple_support.git url = https://github.com/bazelbuild/apple_support.git
[submodule "submodules/TgVoipWebrtc/tgcalls"] [submodule "submodules/TgVoipWebrtc/tgcalls"]
path = submodules/TgVoipWebrtc/tgcalls path = submodules/TgVoipWebrtc/tgcalls
url=../tgcalls.git url = https://github.com/TelegramMessenger/tgcalls.git
[submodule "third-party/libvpx/libvpx"] [submodule "third-party/libvpx/libvpx"]
path = third-party/libvpx/libvpx path = third-party/libvpx/libvpx
url = https://github.com/webmproject/libvpx.git url = https://github.com/webmproject/libvpx.git

View file

@ -6,7 +6,9 @@ This file provides guidance to AI assistants when working with code in this repo
The app is built using Bazel via the `Make.py` wrapper. There is no selective per-module build — the only supported invocation builds the full `Telegram/Telegram` target. The app is built using Bazel via the `Make.py` wrapper. There is no selective per-module build — the only supported invocation builds the full `Telegram/Telegram` target.
**Command:** **Convenience wrapper:** `scripts/build-wintergram.sh` wraps the Make.py invocations for the WinterGram dev config and emits WinterGram-named IPAs in `build/`: `sim` (simulator), `sideload` / `livecontainer` (device), `all`, plus `--install`/`--run` (simulator-only: build + install into the booted Simulator), `--clean`, `--open-build-dir`. It sources `~/.zshrc` itself. App icons are regenerated from `branding/wnt-app-icon-*.png` by `scripts/generate-app-icons.sh`.
**Raw command (canonical):**
```sh ```sh
python3 build-system/Make/Make.py --overrideXcodeVersion \ python3 build-system/Make/Make.py --overrideXcodeVersion \

170
README.md
View file

@ -1,122 +1,102 @@
<h1 align="center">WinterGram</h1> # WinterGram
<h4 align="center">WinterGram (Wnt) is a feature-rich, privacy-focused Telegram client for iPhone — a native iOS port of the AyuGram experience, built on top of Telegram-iOS.</h4>
<p align="center"> <p align="center">
<a href="LICENSE"><img src="https://img.shields.io/badge/License-GPLv2-green?style=for-the-badge&logo=gnu&logoColor=FFFFFF" alt="License"></a> <img src="branding/icon-app-light.png" width="112" height="112" alt="WinterGram white icon">
<img src="https://img.shields.io/badge/Platform-iOS%2015%2B-black?style=for-the-badge&logo=apple&logoColor=white" alt="Platform">
<img src="https://img.shields.io/badge/Language-Swift-orange?style=for-the-badge&logo=swift&logoColor=white" alt="Swift">
<img src="https://img.shields.io/badge/Build-Bazel-43A047?style=for-the-badge&logo=bazel&logoColor=white" alt="Bazel">
<img src="https://img.shields.io/github/stars/reekeer/WinterGram?style=for-the-badge&logo=github&logoColor=white" alt="Stars">
<img src="https://img.shields.io/github/last-commit/reekeer/WinterGram?style=for-the-badge&logo=github&logoColor=white" alt="Last Commit">
</p> </p>
--- <p align="center">
<strong>Privacy-focused Telegram client for iOS</strong>
</p>
**WinterGram** brings the most-loved AyuGram features to iOS with a clean, Material-inspired interface, a configurable **Liquid Glass** appearance, and a single dedicated settings tab where everything lives. It speaks both the standard `tg://` deep links and its own `wnt://` scheme. <p align="center">
<a href="LICENSE"><img src="https://img.shields.io/badge/License-GPLv2-green?style=flat-square" alt="License"></a>
<img src="https://img.shields.io/badge/Version-1.1-blue?style=flat-square" alt="Version 1.1">
<img src="https://img.shields.io/badge/Platform-iOS%2015%2B-black?style=flat-square" alt="Platform">
<img src="https://img.shields.io/badge/Language-Swift-orange?style=flat-square" alt="Swift">
<img src="https://img.shields.io/badge/Build-Bazel-43A047?style=flat-square" alt="Bazel">
</p>
WinterGram (Wnt) is an independent iOS client for Telegram. It keeps the familiar Telegram experience and adds a dedicated **WinterGram** settings tab where privacy tools, history recovery, appearance controls, and other enhancements live in one place.
The app speaks both `tg://` deep links and its own `wnt://` scheme.
--- ---
## ✨ Features ## Download
### 👻 Privacy & Ghost Mode Prebuilt unsigned IPAs are published on the [Releases](../../releases) page. Install with [AltStore](https://altstore.io), [SideStore](https://sidestore.io), or another sideloading tool.
- **Ghost Mode**: don't send read receipts, typing/upload status, or online presence — toggle it all at once.
- **Send without sound**: never / only in Ghost Mode / always.
- **Story ghost**: view stories without marking them seen, with an optional confirmation prompt.
- **Mark read after action**, **go offline after going online**, and per-toggle locks.
### 🗂 History & Recovery WinterGram is not distributed on the App Store. Free Apple IDs must re-sign the app every 7 days; AltStore and SideStore can automate this.
- **Save deleted messages**: keep messages locally even after the other side deletes them.
- **Edit history**: store every revision of a message and browse it.
- **Semi-transparent deleted markers** and a customizable deleted / edited mark.
### 🧊 Hidden Archive ("AАrchive")
- Stash chats into a **separate, settings-only archive** — no notifications, no badge.
- Optional **auto-mark-read** for everything sent to the stash.
### 🛡️ Anti-Features
- **Disable ads** (sponsored messages).
- **Local Telegram Premium** — unlock Premium-gated UI locally.
- **Shadow ban** — silently hide a user's messages from your view.
- **Hide / disable stories**, **hide Premium statuses**, **disable open-link warning**.
### 💬 Chat Conveniences
- **Sticker / GIF / voice send confirmations**.
- **Message seconds** in timestamps and **peer ID** display (Telegram or Bot API form).
- **Message translation** with a selectable provider (Telegram / Google / Yandex / system).
- **WebView platform spoofing** (auto / iOS / Android / macOS / desktop) and taller WebViews.
### 🎨 Appearance & Customization
- **Liquid Glass** — frosted, translucent surfaces across the chat list, navigation, and tab bar, with **on/off toggle**, adjustable **transparency**, **blur radius**, **tint**, and per-surface application.
- **Material Design** switches and controls.
- **Avatar corner radius** (round → squircle → square) and **message bubble radius**, with optional single-corner mode.
- **Custom fonts** (UI + monospace).
- **App icons**, including the bundled WinterGram dark icon, plus **AyuGram / exteraGram icon-pack compatibility**.
- **Custom emoji** support, with an option to show only your added emoji & stickers.
--- ---
## 🔗 Deep Links ## Features
WinterGram registers and resolves two URL schemes — anything that works with `tg://` works with `wnt://`: WinterGram adds Ghost Mode, saved deleted messages, edit history, a hidden archive, local Premium UI, ad removal, Liquid Glass appearance, spoofing, chat conveniences, and more.
A complete, structured feature list is in [`docs/FEATURES.md`](docs/FEATURES.md).
Developer implementation notes: [`docs/wintergram-features.md`](docs/wintergram-features.md).
---
## Quick Start (build from source)
**Requirements:** macOS, Xcode, Python 3, ~60 GB free disk space.
```sh
git clone --recursive https://github.com/reekeer/WinterGram.git
cd WinterGram
cp build-system/wintergram-development-configuration.example.json \
build-system/wintergram-development-configuration.json
# Edit the JSON: api_id, api_hash, bundle_id, team_id
./scripts/build-wintergram.sh sim
```
The simulator IPA lands in `build/WinterGram-Simulator.ipa`. Build straight into a running Simulator with `./scripts/build-wintergram.sh --install` (add `--run` to launch it). Full instructions (device builds, signing, AltStore): [`docs/wintergram-setup.md`](docs/wintergram-setup.md).
---
## Configuration
All WinterGram options are stored in `WinterGramSettings` and exposed through the WinterGram tab in Settings. English UI strings ship in `en.lproj`; Russian translations are seeded in `submodules/TelegramPresentationData/Sources/WinterGramStrings.swift`.
---
## Project Layout
```
WinterGram/
├── Telegram/ App entry, extensions, icons, xcconfig
├── submodules/ Feature libraries (Swift / Obj-C)
├── branding/ Source art: app-icon PNGs (wnt-app-icon-*.png) + badge/snowflake shapes
├── docs/ Setup guide, feature list, architecture notes
├── build-system/ Bazel wrapper (Make.py) and configs
└── scripts/ Build + tooling
├── build-wintergram.sh Convenience build script (sim / sideload / livecontainer)
└── generate-app-icons.sh Regenerate every app icon from branding/wnt-app-icon-*.png
```
---
## Deep Links
Anything that works with `tg://` also works with `wnt://`:
``` ```
tg://resolve?domain=durov tg://resolve?domain=durov
wnt://resolve?domain=durov wnt://resolve?domain=durov
wnt://wintergram/ghost
``` ```
`wnt://` links are normalized to the standard resolver at the entry point, so they route through exactly the same handling as native Telegram links. `wnt://` URLs are normalized to `tg://` at the app entry point.
--- ---
## 🚀 Build ## Contributing
WinterGram builds with the standard Telegram-iOS toolchain (Bazel via the `Make.py` wrapper) on **macOS with Xcode**. Maintainers: [**IMDelewer**](https://github.com/IMDelewer), [**salenyo**](https://github.com/salenyo) under the [reekeer](https://github.com/reekeer) organization. See [`MAINTAINERS.md`](MAINTAINERS.md).
```sh
python3 build-system/Make/Make.py --overrideXcodeVersion \
--cacheDir ~/telegram-bazel-cache \
build \
--configurationPath build-system/appstore-configuration.json \
--gitCodesigningRepository <your-codesigning-repo> \
--gitCodesigningType development --gitCodesigningUseCurrent \
--buildNumber=1 --configuration=debug_sim_arm64
```
See [`docs/wintergram-features.md`](docs/wintergram-features.md) for the feature → implementation map and the project's architecture notes.
--- ---
## ⚙️ Configuration <p align="center"><sub><a href="LICENSE">GPLv2</a> &copy; reekeer</sub></p>
All WinterGram options live in a single settings store (`WinterGramSettings`), persisted with the app's shared-data system and exposed through reactive signals. There is one dedicated **WinterGram** tab in Settings — no scattered toggles.
---
## 🗂 Structure
```
WinterGram/
├── Telegram/ ← App entry points and extensions
├── submodules/ ← Feature libraries (Swift / Obj-C)
│ └── TelegramUIPreferences/
│ └── Sources/WinterGramSettings.swift ← all WinterGram options
├── branding/ ← WinterGram icons and brand assets
├── docs/ ← Architecture and feature documentation
├── build-system/ ← Bazel build wrapper (Make.py)
└── README.md
```
---
## 🤝 Contributing
Contributions are welcome. WinterGram is maintained by [**IMDelewer**](https://github.com/IMDelewer) and [**salenyo**](https://github.com/salenyo) under the [reekeer](https://github.com/reekeer) organization. See [`MAINTAINERS.md`](MAINTAINERS.md).
---
<p align="center">
Built on Telegram-iOS · inspired by AyuGram
</p>
<p align="center"><sub><a href="LICENSE">GPLv2</a> © reekeer</sub></p>

View file

@ -1 +0,0 @@
c27f02cf6e413fdc

View file

@ -317,21 +317,25 @@ filegroup(
) )
alternate_icon_folders = [ alternate_icon_folders = [
"BlackIcon",
"BlackClassicIcon", "BlackClassicIcon",
"BlackFilledIcon", "BlackFilledIcon",
"BlueIcon", "BlackIcon",
"BlueClassicIcon", "BlueClassicIcon",
"BlueFilledIcon", "BlueFilledIcon",
"WhiteFilledIcon", "BlueIcon",
"New1", "New1",
"New2", "New2",
"Premium", "Premium",
"PremiumBlack", "PremiumBlack",
"PremiumTurbo", "PremiumTurbo",
"WinterGramDark",
"WinterGramDeveloper",
"WinterGramHouseDark",
"WinterGramHouseLight",
"WinterGramLight",
] ]
composer_icon_folders = ["Telegram"] composer_icon_folders = []
[ [
filegroup( filegroup(
@ -434,6 +438,16 @@ plist_fragment(
<string>tonsite</string> <string>tonsite</string>
</array> </array>
</dict> </dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>CFBundleURLName</key>
<string>{telegram_bundle_id}.wnt</string>
<key>CFBundleURLSchemes</key>
<array>
<string>wnt</string>
</array>
</dict>
</array> </array>
""".format( """.format(
telegram_bundle_id = telegram_bundle_id, telegram_bundle_id = telegram_bundle_id,
@ -525,6 +539,26 @@ associated_domains_fragment = "" if telegram_bundle_id not in official_bundle_id
</array> </array>
""" """
background_modes_fragment = """
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
<string>fetch</string>
<string>location</string>
<string>remote-notification</string>
<string>voip</string>
<string>processing</string>
</array>
""" if telegram_aps_environment != "" else """
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
<string>fetch</string>
<string>location</string>
<string>processing</string>
</array>
"""
siri_fragment = "" if not telegram_enable_siri else """ siri_fragment = "" if not telegram_enable_siri else """
<key>com.apple.developer.siri</key> <key>com.apple.developer.siri</key>
<true/> <true/>
@ -629,7 +663,7 @@ plist_fragment(
template = template =
""" """
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
<string>Telegram</string> <string>WinterGram</string>
""" """
) )
@ -955,14 +989,14 @@ ios_framework(
plist_fragment( plist_fragment(
name = "ShareInfoPlist", name = "ShareInfoPlist",
extension = "plist", extension = "plist",
template = template =
""" """
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>en</string> <string>en</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>{telegram_bundle_id}.Share</string> <string>{telegram_bundle_id}.Share</string>
<key>CFBundleName</key> <key>CFBundleName</key>
<string>Telegram</string> <string>WinterGram</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>XPC!</string> <string>XPC!</string>
<key>NSExtension</key> <key>NSExtension</key>
@ -1047,14 +1081,14 @@ ios_extension(
plist_fragment( plist_fragment(
name = "NotificationContentInfoPlist", name = "NotificationContentInfoPlist",
extension = "plist", extension = "plist",
template = template =
""" """
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>en</string> <string>en</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>{telegram_bundle_id}.NotificationContent</string> <string>{telegram_bundle_id}.NotificationContent</string>
<key>CFBundleName</key> <key>CFBundleName</key>
<string>Telegram</string> <string>WinterGram</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>XPC!</string> <string>XPC!</string>
<key>NSExtension</key> <key>NSExtension</key>
@ -1154,14 +1188,14 @@ ios_extension(
plist_fragment( plist_fragment(
name = "WidgetInfoPlist", name = "WidgetInfoPlist",
extension = "plist", extension = "plist",
template = template =
""" """
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>en</string> <string>en</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>{telegram_bundle_id}.Widget</string> <string>{telegram_bundle_id}.Widget</string>
<key>CFBundleName</key> <key>CFBundleName</key>
<string>Telegram</string> <string>WinterGram</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>XPC!</string> <string>XPC!</string>
<key>NSExtension</key> <key>NSExtension</key>
@ -1267,14 +1301,14 @@ ios_extension(
plist_fragment( plist_fragment(
name = "IntentsInfoPlist", name = "IntentsInfoPlist",
extension = "plist", extension = "plist",
template = template =
""" """
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>en</string> <string>en</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>{telegram_bundle_id}.SiriIntents</string> <string>{telegram_bundle_id}.SiriIntents</string>
<key>CFBundleName</key> <key>CFBundleName</key>
<string>Telegram</string> <string>WinterGram</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>XPC!</string> <string>XPC!</string>
<key>NSExtension</key> <key>NSExtension</key>
@ -1398,14 +1432,14 @@ ios_extension(
plist_fragment( plist_fragment(
name = "BroadcastUploadInfoPlist", name = "BroadcastUploadInfoPlist",
extension = "plist", extension = "plist",
template = template =
""" """
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>en</string> <string>en</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>{telegram_bundle_id}.BroadcastUpload</string> <string>{telegram_bundle_id}.BroadcastUpload</string>
<key>CFBundleName</key> <key>CFBundleName</key>
<string>Telegram</string> <string>WinterGram</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>XPC!</string> <string>XPC!</string>
<key>NSExtension</key> <key>NSExtension</key>
@ -1492,14 +1526,14 @@ ios_extension(
plist_fragment( plist_fragment(
name = "NotificationServiceInfoPlist", name = "NotificationServiceInfoPlist",
extension = "plist", extension = "plist",
template = template =
""" """
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>en</string> <string>en</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>{telegram_bundle_id}.NotificationService</string> <string>{telegram_bundle_id}.NotificationService</string>
<key>CFBundleName</key> <key>CFBundleName</key>
<string>Telegram</string> <string>WinterGram</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>XPC!</string> <string>XPC!</string>
<key>NSExtension</key> <key>NSExtension</key>
@ -1555,7 +1589,7 @@ ios_extension(
plist_fragment( plist_fragment(
name = "TelegramInfoPlist", name = "TelegramInfoPlist",
extension = "plist", extension = "plist",
template = template =
""" """
<key>BGTaskSchedulerPermittedIdentifiers</key> <key>BGTaskSchedulerPermittedIdentifiers</key>
<array> <array>
@ -1568,11 +1602,11 @@ plist_fragment(
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>en</string> <string>en</string>
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
<string>Telegram</string> <string>WinterGram</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>{telegram_bundle_id}</string> <string>{telegram_bundle_id}</string>
<key>CFBundleName</key> <key>CFBundleName</key>
<string>Telegram</string> <string>WinterGram</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
@ -1629,17 +1663,17 @@ plist_fragment(
<key>NSCameraUsageDescription</key> <key>NSCameraUsageDescription</key>
<string>We need this so that you can take and share photos and videos.</string> <string>We need this so that you can take and share photos and videos.</string>
<key>NSContactsUsageDescription</key> <key>NSContactsUsageDescription</key>
<string>Telegram stores your contacts heavily encrypted in the cloud to let you connect with your friends across all your devices.</string> <string>WinterGram stores your contacts heavily encrypted in the cloud to let you connect with your friends across all your devices.</string>
<key>NSFaceIDUsageDescription</key> <key>NSFaceIDUsageDescription</key>
<string>You can use Face ID to unlock the app.</string> <string>You can use Face ID to unlock the app.</string>
<key>NSLocationAlwaysUsageDescription</key> <key>NSLocationAlwaysUsageDescription</key>
<string>When you send your location to your friends, Telegram needs access to show them a map. You also need this to send locations from an Apple Watch.</string> <string>When you send your location to your friends, WinterGram needs access to show them a map. You also need this to send locations from an Apple Watch.</string>
<key>NSLocationWhenInUseUsageDescription</key> <key>NSLocationWhenInUseUsageDescription</key>
<string>When you send your location to your friends, Telegram needs access to show them a map.</string> <string>When you send your location to your friends, WinterGram needs access to show them a map.</string>
<key>NSMicrophoneUsageDescription</key> <key>NSMicrophoneUsageDescription</key>
<string>We need this so that you can record and share voice messages and videos with sound.</string> <string>We need this so that you can record and share voice messages and videos with sound.</string>
<key>NSMotionUsageDescription</key> <key>NSMotionUsageDescription</key>
<string>When you send your location to your friends, Telegram needs access to show them a map.</string> <string>When you send your location to your friends, WinterGram needs access to show them a map.</string>
<key>NSPhotoLibraryAddUsageDescription</key> <key>NSPhotoLibraryAddUsageDescription</key>
<string>We need this so that you can share photos and videos from your photo library.</string> <string>We need this so that you can share photos and videos from your photo library.</string>
<key>NSPhotoLibraryUsageDescription</key> <key>NSPhotoLibraryUsageDescription</key>
@ -1658,15 +1692,7 @@ plist_fragment(
<string>AremacFS-Regular.otf</string> <string>AremacFS-Regular.otf</string>
<string>AremacFS-Semibold.otf</string> <string>AremacFS-Semibold.otf</string>
</array> </array>
<key>UIBackgroundModes</key> {background_modes_fragment}
<array>
<string>audio</string>
<string>fetch</string>
<string>location</string>
<string>remote-notification</string>
<string>voip</string>
<string>processing</string>
</array>
<key>UIDeviceFamily</key> <key>UIDeviceFamily</key>
<array> <array>
<integer>1</integer> <integer>1</integer>
@ -1707,13 +1733,13 @@ plist_fragment(
<string>public.data</string> <string>public.data</string>
</array> </array>
<key>UTTypeDescription</key> <key>UTTypeDescription</key>
<string>Telegram iOS Color Theme File</string> <string>WinterGram iOS Color Theme File</string>
<key>UTTypeIconFiles</key> <key>UTTypeIconFiles</key>
<array> <array>
<string>BlueIcon@3x.png</string> <string>BlueIcon@3x.png</string>
</array> </array>
<key>UTTypeIdentifier</key> <key>UTTypeIdentifier</key>
<string>org.telegram.Telegram-iOS.theme</string> <string>dev.reekeer.wintergram.theme</string>
<key>UTTypeTagSpecification</key> <key>UTTypeTagSpecification</key>
<dict> <dict>
<key>public.filename-extension</key> <key>public.filename-extension</key>
@ -1729,6 +1755,7 @@ plist_fragment(
<true/> <true/>
""".format( """.format(
telegram_bundle_id = telegram_bundle_id, telegram_bundle_id = telegram_bundle_id,
background_modes_fragment = background_modes_fragment,
) )
) )
@ -1777,12 +1804,13 @@ ios_application(
":UrlTypesInfoPlist", ":UrlTypesInfoPlist",
], ],
app_icons = [ ":{}_icon".format(name) for name in composer_icon_folders ], app_icons = [ ":{}_icon".format(name) for name in composer_icon_folders ],
primary_app_icon = "WinterGramDarkIcon",
alternate_icons = [ alternate_icons = [
":{}".format(name) for name in alternate_icon_folders ":{}".format(name) for name in alternate_icon_folders
], ],
resources = [ resources = [
":LaunchScreen", ":LaunchScreen",
#":DefaultAppIcon", ":DefaultAppIcon",
], ],
frameworks = [ frameworks = [
":MtProtoKitFramework", ":MtProtoKitFramework",
@ -1845,9 +1873,9 @@ filegroup(
) )
ios_test_runner( ios_test_runner(
name = "iPhone-17__26.2", name = "iPhone-17__26.5",
device_type = "iPhone 17", device_type = "iPhone 17",
os_version = "26.2", os_version = "26.5",
) )
@ -1864,7 +1892,7 @@ ios_ui_test_suite(
bundle_id = "org.telegram.Telegram-iOS-uitests", bundle_id = "org.telegram.Telegram-iOS-uitests",
minimum_os_version = minimum_os_version, minimum_os_version = minimum_os_version,
runners = [ runners = [
":iPhone-17__26.2", ":iPhone-17__26.5",
], ],
tags = ["manual"], tags = ["manual"],
test_host = "//Telegram", test_host = "//Telegram",

View file

@ -72,7 +72,29 @@
<key>UIPrerenderedIcon</key> <key>UIPrerenderedIcon</key>
<true/> <true/>
</dict> </dict>
<key>New1</key> <key>WinterGramDark</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>WinterGramDarkIpad</string>
<string>WinterGramDarkLargeIpad</string>
<string>WinterGramDarkNotificationIcon</string>
</array>
<key>UIPrerenderedIcon</key>
<true/>
</dict>
<key>WinterGramLight</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>WinterGramLightIpad</string>
<string>WinterGramLightLargeIpad</string>
<string>WinterGramLightNotificationIcon</string>
</array>
<key>UIPrerenderedIcon</key>
<true/>
</dict>
<key>New1</key>
<dict> <dict>
<key>CFBundleIconFiles</key> <key>CFBundleIconFiles</key>
<array> <array>

View file

@ -66,6 +66,26 @@
<key>UIPrerenderedIcon</key> <key>UIPrerenderedIcon</key>
<true/> <true/>
</dict> </dict>
<key>WinterGramDark</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>WinterGramDark</string>
<string>WinterGramDarkNotificationIcon</string>
</array>
<key>UIPrerenderedIcon</key>
<true/>
</dict>
<key>WinterGramLight</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>WinterGramLight</string>
<string>WinterGramLightNotificationIcon</string>
</array>
<key>UIPrerenderedIcon</key>
<true/>
</dict>
<key>New1</key> <key>New1</key>
<dict> <dict>
<key>CFBundleIconFiles</key> <key>CFBundleIconFiles</key>

View file

@ -0,0 +1,8 @@
{
"images" : [
{ "idiom" : "universal", "scale" : "1x" },
{ "filename" : "WinterGramDark@2x.png", "idiom" : "universal", "scale" : "2x" },
{ "filename" : "WinterGramDark@3x.png", "idiom" : "universal", "scale" : "3x" }
],
"info" : { "author" : "xcode", "version" : 1 }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View file

@ -0,0 +1,8 @@
{
"images" : [
{ "idiom" : "universal", "scale" : "1x" },
{ "filename" : "WinterGramDeveloper@2x.png", "idiom" : "universal", "scale" : "2x" },
{ "filename" : "WinterGramDeveloper@3x.png", "idiom" : "universal", "scale" : "3x" }
],
"info" : { "author" : "xcode", "version" : 1 }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View file

@ -0,0 +1,8 @@
{
"images" : [
{ "idiom" : "universal", "scale" : "1x" },
{ "filename" : "WinterGramHouseDark@2x.png", "idiom" : "universal", "scale" : "2x" },
{ "filename" : "WinterGramHouseDark@3x.png", "idiom" : "universal", "scale" : "3x" }
],
"info" : { "author" : "xcode", "version" : 1 }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

View file

@ -0,0 +1,8 @@
{
"images" : [
{ "idiom" : "universal", "scale" : "1x" },
{ "filename" : "WinterGramHouseLight@2x.png", "idiom" : "universal", "scale" : "2x" },
{ "filename" : "WinterGramHouseLight@3x.png", "idiom" : "universal", "scale" : "3x" }
],
"info" : { "author" : "xcode", "version" : 1 }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

View file

@ -0,0 +1,8 @@
{
"images" : [
{ "idiom" : "universal", "scale" : "1x" },
{ "filename" : "WinterGramLight@2x.png", "idiom" : "universal", "scale" : "2x" },
{ "filename" : "WinterGramLight@3x.png", "idiom" : "universal", "scale" : "3x" }
],
"info" : { "author" : "xcode", "version" : 1 }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View file

@ -1,4 +1,4 @@
APP_NAME=Telegram APP_NAME=WinterGram
APP_BUNDLE_ID=ph.telegra.Telegraph APP_BUNDLE_ID=ph.telegra.Telegraph
APP_SPECIFIC_URL_SCHEME=tgapp APP_SPECIFIC_URL_SCHEME=tgapp

View file

@ -1,4 +1,4 @@
APP_NAME=Telegram Fork APP_NAME=WinterGram
APP_BUNDLE_ID=fork.telegram.Fork APP_BUNDLE_ID=fork.telegram.Fork
APP_SPECIFIC_URL_SCHEME=tgfork APP_SPECIFIC_URL_SCHEME=tgfork

View file

@ -0,0 +1,8 @@
APP_NAME=WinterGram
APP_BUNDLE_ID=dev.reekeer.wintergram
APP_SPECIFIC_URL_SCHEME=wnt
GLOBAL_CONSTANTS = APP_CONFIG_IS_INTERNAL_BUILD=true APP_CONFIG_IS_APPSTORE_BUILD=false APP_CONFIG_APPSTORE_ID=0 APP_SPECIFIC_URL_SCHEME="\"$(APP_SPECIFIC_URL_SCHEME)\""
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) $(GLOBAL_CONSTANTS)
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) APP_CONFIG_API_ID=2040 APP_CONFIG_API_HASH="\"b18441a1ff607e10a989891a5462e627\"" APP_CONFIG_HOCKEYAPP_ID=""

View file

@ -1,115 +1,110 @@
{ {
"images" : [ "images": [
{ {
"filename" : "BlueNotificationIcon@2x.png", "filename": "BlueNotificationIcon@2x.png",
"idiom" : "iphone", "idiom": "iphone",
"scale" : "2x", "scale": "2x",
"size" : "20x20" "size": "20x20"
}, },
{ {
"filename" : "BlueNotificationIcon@3x.png", "filename": "BlueNotificationIcon@3x.png",
"idiom" : "iphone", "idiom": "iphone",
"scale" : "3x", "scale": "3x",
"size" : "20x20" "size": "20x20"
}, },
{ {
"filename" : "Simple@58x58.png", "filename": "Simple@58x58.png",
"idiom" : "iphone", "idiom": "iphone",
"scale" : "2x", "scale": "2x",
"size" : "29x29" "size": "29x29"
}, },
{ {
"filename" : "Simple@87x87.png", "filename": "Simple@87x87.png",
"idiom" : "iphone", "idiom": "iphone",
"scale" : "3x", "scale": "3x",
"size" : "29x29" "size": "29x29"
}, },
{ {
"filename" : "Simple@80x80.png", "filename": "Simple@80x80.png",
"idiom" : "iphone", "idiom": "iphone",
"scale" : "2x", "scale": "2x",
"size" : "40x40" "size": "40x40"
}, },
{ {
"filename" : "BlueIcon@2x-1.png", "filename": "BlueIcon@2x-1.png",
"idiom" : "iphone", "idiom": "iphone",
"scale" : "3x", "scale": "3x",
"size" : "40x40" "size": "40x40"
}, },
{ {
"filename" : "BlueIcon@2x.png", "filename": "BlueIcon@2x.png",
"idiom" : "iphone", "idiom": "iphone",
"scale" : "2x", "scale": "2x",
"size" : "60x60" "size": "60x60"
}, },
{ {
"filename" : "BlueIcon@3x.png", "filename": "BlueIcon@3x.png",
"idiom" : "iphone", "idiom": "iphone",
"scale" : "3x", "scale": "3x",
"size" : "60x60" "size": "60x60"
}, },
{ {
"filename" : "BlueNotificationIcon.png", "filename": "BlueNotificationIcon.png",
"idiom" : "ipad", "idiom": "ipad",
"scale" : "1x", "scale": "1x",
"size" : "20x20" "size": "20x20"
}, },
{ {
"filename" : "BlueNotificationIcon@2x-1.png", "filename": "BlueNotificationIcon@2x-1.png",
"idiom" : "ipad", "idiom": "ipad",
"scale" : "2x", "scale": "2x",
"size" : "20x20" "size": "20x20"
}, },
{ {
"filename" : "Simple@29x29.png", "filename": "Simple@29x29.png",
"idiom" : "ipad", "idiom": "ipad",
"scale" : "1x", "scale": "1x",
"size" : "29x29" "size": "29x29"
}, },
{ {
"filename" : "Simple@58x58-1.png", "filename": "Simple@58x58-1.png",
"idiom" : "ipad", "idiom": "ipad",
"scale" : "2x", "scale": "2x",
"size" : "29x29" "size": "29x29"
}, },
{ {
"filename" : "Simple@40x40-1.png", "filename": "Simple@40x40-1.png",
"idiom" : "ipad", "idiom": "ipad",
"scale" : "1x", "scale": "1x",
"size" : "40x40" "size": "40x40"
}, },
{ {
"filename" : "Simple@80x80-1.png", "filename": "Simple@80x80-1.png",
"idiom" : "ipad", "idiom": "ipad",
"scale" : "2x", "scale": "2x",
"size" : "40x40" "size": "40x40"
}, },
{ {
"idiom" : "ipad", "filename": "BlueIconIpad@2x.png",
"scale" : "1x", "idiom": "ipad",
"size" : "76x76" "scale": "2x",
"size": "76x76"
}, },
{ {
"filename" : "BlueIconIpad@2x.png", "filename": "BlueIconLargeIpad@2x.png",
"idiom" : "ipad", "idiom": "ipad",
"scale" : "2x", "scale": "2x",
"size" : "76x76" "size": "83.5x83.5"
}, },
{ {
"filename" : "BlueIconLargeIpad@2x.png", "filename": "Simple-iTunesArtwork.png",
"idiom" : "ipad", "idiom": "ios-marketing",
"scale" : "2x", "scale": "1x",
"size" : "83.5x83.5" "size": "1024x1024"
},
{
"filename" : "Simple-iTunesArtwork.png",
"idiom" : "ios-marketing",
"scale" : "1x",
"size" : "1024x1024"
} }
], ],
"info" : { "info": {
"author" : "xcode", "author": "xcode",
"version" : 1 "version": 1
} }
} }

View file

@ -0,0 +1,8 @@
{
"images" : [
{ "idiom" : "universal", "scale" : "1x" },
{ "filename" : "WinterGramBadge@2x.png", "idiom" : "universal", "scale" : "2x" },
{ "filename" : "WinterGramBadge@3x.png", "idiom" : "universal", "scale" : "3x" }
],
"info" : { "author" : "xcode", "version" : 1 }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

View file

@ -84,12 +84,6 @@
"scale" : "2x", "scale" : "2x",
"size" : "40x40" "size" : "40x40"
}, },
{
"filename" : "Icon-76.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "76x76"
},
{ {
"filename" : "Icon-152.png", "filename" : "Icon-152.png",
"idiom" : "ipad", "idiom" : "ipad",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 771 KiB

After

Width:  |  Height:  |  Size: 590 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 8 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

Before After
Before After

View file

@ -0,0 +1,8 @@
{
"images" : [
{ "idiom" : "universal", "scale" : "1x" },
{ "filename" : "WinterGramSnowflake@2x.png", "idiom" : "universal", "scale" : "2x" },
{ "filename" : "WinterGramSnowflake@3x.png", "idiom" : "universal", "scale" : "3x" }
],
"info" : { "author" : "xcode", "version" : 1 }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -0,0 +1,6 @@
{
"images" : [
{ "filename" : "WntGramBackplateShape.png", "idiom" : "universal", "scale" : "1x" }
],
"info" : { "author" : "xcode", "version" : 1 }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View file

@ -0,0 +1,8 @@
{
"images" : [
{ "idiom" : "universal", "scale" : "1x" },
{ "filename" : "WntGramBanner@2x.png", "idiom" : "universal", "scale" : "2x" },
{ "filename" : "WntGramBanner@3x.png", "idiom" : "universal", "scale" : "3x" }
],
"info" : { "author" : "xcode", "version" : 1 }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 460 KiB

View file

@ -0,0 +1,8 @@
{
"images" : [
{ "idiom" : "universal", "scale" : "1x" },
{ "filename" : "WntGramBannerDefault@2x.png", "idiom" : "universal", "scale" : "2x" },
{ "filename" : "WntGramBannerDefault@3x.png", "idiom" : "universal", "scale" : "3x" }
],
"info" : { "author" : "xcode", "version" : 1 }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 KiB

View file

@ -0,0 +1,8 @@
{
"images" : [
{ "idiom" : "universal", "scale" : "1x" },
{ "filename" : "WntGramDeveloperBadge@2x.png", "idiom" : "universal", "scale" : "2x" },
{ "filename" : "WntGramDeveloperBadge@3x.png", "idiom" : "universal", "scale" : "3x" }
],
"info" : { "author" : "xcode", "version" : 1 }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View file

@ -0,0 +1,6 @@
{
"images" : [
{ "filename" : "WntGramSnowflakeShape.png", "idiom" : "universal", "scale" : "1x" }
],
"info" : { "author" : "xcode", "version" : 1 }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

View file

@ -85,11 +85,31 @@
<key>UIPrerenderedIcon</key> <key>UIPrerenderedIcon</key>
<true/> <true/>
</dict> </dict>
<key>WinterGramDark</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>WinterGramDark</string>
<string>WinterGramDarkNotificationIcon</string>
</array>
<key>UIPrerenderedIcon</key>
<true/>
</dict>
<key>WinterGramLight</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>WinterGramLight</string>
<string>WinterGramLightNotificationIcon</string>
</array>
<key>UIPrerenderedIcon</key>
<true/>
</dict>
</dict> </dict>
<key>CFBundlePrimaryIcon</key> <key>CFBundlePrimaryIcon</key>
<dict> <dict>
<key>CFBundleIconName</key> <key>CFBundleIconName</key>
<string>AppIconLLC</string> <string>WinterGramDarkIcon</string>
<key>UIPrerenderedIcon</key> <key>UIPrerenderedIcon</key>
<true/> <true/>
</dict> </dict>
@ -171,11 +191,33 @@
<key>UIPrerenderedIcon</key> <key>UIPrerenderedIcon</key>
<true/> <true/>
</dict> </dict>
<key>WinterGramDark</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>WinterGramDarkIpad</string>
<string>WinterGramDarkLargeIpad</string>
<string>WinterGramDarkNotificationIcon</string>
</array>
<key>UIPrerenderedIcon</key>
<true/>
</dict>
<key>WinterGramLight</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>WinterGramLightIpad</string>
<string>WinterGramLightLargeIpad</string>
<string>WinterGramLightNotificationIcon</string>
</array>
<key>UIPrerenderedIcon</key>
<true/>
</dict>
</dict> </dict>
<key>CFBundlePrimaryIcon</key> <key>CFBundlePrimaryIcon</key>
<dict> <dict>
<key>CFBundleIconName</key> <key>CFBundleIconName</key>
<string>AppIconLLC</string> <string>WinterGramDarkIcon</string>
<key>UIPrerenderedIcon</key> <key>UIPrerenderedIcon</key>
<true/> <true/>
</dict> </dict>
@ -277,17 +319,17 @@
<key>NSCameraUsageDescription</key> <key>NSCameraUsageDescription</key>
<string>We need this so that you can take and share photos and videos.</string> <string>We need this so that you can take and share photos and videos.</string>
<key>NSContactsUsageDescription</key> <key>NSContactsUsageDescription</key>
<string>Telegram stores your contacts heavily encrypted in the cloud to let you connect with your friends across all your devices.</string> <string>WinterGram stores your contacts heavily encrypted in the cloud to let you connect with your friends across all your devices.</string>
<key>NSFaceIDUsageDescription</key> <key>NSFaceIDUsageDescription</key>
<string>You can use Face ID to unlock the app.</string> <string>You can use Face ID to unlock the app.</string>
<key>NSLocationAlwaysUsageDescription</key> <key>NSLocationAlwaysUsageDescription</key>
<string>When you send your location to your friends, Telegram needs access to show them a map. You also need this to send locations from an Apple Watch.</string> <string>When you send your location to your friends, WinterGram needs access to show them a map. You also need this to send locations from an Apple Watch.</string>
<key>NSLocationWhenInUseUsageDescription</key> <key>NSLocationWhenInUseUsageDescription</key>
<string>When you send your location to your friends, Telegram needs access to show them a map.</string> <string>When you send your location to your friends, WinterGram needs access to show them a map.</string>
<key>NSMicrophoneUsageDescription</key> <key>NSMicrophoneUsageDescription</key>
<string>We need this so that you can record and share voice messages and videos with sound.</string> <string>We need this so that you can record and share voice messages and videos with sound.</string>
<key>NSMotionUsageDescription</key> <key>NSMotionUsageDescription</key>
<string>When you send your location to your friends, Telegram needs access to show them a map.</string> <string>When you send your location to your friends, WinterGram needs access to show them a map.</string>
<key>NSPhotoLibraryAddUsageDescription</key> <key>NSPhotoLibraryAddUsageDescription</key>
<string>We need this so that you can share photos and videos from your photo library.</string> <string>We need this so that you can share photos and videos from your photo library.</string>
<key>NSPhotoLibraryUsageDescription</key> <key>NSPhotoLibraryUsageDescription</key>
@ -355,13 +397,13 @@
<string>public.data</string> <string>public.data</string>
</array> </array>
<key>UTTypeDescription</key> <key>UTTypeDescription</key>
<string>Telegram iOS Color Theme File</string> <string>WinterGram iOS Color Theme File</string>
<key>UTTypeIconFiles</key> <key>UTTypeIconFiles</key>
<array> <array>
<string>BlueIcon@3x.png</string> <string>BlueIcon@3x.png</string>
</array> </array>
<key>UTTypeIdentifier</key> <key>UTTypeIdentifier</key>
<string>org.telegram.Telegram-iOS.theme</string> <string>dev.reekeer.wintergram.theme</string>
<key>UTTypeTagSpecification</key> <key>UTTypeTagSpecification</key>
<dict> <dict>
<key>public.filename-extension</key> <key>public.filename-extension</key>

View file

@ -111,17 +111,17 @@
<key>NSCameraUsageDescription</key> <key>NSCameraUsageDescription</key>
<string>We need this so that you can take and share photos and videos.</string> <string>We need this so that you can take and share photos and videos.</string>
<key>NSContactsUsageDescription</key> <key>NSContactsUsageDescription</key>
<string>Telegram stores your contacts heavily encrypted in the cloud to let you connect with your friends across all your devices.</string> <string>WinterGram stores your contacts heavily encrypted in the cloud to let you connect with your friends across all your devices.</string>
<key>NSFaceIDUsageDescription</key> <key>NSFaceIDUsageDescription</key>
<string>You can use Face ID to unlock the app.</string> <string>You can use Face ID to unlock the app.</string>
<key>NSLocationAlwaysUsageDescription</key> <key>NSLocationAlwaysUsageDescription</key>
<string>When you send your location to your friends, Telegram needs access to show them a map. You also need this to send locations from an Apple Watch.</string> <string>When you send your location to your friends, WinterGram needs access to show them a map. You also need this to send locations from an Apple Watch.</string>
<key>NSLocationWhenInUseUsageDescription</key> <key>NSLocationWhenInUseUsageDescription</key>
<string>When you send your location to your friends, Telegram needs access to show them a map.</string> <string>When you send your location to your friends, WinterGram needs access to show them a map.</string>
<key>NSMicrophoneUsageDescription</key> <key>NSMicrophoneUsageDescription</key>
<string>We need this so that you can record and share voice messages and videos with sound.</string> <string>We need this so that you can record and share voice messages and videos with sound.</string>
<key>NSMotionUsageDescription</key> <key>NSMotionUsageDescription</key>
<string>When you send your location to your friends, Telegram needs access to show them a map.</string> <string>When you send your location to your friends, WinterGram needs access to show them a map.</string>
<key>NSPhotoLibraryAddUsageDescription</key> <key>NSPhotoLibraryAddUsageDescription</key>
<string>We need this so that you can share photos and videos from your photo library.</string> <string>We need this so that you can share photos and videos from your photo library.</string>
<key>NSPhotoLibraryUsageDescription</key> <key>NSPhotoLibraryUsageDescription</key>
@ -189,13 +189,13 @@
<string>public.data</string> <string>public.data</string>
</array> </array>
<key>UTTypeDescription</key> <key>UTTypeDescription</key>
<string>Telegram iOS Color Theme File</string> <string>WinterGram iOS Color Theme File</string>
<key>UTTypeIconFiles</key> <key>UTTypeIconFiles</key>
<array> <array>
<string>BlueIcon@3x.png</string> <string>BlueIcon@3x.png</string>
</array> </array>
<key>UTTypeIdentifier</key> <key>UTTypeIdentifier</key>
<string>org.telegram.Telegram-iOS.theme</string> <string>dev.reekeer.wintergram.theme</string>
<key>UTTypeTagSpecification</key> <key>UTTypeTagSpecification</key>
<dict> <dict>
<key>public.filename-extension</key> <key>public.filename-extension</key>

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Some files were not shown because too many files have changed in this diff Show more