Map filter examples
Recipes to start from. Each one is a working filter over the Lantern Coast, shown as the builder view you click together and as the expression view you can copy and paste. Choose which you’d like to see; the Guide remembers your choice on every page.
Each caption says how many nodes the filter shows out of how many are in scope. Drag the slider to see which nodes the filter hides.
Common recipes
Only people and places
Keep the player characters, the NPCs and the locations. Ships, clues, scenes and groups are hidden.
Only people and places
IN takes a list, so one condition covers every type you want to keep.
![The builder view of Include node.type IN ["player_character", "npc", "location"]](/guide/7416427393768979592c131e042be4c2dd14e73ad4cd27f5babd488e9463edcc.webp)
node.type IN ["player_character", "npc", "location"] ![Before, with the filters off: the map shows all 32 nodes. Filters: Include node.type IN ["player_character", "npc", "location"].](/guide/e09b7fb732d6549cc10ec78776a2de02ebe283001d7ae3ad73e4cbffb2b46a9f.webp)
![After: Include node.type IN ["player_character", "npc", "location"]. Shows 15 of 32 nodes.](/guide/842e7db9f4a5a7be7c9e91953a8f29621142e7425b3c0ddbc7a4c7e9806bd6cd.webp)
Everything tagged “Act 1”
Everything tagged Act 1
HAS tests for one whole tag, so this keeps every node tagged Act 1.

node.tags HAS "Act 1" 

Hide the player characters
This one is an Exclude: the map shows everything in scope except what matches.
Hide the player characters
Maren Holt and Tamsin Reeve are hidden. Player characters don’t draw a node of their own on the map, so the caption still counts every node and the visible change is small: the connections to and from them go. Every other node stays.

node.type = "player_character" 

Clues not yet given
Clues not yet given
A custom-field condition is false for a node of another type, so only clues can match. The players haven’t found Cut bell-rope, Lamp-oil receipts, Chalk marks on the quay or the Smuggler’s chart.

clue.given = "not_given" 

Locations the party has visited
Locations the party has visited
Port Varrow, the Customs Warehouse, The Salted Anchor and The Teeth Lighthouse are marked visited.

location.visited = "visited" 

Everything around one character
The node itself, plus every neighbour.
Everything around Ines Calloway
connected_to tests the node at the far end of a connection, so Ines Calloway herself needs her
own condition. Joined with OR, you get Ines and everyone and everything she’s connected to.
A name matches every node with that name. To pin the filter to one node, add a Node condition in the builder, pick the node, and copy the expression it prints, which names the node by id.

node.name = "Ines Calloway" OR connected_to(node.name = "Ines Calloway") 

Loose ends
Loose ends: nodes with no connections
Nodes with no connections at all: Old Hob and The Sandbar.

node.connection_count = 0 

Hubs
Hubs: five or more neighbours
Neighbour count counts distinct neighbours, so two connections to the same node count once. The busiest places on the coast, such as Port Varrow, are the ones left.

node.neighbor_count >= 5 

Nodes not yet linked to any story beat
Nodes not yet linked to a story beat
IS EMPTY is true for a node with no story beats. Most of the map is still waiting for one.

node.story_beats IS EMPTY 

Advanced recipes
The nodes that at least three clues point at
Suppose you want the place the investigation keeps leading back to, along with the clues that point at it and everything those clues touch. Written in three named parts, it reads:
X = connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3)
C = node.type = "clue" AND connected_to(X, via: type = "Points to", direction: "out")
Include: C OR connected_to(C) - X is every node that at least three clues point at: it has at least three clue neighbours reached by an incoming “Points to” connection. In the fixture that’s the Chapel of St. Brine.
- C is the clues that point at an X.
- The Include keeps C itself, and every neighbour of a clue in C.
The expression view takes one expression, so the parts are written inside each other. The builder shows the same nesting.
The headline: what at least three clues point at, those clues, and their neighbours
The map shows the Chapel and its four clues, and the clues’ other neighbours: the Customs Warehouse, The Kestrel and the Anonymous note.

node.type = "clue" AND connected_to(connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3), via: type = "Points to", direction: "out") OR connected_to(node.type = "clue" AND connected_to(connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3), via: type = "Points to", direction: "out")) 

This example uses exactly the three-step relationship limit: the Include’s connected_to(C),
then C’s connected_to(X), then X’s connected_to(clue). A filter can’t go one step deeper.
The contrast: start from the target, not the clues
What if the last part started from X instead of C?
Include: X OR connected_to(X) The contrast: the same target nodes and their own neighbours
Now the map shows the Chapel and its own neighbours: the four clues, Ines Calloway, Father Mott, Keeper Wren and the midnight vigil.

connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3) OR connected_to(connected_to(node.type = "clue", via: type = "Points to", direction: "in", at_least: 3)) 

The two maps differ because connected_to always starts from the node it’s applied to. In the
headline, it starts from the clues, so you see the clues’ other neighbours: the Customs
Warehouse, The Kestrel and the Anonymous note appear only there. In the contrast, it starts from
the target, so the Chapel’s non-clue neighbours appear only here: Ines Calloway, Father Mott,
Keeper Wren and the midnight vigil. The headline shows 8 nodes and the contrast 9.
Clues that point nowhere
Clues that point nowhere
true matches any neighbour, and via narrows the test to “Points to” connections leaving the
clue. The Chalk marks and the Anonymous note have none. “Found in” and “Contradicts” connections
don’t count.

node.type = "clue" AND NOT connected_to(true, via: type = "Points to", direction: "out") 

NPCs at a place the party has visited
NPCs at a place the party has visited
The NPC has to be connected to a location whose Visited field says visited: Harbourmaster Corra Vane, Clerk Quill and Keeper Wren.

node.type = "npc" AND connected_to(location.visited = "visited") 

Include and Exclude together
Hide everything tagged “red herring”, unless it’s connected to a given clue.
Hide red herrings, unless a given clue is connected
Include keeps clues, NPCs and locations. Exclude then removes anything tagged red herring that has no given clue next to it. Ysolde Marsh and The Salted Anchor go; the Anonymous note stays, because it’s connected to The Drowned Bell, which the players have found.
![The builder view of Include node.type IN ["clue", "npc", "location"]; Exclude node.tags HAS "red herring" AND NOT connected_to(clue.given = "given")](/guide/689ca90a70f5f77d0b170b1e31ae53b2a9349df5e38e926157cda23e4d1b6ee0.webp)
node.type IN ["clue", "npc", "location"] node.tags HAS "red herring" AND NOT connected_to(clue.given = "given") ![Before, with the filters off: the map shows all 32 nodes. Filters: Include node.type IN ["clue", "npc", "location"]; Exclude node.tags HAS "red herring" AND NOT connected_to(clue.given = "given").](/guide/e09b7fb732d6549cc10ec78776a2de02ebe283001d7ae3ad73e4cbffb2b46a9f.webp)
![After: Include node.type IN ["clue", "npc", "location"]; Exclude node.tags HAS "red herring" AND NOT connected_to(clue.given = "given"). Shows 21 of 32 nodes.](/guide/41d4b6f2c39af73a86479bba6b8916af75b9999ae509839644886e1125dc6ccb.webp)
Ships by crew, seaworthiness and port of call
Large crews that aren't seaworthy and call at Port Varrow
All three conditions must hold: a crew of 50 or more, not seaworthy, and Port Varrow among the ports of call. Only The Great Cormorant qualifies.

ship.crew >= 50 AND ship.seaworthy = false AND ship.ports_of_call HAS "Port Varrow" 
