Krishna KumarandClaude Opus 5 76df237473
CI / build-and-deploy (pull_request) Failing after 2s
CI / build-and-deploy (push) Successful in 32s
Stop paperSurface() undoing the serif navigation titles
Only the bookmarks screen had picked up the serif title. Every other
screen — Search, Sources, Podcasts, Settings, Ask, the sheets — was still
system bold sans, and the reason was paperSurface(): setting
.toolbarBackground makes SwiftUI build a fresh UINavigationBarAppearance
and discard the one PaperAppearance installed, text attributes included.
Bookmarks was the only screen not using the helper, which is why it alone
looked right.

The modifier no longer sets a toolbar background. It doesn't need one —
the bar is transparent by appearance and the screen already paints the
paper ground beneath it.

Also labels the bookmarks toolbar buttons (Settings, Add bookmark, Unread
filter, AI actions), which were bare SF Symbols announcing nothing to
VoiceOver.

Verified in both schemes: large titles on Bookmarks/Sources/Podcasts/
Search and inline titles on the Settings and Ask sheets all render serif,
on paper grounds.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JgLHztZGaEHvS3KNeGQmRM
2026-07-27 14:04:22 -05:00
2026-07-02 16:35:02 -05:00
2026-07-02 16:35:02 -05:00
2026-07-02 00:33:49 -05:00

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 @Observable and @MainActor throughout (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
S
Description
Native iOS client for linkding — SwiftUI, iOS 26, AI enrichment via OpenRouter
Readme
2.8 MiB
Languages
Swift 97.7%
Shell 1.4%
HTML 0.9%