5db6a44b60
refactor: remove haptic feedback on menu open for header avatar, stats card, and sort menu components
expo-57
jake2026-07-12 18:27:44 -04:00
66d2de3020
fix(i18n): wrap remaining hardcoded strings in web and native with LingUI macros - Wrap star rating and decade labels in library screen/filter-sheet with t macro so they're translatable (and move decade labels out of static const into a reactive map) - Wrap accessibility labels in integration-card, swipeable-row with t macro - Refactor SHORTCUT_DESCRIPTIONS in command-palette into SHORTCUT_GROUPS with msg descriptors; render scope/description/connector via i18n._() and <Trans> so all shortcut help text is extractable - Wrap "Command Palette" dialog title, media type badges, and "then" connector in <Trans>/t - Fix system-health-section backup count string: move plural() outside <Trans> to avoid untranslatable interpolation - Wrap sr-only strings ("More", "Close") in breadcrumb, dialog, pagination, sheet, and sidebar with <Trans> - Wrap setup route strings with <Trans>/t macros - Update en.po with newly extracted message IDs
jake2026-03-24 14:38:12 -04:00
b8f3468283
fix(native): add Apple privacy manifest and fix Sentry metro config
jake2026-03-24 13:39:00 -04:00
eb9c7ae6df
fix(i18n): comprehensive audit of translated strings across web and native
jakeandClaude Opus 4.62026-03-23 16:21:54 -04:00
b289b7abed
refactor: optimize cron scheduling, DB maintenance, and TMDB reliability
jake2026-03-23 13:59:31 -04:00
d9be566863
refactor: clean up orphaned cached images on cache purge and metadata updates - Add deleteOrphanedImage(category, path) helper to image-cache.ts for fire-and-forget unlink of stale cached files - Extend purgeShellTitlesTransaction to collect poster, backdrop, still, and profile image paths from deleted titles/persons before cascade deletes, returning them as orphanedImages in PurgeResult - Wire orphaned image cleanup into purgeMetadataCache (cache purge), batchUpsertPersons (profile path changes), updateTitleWithArtInvalidation (poster/backdrop changes), and refreshTvChildren (season posters and episode stills) - Remove getTitlesWithMissingThumbhashes, getTitleIdsWithMissingSeasonThumbhashes, getTitleIdsWithMissingEpisodeThumbhashes, and getTitleIdsWithMissingProfileThumbhashes from @sofa/db/queries/cron — getThumbhashBackfillTitleIds now delegates to getLibraryTitleIds only - Fix episode still cleanup to call deleteOrphanedImage even when stillThumbHash is null (previously skipped)
jake2026-03-23 13:18:06 -04:00
cc8909d64e
fix: remove @sofa/core and @sofa/api deps from public-api to fix Vercel runtime compatibility - Drop @sofa/core and @sofa/api from apps/public-api — importing workspace packages with DB/Node dependencies broke the Vercel edge runtime - fetchUserData on Trakt and Simkl importers now returns raw unknown API responses; parsing is deferred to the self-hosted server - Add source + rawPayload fields to ParsePayloadInput; parsePayload procedure now dispatches to parseTraktPayload/parseSimklPayload and returns full warnings + diagnostics - Export ProviderEnum from apps/public-api/src/importers/index.ts instead of defining it inline in app.tsjake2026-03-23 12:48:04 -04:00
ddaa194f5d
fix: close cache purge dialogs on success and disable actions while pending
jake2026-03-22 19:00:13 -04:00
91ca6ab3c0
fix(native): add podspec to sofa-widgets-support module to resolve CocoaPods module map build failure
jake2026-03-22 18:40:36 -04:00
f2f5e823f4
fix: UX polish across web and native — error boundaries, query tuning, and i18n improvements
jake2026-03-22 16:46:39 -04:00
1d67b201a0
chore: extract shared tsconfig, move display-status to core, add i18n tests - Add @sofa/tsconfig package with a shared base.json (target, lib, strict, moduleResolution, etc.) and migrate all packages/apps to "extends": "@sofa/tsconfig/base.json" to eliminate duplicated compiler options - Move display-status.ts (and its DisplayStatus type + getDisplayStatus fn) from @sofa/api to @sofa/core; remove the ./display-status export from @sofa/api and update all import sites in discovery.ts and tracking.ts - Add packages/core/test/display-status.test.ts: 15 tests covering ONGOING_TMDB_STATUSES and all getDisplayStatus branches (movie, TV watchlist/in_progress/caught_up/completed, edge cases) - Add packages/i18n/vitest.config.ts and two new test files: date-buckets.test.ts and format.test.ts covering date bucketing and locale formatting utilities
jake2026-03-22 14:46:25 -04:00
6be586bd53
chore: dependency updates and minor refactors
jake2026-03-22 14:11:45 -04:00
2c7068ced3
chore: migrate oxlint config to e18e plugin and fix lint violations - Replace root eslint-plugin-lingui jsPlugin with @e18e/eslint-plugin; move lingui rules into per-app .oxlintrc.json overrides for native and web - Add jsx-a11y, react-hooks-js (native), and expanded lingui rule sets to per-app configs - Add oxc/no-barrel-file warning at threshold 0 to root config - Fix e18e/prefer-url-canparse: replace try { new URL() } catch with URL.canParse() in server-url screen and server lib - Fix e18e/prefer-timer-args: pass callback args directly to setTimeout instead of wrapping in arrow functions (use-debounce, integration-card) - Fix e18e/prefer-static-regex: hoist /\/+$/ to module-level constant in server-url screen - Fix react-hooks-js/refs and react-hooks-js/set-state-in-effect: convert useRef tracking patterns to useState + render-time derived updates in use-server-connection, expandable-text, and settings screen - Fix react-hooks-js/immutability: extract stable palette sub-values before useMemo deps in title detail screen - Apply e18e and other rule fixes across core, tmdb, web components, and i18n packages
jake2026-03-22 13:50:24 -04:00
72f26f822c
fix: harden stale import job detection and cancellation cleanup
jake2026-03-22 10:17:17 -04:00
fd4a8119ce
feat(native): add iOS home screen widgets for continue watching and upcoming
jake2026-03-21 21:03:58 -04:00
61013ee41f
feat: add user data export and sofa export re-import support
jake2026-03-21 17:12:15 -04:00
58cf2e689f
fix: harden backup restore, first-user race, and several reliability issues
jake2026-03-21 16:16:37 -04:00
f676cea237
fix: throw notFound() for missing titles/people and improve error handling
jake2026-03-21 16:02:59 -04:00
37c35488fd
feat(analytics): proxy PostHog ingestion through public-api on Vercel - Add Vercel rewrites to proxy /ingest/* and /ingest/static/* to PostHog's US endpoints - Update native .env.example to point EXPO_PUBLIC_POSTHOG_HOST at the self-hosted proxy URL
jake2026-03-21 15:39:56 -04:00
31572816aa
chore(ci): simplify Crowdin workflow and bump checkout action - Upgrade actions/checkout from v4 → v6 in both upload and download jobs - Remove manual bun install + compile + git commit steps from the download job — Crowdin's own action now handles committing updated PO files via push_translations: true - Allow the download job to run on schedule events in addition to workflow_dispatchjake2026-03-21 13:02:01 -04:00
1a503df2ae
feat: add upcoming episodes and movies timeline (#17)
jakeandGitHub2026-03-21 12:31:53 -04:00
5aaf88591b
feat(i18n): add RTL layout support for Arabic and other RTL locales
jake2026-03-20 19:25:04 -04:00
b540a9111a
refactor(i18n): replace compiled .ts catalogs with direct .po imports - Remove lingui compile / i18n:compile script — Vite and Metro LingUI plugins now compile .po files on the fly at dev/build time; no manual compile step needed - Import .po files directly in @sofa/i18n (./po/en.po etc.) and add po.d.ts ambient module declaration so TypeScript accepts them - Add fallbackLocales: { default: "en" } and lineNumbers: false to lingui.config.ts; prefix catalog paths with <rootDir> for correctness - Derive SupportedLocale and SUPPORTED_LOCALES from LOCALE_INFO in locales.ts to eliminate the circular import between index.ts and locales.ts - Update Crowdin config to use project_id_env instead of a hardcoded ID, drop languages_mapping (no longer needed), and add preserve_hierarchy: true - Add a daily cron trigger (0 6 * * *) to the Crowdin GitHub Actions workflow and drop the now-redundant compile step from it - Update docs and AGENTS.md to reflect that no compile step is required after i18n:extractjake2026-03-20 16:36:02 -04:00
5c70d29fac
refactor: consolidate watchlist states (#18)
jakeandGitHub2026-03-20 15:31:31 -04:00
4b4d35ce31
perf(native): memoize list headers and card components to reduce unnecessary re-renders - Wrap ContinueWatchingCard with memo() so it only re-renders when its item prop changes - Extract ListHeaderComponent in RecentlyViewedList into a useMemo to avoid recreating the JSX tree on every render - Move listHeader in the person detail screen from a plain JSX variable to useMemo, and relocate departmentLabels inside it so the t reference is stable - Store the "copied" reset timer in a useRef in IntegrationCard and clear it on unmount to prevent setState-after-unmount warnings
jake2026-03-19 16:53:14 -04:00
1670c6f494
feat(web): add page titles, staleTime, and lift auth redirect into layout - Add head() with document titles to dashboard, explore, settings, setup, login, register, and person detail routes - Return personName from the person detail loader so the title can be set server-side instead of after data loads - Add staleTime to all loader routes (30s for dashboard/settings, 60s for explore/titles/people) - Move the "redirect if already authenticated" beforeLoad guard from individual login/register routes into the shared _auth layout so it runs once for all unauthenticated routes - Add a Cloud deploy section to the README with a one-click Railway button
jake2026-03-19 16:47:23 -04:00
78266cf202
feat(native): internationalize tab bar labels and improve recently-viewed row
jake2026-03-19 15:06:02 -04:00
fb4b521450
fix(native): fix modal close button behind status bar on Android
jakeandClaude Opus 4.62026-03-19 12:16:47 -04:00
98aa7326d5
fix(server): store raw TMDB paths in browse upserts to prevent double-resolution
jakeandClaude Opus 4.62026-03-19 12:00:45 -04:00
885b594a97
fix(native): inline department labels and dim age text in person detail screen - Move getDepartmentLabels helper inline as departmentLabels object inside the component so t from useLingui() is already in scope - Wrap the birthday age/death annotation in a nested <Text> with text-muted-foreground/60 to visually de-emphasise it
jake2026-03-19 11:57:27 -04:00
8d1cc46875
fix(db): use (tmdbId, type) composite keys for title lookups
jakeandClaude Opus 4.62026-03-19 11:47:14 -04:00
1f8b3d8f37
feat: redesign dashboard stats cards with sparklines, icons, and period selection
jake2026-03-19 11:42:30 -04:00
1050a0de00
feat: redesign dashboard stats cards with sparklines, icons, and period selection
jake2026-03-19 11:31:15 -04:00
f4c6b27cd9
refactor(web): replace ProgressProvider context with a self-contained NavigationProgress component driven by TanStack Router lifecycle events
jake2026-03-19 11:05:33 -04:00
320852b035
fix(web): import globals.css directly instead of as a URL stylesheet link
jake2026-03-19 10:55:01 -04:00
d94ec16fae
feat(web): add route loaders to prefetch dashboard, explore, and settings queries
jake2026-03-18 22:04:19 -04:00
7b0c07ad3c
chore(i18n): add Claude-powered translation script and fill missing PO translations - Add packages/i18n/scripts/claude.ts — a Bun script that translates empty PO entries via the Claude Code CLI, supporting batch mode, dry-run, optional AI context from crowdin-context.jsonl, and structured JSON output validation - Add i18n:claude root script (bun packages/i18n/scripts/claude.ts) as a convenience alias - Fill all previously empty msgstr entries across de, es, fr, it, pt PO catalogs and recompile .ts catalogs - Polish README with badges (license, CI status, release, language, Crowdin localization) and minor formatting fixes
jake2026-03-18 20:42:01 -04:00
9b2d7caa3f
fix(native): add .js extensions to all @formatjs polyfill imports for Metro compatibility
jake2026-03-18 17:42:44 -04:00
466aa5464e
fix(native): rename DetailStackHeader to ModalStackHeader and remove hero fade-in animation and continue-watching overlay
jake2026-03-18 17:36:45 -04:00
3c1b7cfe11
refactor: enforce layered architecture by extracting all DB queries into @sofa/db/queries/*jake2026-03-18 17:31:18 -04:00
3a0374c825
chore(lint): add perf category to oxlint and fix resulting warnings
jake2026-03-18 15:48:47 -04:00
e50ab44783
refactor(native): consolidate server utilities into a single lib/server.ts module - Merge auth-client.ts, cached-session.ts, server-reachability.ts, and server-url.ts into lib/server.ts; update all import sites to use @/lib/server - Replace the standalone registerServer + setServerUrl calls with a serverManager.connectToServer() method and expose serverManager.normalizeUrl, serverManager.validateServerUrl, and serverManager.hasStoredServerUrl - Move use-server-connection.ts from lib/ to hooks/ and remove the seedSessionFromCache export; replace with an initialize() helper called at module scope in the root layout - Add getScopeKey() to derive the TanStack Query persistence scope key, removing the inline computation from QueryProvider - Clear the query cache on server URL change inside useServerConnectionjake2026-03-17 20:57:50 -04:00
f4199b595b
fix(native): change person detail screen presentation from slide animation to modal
jake2026-03-17 20:19:57 -04:00
b2a5c298c5
refactor(native): centralize title mutations into useTitleActions, extract server-connection logic, and unify hero banner - Add useTitleActions hook that owns all title mutation side-effects (toast messages, query invalidation) and replace inline useMutation calls in the title detail, search, and person screens, as well as usePosterActions, with it - Extract the server URL watching, instance-ID provisioning, storage-scope management, reachability monitor, and session-reconciliation logic from _layout.tsx into a useServerConnection hook and a seedSessionFromCache helper in use-server-connection.ts; AppContent now calls a single hook - Delete the iOS-only hero-banner.ios.tsx and consolidate into hero-banner.tsx - Extract usePressAnimation into its own hook file - Move shared action helpers (quick-add, watch-movie, etc.) into lib/title-actions.tsjake2026-03-17 20:01:03 -04:00
1257a485e9
feat(native): add context menus to poster cards, hero banners, and continue-watching cards; remove failedKey error state
jake2026-03-17 19:32:00 -04:00