Commit Graph

65 Commits

Author SHA1 Message Date
Dorian
7e9a35a963 Add HLS.js support and enhance content streaming logic
- Integrated HLS.js version 1.6.15 into the project for improved video streaming capabilities.
- Updated the ContentsController to check for HLS manifest availability and fall back to presigned URLs for original files if not found.
- Enhanced the VideoPlayer component to handle loading and error states more effectively, improving user experience during streaming.
- Refactored content service methods to return detailed streaming information, including HLS and DASH manifest URLs.
2026-02-13 00:04:53 +00:00
Dorian
0da83f461c Enhance payment processing and rental features
- Updated the BTCPay service to support internal Lightning invoices with private route hints, improving payment routing for users with private channels.
- Added reconciliation methods for pending rents and subscriptions to ensure missed payments are processed on startup.
- Enhanced the rental and subscription services to handle payments in satoshis, aligning with Lightning Network standards.
- Improved the rental modal and content detail components to display rental status and pricing more clearly, including a countdown for rental expiration.
- Refactored various components to streamline user experience and ensure accurate rental access checks.
2026-02-12 23:24:25 +00:00
Dorian
cdd24a5def Implement backend API and database services in Docker setup
- Added a new `api` service for the NestJS backend, including health checks and dependencies on PostgreSQL, Redis, and MinIO.
- Introduced PostgreSQL and Redis services with health checks and configurations for data persistence.
- Added MinIO for S3-compatible object storage and a one-shot service to initialize required buckets.
- Updated the Nginx configuration to proxy requests to the new backend API and MinIO storage.
- Enhanced the Dockerfile to support the new API environment variables and configurations.
- Updated the `package.json` and `package-lock.json` to include new dependencies for QR code generation and other utilities.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 20:14:39 +00:00
Dorian
f19fd6feef Enhance comment seeding and search functionality
- Updated the `seedComments` function to return an array of published comment event IDs for tracking.
- Introduced `seedCommentReactions` to seed upvotes and downvotes on comments, improving interaction visibility.
- Enhanced the `App.vue` and `MobileNav.vue` components to support a mobile search overlay, allowing users to search films seamlessly.
- Added a new `MobileSearch` component for better search experience on mobile devices.
- Implemented a search feature in `AppHeader.vue` with dropdown results for improved content discovery.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 14:57:16 +00:00
Dorian
53a88b012a Update tsconfig and AuthModal component for enhanced functionality
- Added new composable `usecontentdiscovery` and `contentsource` to support additional content sources in the application.
- Removed unused `isAmberSupported` from the AuthModal component to streamline the authentication process.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 14:26:52 +00:00
Dorian
35bc78b890 Enhance content management and user interaction features
- Introduced a new content source toggle in the profile and app header to switch between IndeeHub and TopDoc films.
- Updated the content fetching logic to dynamically load content based on the selected source.
- Enhanced the seeding process to include a combined catalog of IndeeHub and TopDoc films, ensuring diverse content availability.
- Improved user interaction by preventing duplicate reactions and ensuring a smoother voting experience across comments and content.
- Added support for Amber login (NIP-55) for Android users, integrating it into the existing authentication flow.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 14:24:52 +00:00
Dorian
4bc14caae7 Match algo filter layout to Films/My List (slider spacing)
Replaced the grid layout on the algo filter view with the same flex
slider container (gap-8, pt-6 pb-8, fixed card widths) used by
ContentRow and My List, with flex-wrap so all items remain visible.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 13:21:13 +00:00
Dorian
dcb419d67a Unify auth: bridge auth store and Nostr account on every login path
The app had two disconnected auth systems:
- Auth store (useAuth): controls isAuthenticated, subscription, My List
- Account manager (useAccounts): controls isNostrLoggedIn, comments

Previously each login path only populated one system:
- Persona login → Nostr only (no subscription/My List)
- AuthModal Nostr → Auth store only (no commenting)
- Extension login → Nostr only (no subscription/My List)

Now every login path bridges both systems:
- Persona/extension login also calls auth store loginWithNostr
- AuthModal Nostr login also registers extension in accountManager
- Logout already cleared both (no change needed)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 13:20:35 +00:00
Dorian
32e1751df3 Fix seeder: origin mismatch + robust Dockerfile
Two root causes for seeding not working on production:

1. Origin mismatch: The seeder writes content IDs as
   http://localhost:7777/content/... but the app was using
   window.location.origin (the user's actual browser URL) to
   query the relay. Introduced VITE_CONTENT_ORIGIN env var
   baked into the Docker build so both sides use the same origin.

2. Dockerfile.seed fragility: Replaced --omit=dev + global tsx
   with a cleaner approach that strips sharp from package.json
   (the only native dep that fails on Alpine) then does a full
   npm install, ensuring tsx/esbuild and all applesauce deps
   resolve correctly.

Also improved wait-for-relay to accept any HTTP response (some
relays return 4xx for plain GET) and increased max attempts.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 13:17:49 +00:00
Dorian
57db25aa94 Match My List layout to Films tab (horizontal slider, card sizing)
Replaced grid layout in My List sections with the same horizontal
scroll slider used by ContentRow: flex gap-8, fixed card widths
(200px/280px), matching padding and overflow behavior. Cards,
spacing, and scrolling now look identical across Films and My List.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 13:12:22 +00:00
Dorian
5e6c1e009a Match My List and filter grid text styling to ContentRow
Title and description text sizes in the My List (Continue Watching,
Saved Films, Rentals) and filtered grid views were smaller than
the Films tab ContentRow cards. Aligned all to use the same
text-base/md:text-xl title and text-base description sizing.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 13:06:23 +00:00
Dorian
2c6e311705 Add truncated descriptions to My List film cards
Add the same truncated description line to Continue Watching
and My Rentals grids so card sizing matches the other screens.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 12:47:33 +00:00
Dorian
8145dc9590 Fix algo filters showing both inline and dropdown at once
- Wrap inline algo buttons in a hidden/flex container so the
  parent div controls visibility instead of per-button classes
  (scoped .nav-button display:inline-block was overriding
  Tailwind's hidden class)
- Add flex-shrink-0 to logo link so it never gets squeezed out
  on narrower desktop screens
- Reduce logo-to-nav gap on md screens (gap-4) to prevent
  overflow, widen to gap-10 at lg+

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 12:46:58 +00:00
Dorian
793df81798 Redesign comment replies as glass bubbles
- Top-level comments keep their existing layout (avatar, name,
  timestamp, text, action bar)
- Replies now render in a rounded glass bubble with subtle
  background and border, chat-message style (flat top-left
  corner, rounded on the other three)
- Smaller avatars and more compact action buttons for replies
- Reply form pulled outside the comment layout for cleaner
  nesting at all depths
- Better spacing between comment threads

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 12:45:22 +00:00
Dorian
72de7501d3 Redesign comments into glass bubble format
- Top-level comments render as glass-card bubbles with subtle
  border, backdrop blur, and hover highlight
- Replies use a lighter, more compact bubble variant
- Threaded replies connected by a vertical line on the left
  instead of raw margin indentation
- Action buttons (upvote, downvote, reply, expand) styled as
  pill-shaped micro-buttons inside each bubble
- Reply form nests inline within the parent bubble
- Proper spacing and responsive padding at all nesting depths

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 12:43:21 +00:00
Dorian
f24fc8997f Use original God Bless Bitcoin banner image
Revert to the original backdrop and delete the replacement.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 12:41:52 +00:00
Dorian
ba4e37813d Gate My List behind auth modal instead of in-page prompt
- Clicking My List when not logged in now opens the auth modal
  directly instead of navigating to a page with a sign-in button
- After successful login, auto-redirects to /library (My List)
- Works on both desktop header and mobile tab bar
- App.vue tracks a pending redirect path so the post-login
  navigation happens seamlessly
- Direct URL navigation to /library when not logged in also
  triggers the modal and redirects back to Films

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 12:41:12 +00:00
Dorian
04d80f545e Fix Nostr icon and make algo filters responsive
- Replace broken shield SVG in auth modal Nostr login button
  with a proper key icon (matches Nostr's key-based identity)
- Show algorithm filter buttons inline on xl+ screens (1280px+)
  where there's room for all of them
- Collapse into "Algos" dropdown on md–xl screens to prevent
  overflow when the header is too narrow

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 12:37:20 +00:00
Dorian
7c995edcc2 Collapse algorithm filters into Algos dropdown
- Replace inline filter buttons in desktop header with a single
  "Algos" dropdown that shows all discovery algorithms in a glass
  menu with checkmark for the active selection and a clear option
- Button label dynamically shows the active algorithm name or
  defaults to "Algos" when no filter is active
- Rename mobile tab bar "Filters" to "Algos" with a gear icon
- Rename bottom sheet title to "Algos" to match

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 12:35:46 +00:00
Dorian
0a7543cf32 Add Nostr relay + seed data to Docker deployment
- Add nostr-rs-relay service to docker-compose for persistent
  comments, reactions, and profiles on the dev server
- Add one-shot seeder container that auto-populates the relay
  with test personas, reactions, and comments on first deploy
- Proxy WebSocket connections through nginx at /relay so the
  frontend connects to the relay on the same host (no CORS)
- Make relay URL dynamic: reads from VITE_NOSTR_RELAYS in dev,
  auto-detects /relay proxy path in production Docker builds
- Make seed scripts configurable via RELAY_URL and ORIGIN env vars
- Add wait-for-relay script for reliable container orchestration
- Add "Resume last played" hero banner on My List tab

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 12:33:22 +00:00
Dorian
725896673c Update package dependencies and enhance application structure
- Added several new dependencies related to the Applesauce library, including 'applesauce-accounts', 'applesauce-common', 'applesauce-core', 'applesauce-loaders', 'applesauce-relay', and 'applesauce-signers', all at version 5.1.0.
- Updated the development script in package.json to specify a port for Vite and added new seed scripts for profiles and activity.
- Removed outdated image files from the public directory to clean up unused assets.
- Enhanced the App.vue structure by integrating shared components like AppHeader and AuthModal for improved user experience.
- Refactored ContentDetailModal and MobileNav components to support new features and improve usability.

These changes improve the overall functionality and maintainability of the application while ensuring it utilizes the latest libraries for better performance.
2026-02-12 12:24:58 +00:00
Dorian
c970f5b29f Enhance deployment script and update package dependencies
- Added detailed labels to the deployment script for IndeedHub, including title, version, description, license, icon, and repository URL.
- Updated package dependencies in package.json and package-lock.json, including upgrading 'nostr-tools' to version 2.23.0 and adding 'axios' and '@tanstack/vue-query'.
- Improved README with a modern description of the platform and updated project structure details.

This commit enhances the clarity of the deployment process and ensures the project is using the latest dependencies for better performance and features.
2026-02-12 10:30:47 +00:00
Dorian
dacfa7a822 Revert scroll nav buttons to full-height style
Reverted back to previous design:
- Buttons span full height (top-0 bottom-0)
- No separate container wrapper
- Direct glassmorphic styling on button
- 48px width (w-12)
- 32px icon size (w-8 h-8)
- Positioned at edges (left-0, right-0)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 01:00:13 +00:00
Dorian
0aed617bca Improve banner image rendering quality
Added image-rendering properties to prevent fuzzy upscaling:
- image-rendering: -webkit-optimize-contrast for webkit browsers
- image-rendering: crisp-edges as fallback

This ensures upscaled images maintain sharp edges and better quality
instead of appearing blurry or fuzzy.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:47:52 +00:00
Dorian
36c913dd23 Add tight glass container around scroll nav buttons
Wrapped scroll buttons in contained glass containers:
- Tight 10x10 button inside glass container
- Positioned vertically centered with offset from edges
- Container has full glassmorphic treatment
- 12px border radius for rounded corners
- 2px padding creates tight fit around button
- Hover effects on container instead of button
- Button is transparent, inherits container styling

Creates a more defined, pill-shaped button appearance.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:45:56 +00:00
Dorian
4558415d80 Create compact glass containers for arrow icons
Restructured scroll navigation:
- Arrow icons now in their own glass containers
- Minimal padding: 8px around icons
- 12px border-radius for rounded corners
- Positioned with left-2/right-2 and centered vertically
- Smaller, more elegant design
- Scale(1.05) on hover for subtle feedback

Icons are now compact glass pills instead of full-height bars.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:45:05 +00:00
Dorian
bcaae91dfd Apply glassmorphism to scroll navigation arrows
Styled scroll buttons with glass treatment:
- Background: rgba(0, 0, 0, 0.35) with 24px backdrop blur
- Border: Subtle white border with glow
- Box shadow: Layered shadows with inset highlight
- Hover: Darker background with enhanced glow
- Opacity: 70% default, 100% on hover
- Matches overall glassmorphic design language

Buttons now have the same elegant glass styling as other UI elements.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:44:09 +00:00
Dorian
439bc792a3 Make hero banner 10% taller
Increased hero section height:
- Mobile: 51vh → 56vh (10% increase)
- Desktop: 55vh → 61vh (11% increase)

Provides more visual impact and breathing room for featured content.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:43:41 +00:00
Dorian
8260908024 Keep scroll navigation buttons visible when content can scroll
Changed scroll buttons behavior:
- Always visible at 70% opacity when there's more content to scroll
- Increase to 100% opacity on hover
- Removed group-hover requirement
- Only show when canScrollLeft/canScrollRight is true

Users now have a clear indicator when more content is available
without needing to hover over the content row.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:43:18 +00:00
Dorian
e854f67851 Add hero title gradient and spacing styles
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:41:58 +00:00
Dorian
d8580638ba Add gradient and character spacing to hero title
Applied same styling as content row titles:
- Gradient from #fafafa to #9ca3af
- letter-spacing: 0.05em (5% character spacing)
- Used background-clip: text for gradient effect
- Maintains uppercase and bold styling

Hero title now matches the visual language of section titles.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:41:34 +00:00
Dorian
47a82c5158 Make titles bolder and add 5% character spacing
Changed content row titles to:
- font-bold (700 weight) for more emphasis
- letter-spacing: 0.05em (5% character spacing)
- Maintains gradient effect from #fafafa to #9ca3af
- More prominent and readable

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:40:32 +00:00
Dorian
98031720bf Reduce title boldness and add gradient effect
Changed content row titles to:
- font-semibold (less bold than before)
- Added gradient: #fafafa (very light grey) to #9ca3af (light grey)
- Used background-clip: text for gradient effect
- More subtle and elegant appearance

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:39:20 +00:00
Dorian
e42555323e Make content row titles uppercase and bolder
Changed section titles (Featured Films, etc.) to:
- Uppercase with 'uppercase' class
- font-bold on mobile, font-extrabold on desktop
- More prominent and attention-grabbing

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:38:41 +00:00
Dorian
4800cac837 Move profile avatar styles to global CSS with original fill
Changes:
- Moved .profile-avatar styles from Browse.vue to src/style.css
- Restored original gradient fill: orange (#f97316) to pink (#ec4899)
- Kept gradient border treatment
- Added z-index to span for proper layering
- Now available globally for reuse

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:33:55 +00:00
Dorian
9f001572cc Add gradient border to profile avatar circle
Applied the same gradient border treatment as other UI elements:
- Inner gradient fill: Red to orange to blue
- Outer gradient border: White to red with mask composite
- 2px border width with rounded corners
- Applied to both desktop and mobile profile avatars

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:32:50 +00:00
Dorian
192abfc88c Rename Home to Films and remove duplicate Films button
Navigation now shows: Films, Series, Creators, My List

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:30:47 +00:00
Dorian
f40a3c57db Add mobile margins to header logo and profile
- Logo: ml-2 on mobile (8px left margin)
- Profile: mr-2 on mobile (8px right margin)
- Desktop: ml-0/mr-0 (no extra margins)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:29:32 +00:00
Dorian
39feb722f5 Fix PWA installation for Brave/Android - Complete rewrite
Critical fixes for PWA installation:
1.  Use proper Vite PWA registration with virtual:pwa-register
2.  Simplified manifest.json (removed verbose name, fixed orientation)
3.  Added 'any maskable' dual-purpose icon for better compatibility
4.  Removed crossorigin from manifest link (causes issues)
5.  Simplified start_url to just '/'
6.  Added msapplication-TileColor meta tag
7.  Set injectRegister: 'auto' in Vite config
8.  Use public/manifest.json directly instead of generating

This should now work on Brave Browser Android with proper 'Install App' prompt.
Test: Clear site data, visit site, should see install prompt within 30 seconds.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:26:31 +00:00
Dorian
c32a4f80e5 Make splash logo responsive - 200px mobile, 400px desktop
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:17:26 +00:00
Dorian
5ebb3e20f9 Add heavily staggered border drawing animation
Draw sequence (cascading):
- 0.0s: Top left block starts
- 0.2s: Top right block
- 0.4s: Center circle
- 0.6s: Diagonal 1
- 0.8s: Diagonal 2
- 1.0s: Diagonal 3
- 1.2s: Diagonal 4
- 1.4s: Bottom left block
- 1.6s: Bottom center block
- 1.8s: Bottom right block

Undraw mirrors this in perfect reverse!
Creates a beautiful cascading effect.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:15:26 +00:00
Dorian
33eb672b36 Slow down background fade out to 1.5s
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:13:00 +00:00
Dorian
8f1db67c61 Reverse undraw animation - mirror of draw sequence
Changes:
- Fills disappear in reverse order (last-in, first-out)
- Strokes undraw using reverse dasharray animation
- Diagonals undraw with reverse 0.3s stagger
- Circle undraws slower (2s) like it drew
- Background still fades out smoothly after undraw completes

Animation now perfectly mirrors itself!

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:12:36 +00:00
Dorian
8b5b7297d3 Add SplashIntro import to Browse.vue
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:11:28 +00:00
Dorian
896e5d3ced Add splash intro animation with logo
Animation Sequence (5 seconds total):
1. Borders draw (0-1.5s): Stroke dasharray animation
2. Fills appear (1.2-2.1s): Staggered opacity fade-in for each shape
3. Hold (2.1-3s): Logo fully visible
4. Undraw (3-4.5s): Scale down + fade out
5. Reveal (4.5-5s): Interface fades in

Features:
- Black background (#0a0a0a)
- SVG stroke-dasharray for border drawing effect
- Staggered fill animations for depth
- Center circle draws slower for emphasis
- Scale + fade undraw effect
- Fixed z-index: 9999 overlay
- Smooth transition when removing splash

Draft implementation ready for refinement!

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:11:08 +00:00
Dorian
d44878bae6 Make Play button fill more transparent for better glass effect
- Reduce opacity from 0.95 to 0.85 (85% transparent)
- Hover state: 0.95 for subtle feedback
- More glassmorphic appearance with background showing through
- Better matches design system glass aesthetic

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:08:25 +00:00
Dorian
db6d058a49 Fix light mode Play button gradient border visibility
- Change gradient from white/light-gray to darker gray tones
- Old: rgba(255,255,255,0.8) → rgba(200,200,200,0.3) (too subtle)
- New: rgba(100,100,100,0.4) → rgba(50,50,50,0.2) (visible)
- Creates subtle dark outline that's visible on white button
- Matches design system glassmorphism with proper gradient borders

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:08:00 +00:00
Dorian
d4b2d67a0c Show profile name on mobile header without dropdown
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:05:56 +00:00
Dorian
f170fd6625 Add profile dropdown and move nav to left with 40px gap
Header Layout Changes:
- Move navigation buttons next to logo on left side (40px gap)
- Remove centered navigation positioning
- Add profile dropdown after search on right side

Profile Dropdown Features:
- Shows user avatar, name 'Dorian', and chevron icon
- Glassmorphic dropdown menu with our button styles
- Menu items: Profile, Settings, Sign Out
- Icons for each menu item
- Smooth slide-down animation
- Click outside to close
- Desktop only (hidden on mobile)
- Uses same glass effect as nav buttons

Responsive:
- Mobile shows simple avatar without dropdown
- Search button hidden on mobile
- Nav stays in mobile bottom bar

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:05:22 +00:00
Dorian
0031456f4e Fix Android PWA installation - add proper web app instead of shortcut
Android PWA Requirements:
- Add mobile-web-app-capable meta tag for Android
- Add application-name meta tag
- Add prefer_related_applications: false to manifest
- Add explicit icon sizes (192x192, 512x512) for both any and maskable
- Add orientation: any for flexible display
- Add lang and dir to manifest for proper localization
- Add ?source=pwa to start_url for analytics
- Add crossorigin="use-credentials" to manifest link
- Add proper service worker registration in main.ts
- Add vite-plugin-pwa/client types to env.d.ts

This ensures Android recognizes it as a full PWA instead of creating a shortcut

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 00:03:00 +00:00