Workflows
LinkedInActsYou approve first

Publish a post on LinkedIn, after you approve

Opens LinkedIn's post composer, stops with the phone held so you see the account and audience it will post as, then types the text you approved and posts it, confirming by the composer closing and the feed returning.

Inputs

textthe post, typed exactly as written; you can replace it at the pause

Run it

1. Reach the point of no return, and stop. Nothing is written here.

run_task({
  "allow_writes": true,
  "phases": [{
    "launch": "com.linkedin.android",
    "goal": "In the LinkedIn app, tap the Post button in the bottom navigation, or the 'Start a post' field at the top of the home feed, so the post composer opens. That button only opens the composer; it does not publish. Do not type and do not tap the Post button inside the composer.",
    "allowWrites": true,
    "pauseWhen": "LinkedIn's post composer is open: a 'Share your thoughts' or 'What do you want to talk about?' field and a Post button are showing",
    "maxSteps": 6
  }]
})

Poll until paused. The pause labels include the audience selector, usually 'Anyone', so you can see who will see it.

2. Show the user the text. Wait for a yes.

3. Post it.

resume_task({
  "task_id": "<id>",
  "text": "<text>",
  "allowWrites": true,
  "repeat": 1,
  "countLabel": "^post$",
  "goal": "Tap the Share your thoughts field so it is focused, type the text into it, then tap the Post button at the top right to publish it. Do not change the audience and do not add collaborators.",
  "maxSteps": 6
})

Poll until done. resume_task({ task_id, abandon: true }) closes the composer with nothing posted.

What comes back

result.phases[0].sent lists the post only when the composer closed and the feed returned. The Post button on LinkedIn is both the composer opener and the publisher; the operator's commit judgment tells them apart, which is why the first call can tap one and not the other.

Delete it

run_task({
  "allow_writes": true,
  "phases": [{
    "launch": "com.linkedin.android",
    "goal": "In the LinkedIn app, tap the profile picture at the top left so the side panel opens, then tap your name (View profile) to open the profile. Scroll down to the Activity section and tap Show all posts. Find the post that begins '<first words>', tap that post's three-dot menu, then tap Delete post so the confirmation shows. Delete only that post.",
    "findTexts": ["Show all posts", "<first words>"],
    "allowWrites": true,
    "pauseWhen": "LinkedIn's confirmation to delete the post that begins '<first words>' is showing",
    "maxSteps": 14
  }]
})

Then resume_task({ task_id, allowWrites: true, repeat: 1, countLabel: "^Delete$", goal: "Tap Delete to confirm, once." }).

Notes

  • Typing needs the MyPhonely server from 2026-10-06 on. Before then the text never landed in this composer and Post stayed disabled.
  • Measured 2026-10-06: posted and verified ("Post successful", 13 credits); deleted through the Delete it route ("Delete post? … permanently remove", 29 credits) and gone from the profile.
  • Whose name it posts under: the signed-in member's personal profile, not a company page. A test post is public until deleted; delete at once.
  • Writes are on in the first call because the composer opener is labelled Post; with writes off the operator will not tap it. Nothing is typed there, so the composer's own Post stays disabled.
  • Tapping the audience label (Anyone) on this build opened Add collaborators instead of the audience choice; the goal leaves the audience alone.
  • LinkedIn's composer may show 'Discard post?' on Back after text is typed. The abandon path presses Back before anything is typed, so it does not.
  • To attach media, push the file first with phone_push_file and add 'tap the photo icon and choose the newest image' to the resume goal.