Commit Graph

252 Commits

Author SHA1 Message Date
Krishna Kumar
38cd72416c Xcode project sync and seek async fix
All checks were successful
CI / build-and-deploy (push) Successful in 23s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 16:59:22 -05:00
Krishna Kumar
38fd37bee8 Fix hardcoded linkding token
Some checks failed
CI / build-and-deploy (push) Failing after 7s
2026-05-22 16:52:51 -05:00
Krishna Kumar
26b1de1cbc Hardcode default linkding server — skip onboarding on fresh install
Some checks failed
CI / build-and-deploy (push) Failing after 7s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 16:42:57 -05:00
Krishna Kumar
abe35f47d6 Add mini-player, per-row podcast button, and resume-from-position
Some checks failed
CI / build-and-deploy (push) Failing after 9s
- MiniPlayerView: persistent bar above tab bar, shows title/progress,
  play/pause and close buttons, slides in when audio starts
- PodcastPlayerViewModel lifted to BookmarksViewModel so it persists
  across sheet dismissals — audio keeps playing in background
- Headphone button on every bookmark row (filled = cached, outline = not)
- start() is idempotent: re-tapping same article resumes without restart
- stop() saves playback position before teardown (PodcastProgress)
- setupPlayer restores saved position on next open
- BrowserView keeps its own local VM (stopOnDismiss: true)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 16:19:21 -05:00
Krishna Kumar
65efe708ee Trigger IPA build
All checks were successful
CI / build-and-deploy (push) Successful in 29s
2026-05-22 16:02:34 -05:00
Krishna Kumar
f796dabcff Fix target=_blank links opening Safari — add WKUIDelegate
All checks were successful
CI / build-and-deploy (push) Successful in 21s
Without a UI delegate, WKWebView hands target="_blank" and window.open()
links to the system (Safari). createWebViewWith now loads them in the
existing webview instead.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 15:47:29 -05:00
Krishna Kumar
544fcd442c Add podcast index: JSON mapping of article URLs to cached MP3 files
All checks were successful
CI / build-and-deploy (push) Successful in 25s
PodcastIndex.swift stores {articleUrl, filename, title, createdAt} in
App Support/podcasts/index.json. Updated on every successful download.
Enables building a podcast library view later.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 15:45:38 -05:00
Krishna Kumar
476ed9b2a1 Podcast: local MP3 cache, AirPods, lock screen controls, background audio
All checks were successful
CI / build-and-deploy (push) Successful in 23s
- Cache generated MP3 to App Support/podcasts/<hash>.mp3 — re-opening
  the same article plays instantly with zero backend calls
- AVAudioSession .playback/.spokenAudio + .allowBluetoothA2DP — routes
  audio to AirPods and Bluetooth headsets
- MPRemoteCommandCenter play/pause/seek — AirPods controls + lock screen
- MPNowPlayingInfoCenter — title and scrubber on lock screen
- UIBackgroundModes: audio in Info.plist — playback continues when backgrounded
- Auto-play when player is ready

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 15:39:14 -05:00
Krishna Kumar
d2ff1d2f2f Fix Swift 6 actor isolation in MarksAuth — use UserDefaults UUID
All checks were successful
CI / build-and-deploy (push) Successful in 22s
UIDevice.current is MainActor-isolated; replaced with a stable UUID
persisted in UserDefaults to avoid the async access.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 14:20:40 -05:00
Krishna Kumar
57d5288b54 Remove anon key from MarksAuth — open device registration
Some checks failed
CI / build-and-deploy (push) Failing after 8s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 14:19:59 -05:00
Krishna Kumar
525e6557c8 Replace manual backend config with auto JWT auth
Some checks failed
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 Kumar
9f0a10d228 Always show headphones button; alert if AI not configured
All checks were successful
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 Kumar
db5092ce02 Add reading progress tracking
All checks were successful
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 Kumar
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 Kumar
ac2f9cf85d Add in-app browser with reader mode
All checks were successful
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 Kumar
7d1b53bac6 Seed edit form tags from effective tags (real + AI fallback)
All checks were successful
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 Kumar
22cde6d2d7 Add Gitea CI workflow with IPA distribution
All checks were successful
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 Kumar
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 Kumar
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 Kumar
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
Juan Gilsanz Polo
cd85f9c67f Updated ios deps 2026-05-16 14:17:20 +02:00
Juan Gilsanz Polo
582deb6cb1 Bump app version 2026-05-15 21:42:39 +02:00
Juan Gilsanz Polo
efc03a2e15 Added key properties sample 2026-05-15 21:42:29 +02:00
Juan Gilsanz Polo
7af27d361b Updated dependencies, removed split view package, removed super context menu and fix android 2026-05-15 21:30:18 +02:00
Juan Gilsanz Polo
bd1411041e Bump app version 2026-05-12 22:26:42 +02:00
Juan
06811c50f1 Merge pull request #40 from jaandrle/master 2026-05-07 22:47:32 +02:00
Jan Andrle
4998155415 Checking and rewording (cs) 2026-04-28 10:25:55 +02:00
Jan Andrle
f6d88c05b8 Added new language (cs) 2026-04-16 17:03:13 +02:00
Juan Gilsanz Polo
d0542fa3f0 Bump app version 2026-03-22 21:02:27 +01:00
Juan Gilsanz Polo
a4a6491c5e Updated ios pods 2026-03-22 21:02:12 +01:00
Juan Gilsanz Polo
1cb9ab58c2 Added slide options menu to bookmark item 2026-03-22 20:34:40 +01:00
Juan Gilsanz Polo
f2d5b075c7 Updated dependencies 2026-03-18 21:00:40 +01:00
Juan Gilsanz Polo
82f3630dd5 Bump app version 2026-01-24 19:52:46 +01:00
Juan
a5d8007945 Merge pull request #37 from astratto/allow_auth_urls
Allow saving bookmarks with authenticated URLs
2026-01-13 20:31:07 +01:00
Stefano Tortarolo
884cec19ef Allow saving bookmarks with authenticated URLs
Bookmarks behind authentication couldn't be saved.
The app didn't allow saving when URL metadata check failed, even
though Linkding accepts these URLs.
The error message still displays to inform users that metadata
couldn't be fetched, but it no longer blocks saving.
2026-01-11 14:20:08 +01:00
Juan Gilsanz Polo
471bc20aab Fixed ios stuff 2025-11-23 03:51:11 +01:00
Juan Gilsanz Polo
b455e105a1 Fix ios stuff 2025-11-23 03:31:04 +01:00
Juan Gilsanz Polo
3210e16702 Bump app version 2025-11-23 02:31:44 +01:00
Juan Gilsanz Polo
b3e9563b61 Updated some deps 2025-11-23 02:28:03 +01:00
Juan
a90379fb5c Merge pull request #33 from jonalmeida/fix-android-custom-tabs-32
Always use the default browser's custom tab
2025-11-23 02:03:38 +01:00
Jonathan Almeida
c817603551 Always use the default browser's custom tab
Fixes #32.
2025-07-05 15:36:36 -04:00
Juan Gilsanz Polo
21590d2d94 Updated app version 2025-06-17 21:45:35 +02:00
Juan Gilsanz Polo
82ac5407a1 Changed settings links 2025-06-17 21:37:23 +02:00
Juan Gilsanz Polo
7f013e7cc6 Updated iOS stuff 2025-06-17 21:37:14 +02:00
Juan Gilsanz Polo
f5e788124c Sort tags suggestions alphabetically 2025-06-17 21:20:45 +02:00
Juan Gilsanz Polo
a48e760f0c Show bookmark url when no title or description is provided 2025-06-17 21:15:17 +02:00
Juan Gilsanz Polo
ff4f8be19f Updated dependencies and Android stuff 2025-06-17 21:13:03 +02:00
Juan Gilsanz Polo
ab8249cee3 Updated app version 2025-04-04 00:01:19 +02:00
Juan Gilsanz Polo
6a10524eaa Changed receive_sharing_intent version 2025-04-03 23:50:01 +02:00
Juan Gilsanz Polo
b5ec576ce4 Fixed iOS share extension 2025-04-03 23:40:10 +02:00