---
title: "Composer ⊚"
description: "PD's visual query builder: compose a question about the whole catalog from tappable rules, watch it answer live, save it as a Program, and act on the result in bulk."
category: "app"
keywords: ["composer", "query", "search", "programs", "filters", "bulk", "spectrum"]
last_updated: "2026-09-25"
---

# Composer ⊚

Every serious collector eventually has a question the search box can't hold:
*owned by a mutual, under half an ETH, warm palette, from a project I star.*
Composer is where that question gets built — visually, rule by rule — and
answered live against the whole catalog.

**How:** Open Global Search — the Composer is the special first row.

<svg viewBox="0 0 720 260" role="img" aria-labelledby="composer-anatomy-title" style="width:100%;height:auto;display:block;margin:14px 0">
<title id="composer-anatomy-title">The Composer, annotated: the rule stack you build by tapping, the plain-English readout that reads the query back, the live result count, and the save control that keeps the query as a Program.</title>
<g font-family="'Courier New', Courier, monospace" font-size="13" font-weight="bold">
<rect x="10" y="10" width="700" height="240" fill="var(--stat-bg)" stroke="currentColor" stroke-width="1.5"/>
<text x="30" y="40" fill="currentColor" text-anchor="start" font-size="13">⊚&#xFE0E; COMPOSER</text>
<text x="30" y="84" fill="currentColor" text-anchor="middle" font-size="15">①&#xFE0E;</text>
<rect x="52" y="64" width="120" height="28" rx="4" fill="var(--stat-bg)" stroke="currentColor" stroke-width="1.5"/>
<text x="112" y="83" fill="currentColor" text-anchor="middle" font-size="12">◊ under 0.5</text>
<rect x="182" y="64" width="120" height="28" rx="4" fill="var(--stat-bg)" stroke="currentColor" stroke-width="1.5"/>
<text x="242" y="83" fill="currentColor" text-anchor="middle" font-size="12">⚯&#xFE0E; mutuals</text>
<rect x="312" y="64" width="130" height="28" rx="4" fill="var(--stat-bg)" stroke="currentColor" stroke-width="1.5"/>
<text x="377" y="83" fill="currentColor" text-anchor="middle" font-size="12">◉&#xFE0E; warm palette</text>
<rect x="452" y="64" width="110" height="28" rx="4" fill="var(--stat-bg)" stroke="currentColor" stroke-width="1.5"/>
<text x="507" y="83" fill="currentColor" text-anchor="middle" font-size="12">★&#xFE0E; starred</text>
<text x="30" y="136" fill="currentColor" text-anchor="middle" font-size="15">②&#xFE0E;</text>
<rect x="52" y="116" width="560" height="32" fill="none" stroke="currentColor" stroke-width="1.5"/>
<text x="66" y="137" fill="currentColor" text-anchor="start" font-size="11" font-weight="normal">"Outputs under half an ETH, owned by a mutual, warm, from a project you star"</text>
<text x="30" y="188" fill="currentColor" text-anchor="middle" font-size="15">③&#xFE0E;</text>
<text x="52" y="188" fill="currentColor" text-anchor="start" font-size="14">47 OUTPUTS</text>
<text x="160" y="188" fill="currentColor" text-anchor="start" font-size="12" font-weight="normal">answering live as you build</text>
<text x="30" y="228" fill="currentColor" text-anchor="middle" font-size="15">④&#xFE0E;</text>
<rect x="52" y="208" width="150" height="28" rx="4" fill="var(--stat-bg)" stroke="currentColor" stroke-width="1.5"/>
<text x="127" y="227" fill="currentColor" text-anchor="middle" font-size="12">SAVE PROGRAM</text>
</g>
</svg>

- **①&#xFE0E; The rules** — tappable chips: price bounds, project scope, palette and traits, owner social classes, your own lists.
- **②&#xFE0E; The Readout** — the query read back in plain English, so you always know what you actually asked.
- **③&#xFE0E; The live answer** — the catalog answers as you compose; no run button.
- **④&#xFE0E; Programs** — save the query and it keeps answering with live data whenever you return.

## Where it lives

Open **Global Search** — the Composer is the special first row. It runs on a
deliberately dark stage of its own, whatever colorway the app is wearing.

## Composing

A query is a stack of tappable rules: price bounds (◊), project scope, palette
and trait facets, **owner social classes** (yours ⚭, mutuals ⚯, followed ⚬,
strangers △ — and ⟁ **CARTEL**, wallets holding multiple Outputs of the same
project), and **your own lists** (★ starred, ✛ wishlist, ◰ albums). Scope the
query to a single project and its full **trait vocabulary** (⨝) unlocks as
rules.

**Price rules** read every Output's real history: its **last sale**, **mint
price**, **best offer** or **highest sale** above or below a number (or none at
all); its **ask vs.** the floor, its mint, its last sale or its best offer by a
percentage ("listed 20% under floor"); when it **last sold** (within N days,
over N days ago, never); **times sold**; and how long it's been **held**.

Any rule can be flipped with **NOT**, and tapping the **AND** in front of a rule
switches the whole stack to **OR** — match any one rule instead of all of them.
Sorts go past price and rarity too: **last sale**, **recent sale**, **vs.
floor**, and **rarity per ETH**.

As you build, **the Readout** reads the query back in plain English — the
sentence *is* the query, so you always know exactly what you asked. The match
count pops with every rule, with the ±N bite each rule takes.

## The answer does things

Results are a real gallery, and the gallery acts:

- **Select** (❐) flips into bulk mode — **CART ALL**, **WISHLIST ALL**, or
  **ALBUM ALL** (your choice of a numbered snapshot frozen to this moment, or
  a live Program-backed album that keeps answering).
- **Link** (⧉) mints a share URL that opens the Composer onto the live query —
  send a question, not a screenshot.
- **LIST MINE** puts every match you hold in the List sheet; **OFFER ALL**
  opens the Offer sheet on every match you don't.
- **Σ listed value** rides the live strip — what the whole answer would cost —
  beside the answer's **⌊ floor** and **average ask**.

## Programs

Save a query as a **Program** and it keeps living: each Program wears **the
Spectrum** — the color distribution of its current answer — so a saved
question visibly changes complexion as the market moves under it.

Open a Program's manage row and tap **WATCH**: PD runs it for you every minute,
app open or not, and Pings you when a **new** Output matches — one Ping per
Program, however many landed. What already matched when you turned it on is the
starting line, never a Ping.

And when a query strangles itself to zero matches, **the Loosener** names the
rule doing the strangling — a tappable "frees N" pill — so a dead end is one
tap from alive.

## Further reading

- [Discovery](/docs/app/discovery)
- [Collector Tools](/docs/app/collector-tools)
