discourse-screenshots
- Repo stars 47,169
- Author repo discourse
Discourse screenshots
Drives a system spec (spec/system/theme_screenshots_spec.rb) that discovers all system specs containing screenshot_marker marker calls, runs them under each combination of theme × device × color mode, and outputs PNGs plus a single compare.html viewer.
How it works
Spec authors place screenshot_marker(label: "my-label") at the moment they want to capture. The orchestrator auto-discovers those specs and runs only the it blocks that contain a marker, skipping everything else. The only: kwarg restricts a capture to one device leg:
screenshot_marker(label: "search-menu", only: :desktop)
Output files: tmp/theme-screenshots/raw/{device}-{theme}-{mode}-{label}.png
Comparison viewer: tmp/theme-screenshots/compare.html (tabs for device and color mode)
Matrix (default)
| Theme | Modes | Devices |
|---|---|---|
| Foundation | light, dark | desktop, mobile |
| Horizon | light, dark | desktop, mobile |
How to run
TAKE_SCREENSHOTS=1 LOAD_PLUGINS=1 bin/rspec spec/system/theme_screenshots_spec.rb
LOAD_PLUGINS=1 is always included so chat routes work.
Arguments (env vars)
| Var | Default | Purpose |
|---|---|---|
TAKE_SCREENSHOTS |
(required) | Must be 1 for the spec to run. |
LOAD_PLUGINS |
1 |
Always set so chat and plugin routes work. |
SCREENSHOTS_DIR |
tmp/theme-screenshots |
Where PNGs and the HTML viewer are written. |
SCREENSHOTS_MODES |
light,dark |
Comma-separated color modes. |
SCREENSHOTS_DEVICES |
desktop,mobile |
Comma-separated devices. Mobile uses Playwright WebKit. |
SCREENSHOTS_THEMES |
foundation,horizon |
Comma-separated built-in theme names to include. |
SCREENSHOTS_THEME_URL |
(unset) | Git URL of a remote theme to install and add to the matrix. |
SCREENSHOTS_THEME_NAME |
repo name | Filename label for the remote/extra theme. |
SCREENSHOTS_SUBSET |
(unset) | Substring filter on marker labels — only captures markers whose label contains this string. |
Examples
# Default — all themes × light/dark × desktop/mobile
TAKE_SCREENSHOTS=1 LOAD_PLUGINS=1 bin/rspec spec/system/theme_screenshots_spec.rb
# Desktop, light mode only
TAKE_SCREENSHOTS=1 LOAD_PLUGINS=1 SCREENSHOTS_DEVICES=desktop SCREENSHOTS_MODES=light \
bin/rspec spec/system/theme_screenshots_spec.rb
# Foundation only, dark only
TAKE_SCREENSHOTS=1 LOAD_PLUGINS=1 SCREENSHOTS_THEMES=foundation SCREENSHOTS_MODES=dark \
bin/rspec spec/system/theme_screenshots_spec.rb
# Add a remote theme alongside the built-ins
TAKE_SCREENSHOTS=1 LOAD_PLUGINS=1 \
SCREENSHOTS_THEME_URL=https://github.com/org/my-theme \
SCREENSHOTS_THEME_NAME=my-theme \
bin/rspec spec/system/theme_screenshots_spec.rb
# Only capture markers whose label contains "topic"
TAKE_SCREENSHOTS=1 LOAD_PLUGINS=1 SCREENSHOTS_SUBSET=topic \
bin/rspec spec/system/theme_screenshots_spec.rb
Invocation instructions
When this skill is invoked:
- Build the command from
$ARGUMENTS. If no arguments are given, use the default matrix. - Parse free-form args into env vars (composable — handle multiple at once):
- "dark only" / "light only" →
SCREENSHOTS_MODES=… - "desktop only" / "mobile only" →
SCREENSHOTS_DEVICES=… - "foundation only" / "just horizon" →
SCREENSHOTS_THEMES=… - A git URL for a theme →
SCREENSHOTS_THEME_URL=…; also setSCREENSHOTS_THEME_NAME=<label>if the user provides a name - A label substring (e.g. "only topic markers", "just signup") →
SCREENSHOTS_SUBSET=… - A directory path (e.g. "save to /tmp/foo") →
SCREENSHOTS_DIR=…
- "dark only" / "light only" →
- Always include
LOAD_PLUGINS=1. - Always prefix with
TAKE_SCREENSHOTS=1. - If the user requests an unknown built-in theme name, tell them only
foundationandhorizonare supported — for any other theme useSCREENSHOTS_THEME_URL. - Run via
bin/rspec spec/system/theme_screenshots_spec.rbfrom the repo root. - After the run, list the files saved (
lson the raw dir) and surface thecompare.htmlpath to the user. Show failures ifbin/rspecexits non-zero.
Adding markers to a spec
In any system spec, include ThemeScreenshotMarker and call screenshot_marker at the point you want to capture:
describe "Search" do
include ThemeScreenshotMarker
it "shows search results" do
visit "/search"
search_page.type_in_search("test")
search_page.click_search_button
screenshot_marker(label: "search-results") # captured on all devices
screenshot_marker(label: "search-menu", only: :desktop) # desktop only
end
end
The include ThemeScreenshotMarker line is required — without it, screenshot_marker is undefined when the spec is run directly. The orchestrator also auto-includes it as a safety net, but relying on that alone will break direct spec runs.
- Fluxly category
- Design
- Author-declared agents
- No explicit declaration found; this is not inferred or tested compatibility
- Static check
- 88 / 100 · heuristic scan, not runtime safety proof
- Author / version / license
- @discourse · no license declared
- Fluxly token estimate
- Lean
- Fluxly setup estimate
- Plug-and-play
- External API key
- No requirement detected
- Detected OS requirements
- Unspecified
- Runtime requirements
- Unspecified
- Detected file/system behavior
-
- Read-only
- Write / modify
- Env read
- Detected network behavior
- Local-only
- Install commands
- None (reference only)
Profile is derived at build time from SKILL.md and install vectors. Subject to drift from author intent.
Heads up: 未限定 allowed-tools,默认拥有全部工具权限。
The current SKILL.md does not define a fixed output example. Spec authors place screenshotmarker(label: "my-label") at the moment they want to capture. The orchestrator auto-discovers those specs and runs only the it blocks that contain a marker, skipping everything else. The only: kwarg restricts a capture to one…
Theme · Modes · Devices Foundation · light, dark · desktop, mobile Horizon · light, dark · desktop, mobile
LOADPLUGINS=1 is always included so chat routes work.
Var · Default · Purpose TAKESCREENSHOTS · (required) · Must be 1 for the spec to run. LOADPLUGINS · 1 · Always set so chat and plugin routes work.
Examples
When this skill is invoked: Build the command from $ARGUMENTS. If no arguments are given, use the default matrix. Parse free-form args into env vars (composable — handle multiple at once):
# Discourse screenshots
Drives a system spec (`spec/system/theme_screenshots_spec.rb`) that discovers all system specs containing `screenshot_marker` marker calls, runs them under each combination of theme × device × color mode, and outputs PNGs plus a single `compare.html` viewer.
## How it works
Spec authors place `screenshot_marker(label: "my-label")` at the moment they want to capture. The orchestrator auto-discovers those specs and runs only the `it` blocks that contain a marker, skipping everything else. The `only:` kwarg restricts a capture to one device leg:
```ruby
screenshot_marker(label: "search-menu", only: :desktop)
```
Output files: `tmp/theme-screenshots/raw/{device}-{theme}-{mode}-{label}.png`
Comparison viewer: `tmp/theme-screenshots/compare.html` (tabs for device and color mode)
## Matrix (default)
| Theme | Modes | Devices |
|------------|-------------|-----------------|
| Foundation | light, dark | desktop, mobile |
| Horizon | light, dark | desktop, mobile |
## How to run
```bash
TAKE_SCREENSHOTS=1 LOAD_PLUGINS=1 bin/rspec spec/system/theme_screenshots_spec.rb
```
`LOAD_PLUGINS=1` is always included so chat routes work.
### Arguments (env vars)
| Var | Default | Purpose |
|-------------------------|---------------------|---------------------------------------------------------------|
| `TAKE_SCREENSHOTS` | *(required)* | Must be `1` for the spec to run. |
| `LOAD_PLUGINS` | `1` | Always set so chat and plugin routes work. |
| `SCREENSHOTS_DIR` | `tmp/theme-screenshots` | Where PNGs and the HTML viewer are written. |
… Author text anchors workflow facts; Fluxly only indexes current sections, terms, files, and commands.
sections -> How it works → Matrix (default) → How to run → Arguments (env vars) → Examples → Invocation instructions
terms -> Spec authors place screenshotmarker(label: "my-label") at the moment they want to capture. · LOADPLUGINS=1 is always included so chat routes work. · 1. Build the command from $ARGUMENTS. · The include ThemeScreenshotMarker line is required — without it, screenshotmarker is undefined when the spec is run directly.
files/cmd -> spec/system/themescreenshotsspec.rb · screenshotmarker · compare.html · screenshotmarker(label: "my-label") · only: · tmp/theme-screenshots/raw/{device}-{theme}-{mode}-{label}.png · tmp/theme-screenshots/compare.html · LOADPLUGINS=1
body sha256 -> fd88dcc752ff
Decide Fit First
Design Intent
How To Use It
Boundaries And Review