# IceCubesApp: a SwiftUI Mastodon client for iOS, macOS, iPadOS and visionOS

> IceCubesApp is an open source Mastodon client written entirely in SwiftUI, split into Swift packages and shipped through the App Store. It fits people who want a native Apple client with tag groups and remote local timelines, and it does not fit anyone who needs a server they can self-host.

**Dimillian/IceCubesApp** — A SwiftUI Mastodon client

- Repository: https://github.com/Dimillian/IceCubesApp
- Website: https://apps.apple.com/us/app/ice-cubes-for-mastodon/id6444915884
- Stars: 7,074 · Forks: 722
- Language: Swift
- License: AGPL-3.0
- Published: 2026-09-22 · Updated: 2026-09-22 · Language: en
- Canonical page: https://hysenlabs.com/projects/dimillian-icecubesapp

## What IceCubesApp actually solves for Mastodon users on Apple hardware

Mastodon is a federated network, so the client is the whole experience: the instance holds the data, but the app decides how you read it. IceCubesApp is an open source client for that job, built entirely in SwiftUI and described in the README as fast, lightweight and easy to use. It connects to any Mastodon instance, and it runs on iOS, macOS, iPadOS and visionOS, with a dedicated sidebar layout on macOS and iPadOS.

The audience is narrower than "Mastodon users". It is people who already live inside Apple's platforms and want the client to behave like a native app rather than a wrapped web view. The README lists the features that follow from that: a navigation bar title menu for swapping between home, local, federated and trending timelines; lists, followed tags and tag groups; server side filters; and multi account support with no stated limit. Accounts are added through Apple's WebAuthenticationSession and the token is stored in the keychain.

The project is also positioned as a codebase, not only an app. The README says it is split into different Swift packages so each one covers a specific aspect such as UI, network communication or data models, and calls the result a great starting point for something. That dual identity matters when you decide whether to adopt it.

## How the Swift packages, streaming events and the push proxy fit together

The repository layout is the architecture. Alongside IceCubesApp.xcodeproj there is a Packages/ directory, and the README maps features to modules: Status and Timeline for the timeline, Status package with the StatusEditor component for composing, OpenAIClient for the AI-assisted tools, Notifications plus a NotificationService extension for push, Explore, Conversations for direct messages, and Account and AppAccount for profiles and multi account handling. Extensions sit as separate targets at the top level: IceCubesActionExtension, IceCubesAppIntents, IceCubesAppWidgetsExtension, IceCubesNotifications and IceCubesShareExtension.

The runtime behaviour leans on Mastodon's streaming events. The README states the app relies heavily on streaming to show new posts live in the home timeline and to handle editing and deleting your posts. The home timeline is cached with Bodega, described as a lite SQLite wrapper, and the current position is saved in user defaults so the cached timeline and position are restored when you switch accounts or relaunch. New posts are then fetched and shown with an unread counter.

Timeline sync is deliberately partial, and the README is honest about it: it calls the sync semi-automatic. Your position is sent to the Mastodon marker API, and from another device running Ice Cubes you can resume the home timeline position. If you expect a fully continuous cross-device reading state, this is not that.

The push path is the most opinionated piece. Ice Cubes runs its own proxy between Mastodon and APNS, which the README says is necessary for Mastodon to route push notifications to the device. It also states that push notification content and body cannot be read by the proxy, and that the content is decoded on the device, pointing at NotificationServiceSupport. Rich notifications use Apple's INSendMessageIntent API for contact pictures, and notifications are grouped by activity such as mentions, favorites and boosts.

## Installing and building IceCubesApp from source

The README does not publish a source build recipe. The documented way to get the app is the App Store link for Ice Cubes for Mastodon, and the repository is the source for people who want to build it themselves. What follows uses only names visible in the repository listing, so treat the configuration step as the thing to inspect rather than a script to copy blindly.

Start by cloning the repository and opening the Xcode project at the top level.

```bash
git clone https://github.com/Dimillian/IceCubesApp.git
cd IceCubesApp
open IceCubesApp.xcodeproj
```

The project does not ship a filled-in xcconfig. The repository contains IceCubesApp.xcconfig.template next to IceCubesApp-release.xcconfig, which tells you the configuration values are yours to supply. Copy the template and fill in the keys it defines before you build.

```bash
cp IceCubesApp.xcconfig.template IceCubesApp.xcconfig
```

If you only want the app, the README points at the App Store listing, and there is nothing to compile. The repository also carries ci_scripts/ and scripts/ directories, and a .swiftformat file, so formatting and CI expectations are encoded in the tree rather than in prose. The package split means you can read Packages/ module by module; that is the realistic first use for a developer, not a one-command build.

## Push notifications route through a proxy you do not control

The push design is the clearest limitation. The README says Ice Cubes runs a proxy between Mastodon and APNS, and that this proxy is necessary for Mastodon to route push notifications to the user's device. The same paragraph says push content cannot be read by the proxy and is decoded on the device. That is a reasonable privacy posture, but it is still a third party in the delivery path, and it is operated by the project rather than by you or your instance.

If you fork the app, that dependency does not travel with the code in any usable way. The README does not document how to run the proxy yourself, and it does not document rollback or fallback behaviour if the proxy is unavailable. A self-hosted notification pipeline is not described anywhere in the project's documentation.

There is a second boundary worth naming. The AI-assisted tools in the editor use the OpenAI API, and the README points at the OpenAIClient module. Nothing in the README states whether a key you provide is used, whether requests are proxied, or what is sent. Anyone who needs to keep post text off third party services should verify that before enabling the feature.

## IceCubesApp against the official Mastodon web client and other native clients

The official Mastodon client is a web application served by your instance. The difference is not cosmetic. A web client runs anywhere a browser runs, it is upgraded by whoever administers the instance, and it needs no install and no App Store review. IceCubesApp is the opposite trade: you install it per device, updates arrive through the App Store, and in exchange you get platform behaviour that a web page cannot reach, such as widgets, share and action extensions, App Intents, and rich notifications using INSendMessageIntent for contact pictures.

The feature set also diverges in ways the README calls out as unique to Ice Cubes: tag groups, described as custom timelines made of multiple tags, and remote local timelines for browsing the public timeline of other instances. Neither is presented as part of the standard Mastodon client surface.

Among native clients, the related searches people use include Mastonaut, Achnbrowserui and Movieswiftui. The README does not describe those projects, so there is nothing honest to compare. What can be said is structural: IceCubesApp is a client only. It does not replace your instance, it does not host your data, and the AGPL-3.0 licence applies to the app code, not to the server you connect to.

## Licence, maintenance and what upgrading costs you

The repository is licensed AGPL-3.0, and the README carries the corresponding badge. For a user installing from the App Store, that changes nothing day to day. For anyone modifying the app and distributing it, or running a modified version as a network service, the copyleft obligations are the thing to read in the licence text itself. This is not legal advice, and the repository's LICENSE file is the authority.

Maintenance signals are mixed but readable. The repository is not archived, and the last push was on 2026-09-20, two days before this writing. The most recent release listed is 2.1.3, tagged as App Store 2.1.3 on 2026-01-09, following 2.1.2 on 2026-01-06 and 2.1.1 on 2026-01-02. So the App Store line has been quiet for most of the year while the main branch has kept moving. That gap is normal for an app whose releases are gated by review, but it means a fix you see in the repository may not be in the build you installed.

The upgrade cost for a fork is the package split plus the untracked dependencies. Push depends on the project's proxy, the editor's AI tools depend on the OpenAI API, and the home timeline cache depends on Bodega. Each is an external thing to keep working, and the README does not describe a supported path for running any of them yourself.

## Conclusion

Adopt IceCubesApp if you want a native SwiftUI Mastodon client across iOS, macOS, iPadOS and visionOS, or if you want a package-split Swift codebase to read and build on. Do not adopt it if you need a self-hosted web client or a server component you control, and do not fork it expecting permissive licensing, because the repository carries AGPL-3.0. Before you build, open IceCubesApp.xcconfig.template, confirm which configuration keys you must supply, and check Packages/ to see how the modules are laid out.

## FAQ

### Is IceCubesApp available for iPhone, iPad, Mac and Apple Vision Pro?

Yes. The README states the app is multiplatform and works on iOS, macOS, iPadOS and visionOS, with a dedicated sidebar UI on macOS and iPadOS. The App Store listing is the documented way to install it.

### Do I need my own Mastodon instance to use IceCubesApp?

No. The README says you can connect to any Mastodon instance, browse your timeline, interact with other users, and post updates and media. You add accounts in the app and the token is stored in the keychain.

### How do I build IceCubesApp from source?

Clone the repository, open IceCubesApp.xcodeproj in Xcode, and supply the configuration values the project expects, since the repository ships IceCubesApp.xcconfig.template rather than a filled-in config. The README does not publish a step-by-step source build guide.

### Can I self-host the push notification proxy IceCubesApp uses?

The README says Ice Cubes runs a proxy between Mastodon and APNS and that this proxy is necessary for Mastodon to route push notifications to the device, with content decoded on the device. It does not document running that proxy yourself.

## Sources

- [Dimillian/IceCubesApp on GitHub](https://github.com/Dimillian/IceCubesApp)
- [License: AGPL-3.0](https://github.com/Dimillian/IceCubesApp/blob/main/LICENSE)
- [Project website](https://apps.apple.com/us/app/ice-cubes-for-mastodon/id6444915884)
- [README](https://github.com/Dimillian/IceCubesApp/blob/main/README.md)
- [Releases](https://github.com/Dimillian/IceCubesApp/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/dimillian-icecubesapp
