buriedsignals/spotlight/integrations

Claude Code and agent skill by buriedsignals/spotlight

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

Use when an investigation step may need an external integration such as browser acquisition, Maigret account discovery, Junkipedia narrative tracking, Apify social-media collection, Arbiter social-media case studies, OSINT Navigator tool discovery, Noosphere C2PA signing, or Unpaywall access lookup.

Install

npx vskill@latest install buriedsignals/spotlight/integrations

SKILL.md

Integrations — External Tool Routing

Spotlight ships with a framework for external OSINT tool integrations (integrations/ at the repo root). Each integration is a directory with manifest.json + integration.md. This skill is the agent-facing routing layer: given an investigation need, which integration (if any) should the agent reach for?

The preflight result is authoritative. Before routing, the orchestrator should have run integrations/preflight.py during Preflight. If an integration is red (missing env var) or yellow (smoke test failed), do not route to it — use a fallback.

When to invoke this skill

  • Before you make a decision that could benefit from an external tool: "should I use an integration for this step, or stay with the core verbs?"
  • When the orchestrator wants to show the user which integrations are live
  • Mid-investigation: "I need to verify a claim from a deleted tweet — is Junkipedia available?"

The skill is cheap to load — it's a routing table, not a deep methodology guide.

Current integrations

IntegrationCategoryCapabilitiesWhen to pick
dev-browserbrowser-automationdynamic-page-acquisition, form-navigation, screenshot-capture, download-capture, visual-verification, authenticated-browser-sessionUse for specific investigative tasks that require browser automation after ordinary search/scrape is insufficient: portals, JS-rendered pages, forms, screenshots, downloads, visual verification, and acquisition evidence bundles.
browsebrowser-automationskill-catalog-navigation, selector-based-driver, ref-based-driver, accessibility-tree-snapshot, portal-navigationSecond-tier browser tool. Use when a curated browse.sh skill exists for the target portal and dev-browser would require writing navigation logic from scratch.
browser-harnessbrowser-automationcdp-browser-control, dynamic-page-acquisition, screenshot-capture, download-capture, visual-verificationLegacy browser fallback. Do not pick as the default while dev-browser is green.
browser-usebrowser-automationform-navigation, search-export, login-driving, multi-step-browsingLegacy/adjacent browser automation. Do not pick as the default while dev-browser is green.
arbitersocial-osintcurated-case-study-browse, entity-stance-analysis, hierarchical-theme-analysis, consolidated-case-study-report, case-study-creationAnalysing a collected social corpus: per-entity stance, theme clustering, actor/community structure, archived posts. Uses the member's own ARBITER_API_KEY through the native HTTPS API.
junkipediasocial-osintnarrative-tracking, misinformation-search, social-media-monitoring, cross-platform-queryTracking how a claim spread; finding social posts deleted from origin; cross-platform narrative investigation.
apifysocial-osintsocial-post-collection, profile-post-history, conversation-thread-capture, keyword-post-search, cross-platform-collectionBounded collection of public posts from X, Instagram, TikTok, Facebook, or LinkedIn when no native platform API path fits. Optional: unconfigured until APIFY_API_TOKEN is set. Billed to the member's own Apify account. X collection violates X ToS even for public posts — record the collection authority in access_notes and prefer the official API or a licensed broker where legal scrutiny is likely.
maigretsocial-osintusername-search, account-discovery, profile-url-collectionUsername-led account discovery. Produces candidate profile leads only; never use as attribution proof.
reatechnical-osintelectron-app-analysis, javascript-module-graph, network-capture-analysis, dotnet-assembly-inventory, android-package-inspectionStatic, no-execution look inside a file the case holds: Electron app, HAR/mitmproxy capture, .NET assembly or APK. Requires the reviewed rea-agents@6.4.0 CLI on PATH. Observations only; never claims what an app did on a device.
webchecktechnical-osintdns-records, domain-registration, certificate-transparency-subdomains, archive-history, http-headers, tracker-detection, tech-stackWebsite or domain recon through the member's own Web-Check instance. Lookup checks (DNS, RDAP/WHOIS, CT subdomains, Wayback history) by default; page checks (headers, TLS, trackers, tech stack) contact the live host and need contact_target: true plus the user's explicit approval; never for a suspicious indicator. unconfigured until WEB_CHECK_URL is set. Observations only, never attribution.
noosphere-c2paprovenance-signingcase-provenance-manifest, c2pa-content-credentials, optional-signing-receiptPENDING integration — opt-in signer. Preflight reports unconfigured until NOOSPHERE_C2PA_URL is set. After Investigation gate, the base provenance path always writes status: unsigned and proceeds; signing runs only against a configured signer endpoint. Never a mandatory or blocking step.
osint-navigatortool-discoverytool-search-by-keyword, complex-query-synthesis, country-specific-tool-lookupEntitlement-gated (subscription tier): first tool-discovery pass in Methodology when green + sensitive mode false. Local/open tier and all fallbacks use scripts/osint-tools.py find (local SQL index, 12,500 tools).
decisionsverification-signalsclaim-grounding-signals, report-prose-fidelity, claim-facetsOrchestrator only, opt-in per case. Run scripts/decision-signals.py at the Investigation gate preparation and after report drafting when --check reports ready, the config enables it, the case is not sensitive and the user agreed. Signals are classifications, never evidence; they only lower confidence or add flags. Uses the member's OPENROUTER_API_KEY (environment or integrations.decisions.env_file); scripts/decision-signals.py CASE_DIR --phase investigation-gate --check reports readiness.
unpaywallacademic-open-accessdoi-open-access-lookup, academic-fulltext-discovery, legal-pdf-locationAcademic papers with DOIs when the content-access hierarchy needs a legal open-access copy.

Routing decision tree

What's the task?
│
├── "Navigate a form / click through a UI / extract from a JS-rendered page"
│ → dev-browser — NATIVE harness capability (interactive / authenticated / JS-rendered /
│ chain-of-custody capture); available to ALL tiers, not an integration, not preflight-gated
│ → for STATIC content extraction, use the Crawl4AI scraping seam (also native) — a different
│ job, not a dev-browser fallback (the two serve different purposes)
│ → legacy alternates only if dev-browser is genuinely unavailable: browse (curated browse.sh),
│ then browser-harness / browser-use; last resort fetch() static scrape (weak on JS-heavy pages)
│
├── "Find deleted social posts / track narrative spread / cross-platform search"
│ → junkipedia (if green — check preflight)
│ → fallback: search() + social-media-intelligence skill (limited without Junkipedia's archive)
│
├── "Analyse a whole social corpus — entity stance, narrative themes, who is amplifying,
│ engagement over time" / "cite a social post that may be deleted at origin"
│ → arbiter (if green — check preflight) through the native HTTPS API; browse
│ the topic menu for a case study that already covers the event, or create
│ one from a reviewed plan when nothing matches
│ → requires the member's own `ARBITER_API_KEY`; `/arbiter` provides the
│ attributed signup link and local key setup guidance
│ → post pulls and agent questions are credit-metered to that member's Arbiter account
│ → fallback: junkipedia, then search() + social-media-intelligence skill
│
├── "Collect a bounded set of public posts from an X / Instagram / TikTok / Facebook /
│ LinkedIn profile, thread, or keyword search"
│ → native platform API first (YouTube Data API, Bluesky AT Protocol, Reddit API, Telegram —
│ see social-media-intelligence "Platform Tools")
│ → apify (if green — check preflight) via `integrations/apify/integration.md`; write the
│ actor input to a case-local JSON file, cap `maxItems`, record collection authority
│ → fallback: fetch(profile_url) + manual review; junkipedia for archived/deleted posts
│
├── "Find accounts from one or more usernames / handles / aliases"
│ → maigret if preflight is green and the operator accepts account-discovery noise
│ → output is unverified account-discovery leads only
│ → fallback: search() + social-media-intelligence skill
│
├── "What runs this website / who registered the domain / which subdomains, trackers,
│ certificates or past versions does it have"
│ → invoke-skill("technical-investigation") first: it decides whether the target is a
│ suspicious indicator and records each path as observed / null / skipped / blocked
│ → webcheck (if green — check preflight, sensitive mode false) via
│ `integrations/webcheck/integration.md`; lookup checks by default
│ → page checks (`contact_target: true`) contact the live host: only with the user's
│ explicit approval and an OPSEC plan in the methodology, never for a suspicious indicator
│ → fallback: crt.sh / RDAP / Wayback by hand as described in infrastructure-history
│
├── "What does this app / capture / assembly contain: endpoints, trackers, IPC, permissions"
│ → rea (if green — check preflight) via `integrations/rea/integration.md`; the artifact
│ must already be in the case directory
│ → static only: never run the target; record how the artifact was obtained
│
├── "Methodology tool selection" / "Need a tool I don't know for category X" / "Compare tools" / "Niche country-specific tool"
│ → osint-navigator (first pass ONLY if entitled + green + sensitive mode false — subscription tier)
│ → otherwise (DEFAULT for local / open tier): execute-shell("scripts/spotlight-python scripts/osint-tools.py find \"<keywords>\" [--category X]") — local SQL index, 12,500 tools, offline, no Navigator needed
│
├── "Static page scrape / web search"
│ → fetch / search (verbs, no integration needed)
│
├── "Keep watching this after the cycle ends"
│ → invoke-skill("monitoring") to present a recommendation and, with
│ explicit approval, hand it to Mycroft. Spotlight never calls Scoutpost.
│
├── "Find a legal open-access copy of an academic paper with a DOI"
│ → unpaywall (if green — check preflight)
│ → fallback: invoke-skill("content-access") and continue with CORE / Semantic Scholar
│
├── "Chain-of-custody evidence capture (court records, gov portals)"
│ → dev-browser + web-archiving, recorded in evidence-bundle.json
│
└── "Paywalled / gated content"
→ invoke-skill("content-access") (hierarchy before marking inaccessible)

How to check preflight status mid-execution

execute-shell("scripts/spotlight-python integrations/preflight.py --model-tier {config.model_tier} --json")

Parse the JSON output. summary.green tells you how many integrations are usable. integrations[].status tells you per-integration. Only route to green integrations; log a note and fall back for red/yellow/unconfigured.

Using an integration

Each integration's exact usage — verb calls, request shape, output format — is documented in integrations/<id>/integration.md. Read that file when you decide to use an integration, then emit the documented verb calls.

Example flow for a narrative-tracking task:

  1. Read this skill (you are here)
  2. Pick junkipedia from the routing table
  3. Check preflight: junkipedia is green?
  4. read-file("integrations/junkipedia/integration.md")
  5. Follow the documented execute-shell("curl …") calls
  6. Parse output, fold into findings

Output handling

Any data retrieved through an integration follows the usual evidence-grounding rules:

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
33
Repository forks
5
7-day trend score
18

Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 25 Jul 2026, 3 months ago.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/buriedsignals/spotlight/integrations/badge)](https://verified-skill.com/skills/buriedsignals/spotlight/integrations)

Something wrong with this skill or its page? Tell us.