inkslot
GitHub

Using it

Writing posts

One post = one Markdown file in posts/texts/. Name it after its day, e.g. 2026-12-01-launch.md: the file name (without .md) is the post’s id. Files starting with _ are templates and are never synced.

---
date: 2026-12-01
time: 09:00
status: ready
visibility: PUBLIC
media: images/launch.png
first_comment: The docs: https://example.com
---
**The hook, in bold.**

The text of the post.

#typescript #backend

Header fields

Field Required Meaning
date yes The day it goes out, YYYY-MM-DD, in the timezone of scheduler.json.
time no HH:MM, defaultTime of scheduler.json otherwise (09:00).
status no draft (kept out of the queue, the default) or ready (scheduled). These are the only values you write; the sync and the Worker set the rest. See When posts go out.
media no One image (png, jpg, gif) or one mp4 video, relative to posts/ (e.g. images/x.png), or an https:// URL.
visibility no PUBLIC (default) or CONNECTIONS.
first_comment no Posted as your first comment, right after the post.

A comment after a value ( # like this, with spaces around #) is allowed in the header. Hashtags and URLs with # are kept.

The text

  • Bold: LinkedIn has no markup. Write **words** and they are sent in Unicode bold (accented letters included). Keep it for the hook: screen readers read these characters poorly.
  • Links: LinkedIn shows posts with external links to fewer people. Put links in first_comment.
  • Length: at most 3,000 characters.
  • Video: mp4, up to 25 MB in KV (a short, web-compressed clip usually fits), up to 200 MB with the optional R2 bucket. LinkedIn processes a video for up to a few minutes before it is posted.

Timezone

scheduler.json:

{ "timezone": "Europe/Paris", "defaultTime": "09:00" }

Times in posts are in that timezone; the database stores them in UTC, so daylight saving changes are handled.

Before you push

The push checks every post before writing anything: one wrong file (bad date, missing image) stops the whole sync with the list of errors, and nothing changes. To see exactly what a push would do:

pnpm exec wrangler login        # once
node scripts/sync.mjs --remote --dry-run

Changing or deleting a post

  • Not yet published: edit the file and push. Any change (text, time, status) re-arms the post, with its tries reset. Delete the file and push: the post is cancelled.
  • Already published: the scheduler never touches it again. Edit or delete it on LinkedIn.