From d4c9fcdfd030a5a548fba9892f1fb298c32f9117 Mon Sep 17 00:00:00 2001 From: Brian Love Date: Tue, 8 Sep 2026 14:24:01 -0700 Subject: [PATCH 1/2] chore(marketing): 0.1.0 launch campaign drafts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the campaign for the 0.1.0 announcement, following the grade-a-trust structure: a plan doc, per-adapter JSON drafts for X and Dev.to, and a manual-channels file for Hacker News, r/Angular, Discord, LinkedIn, and newsletter pitches. Every draft is review_status: awaiting-brian. Merging this posts nothing. The plan assigns a different angle per channel rather than repeating one paragraph five times. Hacker News leads with the versioning confession — 55 breaking changes shipped under a patch counter — because a version-bump submission reads as promotion and gets flagged, while a self-critical semver post is something that community argues about on its own. Reddit and Dev.to lead with the "where it stops" list. X, Discord and LinkedIn carry the complete-and-free story, always pairing "free" with what the paid tiers actually sell. Two findings from reading the existing assets, both recorded in the plan: - marketing/assets/src/brand.ts:14 defaults the card eyebrow to 'Agent UI for Angular · MIT', which is retired positioning. The website's public-copy contract does not scan marketing/, so nothing catches it. The plan requires passing an explicit eyebrow and shows the call. - The X adapter's metrics() is a stub until the API tier is upgraded, so impressions are not collectable. Success is defined on referral sessions and the try-without-a-backend page instead. No competitor comparisons, unlike grade-a-trust, which named other frameworks only because it was reporting a public leaderboard. Verification: both adapter drafts pass the real validateDraft() — all eight X parts inside 280 code points, Dev.to tags matching ^[a-z0-9]+$. Every UTM link resolves against the live post, which was confirmed at HTTP 200 with its table, emphasis and index listing rendering correctly before these drafts were committed. Co-Authored-By: Claude Opus 5 --- .../cowork/inbox/2026-09-08-v0-1-0-devto.json | 22 +++ .../inbox/2026-09-08-v0-1-0-launch-plan.md | 145 ++++++++++++++++ .../2026-09-08-v0-1-0-manual-channels.md | 159 ++++++++++++++++++ .../cowork/inbox/2026-09-08-v0-1-0-x.json | 21 +++ 4 files changed, 347 insertions(+) create mode 100644 marketing/cowork/inbox/2026-09-08-v0-1-0-devto.json create mode 100644 marketing/cowork/inbox/2026-09-08-v0-1-0-launch-plan.md create mode 100644 marketing/cowork/inbox/2026-09-08-v0-1-0-manual-channels.md create mode 100644 marketing/cowork/inbox/2026-09-08-v0-1-0-x.json diff --git a/marketing/cowork/inbox/2026-09-08-v0-1-0-devto.json b/marketing/cowork/inbox/2026-09-08-v0-1-0-devto.json new file mode 100644 index 000000000..9bb6e4516 --- /dev/null +++ b/marketing/cowork/inbox/2026-09-08-v0-1-0-devto.json @@ -0,0 +1,22 @@ +{ + "_meta": { + "campaign": "threadplane-0-1-0", + "channel_note": "Day 2. canonicalUrl points at the blog so the blog keeps SEO credit. Deliberately NOT a copy of the blog post: this leads with the 'where it stops' section, which is the most Dev.to-native angle. Attach og-card (1200x630) as cover at post time. DRY_RUN=1 smoke first.", + "review_status": "awaiting-brian" + }, + "draft": { + "channel": "devto", + "article": { + "title": "The most useful part of our release notes is the list of things we refuse to do for you", + "tags": [ + "angular", + "opensource", + "ai", + "webdev" + ], + "canonicalUrl": "https://threadplane.ai/blog/threadplane-0-1-0", + "description": "Threadplane 0.1.0 is out \u2014 an MIT Angular framework for agent UIs on LangGraph and AG-UI. The section worth reading first is the one that says where the library stops." + }, + "text": "Threadplane 0.1.0 shipped this week. It is an Angular framework for building agent UIs on LangGraph and AG-UI, it is MIT, and every capability is in the free tier because there is no other tier.\n\nI want to write about one section of the release notes instead of the whole list, because it is the section I would read first if someone handed me this library.\n\n## The list that says where it stops\n\nHere is what Threadplane does **not** do for you, and will not quietly start doing in a patch release:\n\n- **The agent endpoint sits behind your proxy.** The browser should not talk to your graph server directly.\n- **API keys never reach the bundle.** There is no config option that makes this safe, so there is no config option.\n- **Thread IDs are server-generated.** Never mint one client-side.\n- **CORS is yours to configure.**\n- **The interrupt panel is yours to compose.** `` does not render it. The primitives ship; the review experience is a product decision.\n- **The resume payload is yours to choose.** Only you know what \"approved\" means in your domain.\n- **Tracing and evaluation are yours.** Runs get traced by tools built for tracing, not by a UI library.\n\nA feature list is a sales document unless it also says where it stops. Every row above is a place where taking the work off your hands would mean taking a decision off your hands too \u2014 and the ones I would most regret automating are the security ones.\n\nThat interrupt-panel row is the one I had to correct. An earlier draft of our homepage claimed destructive actions were held for approval automatically. They are not. `` gives you the primitives and you compose the panel. Checking that against our own docs turned one confident tick into two honest lines.\n\n## What it does do\n\nThe pitch is narrow on purpose: the last mile. Everything between \"my agent streams tokens\" and \"my team can put this in front of a customer.\"\n\n- `` plus 15 documented components \u2014 message list, input, tool-call cards, reasoning, trace, subagent cards, sidebar, popup, debug\n- Streaming markdown over a 26-node registry, sanitized, with per-instance overrides\n- Durable threads: persistence, checkpoints, durable execution, time travel\n- Interrupts and human approvals\n- Client tools that run in the browser and hand control back to the graph\n- Generative UI via json-render and A2UI v0.9, rendering only components you registered\n- Subagents as their own cards with their own transcripts\n- The five Deep Agents capabilities \u2014 planning, filesystem, subagents, memory, skills\n- `AgentError` classifying every failure as `connection`, `auth`, `server`, `interrupted`, or `aborted`, each with a `retryable` flag\n- A test path that runs with no model and no API key\n\n## The runtime is not a one-way door\n\n`@threadplane/langgraph` and `@threadplane/ag-ui` both produce the same `Agent` interface \u2014 six signals, four methods, one event stream. Components written against `` do not know which backend they are talking to. When the backend changes, your providers change and your components do not.\n\nI measured that rather than asserting it. Across three capability demos built twice, the same six of nine files differ every time, and four of those six are not application code.\n\nThe AG-UI side is protocol-first, so it got tested against runtimes that have nothing to do with LangGraph: AWS Strands, Microsoft Agent Framework, and Mastra. Three runtimes, two languages, no adapter changes for messages, tool calls, or state. Each has a standalone example and a committed transcript of its wire traffic.\n\n## About the version number\n\nThrough `v0.0.66` this project bumped only the patch digit. Fifty-five commits of accumulated breaking changes shipped under a counter that said nothing had broken.\n\nThat is not semver, and by the end the published packages were contradicting the documentation. So 0.1.0 is not a feature release. It is the release where the version number starts telling the truth. Six packages move as one fixed group, because an adapter and the surface it feeds are not independently upgradable in practice.\n\n## The free part\n\nThere is no open-core split. No capability is held back, no seat count, no activation, no runtime license check, no account.\n\nThere are paid offerings and I want to be precise about what they sell: review time, a private channel, and a response commitment. They sell my attention. They do not sell code you cannot otherwise have.\n\nThe moment a capability moves behind a paywall, every architectural decision in the library starts getting made by the pricing page, and you can feel that in the code long before you see it on the invoice.\n\nTry it without a backend first \u2014 it runs a fake agent in the browser, so you can see the UI before you stand up a server:\n\n```bash\nnpm install @threadplane/chat @threadplane/langgraph @langchain/core @langchain/langgraph-sdk marked\n```\n\nFull write-up with the complete capability table: https://threadplane.ai/blog/threadplane-0-1-0\n\nIf you try it, I would rather hear where it broke than that it was nice." + } +} diff --git a/marketing/cowork/inbox/2026-09-08-v0-1-0-launch-plan.md b/marketing/cowork/inbox/2026-09-08-v0-1-0-launch-plan.md new file mode 100644 index 000000000..8fdf2244e --- /dev/null +++ b/marketing/cowork/inbox/2026-09-08-v0-1-0-launch-plan.md @@ -0,0 +1,145 @@ +# Threadplane 0.1.0 — launch plan + +> Campaign: `threadplane-0-1-0`. Anchor: +> Voice: `docs/gtm/voice.md`. Claims: `docs/gtm/messaging.md`. Audience: `docs/gtm/icp.md`. +> Copy lives in the sibling files: `-x.json`, `-devto.json`, `-manual-channels.md`. +> Status: **awaiting-brian**. Nothing posts until each draft is reviewed. + +## The problem with this announcement + +"We released version 0.1.0" is not a story. Nobody outside the repository cares that a +number moved, and on Hacker News a version-bump post is downvoted as promotion before +anyone reads it. + +The campaign works only if each channel gets the angle that channel actually rewards. +There are three real stories in this release, and the plan assigns them deliberately +rather than repeating the same paragraph five times. + +| Angle | What it says | Best channel | +|---|---|---| +| **The version number was lying** | 55 commits of breaking changes shipped under a patch counter. 0.1.0 is the correction. | Hacker News | +| **The last mile is complete, and free** | Every capability, MIT, no paywalled tier, no account. | X, Discord, LinkedIn | +| **Where it stops** | The proxy, the keys, the interrupt panel, tracing — still yours, on purpose. | r/Angular, Dev.to | + +The first angle is the one I would lead with anywhere technical. It is self-critical, +it is specific, and versioning is a subject engineers argue about for free. A confession +travels where an announcement does not. + +## Sequence + +Front-load the channels we control, let HN and Reddit follow once the post has survived +contact with readers. Same shape as `grade-a-trust`, which worked. + +| Day | Channel | Draft | Posting | +|---|---|---|---| +| 0 | X thread | `-x.json` | Adapter (`getAdapter('x')`) | +| 0 | Discord `#announcements` | `-manual-channels.md` | Manual | +| 2 | Dev.to | `-devto.json` | Adapter (`getAdapter('devto')`) | +| 4 | Hacker News | `-manual-channels.md` | Manual — Brian submits, stays in comments | +| 4 | r/Angular | `-manual-channels.md` | Manual | +| 5 | LinkedIn | `-manual-channels.md` | Manual (no adapter) | +| 6–7 | Newsletter pitches | `-manual-channels.md` | Manual email | + +Two days between Dev.to and HN is deliberate. If a technical claim in the post is wrong, +Dev.to comments will find it before the HN thread does, and correcting it there costs +nothing. + +**Do not post HN and Reddit the same hour.** If HN takes off, that is where Brian needs +to be, and a Reddit thread going unanswered in parallel reads worse than posting it a +day later. + +## Hacker News specifics + +- Submit as a **link to the blog post**, not a Show HN. There is no interactive demo at + that URL, and Show HN sets an expectation this post does not meet. +- Title is neutral and technical. No version number in the title — it reads as a release + announcement and gets flagged. +- Brian posts the first comment himself immediately after submitting, and discloses that + he is the author in the first sentence. +- Best window: Tuesday–Thursday, 08:00–10:00 ET. +- If it does not catch in 90 minutes, leave it. Do not repost, do not ask for upvotes. + +## r/Angular specifics + +Read the subreddit rules before posting; self-promotion policy changes. The draft leads +with the practical question an Angular developer actually has and treats the release as +the answer, not the headline. Brian engages in comments; a drive-by post is worse than +no post. + +## Assets + +Render the social card before Day 0: + +```bash +npx tsx --tsconfig marketing/assets/tsconfig.lib.json marketing/assets/scripts/preview.ts +``` + +**Pass `eyebrow` explicitly.** `marketing/assets/src/brand.ts:14` defaults to +`'Agent UI for Angular · MIT'`, which is retired positioning — the current line is +"The open-source thread-plane for agents." The website's copy contract does not scan +`marketing/`, so nothing catches this for you. Use: + +```ts +await renderCard({ + template: 'x-card', + eyebrow: 'Threadplane 0.1.0 · MIT', + title: 'The coffee in the hangar is free', + subtitle: 'Chat, durable threads, approvals, and generative UI for Angular. No paid tier.', +}); +``` + +Card alt text (required by the X adapter, 1–1000 chars): + +> Threadplane 0.1.0 announcement card: "The coffee in the hangar is free" over the +> subtitle "Chat, durable threads, approvals, and generative UI for Angular. No paid tier." + +Two cards needed: `x-card` (1200×675) for the X thread, `og-card` (1200×630) for Dev.to. + +## Guardrails + +- **No competitor comparisons.** The `grade-a-trust` campaign named other frameworks + because it was reporting a public leaderboard. This campaign has no such excuse, and + a "vs them" frame invites a fight we do not need. The story is what we ship. +- **No absolute telemetry claims.** `apps/website/src/lib/public-copy-contract.ts` bars + "off by default", "we never collect", and similar. Say what is true and checkable: + no cloud service, no account, no activation. +- **Contractions are fine here.** `voice.md` measures the no-contraction rule from the + blog corpus. The shipped `grade-a-trust` social drafts use contractions freely, and + they read correctly. Blog register and social register are not the same register. +- **Name the weak spot.** Every draft in this campaign admits something — the version + history, the gaps, or the adoption number. The `grade-a-trust` campaign did this and + it was the most-quoted part. Do not let review sand it off. +- **"Free" needs its qualifier in the same breath.** Free software, paid support. Say + both, or the first one reads as bait. + +## Measurement + +Every link carries `utm_campaign=threadplane-0-1-0`, with `utm_source` per channel and +`utm_medium` of `social` (X, LinkedIn), `community` (HN, Reddit, Discord), `referral` +(newsletters), or `blog` (Dev.to). + +Baseline before Day 0 so the delta is readable: + +```bash +npm run posthog:report +``` + +Check at Day 7. What would make this a success: + +- Referral sessions to `/blog/threadplane-0-1-0` from at least three distinct sources. +- Any movement on `/docs/chat/getting-started/try-without-a-backend`. That page is the + one that converts curiosity into an install, and it is linked from the post's table. +- GitHub stars. Adoption was the honest weak signal in June and it still is. + +Do not treat X impressions as a result. `metrics()` on the X adapter is a stub until the +API tier is upgraded, so that number is not even collectable right now. + +## Pre-flight checklist + +- [ ] Blog post live at the anchor URL and rendering correctly +- [ ] Both cards rendered with an explicit `eyebrow`, eyeballed for layout +- [ ] `DRY_RUN=1` smoke for X and Dev.to adapters +- [ ] Every draft reviewed by Brian (`review_status` flipped off `awaiting-brian`) +- [ ] PostHog baseline captured +- [ ] r/Angular self-promotion rules re-read +- [ ] Brian available for the two hours after the HN submission diff --git a/marketing/cowork/inbox/2026-09-08-v0-1-0-manual-channels.md b/marketing/cowork/inbox/2026-09-08-v0-1-0-manual-channels.md new file mode 100644 index 000000000..b7e7b8a84 --- /dev/null +++ b/marketing/cowork/inbox/2026-09-08-v0-1-0-manual-channels.md @@ -0,0 +1,159 @@ +# Threadplane 0.1.0 — manual-channel copy + +> Channels without a built adapter. Post by hand. Campaign: `threadplane-0-1-0`. +> Voice: `docs/gtm/voice.md` — social register, contractions fine. Blog register is stricter. +> Guardrails: no competitor comparisons, no absolute telemetry claims, "free" always paired +> with what the paid tiers actually sell. +> Sequencing and rationale: `2026-09-08-v0-1-0-launch-plan.md`. +> Status: **awaiting-brian**. + +--- + +## Hacker News (Day 4) — Brian submits, stays in comments + +Submit as a **link to the blog post**. Not a Show HN — there is no interactive demo at that +URL. Lead with the versioning confession, not the release: a version-bump title gets flagged +as promotion, and the semver angle is the one HN will actually argue about. + +**Title candidates (pick one — neutral, no version number):** + +1. `We shipped 55 breaking changes under a patch version number` +2. `Our version number was lying, so we changed how we release` +3. `A feature list is a sales document unless it says where it stops` + +My pick is (1). It is the most specific, it is self-critical, and it does not read as an +announcement. (3) is the better essay but the weaker headline — it sounds like a blog about +blogging. + +**First comment (paste immediately after submitting):** + +> Author here. The uncomfortable detail behind this post: through v0.0.66 we only ever +> incremented the patch digit. Fifty-five commits of breaking changes went out under a +> counter that told people nothing had broken, and by the end the published packages were +> contradicting our own documentation. +> +> Nobody decided to do that. It happened the way most versioning problems happen — the +> release command had a default, the default was `patch`, and no one owned the question of +> when it should be something else. It only became visible when a consumer upgraded and the +> types moved underneath them. +> +> What we changed: the six packages now version as one fixed group, because an adapter and +> the UI surface it feeds are not independently upgradable in practice — pretending +> otherwise just relocates the breakage to someone's `npm install`. And 1.0.0 is gated +> behind an explicit decision rather than a command-line flag. +> +> Happy to argue about whether 0.x gives you a free pass on this. I do not think it does, +> and I think the "anything goes below 1.0" reading is how projects end up here. + +Submission URL: +https://threadplane.ai/blog/threadplane-0-1-0?utm_source=hackernews&utm_medium=community&utm_campaign=threadplane-0-1-0 + +--- + +## r/Angular (Day 4) — practical question first, release as the answer + +Check the subreddit's self-promotion rules before posting; they change. Engage in the +comments — a drive-by is worse than not posting. + +**Title:** `What does your Angular app still owe you after you drop in an agent chat library?` + +**Body:** + +> I maintain an MIT Angular framework for agent UIs (LangGraph and AG-UI backends), and we +> just cut 0.1.0. Rather than list features, I want to put up the part of our release notes +> that I think is more useful — the list of things the library deliberately does *not* do: +> +> - The agent endpoint sits behind your proxy. The browser shouldn't talk to your graph +> server directly. +> - API keys never reach the bundle. There's no config option that makes this safe, so +> there's no config option. +> - Thread IDs are server-generated. Never mint one client-side. +> - CORS is yours. +> - The interrupt panel is yours to compose. `` gives you primitives; what "review +> this action" looks like is a product decision. +> - Tracing and evaluation are yours — those belong to tools built for them, not a UI library. +> +> That interrupt row is one I had to correct. An earlier draft of our homepage claimed +> destructive actions were held for approval automatically. They aren't. Checking our own +> marketing against our own docs turned one confident checkmark into two honest lines. +> +> What *is* in the box: `` plus 15 components, streaming markdown, durable threads with +> checkpoints and time travel, interrupts, client tools, generative UI (json-render and +> A2UI), subagents, classified errors with retry, and a test path that runs with no model and +> no API key. Signals and DI throughout, your design system stays yours, CSS custom +> properties and no `!important`. +> +> All MIT. No paid tier holding anything back — the paid offerings are support time, not code. +> +> https://threadplane.ai/blog/threadplane-0-1-0?utm_source=reddit&utm_medium=community&utm_campaign=threadplane-0-1-0 +> +> Genuinely interested in what people think belongs on the "still yours" list that I left off. + +--- + +## Discord (Day 0) — #announcements + +> ✈️ **Threadplane 0.1.0 is out.** +> +> The last mile is done: chat, durable threads, human approvals, client tools, subagents, +> generative UI, classified errors with retry, and tests that run without a model. Six +> packages, all MIT, no paid tier holding anything back. +> +> The honest part is the version number. Through 0.0.66 we only bumped the patch digit — 55 +> commits of breaking changes shipped under a counter that said nothing had broken. 0.1.0 is +> where that stops. +> +> Write-up → https://threadplane.ai/blog/threadplane-0-1-0?utm_source=discord&utm_medium=community&utm_campaign=threadplane-0-1-0 +> +> If you have been running it from `main`, this is the one to pin. And if something breaks on +> upgrade, ping here — I would rather hear it than not. + +--- + +## LinkedIn (Day 5) — business register, no jargon dump + +> Threadplane 0.1.0 is out today, and I want to be direct about the business model, because +> "open source" gets used loosely. +> +> Every capability ships in the free tier. There is no open-core split, no seat count, no +> activation, no account to create. The software is MIT — commercial use, modification, and +> redistribution, without asking me. +> +> There are paid offerings. They sell review time, a private channel, and a response +> commitment. They sell my attention. They do not sell code you cannot otherwise have. +> +> That distinction matters more than it sounds. The moment a capability moves behind a +> paywall, architectural decisions start getting made by the pricing page — and you can feel +> that in the code long before you see it on an invoice. +> +> What 0.1.0 actually delivers: the last mile of building an agent interface in Angular. +> Everything between "my agent streams tokens" and "my team can put this in front of a +> customer" — durable conversations, human approval steps, generated UI constrained to your +> own design system, and a test path that runs without calling a model. +> +> https://threadplane.ai/blog/threadplane-0-1-0?utm_source=linkedin&utm_medium=social&utm_campaign=threadplane-0-1-0 + +--- + +## Newsletter pitch (Day 6–7) — Angular Weekly et al. + +**Subject:** Angular agent framework hits 0.1.0 — and a versioning confession + +**Body:** + +> Hi [name], +> +> Quick one for [newsletter]. Threadplane — an MIT-licensed Angular framework for building +> agent UIs on LangGraph and AG-UI — just cut 0.1.0, with the full last mile: durable threads, +> human approvals, client tools, subagents, generative UI constrained to your own design +> system, and a test path that runs with no model and no API key. +> +> The angle I think your readers would actually enjoy is the versioning part. Through v0.0.66 +> we only ever bumped the patch digit, so 55 commits of breaking changes shipped under a +> counter claiming nothing had broken. The post is candid about how that happens and what we +> changed. +> +> https://threadplane.ai/blog/threadplane-0-1-0?utm_source=newsletter&utm_medium=referral&utm_campaign=threadplane-0-1-0 +> +> No worries if it is not a fit. Thanks for the great newsletter. +> — Brian diff --git a/marketing/cowork/inbox/2026-09-08-v0-1-0-x.json b/marketing/cowork/inbox/2026-09-08-v0-1-0-x.json new file mode 100644 index 000000000..c85f92f67 --- /dev/null +++ b/marketing/cowork/inbox/2026-09-08-v0-1-0-x.json @@ -0,0 +1,21 @@ +{ + "_meta": { + "campaign": "threadplane-0-1-0", + "channel_note": "Day 0. Brian's account. Attach the x-card PNG to the FIRST tweet at post time \u2014 Draft.media needs a PNG Buffer, which cannot live in JSON. Render it with an EXPLICIT eyebrow; brand.ts still defaults to retired positioning. DRY_RUN=1 smoke first.", + "card_alt": "Threadplane 0.1.0 announcement card: \"The coffee in the hangar is free\" over the subtitle \"Chat, durable threads, approvals, and generative UI for Angular. No paid tier.\"", + "review_status": "awaiting-brian" + }, + "draft": { + "channel": "x", + "threadParts": [ + "Threadplane 0.1.0 is out.\n\nChat, durable threads, human approvals, subagents, and generative UI for Angular \u2014 on LangGraph or AG-UI.\n\nAll of it MIT. No paid tier, no account, no activation.\n\nBut the version number is the honest part \ud83e\uddf5", + "Through 0.0.66 we only ever bumped the patch digit.\n\n55 commits of breaking changes went out under a counter that said nothing had broken.\n\nThat's not semver. That's a lie with a decimal point in it.\n\n0.1.0 is the release where the number starts telling the truth.", + "What's actually finished is the last mile \u2014 everything between \"my agent streams tokens\" and \"my team can put this in front of a customer.\"\n\nThat gap is where Angular teams lose weeks. It's the only thing this project has tried to close.", + "In the box:\n\n\u2022 + 15 documented components\n\u2022 durable threads, checkpoints, time travel\n\u2022 interrupts and approvals\n\u2022 client tools\n\u2022 generative UI (json-render + A2UI)\n\u2022 subagents\n\u2022 5 classified error kinds with retry\n\u2022 tests that run with no model and no API key", + "The adapter is not a one-way door.\n\nLangGraph and AG-UI produce the same Agent contract, so components don't know which backend they're talking to.\n\nWe tested AG-UI against AWS Strands, Microsoft Agent Framework, and Mastra. Two languages, no adapter changes.", + "The part I like more than the feature list is where it stops.\n\nYour proxy. Your keys. Your CORS. Your thread IDs. You compose the interrupt panel.\n\nEvery one of those is a place where doing it for you would mean deciding it for you.", + "And the money, plainly: there's no open-core split.\n\nNothing is held back for a paid tier. The paid offerings sell review time and a response commitment \u2014 not code you can't otherwise have.\n\nIf you disagree with a decision I made, the license already grants you a fork.", + "Full write-up:\nhttps://threadplane.ai/blog/threadplane-0-1-0?utm_source=x&utm_medium=social&utm_campaign=threadplane-0-1-0\n\nOr skip me entirely and try it without a backend:\n\nnpm i @threadplane/chat @threadplane/langgraph" + ] + } +} From 62bbea851e8c8918504afe6a3f2bcfd65980884e Mon Sep 17 00:00:00 2001 From: Brian Love Date: Tue, 8 Sep 2026 16:27:01 -0700 Subject: [PATCH 2/2] chore(marketing): drop a fabricated anecdote from the Reddit and Dev.to drafts Both drafts had Brian confessing that an earlier homepage draft wrongly claimed destructive actions were held for approval automatically. He never said that. The detail came from a code comment in apps/website/src/lib/preflight-checklist.ts recording a verification pass, and writing it up as his own admission puts words in his mouth about his own work. docs/gtm/voice.md is explicit: never fabricate a first-person anecdote. The "where it stops" list stands on its own without a manufactured confession attached to it. Co-Authored-By: Claude Opus 5 --- marketing/cowork/inbox/2026-09-08-v0-1-0-devto.json | 2 +- marketing/cowork/inbox/2026-09-08-v0-1-0-manual-channels.md | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/marketing/cowork/inbox/2026-09-08-v0-1-0-devto.json b/marketing/cowork/inbox/2026-09-08-v0-1-0-devto.json index 9bb6e4516..1a6b936ab 100644 --- a/marketing/cowork/inbox/2026-09-08-v0-1-0-devto.json +++ b/marketing/cowork/inbox/2026-09-08-v0-1-0-devto.json @@ -17,6 +17,6 @@ "canonicalUrl": "https://threadplane.ai/blog/threadplane-0-1-0", "description": "Threadplane 0.1.0 is out \u2014 an MIT Angular framework for agent UIs on LangGraph and AG-UI. The section worth reading first is the one that says where the library stops." }, - "text": "Threadplane 0.1.0 shipped this week. It is an Angular framework for building agent UIs on LangGraph and AG-UI, it is MIT, and every capability is in the free tier because there is no other tier.\n\nI want to write about one section of the release notes instead of the whole list, because it is the section I would read first if someone handed me this library.\n\n## The list that says where it stops\n\nHere is what Threadplane does **not** do for you, and will not quietly start doing in a patch release:\n\n- **The agent endpoint sits behind your proxy.** The browser should not talk to your graph server directly.\n- **API keys never reach the bundle.** There is no config option that makes this safe, so there is no config option.\n- **Thread IDs are server-generated.** Never mint one client-side.\n- **CORS is yours to configure.**\n- **The interrupt panel is yours to compose.** `` does not render it. The primitives ship; the review experience is a product decision.\n- **The resume payload is yours to choose.** Only you know what \"approved\" means in your domain.\n- **Tracing and evaluation are yours.** Runs get traced by tools built for tracing, not by a UI library.\n\nA feature list is a sales document unless it also says where it stops. Every row above is a place where taking the work off your hands would mean taking a decision off your hands too \u2014 and the ones I would most regret automating are the security ones.\n\nThat interrupt-panel row is the one I had to correct. An earlier draft of our homepage claimed destructive actions were held for approval automatically. They are not. `` gives you the primitives and you compose the panel. Checking that against our own docs turned one confident tick into two honest lines.\n\n## What it does do\n\nThe pitch is narrow on purpose: the last mile. Everything between \"my agent streams tokens\" and \"my team can put this in front of a customer.\"\n\n- `` plus 15 documented components \u2014 message list, input, tool-call cards, reasoning, trace, subagent cards, sidebar, popup, debug\n- Streaming markdown over a 26-node registry, sanitized, with per-instance overrides\n- Durable threads: persistence, checkpoints, durable execution, time travel\n- Interrupts and human approvals\n- Client tools that run in the browser and hand control back to the graph\n- Generative UI via json-render and A2UI v0.9, rendering only components you registered\n- Subagents as their own cards with their own transcripts\n- The five Deep Agents capabilities \u2014 planning, filesystem, subagents, memory, skills\n- `AgentError` classifying every failure as `connection`, `auth`, `server`, `interrupted`, or `aborted`, each with a `retryable` flag\n- A test path that runs with no model and no API key\n\n## The runtime is not a one-way door\n\n`@threadplane/langgraph` and `@threadplane/ag-ui` both produce the same `Agent` interface \u2014 six signals, four methods, one event stream. Components written against `` do not know which backend they are talking to. When the backend changes, your providers change and your components do not.\n\nI measured that rather than asserting it. Across three capability demos built twice, the same six of nine files differ every time, and four of those six are not application code.\n\nThe AG-UI side is protocol-first, so it got tested against runtimes that have nothing to do with LangGraph: AWS Strands, Microsoft Agent Framework, and Mastra. Three runtimes, two languages, no adapter changes for messages, tool calls, or state. Each has a standalone example and a committed transcript of its wire traffic.\n\n## About the version number\n\nThrough `v0.0.66` this project bumped only the patch digit. Fifty-five commits of accumulated breaking changes shipped under a counter that said nothing had broken.\n\nThat is not semver, and by the end the published packages were contradicting the documentation. So 0.1.0 is not a feature release. It is the release where the version number starts telling the truth. Six packages move as one fixed group, because an adapter and the surface it feeds are not independently upgradable in practice.\n\n## The free part\n\nThere is no open-core split. No capability is held back, no seat count, no activation, no runtime license check, no account.\n\nThere are paid offerings and I want to be precise about what they sell: review time, a private channel, and a response commitment. They sell my attention. They do not sell code you cannot otherwise have.\n\nThe moment a capability moves behind a paywall, every architectural decision in the library starts getting made by the pricing page, and you can feel that in the code long before you see it on the invoice.\n\nTry it without a backend first \u2014 it runs a fake agent in the browser, so you can see the UI before you stand up a server:\n\n```bash\nnpm install @threadplane/chat @threadplane/langgraph @langchain/core @langchain/langgraph-sdk marked\n```\n\nFull write-up with the complete capability table: https://threadplane.ai/blog/threadplane-0-1-0\n\nIf you try it, I would rather hear where it broke than that it was nice." + "text": "Threadplane 0.1.0 shipped this week. It is an Angular framework for building agent UIs on LangGraph and AG-UI, it is MIT, and every capability is in the free tier because there is no other tier.\n\nI want to write about one section of the release notes instead of the whole list, because it is the section I would read first if someone handed me this library.\n\n## The list that says where it stops\n\nHere is what Threadplane does **not** do for you, and will not quietly start doing in a patch release:\n\n- **The agent endpoint sits behind your proxy.** The browser should not talk to your graph server directly.\n- **API keys never reach the bundle.** There is no config option that makes this safe, so there is no config option.\n- **Thread IDs are server-generated.** Never mint one client-side.\n- **CORS is yours to configure.**\n- **The interrupt panel is yours to compose.** `` does not render it. The primitives ship; the review experience is a product decision.\n- **The resume payload is yours to choose.** Only you know what \"approved\" means in your domain.\n- **Tracing and evaluation are yours.** Runs get traced by tools built for tracing, not by a UI library.\n\nA feature list is a sales document unless it also says where it stops. Every row above is a place where taking the work off your hands would mean taking a decision off your hands too \u2014 and the ones I would most regret automating are the security ones.\n\n## What it does do\n\nThe pitch is narrow on purpose: the last mile. Everything between \"my agent streams tokens\" and \"my team can put this in front of a customer.\"\n\n- `` plus 15 documented components \u2014 message list, input, tool-call cards, reasoning, trace, subagent cards, sidebar, popup, debug\n- Streaming markdown over a 26-node registry, sanitized, with per-instance overrides\n- Durable threads: persistence, checkpoints, durable execution, time travel\n- Interrupts and human approvals\n- Client tools that run in the browser and hand control back to the graph\n- Generative UI via json-render and A2UI v0.9, rendering only components you registered\n- Subagents as their own cards with their own transcripts\n- The five Deep Agents capabilities \u2014 planning, filesystem, subagents, memory, skills\n- `AgentError` classifying every failure as `connection`, `auth`, `server`, `interrupted`, or `aborted`, each with a `retryable` flag\n- A test path that runs with no model and no API key\n\n## The runtime is not a one-way door\n\n`@threadplane/langgraph` and `@threadplane/ag-ui` both produce the same `Agent` interface \u2014 six signals, four methods, one event stream. Components written against `` do not know which backend they are talking to. When the backend changes, your providers change and your components do not.\n\nI measured that rather than asserting it. Across three capability demos built twice, the same six of nine files differ every time, and four of those six are not application code.\n\nThe AG-UI side is protocol-first, so it got tested against runtimes that have nothing to do with LangGraph: AWS Strands, Microsoft Agent Framework, and Mastra. Three runtimes, two languages, no adapter changes for messages, tool calls, or state. Each has a standalone example and a committed transcript of its wire traffic.\n\n## About the version number\n\nThrough `v0.0.66` this project bumped only the patch digit. Fifty-five commits of accumulated breaking changes shipped under a counter that said nothing had broken.\n\nThat is not semver, and by the end the published packages were contradicting the documentation. So 0.1.0 is not a feature release. It is the release where the version number starts telling the truth. Six packages move as one fixed group, because an adapter and the surface it feeds are not independently upgradable in practice.\n\n## The free part\n\nThere is no open-core split. No capability is held back, no seat count, no activation, no runtime license check, no account.\n\nThere are paid offerings and I want to be precise about what they sell: review time, a private channel, and a response commitment. They sell my attention. They do not sell code you cannot otherwise have.\n\nThe moment a capability moves behind a paywall, every architectural decision in the library starts getting made by the pricing page, and you can feel that in the code long before you see it on the invoice.\n\nTry it without a backend first \u2014 it runs a fake agent in the browser, so you can see the UI before you stand up a server:\n\n```bash\nnpm install @threadplane/chat @threadplane/langgraph @langchain/core @langchain/langgraph-sdk marked\n```\n\nFull write-up with the complete capability table: https://threadplane.ai/blog/threadplane-0-1-0\n\nIf you try it, I would rather hear where it broke than that it was nice." } } diff --git a/marketing/cowork/inbox/2026-09-08-v0-1-0-manual-channels.md b/marketing/cowork/inbox/2026-09-08-v0-1-0-manual-channels.md index b7e7b8a84..3755a9c78 100644 --- a/marketing/cowork/inbox/2026-09-08-v0-1-0-manual-channels.md +++ b/marketing/cowork/inbox/2026-09-08-v0-1-0-manual-channels.md @@ -73,10 +73,6 @@ comments — a drive-by is worse than not posting. > this action" looks like is a product decision. > - Tracing and evaluation are yours — those belong to tools built for them, not a UI library. > -> That interrupt row is one I had to correct. An earlier draft of our homepage claimed -> destructive actions were held for approval automatically. They aren't. Checking our own -> marketing against our own docs turned one confident checkmark into two honest lines. -> > What *is* in the box: `` plus 15 components, streaming markdown, durable threads with > checkpoints and time travel, interrupts, client tools, generative UI (json-render and > A2UI), subagents, classified errors with retry, and a test path that runs with no model and