{"id":23874245,"url":"https://github.com/kleinesfilmroellchen/hyperflut","last_synced_at":"2025-07-28T09:09:48.547Z","repository":{"id":242257523,"uuid":"809076558","full_name":"kleinesfilmroellchen/hyperflut","owner":"kleinesfilmroellchen","description":"Feature-rich high-performance Pixelflut client for image and video streaming","archived":false,"fork":false,"pushed_at":"2025-06-23T14:56:11.000Z","size":471,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-27T17:04:13.352Z","etag":null,"topics":["38c3","gpn21","pixelflut","pixelflut-client"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kleinesfilmroellchen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":["kleinesfilmroellchen"]}},"created_at":"2024-06-01T16:08:56.000Z","updated_at":"2025-06-23T14:56:14.000Z","dependencies_parsed_at":null,"dependency_job_id":"e8df0507-07ed-4db7-85a2-05543c862e9f","html_url":"https://github.com/kleinesfilmroellchen/hyperflut","commit_stats":null,"previous_names":["kleinesfilmroellchen/pixelpwnr","kleinesfilmroellchen/hyperflut"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/kleinesfilmroellchen/hyperflut","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kleinesfilmroellchen%2Fhyperflut","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kleinesfilmroellchen%2Fhyperflut/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kleinesfilmroellchen%2Fhyperflut/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kleinesfilmroellchen%2Fhyperflut/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kleinesfilmroellchen","download_url":"https://codeload.github.com/kleinesfilmroellchen/hyperflut/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kleinesfilmroellchen%2Fhyperflut/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267490539,"owners_count":24095979,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-28T02:00:09.689Z","response_time":68,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["38c3","gpn21","pixelflut","pixelflut-client"],"created_at":"2025-01-03T17:54:39.429Z","updated_at":"2025-07-28T09:09:48.534Z","avatar_url":"https://github.com/kleinesfilmroellchen.png","language":"Rust","funding_links":["https://github.com/sponsors/kleinesfilmroellchen"],"categories":[],"sub_categories":[],"readme":"# hyperflut\n\nA fast and feature-rich [Pixelflut](https://github.com/defnull/pixelflut) client. This client is focused on streaming rectangular raster images and video (optionally with alpha) onto pixelflut servers as fast as possible. This is considered the “default” Pixelflut application and what many want to do with their local Pixelflut server. It does not aim to cover more specialized use cases, especially ones that can dynamically write to various different parts of the screen.\n\nhyperflut is a hard fork of [pixelpwnr](https://timvisee.com/projects/pixelpwnr/), last synced at 38c3 (end of 2024). Many command line options are currently compatible with pixelpwnr’s syntax, but this is not guaranteed to hold in the future.\n\n## Features\n\n- Animated images (GIF and other multi-frame formats)\n- GStreamer pipelines (user-specified with gst-launch syntax) to stream a vast variety of video sources onto pixelflut canvases\n- Control over render sizes and offset\n- Automatic image sizing and formatting\n- Faster than most other clients :-)\n- Portable; the image and animation mode supports any std environment\n- Supports multiple backend formats (currently: classical text-based TCP and pingxelflut-v6, possibly upcoming: pingxelflut, UDP, binary TCP/UDP)\n\n## Usage\n\nPixelflut a simple image:\n\n```shell\n# Flut a simple image.\n# - To host 127.0.0.1 on port 8080\n# - With the image: image.png\n# - With 4 painting threads\n# - With the size of the screen (default)\nhyperflut 127.0.0.1:8080 -i image.png -c 4\n\n# Other CLI syntax is also supported\nhyperflut \"127.0.0.1:8080\" --image=\"image.png\" -c=4\n```\n\nPixelflut an animated image:\n\n```shell\n# Flut an animated image, with multiple frames.\n# - To host 127.0.0.1 on port 8080\n# - With the images: *.png\n# - With 5 frames per second\n# - With 4 painting threads\n# - With a size of (400, 400)\n# - With an offset of (100, 100)\nhyperflut 127.0.0.1:8080 -i *.png --fps 5 -c 4 -w 400 -h 400 -x 100 -y 100\n```\n\nUse the `--help` flag for all available options.\n\n### Useful GStreamer commands\n\nIf you have GStreamer-enabled hyperflut, you can use a pipeline just like in `gst-launch` to create very involved effects. The only requirement is that some kind of raw video (video/x-raw) is sourced from an element named `pixelflut_out`. While any framerate is accepted, lower framerates (\u003c20) will generally yield better results due to general performance restrictions. Note that any X input sources do not work thanks to missing a XInitThreads() call; I couldn’t get it to work even with this so hyperflut doesn’t run this call.\n\nHere are some useful examples to get you started.\n\n```gstreamer\n# Stream any video at 10fps (the last videoconvert node is a dummy element)\nfilesrc location=my_video.mkv ! decodebin ! videorate ! video/x-raw,framerate=10/1 ! videoconvert name=pixelflut_out\n# Make black and dark elements of a video transparent, increasing drawing efficiency\nfilesrc location=my_video.mkv ! decodebin ! videorate ! videoconvert ! video/x-raw,framerate=10/1 ! alpha method=custom target-b=0 target-r=0 target-g=0 black-sensitivity=128 white-sensitivity=0 name=pixelflut_out\n# Stream some Video4Linux2 source, such as your camera or a loopback device with input video from ffmpeg, with zebra stripes on bright areas\nv4l2src device=/dev/videoXXX ! videorate ! video/x-raw,framerate=10/1 ! zebrastripe name=pixelflut_out\n```\n\n## Installation\n\nHyperflut is written in Rust and built with Cargo. It uses a stable toolchain and runs on at least the latest Rust version.\n\nHyperflut has some features that can be enabled and disabled depending on your needs:\n\n- `gst`: Enables GStreamer support. This is not enabled by default since the native GStreamer libraries are required, and their installation is not possible/straightforward on all platforms. [See here](https://gitlab.freedesktop.org/gstreamer/gstreamer-rs#installation) for the official installation instructions if you want to use GStreamer.\n\nClone and install `hyperflut` with:\n\n```shell\n# Clone the project\ngit clone https://github.com/kleinesfilmroellchen/hyperflut.git\ncd hyperflut\n\n# Install hyperflut to your system\ncargo install -f\n# With GStreamer support:\ncargo install --features gst -f\n\n# Start using hyperflut\nhyperflut --help\n\n# or run it directly from Cargo\ncargo run --release -- --help\n\n# After building once, you can also use:\n./target/release/hyperflut --help\n```\n\nYou can configure hyperflut’s logging by using the RUST_LOG environment variable. Its general syntax is [described here](https://docs.rs/env_logger/latest/env_logger/#example). All GStreamer logging categories are nested under the `gstreamer` logging module, so e.g. to enable debug output for GStreamer’s Video4Linux2 elements you could set `RUST_LOG=gstreamer::v4l2=DEBUG`.\n\n## Performance \u0026 speed optimization\n\nThere are many things that affect how quickly pixels can be painted on a\npixelflut server.\nSome of them are:\n\n- Size of the image that is drawn.\n- Amount of connections used to push pixels.\n- Performance of the machine `hyperflut` is running on.\n- Network interface performance of the client.\n- Network interface performance of the server.\n- Performance of the pixelflut server.\n\nThings that improve painting performance:\n\n- Use a wired connection. Most Pixelflut setups at CCC events nowadays block all wireless traffic anyways.\n- Use a LAN connection closely linked to the pixelflut server. The lower latency the better, due to the connection being over TCP.\n- Use as many threads (`-c` flag) as the server, your connection and your machine allows. Many servers at events heavily limit the connection count per IP, e.g. one of the GPN21 servers had a limit of 1 connection/IP and the 38c3 server had a limit of 2 connections/IP.\n- Paint a smaller image (`-w`, `-h` flags).\n- Paint in an area on the screen where the least other things are painted.\n- Use multiple machines with multiple `hyperflut` instances to push pixels to the screen.\n\nPerformance improvements over other implementations that have been implemented in hyperflut:\n\n- Separated handling of image decoding and processing versus painting.\n- Arbitrarily multithreaded painting. This is only an advantage on servers that allow multiple connections.\n- Pixelflut command buffering. For static images, this vastly improves performance even over pixelpwnr, easily saturating multi-gigabit links with one or two painter threads.\n- Discarding of transparent pixels. In combination with video processing in GStreamer, this allows you to filter out only the relevant pixels and draw large-scale graphics with little bandwidth requirements.\n\n## License\n\nThis project is released under the GNU GPL-3.0 license. Check out the [LICENSE](LICENSE) file for more information.\n\nSince the GPL’d code from pixelpwnr cannot be relicensed, unfortunately I cannot offer a different license than this. However, all source files completely written by me are available under the Public Domain [Unlicense](UNLICENSE), this is noted in the file’s header comment when applicable.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkleinesfilmroellchen%2Fhyperflut","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkleinesfilmroellchen%2Fhyperflut","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkleinesfilmroellchen%2Fhyperflut/lists"}