Files
linkding-ios/project.yml
Krishna Kumar e82e69c5f3
All checks were successful
CI / build-and-deploy (push) Successful in 20s
feat(share): dup-aware interactive save card with AI tag suggestions
Replace the fire-and-forget share toast with an interactive SwiftUI card.
On open it checks linkding's /api/bookmarks/check/ so an already-saved URL
routes to an Update (no more silent duplicates) and a new URL shows a save
form with title, tags, notes, and a read-later toggle.

Tag suggestions are hybrid: fetch the user's existing tag vocabulary
(/api/tags/) and AI tag ideas (/v1/marks/enrich via anonymous device auth),
auto-fill known-vocabulary matches into the field and surface net-new ideas
as tappable chips. Best-effort and non-blocking — failures never block save.

Also:
- Refresh bookmarks when the app returns to the foreground (scenePhase).
- Render bookmark dates as a static relative label instead of the live
  ticking RelativeDateTime timer.
- Share LinkdingAPI/Bookmark/ServerConfig/MarksAuth into the ShareExtension
  target via project.yml (durable across xcodegen regen) and regenerate.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 20:36:46 -05:00

126 lines
2.9 KiB
YAML

name: Marks
options:
bundleIdPrefix: com.magicive
deploymentTarget:
iOS: "26.0"
xcodeVersion: "16.3"
createIntermediateGroups: true
settings:
base:
SWIFT_VERSION: "6.0"
DEVELOPMENT_TEAM: AE5DZKJHGN
CODE_SIGN_STYLE: Automatic
IPHONEOS_DEPLOYMENT_TARGET: "26.0"
ENABLE_PREVIEWS: YES
schemes:
Marks:
build:
targets:
Marks: all
ShareExtension: all
MarksWidget: all
run:
config: Debug
test:
config: Debug
targets:
- MarksTests
profile:
config: Release
analyze:
config: Debug
archive:
config: Release
MarksWidget:
build:
targets:
Marks: all
MarksWidget: all
run:
config: Debug
analyze:
config: Debug
archive:
config: Release
ShareExtension:
build:
targets:
Marks: all
ShareExtension: all
run:
config: Debug
analyze:
config: Debug
archive:
config: Release
targets:
Marks:
type: application
platform: iOS
sources:
- path: Marks
- path: MarksWidget/WidgetDataStore.swift
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.magicive.marks
INFOPLIST_FILE: Marks/Info.plist
CODE_SIGN_ENTITLEMENTS: Marks/Marks.entitlements
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
dependencies:
- target: ShareExtension
- target: MarksWidget
- sdk: WidgetKit.framework
- sdk: AppIntents.framework
ShareExtension:
type: app-extension
platform: iOS
sources:
- path: ShareExtension
# Shared with the main app so the extension can talk to linkding + the AI
# backend (the save card checks for duplicates and suggests tags).
- path: Marks/Models/Bookmark.swift
- path: Marks/Models/ServerConfig.swift
- path: Marks/Services/LinkdingAPI.swift
- path: Marks/Services/MarksAuth.swift
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.magicive.marks.ShareExtension
INFOPLIST_FILE: ShareExtension/Info.plist
CODE_SIGN_ENTITLEMENTS: ShareExtension/ShareExtension.entitlements
SKIP_INSTALL: YES
APPLICATION_EXTENSION_API_ONLY: YES
MarksTests:
type: bundle.unit-test
platform: iOS
sources:
- path: MarksTests
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.magicive.marks.MarksTests
GENERATE_INFOPLIST_FILE: YES
dependencies:
- target: Marks
MarksWidget:
type: app-extension
platform: iOS
sources:
- path: MarksWidget
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.magicive.marks.MarksWidget
INFOPLIST_FILE: MarksWidget/Info.plist
CODE_SIGN_ENTITLEMENTS: MarksWidget/MarksWidget.entitlements
SKIP_INSTALL: YES
dependencies:
- sdk: WidgetKit.framework
- sdk: SwiftUI.framework