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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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
jake and Claude 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