Turns reporting material into web, video, scrollytelling, and static visuals — storyboard approval, real rendered drafts, and per-output delivery, all in a journalist-owned story directory. 17 skills, 4 formats, local-first.
Workflow | Delivery | Install | Story Directory
Built by Buried Signals • tom@buriedsignals.com
Splash turns reporting material and data into finished visual journalism. It freezes the supplied reporting material, develops a storyboard, produces real rendered drafts, waits for human approval, and exports a format-specific handover — while source files, editorial decisions, rendered drafts, approvals, and delivery artifacts stay in a journalist-owned working directory.
It is a skill pack used through an AI assistant rather than a hosted application. The implementation is local-first: stories and newsroom configuration live outside the replaceable Splash checkout, credentials stay in the operating system's protected store through Engine, and every delivery is a file or directory the newsroom controls.
- Freezes supplied reporting material into an immutable story source before any production starts.
- Develops a storyboard and waits for editorial approval of the angle, format, and visual approach.
- Produces real rendered drafts — charts, maps, scrollytelling, video, and static graphics — not mockups or descriptions.
- Waits for human approval on every rendered output before delivery.
- Delivers per approved output: owned local files, a CMS insertion package, or an automatic Cloudflare Pages publish with embed code.
- Keeps editable production source and delivered exports strictly separated per output, so editor feedback reopens production without touching the delivered form.
- Ranks and selects the smallest craft skill that fits the approved editorial intent; ranking informs agent judgment, it does not replace it.
Intake
-> Storyboard [gate: editorial approval]
-> Beats: chart / map / image / video / scrolly
-> Render + human approval [gate: visual approval]
-> Deliver: local files / CMS package / Cloudflare Pages
-> Editor feedback -> reopen beat -> re-render -> re-deliver
Every gate is explicit. Splash does not auto-advance through storyboard approval, rendered-output approval, or the delivery decision. Craft-skill selection is ranked, but the journalist's confirmed takeaway always wins.
Each story gets a journalist-owned working directory:
stories/
.splash-instance-id local deployment namespace; never commit
<story>/
AGENTS.md revision instructions for a fresh session
source/ frozen reporting material
STORYBOARD.md editorial decisions and producer choice
beats/<outputId>/ canonical editable visual source
renders/ current review target
spec.json Datawrapper source spec, when delegated
DATAWRAPPER.json reusable Datawrapper chart ID, when delegated
export/<outputId>/ current delivered form; never edit as source
HANDOVER.md
DEPLOYMENT.json hosted deployment → editable beat link
EMBED_URL.txt
EMBED_CODE.html
beats/<outputId>/ is editable production source; export/<outputId>/ is the
current delivery, never the source. For editor feedback, start with the
story's AGENTS.md, edit the matching beat, render and approve again, then
materialise the same delivery form.
Delivery is selected per approved output:
- Owned files — source bundles and rendered assets stay local.
- CMS insertion — produces a local insertion package; Splash never calls a CMS itself.
- Deploy and receive embed code — publishes the web output to Cloudflare Pages automatically. Each hosted output gets a stable per-output project URL, an iframe snippet, and a deployment receipt. A later approved revision updates the same URL.
Cloudflare is an implementation detail, not another editorial question. Local delivery keeps the prior export intact until replacement completes.
Credentials are stored through Engine's operating-system credential broker —
never in MCP arguments, model context, or committed files. The Splash studio
is a loopback-only page: Goose opens it with open_splash, other harnesses
run apps/goose/studio/open.mjs. It links to each provider's key page and
accepts values on a separate setup page. Map craft's provider-bearing bake is
a fixed Engine operation: each beat supplies a strict story-local
MAP-BAKE.json, and Engine verifies camera, GeoJSON/data digests, managed
browser, and installed runtime before hydrating MAPTILER_KEY.
Managed journalist install is Indicator Labs on Mac or Windows. Join at buriedsignals.com/join. Indicator Labs adds guided setup, credential management, repair, and automatic updates.
Agent-led manual installation uses the same Engine through its public signed standalone release. Fetch the JSON response for the host platform:
https://navigator.indicator.media/api/artifacts/bootstrap/bsig/<platform>
<platform> is darwin-arm64, darwin-amd64, linux-arm64,
linux-amd64, or windows-amd64. Download the returned archive, checksum,
signature, and public key; verify both SHA-256 and Minisign before extracting
or executing bsig. Then run bsig catalog sync.
Windows 11 amd64 is a prepared host: Engine does not install Goose Desktop,
Git, Bun, Docker, or Node. Missing tools fail at plan time. An agent installs
the catalog-pinned release with bsig plan install splash, reviews the emitted
plan, and applies that exact plan.json. After doctor is green, launch Goose
from the Start menu. Do not run install.sh on Windows.
Contributor / development checkout on macOS or Linux:
git clone https://github.com/buriedsignals/splash.git
cd splash
bun install --frozen-lockfile
bash installer/install.sh --bsig /absolute/path/to/bsiginstaller/install.sh adopts the checkout through one Engine transaction,
installs the dependency and browser payload, runs the no-value smoke check,
projects the shipped skills, and registers Splash with Goose when present.
Stories and newsroom configuration remain outside the replaceable checkout.
For the canonical manifest, runtime, data-path, and Goose-registration health
check, run bsig doctor --product splash.
| Skill | Purpose |
|---|---|
intake |
Freezes reporting material into the story source. |
storyboard |
Editorial decisions, format choice, visual approach. |
chart-beat / chart-web / chart-video |
Chart production per delivery format. |
map-beat / map-web |
Map production with Engine-verified bakes. |
image-beat |
Static and illustrated outputs. |
scrolly |
Scrollytelling production. |
dw-beat / dw-chart |
Datawrapper-delegated charts. |
analyst |
Dataset profiling before visual selection. |
palette |
Newsroom palette and visual identity. |
newsroom-charter |
Newsroom configuration and constraints. |
doctrine |
Visual and editorial doctrine. |
splash |
Orchestration and human-gated workflow. |
deliver |
Delivery forms, safeguards, and handover contract. |
| Doc | For |
|---|---|
AGENTS.md |
Repository workflow and product constraints. |
skills/splash/SKILL.md |
Orchestration and human-gated workflow. |
skills/deliver/SKILL.md |
Delivery forms, safeguards, and handover contract. |
skills/doctrine/SKILL.md |
Visual and editorial doctrine. |
| Interactive setup verification | Durable implementation evidence and release blockers. |
| Residual findings | Completed delivery hardening and outstanding verification. |
- Splash is visual journalism: storyboards, rendered visuals, approvals, and delivery.
- Spotlight is active OSINT casework: leads, evidence, fact-checks, and review artifacts.
- Anomaly is structured-data investigation: detectors, replay, reviewed findings, and portable cases.
- Splash consumes reviewed material from either and produces the visual form readers see.
Splash's human-gated production redesign adapts selected ideas from Qinghong Lin et al.'s Data2Story paper and the Data2Story open-source project — especially evidence traceability, explicit planning, and quality review. Splash uses Data2Story as a design reference only: it does not install, invoke, or require Data2Story skills at runtime, and it does not adopt the project's fixed role topology or article-only workflow.
Splash stands on open work — open-source projects and open methods. A sincere thank-you to every project below. (Listing does not imply affiliation or endorsement.)
| Category | Projects we're grateful to |
|---|---|
| Runtime | Bun (Bun Software, MIT) |
| Rendering | React (Meta, MIT) · Remotion (Remotion — video rendering) · D3 (Mike Bostock, ISC — chart geometry and scales) · Resvg (linebender, MIT — SVG rendering) · Puppeteer (Google, Apache-2.0 — browser rendering and proofs) |
| Maps | MapLibre GL (BSD-3.0 — interactive maps) · MapTiler (map tiles) |
| Charts | Datawrapper (Datawrapper GmbH — delegated chart production) |
| Delivery | Cloudflare Pages (Cloudflare — hosted output publishing) |
| Methodology | Data2Story by Qinghong Lin, Batu EI, Yuhong Shi, Pan Lu, Philip Torr, James Zou (arXiv:2606.11176 — design reference for evidence traceability and human-gated production) |
Built something here we should credit, or want a listing changed or removed? Open an issue or PR — we'll fix it fast.
Splash is available under the MIT License.