Install
openclaw skills install drillrPower terminal for deep financial research on US public equities — reason through investment theses, screen for ideas, map supply chains, do forensic accounting, pull earnings call quotes, model financials, and more in plain English
openclaw skills install drillrdrillr.ai is the power terminal for deep financial research on US public equities. Its research agent reasons through multi-step queries the way a buy-side analyst would — pulling real numbers from primary sources, surfacing comparisons, and synthesizing filing language on demand. Coverage spans all US-listed public companies on NYSE, NASDAQ, and OTC markets.
drillr is a read-only research skill — pure question in, markdown answer out. No side effects, no surprises.
What the skill does, and only does:
diggr-agent-prod-414559604673.us-east4.run.app/api/public/chatWhat the skill will never do:
eval, exec, or spawn subprocesses~/.ssh, or any other local dataDependencies: Python stdlib only (http.client, json, re, io, urllib.parse, sys). Zero third-party packages; no pip install required; nothing to supply-chain compromise.
Input hardening: Queries are capped at 8 KB and sent as a JSON-encoded string field — no string interpolation into shell, URL, or SQL. The API URL is hardcoded, not constructed from input.
Output trust boundary: Responses are AI-generated text rendered verbatim as markdown. The script never execs, evals, or otherwise acts on returned content. Treat the numbers as research input, not ground truth — verify material figures against primary SEC filings before acting on them.
Find companies that fit a specific investment thesis — across fundamentals, quality, valuation, and momentum signals simultaneously.
Map competitive dynamics, trace customer/supplier relationships, and understand who wins when a sector theme plays out.
Detect earnings quality issues, stress-test reported numbers, and surface divergences between what management says and what the financials show.
Pull a specific metric across a peer group and lay it out side by side — no manual lookup required.
Extract exactly what management said on a specific topic — across one call or multiple quarters.
Pull specific disclosures, track language changes across filings, and surface material events without reading hundreds of pages.
Track where informed capital is moving — both insiders at the company and major institutional investors.
Pull the exact historical series you need to build or stress-test a model — formatted and ready to use.
Track material events, news catalysts, and price-moving disclosures around specific dates or ongoing situations.
Assess how cheap or expensive something is — in absolute terms, relative to history, or versus peers.
When the user asks a financial research question, run the following inline command. Replace REPLACE_WITH_USER_QUESTION with the user's exact question inside the triple-quoted string — quotes and special characters in the question are safe.
python3 - << 'DRILLR_END'
import http.client, io, json, re, sys, urllib.parse
# Force UTF-8 output (avoids encoding errors on Windows)
if hasattr(sys.stdout, "buffer"):
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
QUERY = """REPLACE_WITH_USER_QUESTION"""
API_URL = "https://diggr-agent-prod-414559604673.us-east4.run.app/api/public/chat"
payload = json.dumps({"messages": [{"role": "user", "content": QUERY}]}).encode("utf-8")
parsed = urllib.parse.urlparse(API_URL)
conn = http.client.HTTPSConnection(parsed.netloc, timeout=15)
conn.request("POST", parsed.path, body=payload, headers={"Content-Type": "application/json"})
resp = conn.getresponse()
# Remove timeout after connect so the SSE stream runs as long as the query takes
if conn.sock:
conn.sock.settimeout(None)
current_event = None
text_parts = []
artifact_map = {}
reader = io.TextIOWrapper(resp, encoding="utf-8", errors="replace")
for line in reader:
line = line.rstrip("\r\n")
if line.startswith("event: "):
current_event = line[7:]
elif line.startswith("data: "):
try:
d = json.loads(line[6:])
except json.JSONDecodeError:
continue
if current_event == "step.text_delta":
text_parts.append(d.get("content", ""))
elif current_event == "step.artifact":
artifact = d.get("artifact", {})
art_id = artifact.get("id", "")[:8]
if artifact.get("type") == "data_table":
title = artifact.get("title", "Table")
spec = artifact.get("spec", {})
columns = spec.get("columns", [])
rows = spec.get("rows", [])
lines = [f"\n**{title}**\n"]
if columns and rows:
headers = [c["label"] for c in columns]
lines.append("| " + " | ".join(headers) + " |")
lines.append("| " + " | ".join(["---"] * len(headers)) + " |")
for row in rows:
vals = []
for col in columns:
val = row.get(col["key"], "")
fmt = col.get("format", "")
if fmt == "currency" and isinstance(val, (int, float)):
val = (f"${val/1e9:.1f}B" if abs(val) >= 1e9
else f"${val/1e6:.1f}M" if abs(val) >= 1e6
else f"${val:,.0f}")
elif fmt == "percent" and val not in (None, ""):
val = f"{val}%"
vals.append(str(val) if val is not None else "")
lines.append("| " + " | ".join(vals) + " |")
artifact_map[art_id] = "\n".join(lines)
conn.close()
text = "".join(text_parts)
text = re.sub(r"<!-- artifact:([a-f0-9]+) -->",
lambda m: artifact_map.get(m.group(1)[:8], ""), text)
print(text or "(No response — rephrase the query and try again)")
DRILLR_END
Alternatively, use the companion script:
python3 query.py "your question here"
Thesis-Driven Discovery
"Screen for mid-cap software companies with revenue growth above 20%, positive FCF, and P/FCF under 30x""Find small-cap industrials with improving gross margins, low debt, and insider buying in the last two quarters"Forensic Accounting
"Compare Palantir's GAAP net income vs operating cash flow vs stock-based comp over 8 quarters — is earnings quality improving?""Show changes in days sales outstanding and inventory for Nike over the last six quarters""What new risk factors did Apple add to their 2024 10-K that weren't in 2023?"Earnings Call Fact Lookup
"What did NVIDIA's CEO say about data center demand in the last two earnings calls — pull the exact quotes""How has Meta's language around AI capex commitments changed from Q1 2024 to Q4 2025?""What guidance did Salesforce give for FY2026 revenue growth and did they raise or lower it?"Cross-Company Tabulation
"Show revenue, gross margin, operating margin, and FCF margin for the top 10 enterprise software companies — last four quarters""Compare EV/EBITDA, EV/Sales, and P/FCF for the five largest US banks right now"Financial Modeling
"Give me Apple's quarterly revenue, gross profit, R&D, SG&A, operating income, and net income for the last 20 quarters""Show Amazon's segment revenue and operating income — AWS vs North America vs International — by quarter since 2022"Smart Money Tracking
"Which insiders at Meta have bought stock on the open market in the last 60 days?""Find small-cap stocks where two or more insiders bought at 52-week lows in the last 90 days"Event-Driven Research
"What caused the drop in Fastly stock in early 2026 — show news and any 8-K filings around that period""Show all press releases and regulatory filings from Boeing in the last 30 days"Valuation
"Show Nvidia's P/E ratio history over the last 3 years alongside revenue growth""Which S&P 500 sectors are trading at the widest discount to their 5-year average EV/EBITDA?"/api/public/chat endpoint is openhttp.client (no curl required)