{"id":20746880,"url":"https://github.com/qmsk/dmx","last_synced_at":"2026-01-12T01:57:21.849Z","repository":{"id":48143086,"uuid":"71079616","full_name":"qmsk/dmx","owner":"qmsk","description":"Go DMX controller with ArtNet discovery + Angular Web UI with WebSockets","archived":false,"fork":false,"pushed_at":"2021-10-19T22:41:24.000Z","size":292,"stargazers_count":31,"open_issues_count":7,"forks_count":4,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-10-14T11:53:44.520Z","etag":null,"topics":["angular","artnet","dmx","golang"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/qmsk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-10-16T21:54:27.000Z","updated_at":"2025-04-27T13:06:45.000Z","dependencies_parsed_at":"2022-09-04T18:22:00.095Z","dependency_job_id":null,"html_url":"https://github.com/qmsk/dmx","commit_stats":null,"previous_names":["spcomb/qmsk-dmx"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/qmsk/dmx","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qmsk%2Fdmx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qmsk%2Fdmx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qmsk%2Fdmx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qmsk%2Fdmx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qmsk","download_url":"https://codeload.github.com/qmsk/dmx/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qmsk%2Fdmx/sbom","scorecard":{"id":754194,"data":{"date":"2025-08-11","repo":{"name":"github.com/qmsk/dmx","commit":"f59e12bb089c5554fef8f24614cf9df17bbd1f54"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Mozilla Public License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":2,"reason":"dependency not pinned by hash detected -- score normalized to 2","details":["Warn: containerImage not pinned by hash: Dockerfile:1","Warn: containerImage not pinned by hash: Dockerfile:16","Warn: containerImage not pinned by hash: Dockerfile:28: pin your Docker image by updating debian:stretch to debian:stretch@sha256:c5c5200ff1e9c73ffbf188b4a67eb1c91531b644856b4aefe86a58d2f0cb05be","Warn: npmCommand not pinned by hash: Dockerfile:21","Info:   1 out of   1 goCommand dependencies pinned","Info:   0 out of   1 npmCommand dependencies pinned","Info:   0 out of   3 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 1 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-22T21:08:16.721Z","repository_id":48143086,"created_at":"2025-08-22T21:08:16.721Z","updated_at":"2025-08-22T21:08:16.721Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28331396,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-12T00:36:25.062Z","status":"ssl_error","status_checked_at":"2026-01-12T00:36:15.229Z","response_time":60,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["angular","artnet","dmx","golang"],"created_at":"2024-11-17T08:09:46.876Z","updated_at":"2026-01-12T01:57:21.823Z","avatar_url":"https://github.com/qmsk.png","language":"Go","readme":" Go DMX controller with ArtNet discovery + Angular Web UI with WebSockets\n\n## Web UI\n\n![qmsk::dmx Web UI](https://raw.githubusercontent.com/qmsk/dmx/master/docs/web-main.png)\n\n## Usage\n\n#### Docker\nThe recommended way to build and run the project is using Docker:\n\n    $ git clone https://github.com/qmsk/dmx.git qmsk-dmx \u0026\u0026 cd qmsk-dmx\n    $ docker build -t qmsk/dmx .\n    $ docker run --rm --name qmsk-dmx -v $PWD/config:/etc/qmsk-dmx:ro -e ARTNET_DISCOVERY=2.255.255.255 -p 8000:8000 qmsk/dmx\n\nThe `-v $PWD/config:/go/src/github.com/qmsk/dmx/config:ro` allows editing the config and reloading it use `docker restart qmsk-dmx`.\n\nThe `-e ARTNET_DISCOVERY=2.255.255.255` allows configuring a comma-separated list of broadcast/unicast addresses for ArtNet discovery.\n\nThe `-p 8000:8000` allows accessing the API/UI at `http://localhost:8000` on the machine running the Docker container.\n\n### `github.com/qmsk/dmx/cmd/qmsk-dmx`\n\n```\n\nUsage:\n  qmsk-dmx [OPTIONS] HeadsConfig\n\nApplication Options:\n      --log=\n      --demo                                  Demo Effect\n\nArtNet:\n      --artnet-listen=ADDR\n      --artnet-discovery=ADDR\n      --artnet-discovery-interval=DURATION\n      --artnet-discovery-timeout=DURATION\n      --artnet-dmx-refresh=DURATION\n      --log.artnet=\n\nHeads:\n      --log.heads=\n      --heads-library=PATH\n\nWeb:\n      --http-listen=[HOST]:PORT\n      --http-static=PATH\n\nHelp Options:\n  -h, --help                                  Show this help message\n```\n\n## `github.com/qmsk/dmx/artnet`\n\nGo package supporting Art-Net discovery and DMX output.\n\n* Uses a single `--artnet-listen=:6454` to send and receive UDP packets\n* Supports multiple `--artnet-discovery=192.168.2.102` targets for unicast or broadcast use\n* Supports dynamic [Device Discovery](http://art-net.org.uk/?page_id=454) of nodes and output ports using [`ArtPoll`](http://art-net.org.uk/?page_id=575) and [`ArtPollReply`](http://art-net.org.uk/?page_id=570) packets\n* Supports outgoing [DMX Streaming](http://art-net.org.uk/?page_id=456) using [Broadcast/Unicast Subscription](http://art-net.org.uk/?page_id=649)\n  * Sequence numbers for outgoing packets\n  * Periodic output refresh\n\n## `github.com/qmsk/dmx/heads`\n\nDMX controller with support for multi-channel heads.\nConfigured using TOML configuration files, outputs DMX over Art-Net, controlled using a REST API and WebSocket event stream.\n\n## Configuration\nCan be configured using a single `toml` file, or a structured directory of configuration files:\n\n#### `config/colors.toml`\n```toml\n[colors.red]\nRed     = 1.0\n\n[colors.green]\nGreen   = 1.0\n\n[colors.blue]\nBlue    = 1.0\n```\n\n#### `config/groups.toml`\n```\n[led-par]\nName        = \"LED-Par\"\n\n[tri-bar]\nName        = \"Tri-Bar\"\n```\n\n#### `config/heads.toml`\n```toml\n[led-par]\nType        = \"stairville/ledpar56-5ch\"\nUniverse    = 1\nAddress     = 1\nCount       = 6\nName        = \"LED-Par\"\nGroups      = [\"led-par\"]\n\n[tribar-1]\nType        = \"american-dj/megatri60_mode2\"\nUniverse    = 1\nAddress     = 20\nName        = \"TriBar @ floor\"\nGroups      = [\"tri-bar\"]\n\n[tribar-2]\nType        = \"american-dj/megatri60_mode2\"\nUniverse    = 1\nAddress     = 30\nName        = \"TriBar @ wall\"\nGroups      = [\"tri-bar\"]\n```\n\n#### `config/presets/test.toml`\n```toml\n[Groups.led-par.Color]\nRed = 1.0\nBlue = 0.5\n\n[Groups.tri-bar.Intensity]\nIntensity = 1.0\n[Groups.tri-bar.Color]\nRed = 1.0\nBlue = 0.5\n```\n\n## Web API\n\n#### `GET /api/`\n```json\n{\n   \"Heads\" : {\n      \"tribar-1\" : {\n         \"Channels\" : {\n            \"color:green\" : {\n               \"Address\" : 21,\n               \"DMX\" : 0,\n               \"ID\" : \"color:green\",\n               \"Value\" : 0,\n               \"Type\" : {\n                  \"Color\" : \"green\"\n               },\n               \"Index\" : 1\n            },\n            \"intensity\" : {\n               \"ID\" : \"intensity\",\n               \"DMX\" : 0,\n               \"Address\" : 24,\n               \"Index\" : 4,\n               \"Type\" : {\n                  \"Intensity\" : true\n               },\n               \"Value\" : 0\n            },\n            \"color:red\" : {\n               \"ID\" : \"color:red\",\n               \"DMX\" : 0,\n               \"Address\" : 20,\n               \"Type\" : {\n                  \"Color\" : \"red\"\n               },\n               \"Index\" : 0,\n               \"Value\" : 0\n            },\n            \"control:control\" : {\n               \"Value\" : 0,\n               \"Index\" : 3,\n               \"Type\" : {\n                  \"Control\" : \"control\"\n               },\n               \"Address\" : 23,\n               \"DMX\" : 0,\n               \"ID\" : \"control:control\"\n            },\n            \"color:blue\" : {\n               \"Index\" : 2,\n               \"Type\" : {\n                  \"Color\" : \"blue\"\n               },\n               \"Value\" : 0,\n               \"ID\" : \"color:blue\",\n               \"DMX\" : 0,\n               \"Address\" : 22\n            }\n         },\n         \"Intensity\" : {\n            \"ScaleIntensity\" : null,\n            \"Intensity\" : 0\n         },\n         \"Config\" : {\n            \"Name\" : \"TriBar @ floor\",\n            \"Type\" : \"american-dj/megatri60_mode2\",\n            \"Universe\" : 1,\n            \"Address\" : 20,\n            \"Groups\" : [\n               \"tri-bar\"\n            ],\n            \"Count\" : 0\n         },\n         \"Type\" : {\n            \"URL\" : \"\",\n            \"Model\" : \"Mega Tri 60\",\n            \"Mode\" : \"2\",\n            \"Channels\" : [\n               {\n                  \"Color\" : \"red\"\n               },\n               {\n                  \"Color\" : \"green\"\n               },\n               {\n                  \"Color\" : \"blue\"\n               },\n               {\n                  \"Control\" : \"control\"\n               },\n               {\n                  \"Intensity\" : true\n               }\n            ],\n            \"Vendor\" : \"American DJ\",\n            \"Colors\" : {\n               \"red\" : {\n                  \"Green\" : 0,\n                  \"Blue\" : 0,\n                  \"Red\" : 1\n               },\n               \"magenta\" : {\n                  \"Red\" : 1,\n                  \"Blue\" : 1,\n                  \"Green\" : 0\n               },\n               \"blue\" : {\n                  \"Red\" : 0,\n                  \"Green\" : 0,\n                  \"Blue\" : 1\n               },\n               \"cyan\" : {\n                  \"Blue\" : 1,\n                  \"Green\" : 1,\n                  \"Red\" : 0\n               },\n               \"amber\" : {\n                  \"Blue\" : 0,\n                  \"Green\" : 0.5,\n                  \"Red\" : 1\n               },\n               \"green\" : {\n                  \"Green\" : 1,\n                  \"Blue\" : 0,\n                  \"Red\" : 0\n               }\n            }\n         },\n         \"Color\" : {\n            \"Green\" : 0,\n            \"Blue\" : 0,\n            \"Red\" : 0,\n            \"ScaleIntensity\" : null\n         },\n         \"ID\" : \"tribar-1\"\n      },\n   },\n   \"Outputs\" : [\n      {\n         \"Universe\" : 1,\n         \"ArtNetNode\" : {\n            \"OutputPorts\" : [\n               {\n                  \"Address\" : {\n                     \"Net\" : 0,\n                     \"SubUni\" : 1\n                  },\n                  \"Type\" : 0,\n                  \"Status\" : 128\n               },\n               {\n                  \"Address\" : {\n                     \"Net\" : 0,\n                     \"SubUni\" : 2\n                  },\n                  \"Status\" : 128,\n                  \"Type\" : 0\n               }\n            ],\n            \"Version\" : 1,\n            \"Description\" : \"\",\n            \"BaseAddress\" : {\n               \"Net\" : 0,\n               \"SubUni\" : 0\n            },\n            \"OEM\" : 0,\n            \"Name\" : \"NodeMCU-ARTNET\",\n            \"Report\" : \"\",\n            \"InputPorts\" : null,\n            \"Ethernet\" : \"00:00:00:00:00:00\"\n         }\n      }\n   ],\n   \"Groups\" : {\n      \"tri-bar\" : {\n         \"Color\" : {\n            \"Red\" : 0,\n            \"ScaleIntensity\" : null,\n            \"Green\" : 0,\n            \"Blue\" : 0\n         },\n         \"ID\" : \"tri-bar\",\n         \"Name\" : \"Tri-Bar\",\n         \"Intensity\" : {\n            \"Intensity\" : 0,\n            \"ScaleIntensity\" : null\n         },\n         \"Colors\" : {\n            \"green\" : {\n               \"Red\" : 0,\n               \"Green\" : 1,\n               \"Blue\" : 0\n            },\n            \"amber\" : {\n               \"Green\" : 0.5,\n               \"Blue\" : 0,\n               \"Red\" : 1\n            },\n            \"cyan\" : {\n               \"Red\" : 0,\n               \"Blue\" : 1,\n               \"Green\" : 1\n            },\n            \"red\" : {\n               \"Green\" : 0,\n               \"Blue\" : 0,\n               \"Red\" : 1\n            },\n            \"magenta\" : {\n               \"Green\" : 0,\n               \"Blue\" : 1,\n               \"Red\" : 1\n            },\n            \"blue\" : {\n               \"Red\" : 0,\n               \"Blue\" : 1,\n               \"Green\" : 0\n            }\n         },\n         \"Heads\" : [\n            \"tribar-1\",\n            \"tribar-2\"\n         ]\n      },\n   },\n   \"Presets\" : {\n      \"test\" : {\n         \"ID\" : \"test\",\n         \"Groups\" : {\n            \"led-par\" : {\n               \"Intensity\" : null,\n               \"Color\" : {\n                  \"Blue\" : 0.5,\n                  \"Green\" : 0,\n                  \"ScaleIntensity\" : null,\n                  \"Red\" : 1\n               }\n            },\n            \"tri-bar\" : {\n               \"Intensity\" : {\n                  \"Intensity\" : 1,\n                  \"ScaleIntensity\" : null\n               },\n               \"Color\" : {\n                  \"Red\" : 1,\n                  \"ScaleIntensity\" : null,\n                  \"Green\" : 0,\n                  \"Blue\" : 0.5\n               }\n            }\n         },\n         \"Config\" : {\n            \"Name\" : \"\",\n            \"All\" : null,\n            \"Heads\" : null,\n            \"Groups\" : {\n               \"led-par\" : {\n                  \"Intensity\" : null,\n                  \"Color\" : {\n                     \"Green\" : 0,\n                     \"Blue\" : 0.5,\n                     \"Red\" : 1,\n                     \"ScaleIntensity\" : null\n                  }\n               },\n               \"tri-bar\" : {\n                  \"Intensity\" : {\n                     \"Intensity\" : 1,\n                     \"ScaleIntensity\" : null\n                  },\n                  \"Color\" : {\n                     \"Green\" : 0,\n                     \"Blue\" : 0.5,\n                     \"Red\" : 1,\n                     \"ScaleIntensity\" : null\n                  }\n               }\n            }\n         },\n         \"Heads\" : {}\n      }\n   }\n}\n```\n\n#### `POST /api/heads/tribar-1`\n```json\n{ \"Color\": { \"Red\": 0.517, \"Green\": 0.0, \"Blue\": 0.0}}\n```\n\n#### `POST /api/groups/dimmer`\n```json\n{ \"Intensity\": 0.21 }\n```\n\n#### `POST /api/presets/test`\n```json\n{ \"Intensity\": 0.69 }\n```\n\n## Concepts\n#### Heads\n\nTop-level object that binds together everything else.\n\n#### Output\n\nA DMX universe (512 channels). Refreshed on every update. Connected to something like a `github.com/qmsk/dmx/artnet` `Universe` output.\n\n#### Channel\n\nEach ***Head** has multiple ***Channels***, which are patched to some ***Output*** universe.\n\n###\n\n#### Head\n\n#### Group\n\nA number of ***Heads***.\n\n#### Preset\n\n### Parameters\n\nBoth ***Heads***, ***Groups*** and ***Presets*** use **Parameters**.\n\n#### Intensity\n\nA single `Intensity` value.\n\n#### Color\n\nA combination of `Red`, `Green` and `Blue` values.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqmsk%2Fdmx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqmsk%2Fdmx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqmsk%2Fdmx/lists"}