Skip to content

Streaming upgrade: provider runtime, aggregate API, optimized artwork proxy, and cinematic UI redesign - #16

Merged
harusharu merged 9 commits into
mainfrom
feat/streaming-app-upgrade
Aug 19, 2026
Merged

Streaming upgrade: provider runtime, aggregate API, optimized artwork proxy, and cinematic UI redesign#16
harusharu merged 9 commits into
mainfrom
feat/streaming-app-upgrade

Conversation

@harusharu

Copy link
Copy Markdown
Owner

Summary

Large upgrade to harustream, split across five logically-grouped commits:

  1. feat(backend) — provider runtime, aggregate API, and optimized artwork proxy
  2. feat(ui) — cinematic redesign of dock, hero, search, settings, and My List
  3. chore(infra) — CI pipeline, Vercel config, and pnpm-based project setup
  4. chore(agents) — add ui-ux-pro-max skill, remove unused skills
  5. refactor(providers) — drop the superseded lib/providers module

Backend

  • Moves the node:vm provider runtime into src/providers with a registry (config, manifest, modules), sandbox, error types, fan-out loader, and shared fetch layer; adds src/media entry points (catalog, episodes, search, stream) that resolve provider modules at runtime.
  • Aggregates search and the home feed server-side; route handlers now execute provider modules in-process (/api/catalog, /api/featured, /api/media, /api/media/episodes, /api/providers, /api/proxy, /api/search, /api/stream). The /api/play and transcode stack (ffmpeg-static, hls.js) are removed.
  • Adds an SSRF-guarded, same-origin artwork proxy (/api/image/[...encoded]) so every poster/backdrop/logo loads as an optimized next/image (avif/webp, 24h TTL). The CDN preconnect allowlist is dropped from the root layout.
  • Renames lib/api/providerslib/state/providers; deletes the unused useMseStream hook and the old lib/providers module.

UI/UX

  • Dock: Header/MobileNav replaced by a floating glassy dock (FloatingMenu) with lucide icons, tooltips, and spring-driven active state.
  • Hero & rails: richer layout, shimmer sweep for loading states, consistent motion/typography and poster hover interactions.
  • Player: PlayerStage reworked with an episode picker, audio/subtitle settings tabs, and refined controls; DetailModal/PlayerModal match the new visual language; vidstack base styles imported.
  • Search: glassy command-bar with focus glow, loading spinner, clear button, kbd hint, and pill-style history chips.
  • Settings: sticky category nav with scroll-spy, icon-tile headers, visual theme preview cards, segmented speed control with sliding pill, spring toggle, and live provider status.
  • My List: filter/sort segmented controls with animated pill, progress bars on cards, richer empty states, fieldset/legend semantics.
  • Adopts Tailwind v4 utility names (outline-hidden, shadow-xs, rounded-xs) across components.

Infra & tooling

  • GitHub Actions CI (pnpm + Node 22): typecheck, lint, build on push to main and every PR.
  • vercel.json with pnpm build/install commands.
  • pnpm-based setup (packageManager, onlyBuiltDependencies, justfile defaults, .gitignore for .turbo/.vercel).
  • docs/ARCHITECTURE.md and provider-runtime env documentation in .env.example.

Verification

  • pnpm typecheck, pnpm lint, pnpm build all pass on the branch.
  • Core flows verified in the browser during development (dock navigation, search autofocus/clear/submit, settings persistence, My List filters/sorting, responsive layout at 390px/320px).

Notes

  • Runtime streaming was blocked by an upstream source on the series stream test; the affected code paths are wired but not exercised end-to-end against a live stream.

… proxy

Streaming engine:
- Move the node:vm provider runtime out of lib into src/providers with a
  registry (config, manifest, modules), sandbox, errors, fan-out module
  loader, and shared fetch layer. Add src/media entry points (catalog,
  episodes, search, stream) that resolve provider modules at runtime.
- Aggregate search and the home feed server-side; route handlers now
  execute provider modules in-process (api/catalog, featured, media,
  media/episodes, providers, proxy, search, stream). The play/transcode
  endpoints are removed along with ffmpeg-static and hls.js deps.
- Add an SSRF-guarded, same-origin artwork proxy (api/image) so every
  poster/backdrop/logo loads as an optimized next/image; drop the CDN
  preconnect allowlist from the root layout and enable image optimization
  (avif/webp, 24h TTL) in next.config.
- Rename lib/api/providers to lib/state/providers and delete the unused
  useMseStream hook.
…List

- Dock: replace Header/MobileNav with a floating glassy dock (FloatingMenu)
  with lucide icons, tooltips, and a spring-driven active state.
- Hero: restyle layout and add a shimmer sweep for loading states; carousel
  rails get consistent motion, typography, and poster hover interactions.
- Player: rework PlayerStage with an episode picker, audio/subtitle settings
  tabs, and refined controls; DetailModal and PlayerModal adopt the new
  visual language and vidstack base styles.
- Search: glassy command-bar with focus glow, loading spinner, clear button,
  kbd hint, and pill-style history chips.
- Settings: sticky category nav with scroll-spy, icon-tile section headers,
  visual theme preview cards, segmented speed control with sliding pill,
  spring toggle, and live provider status.
- My List: filter/sort segmented controls with animated pill, progress bars
  on cards, richer empty states, and fieldset/legend semantics.
- Adopt Tailwind v4 utility names (outline-hidden, shadow-xs, rounded-xs)
  across all components.
- Add a GitHub Actions workflow (pnpm, Node 22) running typecheck, lint,
  and build on push to main and on every pull request.
- Add vercel.json with pnpm build/install commands and the Next.js
  framework preset.
- Migrate tooling to pnpm: packageManager field, pnpm-workspace.yaml
  onlyBuiltDependencies, justfile defaults to pnpm, and .gitignore entries
  for .turbo and .vercel.
- Document provider runtime environment requirements in .env.example and
  add docs/ARCHITECTURE.md describing the streaming architecture.
- Enable next/image optimization (avif/webp, 24h minimum TTL) now that all
  artwork flows through the same-origin proxy; remove the ffmpeg-static
  serverExternalPackages entry with the transcode stack.
- Fix biome.json ignore pattern for next-env.d.ts across all files.
- Add the ui-ux-pro-max design skill with its searchable data catalog
  (colors, typography, icons, stacks, UX guidelines) and Python search
  scripts.
- Remove unused skills (caveman, find-skills, hono, next-cache-*,
  vercel-react-view-transitions) and update skills-lock.json and AGENTS.md
  accordingly.
Remove the old provider runtime that lived under src/lib/providers; its
role is fully superseded by the src/providers package (registry, sandbox,
runtime) introduced in the backend commit.
@vercel

vercel Bot commented Aug 19, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
harustream Ready Ready Preview Aug 19, 2026 8:16pm

pnpm v11 removed onlyBuiltDependencies in favor of allowBuilds, so the
msw approval was silently ignored and fresh CI installs failed with
ERR_PNPM_IGNORED_BUILDS. Switch pnpm-workspace.yaml to the allowBuilds
map and note the version requirement. Verified with a clean
`pnpm install --frozen-lockfile` in a temp dir.
Let users remove a title from Continue watching one at a time.

- Render an X chip at each poster's top-right, as a sibling of the resume
  button so clicks can never trigger playback.
- Reveal on card hover / keyboard focus for fine pointers and always for
  coarse (touch) pointers — the action is never hover-only.
- 44px hit target with a smaller scrim chip so it stays legible over any
  poster; each button gets a unique aria-label ("Remove <title> from
  continue watching").
- Uses the existing clear(link, episode) from useProgress and animates the
  card out via AnimatePresence; the section disappears when the last card
  is cleared.
Scrolling the app on Android felt low-FPS / freeze-prone. Two compounding
causes, both fixed:

- body used background-attachment: fixed with two large gradients. Fixed
  backgrounds make Chrome/Android re-rasterize the entire page background
  on every scroll frame. The gradient now scrolls with the content as a
  normal composited layer (zero per-frame repaint) — visually identical at
  the top of the page.
- backdrop-filter on large, persistent surfaces pinned over scrolling
  content (fixed dock, sticky settings nav, search bar) forced a re-blur
  every frame. Each now uses a near-opaque background instead:
  - FloatingMenu dock: bg-card/85 + backdrop-blur-xl -> bg-card/95
  - SettingsView sticky nav: bg-background/85 + backdrop-blur-md -> bg-background/95
  - SearchBar: bg-background/70 + backdrop-blur-xl -> bg-background/90

Small chip blurs (hero pills, history pills, card badges) are kept — tiny
areas with negligible cost that preserve the glassy aesthetic.
@harusharu
harusharu merged commit 30f18ef into main Aug 19, 2026
3 checks passed
@harusharu
harusharu deleted the feat/streaming-app-upgrade branch August 19, 2026 20:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant