Self host your media and share with unique links
See the code
Share your game clips, videos, or other media via unique links.
Live Demo
·
Report a Bug
If Fireshare is useful to you, GitHub Sponsors is the best way to support development. It keeps the demo server running and helps me carve out time on weekends for new features and updates.
| Container | Extension | Notes |
|---|---|---|
| MP4 | .mp4 | Most compatible, recommended |
| MP4 (Apple) | .m4v | Identical to MP4, common on Apple devices |
| QuickTime | .mov | Common on macOS / iOS |
| WebM | .webm | Open format, browser-native |
Supported encodings: H.264 (AVC), H.265 (HEVC), AV1, VP9.
Files must be in a supported format because the original file is always served directly to the viewer. Transcoding (when enabled) only generates additional lower-quality versions for adaptive streaming; the original is never modified.





Fireshare is designed to run in Docker.
Required volume mounts:
| Mount | Purpose |
|---|---|
/data | Internal database |
/processed | Generated metadata (posters, metadata files) |
/videos | Source video directory to scan |
/images | Source image directory to scan |
services:
fireshare:
container_name: fireshare
image: shaneisrael/fireshare:latest-lite
ports:
- "8080:80"
volumes:
- /path/to/data:/data
- /path/to/processed:/processed
- /path/to/videos:/videos
- /path/to/images:/images
environment:
- ADMIN_USERNAME=your-admin-username
- ADMIN_PASSWORD=your-admin-password
# A key for signing login cookies is generated on first start and kept in
# /data, so there is nothing to set here. See docs/Security.md
# The domain your instance is hosted at. e.x: demo.fireshare.net
# this is required for opengraph to work correctly for shared links.
- DOMAIN=
# PUID/PGID: the user/group ID the container runs as. Files written to your
# volumes (data, processed, videos, images) will be owned by this user. Set these to
# match the owner of your host directories to avoid permission errors.
# Run `id` on your host to find your UID and GID.
- PUID=1000
- PGID=1000
# The port the web server (nginx) listens on inside the container (default: 80).
# Leave this alone and change the host-side "ports" mapping above unless you run
# with network_mode: host, where "ports" is ignored and this becomes the host port.
# - FIRESHARE_PORT=80
Update the volume paths and credentials, then run:
docker-compose up -d
Open http://localhost:8080.
docker run --name fireshare \
-v $(pwd)/fireshare/data:/data:rw \
-v $(pwd)/fireshare/processed:/processed:rw \
-v /path/to/my/videos:/videos:rw \
-v /path/to/my/images:/images:rw \
-p 8080:80 \
-e ADMIN_USERNAME=your-admin-username \
-e ADMIN_PASSWORD=your-admin-password \
-e PUID=user-id-with-read-write-permissions \
-e PGID=group-id-with-read-write-permissions \
-d shaneisrael/fireshare:latest
Open http://localhost:8080.
The fireshare:latest-lite image is a smaller alternative that uses the system-provided FFmpeg instead of the CUDA-enabled build included in the standard image. It is a good fit for most users who do not need GPU transcoding.
| Standard | Lite | |
|---|---|---|
| GPU transcoding (NVIDIA NVENC) | Supported | Not available |
| CPU transcoding | Supported | Supported |
| Image size | Larger (CUDA libraries) | Smaller |
Use the lite image by appending -lite to your tag:
Note: Setting
TRANSCODE_GPU=truehas no effect in the lite image. GPU transcoding is permanently disabled regardless of environment variables.
Fireshare can restrict logins to a whitelist of IP addresses/CIDR ranges and supports TOTP two-factor authentication with any authenticator app. See Security.md for setup instructions.
When enabled, Fireshare will create lower quality versions of your original supported file type videos. Your viewers can then choose to play your videos at lower qualities that their internet can handle. Fireshare will also attempt to automatically downgrade the quality of a viewer who is constantly buffering.
Transcoding is off by default. To enable it, set the following environment variables:
ENABLE_TRANSCODING=true
TRANSCODE_GPU=true # optional, NVIDIA only
CPU transcoding works out of the box. For NVIDIA GPU transcoding you need three things: an NVIDIA GPU with NVENC support, the NVIDIA driver and NVIDIA Container Toolkit installed on the host, and the container started with GPU access (--gpus all or runtime: nvidia).
The image ships with NVIDIA_DRIVER_CAPABILITIES=compute,utility,video, which is what makes the NVIDIA Container Toolkit mount the NVENC libraries into the container. You do not need to set it yourself. If you do override it, it must include video (or be all), otherwise nvidia-smi will work inside the container but ffmpeg will have no NVENC encoder and Fireshare will fall back to CPU transcoding.
GPU requirements: NVIDIA GPU with NVENC support.
docker-compose.yml, uncomment either runtime: nvidia or the deploy.resources.reservations.devices block (or pass --gpus all to docker run).ENABLE_TRANSCODING=true
TRANSCODE_GPU=true
ENABLE_TRANSCODING=true
TRANSCODE_GPU=true
NVIDIA_DRIVER_CAPABILITIES=all
NVIDIA_DRIVER_CAPABILITIES is optional on current images, which already default to compute,utility,video. It is required on older images, and harmless to keep.--gpus=all to "Extra Parameters".Fireshare automatically selects the best available encoder.
GPU mode (TRANSCODE_GPU=true):
| Encoder | Requirement |
|---|---|
| AV1 (av1_nvenc) | RTX 40 series or newer |
| H.264 (h264_nvenc) | GTX 1050 or newer |
| CPU fallback | Used if GPU encoding fails |
CPU mode (TRANSCODE_GPU=false):
| Encoder | Notes |
|---|---|
| H.264 | Most compatible, faster encoding |
| AV1 | Best compression, slower |
HDR captures (10-bit BT.2020 with the PQ or HLG transfer, as NVIDIA and console recorders produce) play back flat and washed out in most browsers, and plain transcodes inherit the problem. Fireshare flags these videos and can make a tone-mapped SDR copy at the source resolution, which then plays as the Source quality and is what the lower qualities are made from. The original file is never modified, and the copy can be removed again from the video's editor.
Open an HDR video, choose Edit, and use the Dynamic Range row: pick an operator and apply it, or Compare the operators side by side on a few random frames of the video before choosing. Under Settings → Transcoding you can set the default operator and turn on automatic conversion of every HDR video (transcoding.tonemap_default and transcoding.auto_tonemap in config.json).
| Operator | Needs | Notes |
|---|---|---|
| bt.2390 | ffmpeg with libplacebo + a Vulkan device | The broadcast standard. Even-handed and faithful. On the GPU with the NVIDIA runtime, otherwise through Mesa's software Vulkan, which is slow |
| spline | ffmpeg with libplacebo + a Vulkan device | libplacebo's own curve; keeps contrast and punch |
| bt.2446a | ffmpeg with libplacebo + a Vulkan device | The other broadcast standard; brighter and more vivid |
| hable | ffmpeg with libzimg (zscale), or libplacebo + GPU | Default on CPU, darker and more contrasty |
| mobius | ffmpeg with libzimg (zscale), or libplacebo + GPU | Lighter than hable |
| reinhard | ffmpeg with libzimg (zscale), or libplacebo + GPU | Lightest |
Auto picks bt.2390 when libplacebo can run on a GPU and hable otherwise. When a GPU is available every operator runs on it through libplacebo; without one, hable, mobius and reinhard run on the CPU. Each operator shows a GPU or CPU badge where it is chosen. Operators the server's ffmpeg cannot run are greyed out. Both images ship every operator; for bt.2390 to use the GPU the container needs graphics in NVIDIA_DRIVER_CAPABILITIES, which the full image sets by default.
See EnvironmentVariables.md for the full list of available environment variables.
Requirements: Python 3, Node.js, and npm.
git clone https://github.com/fireshare-app/fireshare.git
./run_local.sh
cd app/client
npm install
npm start
http://localhost:3000 and sign in with admin / admin.Contributions are welcome. For larger changes, open an issue first to align on scope.
developdevelopdevelopFor issues and feature requests, visit the issue tracker.
Please DO NOT open a pull request for a feature or addition that was not previously discussed with me. Pull requests that do this will be automatically closed.
If you update models, create a migration and review it before opening a pull request.
See TROUBLESHOOTING.md for a full guide covering installation issues, playback problems, permission errors, transcoding, and more.
If you like the project, consider giving it a star. It helps increase visibility and supports continued development.
174 followers · starred Sep 2026
177 followers · starred Oct 2023
225 followers · starred Oct 2026
24 followers · starred Sep 2025
Self host your media and share with unique links
See the code
Share your game clips, videos, or other media via unique links.
Live Demo
·
Report a Bug
If Fireshare is useful to you, GitHub Sponsors is the best way to support development. It keeps the demo server running and helps me carve out time on weekends for new features and updates.
| Container | Extension | Notes |
|---|---|---|
| MP4 | .mp4 | Most compatible, recommended |
| MP4 (Apple) | .m4v | Identical to MP4, common on Apple devices |
| QuickTime | .mov | Common on macOS / iOS |
| WebM | .webm | Open format, browser-native |
Supported encodings: H.264 (AVC), H.265 (HEVC), AV1, VP9.
Files must be in a supported format because the original file is always served directly to the viewer. Transcoding (when enabled) only generates additional lower-quality versions for adaptive streaming; the original is never modified.





Fireshare is designed to run in Docker.
Required volume mounts:
| Mount | Purpose |
|---|---|
/data | Internal database |
/processed | Generated metadata (posters, metadata files) |
/videos | Source video directory to scan |
/images | Source image directory to scan |
services:
fireshare:
container_name: fireshare
image: shaneisrael/fireshare:latest-lite
ports:
- "8080:80"
volumes:
- /path/to/data:/data
- /path/to/processed:/processed
- /path/to/videos:/videos
- /path/to/images:/images
environment:
- ADMIN_USERNAME=your-admin-username
- ADMIN_PASSWORD=your-admin-password
# A key for signing login cookies is generated on first start and kept in
# /data, so there is nothing to set here. See docs/Security.md
# The domain your instance is hosted at. e.x: demo.fireshare.net
# this is required for opengraph to work correctly for shared links.
- DOMAIN=
# PUID/PGID: the user/group ID the container runs as. Files written to your
# volumes (data, processed, videos, images) will be owned by this user. Set these to
# match the owner of your host directories to avoid permission errors.
# Run `id` on your host to find your UID and GID.
- PUID=1000
- PGID=1000
# The port the web server (nginx) listens on inside the container (default: 80).
# Leave this alone and change the host-side "ports" mapping above unless you run
# with network_mode: host, where "ports" is ignored and this becomes the host port.
# - FIRESHARE_PORT=80
Update the volume paths and credentials, then run:
docker-compose up -d
Open http://localhost:8080.
docker run --name fireshare \
-v $(pwd)/fireshare/data:/data:rw \
-v $(pwd)/fireshare/processed:/processed:rw \
-v /path/to/my/videos:/videos:rw \
-v /path/to/my/images:/images:rw \
-p 8080:80 \
-e ADMIN_USERNAME=your-admin-username \
-e ADMIN_PASSWORD=your-admin-password \
-e PUID=user-id-with-read-write-permissions \
-e PGID=group-id-with-read-write-permissions \
-d shaneisrael/fireshare:latest
Open http://localhost:8080.
The fireshare:latest-lite image is a smaller alternative that uses the system-provided FFmpeg instead of the CUDA-enabled build included in the standard image. It is a good fit for most users who do not need GPU transcoding.
| Standard | Lite | |
|---|---|---|
| GPU transcoding (NVIDIA NVENC) | Supported | Not available |
| CPU transcoding | Supported | Supported |
| Image size | Larger (CUDA libraries) | Smaller |
Use the lite image by appending -lite to your tag:
Note: Setting
TRANSCODE_GPU=truehas no effect in the lite image. GPU transcoding is permanently disabled regardless of environment variables.
Fireshare can restrict logins to a whitelist of IP addresses/CIDR ranges and supports TOTP two-factor authentication with any authenticator app. See Security.md for setup instructions.
When enabled, Fireshare will create lower quality versions of your original supported file type videos. Your viewers can then choose to play your videos at lower qualities that their internet can handle. Fireshare will also attempt to automatically downgrade the quality of a viewer who is constantly buffering.
Transcoding is off by default. To enable it, set the following environment variables:
ENABLE_TRANSCODING=true
TRANSCODE_GPU=true # optional, NVIDIA only
CPU transcoding works out of the box. For NVIDIA GPU transcoding you need three things: an NVIDIA GPU with NVENC support, the NVIDIA driver and NVIDIA Container Toolkit installed on the host, and the container started with GPU access (--gpus all or runtime: nvidia).
The image ships with NVIDIA_DRIVER_CAPABILITIES=compute,utility,video, which is what makes the NVIDIA Container Toolkit mount the NVENC libraries into the container. You do not need to set it yourself. If you do override it, it must include video (or be all), otherwise nvidia-smi will work inside the container but ffmpeg will have no NVENC encoder and Fireshare will fall back to CPU transcoding.
GPU requirements: NVIDIA GPU with NVENC support.
docker-compose.yml, uncomment either runtime: nvidia or the deploy.resources.reservations.devices block (or pass --gpus all to docker run).ENABLE_TRANSCODING=true
TRANSCODE_GPU=true
ENABLE_TRANSCODING=true
TRANSCODE_GPU=true
NVIDIA_DRIVER_CAPABILITIES=all
NVIDIA_DRIVER_CAPABILITIES is optional on current images, which already default to compute,utility,video. It is required on older images, and harmless to keep.--gpus=all to "Extra Parameters".Fireshare automatically selects the best available encoder.
GPU mode (TRANSCODE_GPU=true):
| Encoder | Requirement |
|---|---|
| AV1 (av1_nvenc) | RTX 40 series or newer |
| H.264 (h264_nvenc) | GTX 1050 or newer |
| CPU fallback | Used if GPU encoding fails |
CPU mode (TRANSCODE_GPU=false):
| Encoder | Notes |
|---|---|
| H.264 | Most compatible, faster encoding |
| AV1 | Best compression, slower |
HDR captures (10-bit BT.2020 with the PQ or HLG transfer, as NVIDIA and console recorders produce) play back flat and washed out in most browsers, and plain transcodes inherit the problem. Fireshare flags these videos and can make a tone-mapped SDR copy at the source resolution, which then plays as the Source quality and is what the lower qualities are made from. The original file is never modified, and the copy can be removed again from the video's editor.
Open an HDR video, choose Edit, and use the Dynamic Range row: pick an operator and apply it, or Compare the operators side by side on a few random frames of the video before choosing. Under Settings → Transcoding you can set the default operator and turn on automatic conversion of every HDR video (transcoding.tonemap_default and transcoding.auto_tonemap in config.json).
| Operator | Needs | Notes |
|---|---|---|
| bt.2390 | ffmpeg with libplacebo + a Vulkan device | The broadcast standard. Even-handed and faithful. On the GPU with the NVIDIA runtime, otherwise through Mesa's software Vulkan, which is slow |
| spline | ffmpeg with libplacebo + a Vulkan device | libplacebo's own curve; keeps contrast and punch |
| bt.2446a | ffmpeg with libplacebo + a Vulkan device | The other broadcast standard; brighter and more vivid |
| hable | ffmpeg with libzimg (zscale), or libplacebo + GPU | Default on CPU, darker and more contrasty |
| mobius | ffmpeg with libzimg (zscale), or libplacebo + GPU | Lighter than hable |
| reinhard | ffmpeg with libzimg (zscale), or libplacebo + GPU | Lightest |
Auto picks bt.2390 when libplacebo can run on a GPU and hable otherwise. When a GPU is available every operator runs on it through libplacebo; without one, hable, mobius and reinhard run on the CPU. Each operator shows a GPU or CPU badge where it is chosen. Operators the server's ffmpeg cannot run are greyed out. Both images ship every operator; for bt.2390 to use the GPU the container needs graphics in NVIDIA_DRIVER_CAPABILITIES, which the full image sets by default.
See EnvironmentVariables.md for the full list of available environment variables.
Requirements: Python 3, Node.js, and npm.
git clone https://github.com/fireshare-app/fireshare.git
./run_local.sh
cd app/client
npm install
npm start
http://localhost:3000 and sign in with admin / admin.Contributions are welcome. For larger changes, open an issue first to align on scope.
developdevelopdevelopFor issues and feature requests, visit the issue tracker.
Please DO NOT open a pull request for a feature or addition that was not previously discussed with me. Pull requests that do this will be automatically closed.
If you update models, create a migration and review it before opening a pull request.
See TROUBLESHOOTING.md for a full guide covering installation issues, playback problems, permission errors, transcoding, and more.
If you like the project, consider giving it a star. It helps increase visibility and supports continued development.
174 followers · starred Sep 2026
177 followers · starred Oct 2023
225 followers · starred Oct 2026
24 followers · starred Sep 2025