postemi 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,15 +3,16 @@
3
3
  Every channel Postemi supports, and every field its `--settings` payload accepts.
4
4
 
5
5
  **The channels below are the whole list.** Postemi's server carries inherited
6
- code for many other providers — Reddit, Mastodon, Medium, Dev.to, Hashnode,
7
- WordPress, Lemmy, Nostr, VK, Tumblr, Dribbble, Farcaster and others.
8
- None of them are enabled or supported. Do not build a settings payload for one.
6
+ code for many other providers: Reddit, Medium, Hashnode, Lemmy, Nostr, VK,
7
+ Dribbble, Farcaster and others. None of them are enabled or supported. Do not
8
+ build a settings payload for one.
9
9
 
10
10
  | Channel | `__type` | Has settings? | Status |
11
11
  |---|---|---|---|
12
12
  | X (Twitter) | `x` | yes | Publishing verified |
13
13
  | Facebook | `facebook` | yes, all optional | Publishing verified |
14
14
  | Instagram | `instagram` | yes | Publishing verified |
15
+ | Instagram (no Facebook Page) | `instagram-standalone` | yes, same as Instagram | Live |
15
16
  | Threads | `threads` | **no** | Publishing verified |
16
17
  | Bluesky | `bluesky` | **no** | Publishing verified |
17
18
  | LinkedIn | `linkedin` | yes, all optional | Publishing verified |
@@ -20,7 +21,18 @@ None of them are enabled or supported. Do not build a settings payload for one.
20
21
  | Slack | `slack` | yes, `channel` required | Publishing verified |
21
22
  | YouTube | `youtube` | yes | Publishing verified |
22
23
  | TikTok | `tiktok` | yes | Publishing verified |
23
- | Pinterest | `pinterest` | yes, `board` required | BETA: pins visible only to their creator until Pinterest grants Standard access |
24
+ | Pinterest | `pinterest` | yes, `board` required | Coming soon: cannot be connected until Pinterest approves Postemi's app |
25
+ | Mastodon (mastodon.social) | `mastodon` | **no** | BETA |
26
+ | Mastodon (any other server) | `mastodon-custom` | **no** | BETA |
27
+ | Pixelfed | `pixelfed` | **no** | BETA |
28
+ | WordPress | `wordpress` | yes, `title` and `type` required | BETA |
29
+ | Tumblr | `tumblr` | yes, all optional | BETA |
30
+ | Dev.to | `devto` | yes, `title` required | BETA |
31
+ | Ghost | `ghost` | yes, `title` required | BETA |
32
+ | Google Chat | `google-chat` | **no** | BETA |
33
+ | Microsoft Teams | `microsoft-teams` | **no** | BETA |
34
+ | Google Business Profile | `gmb` | yes, all optional | Coming soon, not schedulable yet |
35
+ | LinkedIn Pages | `linkedin-page` | yes, same as LinkedIn | Coming soon, not schedulable yet |
24
36
 
25
37
  Source of truth for everything on this page:
26
38
  `libraries/nestjs-libraries/src/dtos/posts/providers-settings/*.ts` in the Postemi
@@ -314,8 +326,8 @@ postemi posts:create -c "Release notes are out" -s "2026-12-31T12:00:00Z" \
314
326
 
315
327
  ## Pinterest — `pinterest`
316
328
 
317
- **BETA.** Until Pinterest grants Postemi Standard access, a pin is visible only
318
- to the account that created it. Tell the user before you schedule one.
329
+ **Coming soon.** Postemi customers cannot connect Pinterest until Pinterest
330
+ approves Postemi's app. The settings below apply once it opens.
319
331
 
320
332
  | Field | Values |
321
333
  |---|---|
@@ -337,6 +349,169 @@ postemi posts:create -c "Autumn recipes" -m "$IMG" -s "2026-12-31T12:00:00Z" \
337
349
 
338
350
  ---
339
351
 
352
+ ## Instagram without a Facebook Page: `instagram-standalone`
353
+
354
+ The same settings as `instagram` (`post_type` required, the rest optional).
355
+ The `audioSearch` tool is not available on this channel: it exists only on
356
+ `instagram`.
357
+
358
+ ```bash
359
+ IMG=$(postemi upload photo.jpg | jq -r '.path')
360
+ postemi posts:create -c "New menu" -s "2026-12-31T12:00:00Z" \
361
+ --settings '{"post_type":"post"}' -m "$IMG" -i "$IGS_ID"
362
+ ```
363
+
364
+ ---
365
+
366
+ ## Mastodon: `mastodon` and `mastodon-custom`
367
+
368
+ **No settings.** Same as Threads. `mastodon` is an account on mastodon.social;
369
+ `mastodon-custom` is an account on any other Mastodon server, chosen when the
370
+ user connects it. A post is at most 500 characters on mastodon.social (other
371
+ servers can set their own limit).
372
+
373
+ ```bash
374
+ postemi posts:create -c "Post text" -s "2026-12-31T12:00:00Z" -i "$MASTODON_ID"
375
+ ```
376
+
377
+ ---
378
+
379
+ ## Pixelfed: `pixelfed`
380
+
381
+ **No settings.** Pixelfed is a photo network on any server, chosen when the
382
+ user connects it. Every post needs at least one picture and takes at most 4
383
+ (JPEG, PNG or GIF; no video). The caption is at most 500 characters.
384
+
385
+ ```bash
386
+ IMG=$(postemi upload photo.jpg | jq -r '.path')
387
+ postemi posts:create -c "Morning light" -s "2026-12-31T12:00:00Z" -m "$IMG" -i "$PIXELFED_ID"
388
+ ```
389
+
390
+ ---
391
+
392
+ ## WordPress: `wordpress`
393
+
394
+ The post's `-c` content becomes the article body (HTML).
395
+
396
+ | Field | Required | Values |
397
+ |---|---|---|
398
+ | `title` | **yes** | at least 2 characters |
399
+ | `type` | **yes** | a post type id from the `postTypes` tool, e.g. `posts` or `pages` |
400
+ | `main_image` | no | A media object from `postemi upload` (the featured image) |
401
+ | `categories` | no | array of category ids (numbers) from the `categoriesList` tool |
402
+ | `tags` | no | array of tag ids (numbers) from the `tagsList` tool |
403
+ | `status` | no | `publish` (default), `draft`, `pending`, `private` |
404
+
405
+ ```bash
406
+ postemi integrations:trigger "$WP_ID" postTypes | jq '.output'
407
+ postemi integrations:trigger "$WP_ID" categoriesList | jq '.output'
408
+ postemi integrations:trigger "$WP_ID" tagsList | jq '.output'
409
+ postemi posts:create -c "<p>Our autumn menu is here.</p>" -s "2026-12-31T12:00:00Z" \
410
+ --settings '{"title":"Autumn menu","type":"posts","categories":[3],"tags":[12,14]}' \
411
+ -i "$WP_ID"
412
+ ```
413
+
414
+ ---
415
+
416
+ ## Tumblr: `tumblr`
417
+
418
+ All fields optional. The blog is chosen when the user connects the channel.
419
+
420
+ | Field | Values |
421
+ |---|---|
422
+ | `title` | 1 to 4096 characters, shown as the heading of the post |
423
+ | `link` | A URL, added to the post as a link block |
424
+ | `sourceUrl` | A URL, the post's source |
425
+ | `tags` | comma separated tags, at most 4096 characters |
426
+
427
+ ```bash
428
+ postemi posts:create -c "Post text" -s "2026-12-31T12:00:00Z" \
429
+ --settings '{"title":"Autumn menu","tags":"food,autumn"}' -i "$TUMBLR_ID"
430
+ ```
431
+
432
+ ---
433
+
434
+ ## Dev.to: `devto`
435
+
436
+ The post's `-c` content becomes the article body (Markdown). The article is
437
+ published at the scheduled time.
438
+
439
+ | Field | Required | Values |
440
+ |---|---|---|
441
+ | `title` | **yes** | at least 2 characters |
442
+ | `main_image` | no | A media object from `postemi upload` (the cover image) |
443
+ | `canonical` | no | A URL, the original of the article |
444
+ | `organization` | no | an organization id from the `organizations` tool, as a string |
445
+ | `tags` | no | up to 4 items of `{ "value": <number>, "label": "<name>" }` from the `tags` tool |
446
+
447
+ ```bash
448
+ postemi integrations:trigger "$DEVTO_ID" tags | jq '.output[:5]'
449
+ postemi integrations:trigger "$DEVTO_ID" organizations | jq '.output'
450
+ postemi posts:create -c "## Why we built it..." -s "2026-12-31T12:00:00Z" \
451
+ --settings '{"title":"Shipping a CLI","tags":[{"value":8,"label":"javascript"}]}' \
452
+ -i "$DEVTO_ID"
453
+ ```
454
+
455
+ ---
456
+
457
+ ## Ghost: `ghost`
458
+
459
+ The post's `-c` content becomes the article body (HTML).
460
+
461
+ | Field | Required | Values |
462
+ |---|---|---|
463
+ | `title` | **yes** | 1 to 255 characters |
464
+ | `status` | no | `published` (default, at the scheduled time) or `draft` (a Ghost draft) |
465
+ | `tags` | no | comma separated tag names, at most 1000 characters |
466
+ | `excerpt` | no | at most 300 characters |
467
+ | `main_image` | no | A media object from `postemi upload` (the feature image) |
468
+
469
+ ```bash
470
+ postemi posts:create -c "<p>Our autumn menu is here.</p>" -s "2026-12-31T12:00:00Z" \
471
+ --settings '{"title":"Autumn menu","tags":"menu,autumn","excerpt":"What is new this season."}' \
472
+ -i "$GHOST_ID"
473
+ ```
474
+
475
+ ---
476
+
477
+ ## Google Chat and Microsoft Teams: `google-chat`, `microsoft-teams`
478
+
479
+ **No settings.** Same as Threads. The space (Google Chat) or the channel
480
+ (Teams) is fixed by the webhook the user gives when connecting. A message is
481
+ at most 4096 characters on Google Chat and 10000 on Teams.
482
+
483
+ ```bash
484
+ postemi posts:create -c "Release notes are out" -s "2026-12-31T12:00:00Z" -i "$GCHAT_ID"
485
+ ```
486
+
487
+ ---
488
+
489
+ ## Google Business Profile: `gmb` (coming soon)
490
+
491
+ **Not schedulable yet:** Google has not approved Postemi, so the user cannot
492
+ connect it. For reference, the settings the server accepts, all optional:
493
+
494
+ | Field | Values |
495
+ |---|---|
496
+ | `topicType` | `STANDARD`, `EVENT`, `OFFER` |
497
+ | `callToActionType` | `NONE`, `BOOK`, `ORDER`, `SHOP`, `LEARN_MORE`, `SIGN_UP`, `GET_OFFER`, `CALL` |
498
+ | `callToActionUrl` | A URL, checked when `callToActionType` is set |
499
+ | `eventTitle` | string, for `EVENT` |
500
+ | `eventStartDate`, `eventEndDate`, `eventStartTime`, `eventEndTime` | strings |
501
+ | `offerCouponCode`, `offerTerms` | strings, for `OFFER` |
502
+ | `offerRedeemUrl` | A URL |
503
+
504
+ A post takes at most one image and no video.
505
+
506
+ ---
507
+
508
+ ## LinkedIn Pages: `linkedin-page` (coming soon)
509
+
510
+ **Not schedulable yet:** LinkedIn has not approved Postemi for company pages.
511
+ When it does, the settings are the same as `linkedin`.
512
+
513
+ ---
514
+
340
515
  ## Finding your integration ids
341
516
 
342
517
  ```bash
@@ -353,7 +528,8 @@ YT_ID=$(postemi integrations:list | jq -r '.[] | select(.identifier=="youtube")
353
528
  If a channel is not in `integrations:list`, the user cannot post to it. For
354
529
  Google Business Profile and LinkedIn company pages that is the expected state
355
530
  until those platforms approve the app (personal LinkedIn profiles work).
356
- Pinterest is live as a BETA channel. Say so rather than scheduling a post that will fail.
531
+ The BETA channels are live. Say so rather than scheduling
532
+ a post that will fail.
357
533
 
358
534
  ---
359
535
 
package/README.md CHANGED
@@ -7,7 +7,10 @@ command-line tool. It uses the same public API as the web app: what you
7
7
  schedule here shows up in your Postemi calendar, and what you schedule there
8
8
  you can see here too.
9
9
 
10
- Channels: 20 platforms, including Facebook, Instagram, X, LinkedIn, TikTok, YouTube, Threads, Bluesky, Pinterest and Mastodon.
10
+ Channels: 25+ platforms, including Facebook, Instagram, X, LinkedIn, TikTok, YouTube, Threads, Bluesky, Pinterest and Mastodon.
11
+
12
+ Plan: the CLI, the API and MCP need the Pro plan or higher (Pro, Creator or
13
+ Team). Basic has no API access.
11
14
 
12
15
  [`SKILL.md`](./SKILL.md) is the full command reference, written for AI agents.
13
16
  Show it to Claude, ChatGPT, Codex, OpenClaw or Hermes and they can use the
@@ -42,9 +45,10 @@ postemi auth:signup --email anna@example.com --code 123456 --accept-terms --work
42
45
  ```
43
46
 
44
47
  The person must agree to https://postemi.com/terms and
45
- https://postemi.com/privacy first. There is no free trial: next come
46
- `postemi billing:plans` and `postemi billing:subscribe`. You can also sign up
47
- at https://postemi.com/app/signup and then run `postemi auth:login`.
48
+ https://postemi.com/privacy first. An account made with `postemi auth:signup`
49
+ has no free trial: next come `postemi billing:plans` and
50
+ `postemi billing:subscribe`. Signing up at https://postemi.com/app/signup
51
+ instead starts a 7-day free trial; then run `postemi auth:login`.
48
52
 
49
53
  For a server, CI or an agent without a browser, use an API key from
50
54
  Settings, Developers in the web app:
@@ -62,9 +66,7 @@ export POSTEMI_API_KEY=your_api_key
62
66
  | `POSTEMI_AUTH_SERVER` | `https://api.postemi.com` | Where `auth:login` runs the device flow |
63
67
  | `POSTEMI_CLIENT_NAME` | `Postemi CLI` | Name shown on the approval page |
64
68
 
65
- Each `POSTEMI_*` variable falls back to its `POSTY_*` twin, so a machine set up
66
- for the Posty CLI keeps working. Stored credentials from `auth:login` take
67
- precedence over `POSTEMI_API_KEY`.
69
+ Stored credentials from `auth:login` take precedence over `POSTEMI_API_KEY`.
68
70
 
69
71
  ## Quick start
70
72
 
@@ -81,6 +83,28 @@ postemi posts:create -c "Hello from the terminal" -m "$IMG" \
81
83
  Results are JSON on stdout; status lines and errors go to stderr, and every
82
84
  failure exits 1. Run `postemi <command> --help` for each command.
83
85
 
86
+ ## Agent skills (optional)
87
+
88
+ The CLI can install its skills into the coding agents on your machine
89
+ (Claude Code `~/.claude/skills`, Codex `~/.codex/skills` or
90
+ `$CODEX_HOME/skills`, Cursor `~/.cursor/skills`, Grok Build
91
+ `~/.grok/skills`). The core `postemi` skill comes with any of them; the other
92
+ two are optional:
93
+
94
+ ```bash
95
+ postemi skills list # core, writing, growth: installed where
96
+ postemi skills add writing # ideas, hooks, formatting, templates
97
+ postemi skills add growth # niche, cadence, 30-day plan
98
+ postemi skills add all --agent claude --yes
99
+ postemi skills remove growth
100
+ ```
101
+
102
+ After `postemi auth:login` on a terminal the CLI asks once whether you want
103
+ the writing and the growth skill (default No) and remembers the answers in
104
+ `~/.postemi/config.json`. It never asks when an agent or a script runs it (no
105
+ terminal, `--json`, or `CI` set); it prints one hint line instead, once.
106
+ With several agents found it asks which; `--agent` and `--yes` skip that.
107
+
84
108
  ## More
85
109
 
86
110
  - [`SKILL.md`](./SKILL.md): every command, flag and rule
@@ -91,5 +115,59 @@ failure exits 1. Run `postemi <command> --help` for each command.
91
115
  - Help: https://postemi.com/help, support: norbert@postemi.com
92
116
  - Privacy: https://postemi.com/privacy, terms: https://postemi.com/terms
93
117
 
94
- License: AGPL-3.0. Source: https://github.com/norbertlevente/posty-agent
95
- (the same source builds the Posty CLI, `posty-cli`, for posty.hu).
118
+ ## Plugins for AI agents
119
+
120
+ This repository also holds the Postemi plugins, in [`plugins/`](./plugins):
121
+
122
+ | Folder | For | What it is |
123
+ |---|---|---|
124
+ | [`plugins/postemi-mcp`](./plugins/postemi-mcp) | Claude (chat, desktop, Code) | The hosted MCP server `https://mcp.postemi.com/mcp` plus a skill |
125
+ | [`plugins/postemi-cli`](./plugins/postemi-cli) | Claude Code | This CLI's skill; the agent runs `postemi` commands |
126
+ | [`plugins/postemi-chatgpt`](./plugins/postemi-chatgpt) | ChatGPT | The ChatGPT app package |
127
+ | [`plugins/postemi-cursor`](./plugins/postemi-cursor) | Cursor | MCP server, skill and commands |
128
+ | [`plugins/postemi-grok`](./plugins/postemi-grok) | Grok Build | MCP server, skill and commands |
129
+ | [`plugins/postemi-growth`](./plugins/postemi-growth) | Claude Code, Cursor, Grok Build | Optional: the growth skill only |
130
+
131
+ In Claude Code:
132
+
133
+ ```bash
134
+ claude plugin marketplace add norbertlevente/postemi-agent
135
+ claude plugin install postemi@postemi-agent # MCP server
136
+ claude plugin install postemi-cli@postemi-agent # CLI skill
137
+ ```
138
+
139
+ The skill on its own (for OpenClaw and other agents) is
140
+ [`skills/postemi/SKILL.md`](./skills/postemi/SKILL.md).
141
+
142
+ ### Writing and growth skills
143
+
144
+ Three more skills help the agent write the posts, not only schedule them:
145
+
146
+ | Skill | What it teaches | In the plugins |
147
+ |---|---|---|
148
+ | [`skills/postemi-writing`](./skills/postemi-writing) | post ideas, hooks and headlines, opening lines, formatting, threads, each network's writing rules, a check before publishing | in every main plugin |
149
+ | [`skills/postemi-templates`](./skills/postemi-templates) | the template and hook library of the Postemi composer, generated from the web app | in every main plugin, with writing |
150
+ | [`skills/postemi-growth`](./skills/postemi-growth) | choosing networks and a first niche, a 30-day test, reading the numbers, cadence, 30 angles for one topic, repurposing, bios and profile links, a weekly review | optional: its own plugin, [`plugins/postemi-growth`](./plugins/postemi-growth) |
151
+
152
+ ```bash
153
+ claude plugin install postemi-growth@postemi-agent # the optional growth plugin
154
+ ```
155
+
156
+ With the CLI, writing and growth are both optional; see below.
157
+
158
+ ## Development
159
+
160
+ ```bash
161
+ pnpm install
162
+ pnpm build # dist/index.js
163
+ pnpm test # type check, build, unit tests (test/), scripts/check.mjs (manifests, skill copies, no other-brand text)
164
+ node dist/index.js --help
165
+
166
+ pnpm sync:templates ../postemi/src/lib/app/templates # regenerate skills/postemi-templates/reference from the web app
167
+ pnpm sync:skills # copy writing and templates into the main plugins, growth into postemi-growth
168
+ ```
169
+
170
+ Release steps: [`PUBLISHING.md`](./PUBLISHING.md). Changes: [`CHANGELOG.md`](./CHANGELOG.md).
171
+
172
+ License: AGPL-3.0, see [`LICENSE`](./LICENSE).
173
+ Source: https://github.com/norbertlevente/postemi-agent
package/SKILL.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: postemi
3
- description: Postemi schedules and publishes social posts from the command line to 20 platforms, including Facebook, Instagram, X, LinkedIn, TikTok, YouTube, Threads, Bluesky, Pinterest and Mastodon.
3
+ description: Postemi schedules and publishes social posts from the command line to 25+ platforms, including Facebook, Instagram, X, LinkedIn, TikTok, YouTube, Threads, Bluesky, Pinterest and Mastodon.
4
4
  homepage: https://postemi.com
5
5
  metadata: {"openclaw":{"emoji":"🌎","requires":{"bins":[],"env":[]}}}
6
6
  ---
@@ -33,36 +33,58 @@ MCP server, for chat clients without a terminal: https://mcp.postemi.com/mcp
33
33
 
34
34
  **Only these. Do not offer a user anything else, and do not try to post to it.**
35
35
  Postemi's server carries inherited code for many more providers; that code is not
36
- enabled and not supported.
37
-
38
- | Channel | `identifier` |
39
- |---|---|
40
- | X (Twitter) | `x` |
41
- | Facebook (Pages) | `facebook` |
42
- | Instagram | `instagram` |
43
- | LinkedIn (member feed) | `linkedin` |
44
- | TikTok | `tiktok` |
45
- | YouTube | `youtube` |
46
- | Threads | `threads` |
47
- | Bluesky | `bluesky` |
48
- | Telegram | `telegram` |
49
- | Discord | `discord` |
50
- | Slack | `slack` |
51
- | Pinterest (BETA) | `pinterest` |
52
-
53
- **Pinterest is a BETA channel.** Until Pinterest grants Postemi Standard access, a
54
- pin is visible only to the account that created it. Tell the user this before
55
- you schedule a pin. A pin needs a `board` id in `--settings`; get the ids with
56
- `postemi integrations:trigger <integration-id> boards` (see PROVIDER_SETTINGS.md).
36
+ enabled and not supported. Postemi adds channels over time, so
37
+ `integrations:list` (below) can show one that is not in this table yet.
38
+
39
+ | Channel | `identifier` | Status |
40
+ |---|---|---|
41
+ | X (Twitter) | `x` | Live |
42
+ | Facebook (Pages) | `facebook` | Live |
43
+ | Instagram (business account through a Facebook Page) | `instagram` | Live |
44
+ | Instagram (professional account, no Facebook Page) | `instagram-standalone` | Live |
45
+ | LinkedIn (member feed) | `linkedin` | Live |
46
+ | TikTok | `tiktok` | Live |
47
+ | YouTube | `youtube` | Live |
48
+ | Threads | `threads` | Live |
49
+ | Bluesky | `bluesky` | Live |
50
+ | Telegram | `telegram` | Live |
51
+ | Discord | `discord` | Live |
52
+ | Slack | `slack` | Live |
53
+ | Pinterest | `pinterest` | Coming soon, not schedulable yet |
54
+ | Mastodon (mastodon.social) | `mastodon` | BETA |
55
+ | Mastodon (any other server) | `mastodon-custom` | BETA |
56
+ | Pixelfed (any server) | `pixelfed` | BETA |
57
+ | WordPress (your own site) | `wordpress` | BETA |
58
+ | Tumblr | `tumblr` | BETA |
59
+ | Dev.to | `devto` | BETA |
60
+ | Ghost (your own site) | `ghost` | BETA |
61
+ | Google Chat (a space, by webhook) | `google-chat` | BETA |
62
+ | Microsoft Teams (a channel, by webhook) | `microsoft-teams` | BETA |
63
+ | Google Business Profile | `gmb` | Coming soon, not schedulable yet |
64
+ | LinkedIn Pages (company pages) | `linkedin-page` | Coming soon, not schedulable yet |
65
+
66
+ **Pinterest is coming soon.** Postemi customers cannot connect it until Pinterest
67
+ approves Postemi's app, so it never appears in `integrations:list`. Tell the user
68
+ it is not available yet. (When it opens, a pin needs a `board` id in
69
+ `--settings`; see PROVIDER_SETTINGS.md.)
70
+
71
+ **The other BETA channels** connect and publish, but Postemi has not tried them
72
+ with many real accounts yet. Say so when the user picks one. Most need
73
+ settings (a title for WordPress, Dev.to and Ghost; a picture for Pixelfed);
74
+ see PROVIDER_SETTINGS.md.
75
+
76
+ **Google Business Profile and LinkedIn Pages are coming soon.** Those platforms
77
+ have not approved Postemi yet, so the user cannot connect them. Do not schedule
78
+ for them; personal LinkedIn profiles (`linkedin`) work today.
57
79
 
58
80
  **`integrations:list` is the truth.** The table says what Postemi supports; that
59
81
  command says what THIS user has actually connected. Check it before you
60
82
  schedule anything, and never post to an id that is not in its output.
61
83
 
62
- **Never assume another provider exists.** If a user asks for Mastodon, Reddit,
63
- Google Business Profile, Medium, Dev.to, WordPress, Tumblr, Farcaster or
64
- anything else, the answer is that Postemi does not offer it. Do not
65
- build a `--settings` payload for it.
84
+ **Never assume another provider exists.** If a user asks for Reddit, Medium,
85
+ Farcaster, Hashnode, Lemmy, Nostr, VK, a newsletter service or anything else
86
+ that is not in the table, the answer is that Postemi does not offer it today.
87
+ Do not build a `--settings` payload for it.
66
88
 
67
89
  ---
68
90
 
@@ -106,7 +128,8 @@ If not authenticated:
106
128
  You never see or handle a key.
107
129
  2. **No account yet:** `postemi auth:signup` creates one, see below. Only when
108
130
  the user asks you to create a Postemi account for them. They can also sign
109
- up at https://postemi.com/app/signup and then run `postemi auth:login`.
131
+ up at https://postemi.com/app/signup, which starts a 7-day free trial, and
132
+ then run `postemi auth:login`.
110
133
 
111
134
  ### Creating an account for the user (no free trial)
112
135
 
@@ -518,9 +541,10 @@ postemi posts:create -c "Content" -s "2026-12-31T12:00:00Z" -m "$VIDEO_PATH" -i
518
541
  ### Pattern 1: Discover & Use Integration Tools
519
542
 
520
543
  **Most supported channels have no tools at all.** Of the channels in the table
521
- at the top of this file, four expose a tool: Instagram (`audioSearch`),
522
- Discord (`channels`), Slack (`channels`) and Pinterest (`boards`). X, Facebook, Threads, Bluesky,
523
- YouTube, LinkedIn, TikTok and Telegram expose none: `integrations:settings`
544
+ at the top of this file, six expose a tool: Instagram (`audioSearch`),
545
+ Discord (`channels`), Slack (`channels`), Pinterest (`boards`), WordPress
546
+ (`postTypes`, `categoriesList`, `tagsList`) and Dev.to (`tags`,
547
+ `organizations`). The others expose none: `integrations:settings`
524
548
  returns an empty `tools` array for them, and `integrations:trigger` on them
525
549
  returns `404 Tool not found`.
526
550
 
@@ -979,6 +1003,31 @@ State these plainly rather than attempting a workaround.
979
1003
 
980
1004
  ---
981
1005
 
1006
+ ## Optional skills: writing and growth
1007
+
1008
+ Two more Postemi skills are optional. They are not installed unless the user
1009
+ chose them:
1010
+
1011
+ | Skill | What it adds | Install |
1012
+ |---|---|---|
1013
+ | writing (`postemi-writing` + `postemi-templates`) | post ideas, hooks, formatting, each network's writing rules, the composer's templates | `postemi skills add writing` |
1014
+ | growth (`postemi-growth`) | choosing a niche, cadence per network, a 30-day plan, the weekly review | `postemi skills add growth` |
1015
+
1016
+ ```bash
1017
+ postemi skills list # core + optional, and where each is installed (JSON)
1018
+ postemi skills add writing --json # into every agent found (Claude Code, Codex, Cursor, Grok Build)
1019
+ postemi skills add growth --agent claude --json
1020
+ postemi skills remove growth --json
1021
+ ```
1022
+
1023
+ When the user asks for help writing posts or planning content and
1024
+ `postemi skills list` shows the skill as missing, **offer** it: say what it
1025
+ adds and ask. Run `postemi skills add` only after the user says yes; never
1026
+ install it silently. Pass `--json` (or run without a terminal) so the CLI asks
1027
+ no questions; a new agent session loads the skills.
1028
+
1029
+ ---
1030
+
982
1031
  ## Supporting Resources
983
1032
 
984
1033
  **This file is the command reference.** Everything the CLI accepts is
@@ -1062,6 +1111,10 @@ postemi analytics:post <id> -d 30 # Post analytics (30 days)
1062
1111
  postemi posts:missing <id> # List provider content
1063
1112
  postemi posts:connect <id> --release-id "<rid>" # Connect content to post
1064
1113
 
1114
+ # Optional skills (ask the user first)
1115
+ postemi skills list # Core + optional skills, where installed
1116
+ postemi skills add writing|growth --json # Install an optional skill
1117
+
1065
1118
  # Help
1066
1119
  postemi --help # Show help
1067
1120
  postemi posts:create --help # Command help