7.9 KiB
FORK_DIVERGENCE
This document tracks the functional and behavioral differences between this forked repository and its upstream baseline. Each entry represents a deliberate divergence introduced to meet the specific needs of this fork.
D-0002: Letro colour palette, gradient buttons, URL corrections, and live-location permission
- Upstream baseline commit:
e0ca2acc43649d4c80194d84d2179a7a9310d7eb - Fork commit (merge):
bbdee132f18c9bfe90f448aa1f3956ddd79df39b(PR #4 —p-num/letroMain) - Type:
Behavioral - Date:
2026-04-16
Description
Follow-up polish to the D-0001 rebrand: expands Letro's colour tokens and applies them more broadly, replaces flat primary buttons with a gradient, corrects remaining element.io/matrix.org URLs to letro.com, adds the background-location usage description required for live-location sharing, and refines localisation strings.
Upstream vs. Fork Behavior
| Area | Upstream (Element X) | Fork (Letro) |
|---|---|---|
| Primary button background | Flat fill using bgActionPrimaryRest token |
Linear gradient (letroGradient1 → letroGradient5) via custom makePrimaryBackground in CompoundButtonStyle |
| Compound colour overrides | Not overridden | Extended: gradientAction stops, bgActionPrimaryRest/Pressed/Disabled, textActionPrimary all mapped to Letro gradient palette |
letroPrimary colour |
#C20000 (D-0001) |
#F32D1B; letroSecondary (#F9BC15) and five gradient steps (#CB2000–#F7B000) added |
| App URLs | Leftover element.io/matrix.org references |
elementWebHosts, accountProvisioningHost, pushGatewayBaseURL, analyticsTermsURL, bugReportApplicationID corrected to letro.com/letro |
| App Store link | Element Pro app | Letro Pro app (id6758909629) |
| Live-location permission | NSLocationWhenInUseUsageDescription only |
NSLocationAlwaysAndWhenInUseUsageDescription added for background live-location |
Files Modified
ElementX/Sources/Application/Settings/AppSettings.swiftElementX/Sources/Letro/Extensions/CompoundExtensions.swiftElementX/Sources/Letro/Extensions/SwiftUIExtensions.swiftElementX/SupportingFiles/Info.plistElementX/SupportingFiles/target.ymlElementX/Resources/Localizations/en.lproj/Letro.stringsElementX/Resources/Localizations/en.lproj/Letro.stringsdictcompound-ios/Sources/Compound/BaseStyles/CompoundButtonStyle.swift
Impact & Risk
- Impact: Visual impact on all primary action buttons and gradient surfaces. URL changes affect bug reporting, analytics, web-link handling, and push gateway routing. Background-location permission is required for live-location feature to work correctly on iOS.
- Risk Level:
MEDIUM. Colour and URL changes are self-contained; gradient button logic modifies a shared Compound component and must be retested on iOS 26.
AGPL Relevance
Not Applicable
D-0001: Letro rebranding — identity, UI, configuration, and behaviour customisations
- Upstream baseline commit:
0fc0e68346f90488e4af21fd5528b2e978aa3247 - Fork commit (merge):
e0ca2acc43649d4c80194d84d2179a7a9310d7eb(PR #1 —p-num/letroMain) - Type:
Behavioral - Date:
2026-04-10
Description
A comprehensive rebrand and product customisation of Element X iOS into "Letro". The changes span the app's identity (name, bundle ID, icons), its visual design (colours, shapes, custom assets), several screens (authentication, home, spaces, settings), and supporting infrastructure (string-override mechanism, SwiftGen template, entitlements).
Upstream vs. Fork Behavior
| Area | Upstream (Element X) | Fork (Letro) |
|---|---|---|
| App identity | Bundle ID io.element.elementx, display name "Element X", dev team 7J4U792NQT |
Bundle ID com.letro.cloudclient, display name "Letro", dev team 44TCX5L4G2 |
| Default Matrix server | matrix.org |
ess.postnumber.com |
| Colour theme | System (light/dark) | Forced light theme; Compound gradient/accent tokens overridden with orange palette |
| Avatar shape | Circular throughout | Rounded rectangle throughout |
| Authentication screen | Element-branded scrollable layout with logo and sign-in buttons | Custom background image, logo type, "Get Started" → bottom-sheet flow showing sign-in buttons; hardcoded non-localised promo text |
| String localisation | Standard Localizable.strings lookup |
Additional Letro.strings/Letro.stringsdict override table checked first, allowing any string to be shadowed without editing upstream files |
| Icons (tab bar / new button) | Compound icon set | Custom SVGs (letro-icon-chat, letro-icon-space, letro-icon-new); CompoundIcon patched with static override registry |
| Tab bar label colours | Default Compound accent | Custom letroGray (normal) / letroPrimary red (selected) |
| Settings screen | Shows "Report a problem" and "Analytics" rows | Both rows commented out / hidden |
| Onboarding analytics prompt | Shown when analytics consent is pending | Always skipped (requiresAnalyticsSetup hardcoded to false) |
| New-chat / new-space toolbar button | CompoundIcon(\.plus) with .super style |
Custom letro-icon-new image; iOS 26 sharedBackgroundVisibility hidden |
| App URLs | All point to element.io |
All point to letro.com (website, copyright, privacy, OIDC redirect, etc.) |
| Push (NSE) entitlement | Present | Temporarily removed to allow TestFlight submission |
| App version | 26.04.1 / build 1 |
1.0.3 / build 3 |
Files Modified
app.ymlproject.ymlElementX/SupportingFiles/target.ymlElementX/SupportingFiles/ElementX.entitlementsNSE/SupportingFiles/NSE.entitlementsElementX/Sources/Application/Application.swiftElementX/Sources/Application/Navigation/NavigationTabCoordinator.swiftElementX/Sources/Application/Settings/AppSettings.swiftElementX/Sources/FlowCoordinators/OnboardingFlowCoordinator.swiftElementX/Sources/Generated/Assets.swiftElementX/Sources/Generated/Strings.swiftElementX/Sources/Letro/Extensions/CompoundExtensions.swift(new)ElementX/Sources/Letro/Extensions/SwiftUIExtensions.swift(new)ElementX/Sources/Other/Avatars.swiftElementX/Sources/Other/SwiftUI/Views/RoomAvatarImage.swiftElementX/Sources/Other/SwiftUI/Views/TombstonedAvatarImage.swiftElementX/Sources/Screens/Authentication/StartScreen/View/AuthenticationStartScreen.swiftElementX/Sources/Screens/HomeScreen/View/Filters/RoomListFilterView.swiftElementX/Sources/Screens/HomeScreen/View/HomeScreen.swiftElementX/Sources/Screens/RoomDetailsEditScreen/View/RoomDetailsEditScreen.swiftElementX/Sources/Screens/Settings/SettingsScreen/View/SettingsScreen.swiftElementX/Sources/Screens/Spaces/SpacesScreen/View/SpacesScreen.swiftElementX/Resources/Localizations/en.lproj/Letro.strings(new)ElementX/Resources/Localizations/en.lproj/Letro.stringsdict(new)ElementX/Resources/AppIcon.icon/(icon assets replaced)ElementX/Resources/Assets.xcassets/images/(new Letro image assets)compound-ios/Sources/Compound/Icons/CompoundIcon.swiftTools/SwiftGen/Templates/Strings/structured-swift5-element.stencilElementX.xcodeproj/project.pbxprojElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolvedElementX.xcodeproj/xcshareddata/xcschemes/*.xcscheme(scheme renames/updates)
Impact & Risk
- Impact: Touches app identity, all major screens, the global colour/icon system, the string localisation pipeline, onboarding flow, and build configuration. Any upstream merge must re-apply or carefully reconcile every change. New image assets and the
Letro.stringsoverride table must be maintained alongside upstream string additions. - Risk Level:
HIGH. The breadth of changes (authentication screen, string layer, Compound overrides, entitlements) means upstream updates carry a significant merge-conflict and regression risk.
AGPL Relevance
Not Applicable