MARKETPLACE
PLUGINS
BEAUTIFUL VIDEO PLAYER - MOBILE
Beautiful Video Player - Mobile logo

Beautiful Video Player - Mobile

Published September 2026
   •    Updated this month

Plugin details

A clean, fully customizable video player for Bubble Native Mobile apps. Create a consistent video experience across iOS and Android without relying on the default system controls.
Customize the player to match your app, control playback with 17+ states and 13 actions, and add chapters directly to the timeline.

Simple to set up, easy to customize, and built to feel like a natural part of your app.

────────────────────────────────
TRY IT
────────────────────────────────

Demo: https://plugins-testing-46093.bubbleapps.io/version-test/api/1.1/mobile/preview?debug_mode=true&preview_view=video_player

Editor: https://bubble.io/page?id=plugins-testing-46093&test_plugin=1788667086544x108335326825545730_current&tab=Design&name=video_player&type=page&elements=bTJqw2

────────────────────────────────
CUSTOMIZATION
────────────────────────────────

  • Gradients, not a grey slab. The controls rest on a soft scrim that keeps them readable over a bright frame and a dark one, without a bar of chrome across your video.
  • The scrim is a proportion of the frame, not a fixed number of pixels. A 150-pixel gradient is a whisper on a tablet and half the picture on a short player — that mismatch is what makes most control layers look borrowed.
  • One row. Track, clock, volume, speed and fullscreen all share a single floating bar, so it covers as little of your video as a control bar possibly can.
  • A play button that is the point. Filled with your accent colour, haloed in it, with the icon colour worked out by contrast so a pale accent still reads. It scales with the player instead of being one fixed size.
  • Nothing on screen until it is wanted. One tap reveals the controls, three seconds of stillness takes them away, and they rise as they fade in instead of blinking.
  • Tabular figures. The clock never shifts the row as it counts up, because every digit takes the same width.
  • No black flash. Your cover image is held through the first frame instead of being dropped the moment playback starts.
  • It fits any width. Below 330 points the volume slider steps aside, below 250 the clock does too — the track and the buttons always survive.

────────────────────────────────
CHAPTERS
────────────────────────────────

Give the player a list of times and titles and the timeline draws itself in segments, one per chapter, each filling as it plays.

  • The chapter name appears over the video for a moment when a new one starts, then fades on its own.
  • Two ways in. Two list fields straight off your database thing, or a single text field with one line per chapter: 0:00 Introduction. Seconds, m:ss and h:mm:ss all work, and so do the separators people actually type.
  • Jump to any chapter from a workflow, by number or by name.
  • Two states tell you which chapter is playing and what it is called, so your page can highlight it in a list beside the video.

────────────────────────────────
BUILT FOR COURSES AND CONTENT APPS
────────────────────────────────

  • Watch milestones. One event fires at 25, 50, 75 and 100 per cent, each exactly once, no matter how much the viewer scrubs back and forth. Mark a lesson complete without running a workflow every second to find out.
  • Continue where they left off. Save Current time when they leave, feed it back as Start at when they return. Two fields, no plugin gymnastics.
  • Swap videos in place. The Load Video action changes the source — and the cover image — without leaving the page. Playlists and "next lesson" with no reload.
  • Time updates on your terms. You set how often the position is published, so a workflow bound to it does not run four times a second.

────────────────────────────────
THE CONTROLS
────────────────────────────────

  • A progress bar that behaves like one. Drag it: the handle grows under your thumb, a timecode bubble follows it, and the seek happens when you let go.
  • The buffered stretch sits behind the played part in a lighter tone, so a slow connection looks like a slow connection instead of a broken player.
  • Double tap to skip. The right half jumps forward, the left half goes back, by the number of seconds you choose, with a ripple that shows what happened.
  • A volume slider that is actually there. A hairline track beside the speaker, in your accent colour. Muting empties it but keeps the level, so unmuting returns to where it was.
  • Speed behind a gear. Tap it and a strip offers 0.5× to 2×, with the current one marked. A control nobody uses every session does not get a permanent slot.
  • Fullscreen we drew ourselves, so your design survives it — the native one hands the system controls back. Portrait, or rotated to landscape for wide video on a phone. The Android back button closes it.

────────────────────────────────
FORMATS AND PLAYBACK
────────────────────────────────

  • MP4 and HLS (.m3u8), played by the device's own hardware decoder.
  • Adaptive streams work as they should, and the buffered indicator follows them.
  • Contain, cover or fill, and five shapes: 16:9, 4:3, 1:1, 9:16, or a fixed height you set.
  • Autoplay, loop, start muted, start at a given second — all as plain properties.
  • Background audio and picture in picture as opt-in settings, for apps where the sound should carry on.

────────────────────────────────
FULL WORKFLOW CONTROL
────────────────────────────────

  • 15 states — is playing, is muted, is loading, is ended, is fullscreen, current time, duration, progress per cent, buffered time, volume, playback rate, milestone reached, current chapter index, current chapter title, error message.
  • 10 events — on ready, on play, on pause, on end, on seek, on time update, on milestone, on chapter change, on fullscreen change, on error.
  • 11 actions — Play, Pause, Toggle Play, Seek To, Skip, Set Volume, Set Muted, Set Speed, Load Video, Go To Chapter, Set Fullscreen. Enough to build a demo page, a playlist or a course player entirely from workflows.

────────────────────────────────

Questions or a feature you need? Get in touch — info@technocode.agency

$30

One time  •  Or  $3/mo

stars   •   0 ratings
0 installs  
This plugin does not collect or track your personal data.

Platform

Native mobile

Contributor details

Technocode logo
Technocode
Joined 2020   •   18 Plugins
View contributor profile

Instructions

1. Drop it on the page Drag Video Player onto a mobile page and set video_url to a direct link to an MP4 or HLS file — the file itself, not a YouTube or Vimeo page. Add a poster_url as well: it is what the viewer sees before pressing play, and it is held through the first frame so the video never flashes black.

2. Give it a shape
aspect_ratio works out the height from the width the page gives it: 16:9 for normal video, 9:16 for vertical, 1:1 for square. Pick Fixed height if you would rather set player_height yourself.

3. Make it yours
Set accent_color to your brand colour — it paints the play button, its halo, the progress bar, the handle, the volume and the chapter marks at once — and corner_radius to match your app. There is one design and it is already tuned, so that is the whole styling step.

4. Add chapters (optional, and the best part)
Either fill chapters_text with one line per chapter:

0:00 Introduction 1:45 Setting up 4:10 Common mistakes

or point chapter_times and chapter_titles at two lists from your database, in the same order. The timeline splits itself into segments and the chapter name appears over the video when each one starts.

5. Wire it to your workflows
The player's actions drive it from anywhere: Play, Pause, Toggle Play, Seek To, Skip, Set Volume, Set Muted, Set Speed, Load Video, Go To Chapter, Set Fullscreen. Its states report back: Current time, Duration, Progress percent, Current chapter title, Milestone reached and more.

Tips
  • Continue where they left off: save Current time on the On pause event, and feed it back as start_at next time they open the lesson.
  • Mark a lesson watched: use the On milestone event and read Milestone reached — it fires once each at 25, 50, 75 and 100 per cent, however much the viewer scrubs.
  • Autoplay is blocked with sound on phones. Turn on start_muted alongside autoplay, and let the viewer unmute.
  • Playlists: the Load Video action swaps the source and the poster without leaving the page. Use it on the On end event for "next lesson".
  • Too many workflow runs? Raise time_update_interval. It controls both the On time update event and how often Current time is published.
  • One player per page. The actions talk to the last one placed, so keep it to one.
  • If something does not respond, tick debug_overlay: it shows which action arrived, with what value, whether it found the player, and the real resolution of your video file.

Testing
The browser preview runs React Native for Web, where the native video engine does not exist — it falls back to a plain video element, which is fine for checking layout, gestures and chapters. Test playback itself in BubbleGo or a build.

📄 Full documentation: https://wide-finch-c12.notion.site/Video-Player-Documentation-3d361f4cca3a80a395a1f7330885621f

Types

This plugin can be found under the following types:
Element   •   Event   •   Action

Categories

This plugin can be found under the following categories:
Video   •   Productivity   •   Visual Elements

Resources

Support contact
Documentation
Tutorial

Rating and reviews

No reviews yet

This plugin has not received any reviews.
Bubble