{
  "_vault": "Robots on Payroll / The Vault. Guide + latest version: https://robotsonpayroll.com/resources/instagram-autoposter",
  "account": "@yourhandle",
  "notes": "Rename this file to queue.json and keep it next to post-to-instagram.mjs. One item is consumed per cron run (first item with status=pending). Statuses: pending -> done | failed. Set not_before (ISO date) to hold an item for a launch day. post-to-instagram.mjs writes published_at, media_id, and error fields back into this file.",
  "posts": [
    {
      "id": "2026-07-09-build-update",
      "status": "pending",
      "image_url": "https://yournewsletter.com/ig/2026-07-09.jpg",
      "caption": "I shipped the billing rewrite in 6 days. The old estimate was 6 weeks.\n\nWhat changed: I stopped writing the code and started writing the spec. The agent did the rest, I reviewed diffs.\n\n3 things that made it work:\n1. One markdown spec per module, written before any code\n2. A test suite the agent had to keep green\n3. Reviewing every diff like a PR from a fast junior dev\n\nWhat would you hand off first if review was the only job left?\n\n#buildinpublic #aicoding #indiehacker #solodev",
      "alt_text": "Screenshot of a git log showing 47 commits over 6 days on a billing-rewrite branch",
      "pillar": "build-in-public",
      "cta_type": "comment"
    },
    {
      "id": "2026-07-10-howto-queue",
      "status": "pending",
      "image_url": "https://yournewsletter.com/ig/2026-07-10.jpg",
      "caption": "You don't need a $99/mo scheduler to post daily. You need a JSON file and a cron job.\n\nThe whole system:\n- queue.json holds a month of posts\n- a 200-line script posts the next one every morning\n- the official Instagram API does the publishing, free\n\nSave this. When your scheduler subscription renews next month, you'll want it.\n\n#automation #instagramapi #buildinpublic #devtools",
      "alt_text": "Terminal window showing a cron job successfully publishing an Instagram post",
      "pillar": "tactical-howto",
      "cta_type": "save"
    },
    {
      "id": "2026-07-11-hot-take",
      "status": "pending",
      "not_before": "2026-07-11T00:00:00Z",
      "image_url": "https://yournewsletter.com/ig/2026-07-11.jpg",
      "caption": "Unpopular opinion: most 'content calendars' are procrastination with a UI.\n\nA month of posts is one prompt session plus one JSON file. I batch mine on the first Sunday of the month, 90 minutes, done.\n\nFull walkthrough is in my newsletter, link in bio.\n\n#contentcreation #contentstrategy #creatoreconomy",
      "alt_text": "A single JSON file open in an editor containing 30 queued Instagram posts",
      "pillar": "opinion",
      "cta_type": "link"
    },
    {
      "id": "2026-07-08-example-done",
      "status": "done",
      "image_url": "https://yournewsletter.com/ig/2026-07-08.jpg",
      "caption": "Day 1 of posting via my own script instead of a scheduler. This post was published by 200 lines of Node and a cron job.\n\n#buildinpublic #automation",
      "alt_text": "Code editor showing a Node.js script named post-to-instagram.mjs",
      "pillar": "build-in-public",
      "cta_type": "none",
      "published_at": "2026-07-08T09:30:41.000Z",
      "media_id": "17900000000000000"
    },
    {
      "id": "2026-07-07-example-failed",
      "status": "failed",
      "image_url": "https://yournewsletter.com/ig/2026-07-07.png",
      "caption": "This one failed on purpose so you can see what a failure looks like in the queue.",
      "alt_text": "Example of a failed queue item",
      "pillar": "tactical-howto",
      "cta_type": "none",
      "error": "image_url does not look like a JPEG (API is JPEG-only for images)",
      "failed_at": "2026-07-07T09:30:12.000Z"
    }
  ]
}
