README (README.md)
IceCubesApp
[](https://apps.apple.com/us/app/ice-cubes-for-mastodon/id6444915884)
<a href="https://www.emergetools.com/app/example/ios/com.thomasricouard.IceCubesApp/release?utm_campaign=badge-data"><img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.emergetools.com%2Fapi%2Fv2%2Fpublic_new_build%3FexampleId%3Dcom.thomasricouard.IceCubesApp%26platform%3Dios%26badgeOption%3Dversion_and_max_install_size%26buildType%3Drelease&query=$.badgeMetadata&label=Ice%20Cubes&logo=apple" /></a>
<a href="" rel="nofollow"><img src="https://camo.githubusercontent.com/498ead3b529283d08c8db814f646db66ac683bb6b8ced181087fdcde9106c241/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f75726c3d687474707325334125324625324673776966747061636b616765696e6465782e636f6d2532466170692532467061636b616765732532466d316775656c706625324673776966742d7265616c74696d652d6f70656e616925324662616467652533467479706525334473776966742d76657273696f6e7326636f6c6f723d627269676874677265656e" alt="Swift Version" data-canonical-src="https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fm1guelpf%2Fswift-realtime-openai%2Fbadge%3Ftype%3Dswift-versions&color=brightgreen" style="max-width: 100%;"></a>
[](https://www.gnu.org/licenses/agpl-3.0)
<img src="Images/promo.png" />
IceCubesApp is an open-source application for accessing the decentralized social network Mastodon! It's built entirely in SwiftUI, making it fast, lightweight, and easy to use.
You can connect to any Mastodon instance, browse your timeline, interact with other users, and post updates and media.
It's multiplatform and works on iOS, macOS, iPadOS, and visionOS.
It has a dedicated UI with a sidebar on macOS and iPadOS.
Features
Timeline
<img src="Images/timeline.png" />
* A navigation bar title menu lets you easily swap between your home, local, federated, and trending timeline.
* You can also easily access your lists, followed tags, and tag groups.
* Tag groups are custom timelines made of multiple tags, a feature unique to Ice Cubes.
* Quote post!
* You can also add a remote local timeline. A helpful feature to browse the public timeline of other instances. Another Ice Cubes only feature.
* Ice Cubes relies heavily on the streaming events of Mastodon to do stuff like showing new posts live in the home timeline and editing and deleting your posts.
* The timeline sync is semi-automatic; your position is sent to the Mastodon marker API, and from another device running Ice Cubes, you can resume your home timeline position.
* The home timeline is cached using the third-party library Bodega. A lite SQLite wrappers. The current position is saved in user default, so when you switch accounts or launch the app, your cached home timeline and position are restored. Then new posts will be fetched and displayed with an unread counter.
* iCloud sync of tag groups, remote timelines and drafts.
* Server side filters support.
* Create and switch to your lists.
Code -> Status & Timeline package
Editor / Composer
<img src="Images/editor.png" />
* Full-featured post editor.
* You can write threads up to 5 posts.
* Upload up to 4 images.
* AI-assisted tools using OpenAI API for text correction, hashtag generation, and more.
* Generate image description using AI!
* Custom emojis support.
* Add polls and content warnings.
* Save/restore from drafts.
* Use the Apple language detection feature to suggest the language before posting.
Code -> Status package -> StatusEditor componentCode -> OpenAIClient
Notifications
<img src="Images/notifications.png" />
* Full support for push notifications.
* Ice Cubes runs its proxy between Mastodon and APNS, which is necessary for Mastodon to route push notifications to the user's device.
* Push notifications are never and can't be read by the proxy.
* Push notifications content/body is decoded on the device. Look for NotificationServiceSupport
* Push notifications are rich, and use Apple INSendMessageIntent API for contact pictures.
* Push notifications are grouped by activities, like mentions, favorites, boosts, etc...
* Notifications within the app are also grouped/stacked.
* You can select which kind of push notifications you want to receive within the app.
* Route to the correct post and switch to the proper account when taping notifications.
Code -> Notifications package and NotificationService extension.
Explore / Search
<img src="Images/explore.png" />
* Dedicated explore/search tab for trending users, tags, posts, and links.
* Easy access to all those categories from the top area.
* You can search for everything or filter by users, tags, and posts.
* See a graph for the activities on the trending tags.
* See more from each category to access the full-screen view.
Code -> Explore package
Direct Messages
<img src="Images/dm.png" />
* Dedicated tab for direct/private messages.
* Chat like UI
* You can use the inline composer for a quick chat or the full editor.
Code -> Conversations package
Profile
<img src="Images/profile.png" />
* Rich profile support.
* Fully access & tweak your privacy settings.
* Edit your profile, from your bio to your custom fields.
* Add a custom server-side note visible only to you for any profile.
* Translate the bio of any profile to your language.
* Easy access to edit your server-side timeline filters.
* Easy access to share your profile outside of the app.
Code -> Account package
Multi Accounts
<img src="Images/accounts.png" />
* Support for an unlimited number of Mastodon accounts.
* Easily browse/discover instances and log in!
* Swap account from any screen on iOS.
* Swap your account from the macOS/iPadOS sidebar with just one click.
* Full server-side and client-side account settings support.
* Swipe to delete an account from the settings.
* Safe authentication using Apple's WebAuthenticationSession
* The account token is securely stored in the keychain.
Code -> Account & AppAcount packages
Other
<img src="Images/more.png" />
* You can support this project with tips in the app and Github sponsoring.
* Massive amount of customization settings.
* You can tweak the display settings like the font, line spacing, status actions buttons, etc...
* Many built-in themes.
* Make your theme.
* Customize your swipe gestures.
* Customize your tabbar entries.
* Sound & haptic feedback support.
A note on the architecture
The project is split into different Swift Packages to make managing and maintaining the codebase easier. Each package focuses on a specific application aspect, such as the UI, network communication, or data models. This modular approach allows for easier collaboration and ensures the code is organized and easily understood.
It's a great starting point for learning SwiftUI. The app covers many of the basic concepts of SwiftUI, such as building layouts, working with data, and handling user interaction. By exploring the code, you can understand how to use SwiftUI in your daily life. Plus, the open-source nature of IceCubesApp means you can see how real-world applications are built and get a sense of best practices for using SwiftUI.
The architecture is straightforward MVVM for most parts, there is no redux on this one ;)
Thanks!
<img src="Images/AppIcon.png" />
Building the project
To build the project, you need to clone the repo and create a copy of the included .xcconfig file to create your config before you can compile the project. Otherwise, you will get an error.
Here are the steps:
1. Clone the repo
2. In the same folder that contains the IceCubesApp.xcconfig.template, run this command:
cp IceCubesApp.xcconfig.template IceCubesApp.xcconfig3. Fill in the DEVELOPMENT_TEAM and BUNDLE_ID_PREFIX values. The first should have your Apple Team ID (which you can find by logging into the Apple Developer Portal). The latter is your domain in reverse notation or whatever you use as the prefix for your projects.
4. Save your changes, and then you should be able to compile the project without any issues.
---
CLAUDE (CLAUDE.md)
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
IceCubesApp is a multiplatform Mastodon client built entirely in SwiftUI. It's an open-source native Apple application that runs on iOS, iPadOS, macOS, and visionOS.
Build Commands
Building for iOS Simulator
To build IceCubesApp for iPhone Air simulator:
mcp__XcodeBuildMCP__build_sim_name_proj projectPath: "/Users/thomas/Documents/Dev/Open Source/IceCubesApp/IceCubesApp.xcodeproj" scheme: "IceCubesApp" simulatorName: "iPhone Air"Running Tests
- All tests: Run through Xcode's Test navigator
- Specific package tests (XcodeBuildMCP on simulator):
# Set defaults once per session
mcp__XcodeBuildMCP__session-set-defaults projectPath: "/Users/thomas/Documents/Dev/Open Source/IceCubesApp/IceCubesApp.xcodeproj" simulatorName: "iPhone Air" # Then run any package test scheme
mcp__XcodeBuildMCP__test_sim scheme: "AccountTests"
mcp__XcodeBuildMCP__test_sim scheme: "ModelsTests"
mcp__XcodeBuildMCP__test_sim scheme: "NetworkTests"
mcp__XcodeBuildMCP__test_sim scheme: "TimelineTests"
mcp__XcodeBuildMCP__test_sim scheme: "EnvTests"
Code Formatting
The project uses SwiftFormat with 2-space indentation. Configuration is in
.swiftformat.Architecture
Modular Package Structure
The app is organized into Swift Packages under
/Packages/:- Models: Data models and API structures for Mastodon entities
- Network: API client implementation with support for Mastodon, DeepL, and OpenAI APIs
- Env: Environment objects, app-wide state, and dependency injection
- DesignSystem: Theming, colors, fonts, and reusable UI components
- Account: User profile views and account management
- Timeline: Timeline views, filtering, and unread status tracking
- StatusKit: Status/post composition and display components
- Notifications: Notification views and handling
- MediaUI: Media viewing with zoom, video playback, and sharing
Key Architectural Patterns (Legacy)
The codebase contains legacy MVVM patterns, but new features should NOT use ViewModels.
- Legacy: Some older views still use ViewModels (being phased out)
- Modern Approach: Views as pure state expressions using SwiftUI primitives
- Environment Objects: Used for dependency injection (Router, CurrentAccount, Theme, etc.)
- Swift Concurrency: Async/await throughout for API calls
- Observation Framework: Uses @Observable for services injected via Environment
App Extensions
- NotificationService: Handles push notification decryption and formatting
- ShareExtension: Enables sharing content to the app
- ActionExtension: Quick actions from share sheet
- WidgetsExtension: Home screen widgets for timeline, mentions, and accounts
Important Implementation Details
- Multi-account: Managed through
AppAccountsManager with secure storage- Push Notifications: Custom proxy server implementation for privacy
- Theme System: Extensive customization with 40+ app icons
- Translation: Supports DeepL API and instance-provided translations
- AI Features: OpenAI integration for alt text generation
Modern SwiftUI Architecture Guidelines (2025)
Core Philosophy
- SwiftUI is the default UI paradigm - embrace its declarative nature
- Avoid legacy UIKit patterns and unnecessary abstractions
- Focus on simplicity, clarity, and native data flow
- Let SwiftUI handle the complexity - don't fight the framework
- No ViewModels - Use native SwiftUI data flow patterns
Architecture Principles
#### 1. Native State Management
Use SwiftUI's built-in property wrappers appropriately:
- @State - Local, ephemeral view state
- @Binding - Two-way data flow between views
- @Observable - Shared state (preferred for new code)
- @Environment - Dependency injection for app-wide concerns
#### 2. State Ownership
- Views own their local state unless sharing is required
- State flows down, actions flow up
- Keep state as close to where it's used as possible
- Extract shared state only when multiple views need it
Example:
struct TimelineView: View {
@Environment(Client.self) private var client
@State private var viewState: ViewState = .loading enum ViewState {
case loading
case loaded(statuses: [Status])
case error(Error)
}
var body: some View {
Group {
switch viewState {
case .loading:
ProgressView()
case .loaded(let statuses):
StatusList(statuses: statuses)
case .error(let error):
ErrorView(error: error)
}
}
.task {
await loadTimeline()
}
}
private func loadTimeline() async {
do {
let statuses = try await client.getHomeTimeline()
viewState = .loaded(statuses: statuses)
} catch {
viewState = .error(error)
}
}
}
#### 3. Modern Async Patterns
- Use async/await as the default for asynchronous operations
- Leverage .task modifier for lifecycle-aware async work
- Handle errors gracefully with try/catch
- Avoid Combine unless absolutely necessary
#### 4. View Composition
- Build UI with small, focused views
- Extract reusable components naturally
- Use view modifiers to encapsulate common styling
- Prefer composition over inheritance
#### 5. Code Organization
- Organize by feature (e.g., Timeline/, Account/, Settings/)
- Keep related code together in the same file when appropriate
- Use extensions to organize large files
- Follow Swift naming conventions consistently
Build Verification Process
IMPORTANT: When editing code, you MUST:
1. Build the project after making changes using XcodeBuildMCP commands
2. Fix any compilation errors before proceeding
3. Run relevant tests if modifying existing functionality
4. Ensure code follows modern SwiftUI patterns
Example workflow:
Build the main app
mcp__XcodeBuildMCP__build_mac_proj projectPath: "/path/to/IceCubesApp.xcodeproj" scheme: "IceCubesApp"Or for iOS simulator
mcp__XcodeBuildMCP__build_ios_sim_name_proj projectPath: "/path/to/IceCubesApp.xcodeproj" scheme: "IceCubesApp" simulatorName: "iPhone Air"Implementation Examples
#### Shared State with @Observable
@Observable
class AppAccountsManager {
var currentAccount: Account?
var availableAccounts: [Account] = [] func switchAccount(_ account: Account) {
currentAccount = account
// Handle account switching
}
}
// In App file
struct IceCubesApp: App {
@State private var accountManager = AppAccountsManager()
var body: some Scene {
WindowGroup {
ContentView()
.environment(accountManager)
}
}
}
#### Modern Async Data Loading
struct NotificationsView: View {
@Environment(Client.self) private var client
@State private var notifications: [Notification] = []
@State private var isLoading = false
@State private var error: Error? var body: some View {
List(notifications) { notification in
NotificationRow(notification: notification)
}
.overlay {
if isLoading {
ProgressView()
}
}
.task {
await loadNotifications()
}
.refreshable {
await loadNotifications()
}
}
private func loadNotifications() async {
isLoading = true
defer { isLoading = false }
do {
notifications = try await client.getNotifications()
} catch {
self.error = error
}
}
}
Best Practices
#### DO:
- Write self-contained views when possible
- Use property wrappers as intended by Apple
- Test logic in isolation, preview UI visually
- Handle loading and error states explicitly
- Keep views focused on presentation
- Use Swift's type system for safety
- Trust SwiftUI's update mechanism
#### DON'T:
- Create ViewModels for every view
- Move state out of views unnecessarily
- Add abstraction layers without clear benefit
- Use Combine for simple async operations
- Fight SwiftUI's update mechanism
- Overcomplicate simple features
- Nest @Observable objects within other @Observable objects - This breaks SwiftUI's observation system. Initialize services at the view level instead.
Testing Strategy
- Unit test business logic in services/clients
- Use SwiftUI Previews for visual testing
- Test @Observable classes independently
- Keep tests simple and focused
- Don't sacrifice code clarity for testability
Code Style When Editing
- Maintain existing patterns in legacy code
- New features use modern patterns exclusively
- Prefer composition over inheritance
- Keep views focused and single-purpose
- Use descriptive names for state enums
- Write SwiftUI code that looks and feels like SwiftUI
---
PRIVACY (PRIVACY.MD)
IceCubesApp does not collect or process any personal information from its users. The app is used to connect to third-party Mastodon servers that may or may not collect personal information and are not covered by this privacy policy. Each third-party Mastodon server comes equipped with its own privacy policy that can be viewed through the app or through that server's website.
IceCubesApp can optionally use the OpenAI API to generate descriptions for uploaded media. When you use this feature, your uploaded media is sent to the OpenAI server in order to generate a description. Please refer to the OpenAI Privacy Policy if you want to know more. Nothing is sent to OpenAI if you don't use this feature.
Ice Cubes use TelemetryDeck to collect anonymized usage data. This helps us understand how our users are using our app and how we can improve it. TelemetryDeck does not collect any personally identifiable information. You can read more about TelemetryDeck’s privacy policy
---
TERMS (TERMS.MD)
Terms of Use
Use of Ice Cubes is governed by Apple’s Standard EULA for apps.
Tips provided in Ice Cubes do no unlock any additional content in the app.
Subscriptions will automatically renew unless canceled within 24-hours before the end of the current period. You can cancel anytime with your iTunes account settings. Any unused portion of a free trial will be forfeited if you purchase a subscription. Auto-renewal may be turned off by the user, by going to the user’s Account Settings after purchase. The duration and price of each subscription is displayed on the purchase screen, and updated at the time of purchase.
If you have any questions about Ice Cubes Terms of Use, please reach out to me at [email protected]
---
AlternateIcons/AppIconAlternate1.Icon/Icon.Json (AlternateIcons/AppIconAlternate1.icon/icon.json)
{
"fill-specializations" : [
{
"value" : {
"linear-gradient" : [
"display-p3:0.36471,0.36863,0.94510,1.00000",
"srgb:0.57919,0.12801,0.57269,1.00000"
]
}
},
{
"appearance" : "dark",
"value" : "system-dark"
}
],
"groups" : [
{
"blend-mode-specializations" : [
{
"appearance" : "tinted",
"value" : "normal"
}
],
"blur-material" : null,
"layers" : [
{
"blend-mode" : "screen",
"fill-specializations" : [
{
"value" : {
"solid" : "srgb:1.00000,1.00000,1.00000,1.00000"
}
},
{
"appearance" : "dark",
"value" : "automatic"
},
{
"appearance" : "tinted",
"value" : {
"linear-gradient" : [
"display-p3:0.90000,0.90000,0.90000,0.83000",
"srgb:1.00000,1.00000,1.00000,0.41987"
]
}
}
],
"glass" : true,
"hidden" : false,
"image-name" : "puple_cube.png",
"name" : "puple_cube",
"position" : {
"scale" : 1.24,
"translation-in-points" : [
0,
0
]
}
}
],
"lighting" : "individual",
"shadow" : {
"kind" : "layer-color",
"opacity" : 0.59
},
"specular" : true,
"translucency-specializations" : [
{
"value" : {
"enabled" : true,
"value" : 0.87
}
},
{
"appearance" : "tinted",
"value" : {
"enabled" : false,
"value" : 0.84
}
}
]
},
{
"blur-material-specializations" : [
{
"value" : 1
},
{
"appearance" : "tinted",
"value" : 1
}
],
"layers" : [
{
"blend-mode-specializations" : [
{
"value" : "screen"
},
{
"appearance" : "dark",
"value" : "lighten"
}
],
"fill-specializations" : [
{
"value" : {
"solid" : "srgb:1.00000,0.25279,1.00000,1.00000"
}
},
{
"appearance" : "dark",
"value" : {
"solid" : "display-p3:0.82510,0.25332,1.00000,1.00000"
}
},
{
"appearance" : "tinted",
"value" : "automatic"
}
],
"glass" : true,
"hidden" : false,
"image-name" : "puple_cube.png",
"name" : "puple_cube",
"position" : {
"scale" : 1.13,
"translation-in-points" : [
0,
0
]
}
}
],
"lighting" : "individual",
"shadow" : {
"kind" : "layer-color",
"opacity" : 1
},
"specular" : true,
"translucency-specializations" : [
{
"value" : {
"enabled" : true,
"value" : 0.3
}
},
{
"appearance" : "tinted",
"value" : {
"enabled" : false,
"value" : 0.1
}
}
]
}
],
"supported-platforms" : {
"circles" : [
"watchOS"
],
"squares" : "shared"
}
}
---
AlternateIcons/AppIconAlternate2.Icon/Icon.Json (AlternateIcons/AppIconAlternate2.icon/icon.json)
{
"fill" : {
"linear-gradient" : [
"display-p3:0.49338,0.09624,0.75589,1.00000",
"display-p3:0.10553,0.00332,0.25763,1.00000"
]
},
"groups" : [
{
"layers" : [
{
"image-name" : "Path 2.svg",
"name" : "Path 2",
"position" : {
"scale" : 1,
"translation-in-points" : [
78,
-211
]
}
},
{
"glass" : false,
"image-name" : "Path copy.svg",
"name" : "Path copy",
"position" : {
"scale" : 1,
"translation-in-points" : [
0,
-23
]
}
},
{
"blend-mode-specializations" : [
{
"appearance" : "dark",
"value" : "normal"
}
],
"fill-specializations" : [
{
"appearance" : "dark",
"value" : "none"
}
],
"image-name" : "Rounded Rectangle copy 2.svg",
"name" : "Rounded Rectangle copy 2",
"opacity-specializations" : [
{
"value" : 0.9
},
{
"appearance" : "dark",
"value" : 0.8
}
],
"position" : {
"scale" : 1,
"translation-in-points" : [
39,
-186.1796875
]
}
},
{
"fill-specializations" : [
{
"appearance" : "dark",
"value" : "none"
}
],
"image-name" : "Rounded Rectangle.svg",
"name" : "Rounded Rectangle",
"opacity-specializations" : [
{
"value" : 0.9
},
{
"appearance" : "dark",
"value" : 0.8
}
],
"position" : {
"scale" : 1,
"translation-in-points" : [
-111,
-35
]
}
},
{
"fill-specializations" : [
{
"appearance" : "dark",
"value" : "none"
}
],
"image-name" : "Rounded Rectangle copy.svg",
"name" : "Rounded Rectangle copy",
"opacity-specializations" : [
{
"value" : 0.9
},
{
"appearance" : "dark",
"value" : 0.8
}
],
"position" : {
"scale" : 1,
"translation-in-points" : [
96.51953125,
48
]
}
},
{
"image-name" : "Oval 1.svg",
"name" : "Oval 1",
"position" : {
"scale" : 1,
"translation-in-points" : [
-47.87109375,
-342.03125
]
}
},
{
"image-name" : "Oval copy.svg",
"name" : "Oval copy",
"opacity" : 1,
"position" : {
"scale" : 1,
"translation-in-points" : [
278.50390625,
-375.5703125
]
}
},
{
"image-name" : "Path.svg",
"name" : "Path"
},
{
"image-name" : "Path 1.svg",
"name" : "Path 1",
"position" : {
"scale" : 1,
"translation-in-points" : [
10,
-277
]
}
},
{
"glass" : false,
"hidden" : false,
"image-name" : "Shape.svg",
"name" : "Shape",
"position" : {
"scale" : 1,
"translation-in-points" : [
1.216796875,
-248
]
}
},
{
"hidden" : false,
"image-name" : "Oval.svg",
"name" : "Oval",
"position" : {
"scale" : 1,
"translation-in-points" : [
-0.62109375,
-247.6171875
]
}
},
{
"glass" : false,
"image-name" : "Path copy 2.svg",
"name" : "Path copy 2",
"position" : {
"scale" : 1.1,
"translation-in-points" : [
2,
10
]
}
}
],
"position" : {
"scale" : 1,
"translation-in-points" : [
0,
97.5
]
},
"shadow" : {
"kind" : "neutral",
"opacity" : 0.5
},
"translucency" : {
"enabled" : true,
"value" : 0.5
}
}
],
"supported-platforms" : {
"circles" : [
"watchOS"
],
"squares" : "shared"
}
}
---
AlternateIcons/AppIconAlternate46.Icon/Icon.Json (AlternateIcons/AppIconAlternate46.icon/icon.json)
{
"fill-specializations" : [
{
"value" : {
"linear-gradient" : [
"display-p3:0.67059,0.26667,0.85098,1.00000",
"display-p3:0.11373,0.12941,0.22353,1.00000"
]
}
},
{
"appearance" : "dark",
"value" : "system-dark"
}
],
"groups" : [
{
"blend-mode-specializations" : [
{
"appearance" : "tinted",
"value" : "normal"
}
],
"blur-material" : 1,
"layers" : [
{
"blend-mode" : "screen",
"fill-specializations" : [
{
"value" : {
"solid" : "srgb:1.00000,1.00000,1.00000,1.00000"
}
},
{
"appearance" : "dark",
"value" : "automatic"
},
{
"appearance" : "tinted",
"value" : {
"linear-gradient" : [
"display-p3:0.90000,0.90000,0.90000,0.83000",
"srgb:1.00000,1.00000,1.00000,0.41987"
]
}
}
],
"glass" : true,
"hidden" : false,
"image-name" : "puple_cube.png",
"name" : "puple_cube",
"position" : {
"scale" : 1.24,
"translation-in-points" : [
0,
0
]
}
}
],
"lighting" : "individual",
"shadow" : {
"kind" : "layer-color",
"opacity" : 1
},
"specular" : true,
"translucency-specializations" : [
{
"value" : {
"enabled" : true,
"value" : 0.2
}
},
{
"appearance" : "tinted",
"value" : {
"enabled" : true,
"value" : 0.1
}
}
]
},
{
"blur-material-specializations" : [
{
"value" : 1
},
{
"appearance" : "tinted",
"value" : 1
}
],
"layers" : [
{
"blend-mode-specializations" : [
{
"value" : "screen"
},
{
"appearance" : "dark",
"value" : "lighten"
}
],
"fill-specializations" : [
{
"value" : {
"solid" : "srgb:1.00000,0.25279,1.00000,1.00000"
}
},
{
"appearance" : "dark",
"value" : {
"solid" : "display-p3:0.82510,0.25332,1.00000,1.00000"
}
},
{
"appearance" : "tinted",
"value" : "automatic"
}
],
"glass" : true,
"hidden" : false,
"image-name" : "puple_cube.png",
"name" : "puple_cube",
"position" : {
"scale" : 1.13,
"translation-in-points" : [
0,
0
]
}
}
],
"lighting" : "individual",
"shadow" : {
"kind" : "layer-color",
"opacity" : 1
},
"specular" : true,
"translucency-specializations" : [
{
"value" : {
"enabled" : true,
"value" : 0.3
}
},
{
"appearance" : "tinted",
"value" : {
"enabled" : true,
"value" : 0.3
}
}
]
},
{
"blur-material-specializations" : [
{
"value" : 1
},
{
"appearance" : "tinted",
"value" : 1
}
],
"layers" : [
{
"blend-mode-specializations" : [
{
"value" : "screen"
},
{
"appearance" : "dark",
"value" : "lighten"
}
],
"fill-specializations" : [
{
"value" : {
"solid" : "display-p3:0.96921,0.39989,0.04269,1.00000"
}
},
{
"appearance" : "dark",
"value" : {
"solid" : "display-p3:1.00000,0.61199,0.29857,1.00000"
}
},
{
"appearance" : "tinted",
"value" : "automatic"
}
],
"glass" : true,
"hidden" : false,
"image-name" : "puple_cube.png",
"name" : "puple_cube",
"position" : {
"scale" : 1.02,
"translation-in-points" : [
0,
0
]
}
}
],
"lighting" : "individual",
"shadow" : {
"kind" : "layer-color",
"opacity" : 1
},
"specular" : true,
"translucency-specializations" : [
{
"value" : {
"enabled" : true,
"value" : 0.3
}
},
{
"appearance" : "tinted",
"value" : {
"enabled" : true,
"value" : 0.5
}
}
]
},
{
"blur-material-specializations" : [
{
"value" : 1
},
{
"appearance" : "tinted",
"value" : 1
}
],
"layers" : [
{
"blend-mode-specializations" : [
{
"value" : "screen"
},
{
"appearance" : "dark",
"value" : "lighten"
}
],
"fill-specializations" : [
{
"value" : {
"solid" : "display-p3:0.96921,0.94842,0.00650,1.00000"
}
},
{
"appearance" : "dark",
"value" : {
"solid" : "display-p3:1.00000,0.89360,0.20100,1.00000"
}
},
{
"appearance" : "tinted",
"value" : "automatic"
}
],
"glass" : true,
"hidden" : false,
"image-name" : "puple_cube.png",
"name" : "puple_cube",
"position" : {
"scale" : 0.92,
"translation-in-points" : [
0,
0
]
}
}
],
"lighting" : "individual",
"shadow" : {
"kind" : "layer-color",
"opacity" : 1
},
"specular" : true,
"translucency-specializations" : [
{
"value" : {
"enabled" : true,
"value" : 0.3
}
},
{
"appearance" : "tinted",
"value" : {
"enabled" : true,
"value" : 0.7
}
}
]
}
],
"supported-platforms" : {
"circles" : [
"watchOS"
],
"squares" : "shared"
}
}
---
AppIcon.Icon/Icon.Json (AppIcon.icon/icon.json)
{
"fill-specializations" : [
{
"value" : "system-light"
},
{
"appearance" : "dark",
"value" : "system-dark"
}
],
"groups" : [
{
"blend-mode-specializations" : [
{
"appearance" : "tinted",
"value" : "normal"
}
],
"blur-material" : null,
"layers" : [
{
"fill-specializations" : [
{
"appearance" : "dark",
"value" : "automatic"
},
{
"appearance" : "tinted",
"value" : {
"linear-gradient" : [
"display-p3:0.90000,0.90000,0.90000,0.83000",
"srgb:1.00000,1.00000,1.00000,0.41987"
]
}
}
],
"glass" : true,
"hidden" : false,
"image-name" : "puple_cube.png",
"name" : "puple_cube",
"position" : {
"scale" : 1.24,
"translation-in-points" : [
0,
0
]
}
}
],
"lighting" : "individual",
"shadow" : {
"kind" : "layer-color",
"opacity" : 0.5
},
"specular" : true,
"translucency-specializations" : [
{
"value" : {
"enabled" : true,
"value" : 0.84
}
},
{
"appearance" : "tinted",
"value" : {
"enabled" : false,
"value" : 0.84
}
}
]
},
{
"blur-material-specializations" : [
{
"value" : 1
},
{
"appearance" : "tinted",
"value" : 1
}
],
"layers" : [
{
"blend-mode-specializations" : [
{
"appearance" : "dark",
"value" : "lighten"
}
],
"fill-specializations" : [
{
"value" : {
"solid" : "srgb:1.00000,0.25279,1.00000,1.00000"
}
},
{
"appearance" : "dark",
"value" : {
"solid" : "display-p3:0.82510,0.25332,1.00000,1.00000"
}
},
{
"appearance" : "tinted",
"value" : "automatic"
}
],
"glass" : true,
"hidden" : false,
"image-name" : "puple_cube.png",
"name" : "puple_cube",
"position" : {
"scale" : 1.13,
"translation-in-points" : [
0,
0
]
}
}
],
"lighting" : "individual",
"shadow" : {
"kind" : "layer-color",
"opacity" : 0.5
},
"specular" : true,
"translucency-specializations" : [
{
"value" : {
"enabled" : true,
"value" : 0.1
}
},
{
"appearance" : "tinted",
"value" : {
"enabled" : false,
"value" : 0.1
}
}
]
}
],
"supported-platforms" : {
"circles" : [
"watchOS"
],
"squares" : "shared"
}
}
---
IceCubesActionExtension/Assets.Xcassets/Contents.Json (IceCubesActionExtension/Assets.xcassets/Contents.json)
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesActionExtension/Assets.Xcassets/ActionIcon.Appiconset/Contents.Json (IceCubesActionExtension/Assets.xcassets/ActionIcon.appiconset/Contents.json)
{
"images" : [
{
"filename" : "ActionIcon1024.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/Contents.Json (IceCubesApp/Assets.xcassets/Contents.json)
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AccentColor.Colorset/Contents.Json (IceCubesApp/Assets.xcassets/AccentColor.colorset/Contents.json)
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIcon.Solidimagestack/Contents.Json (IceCubesApp/Assets.xcassets/AppIcon.solidimagestack/Contents.json)
{
"info" : {
"author" : "xcode",
"version" : 1
},
"layers" : [
{
"filename" : "Front.solidimagestacklayer"
},
{
"filename" : "Mid.solidimagestacklayer"
},
{
"filename" : "Back.solidimagestacklayer"
}
]
}
---
IceCubesApp/Assets.Xcassets/AppIcon.Solidimagestack/Back.Solidimagestacklayer/Contents.Json (IceCubesApp/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Contents.json)
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIcon.Solidimagestack/Back.Solidimagestacklayer/Content.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Contents.json)
{
"images" : [
{
"filename" : "Background.png",
"idiom" : "vision",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIcon.Solidimagestack/Front.Solidimagestacklayer/Contents.Json (IceCubesApp/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Contents.json)
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIcon.Solidimagestack/Front.Solidimagestacklayer/Content.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Contents.json)
{
"images" : [
{
"filename" : "Layer 1.png",
"idiom" : "vision",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIcon.Solidimagestack/Mid.Solidimagestacklayer/Contents.Json (IceCubesApp/Assets.xcassets/AppIcon.solidimagestack/Mid.solidimagestacklayer/Contents.json)
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIcon.Solidimagestack/Mid.Solidimagestacklayer/Content.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIcon.solidimagestack/Mid.solidimagestacklayer/Content.imageset/Contents.json)
{
"images" : [
{
"idiom" : "vision",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate0 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate0-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "AppIcon.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate1 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate1-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "[email protected]",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate15 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate15-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "AppIconAlternate15.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate15.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate15.appiconset/Contents.json)
{
"images" : [
{
"filename" : "AppIconAlternate15.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate16 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate16-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "icon.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate16.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate16.appiconset/Contents.json)
{
"images" : [
{
"filename" : "icon.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate2 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate2-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "[email protected]",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate22 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate22-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "icon23.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate22.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate22.appiconset/Contents.json)
{
"images" : [
{
"filename" : "icon23.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate23 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate23-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "icon24.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate23.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate23.appiconset/Contents.json)
{
"images" : [
{
"filename" : "icon24.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate24 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate24-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "AppIconAlternate21.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate24.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate24.appiconset/Contents.json)
{
"images" : [
{
"filename" : "AppIconAlternate21.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate25 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate25-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "icon22.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate25.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate25.appiconset/Contents.json)
{
"images" : [
{
"filename" : "icon22.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate26 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate26-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "AppIconAlternate20.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate26.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate26.appiconset/Contents.json)
{
"images" : [
{
"filename" : "AppIconAlternate20.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate27 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate27-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "icecubes_comic_01.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate27.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate27.appiconset/Contents.json)
{
"images" : [
{
"filename" : "icecubes_comic_01.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate28 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate28-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "icecubes_comic_02.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate28.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate28.appiconset/Contents.json)
{
"images" : [
{
"filename" : "icecubes_comic_02.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate29 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate29-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "icecubes_comic_03.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate29.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate29.appiconset/Contents.json)
{
"images" : [
{
"filename" : "icecubes_comic_03.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate3 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate3-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "AppIcon-fs8.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate3.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate3.appiconset/Contents.json)
{
"images" : [
{
"filename" : "AppIcon-fs8.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate30 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate30-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "blue.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate30.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate30.appiconset/Contents.json)
{
"images" : [
{
"filename" : "blue.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate31 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate31-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "purple_alt.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate31.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate31.appiconset/Contents.json)
{
"images" : [
{
"filename" : "purple_alt.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate32 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate32-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "purple.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate32.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate32.appiconset/Contents.json)
{
"images" : [
{
"filename" : "purple.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate33 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate33-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "stripe.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate33.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate33.appiconset/Contents.json)
{
"images" : [
{
"filename" : "stripe.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate34 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate34-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "blue_alt2.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate34.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate34.appiconset/Contents.json)
{
"images" : [
{
"filename" : "blue_alt2.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate35 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate35-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "purple_alt2.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate35.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate35.appiconset/Contents.json)
{
"images" : [
{
"filename" : "purple_alt2.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate36 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate36-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "stripe_alt.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate36.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate36.appiconset/Contents.json)
{
"images" : [
{
"filename" : "stripe_alt.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate37 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate37-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "icon.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate37.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate37.appiconset/Contents.json)
{
"images" : [
{
"filename" : "icon.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate38 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate38-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "icon.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate38.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate38.appiconset/Contents.json)
{
"images" : [
{
"filename" : "icon.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate39 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate39-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "Alternate-48-fs8.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate39.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate39.appiconset/Contents.json)
{
"images" : [
{
"filename" : "Alternate-48-fs8.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate4 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate4-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "1024.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate4.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate4.appiconset/Contents.json)
{
"images" : [
{
"filename" : "1024.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate40 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate40-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "Alternate-49-fs8.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate40.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate40.appiconset/Contents.json)
{
"images" : [
{
"filename" : "Alternate-49-fs8.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate41 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate41-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "e2a44f35b779f021.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate41.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate41.appiconset/Contents.json)
{
"images" : [
{
"filename" : "e2a44f35b779f021.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate42 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate42-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "4c26b880d454e2ec.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate42.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate42.appiconset/Contents.json)
{
"images" : [
{
"filename" : "4c26b880d454e2ec.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate43 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate43-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "63245c61df096188.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate43.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate43.appiconset/Contents.json)
{
"images" : [
{
"filename" : "63245c61df096188.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate44 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate44-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "icon38.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate44.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate44.appiconset/Contents.json)
{
"images" : [
{
"filename" : "icon38.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate45 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate45-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "icon39.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate45.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate45.appiconset/Contents.json)
{
"images" : [
{
"filename" : "icon39.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate46 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate46-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "[email protected]",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate47 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate47-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "AppIconAlternate47-fs8.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate47.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate47.appiconset/Contents.json)
{
"images" : [
{
"filename" : "AppIconAlternate47-fs8.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate48 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate48-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "AppIconAlternate48-fs8.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate48.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate48.appiconset/Contents.json)
{
"images" : [
{
"filename" : "AppIconAlternate48-fs8.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate49 Image.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate49-image.imageset/Contents.json)
{
"images" : [
{
"filename" : "AppIconAlternate49-fs8.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/AppIconAlternate49.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/AppIconAlternate49.appiconset/Contents.json)
{
"images" : [
{
"filename" : "AppIconAlternate49-fs8.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/Avatar.Imageset/Contents.Json (IceCubesApp/Assets.xcassets/avatar.imageset/Contents.json)
{
"images" : [
{
"filename" : "avatar.heic",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/Icon.Appiconset/Contents.Json (IceCubesApp/Assets.xcassets/Icon.appiconset/Contents.json)
{
"images" : [
{
"filename" : "AppIcon.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "AppIcon 1.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "tinted"
}
],
"filename" : "AppIcon 2.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesApp/Assets.Xcassets/Rocket.Fill.Symbolset/Contents.Json (IceCubesApp/Assets.xcassets/Rocket.Fill.symbolset/Contents.json)
{
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"symbol-rendering-intent" : "template"
},
"symbols" : [
{
"filename" : "rocket.fill.svg",
"idiom" : "universal"
}
]
}
---
IceCubesApp/Assets.Xcassets/Rocket.Symbolset/Contents.Json (IceCubesApp/Assets.xcassets/Rocket.symbolset/Contents.json)
{
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"symbol-rendering-intent" : "template"
},
"symbols" : [
{
"filename" : "rocket.svg",
"idiom" : "universal"
}
]
}
---
IceCubesApp/Resources/Preview Assets.Xcassets/Contents.Json (IceCubesApp/Resources/Preview Assets.xcassets/Contents.json)
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesAppWidgetsExtension/Assets.Xcassets/Contents.Json (IceCubesAppWidgetsExtension/Assets.xcassets/Contents.json)
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesAppWidgetsExtension/Assets.Xcassets/AccentColor.Colorset/Contents.Json (IceCubesAppWidgetsExtension/Assets.xcassets/AccentColor.colorset/Contents.json)
{
"colors" : [
{
"color" : {
"color-space" : "display-p3",
"components" : {
"alpha" : "1.000",
"blue" : "0.859",
"green" : "0.267",
"red" : "0.675"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesAppWidgetsExtension/Assets.Xcassets/AppIcon.Appiconset/Contents.Json (IceCubesAppWidgetsExtension/Assets.xcassets/AppIcon.appiconset/Contents.json)
{
"images" : [
{
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
IceCubesAppWidgetsExtension/Assets.Xcassets/WidgetBackground.Colorset/Contents.Json (IceCubesAppWidgetsExtension/Assets.xcassets/WidgetBackground.colorset/Contents.json)
{
"colors" : [
{
"color" : {
"color-space" : "display-p3",
"components" : {
"alpha" : "1.000",
"blue" : "0.949",
"green" : "0.945",
"red" : "0.941"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "display-p3",
"components" : {
"alpha" : "1.000",
"blue" : "0.133",
"green" : "0.082",
"red" : "0.067"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
Packages/DesignSystem/Sources/DesignSystem/Resources/Colors.Xcassets/Contents.Json (Packages/DesignSystem/Sources/DesignSystem/Resources/Colors.xcassets/Contents.json)
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
Packages/DesignSystem/Sources/DesignSystem/Resources/Colors.Xcassets/Label.Colorset/Contents.Json (Packages/DesignSystem/Sources/DesignSystem/Resources/Colors.xcassets/label.colorset/Contents.json)
{
"colors" : [
{
"color" : {
"platform" : "universal",
"reference" : "labelColor"
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"platform" : "universal",
"reference" : "labelColor"
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
---
.Github/Dependabot.Yml (.github/dependabot.yml)
To get started with Dependabot version updates, you'll need to specify which
package ecosystems to update and where the package manifests are located.
Please see the documentation for all configuration options:
https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "swift" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "weekly"
---
.Github/ISSUE TEMPLATE/Bug (.github/ISSUE_TEMPLATE/bug.md)
---
name: Bug
about: Create a report to help us improve
title: 'Bug:'
labels: bug
assignees: ''
---
Environment:
- OS:
- IceCubesApp version:
Description
Related Issues
- [ ] Search that this bugs don't already exist before creating it.
---
.Github/ISSUE TEMPLATE/Feature Request (.github/ISSUE_TEMPLATE/feature_request.md)
---
name: Feature request
about: Something you would like the app to support
title: 'Feature request:'
labels: enhancement
assignees: ''
---
Search that this request don't already exist before creating it.
---
.Github/Workflows/Validate Translations.Yml (.github/workflows/validate_translations.yml)
name: Validate Translations
on:
pull_request:
types: [synchronize, opened, reopened, labeled, unlabeled, edited]
jobs:
main:
name: Validate Translations
runs-on: macOS-latest
steps:
- name: git checkout
uses: actions/checkout@v3
- name: ruby versions
run: |
ruby --version
gem --version
bundler --version
- name: ruby setup
uses: ruby/setup-ruby@v1
with:
ruby-version: 3.3
bundler-cache: true
# additional steps here, if needed
- name: Clone SwiftPolyglot
run: git clone https://github.com/appdecostudio/SwiftPolyglot.git --branch 0.2.0
- name: Build and Run SwiftPolyglot
run: |
swift build --package-path ./SwiftPolyglot --configuration release
swift run --package-path ./SwiftPolyglot swiftpolyglot "en,eu,be,ca,zh-Hans,zh-Hant,nl,en-GB,fr,de,it,ja,ko,nb,pl,pt-BR,es,tr,uk"
---