Skip to content

ShaneIsrael/fireshare

Repository files navigation


Logo

Fireshare

Share your game clips, videos, or other media via unique links.

Docker Build Docker Pulls GitHub tag (latest SemVer) GitHub stars

Live Demo · Report a Bug · Buy us a Coffee!

Table of Contents
  1. About The Project
  2. Changelog
  3. Installation
  4. Local Development
  5. Contributing
  6. FAQ / Troubleshooting

About The Project

I create a lot of game clips with tools such as Nvidia's Shadowplay, many of these clips are short 15-30 second clips that I want to share with my friends but do not want to spend the time uploading them to YouTube, waiting for YouTube to process the video and then finally being able to send them a link.

I thought that there had to be a simple solution that allowed me the ability to self host my clips and share them with my friends through some generated link? Unfortunately nothing I found was quite what I was looking for. So with the help of a friend we quickly built Fireshare to do just that.

The goal of Fireshare is to provide a very simple and easy way for you to share any videos you have through a unique link. All you have to do is put your videos in a folder and Fireshare will take care of the rest.

login-screen

The Dashboard

Here you can see all of your videos and edit their details such as title, description and whether or not you want them to show up on the public feed.

card-view

Maybe card view isn't your style? Fireshare also supports a list style view as well.

list-view

Foldered Sorting

Fireshare will use the top most directory that your videos are in as an easy and simple way for you to organize your videos into categories of your choosing.

folders

Uploading

Allow your community or the public the ability to upload videos. Of course, this feature can be disabled or limited to only administrator access

uploading

Edit Video Details

Access a basic modal for editing the title and description of videos by clicking on the "pencil" icon.

edit-details

Video Preview Modal

Videos opened when on the public feed or admin dashboard show up in a modal. This modal gives you direct link and timestamped link sharing buttons as well as the ability to "shuffle" randomly to another video. As an admin, you can also edit the details of the video from this modal.

preview-modal

The Watch Page

This is what people will see when given a Fireshare link.

watch-page

Mobile Support

Prefer to browse on your mobile device? No problem. Fireshare has you covered.

Open Graph Support

Direct links copied from the link copy buttons in Fireshare will allow websites and messaging apps to read the open graph data and show title, description and video thumbnails in your posts.

Logo

LDAP Authentication Support

Connect Fireshare to a central user directory and keep user access organised.

Built With

Changelog

v1.2.13

  Added a catch for finding corrupt or malformed files when initiating a scan

Installation

Fireshare is meant to run within a Docker environment. While we reccommend using something like Docker Compose it is not required and can run with a simple docker run command.

Fireshare needs 3 volume mounts.

  1. /data - The directory used by fireshare to hold its internal database
  2. /processed - The directory used to hold metadata created by fireshare in relation to your videos (posters, metadata info)
  3. /videos - The directory fireshare will watch and scan for any videos.

If you have all of your game clips stored in a folder my_game_clips then in your docker compose file (or docker run command) you will need to volume mount that folder to the /videos folder that fireshare watches.

Docker Compose

If you have docker compose installed, at the root of this project you can simply run this command.

make sure you edit the docker-compose.yml file with your volume locations and admin password.

docker-compose up -d

Docker

docker run --name fireshare -v $(pwd)/fireshare:/data:rw -v $(pwd)/fireshare_processed:/processed:rw -v /path/to/my_game_clips:/videos:rw -p 8080:80 -e ADMIN_PASSWORD=your-admin-password -d shaneisrael/fireshare:latest

Once running, navigate to localhost:8080 in your browser.

Configurable Settings

See the Fireshare Configuration Wiki: Link
For LDAP configuration, see LDAP.md

Video Transcoding (Optional)

Fireshare supports automatic transcoding of videos to create 720p and 1080p quality variants using the AV1 codec for better compression. This feature is disabled by default and must be explicitly enabled.

Benefits:

  • Smaller file sizes with AV1 compression (up to 50% smaller than H.264)
  • Better streaming performance for users with limited bandwidth
  • Quality selection in the video player

Requirements:

  • FFmpeg with NVENC, libaom-av1, VP9, and codec support (included in the Docker image)
  • CPU transcoding works out of the box

GPU Transcoding: The Docker image includes FFmpeg compiled with NVENC support for GPU-accelerated transcoding. To use GPU transcoding:

Benefits of GPU transcoding:

  • 5-10x faster than CPU encoding
  • Lower power consumption
  • Frees up CPU for other tasks

Environment Variables:

# Enable automatic transcoding during video scans (default: false)
ENABLE_TRANSCODING=true

# Enable GPU acceleration for transcoding using NVENC (default: false)
# Requires nvidia-docker runtime
TRANSCODE_GPU=true

Docker Compose GPU Setup:

services:
  fireshare:
    # ... other configuration ...
    environment:
      - ENABLE_TRANSCODING=true
      - TRANSCODE_GPU=true
      - NVIDIA_DRIVER_CAPABILITIES=all
    runtime: nvidia
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

Manual Transcoding:

If you have existing videos that were scanned before enabling transcoding, you can manually transcode them:

# Transcode all videos in your library
docker exec -it fireshare fireshare transcode-videos

# Transcode a specific video by its ID
docker exec -it fireshare fireshare transcode-videos --video VIDEO_ID

# Regenerate transcoded versions (overwrites existing)
docker exec -it fireshare fireshare transcode-videos --regenerate

Important Notes for Existing Videos:

  • The transcode-videos command only processes videos when ENABLE_TRANSCODING=true is set
  • Transcoding happens in the background and can take significant time depending on:
    • Number and size of videos
    • CPU/GPU performance
    • Whether GPU acceleration is enabled
  • Progress is logged in the container logs: docker logs -f fireshare
  • Only videos larger than the target resolution will be transcoded (e.g., 4K videos will get 1080p and 720p variants)
  • Original files are never modified or deleted
  • You can check if a video has been transcoded by looking at the quality selector in the player
  • To find a video's ID, check the URL when viewing it (e.g., /w/VIDEO_ID)

Workflow for Upgrading Existing Installations:

  1. Pull the latest image (if using Docker):

    docker pull shaneisrael/fireshare:latest

    Or if using docker-compose:

    docker-compose pull
  2. Stop and remove the old container:

    docker stop fireshare && docker rm fireshare

    Or with docker-compose:

    docker-compose down
  3. Enable transcoding by adding environment variables to your docker-compose.yml or docker run command:

    ENABLE_TRANSCODING=true
    TRANSCODE_GPU=true  # Optional, for GPU acceleration
  4. Start the container - Database migrations will run automatically:

    docker-compose up -d

    Or with docker run:

    docker run --name fireshare -v $(pwd)/fireshare:/data:rw -v $(pwd)/fireshare_processed:/processed:rw -v /path/to/videos:/videos:rw -p 8080:80 -e ADMIN_PASSWORD=your-password -e ENABLE_TRANSCODING=true -d shaneisrael/fireshare:latest

    Note: The database migration to add transcoding columns runs automatically on container startup via flask db upgrade in the entrypoint.

  5. Verify the migration ran successfully:

    docker logs fireshare | grep "Running upgrade"

    You should see: INFO [alembic.runtime.migration] Running upgrade a4503f708aee -> b7e8541487dc, add transcoding support

  6. Transcode existing videos using one of these approaches:

    Option A: Transcode everything at once (recommended for small libraries)

    docker exec -it fireshare fireshare transcode-videos

    Option B: Transcode videos gradually (recommended for large libraries)

    # Get a list of video IDs from your admin dashboard
    # Then transcode them one at a time or in batches
    docker exec -it fireshare fireshare transcode-videos --video VIDEO_ID_1
    docker exec -it fireshare fireshare transcode-videos --video VIDEO_ID_2
    # ... etc
  7. Future videos will be automatically transcoded during the scan process (every 5 minutes by default)

Monitoring Progress:

# Watch transcoding logs in real-time
docker logs -f fireshare

# Check if transcoding is running
docker exec -it fireshare ps aux | grep ffmpeg

GPU Setup (Optional but Recommended):

To use GPU acceleration, you need to:

  1. Install NVIDIA drivers on your host system

  2. Install NVIDIA Container Toolkit:

    # Ubuntu/Debian
    distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
    curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
    curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
      sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
      sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
    sudo apt-get update
    sudo apt-get install -y nvidia-container-toolkit
    sudo systemctl restart docker
  3. Verify GPU is available on host:

    docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi

    Note: The Fireshare container doesn't include nvidia-smi. To verify GPU access in Fireshare, use:

    docker exec -it fireshare ffmpeg -encoders 2>/dev/null | grep nvenc
  4. Update your docker-compose.yml with GPU configuration (see example above)

Unraid GPU Setup:

For Unraid users who want to pass their NVIDIA GPU to the Fireshare container:

  1. Install NVIDIA Driver Plugin:

    • In Unraid, go to Apps/Community Applications
    • Search for "NVIDIA Driver" and install the plugin
    • The plugin will automatically install NVIDIA drivers on boot
  2. Configure Fireshare Container in Unraid:

    • Edit the Fireshare container in Unraid's Docker tab
    • Add the following environment variables:
      ENABLE_TRANSCODING=true
      TRANSCODE_GPU=true
      NVIDIA_DRIVER_CAPABILITIES=all
      
  3. Enable GPU Passthrough:

    • In the container settings, scroll to "Extra Parameters"
    • Add: --gpus=all
    • Important: Use --gpus=all instead of --runtime=nvidia for Unraid
  4. Verify GPU Access:

    The Fireshare container doesn't include nvidia-smi, but you can verify GPU access in these ways:

    Method 1: Check FFmpeg GPU encoders (Recommended)

    docker exec -it fireshare ffmpeg -encoders 2>/dev/null | grep nvenc

    You should see output like:

    V..... h264_nvenc           NVIDIA NVENC H.264 encoder
    V..... hevc_nvenc           NVIDIA NVENC hevc encoder
    

    Method 2: Monitor transcoding logs

    • Enable transcoding with TRANSCODE_GPU=true
    • Check the logs while a video is transcoding:
      docker logs -f fireshare
    • Look for "Transcoding video to 720p using GPU H.264 (NVENC)" messages

    Method 3: Verify GPU usage (from Unraid host)

    • While transcoding is running, check GPU usage:
      nvidia-smi
    • You should see FFmpeg processes using the GPU with video encoder/decoder utilization
  5. Advanced Configuration (Optional):

    • If you want to limit to specific GPUs, use:
      --gpus='"device=0"'
      
    • For multiple specific GPUs:
      --gpus='"device=0,1"'
      

Notes:

  • Transcoding only creates quality variants for videos larger than the target resolution
  • Original files are always preserved
  • The video player will automatically show a quality selector when transcoded versions are available
  • FFmpeg is compiled with NVENC support for GPU-accelerated transcoding
  • GPU transcoding is 5-10x faster than CPU transcoding

Transcoding Fallback Chain:

GPU Mode (TRANSCODE_GPU=true):

  1. AV1 with GPU (av1_nvenc) - Best compression, RTX 40 series or newer (Ada Lovelace)
  2. H.264 with GPU (h264_nvenc) - Fast and widely supported, GTX 1050+ (Pascal or newer)
  3. AV1 with CPU (libaom-av1) - Excellent compression if GPU encoding fails
  4. H.264 with CPU (libx264) - Final fallback, universally compatible

CPU Mode (TRANSCODE_GPU=false or GPU unavailable):

  1. AV1 with CPU (libaom-av1) - Best compression, slower
  2. H.264 with CPU (libx264) - Fallback if AV1 fails

The system automatically tries AV1 NVENC first on all GPUs, then falls back to H.264 NVENC for older GPUs that don't support AV1 hardware encoding.

Local Development

If you would like to run Fireshare via the source code in order to contribute you will need to have npm, Node.js and Python installed. I reccommend installing Node.js with NVM so that you can easily switch between Node versions.

Setup

  1. Have Python3, NodeJS and NPM installed.
  2. Clone the repo
    $ git clone https://github.com/ShaneIsrael/fireshare.git
  3. At the project root
    $ ./run_local.sh
  4. In a new terminal, navigate to app/client and run the following commands.
    $ npm i && npm start
  5. In your browser, navigate to localhost:3000 and login with admin/admin

Contributing

If this project is at all interesting to you please feel free to contribute or create suggestions if you have them. Please note that creating a pull request does not guarantee it will be accepted into the project. Outside of obvious bug fixes it may be best to consult with us before starting work on any additions you'd like to make.

For questions or feature requests please create an issue with an appropriate label here

  1. Fork the Project
  2. Add upstream (git remote add upstream https://github.com/ShaneIsrael/fireshare.git)
  3. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  4. Commit your Changes (git commit -m 'Add some AmazingFeature')
  5. Rebase with upstream (git rebase upstream/main)
  6. Fix any merge conflicts you may have
  7. Push to the Branch (git push origin feature/AmazingFeature)
  8. Open a Pull Request against the develop branch

UPDATE YOUR BRANCH We will not fix merge conflicts for you, if you make a pull request and it states there are merge conflicts please see steps 4 and 5 from the above.

Updating the Fireshare Database

If you need to update the database or add a new table / column first make your changes to the app/server/fireshare/models.py file then at the root of the project run flask db migrate -m "name of migration" a new migration will be made with your changes. Go to that file and double check that everything is correct. You may need to manually edit this migration.

Frequently Asked Questions

Playback Issues

If you are experiencing playback issues there could be a number of reasons as to why. These are the most common causes.

  1. File Size

    Fireshare serves your videos as they are. If your videos are very large anybody trying to watch will need to have a fast enough download speed to play them back. This also means you will need to have an upload speed fast enough to serve your large files. Consider using a tool like Handbrake to compress your videos down to a smaller size.

  2. Upload Speed

    Your upload speed matters. If you have a slow upload speed, depending the file sizes that you are trying to serve it may not be possible for people to stream your videos. Consider compressing your videos with Handbrake.

  3. Browsers

    In my testing I have noticed that Firefox struggles to playback very large files, however Chome and Edge do not seem to have the same problem.

  4. Unsupported File Type

    At the moment, Fireshare only supports file types and encodings that browsers can play natively, generally MP4, MOV and WEBM files. For example you could have h265 encoded videos work just fine and play in chrome, but not play at all in Firefox which wouldn't be a great experience for your viewers. It's reccommended to use MP4 encoded in h264 where possible since it is supported by virtually every browser at this time. If your video file does not play or causes errors you may need to transcode it to an h264 encoded MP4 with a tool like Handbrake.

  5. Upload Issues

    Uploading issues are often caused by putting fireshare behind some sort of reverse proxy like nginx. By default nginx has limits on how large your uploads can be. Often the issue is that your trying to upload a file larger than nginx allows. You'll need to update your reverse proxies settings to increase these limits and timeouts. If you are using nginx, you most likely just need to add these two lines.

    client_max_body_size 0;
    proxy_read_timeout 999999s;
    

    These settings will only work on Nginx. With client_max_body_size set to 0 we are allowing any size upload. We are also increasing the timeout limit so that the connection isn't timedout. If you are not using nginx you'll need to do some research.

About

Self host your media and share with unique links

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 16