> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getthread.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Read the board

> The dispatcher's view of Inbox: build a triage View, switch between Inbox and List modes, and use Beast Mode shortcuts to move through the queue.

export const MarkComplete = ({id, signalDone = false}) => {
  const KEY = "thread-onboarding-completed";
  const read = () => {
    try {
      return JSON.parse(localStorage.getItem(KEY) || "[]");
    } catch (e) {
      return [];
    }
  };
  const [localDone, setLocalDone] = useState(false);
  const done = signalDone || localDone;
  useEffect(() => {
    const sync = () => setLocalDone(read().includes(id));
    sync();
    window.addEventListener("thread-onboarding-updated", sync);
    return () => window.removeEventListener("thread-onboarding-updated", sync);
  }, [id]);
  const toggle = () => {
    if (signalDone) return;
    const list = read();
    const next = list.includes(id) ? list.filter(x => x !== id) : [...list, id];
    try {
      localStorage.setItem(KEY, JSON.stringify(next));
    } catch (e) {}
    setLocalDone(next.includes(id));
    window.dispatchEvent(new Event("thread-onboarding-updated"));
  };
  return <button onClick={toggle} style={{
    width: "100%",
    padding: "0.7rem 1rem",
    marginTop: "1.5rem",
    borderRadius: "8px",
    border: "1px solid " + (done ? "#00B398" : "rgba(128,128,128,0.35)"),
    background: done ? "rgba(0,179,152,0.12)" : "transparent",
    color: done ? "#00B398" : "inherit",
    fontWeight: 600,
    fontSize: "0.95rem",
    cursor: "pointer",
    display: "flex",
    alignItems: "center",
    justifyContent: "center",
    gap: "0.5rem"
  }}>
      <span aria-hidden="true">{done ? "✓" : "○"}</span>
      {done ? "Completed" : "Mark as complete"}
    </button>;
};

export const ByRoleProgress = () => {
  useEffect(() => {
    const KEY = "thread-onboarding-completed";
    const TEAL = "#00B398";
    const BASE = "/start-here/roles/";
    const DONE_ICON = '<svg class="thread-rc-doneicon size-4" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#00B398" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">' + '<path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/>' + '<polyline points="22 4 12 14.01 9 11.01"/></svg>';
    const COURSES = [{
      slug: "technician",
      steps: ["why-thread", "get-around-inbox", "day-one-setup", "daily-workflows", "ai-toolkit", "notifications-and-customers"]
    }, {
      slug: "dispatcher",
      steps: ["why-dispatch-in-thread", "read-the-board", "assign-and-schedule", "ai-for-dispatch"]
    }, {
      slug: "service-ops-manager",
      steps: ["set-up-the-desk", "sla-and-dispatch", "analytics-and-qa", "roll-out-and-adopt"]
    }, {
      slug: "csm-account-manager",
      steps: ["client-intelligence-and-health", "qbrs-and-reporting", "retention-and-expansion"]
    }, {
      slug: "security-compliance-owner",
      steps: ["security-work-in-thread", "data-and-compliance", "security-runbooks"]
    }, {
      slug: "sales-business-development",
      steps: ["the-ai-service-pitch", "quote-and-handoff"]
    }, {
      slug: "msp-owner-leadership",
      steps: ["the-rollout", "outcomes-and-analytics", "scale-ai-service"]
    }, {
      slug: "automation-engineer",
      steps: ["flows-and-intents", "thread-mcp-and-api", "build-with-super-magic"]
    }];
    const COURSE_SLUGS = new Set(COURSES.map(c => c.slug));
    const readLocal = () => {
      try {
        return JSON.parse(localStorage.getItem(KEY) || "[]");
      } catch (e) {
        return [];
      }
    };
    const isDone = (done, id) => done.includes(id);
    const decorate = () => {
      const done = readLocal();
      const scope = document.getElementById("sidebar-content") || document;
      const links = [...scope.querySelectorAll('a[href*="' + BASE + '"]')].filter(a => !a.closest("main"));
      links.forEach(a => {
        const m = (a.getAttribute("href") || "").match(/\/start-here\/roles\/([^/?#]+)\/([^/?#]+)/);
        if (!m) return;
        if (!COURSE_SLUGS.has(m[1])) return;
        const id = m[1] + "/" + m[2];
        const d = isDone(done, id);
        const has = a.querySelector(".thread-rc-check");
        if (d && !has) {
          const s = document.createElement("span");
          s.className = "thread-rc-check";
          s.textContent = "✓ ";
          s.style.color = TEAL;
          s.style.fontWeight = "700";
          a.insertBefore(s, a.firstChild);
        } else if (!d && has) {
          has.remove();
        }
      });
      COURSES.forEach(course => {
        const li = scope.querySelector('li[id="' + BASE + course.slug + '"]');
        if (!li) return;
        const row = li.querySelector(":scope > button") || li.querySelector(":scope > a") || li.firstElementChild;
        if (!row) return;
        const nameSpan = [...row.querySelectorAll("span")].find(s => s.textContent.trim() && !s.classList.contains("thread-rc-coursecheck"));
        if (!nameSpan) return;
        const allDone = course.steps.length > 0 && course.steps.every(s => isDone(done, course.slug + "/" + s));
        const has = nameSpan.querySelector(".thread-rc-coursecheck");
        if (allDone && !has) {
          const s = document.createElement("span");
          s.className = "thread-rc-coursecheck";
          s.setAttribute("aria-hidden", "true");
          s.style.display = "inline-flex";
          s.style.alignItems = "center";
          s.style.verticalAlign = "-0.2em";
          s.style.marginRight = "0.35em";
          s.innerHTML = DONE_ICON;
          nameSpan.insertBefore(s, nameSpan.firstChild);
        } else if (!allDone && has) {
          has.remove();
        }
      });
    };
    decorate();
    const iv = setInterval(decorate, 600);
    window.addEventListener("thread-onboarding-updated", decorate);
    window.addEventListener("storage", decorate);
    return () => {
      clearInterval(iv);
      window.removeEventListener("thread-onboarding-updated", decorate);
      window.removeEventListener("storage", decorate);
    };
  }, []);
  return null;
};

<ByRoleProgress />

Everything you dispatch flows through **Views** — filtered, real-time slices of the board. A tech lives in one or two Views; a dispatcher lives across all of them. This lesson gets you reading the whole board fast, so you can see what's arriving, what's aging, and what's at risk without clicking through ticket by ticket.

## Views are the board

[Views](/inbox/views-and-insights) group threads with filters and update in real time. Teams build them around their structure — a pod per client, T1/T2/T3 tiers, chat-only squads, or a single triage queue. As a dispatcher your most important View is usually a **triage View**: the front door where un-owned, newly-arrived work waits to be routed.

A useful set of dispatcher Views to build (or ask an admin to build):

| View                    | Filter idea                                                  | Why you watch it                                           |
| ----------------------- | ------------------------------------------------------------ | ---------------------------------------------------------- |
| **Triage / Unassigned** | Owner = blank; Magic Agent = *Disengaged* or *Never engaged* | New work waiting for a routing decision.                   |
| **Needs response**      | Last sender = *Contact*                                      | The customer replied last — XLA risk is building here.     |
| **Magic in progress**   | Magic Agent = *Engaged*                                      | The Triage Agent has it; don't route these yet.            |
| **Poor sentiment**      | Sentiment `<` 40                                             | Frustrated customers who may need a senior tech or a call. |

Only admins (or a View's creator) can build and edit shared Views; you can layer your own personal **sub-filters** onto any View to slice it further — and sub-filters are visible only to you.

<Tip>
  Group your dispatcher Views under an **Inbox Team** so they travel together and everyone who dispatches gets the same board automatically. See [Inbox Teams](/inbox/inbox-teams) — adding a member to a Team grants access to all of that Team's Views at once, with no per-View assignment.
</Tip>

## Two display modes — pick the dispatcher's one

Every View can render two ways, and you switch with the **Display** button in the top-right of any View:

* **Inbox mode** — a familiar conversation-first layout, ideal for a tech switching fast between threads they own.
* **List mode** — a structured, scannable table of threads. **This is the dispatcher's mode.** It's built for people managing many threads at once: sort by priority or age, scan owners and statuses down a column, and spot the outliers in a glance.

From the same **Display** control you also set the **thread state** — *All*, *Active* (not in a done state), or *Done* — and your sort order. For triage, run List mode, Active only, sorted by priority or age.

### Insights — the board as a chart

Open **Insights** (the graph icon, top-right of a View) to see that View's threads broken down by **status, priority, or owner**. It's the fastest way to answer "how is load actually distributed right now?" — click a segment to drill into those threads, click again to zoom out. Use it to catch a tech carrying a lopsided share of the priority-1 work before it becomes a fire.

## Beast Mode — move without the mouse

The board moves fast, so keep your hands on the keys. **Beast Mode** shortcuts let you fly through the queue:

* **`⌘K`** / **`⌘J`** — jump to the **next** / **previous** conversation.
* **`⌘A`** — toggle between **Active** and **Done**.
* **`Ctrl+N`** — start a **new thread**; **`⌘⇧L`** — open **Link Threads**; **`⌘R`** — refresh.

The full keyboard-shortcut reference lives in the account menu under **Beast Mode Shortcuts**. Learning even the first two turns "where's my ticket?" into a two-keystroke answer.

<Note>
  **Bolded Views have unread activity.** The left rail bolds any View with new notifications, so a glance down it tells you where the board is moving before you even open anything.
</Note>

<MarkComplete id="dispatcher/read-the-board" />

## Next

You can read the whole board at a glance. Now put work on the right desks — and keep it there.

<Card title="Assign and schedule" icon="calendar-check" href="/start-here/roles/dispatcher/assign-and-schedule">
  Availability, auto-dispatch profiles, Planner swimlanes, and XLA timers.
</Card>


## Related topics

- [Dispatcher](/start-here/roles/dispatcher.md)
- [Why dispatch is different in Thread](/start-here/roles/dispatcher/why-dispatch-in-thread.md)
- [AI for dispatch](/start-here/roles/dispatcher/ai-for-dispatch.md)
