One syntax. 25 adapters. Code, infrastructure, databases, sessions, and docs — all queryable, all composable.


Look at these five commands:

reveal 'ast://src/?complexity>15'
reveal ssl://api.example.com --check
reveal diff://git://main/.:git://HEAD/.
reveal sqlite:///app.db/users
reveal 'claude://sessions/?search=auth&since=2026-03-01'

Five completely different domains. Code structure. TLS certificates. Structural diffs. Database schemas. AI session history. Same syntax. Same progressive disclosure. Same pipeline composability.

These aren't five different tools. They're five queries against the same data layer.

Your project is a database. You just couldn't query it.

Reveal is the query language.


The syntax

Every adapter follows the same pattern:

reveal <adapter>://<target>[/<path>][?<query>]

The target changes. The adapter changes. The query operators — filters, format flags, depth controls — work the same everywhere. Once you know how to query code structure, you already know how to query SSL certificates.

# Code: functions over complexity 10
reveal 'ast://src/?complexity>10'

# Infrastructure: cert expiring within 30 days
reveal ssl://example.com --check --expiring-within=30

# Database: table structure
reveal sqlite:///prod.db/orders

# Docs: articles missing metadata
reveal 'markdown://docs/?!topics'

# Sessions: find where you worked on auth
reveal 'claude://sessions/?search=authentication'

The operators are consistent. --check means health check. --format=json means machine-readable output. --only-failures filters to what's broken. Learn them once.


The code cluster

The adapters developers reach for first: ast://, calls://, diff://, stats://, imports://.

They're designed to work together because code questions are rarely isolated:

# What changed in this PR? (structural diff)
reveal diff://git://main/.:git://HEAD/.

# Who's affected by what changed? (blast radius)
reveal 'calls://src/?target=validate_payment'

# Is the changed function now too complex? (quality signal)
reveal 'ast://src/payments.py?complexity>10'

# Did this PR introduce circular imports? (dependency health)
reveal 'imports://src/?circular'

That's four questions, four commands, a complete picture of a PR before you've read a line of code.

The composed version does all of it in one:

reveal review main..HEAD

reveal review runs structural diff → quality checks → hotspot detection → complexity delta, under consistent exit codes. It's what you'd build if you were piping these together manually — automated.


Infrastructure as queryable data

The same syntax that queries your code queries your infrastructure.

# SSL certificate health
reveal ssl://api.example.com
reveal ssl://api.example.com --check   # exit 0 healthy, 1 warning, 2 critical

# What domains does this nginx config serve?
reveal /etc/nginx/nginx.conf

# nginx configuration issues (ACME paths, timeout mismatches, missing headers)
reveal /etc/nginx/nginx.conf --check

# Domain registration + DNS health
reveal domain://example.com

The output follows the same progressive disclosure model as code: overview first, drill down for details, machine-readable JSON for automation.

# Full cert details
reveal ssl://example.com/chain     # cert chain
reveal ssl://example.com/san       # all covered domains

This is where the syntax unification pays off for AI agents. An agent auditing infrastructure doesn't need to learn a new tool for SSL certs, another for nginx, another for DNS. It's the same commands it already uses for code.


The pipeline

Here's the thing nobody expects: Reveal pipes into itself. This isn't output piping — it's dataflow over typed queries.

# Extract every domain from nginx config, then check each cert
reveal /etc/nginx/nginx.conf --extract domains | reveal --stdin --check

The output of one adapter becomes the input of the next. The --extract domains flag on the nginx adapter emits ssl:// URIs. reveal --stdin --check reads URIs from stdin and runs health checks on all of them.

graph LR
    A["nginx.conf"] -->|"--extract domains"| B["ssl://domain1<br/>ssl://domain2<br/>..."]
    B -->|"reveal --stdin --check"| C["cert status<br/>per domain"]
    C -->|"--only-failures"| D["expired /<br/>unhealthy certs"]

    style A fill:#f1f5f9,stroke:#94a3b8
    style B fill:#e0f2fe,stroke:#0284c7
    style C fill:#e0f2fe,stroke:#0284c7
    style D fill:#fef2f2,stroke:#ef4444

More:

# Show only failures
reveal /etc/nginx/nginx.conf --extract domains | \
  reveal --stdin --check --only-failures

# JSON output filtered by jq
reveal /etc/nginx/nginx.conf --extract domains | \
  reveal --stdin --format=json | \
  jq 'select(.status.health != "healthy")'

# cPanel: get all domains, check their live certs, filter failures
reveal cpanel://USERNAME/domains --format=json | \
  jq -r '.domains[].domain' | \
  sed 's/^/ssl:\/\//' | \
  reveal --stdin --check --only-failures

This is a Unix pipeline, not a GUI audit tool. You compose adapters the same way you compose shell commands — but data at each stage is structured and typed, not text.


Everything else — same pattern

Four more domains, same syntax.

Databases as schemas

reveal sqlite:///dev.db/users                              # table structure
reveal mysql://localhost/performance                        # query metrics
reveal diff://sqlite://./dev.db:sqlite://./prod.db         # schema drift between environments

JSON as a navigable tree

reveal json://package.json?schema         # infer structure (~100 tokens vs ~5,000 to read)
reveal json://config.json/database/host   # navigate to a key directly
reveal json://tsconfig.json?flatten       # grep-able flat output

Docs as a database

reveal 'markdown://docs/?status=draft'             # find drafts
reveal 'markdown://docs/?topics=authentication'    # by topic
reveal 'markdown://docs/?body-contains=oauth'      # full-text search
reveal 'markdown://docs/?aggregate=status'         # frequency table across all docs
reveal 'markdown://docs/?link-graph'               # find orphaned docs

Sessions as history

reveal 'claude://sessions/?search=authentication'  # find past work on a topic
reveal 'claude://files/src/auth.py'                # which sessions touched this file?
reveal 'claude://my-session?workflow'              # tool call sequence, collapsed
reveal 'claude://my-session?last'                  # fast session recovery (~50 tokens)

git log shows what code changed. claude://files/ shows which AI sessions changed it and why — a layer of provenance git doesn't have.


The token math

For AI agents, the syntax unification has a concrete cost implication.

Reading files is expensive. A 300-line Python file costs ~7,500 tokens to cat. A 1,000-line nginx config costs ~25,000. An API response JSON might be 50,000. An entire session history is millions.

The query approach changes the unit of consumption:

Operation Approximate tokens
cat a 300-line Python file ~7,500
reveal ast://src/module.py ~200
reveal ssl://example.com ~150
reveal json://config.json?schema ~100
reveal 'claude://session?last' ~50

An agent that queries instead of reads can cover more ground with the same context budget — and get more directly actionable answers. The question "which functions in this codebase are over complexity 15?" costs 200 tokens to answer with ast://. It costs 75,000 tokens if the agent reads every file first.


What this actually is

Reveal is not a better grep.

Grep is a text search. It finds occurrences of strings in files. What you get back is lines of text, which you then parse mentally.

Reveal is a query layer. It understands the semantics of what it's reading — function signatures, call relationships, certificate chains, nginx upstream configs, frontmatter schemas — and answers questions about them directly.

The same way a database doesn't make you grep through CSV files, Reveal doesn't make you grep through source files. You write a query. You get a typed, structured answer.

Your project — the code, the infrastructure it runs on, the databases it reads, the docs that describe it, the sessions where it was built — is structured data. It was always structured data. You just didn't have a query language for it.

25 adapters today. More coming. Same syntax.

pip install reveal-cli

reveal help://               # full adapter list
reveal help://relationships  # adapter ecosystem map + power pairs

You don't explore your project anymore. You query it.


Part of the Reveal documentation series. See also:
- The Diff That Shows What Actually Changed — structural diffs for code review and CI
- Stop Scrolling. Start Navigating. — four commands for understanding complex functions
- Find Every Caller in Your Codebase With One Command — impact analysis before refactoring
- Two Commands That Change How You Work With Code — pack and review