Back // guide · tools

CoreScope packet filters

Guide · web UI only · updated June 2026

CoreScope’s Packet feed has a Wireshark-style filter language. This is the whole thing — every field, operator and value — built to copy and paste.

Where the filter lives

Open CoreScope and go to the Packets view. The long box at the top is the filter — type an expression and the table narrows as you go. Five ways to drive it:

  • Type it. Autocomplete pops as you go — / to move, Tab or Enter to accept, Esc to dismiss.
  • ⓘ Help opens the built-in syntax card (fields, operators, examples).
  • Right-click any cell in the packet table → “Filter by this value” adds a matching clause (joined with &&).
  • ★ Saved holds the built-in starters plus anything you save.
  • Share a view by appending ?filter=… to the page URL — the whole expression travels in the link.

Next to the expression box are two quick fields that don’t use this language: Hash (matches a hex hash prefix) and Node name (sender or anywhere in the path). Handy for a fast lookup; everything else below is the expression box.

// syntax

The shape of a filter

A filter is field · operator · value, chained with boolean logic.

field        operator     value
snr          >            5
type         ==           ADVERT
payload.name contains     "Gilroy"
age          <            1h

# chain them
type == ADVERT && snr > 5          && = and
type == ACK || type == TRACE        || = or
!type == ACK                       ! = not
( type==ADVERT || type==ACK ) && snr>0   ( ) group
transport                            bare field = "has a value"
  • Combine clauses with && (and), || (or), ! (not), and ( ) to group. The words and / or / not are not recognized — use the symbols.
  • && binds tighter than ||, so a && b || c means (a && b) || c. Add parentheses when in doubt.
  • A bare field with no operator is a “has a value” test — transport or payload.flags.hasLocation.
  • Strings are case-insensitive. !type == ADVERT reads as not (type == ADVERT).
// operators

Operators

Type the operator exactly as shown — symbols and lowercase words.

OperatorUseType it like
==Equal (case-insensitive for text; alias-aware for type/route)type == ADVERT
!=Not equaltype != ACK
>Greater than (numbers)snr > 5
<Less than (numbers)rssi < -90
>=Greater or equalhops >= 2
<=Less or equalsize <= 100
containsSubstring anywhere (case-insensitive)payload.name contains "Gilroy"
starts_withText prefixhash starts_with "8a91"
ends_withText suffixhash ends_with "ff"
afterDatetime / epoch aftertime after "2026-01-01"
beforeDatetime / epoch beforetime before "2026-12-31"
betweenTwo values, space-separated — dates or numberssnr between 4 9
inAny of a parenthesized, comma-separated listiata in ("MSN","ORD")

No wildcards or regex. For partial text use contains / starts_with / ends_with.

// fields

Fields

Everything you can filter on, straight from the parser.

FieldWhat it isExample
typePayload type (see values below)type == ADVERT
routeRoute type (see values below)route == DIRECT
transportTrue if route is TRANSPORT_FLOOD / TRANSPORT_DIRECTtransport
hashPacket hash (hex)hash starts_with "8a91"
rawFull raw packet hexraw contains "ffff"
sizeTotal packet size in bytessize > 100
snrSignal-to-noise ratio (dB)snr > 5
rssiReceived signal strength (dBm)rssi > -90
hopsNumber of hops in the pathhops >= 2
observerObserver station nameobserver == "Lake Edge"
observer_idObserver pubkey / idobserver_id starts_with "a1"
observer_iata · iataObserver IATA region code (iata is an alias)iata == "MSN"
observationsHow many times this packet was seenobservations > 3
pathHop path, arrow-joinedpath contains "Gilroy"
payload_bytesPayload size in bytes (size − 2 header)payload_bytes > 20
payload_hexPayload bytes as hex (raw without header)payload_hex starts_with "10"
time · timestampPacket timestamp (epoch ms)time after "2026-01-01"
ageSeconds since seen — pair with a durationage < 1h
code1 · code2Transport route codes (hex) — on TRANSPORT_FLOOD/DIRECTcode1 == "AABB"
payload.nameDecoded node name (adverts)payload.name contains "Repeater"
payload.lat · payload.lonDecoded coordinatespayload.lat > 43
payload.textDecoded message text (channel / DM)payload.text contains "weather"
payload.channelDecoded channel namepayload.channel == "General"
payload.channelHashDecoded channel hashpayload.channelHash == "1a"
payload.senderDecoded sender namepayload.sender contains "KJ6"
payload.flags.repeaterAdvert flag — repeater rolepayload.flags.repeater == true
payload.flags.roomAdvert flag — room serverpayload.flags.room
payload.flags.hasLocationAdvert carries a locationpayload.flags.hasLocation
payload.<key>Any decoded field by dot pathpayload.battery < 20
// values

type values

Use a canonical name, or one of the friendly aliases — both work with == and !=.

# canonical (type == <one of>)
REQ   RESPONSE   TXT_MSG   ACK   ADVERT   GRP_TXT   GRP_DATA
ANON_REQ   PATH   TRACE   MULTIPART   CONTROL   RAW_CUSTOM
Type these aliases……and you get
requestREQ
responseRESPONSE
dm · direct msgTXT_MSG
ackACK
advertADVERT
channel · channel msgGRP_TXT
group dataGRP_DATA
anon reqANON_REQ
pathPATH
traceTRACE
multipartMULTIPART
controlCONTROL
raw · customRAW_CUSTOM

Aliases with a space need quotes: type == "direct msg". Single words don’t: type == advert.

// values

route values

# route == <one of>
FLOOD   DIRECT   TRANSPORT_FLOOD   TRANSPORT_DIRECT

# shorthand aliases
t_flood     TRANSPORT_FLOOD
t_direct    TRANSPORT_DIRECT

Or skip the names: transport is true for both transport routes (TRANSPORT_FLOOD and TRANSPORT_DIRECT).

// time

Durations & datetimes

Durations attach a unit to a number — use them with age and the numeric operators (< > <= >=):

s seconds   m minutes   h hours   d days   w weeks

age < 30m            # seen in the last half hour
age > 2h             # older than two hours
age > 5m && age < 1h  # a window (chain two clauses)

Datetimes go with after / before / between on the time field — an ISO date in quotes, or raw epoch milliseconds:

time after "2026-01-01"
time before "2026-06-01T12:00"
time between "2026-01-01" "2026-02-01"
// rules

Quoting & gotchas

  • Quote anything with a space or lowercase letters: observer == "Lake Edge", payload.text contains "good morning".
  • Numbers and ALL-CAPS names can skip quotes: snr > 5, type == ADVERT. Both "ADVERT" and ADVERT work.
  • Negatives and decimals are fine: rssi < -90, snr >= 5.5.
  • A missing field fails every comparison — including !=. A packet with no snr won’t match snr != 0.
  • contains & friends are string ops — their value is always quoted.
  • Errors are silent-safe: a half-typed or invalid expression simply shows everything until it parses.
// starters

Built-in saved filters

Already in the ★ Saved dropdown — good templates to tweak.

NameExpression
Adverts onlytype == ADVERT
Channel traffictype == GRP_TXT
Direct messagestype == TXT_MSG
Strong signalsnr > 5
Multi-hophops > 1
Repeater advertstype == ADVERT && payload.flags.repeater == true
Recent (last 5 min)age < 5m
// cookbook

Copy-paste recipes

Real filters for real questions. Swap the names and numbers.

You want…Filter
Repeater adverts onlytype == ADVERT && payload.flags.repeater
Room-server advertstype == ADVERT && payload.flags.room
Adverts with a location fixtype == ADVERT && payload.flags.hasLocation
One node by namepayload.name contains "Lake Edge"
Chatter on one channeltype == GRP_TXT && payload.channel == "General"
Strong & closesnr > 6 && rssi > -85
Direct (non-flooded) trafficroute == DIRECT
Transport-routed onlytransport
Long hauls (3+ hops)hops >= 3
Seen by one regioniata == "MSN"
Seen by any of several regionsiata in ("MSN","ORD","MKE")
Last 10 minutesage < 10m
Big packetssize > 100
One observer’s advertsobserver == "Lake Edge" && type == ADVERT
A hash prefixhash starts_with "8a91"
Everything except ACKstype != ACK
Adverts or traces, decent signal(type == ADVERT || type == TRACE) && snr > 0
A transport codecode1 == "AABB"

Built a good one? Hit ★ Save to keep it, or copy the URL (it carries ?filter=…) to share it.

Found a sharp filter?

Drop it in #meshcore — good queries spread fast.