436 Commits
Author SHA1 Message Date
jake a8294d977b chore(docs): bump deps and swap fumadocs-ui for base-ui package 2026-10-07 13:54:59 -04:00
jake 0de75606a8 chore: set up changesets for versioning and releases (#68) 2026-10-07 12:28:56 -04:00
jakeandClaude Opus 5.5 2487cd0199 feat(web): link to sofa.watch from the landing page
Add a quiet "Powered by Sofa" footer to the logged-out splash screen,
linking to sofa.watch. The footer sits in normal flow below the hero so
it can't overlap the buttons on short screens, and clears the bottom
safe-area inset.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 21:53:59 -04:00
jake ac76898db4 feat(docs): redesign the marketing landing page
Rebuild the home page hero, feature sections, and footer with a new layout, integration logos component, and an app screenshot. Drop the scroll indicator in favour of the new structure.
2026-10-06 21:47:43 -04:00
jakeandClaude Opus 5.5 8084561a18 fix(native): keep analytics off until the user opts in
Default analytics to off, and name screen events from route patterns instead of pathnames and params so they carry no content IDs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 12:56:58 -04:00
jakeandClaude Opus 5.5 f48da5e6c4 ci: smoke-test backup and restore
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 12:50:18 -04:00
jakeandClaude Opus 5.5 a4439dddb1 feat(server): back up before applying migrations
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 12:48:56 -04:00
jakeandClaude Opus 5.5 dcaf509160 test(db): apply migrations to a populated v0.2.0 database
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 12:48:53 -04:00
jakeandClaude Opus 5.5 c6e414ecdb test(db): cover platform seeding, session cleanup, and import recovery
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 12:43:07 -04:00
jakeandClaude Opus 5.5 561a1b6361 fix(native): keep Library filters visible while results load or fail
Render the filter strip and a pull-to-refresh ScrollView for the pending,
error and empty states instead of replacing the whole screen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 12:37:06 -04:00
jakeandClaude Opus 5.5 8a406626ba fix(native): show only actors in the title cast row
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 12:33:55 -04:00
jakeandClaude Opus 5.5 9140891dd5 fix(cron): keep failing titles from blocking the non-library refresh
Exclude library titles and order by lastFetchedAt in SQL, and stamp
lastFetchedAt when a non-library refresh fails so it moves to the back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 12:30:17 -04:00
jakeandClaude Opus 5.5 c4a322948b fix(discovery): exclude rated and watched titles from recommendations
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 12:26:36 -04:00
jakeandClaude Opus 5.5 4eadce286b fix(web): ignore title shortcuts while a dialog or menu is open
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 12:23:04 -04:00
jakeandClaude Opus 5.5 f36820321c fix(server): validate image and avatar names and serve them inert
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 12:12:13 -04:00
jakeandClaude Opus 5.5 bd46b17711 fix(server): add security headers and reject cross-site API posts
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 12:04:06 -04:00
jakeandClaude Opus 5.5 c51a668ace chore(deps): upgrade oRPC to v2 (2.0.0-beta.42)
- Pin all @orpc/* catalog entries to 2.0.0-beta.42; @sofa/api now depends on @orpc/openapi
- Contract routes move from .route() to .meta(openapi(...)); schemas gain meta ids so the
  OpenAPI document hoists them as named components; publicInfo overrides document-level security
- OpenAPI generator/handler use v2 APIs (converters, base, spec plugin option, OpenAPI 3.1.1 output)
- Add restoreRootFileType routing interceptor so root-level File inputs (avatar upload, backup
  restore) keep their MIME type under Bun.serve
- Web/native links use origin + path url; native error classification derives HTTP status from
  COMMON_ERROR_STATUS_MAP / MalformedResponseError since ORPCError.status is gone
- router-auth test reads v2 orderedMiddlewares; regenerated docs/public/openapi.json

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 23:08:12 -04:00
jakeandClaude Opus 5.5 8da4cbbe52 fix(tracking): report when a title was already in the library
updateStatus now returns { alreadyAdded }. Native toasts say so instead of
claiming success, and the Explore hero hides Add to Watchlist for library titles.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 22:50:04 -04:00
jakeandClaude Opus 5.5 d6abcbd2bb fix(native): regroup Upcoming when the day or language changes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 22:45:29 -04:00
jakeandClaude Opus 5.5 1dc38f91b9 fix(backup): migrate restored files before swapping them in
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 22:41:02 -04:00
jakeandClaude Opus 5.5 45667f3540 fix(native): keep widget refreshes after resets and don't claim nothing is upcoming
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 22:34:42 -04:00
jakeandClaude Opus 5.5 6b56e3eff3 fix(stats): align count windows with chart buckets and fix month rollover
Window starts now equal the first chart bucket, and year buckets are built from the 1st of each month so the 29th-31st no longer repeat or skip months.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 22:31:32 -04:00
jakeandClaude Opus 5.5 fcd8731a6a fix(web): settings toggles refresh cache, backup next-run from server, update toast once
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 22:28:20 -04:00
jakeandClaude Opus 5.5 436c463cc8 fix(web): show change-password validation messages and failure reason
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 22:27:30 -04:00
jakeandClaude Opus 5.5 a6d642616b fix(cron): start manual jobs in the background and report busy jobs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 22:23:28 -04:00
jakeandClaude Opus 5.5 085b681d8a fix(native): explain change-password failures and block double submit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 22:15:57 -04:00
jakeandClaude Opus 5.5 ea9cb3de8d fix(native): skip recently-viewed and theming in link previews
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 22:12:30 -04:00
jakeandClaude Opus 5.5 ee53f33a79 fix(native): load more titles in Explore rows
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 22:10:14 -04:00
jakeandClaude Sonnet 5.5 ecf119c98e fix(native): show errors for Explore rows, failed pages and Register
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 22:06:42 -04:00
jakeandClaude Sonnet 5.5 669fc74653 fix(native): report SSO sign-in failures
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 22:03:06 -04:00
jakeandClaude Sonnet 5.5 8a6c32f376 fix(native): translate the recently viewed row's accessibility label
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 21:57:24 -04:00
jakeandClaude Sonnet 5.5 3d219ed638 chore(cron): remove query helpers replaced by checked-at stamps
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 21:56:49 -04:00
jakeandClaude Sonnet 5.5 911dc7e5f1 fix(tracking): clamp same-day log-a-watch time to now
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 21:50:57 -04:00
jakeandClaude Sonnet 5.5 cb5e0c19e7 feat(tracking): remove a single watch and log a watch on a date
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 21:50:56 -04:00
jakeandClaude Sonnet 5.5 4669d3b76d feat(native): add a watch history screen and trim the web phone tab bar
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 21:50:53 -04:00
jakeandClaude Opus 5.5 6f0b3b597f fix(public-api): allowlist telemetry features and keep /v1/version cacheable
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 21:45:43 -04:00
jakeandClaude Sonnet 5.5 b292fe37ab feat(tracking): add a paginated watch history and Last watched library sort
Adds tracking.history (cursor-paginated, movies and episodes merged), a
last_watched library sort, and a /history web page.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 14:36:44 -04:00
jakeandClaude Sonnet 5.5 6cd99a39a9 fix(upcoming): omit direction in the default view so the loader prefetch key matches
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 14:30:44 -04:00
jakeandClaude Sonnet 5.5 e625f319a2 feat(upcoming): add a "Recently aired" view of unwatched episodes
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 14:29:47 -04:00
jakeandClaude Sonnet 5.5 e3f7ccca07 fix(dashboard): block duplicate quick-watch clicks until refetch and use logical end inset
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 14:21:47 -04:00
jakeandClaude Sonnet 5.5 04bcb66436 feat(dashboard): mark episodes watched from Continue Watching and Upcoming
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 14:20:09 -04:00
jakeandClaude Sonnet 5.5 899be96316 fix(cron): judge stale seasons by the latest season fetch
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 14:15:05 -04:00
jakeandClaude Sonnet 5.5 6576f21235 perf(cron): refresh ended titles less often and only recent seasons of returning shows
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 14:13:28 -04:00
jakeandClaude Sonnet 5.5 66a5e80544 fix(imports): skip specials and refresh shows once for new episodes
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 14:09:14 -04:00
jakeandClaude Sonnet 5.5 e7f55d30e9 chore(native): define the root error fallback outside RootLayout
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 14:06:01 -04:00
jakeandClaude Sonnet 5.5 51d193b411 perf(metadata): remember empty TMDB lookups instead of refetching every view
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 14:01:22 -04:00
jakeandClaude Sonnet 5.5 edd6eb541d fix(imports): keep date-only values on their calendar day
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 13:51:49 -04:00
jakeandClaude Sonnet 5.5 1ccc138144 test(i18n): cover month labels when Intl defaults to UTC like the native polyfill
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 13:48:29 -04:00
jakeandClaude Sonnet 5.5 c40b6844a0 fix(i18n): format Upcoming month headers in UTC so native shows the right month
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 13:47:15 -04:00
jakeandClaude Sonnet 5.5 b7887eef70 fix(native): make select sheets and row actions usable with VoiceOver and TalkBack
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 13:43:21 -04:00