# Displaying videos

> [!PROTIP] Pro tip: Start with our how-to guides first
> If you're new to hosting videos on DatoCMS, we recommend first starting with our tutorials:
> 
> -   How to upload videos: [Videos and Video Optimizations](https://www.datocms.com/user-guides/media-management/videos-and-video-optimizations.md)
>     
> -   Why you should use HLS Streaming via Mux: [How to stream videos efficiently: Raw MP4 Downloads vs HLS Streaming](https://www.datocms.com/docs/streaming-videos/how-to-stream-videos-efficiently.md)
>     
> 
> Then, this page provides framework-specific playback advice using our helper components. Read on when you're ready!

One of the advantages of using DatoCMS instead of other content management systems is its `video` query, which will return **pre-computed video attributes that will help you display videos in your frontend without any additional manipulation**.

To make it easy to offer optimized, progressive videos on your projects, we offer a package called [`react-datocms`](https://github.com/datocms/react-datocms) that exposes a `<VideoPlayer />` component and pairs perfectly with the video query.

To take advantage of it, install the [`react-datocms`](https://github.com/datocms/react-datocms) package:

Terminal window

```bash
npm install react-datocms
```

Then, inside your page, feed content coming from a `video` query directly into the `<VideoPlayer />` component:

```jsx
import { load } from "~/lib/datocms";
import { VideoPlayer } from "react-datocms";
import { useLoaderData } from "remix";

const HOMEPAGE_QUERY = `query HomePage($limit: IntType) {
  posts: allBlogPosts(first: $limit) {
    id
    title
    coverVideo {
      video {
        muxPlaybackId
        title
        width
        height
        blurUpThumb
      }
    }
  }
}`;

export async function loader() {
  return load(HOMEPAGE_QUERY, {
    variables: { limit: 10 }
  });
}

export default function Home() {
  const { posts } = useLoaderData();
  return (
    <div>
      {posts.map(blogPost => (
        <article key={blogPost.id}>
          <VideoPlayer data={blogPost.coverVideo.video} />
          <h6>{blogPost.title}</h6>
        </article>
      ))}
    </div>
  );
}
```

## Related content in "Remix"

- [Remix + DatoCMS Overview](https://www.datocms.com/docs/remix/get-started.md)
- [Managing images](https://www.datocms.com/docs/remix/remix-images.md)
- [Displaying videos](https://www.datocms.com/docs/remix/displaying-videos.md)
- [Structured Text fields](https://www.datocms.com/docs/remix/remix-structured-text-fields.md)
- [Adding SEO to pages](https://www.datocms.com/docs/remix/add-seo-to-remix.md)
- [Setting up a preview mode](https://www.datocms.com/docs/remix/setting-up-a-preview-mode-with-remix.md)
- [Real-time updates](https://www.datocms.com/docs/remix/real-time-updates.md)
- [DatoCMS Cache Tags and Remix](https://www.datocms.com/docs/remix/using-cache-tags.md)
- [Remix Blog    
Words are nice... but code speaks louder. Dive into a fully commented project template,
            showcasing these techniques (and more) in action.](https://www.datocms.com/marketplace/starters/remix-blog-example-template.md)