Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Ross DashBoard agent skills

Teach Claude Code to write, review and maintain Ross Video DashBoard CustomPanels — the .grid / OGLML files behind DashBoard control panels — plus command-line tools for auditing a whole facility's worth of them.

Ask in plain English, get a panel that loads:

"Build me a 4×4 source-select panel for our Carbonite on 192.168.1.20, with a tally readout that goes red when a source is on program."


New to Claude Code? Start here

Claude Code is Anthropic's coding assistant that runs in your terminal, in a desktop app, or in your editor. Install it from claude.com/claude-code.

A skill is a folder of instructions that teaches Claude how to do a specific job well. Claude loads it automatically when your request matches — you don't invoke it by name. This repo is a skill for DashBoard panels: without it Claude guesses at OGLML and produces files that don't load; with it, Claude knows the actual tag set, the escaping rules, and the version of JavaScript DashBoard runs, and it checks its own work with a linter before handing anything back.

You do not need to be a programmer to use this. You do need DashBoard.


Setup

Prerequisites

  • Claude Code
  • Ross DashBoard — free
  • Python 3.9+ (macOS and most Linux systems already have it)
  • pdftotext, for reading the Ross manual — brew install poppler on macOS, apt install poppler-utils on Debian/Ubuntu

1. Clone

git clone https://github.com/jbeale/ross-dashboard-agent-skills
cd ross-dashboard-agent-skills

2. Install the skill

To use it everywhere (recommended — you'll often work on panels outside this folder):

mkdir -p ~/.claude/skills
ln -s "$(pwd)/.claude/skills/ross-dashboard-grid" ~/.claude/skills/ross-dashboard-grid

A symlink means git pull updates the skill in place.

Or just use it here: Claude finds .claude/skills/ automatically when you run it from inside this directory. Nothing to install.

3. Fetch the Ross manual

./scripts/fetch_reference.sh

This downloads the DashBoard CustomPanel Development Guide from Ross's documentation server and extracts it to searchable text. It is not included in this repo — it's Ross's copyrighted material and they don't permit redistribution. Claude greps it when the curated references don't cover something.

4. Check it works

Start Claude Code and ask:

"Make me a DashBoard panel with four push buttons that send UDP strings to 192.168.1.50 port 9000."

You should get a .grid file that opens in DashBoard via File → Open File.


What you can ask for

Building

"Build a PTZ preset panel for a Panasonic camera at 192.168.1.40 — eight preset buttons plus a settings tab for the IP."

"Add a countdown timer to this panel that turns red under 30 seconds."

"Make this panel work on an Ultritouch screen."

Fixing

"This panel loads but the buttons do nothing. What's wrong?"

"Why does my panel stop responding after a couple of hours?" (Usually keepalive — see below.)

Understanding

"What does this panel talk to, and what does each button do?"

"Explain what constrainttype="STRING_STRING_CHOICE" does."

Maintaining a lot of panels

"Audit every panel in /Volumes/Production/DashBoard and tell me what's broken."

"We're renumbering the ribbon controllers from 192.168.11.x to 192.168.20.x. Which panels do I need to touch?"

"Three of our panels have a sendCommand function. Have they drifted apart?"


The tools

Both run standalone — you don't need Claude to use them.

validate_grid.py — check one panel

python3 .claude/skills/ross-dashboard-grid/scripts/validate_grid.py mypanel.grid

Catches: malformed XML, unknown tags and attributes, invalid enum values, duplicate ids, targetid pointing at nothing, container rules (split takes exactly 2 children, table rows must be in <tr>, simplegrid cell overflow), missing required attributes, elements positioned so they won't render, background work that DashBoard can silently unload, and JavaScript syntax DashBoard's engine rejects.

Exits non-zero on errors, so it drops straight into a pre-commit hook or CI.

fleet_audit.py — check all of them

python3 .claude/skills/ross-dashboard-grid/scripts/fleet_audit.py /path/to/panels

Built for the venue with thirty panels and no institutional memory of who wrote what:

  • inventory — every panel's size, complexity, and whether it's running background work unsafely
  • endpoints — every device address, and how each is stored (param cfg.ip, lookup entry 'PTZ.address', inline literal), so renumbering is a lookup, not a hunt
  • drift — functions copy-pasted between panels whose bodies have since diverged: a fix applied to one and forgotten in the others
  • duplicatesids reused across panels, which breaks cross-panel reveal/targetid
  • protocols — what each panel speaks (UDP, HTTP, RossTalk, VDCP, AMP, NK…)
  • findings — the linter across every panel, grouped by problem type

Impact analysis before you touch a device:

fleet_audit.py /path/to/panels --endpoint 192.168.11.40

--json out.json gives machine-readable output for diffing audits over time.

Run against eight published community panels, the audit found five running timers or GPI triggers without keepalive="true" — DashBoard can unload those and silently kill the background work. That's the classic "it just stops after a while, restarting fixes it" fault.


What's in the box

.claude/skills/ross-dashboard-grid/
   SKILL.md               what Claude reads first
   references/            loaded on demand, not all at once
      elements.md            every OGLML tag and attribute
      style-hints.md         styling and the colour constants
      ogscript.md            the scripting API
      ogscript-index.md      every function → line in the Ross manual
      widget-hints.md        <param widget="..."> vocabulary
      patterns.md            cookbook: UDP, TCP, HTTP, grids, timers, tally
      gotchas.md             failure modes and how to avoid them
   scripts/
      validate_grid.py       single-panel linter
      fleet_audit.py         cross-panel audit

templates/starter.grid    a validated starting point
examples/local/           small reference panels
scripts/fetch_reference.sh

Plus a full worked example — see panels/README-media-loader.md. It uploads stills into a Blackmagic ATEM media pool, and demonstrates the pattern for anything DashBoard can't do natively: the panel is the UI and POSTs to a small local service that does the real work. Confirmed working against real hardware.


Where the knowledge came from

Ross documents this format properly — the CustomPanel Development Guide contains a complete OGLML and ogScript reference. The skill distils it into task-shaped pieces Claude can load selectively, and points at the full manual for anything else.

Two things the manual doesn't cover, recovered from a DashBoard 9.16 install:

  • widget="..." string aliases (text, combo, tree-popup, slider-horizontal…). The manual documents only the legacy integers, but modern PanelBuilder writes these. Read out of the constant pools in com.rossvideo.gear.param.ParamString / ParamNumber.
  • STRING_STRING_CHOICE — real panels use this for dropdowns where the stored value differs from the visible label. The manual only shows STRING_CHOICE, where they're the same.

Attributes seen in real PanelBuilder output but absent from the manual (pwidth, pheight, gridaspect, touch, sharedsession, constraintstrict) are marked [observed] in references/elements.md — safe to preserve, risky to invent.

DashBoard 9.16 embeds Rhino 1.7.7.1, so ogScript is ES5 plus Rhino's let/const. No arrow functions, template literals, classes, Promise, spread, or Array.prototype.includes. The linter enforces this — it's the single most common way hand-written ogScript fails.


Limitations

  • Written against DashBoard 9.16. Ross adds tags between versions; unknown tags are reported as warnings rather than errors, so newer panels still validate.
  • The linter reads panels statically. It cannot catch anything that only shows up at runtime, and it can't tell you whether your layout looks right — open it in DashBoard.
  • fleet_audit.py's drift detection matches on function name. Tested on ten panels; at larger scale, common names like init or callback will need smarter grouping.
  • references/ogscript-index.md line numbers are tied to guide v9.16.2. Fetch a different version and they point at the wrong sections silently.

Corrections welcome — especially from anyone running DashBoard at scale. If you find a tag or attribute the reference gets wrong, that's the most useful possible issue to file.


Licence

This project is MIT licensed — see LICENSE. That covers everything in this repository.

Third-party material, not included here

Ross Video's manuals are copyright Ross Video Limited and are not redistributed. The guide forbids reproduction or transmission without written permission, so scripts/fetch_reference.sh downloads them from Ross's own documentation server into gitignored paths. Nothing derived from them beyond ordinary factual reference — tag names, attribute values, function signatures — appears in this repo.

josephdadams/RossDashboardPanels (MIT, © josephdadams) is a useful corpus for exercising the linter and the fleet audit. It is fetched separately rather than vendored, so it stays under its own licence:

git clone https://github.com/josephdadams/RossDashboardPanels examples/josephdadams

Trademarks

Not affiliated with, endorsed by, or supported by Ross Video. DashBoard, openGear, RossTalk and Ultritouch are trademarks of Ross Video Limited. ATEM and Blackmagic Design are trademarks of Blackmagic Design Pty Ltd.

About

Claude Code skill for authoring Ross DashBoard CustomPanels (.grid/OGLML), plus linting and fleet-wide auditing for facilities running many panels

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages