TODO: Screenshot outdated
Hipstapaper - iOS and Mac Reading List App
A macOS, iOS, and iPadOS app written 100% in SwiftUI. Hipstapaper is an app that takes a URL shared from another app via the share extension, loads the page to get the title, and a screenshot, and then saves the resulting bookmark via Core Data. Hipstapaper uses iCloud Core Data syncing via NSPersistentCloudKitContainer
to sync all data between devices. Hipstapaper supports basic tagging and archiving for saved bookmarks.
How to Get the App
Hipstapaper is not available on the App Store. Its not broadly usable in its current state because SwiftUI has many performance issues and bugs that I do not want to work around. I'm hoping Apple resolved many of them at WWDC 2021. Also, I mostly created this app to learn and to use myself and it is not meant to be a commercial product. That said, you are welcome to use it if you think its interesting.
- iOS:
- TODO: Figure out testflight for iOS
- macOS:
Summary of Capabilities
- All features implemented in a crossplatform way using SwiftUI
- Except toolbars. The "Unified Toolbar API" introduced in iOS14/macOS11 is pretty challenging to use well. So I ended up making different toolbars for macOS and iOS AND iPadOS. Hoping this is improved by Apple next round.
- Add Bookmark into the application by using macOS and iOS system share sheet.
- Can also add via + toolbar icon in the application.
- Basic tagging functionality.
- Search, filter, and sort items in the application.
- Data sync via iCloud
Why Did I Write This?
- I wanted to learn how to use SwiftUI.
- I wanted to learn how to use Core Data Sync.
- I wanted to learn how to isolate my data layer from my UI layer.
- Core Data could easily be swapped for Realm or SQLite or anything else with the way its abstracted.
Known Issues
- Crashes when deleting a tag (iOS)
- There is an issue with List in SwiftUI that is causing this crash.
- For the WebsiteList, I wrote a workaround but for sidebar lists there is too much detail to rewrite.
- Can't rename tags
- Performance is bad for large lists.
- Once the list exceeds 1000 items or so, the performance really slows down
- This is mostly due to how SwiftUI implements List and LazyVStack. They are lazy but not fully lazy. SwiftUI still tends to read all the items in the list, especially as you scroll down.
- Toolbar for macOS browser doesn't work properly in SwiftUI yet
- Window size is forgotten when closing the window on macOS. Interestingly it is preserved if quitting the app.
Contribution Guidelines
I am happy to accept contributions. Please note that I always intend to be build safe and inclusive communities. I have a 0 tolerance policy towards harassment, meanness, sarcastic-ness toward any other member. Read the code of conduct for full details.
Please refer to an existing issue or create a new issue before beginning to work on a contribution.
Top Issues
- investigation: see if NavigationLink can be used to open new windows
- enhancement: use real List instead of XPList
enhancement: tag rename- enhancement: figure out why window loses size after its closed
enhancement: figure out crash on tag delete- enhancement: figure out how to make SwiftUI toolbar work in Browser Window
How to Clone and Run
Requirements
- Xcode 12.4 or higher
Instructions
This project runs entirely in Xcode with any external dependencies handled by Swift Package Manager. Note that there may be issues running on physical devices because this project relies on iCloud entitlements.
- Clone the Repo
- Open in Xcode
- Build and Run