Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 37 additions & 10 deletions .claude/commands/release.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,24 +90,24 @@ Read the commits only as **internal source material**. Translate to user-facing

```markdown
---
subject: "Changelog <version> — <theme 1>, <theme 2>, <theme 3>..."
subject: "Changelog <version> — <improvement 1>, <improvement 2> and more..."
---

# Changelog <version> — <theme 1>, <theme 2>, <theme 3>...
# Changelog <version> — <improvement 1>, <improvement 2> and more...

By TryPost Product Team • [Release <version>](https://github.com/<OWNER>/<REPO>/releases/tag/<version>)

Hello! Welcome to this week's update. Here's what's new in TryPost.

## <Theme 1>
## <Outcome the reader gets, or the symptom that is gone>

<2-4 sentences of concrete narrative — what changed, why a user should care, what they'll notice. No marketing puffery.>
<2-4 sentences of concrete narrative — what changed, why a user should care, what they'll notice. Open on what the reader experienced ("you may have watched it go out twice"), not on the internal cause. No marketing puffery.>

## <Theme 2>
## <second outcome>

<same>

## <Theme 3 — only if there are genuinely 3 themes worth of work>
## <third outcome — only if there are genuinely 3 themes worth of work>

<same>

Expand All @@ -134,6 +134,17 @@ You're receiving this because you subscribed.

**Always end with the unsubscribe footer** — the `---` separator, the "You're receiving this because you subscribed." line, and an `[Unsubscribe]({{unsubscribe_url}})` link below the signature. Keep `{{unsubscribe_url}}` as a literal placeholder; the email sending tool fills it in. This footer is required on every customer email.

#### Section headers

A theme header names the outcome the reader gets or the symptom that is gone. Sentence case. It has to make sense to someone who never saw the bug report.

- ❌ `## Publishing that finishes what it started` (writerly; says nothing concrete)
- ❌ `## Your Asset Library, from anywhere` (area label dressed up)
- ✅ `## Your long videos stop posting twice`
- ✅ `## The Facebook Pages that wouldn't connect`

**Section order must match the subject order.** The subject promises a sequence. A reader who opens on a different topic than the one that got them to click feels the mismatch even if they can't name it.

#### Theme grouping (AI clusters by user impact)

Read all commits since the last tag and cluster into **2-3 user-facing themes**. Use whatever frame makes the changes feel coherent to a customer, not to a developer.
Expand All @@ -152,6 +163,10 @@ Read all commits since the last tag and cluster into **2-3 user-facing themes**.

If there are fewer than 3 themeable groups, use 2 or just 1. Don't pad. Internal-only changes (chore, CI, refactor, deps) usually shouldn't appear at all — fold the user-visible ones into "Fixes" with a user-voice rewrite, drop the rest.

**Order themes by reach, not by newness.** The first theme goes to whatever the largest share of subscribers will actually feel. A fix that unblocks a whole platform for everyone who uses it outranks a feature only integrators can reach, even though the feature is the newer work. Rank by how many people were affected.

**Check who a theme really reaches before you headline it.** Exposing an existing in-app capability over the API or MCP is new for integrators only — everyone else already had it in the UI. Headlining it as if the capability itself were new misleads the majority. Either qualify the section in its first sentence ("If you build against the TryPost API or connect an AI assistant...") and say plainly that the in-app path already worked, or demote it under a theme with broader reach.

#### Bullet rules for "New features" / "Fixes"

Rewrite each item in **user voice**, not commit voice:
Expand All @@ -167,13 +182,25 @@ Rewrite each item in **user voice**, not commit voice:

If a commit has no user-visible effect, **omit it**. Don't pad the email.

**Never repeat a theme section in the bullets.** "New features" and "Fixes" are for what did *not* earn its own section. If duplicate Instagram posts got three paragraphs above, they don't also get a bullet — the reader meets the same fact twice and the lists stop being scannable. Write the sections first, then list only what is left over.

#### Subject line

Pattern: `Changelog <version> — <theme 1>, <theme 2>, <theme 3>...`
Pattern: `Changelog <version> — <improvement 1>, <improvement 2> and more...`

Each slot must name **what got better for the reader**, never the area it happened in. The area is where the work landed; the improvement is what they can now do, or what stopped hurting. A subject built from area labels tells a customer nothing — they already know TryPost has an Asset Library.

- ❌ `Changelog v1.0.8 — Publishing that finishes, Facebook Pages, Asset Library` (a writerly abstraction plus two bare area labels)
- ❌ `Changelog v1.0.8 — No duplicate posts, Facebook Pages that connect` (still abstract: "no duplicate posts" reads like a new dedup feature rather than a fix, and the second half is awkward)
- ✅ `Changelog v1.0.8 — Facebook Pages finally connect, reuse your media and more...`

Don't put "TryPost" in the subject — the email already comes from the TryPost sender, so it's redundant.
Rules:

Cap around 80 chars. If themes don't fit, shorten to the 2 most impactful + "and more...".
- **Two named improvements plus `and more...` beats three cramped ones.** The trailing `and more...` carries the rest of the release and buys the two named slots enough room to be specific.
- **The first slot goes to the widest reach.** Same ranking as the themes: most subscribers affected wins, even when that is a bug fix and the release also shipped a shiny feature.
- Plain words like `finally`, `stop`, `no longer` are good — they read as an honest founder, not a marketer.
- Don't put "TryPost" in the subject — the email already comes from the TryPost sender, so it's redundant.
- Cap around 80 chars.

### Step 5 — Humanize the email prose

Expand All @@ -199,7 +226,7 @@ Derive these inputs from the release. The **headline and the chips play differen
- ❌ `Your language, mobile, and per-image alt text` (this is just the chip labels)
- ✅ `Speak every language, reach every reader` (benefit-driven, distinct from the chips)
- **underline** — a short emphasis phrase *inside* the headline (1-3 words) to carry the hand-drawn violet squiggle, usually the last / most important phrase (e.g. `every reader`). Must appear in the headline verbatim. Optional; omit for no squiggle.
- **themes** — 2-4 short chip labels naming the concrete areas that shipped, condensed to 1-2 words each (e.g. `Languages`, `Mobile`, `Alt text & previews`). These are secondary supporting labels, rendered smaller than the headline; the template auto-colors them (violet / green / sky / orange / rose, in order). Keep them concrete and distinct from the headline's wording.
- **themes** — 2-4 short chip labels naming the concrete areas that shipped, condensed to 1-2 words each (e.g. `Languages`, `Mobile`, `Alt text & previews`). These are secondary supporting labels, rendered smaller than the headline; the template auto-colors them (violet / green / sky / orange / rose, in order). Keep them concrete and distinct from the headline's wording. **Order the chips to match the email's section order**, so the image and the email tell the story in the same sequence. Chips are the one place a bare area label is correct: the headline sells the benefit, the chips name where it landed.

Create the directory and render the thumbnail so the user can preview it before confirming:

Expand Down
28 changes: 28 additions & 0 deletions releases/v1.0.8/changelog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
## What's Changed
* chore(release): v1.0.7 changelog, customer email + thumbnail artifacts by @paulocastellano in https://github.com/trypostit/trypost/pull/266
* docs: consolidate social platform API doc links into one CLAUDE.md section by @paulocastellano in https://github.com/trypostit/trypost/pull/267
* fix: subscribe to AI generation channel before dispatching the job by @paulocastellano in https://github.com/trypostit/trypost/pull/269
* Fix OpenRouter via laravel/ai default provider (revises #216) by @paulocastellano in https://github.com/trypostit/trypost/pull/220
* fix: LinkedIn company page post URL missing the post ID by @paulocastellano in https://github.com/trypostit/trypost/pull/272
* chore: remove LinkedIn Page post URL backfill command by @paulocastellano in https://github.com/trypostit/trypost/pull/273
* feat: capture ad click IDs for ad-platform conversion attribution by @paulocastellano in https://github.com/trypostit/trypost/pull/276
* feat: fire signup/checkout PostHog events from the backend by @paulocastellano in https://github.com/trypostit/trypost/pull/277
* fix: classify Pinterest content-policy rejections (code 1) instead of surfacing raw JSON by @paulocastellano in https://github.com/trypostit/trypost/pull/278
* chore: add Discord community announcement email + thumbnail by @paulocastellano in https://github.com/trypostit/trypost/pull/279
* Fix transient Threads media container failures by @paulocastellano in https://github.com/trypostit/trypost/pull/280
* Resume in-flight Instagram and TikTok publishes without duplicates by @paulocastellano in https://github.com/trypostit/trypost/pull/281
* feat: Asset Library list, preview, and attach via API and MCP by @paulocastellano in https://github.com/trypostit/trypost/pull/282
* Add social connect step to welcome before Stripe by @paulocastellano in https://github.com/trypostit/trypost/pull/293
* Remove the post-templates feature by @paulocastellano in https://github.com/trypostit/trypost/pull/296
* Fix 500 on the MCP settings page when a client has never been used by @paulocastellano in https://github.com/trypostit/trypost/pull/297
* Remove the X API reads that buy nothing by @paulocastellano in https://github.com/trypostit/trypost/pull/299
* Allow multiple social accounts per network via env by @HafizMMoaz in https://github.com/trypostit/trypost/pull/286
* Connect the Pages a login only reaches through a Business Portfolio by @paulocastellano in https://github.com/trypostit/trypost/pull/301
* Use whereLike for search so MySQL works alongside PostgreSQL by @jonto in https://github.com/trypostit/trypost/pull/302
* docs: surface per-provider AI model override env vars by @HafizMMoaz in https://github.com/trypostit/trypost/pull/290

## New Contributors
* @HafizMMoaz made their first contribution in https://github.com/trypostit/trypost/pull/286
* @jonto made their first contribution in https://github.com/trypostit/trypost/pull/302

**Full Changelog**: https://github.com/trypostit/trypost/compare/v1.0.7...v1.0.8
55 changes: 55 additions & 0 deletions releases/v1.0.8/email.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
---
subject: "Changelog v1.0.8 — Facebook Pages finally connect, reuse your media and more..."
---

# Changelog v1.0.8 — Facebook Pages finally connect, reuse your media and more...

By TryPost Product Team • [Release v1.0.8](https://github.com/trypostit/trypost/releases/tag/v1.0.8)

Hello! Welcome to this week's update. Here's what's new in TryPost.

## The Facebook Pages that wouldn't connect

If you administer a Facebook Page through a Business Portfolio rather than holding a direct role on the Page itself, which is how most Pages work these days, TryPost used to tell you it found no Pages at all. It was asking Facebook the wrong question. It now checks your Business Portfolio too, so those Pages show up in the picker with the rest.

The connect window also stopped guessing when it can't offer you a Page. It tells you which of the four things happened: you have no Pages, you have Pages you can't post to, you declined a permission we need, or we couldn't finish reading the list.

## Your long videos stop posting twice

If you sent a long video to Instagram or TikTok, you may have watched it go out twice, or seen TikTok report the post as done before the upload had actually finished. Both platforms process video in the background, and that takes longer than one publish attempt waits around for.

TryPost now saves its place. When a publish gets retried, it picks up the upload already in progress instead of starting a second one, so nothing goes out twice. Instagram waits for confirmation that the post is ready before publishing it. Threads had a cousin of this bug, where media reports as missing for a second or two right after it uploads fine; we retry that now instead of giving up.

## Reuse your media over the API

If you build against the TryPost API or connect an AI assistant to your workspace, your Asset Library is now reachable from both. You can list what's in there, preview a file, and attach it to a draft or scheduled post without uploading the same image a second time. Inside the app this already worked; now your integrations get it too.

## New features

- Connect your first social account during signup, before you reach checkout
- Browse, preview, and attach Asset Library files over the API and through connected AI assistants
- Self-hosted: connect more than one account per network by setting `ALLOW_MULTIPLE_SOCIAL_ACCOUNTS`
- Self-hosted: search now works on MySQL as well as PostgreSQL

## Fixes

- Pinterest now tells you the site doesn't allow saving Pins, instead of showing raw error data
- "View on LinkedIn" on a company page post opens the post itself, not the page's list of posts
- Your X connection stops quietly dropping out and asking to be reconnected
- AI post generation no longer misses the first few words it writes
- The MCP settings page no longer errors out if you've never connected a client
- Self-hosted: OpenRouter works as the AI provider again

## One thing we removed

The browsable post template catalog is gone. If you write posts from scratch or with AI, nothing changes for you.

Three people outside the team shipped work in this release. Thanks to James for finding the Business Portfolio bug and reproducing it against a live account, and to Hafiz and Jamie for multi-account support and MySQL.

Cheers,
Paulo from TryPost.it

---

You're receiving this because you subscribed.
[Unsubscribe]({{unsubscribe_url}})
Binary file added releases/v1.0.8/thumbnail.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.