Skip to content
/ Loom Public

A iOS and macOS client for the fediverse. Written in SwiftUI.

License

Notifications You must be signed in to change notification settings

neatia/Loom

Repository files navigation

Loom (iOS & macOS) Beta

Aggregating aggregation. Providing everyone with a premium experience when interacting with federated servers. Meanwhile, providing view libraries and solutions for others to implement their own interpretations in the Apple ecosystem.

Requirements

Swift Compatibility Platform Compatibility License

My local environment: Xcode 14.2 or later // macOS (Intel) 12.6 or later // iOS 15.4 or later

Disclaimers

  • Due to the nature of possible state schemas being changed. Saved data such as account information or bookmarks may be removed in future release versions (or not at all).
  • Keychain access warning. Keychain is only used for STORING your passwords and nothing else.

Features

  • Translated into 28 languages (MTL)
  • Bookmarks are locally stored for offline viewing
  • IPFS Content generation (Add your own config, gateway, etc)
  • Login, Create Posts, Comments, Interact, update profiles as normal
Expanded Layout (iPad/macOS)
Image Granite supports macOS. Same navigation API can direct window spawning or navigation stack pushing.
Image Spawn multiple windows of entire feed layouts with multiple communities to observe. Will be helpful in the case of moderating multiple communities for instance.
Looms
Image Create "Looms" of any group of communities from any instance. Merging their content into a singular feed.
Explore
Image Visit linked instances when connected to a lemmy server. View small snippets of each and their ping response time.
Aggregation Sources (Aside from Lemmy)
Image RSS feeds can be pulled when setting the instance URL to a valid endpoint. Pagination is not currently supported, but will be in the future. Looking at supporting Atom/JSON streams as well.
Image Mastodon feeds can be pulled when setting the instance URL to a valid mastodon instance. Pagination is not currently supported, but will be in the future. Interactions are disabled for the time being 2023-9-4.
Safety
Image On-device CoreML models + keyword filtering to remove posts from the feed. NSFW Extended will remove posts that are detected as NSFW even if they are not flagged as so.
Styling
Image Intended to allow full user customization in the future. Currently supports a "social app feel" and a "reddit-like reader".
MD helper
Image Keyboard toolbar provides easy to access shortcuts on iPhone/iPad to help with Markdown formatting.
Travelling Modals
Image Writing modals can travel with your viewing context. Allowing you to browse content in any stack prior to publishing.
Bookmark Syncing
Image All your saved posts and comments can be switched between accounts in a dedicated component.
Sharing
Image Share posts or comments as images. With the intention of supporting QR codes and Engravings in the future.
Search
Image Either search all, a specific subcategory with sort support. View expanded contents within the view, interacting with content as normal.
Profile
Image Dynamic threads, despite viewing context. Swipe to reply to comments or tap the more button, to modify, remove, block, etc.
Image Deleting and restoring with toast reactions.
Image Switch accounts, view their profiles, and their scores.
Embedded Webview
Image Custom JS insertion supported, customizing how webpages are viewed via direct user input is a possibility.
Light Mode
Image Light mode and Dark mode supported. Refer to the color group in Assets to define your own preferences for each.

Contributing

Loom uses Granite as a backing for components and services. The Components folder in this repo serves as a good example for many future components that may be needed. Any suggestions on Granite or other component layouts as a whole is greatly appreciated. Always feel free to open a PR and/or Issue.

An interactive websites to generate boilerplate components using a GUI to define styling and needed state properties is in the works! This will allow you to simply download the generated component and drag into XCode for immediate use.

Why Granite?

Mostly because of Relays and project organization. I'd say testing too, but once I get around towards writing the unit tests, I'd feel more confident in sharing the strengths then. These work like @Observables/@AppStorage, but are more flexible in initializations and caching data. The ability to simply declare relays in any View or GraniteComponent allows for a more effective iterative process and cleaner context passing throughout the application.

@Relay var configService: ConfigService

Swift Packages

Contact