Greymatter.ioGreymatter.io
Start for Free
Greymatter.ioGreymatter.io Why Greymatter.io?
Pricing Start for Free
Platform • Forensic Auditing

The full story behind every request.

Greymatter records every request, AI agent action, and tool call with the person behind it. Investigations take one search, not weeks of piecing logs together.

Greymatter⁘
TM AND © 2026 GREYMATTER.IO INC.
Not read: whether any records were lost.
Forensic Audit
p●●●●●@example.com
All namespaces
Last 24h
ACTIVITY BY DAY AND HOUR
The 7 days to 2026-11-09 14:00 UTC, one bar per UTC hour · click an hour to show its requests
Mon
6,214
Tue
7,032
Wed
6,881
Thu
7,456
Fri
5,903
Sat
1,124
Sun
3,688
00:00
23:00
TRAIL
SERVICE
–
1
greymatter-edge
ztfabric
2
greymatter-dashboard
ztfabric
3
greymatter-api
ztfabric
4
greymatter-docs
ztfabric
–
1
jupyterhub-edge
jupyterhub
–
2
jupyterhub-proxy
jupyterhub
3
jupyterhub-jupyter-p●●●●●
jupyterhub
4
jupyterhub-hub
jupyterhub
Each service sits under the service that called it most. A name under a service that came only from a header an application set names this person.
Actions: the requests this person made. Console reads: the reads the Console repeats while its page is open. They carry this person's sign-in, but the person did not ask for them. The server tells them apart from the method, the path and the response code.
REQUESTS AT JUPYTERHUB-JUPYTER-P●●●●●
TIME
ACTION
PATH
WORKLOAD
DECISION
CHAIN
21:38:31
GET
/user/p●●●●●/api/kernelspecs?1794173911688
jupyterhub-jupyter-p●●●●●
Served 200
3 hops →
21:38:30
GET
/user/p●●●●●/api/me?1794173910685
jupyterhub-jupyter-p●●●●●
Served 200
3 hops →
IDENTITY
OIDC
p●●●●●@example.com
4,812
REQUESTS 24H
1,236
ACTIONS 24H
0
BLOCKED
0
DENIED
ACTIVITY · 24H
Not read: how identities are classed, for Nov 2 UTC, Nov 8 22:00–Nov 9 12:00 UTC. A non-human identity may show as a person until it is read.
WHAT IS HAPPENING
4,812 requests to 23 services in 4 namespaces in this window; 12 failed, 0 denied by policy. First seen 2026-11-08 14:02 UTC, last seen 2026-11-09 13:58 UTC.
Event chain · GET /user/p●●●●●/api/kernelspecs?1794173911688
p●●●●●@example.com
One audit record per hop the request passed, in order. Each hop records how the request was carried.
1
jupyterhub-edgeInbound · Listener :10908200 · 19 ms
TLSv1.3
p●●●●●@example.com · source: jwt · header: from
User p●●●●●@example.com, verified at jupyterhub-edge
2
jupyterhub-proxyInbound · Listener :8000200 · 14 ms
TLSv1.3 · mTLS · ztfabric.ztfabric.jupyterhub-edge
Edge link verified
p●●●●●@example.com · source: carried · header: x-greymatter-carried-user · passed on from jupyterhub-edge
User p●●●●●@example.com, verified at jupyterhub-edge
Asserted by spiffe://greymatter.io/ztfabric.ztfabric.jupyterhub-edge · Connecting service spiffe://greymatter.io/ztfabric.ztfabric.jupyterhub-edge
3
jupyterhub-jupyter-p●●●●●Inbound · Listener :8888200 · 2 ms
TLSv1.3 · mTLS · ztfabric.ztfabric.jupyterhub-proxy
p●●●●●@example.com · source: unverified · header: from
User p●●●●●@example.com, verified at jupyterhub-edge
Asserted by spiffe://greymatter.io/ztfabric.ztfabric.jupyterhub-proxy · Connecting service spiffe://greymatter.io/ztfabric.ztfabric.jupyterhub-proxy
3 audited hops
Greymatter⁘
TM AND © 2026 GREYMATTER.IO INC.
Not read: whether any records were lost.
Forensic Audit
p●●●●●@example.com
All namespaces
Last 24h
ACTIVITY BY DAY AND HOUR
The 7 days to 2026-11-09 14:00 UTC, one bar per UTC hour · click an hour to show its requests
Mon
6,214
Tue
7,032
Wed
6,881
Thu
7,456
Fri
5,903
Sat
1,124
Sun
3,688
00:00
23:00
TRAIL
SERVICE
–
1
greymatter-edge
ztfabric
2
greymatter-dashboard
ztfabric
3
greymatter-api
ztfabric
4
greymatter-docs
ztfabric
–
1
jupyterhub-edge
jupyterhub
–
2
jupyterhub-proxy
jupyterhub
3
jupyterhub-jupyter-p●●●●●
jupyterhub
4
jupyterhub-hub
jupyterhub
Each service sits under the service that called it most. A name under a service that came only from a header an application set names this person.
Actions: the requests this person made. Console reads: the reads the Console repeats while its page is open. They carry this person's sign-in, but the person did not ask for them. The server tells them apart from the method, the path and the response code.
REQUESTS AT JUPYTERHUB-JUPYTER-P●●●●●
TIME
ACTION
PATH
WORKLOAD
DECISION
CHAIN
21:38:31
GET
/user/p●●●●●/api/kernelspecs?1794173911688
jupyterhub-jupyter-p●●●●●
Served 200
3 hops →
21:38:30
GET
/user/p●●●●●/api/me?1794173910685
jupyterhub-jupyter-p●●●●●
Served 200
3 hops →
IDENTITY
OIDC
p●●●●●@example.com
4,812
REQUESTS 24H
1,236
ACTIONS 24H
0
BLOCKED
0
DENIED
ACTIVITY · 24H
Not read: how identities are classed, for Nov 2 UTC, Nov 8 22:00–Nov 9 12:00 UTC. A non-human identity may show as a person until it is read.
WHAT IS HAPPENING
4,812 requests to 23 services in 4 namespaces in this window; 12 failed, 0 denied by policy. First seen 2026-11-08 14:02 UTC, last seen 2026-11-09 13:58 UTC.
Event chain · GET /user/p●●●●●/api/kernelspecs?1794173911688
p●●●●●@example.com
One audit record per hop the request passed, in order. Each hop records how the request was carried.
1
jupyterhub-edgeInbound · Listener :10908200 · 19 ms
TLSv1.3
p●●●●●@example.com · source: jwt · header: from
User p●●●●●@example.com, verified at jupyterhub-edge
2
jupyterhub-proxyInbound · Listener :8000200 · 14 ms
TLSv1.3 · mTLS · ztfabric.ztfabric.jupyterhub-edge
Edge link verified
p●●●●●@example.com · source: carried · header: x-greymatter-carried-user · passed on from jupyterhub-edge
User p●●●●●@example.com, verified at jupyterhub-edge
Asserted by spiffe://greymatter.io/ztfabric.ztfabric.jupyterhub-edge · Connecting service spiffe://greymatter.io/ztfabric.ztfabric.jupyterhub-edge
3
jupyterhub-jupyter-p●●●●●Inbound · Listener :8888200 · 2 ms
TLSv1.3 · mTLS · ztfabric.ztfabric.jupyterhub-proxy
p●●●●●@example.com · source: unverified · header: from
User p●●●●●@example.com, verified at jupyterhub-edge
Asserted by spiffe://greymatter.io/ztfabric.ztfabric.jupyterhub-proxy · Connecting service spiffe://greymatter.io/ztfabric.ztfabric.jupyterhub-proxy
3 audited hops
Console view · sample data. We masked names and identifiers.
Questions you cannot dodge

The audit questions land the day something goes wrong.

An incident does not wait for business hours. Your leadership wants specific answers, fast.

Tap a card to see how Greymatter solves it.
Who touched this resource, and when?
Tap to reveal →
Search by a person's name and see what they did across services. No log exports.
Greymatter solves it
Did an AI agent act on its own, or for a human?
Tap to reveal →
The record names the human who delegated the action and the agent that carried it out.
Greymatter solves it
Was the request blocked, and by which rule?
Tap to reveal →
Greymatter links the rule that fired and its result to the same request, in the same Console. One place to look.
Greymatter solves it
How fast can you answer?
Tap to reveal →
Look up any person, service, or request ID. The full record comes back at once, with nothing to export.
Greymatter solves it
Judge the evidence yourself

A pile of logs is not an audit trail.

Logging traffic tells you a request happened somewhere in your systems. A forensic record tells you who acted, what they did, and what happened as a result.

Interactive · Try it
Ordinary logs Greymatter forensic record
10.2.●.●● - - [14/Sep/2026:09:41:22] "POST /v2/orders/refund HTTP/1.1" 200 842
connection reset by peer, retrying upstream
10.2.●.●● - - [14/Sep/2026:09:41:24] "GET /health" 200 12
auth token present, no identity resolved
10.2.●.●● - - [14/Sep/2026:09:41:29] "POST /v2/orders/refund HTTP/1.1" 200 842

What it is missing: no named human, no named agent, no reason attached. Answering “who did this” means stitching three other systems together first.

Open the case file

Hand leadership answers, not a stack of files.

Pull up any request and see the person, the action, and the outcome together. Select a field to see how.

A shared login tells you nothing when an incident hits. Greymatter confirms the person at sign-in, and that verified name travels with the request. Greymatter ignores any name a client tries to fake.

You know who to call before the damage spreads.

When an AI agent goes rogue, the blame lands on whoever owns the login. Every hop of the work records the agent and the person it served.

See who asked and what the agent did with it, so the right one answers for it.

Each hop records the service reached and the request made, with credentials scrubbed first. A token becomes a keyed fingerprint that nobody can reverse or replay. Passwords and one-time codes never enter the record.

Follow one session from sign-in to last use, with nothing in the record an attacker could reuse.

Every incident starts with one question: did they get in? Greymatter marks each request allowed, denied, or failed, right beside the rule that decided it.

Answer on the spot, with proof in hand.

Most tracing breaks when one app drops a header. Greymatter carries the verified person from hop to hop and joins each hop's record into one chain. A hop links to its caller only when the caller's verified identity proves it, never on an ID a client chose.

Open one request and see every service it reached, with the person on every hop.

TOP PEOPLE BY HOUR
Last 24 hours View all 198 people →
m●●●●●●.r●●●@example.com
361
p●●●●.s●●●@example.com
342
d●●●.o●●●●@example.com
318
k●●●●.m●●●@example.com
296
s●●.o●●●●●@example.com
271
l●●●.f●●●●●●@example.com
254
o●●●.h●●●●●@example.com
233
n●●●.b●●●●●●@example.com
221
a●●●●.k●●●@example.com
209
l●●●●.s●●●●@example.com
196
01 forensic_event.json
Actor

A shared login tells you nothing when an incident hits. Greymatter confirms the person at sign-in, and that verified name travels with the request. Greymatter ignores any name a client tries to fake.

You know who to call before the damage spreads.

TOP PEOPLE BY HOUR
Last 24 hours
m●●●●●●.r●●●@example.com361
p●●●●.s●●●@example.com342
d●●●.o●●●●@example.com318
k●●●●.m●●●@example.com296
s●●.o●●●●●@example.com271
l●●●.f●●●●●●@example.com254
o●●●.h●●●●●@example.com233
02 forensic_event.json
On behalf of

When an AI agent goes rogue, the blame lands on whoever owns the login. Every hop of the work records the agent and the person it served.

See who asked and what the agent did with it, so the right one answers for it.

Call record
Ran tool get_doc_metadata on docs · Nov 2, 7:59:37 PM
THE REQUEST
WHO
p●●●●.s●●●@example.com
Verified at an earlier hop, carried by Greymatter
WHERE
greymatter-edge
router listener :10936
WHEN
Nov 2, 7:59:37 PM
ANSWER
200 OK
PROTOCOL
Modern · MCP 2026-07-28
03 forensic_event.json
Action

Each hop records the service reached and the request made, with credentials scrubbed first. A token becomes a keyed fingerprint that nobody can reverse or replay. Passwords and one-time codes never enter the record.

Follow one session from sign-in to last use, with nothing in the record an attacker could reuse.

Credential fingerprints
Every token is kept as a keyed fingerprint. Raw values are never stored.
keyk1kindsjwt, session_cookieidentity conflictsnone
fp:k1:01414998…one request
ztfabric · BearerToken · IdToken · OauthHMAC
fp:k1:03cd3105…one request
ztfabric · BearerToken · IdToken · OauthHMAC
fp:k1:03e1c1df…cookie
ztfabric · CodeVerifier · OauthNonce
fp:k1:0f71a2c4…14 requests
jupyterhub · IdToken · BearerToken
fp:k1:22c4e819…38 requests
ai-edge · BearerToken
04 forensic_event.json
Result

Every incident starts with one question: did they get in? Greymatter marks each request allowed, denied, or failed, right beside the rule that decided it.

Answer on the spot, with proof in hand.

TRAILSERVICERESULT1claims-edgeclaims75verified2claims-portal-v1claims75verified3claims-policy-v1claims34linked4claims-review-v1claims15linked5claims-review-v2claims13linked6claims-pricing-v1claims19linked7claims-review-v3claims6linked1jupyterhub-edgejupyterhub63verified2jupyterhub-proxyjupyterhub63verified3jupyter-l●●●●●-m●●●●-e…jupyterhub42verified4jupyterhub-hubjupyterhub21verified
TRAILSERVICERESULT1claims-edgeclaims75verified2claims-portal-v1claims75verified3claims-policy-v1claims34linked4claims-review-v1claims15linked5claims-review-v2claims13linked6claims-pricing-v1claims19linked7claims-review-v3claims6linked1jupyterhub-edgejupyterhub63verified2jupyterhub-proxyjupyterhub63verified3jupyter-l●●●●●-m●●●●-e…jupyterhub42verified4jupyterhub-hubjupyterhub21verified
05 forensic_event.json
Event chain

Most tracing breaks when one app drops a header. Greymatter carries the verified person from hop to hop and joins each hop's record into one chain. A hop links to its caller only when the caller's verified identity proves it, never on an ID a client chose.

Open one request and see every service it reached, with the person on every hop.

Event chain
GET /user/p●●●●●/api/kernelspecs
p●●●●●@example.com · one record per hop
1
jupyterhub-edge200 · 19 ms
Inbound · Listener :10908
TLSv1.3
p●●●●●@example.com · source: jwt
2
jupyterhub-proxy200 · 14 ms
Inbound · Listener :8000
TLSv1.3 · mTLS✓ Edge link verified
p●●●●●@example.com · source: carried
3
jupyterhub-jupyter-p●●●●●200 · 2 ms
Inbound · Listener :8888
TLSv1.3 · mTLS
p●●●●●@example.com · source: carried
1 / 5 · Swipe for next field
How the trail is built

Every hop writes a record. You get one answer.

Follow one request from a person to a model. Greymatter records each hop where it happens and joins the records into one trail.

Person
p●●●●.s●●●
Signed in with a smart card
Know who is behind every call, even deep in your stack.
record
AI agent
claims-assistant
Acting for p●●●●.s●●●
Trace every agent action back to the person who asked.
record
Service
claims-api
No code changes
Get the full trail with no app changes and no credentials kept on file.
record
Model and tools
claims-llm
Disclosure found in response
See who moved sensitive data, and where it went.
record
One chain per request
The hops of a request, joined into one trail you can open in the Console.
Forensic Audit console
Look up any person, request, or hour. Each reader sees only what their access allows.
Your SIEM and log tools
Send the same records through the Greymatter API. Keep the tools you have.
Change ledger
Prove who changed what. Signed checkpoints let a reader verify it.
62%

Faster audits for one customer.

Evidence builds itself while your team works, not in a last-minute scramble. The record is ready the moment you need it.

Plays well with what you run

Your answers, in the tools you already use.

Read it in the Console or through the Greymatter API. The audit agent also writes every request record to its output, so the log collector you already run can keep it.

Built into the platform, not added on. One installation, one dataset, nothing separate to license or maintain.

Elasticsearch
Kibana
Grafana
Prometheus

Have the answer before anyone asks.

Every month without a forensic record is another incident you cannot fully explain.

Start for Free Meet Our Security Experts Browse How to Buy →
Keep digging

Go deeper on the platform behind the forensic record.

Use case Accelerated ATO Learn More → One-pager Greymatter for Every Role Read the One-Pager → Blog From Raw Signals to Meaningful Insight Read the Blog →
Swipe for more
FAQs

Straight answers about forensic auditing, no scrolling through a manual.

Greymatter writes one structured event for every transaction that crosses the platform. The record names who acted, what they did, and what happened. When something goes wrong, the answer is one search away.

A Greymatter forensic event names the actor, the action, and the result in one record. Logs only say that something happened. One shared ID links all hops of the request.

No. Passwords, keys, and tokens never appear in Greymatter logs or records. Greymatter saves each token as a fingerprint, so you can see everywhere the same token was used.

Not in Greymatter tests. A default proxy handled 1,200 requests a second, with 99% of responses under 10 ms and all requests recorded. The record store grows with your traffic.

Greymatter shows the last 24 hours, 7 days, or 30 days on the Forensic Audit page. Changes made by people stay in the change log for 395 days.