99add346fd35034583678120d13510964ede4488
Adds a cards/list toggle to the bookmarks screen. List mode is the existing screen, untouched and still the default; cards mode is the library presentation running on real bookmarks. Structure: - LibraryKit.swift holds what both the shipping screen and the prototype draw from — the paper palette, the Bookmark -> LibraryItem projection, the color card, and the tab strip. The prototype in Views/Prototypes keeps only its standalone chrome and sample data, so the two can no longer drift. - BookmarkActions.swift extracts the context menu and the podcast launch path out of BookmarkListRow. Cards and rows now offer exactly the same actions because they are the same code. The menu is a @ViewBuilder rather than a ViewModifier: each host already owns the sheets it presents, and a modifier would have forced a second copy of that state. - LibraryGridView.swift is the Bookmark-driven grid, with the same tap-to -open, long-press-for-menu, pagination and podcast sheets as the list. Two behaviors worth calling out: Tag tabs filter server-side through linkding's `#tag` search syntax. Filtering the loaded page client-side would only ever search the most recent 50 of 600+ bookmarks and quietly look empty; verified against the server that `q=#dev-tools` returns 64 tagged results where `q=dev-tools` returns 0. Leaving cards mode clears any tag filter. The classic list has no filter strip to display one, so a filter that survived the switch would be invisible and the list would look like it had lost bookmarks. The layout choice persists in @AppStorage. The toolbar button shows the layout it switches *to* — a two-state toggle labelled with its current state reads as a status light rather than a control. Verified on an iPhone 17 Pro simulator against the live linkding server in both layouts and both color schemes. Full test suite passes (16 tests). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgLHztZGaEHvS3KNeGQmRM
Marks
A native iOS client for linkding, the self-hosted bookmark manager.
Built from scratch in SwiftUI targeting iOS 26. Replaces the previous Flutter-based app.
Features
- Browse and search your bookmarks
- Swipe to delete or archive
- Add bookmarks manually
- Share to Marks from any app (share extension)
- Tag browser — see all tags sorted by count, tap to filter
- Native search tab with instant client-side filtering
- AI enrichment via OpenRouter — auto-generates summaries and tags for each bookmark
- Semantic search — rank bookmarks by relevance using AI
- Smart Collections — AI groups your bookmarks into themed collections
- Pagination — loads more as you scroll
Requirements
- iOS 26+
- A running linkding instance with API access
- (Optional) An OpenRouter API key for AI features
AI Features
All AI features are optional and powered by OpenRouter using google/gemini-2.0-flash-lite-001 — one of the cheapest available models (~$0.075/M input tokens).
| Feature | What it does |
|---|---|
| Auto-enrichment | Generates a one-sentence summary and 3-5 tags for each bookmark |
| Semantic search | Ranks your bookmarks by relevance to a natural language query |
| Smart Collections | Groups up to 150 bookmarks into 3-6 themed collections |
Add your OpenRouter API key in Settings to enable these features.
Building
Requires xcodegen.
brew install xcodegen
xcodegen generate
open Marks.xcodeproj
Then build and run in Xcode. The project uses automatic signing — set your development team in project.yml under DEVELOPMENT_TEAM.
Architecture
- SwiftUI with
@Observableand@MainActorthroughout (Swift 6 strict concurrency) - LinkdingAPI — thin wrapper around the linkding REST API
- ClaudeService — OpenRouter client for AI enrichment, semantic search, and collections
- BookmarksViewModel — central state: bookmarks list, pagination, search, enrichment progress
- App Groups — share extension and main app share credentials via
group.com.magicive.marks - UserDefaults — AI summaries and tags cached locally by bookmark ID
Project structure
Marks/
Models/ Bookmark, ServerConfig, SmartCollection
Services/ LinkdingAPI, ClaudeService
Views/ BookmarksView, TagsView, SearchView, SettingsView, …
Assets.xcassets App icon and assets
ShareExtension/ iOS share extension (zero-tap bookmark saving)
project.yml xcodegen project spec
Description
Native iOS client for linkding — SwiftUI, iOS 26, AI enrichment via OpenRouter
2.8 MiB
Languages
Swift
97.7%
Shell
1.4%
HTML
0.9%