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

# Projects & release planner

> Turn a track, EP, or album into an AI-assisted release campaign blueprint — phases, tasks, pitch surfaces, and timing — grounded in your catalog, artist context, and release goals.

export const SurfaceMatrix = ({feature}) => {
  const FEATURE_SURFACES = {
    aria: {
      web: {
        available: true,
        detail: "Full surface — dashboard home"
      },
      telegram: {
        available: true,
        detail: "@AriaMusicBizBot, public"
      },
      claude: {
        available: true,
        detail: "Via the Patchline plugin"
      },
      mcp: {
        available: true,
        detail: "Product tools via OAuth 2.0 / PKCE"
      }
    },
    "catalog-import": {
      web: {
        available: true,
        detail: "Paste URL in dashboard"
      },
      telegram: {
        available: true,
        detail: "Paste URL to @AriaMusicBizBot"
      },
      claude: {
        available: true,
        detail: "Through Aria plugin actions"
      },
      mcp: {
        available: true,
        detail: "analyze_url tool"
      }
    },
    "sonic-analysis": {
      web: {
        available: true,
        detail: "Auto-runs on upload"
      },
      telegram: {
        available: true,
        detail: "Paste track URL to @AriaMusicBizBot"
      },
      claude: {
        available: true,
        detail: "Through Aria plugin"
      },
      mcp: {
        available: true,
        detail: "get_audio_features / get_song_intelligence"
      }
    },
    "release-planner": {
      web: {
        available: true,
        detail: "Dashboard → Projects"
      },
      telegram: {
        available: false,
        detail: "Conversation only, no full rollout view"
      },
      claude: {
        available: true,
        detail: "Through Aria plugin"
      },
      mcp: {
        available: true,
        detail: "get_releases tool"
      }
    },
    storefront: {
      web: {
        available: true,
        detail: "Dashboard → Store + public /store/[slug]"
      },
      telegram: {
        available: false,
        detail: "Not a Telegram surface"
      },
      claude: {
        available: false,
        detail: "Not yet exposed"
      },
      mcp: {
        available: false,
        detail: "Not yet exposed"
      }
    }
  };
  const f = FEATURE_SURFACES[feature];
  if (!f) return null;
  const surfaces = [{
    key: "web",
    label: "Web dashboard",
    icon: "🖥"
  }, {
    key: "claude",
    label: "Claude",
    icon: "✨"
  }, {
    key: "mcp",
    label: "MCP",
    icon: "⚡"
  }];
  return <table style={{
    width: "100%",
    marginTop: "12px",
    marginBottom: "12px"
  }}>
      <thead>
        <tr>
          <th style={{
    textAlign: "left",
    padding: "8px 12px",
    borderBottom: "1px solid rgba(255,255,255,0.10)"
  }}>Surface</th>
          <th style={{
    textAlign: "left",
    padding: "8px 12px",
    borderBottom: "1px solid rgba(255,255,255,0.10)"
  }}>Status</th>
          <th style={{
    textAlign: "left",
    padding: "8px 12px",
    borderBottom: "1px solid rgba(255,255,255,0.10)"
  }}>Notes</th>
        </tr>
      </thead>
      <tbody>
        {surfaces.map(s => {
    const v = f[s.key];
    return <tr key={s.key}>
              <td style={{
      padding: "8px 12px",
      borderBottom: "1px solid rgba(255,255,255,0.05)"
    }}>
                <span style={{
      marginRight: "8px"
    }}>{s.icon}</span>
                {s.label}
              </td>
              <td style={{
      padding: "8px 12px",
      borderBottom: "1px solid rgba(255,255,255,0.05)"
    }}>
                {v.available ? <span style={{
      color: "#22C55E",
      fontWeight: 600
    }}>✓ Available</span> : <span style={{
      color: "#71717A"
    }}>— Not available</span>}
              </td>
              <td style={{
      padding: "8px 12px",
      borderBottom: "1px solid rgba(255,255,255,0.05)",
      fontSize: "13px",
      color: "inherit"
    }}>
                {v.detail}
              </td>
            </tr>;
  })}
      </tbody>
    </table>;
};

export const MCPToolCard = ({name}) => {
  const t = MCP_TOOLS[name];
  if (!t) {
    return <div style={{
      padding: "12px",
      border: "1px dashed #f87171",
      borderRadius: "8px"
    }}>
        Unknown MCP tool: <code>{name}</code>
      </div>;
  }
  const badges = {
    Onboarding: "#00E6E2",
    Dispatch: "#818CF8",
    Catalog: "#22D3EE",
    Audience: "#2DD4BF",
    Artists: "#60A5FA",
    Roster: "#60A5FA",
    Releases: "#C084FC",
    Playlists: "#4ADE80",
    "Smart Links": "#FACC15",
    Storefront: "#F59E0B",
    "Music Data": "#FB923C",
    "AI Generation": "#F472B6",
    "Asset Upload": "#A78BFA",
    Projects: "#E879F9"
  };
  const color = badges[t.category] ?? "#A1A1AA";
  return <div style={{
    padding: "16px",
    borderRadius: "12px",
    border: "1px solid rgba(255,255,255,0.10)",
    background: "rgba(255,255,255,0.03)",
    marginBottom: "12px"
  }}>
      <div style={{
    display: "flex",
    justifyContent: "space-between",
    alignItems: "center",
    gap: "12px",
    marginBottom: "6px"
  }}>
        <code style={{
    fontFamily: "var(--font-family-mono)",
    fontSize: "15px",
    fontWeight: 600
  }}>
          {name}
        </code>
        <span style={{
    fontSize: "11px",
    fontWeight: 600,
    padding: "2px 10px",
    borderRadius: "999px",
    border: `1px solid ${color}40`,
    background: `${color}1A`,
    color: color
  }}>
          {t.category}
        </span>
      </div>
      {t.callFirst && <div style={{
    fontSize: "11px",
    color: "#00E6E2",
    fontWeight: 600,
    marginBottom: "6px"
  }}>
          ★ Call this FIRST
        </div>}
      <div style={{
    fontSize: "14px",
    lineHeight: 1.5,
    color: "inherit"
  }}>{t.summary}</div>
    </div>;
};

export const AriaPromptCard = ({prompt, surface = "web"}) => {
  const surfaces = {
    web: {
      href: "https://patchline.ai/dashboard",
      label: "Try in dashboard"
    },
    telegram: {
      href: "https://t.me/AriaMusicBizBot",
      label: "Try in Telegram"
    },
    claude: {
      href: "https://patchline.ai/claude",
      label: "Try in Claude"
    },
    mcp: {
      href: "https://patchline.ai/mcp",
      label: "Install MCP first"
    }
  };
  const s = surfaces[surface] ?? surfaces.web;
  return <div style={{
    display: "flex",
    justifyContent: "space-between",
    alignItems: "center",
    gap: "16px",
    padding: "12px 16px",
    marginBottom: "12px",
    borderRadius: "10px",
    border: "1px solid rgba(255,255,255,0.10)",
    background: "rgba(255,255,255,0.03)"
  }}>
      <code style={{
    fontFamily: "var(--font-family-mono)",
    fontSize: "14px",
    color: "inherit",
    flex: 1
  }}>
        "{prompt}"
      </code>
      <a href={s.href} target="_blank" rel="noopener noreferrer" style={{
    fontSize: "12px",
    fontWeight: 600,
    padding: "6px 12px",
    borderRadius: "999px",
    background: "linear-gradient(92deg, #00E6E2, #0068FF)",
    color: "#FFFFFF",
    textDecoration: "none",
    whiteSpace: "nowrap"
  }}>
        {s.label} →
      </a>
    </div>;
};

export const TierBadge = ({tier}) => {
  const styles = {
    free: {
      label: "Free",
      color: "#A1A1AA"
    },
    starter: {
      label: "Starter+",
      color: "#00E6E2"
    },
    pro: {
      label: "Pro+",
      color: "#0068FF"
    },
    scale: {
      label: "Scale+",
      color: "#7A5BFF"
    },
    enterprise: {
      label: "Enterprise",
      color: "#FF7A59"
    },
    all: {
      label: "All plans",
      color: "#22C55E"
    }
  };
  const t = styles[tier?.toLowerCase()] ?? styles.all;
  return <span style={{
    display: "inline-flex",
    alignItems: "center",
    gap: "4px",
    padding: "2px 10px",
    borderRadius: "999px",
    border: `1px solid ${t.color}40`,
    background: `${t.color}1A`,
    color: t.color,
    fontSize: "12px",
    fontWeight: 600,
    fontFamily: "var(--font-family-mono)",
    verticalAlign: "middle"
  }}>
      {t.label}
    </span>;
};

export const AICallout = ({page}) => {
  const slug = page ?? "";
  const mdUrl = `https://docs.patchline.ai${slug}.md`;
  return <div style={{
    marginTop: "32px",
    padding: "16px 20px",
    borderRadius: "12px",
    border: "1px solid rgba(0,230,226,0.25)",
    background: "linear-gradient(135deg, rgba(0,230,226,0.08), rgba(0,104,255,0.05))",
    color: "inherit",
    fontSize: "14px",
    lineHeight: 1.6
  }}>
      <strong style={{
    display: "block",
    marginBottom: "6px",
    color: "#00E6E2"
  }}>
        For AI agents reading this page
      </strong>
      The canonical machine-readable version of this page is at{" "}
      <a href={mdUrl}>
        <code>{mdUrl}</code>
      </a>
      . For product actions, connect to{" "}
      <code>www.patchline.ai/api/mcp/v1</code>
      {" "}and call MCP <code>tools/list</code> for the current tool schema.
      Rules for navigating these docs:{" "}
      <a href="https://docs.patchline.ai/AGENTS.md">
        <code>docs.patchline.ai/AGENTS.md</code>
      </a>
      .
    </div>;
};

A **Project** in Patchline is a single, EP, or album release campaign —
the persistent home for everything that has to happen for that release to
land. Aria generates a campaign blueprint for you: phases, tasks, dates,
and Patchline surfaces grounded in your artist's stage, catalog, audience,
and release goal.

<TierBadge tier="all" />   Free tier sees a basic manual project.
Starter and up unlock Aria-generated campaigns.

## What a Project is

When you click **+ Start a project**, Patchline asks four questions:

| Field            | Options                       | Why Aria needs it                                                          |
| ---------------- | ----------------------------- | -------------------------------------------------------------------------- |
| **Artist**       | Any artist on your profiles   | Anchors the campaign to that artist's audience, catalog history, and stage |
| **Format**       | Single · EP · Album           | Shapes phase weighting (an album campaign is not a single rollout)         |
| **Release path** | Self-releasing · With a label | Decides which tasks you own vs. which a label partner is handling          |
| **Project name** | The release title             | Threads it through pitches, smart links, fan messaging                     |

That's the entire intake. From there, Aria builds the first draft.

## What Aria builds

A generated campaign is broken into **six phases**, ordered by how far
from release day each task lands:

| Phase              | Window (relative to release) | What lives here                                                       |
| ------------------ | ---------------------------- | --------------------------------------------------------------------- |
| **Pre-production** | day -75 to -46               | Master, artwork, video assets, distribution prep                      |
| **Planning**       | day -45 to -22               | Strategy, pitch list, smart-link build, audience targeting            |
| **Pre-release**    | day -21 to -8                | Editorial submissions, pre-saves, teaser content, curator outreach    |
| **Announcement**   | day -7 to -1                 | Release-week posts, fan-email send, momentum building                 |
| **Release**        | day 0 to +7                  | Release-day execution, storefront, first-week response                |
| **Post-release**   | day +8 to +42                | TikTok push, follow-up pitches, post-mortem, momentum to next release |

Each phase has a quota of tasks. Aria picks tasks from a curated library
of release actions and adapts them to *your* artist and *your* release.

### Aria chooses the right runway at generation time

Tell Aria the release date and the generated blueprint is shaped around
the time you have:

| Runway           | Days to release   | What changes                                       |
| ---------------- | ----------------- | -------------------------------------------------- |
| **Extended**     | 84+               | Full pre-production through post-release           |
| **Standard**     | 43–84             | Balanced, the textbook campaign arc                |
| **Short**        | 22–42             | Skips deep pre-prod, leans pre-release             |
| **Urgent**       | 8–21              | Small pre-prod, heavy pre-release + post-release   |
| **Release-week** | 0–7               | Almost no pre-prod, all release-day + post-release |
| **Already live** | past release date | Diagnostics + post-release recovery only           |

You don't have to know any of this. You set a date; Aria picks the
runway and weights the phases accordingly when it generates the plan.
If your release date changes later, review or regenerate the campaign
instead of assuming every task should shift automatically.

## How Aria grounds the blueprint

Patchline's campaign planner uses a curated release-planning system:
phase definitions, runway buckets, task templates, Patchline link
surfaces, and artist-context inputs. When Aria builds a campaign, it
matches that system to *your specific situation*:

* Your artist's stage and recent momentum.
* Your release format (single, EP, or album).
* Your goal for the release.
* Your runway: how long you have before release day.
* The Patchline surfaces you plan to use, such as smart links, pitch
  links, media kits, and the Music Store.

The result is a blueprint. It is meant to give you a strong starting
structure, then leave room for your own taste, relationships, timing, and
judgment.

## What's in a generated task

Every task in your campaign is more than a checkbox. It carries:

* **Phase · due date** — where it lives in the timeline.
* **Channel** — streaming, social, community, playlist-pitching,
  publicity, ads, creative, operations, analytics.
* **Why it's here** — the planning rationale behind the task.
* **What Aria can help with** — drafting copy, preparing pitch notes,
  or opening the right Patchline surface when that action exists.
* **Patchline surface link** — if the task wires into a Patchline
  feature (a Smart Link, Pitch Link, Drop Link, Media Kit, Store Link,
  Briefing Link), it's deep-linked so you can act in one click.

## Where it lives

<SurfaceMatrix feature="release-planner" />

* **Web:** Sidebar → **Projects** → **+ Start a project**
* **Aria:** *"Start a project for \[track]"* — runs the same intake in
  chat, generates the campaign, asks if you want to commit it.
* **Claude plugin:** Same flow, native to Claude. The plugin includes a
  progressive interview that walks the project setup with you step by
  step.
* **MCP:** Programmatic access via the product MCP — your AI tool can
  read release and campaign context through `get_releases`.

## Quick start

<Steps>
  <Step title="Pick the artist & track">
    The artist needs to be in your [profiles](/artists/roster). The
    track is much better when it's in your [catalog](/catalog/upload)
    with an AI-readable description attached — Aria uses it to ground
    the sonic positioning.
  </Step>

  <Step title="Start the project">
    Sidebar → **Projects** → **+ Start a project**. Pick the
    artist, choose Single/EP/Album, choose self-releasing or with a
    label, name the project. Or just ask Aria:

    <AriaPromptCard prompt="Start a project for my new single 'Sleeper' — target date in 6 weeks, self-releasing." />
  </Step>

  <Step title="Set your release date & goal">
    Aria asks: launching, growing existing traction, or sustaining? It
    also offers promo tiers — **essentials** (organic-first),
    **standard** (playlist pitching + paid boosts), **pro** (full
    rollout + PR + ads). These feed into the generated blueprint.
  </Step>

  <Step title="Generate">
    Aria combines the release-planning system with your artist and
    catalog context, then returns a phased campaign — typically
    30 to 50 tasks across the six phases, each with a date, a reason,
    and (where applicable) a Patchline action.
  </Step>

  <Step title="Edit, commit, work the plan">
    Edit any task that doesn't fit. Click **Save** to persist the
    campaign as a project. Every morning you can ask *"what's coming
    up today?"* and Aria walks the next tasks. As you ship, mark tasks
    complete and add your own tasks when your real-world plan changes.
  </Step>
</Steps>

## When to use it

* **You've finished a track and don't know where to start.** Open
  Projects and ask Aria. You'll have a draft campaign in under a minute.
* **You're managing multiple artists with overlapping schedules.**
  Projects let you track every campaign independently without losing
  state. Enterprise customers can configure multi-user workspace access
  for larger teams.
* **Your last release flopped and you want a smarter rollout.** Aria
  uses your catalog, artist context, and prior release history to make
  the next blueprint more specific.
* **You're working with a label and need to show what you own.**
  Choose the *with a label* path during setup so the generated blueprint
  can emphasize artist/team-owned tasks.

## What a campaign looks like

A typical 8-week campaign for a dreampop single (Mira's "Sleeper"):

```text theme={null}
🎵  Sleeper — Mira — Single, self-releasing
    Target release: 2026-07-15 (in 8 weeks — standard runway)
    Sonic positioning: dreampop-adjacent, slow, melancholy, soft acoustic

━ PRE-PRODUCTION (day -75 to -46) ─────────────────────────────
  □ Finalize master + alt-mix references
  □ Lock cover art + canvas video
  □ Confirm distribution timeline
  □ Brief any collaborators on release-week deliverables

━ PLANNING (day -45 to -22) ───────────────────────────────────
  □ Build Patchline Smart Link (pre-save + storefront wired in)
  □ Assemble curator research list for dreampop-adjacent pitching
  □ Draft Spotify editorial pitch — submission window opens day -28

━ PRE-RELEASE (day -21 to -8) ─────────────────────────────────
  □ Submit Spotify editorial pitch via S4A
  □ Submit Apple Music for Artists editorial
  □ Pre-save go-live
  □ Prepare fan-email copy
  □ Personal DMs to the 8 priority curators
  □ Teaser content drop (Patchline media kit)

━ ANNOUNCEMENT (day -7 to -1) ─────────────────────────────────
  □ Release-week social posts (3 platforms — drafts in Aria)
  □ Fan-email final send
  □ Storefront banner swap

━ RELEASE (day 0 to +7) ───────────────────────────────────────
  □ Release-day post (Aria has the drafts)
  □ TikTok teaser drop
  □ First-week DM follow-ups to curators who added
  □ Storefront launch

━ POST-RELEASE (day +8 to +42) ────────────────────────────────
  □ TikTok ad test — $50, dreampop cluster
  □ Follow-up pitch to curators who didn't add (Aria drafts)
  □ Week 2 performance review
  □ Post-mortem: streams vs forecast
  □ Hand momentum to next release
```

Each item is an actionable, dated task. Some tasks include inline
Patchline actions, such as opening a pitch link, smart link, media kit,
drop link, or store link flow.

## Prerequisites

* An [artist profile](/artists/roster) in your roster.
* A track in your [catalog](/catalog/upload) with an
  [AI-readable description](/catalog/sonic-analysis). The campaign is
  significantly better when Aria can ground the sonic positioning.
* Starter+ for Aria-generated campaigns. Free tier sees a manual
  project scaffold.
* (Optional) [Connectors](/integrations/overview) for the external
  tools you want to involve in your workflow.
* (Optional) A [smart link](/storefront/smart-links) plan if you want
  release tasks to point to a fan-facing link.

## How it works

1. The Projects UI calls Aria with the intake (artist, format,
   distribution path, title, date, goal, promo tier).
2. Aria builds a **graph query** with your situation: artist stage,
   format, channels, runway bucket, goal.
3. The campaign planner matches your situation to Patchline's release
   phases, runway buckets, task templates, and supported link surfaces.
4. Aria fuses that campaign structure with your catalog and artist
   context.
5. The campaign generator selects tasks across the six phases,
   rewrites each one for *your* release, assigns a date in the right
   phase window, and links the relevant Patchline surface (smart link,
   pitch link, media kit, etc.).
6. The campaign is persisted as a project. You can edit tasks, mark
   them complete, and add your own tasks as the release gets real.

The MCP tools for programmatic access:

<MCPToolCard name="get_releases" />

## Examples

### Example 1 — Generate a fresh campaign

<AriaPromptCard prompt="My single 'Late Bloom' drops July 15, I'm self-releasing. Build the campaign." />

```text theme={null}
Aria: Built. "Late Bloom" — uptempo pop, bright and hopeful.
Campaign profile: developing artist, standard runway (8.5 weeks),
self-releasing, growth goal.

Closest roster comp: your "Mira — November" release (hit 8.2k streams
in week 1).

Generated 42 tasks across 6 phases. Standout choices:
  - Editorial submission window starts day -28 (graph rule: emerging
    pop should not miss the 4-week pre-release cutoff)
  - DM list expanded to 11 curators (added pop-leaning curators your
    last release missed)
  - Day +14 includes a TikTok ad test ($50 budget) — graph signal:
    bright pop in this listener bracket converts well on TikTok
    paid

Commit as project? [Yes / Edit first]
```

### Example 2 — Add your own tasks

<AriaPromptCard prompt="Add a release-week listening party task for 'Late Bloom'." />

```text theme={null}
Aria: Added to the Release phase:

  - Host release-week listening party
  - Owner: Artist
  - Due: release week
  - Notes: bring your own invite list, guest plan, and creative angle.

Your campaign is the blueprint. Your taste, relationships, and timing
are what make it work.
```

### Example 3 — Roster-level view

<AriaPromptCard prompt="What's on my release calendar in the next 30 days across all artists?" />

```text theme={null}
Aria: 4 active campaigns:
  1. Mira / "Sleeper" — pre-release phase (release 7/15). 6 open
     tasks. ⚠️ 2 overdue.
  2. Tessa / "Long Way (acoustic)" — release phase (released 7/8).
     3 tasks.
  3. Mira / "Late Bloom" — pre-release phase (release 7/29). On track.
  4. Run Hot / EP rollout — planning phase (release 8/15). Just
     started.

Highest priority: the 2 overdue tasks for Mira/Sleeper. Want me to
walk them?
```

## Pricing

Plans, AI credits, and limits live on the [pricing page](https://patchline.ai/pricing) — we keep them there so they're always current.

## Related features

* [Profiles](/artists/roster) — the artist anchor for every project
* [Catalog upload](/catalog/upload) — the track anchor for every project
* [AI-discoverable tracks](/catalog/sonic-analysis) — the sonic
  grounding Aria uses
* [Smart links](/storefront/smart-links) — fan-facing release links
* [Connectors](/integrations/overview) — external tools in your workflow
* [Audience](/artists/audience) — the listener data Aria fuses with
  graph context

## FAQ

<AccordionGroup>
  <Accordion title="Where does the music-business knowledge graph come from?">
    Patchline builds the release-planning system behind Aria: phases,
    runway buckets, task templates, and Patchline-native campaign
    surfaces. The public docs describe what it does, not the internal
    data recipe.
  </Accordion>

  <Accordion title="Can I edit the campaign after Aria generates it?">
    Yes. Use the generated campaign as the blueprint, then bring your
    own judgment. Add your own tasks, rename tasks, change dates,
    change owners, add descriptions, and mark work complete.
  </Accordion>

  <Accordion title="What if my release is in 3 weeks, not 8?">
    The campaign planner has runway-aware quotas. A 3-week release lands
    in the **urgent** bucket — Aria builds a small pre-prod, a focused
    pre-release, and weights heavily on post-release recovery. You give
    it the date, it picks the right shape.
  </Accordion>

  <Accordion title="Can multiple people work on the same project?">
    Multi-user project workflows are available for Enterprise
    customers. For standard tiers, treat the project as owned by the
    signed-in workspace owner.
  </Accordion>

  <Accordion title="Does Aria actually submit to Spotify editorial?">
    No. Spotify for Artists doesn't have a public submission API. Aria
    drafts the pitch, reminds you when the window opens, and
    deep-links you to S4A; you submit there. Same pattern for Apple
    Music for Artists.
  </Accordion>

  <Accordion title="What if I miss a deadline?">
    Ask Aria *"what's overdue"* — it flags the misses and suggests
    recovery actions from the graph. If you miss an editorial window,
    Aria proposes alternative paths (direct DMs, curator marketplaces,
    earned-media angles) ranked by what works for your stage.
  </Accordion>

  <Accordion title="What makes the plan specific to me?">
    Aria uses your artist, release format, release date, goal, catalog
    context, and available Patchline surfaces to shape the campaign.
  </Accordion>

  <Accordion title="What's the difference between a Project and a release?">
    A Project is the campaign — the planning, the tasks, the
    timeline, the assets. A release is what happens on release day.
    One Project produces one release (single, EP, or album). Your
    Project lives on past release day; it holds the post-release
    momentum-capture phase.
  </Accordion>
</AccordionGroup>

<AICallout page="/releases/release-planner" />
