Commit Graph
10 Commits
Author SHA1 Message Date
Krishna KumarandClaude Sonnet 4.6 525e6557c8 Replace manual backend config with auto JWT auth
CI / build-and-deploy (push) Failing after 6s
Device auto-registers on first launch using hardcoded backend URL
and anon key (MarksAuth.swift). 90-day JWT stored in UserDefaults,
refreshed transparently. No settings fields needed — ClaudeService
is always active and non-optional throughout the app.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 14:14:54 -05:00
Krishna KumarandClaude Sonnet 4.6 9f0a10d228 Always show headphones button; alert if AI not configured
CI / build-and-deploy (push) Successful in 24s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 14:04:24 -05:00
Krishna KumarandClaude Sonnet 4.6 db5092ce02 Add reading progress tracking
CI / build-and-deploy (push) Successful in 25s
- BrowserState: inject scroll-tracking JS after page load, report position
  via WKScriptMessageHandler (weak ref to avoid retain cycle)
- BrowserView: thin blue progress bar at top of viewport; saves progress
  to UserDefaults on dismiss; restores scroll position on revisit
- BookmarkRow: 2px progress bar below tags for partially-read articles
- BookmarksView: loads ReadingProgress.all() on appear, refreshes when
  browser sheet dismisses
- ReadingProgress: static helper for UserDefaults-backed [url: Double] store;
  removes entry when article is fully read (≥99%)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 18:42:12 -05:00
Krishna KumarandClaude Sonnet 4.6 bc16ee986d Migrate AI features to backend, add podcast generation
- ClaudeService: replace direct OpenRouter calls with backend endpoints
  (/v1/marks/enrich, /v1/marks/search, /v1/marks/collections)
- ClaudeService: add podcast methods (generate, status, downloadAudio)
- SettingsView: replace OpenRouter key field with backend URL + API key
- PodcastPlayerView: new sheet — generate → poll → AVPlayer playback
- BrowserView: headphones toolbar button triggers podcast for current URL
- BookmarksView: "Convert to Podcast" context menu item + sheet

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 18:39:15 -05:00
Krishna KumarandClaude Sonnet 4.6 ac2f9cf85d Add in-app browser with reader mode
CI / build-and-deploy (push) Successful in 22s
Tapping a bookmark now opens an in-app WKWebView instead of bouncing to
Safari. Reader mode injects JS to extract article content and rerender
with clean serif typography and dark-mode support. Bottom toolbar has
back/forward, reader toggle, share, and open-in-Safari escape hatch.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 12:43:33 -05:00
Krishna KumarandClaude Sonnet 4.6 7d1b53bac6 Seed edit form tags from effective tags (real + AI fallback)
CI / build-and-deploy (push) Successful in 24s
The list row shows effectiveTags which merges real linkding tagNames with
AI-enriched aiTags. If a bookmark has only AI tags, the edit form was
appearing empty because it only seeded from tagNames. Now falls back to
aiTags when tagNames is empty.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 12:33:24 -05:00
Krishna KumarandClaude Sonnet 4.6 22cde6d2d7 Add Gitea CI workflow with IPA distribution
CI / build-and-deploy (push) Successful in 16s
On every push to swift/master: compile-checks against the simulator
(no signing required) then builds a development IPA and deploys it to
the shared OTA server at krishnas-mac-studio.tail37d544.ts.net:8443.

Modelled on 1ai's ci.yaml — runs on the local macos act runner so the
keychain is live and automatic signing works without any cert setup.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 12:05:55 -05:00
Krishna KumarandClaude Sonnet 4.6 bbda33ad33 Add IPA build and deploy script for shared distribution server
Builds a development IPA via xcodebuild (with xcodegen pre-pass) and
copies it to the shared Tailscale distribution server at
https://krishnas-mac-studio.tail37d544.ts.net:8443 — same server and
builds directory used by 1ai.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 11:58:45 -05:00
Krishna KumarandClaude Sonnet 4.6 1b40f50aab Add edit bookmark, offline cache, and unread filter
- Edit bookmark: full PATCH via swipe action or long-press context menu;
  EditBookmarkView covers URL, title, description, tags, and unread toggle
- Offline cache: bookmarks persisted to ApplicationSupport JSON and shown
  instantly on launch; cache is per-server, skipped when unread filter is on
- Unread filter: toolbar toggle sends ?unread=true to the API; title updates
  to "Unread"; no stale-cache flash when toggling
- Extract normalizedURL and parsedTags into String+Helpers, removing three
  copies of URL normalization and two of tag parsing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 11:51:54 -05:00
Krishna KumarandClaude Sonnet 4.6 b7ef5c2215 Replace Flutter app with native SwiftUI rewrite (iOS 26)
Complete ground-up rewrite in SwiftUI targeting iOS 26. Drops the Flutter/Dart
codebase entirely in favour of a lean native app with no third-party dependencies.

Features shipped:
- Bookmark list with pagination, pull-to-refresh, swipe delete/archive
- Add bookmark form + iOS share extension (zero-tap save from any app)
- Tags tab — all tags sorted by count, tap to browse filtered bookmarks
- Native search tab (Tab role: .search) with instant client-side filtering
- AI enrichment via OpenRouter (google/gemini-2.0-flash-lite-001): auto-summary
  and tag generation, semantic search, smart collections
- Settings: linkding server config, OpenRouter API key
- App Groups for credential sharing between main app and share extension
- Swift 6 strict concurrency throughout (@Observable, @MainActor)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 08:33:01 -05:00