6a9b6f193fd337896276535f2598dc015450f3ea
An unreferenced SwiftUI prototype of a paper/serif/monospace browse screen for bookmarks: color blocks instead of thumbnails, a browser-tab strip of saved tag filters, and cards/list modes that morph between each other via matchedGeometryEffect. Nothing in the app links to it yet. Built against the real linkding library (300 bookmarks), which is what shaped it: - No bookmark has a preview_image_url, so there is nothing to put in a thumbnail grid. Color blocks are the right primitive for this data. - date_added is 2025 or 2026 for every bookmark, so the reference design's year stamp carries no signal. The domain takes that slot instead, reduced to its registered form because 92 of 300 hosts overflow the card's one monospaced line. - Real titles run 3x longer than the design assumes (median 66 chars, p90 159, max 332) and are mostly "name: what it does". Cards show the name, the list carries the whole title. - 15 bookmarks have no scraped title at all and fall back to the raw URL; those render unquoted with the path in the stamp slot. - Color is hashed from the primary tag, not the domain: 128 of 300 are github.com, which would paint half the library one color. Both color schemes are first-class. The dark palette is not the light one dimmed uniformly - pale swatches drop a long way so they do not glare and dark swatches come up so they do not vanish, converging on a mid band that keeps all twelve distinguishable in either scheme. 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%