v1.0.0-rc.3
Pre-releaseFeatures
-
the release announces itself as a carousel (34535f2) (by yohimik, Claude Fable 5)
The card was one page, and a changelog was cut to two or three entries a
section to make it fit. That was the constraint the whole card was designed
around, and it is gone.Page one is the cover: the version badge a thumbnail has to carry, the lede,
and the three install routes pinned to the bottom edge. The changelog carries
on across the pages after it, under a small version badge and a footer that
numbers the page. Both are drawn in the page margins, so they repeat without
being written into the flow, and the first page suppresses them because it
carries its own badge and because "1 / 1" on a short release says nothing.Each pass turns those pages into what its surface takes. The feed post is one
carousel. The story pass posts one story per page, in order, each live before
the next is created. Neither is a flag: crier works it out from the platform.
Stories have no cover-page opt-out — announcing a release without saying what
is in it is not a saving worth making.notes.sh keeps a ceiling of twenty entries a section, which is a guard against
absurdity rather than a design constraint: past it the render would exceed
render.pages-max and be refused outright, and a release with sixty entries in
one section is not one anybody reads to the end of.The end-to-end test now asserts the whole shape against a fake Graph API: a
child container per page, one parent listing them in order, one publish, and
then a story per page. The committed preview is both pages. -
the last three platforms, and where each number came from (1ddab98) (by yohimik, Claude Fable 5)
LinkedIn takes two to twenty as a multi-image post. One image is a different
shape entirely — content.media rather than content.multiImage, and a
multiImage of one is refused — so the shape follows the batch size rather than
a flag. TikTok's photo post was already a list of URLs, so several pages are
more entries in the request it always sent, up to the documented thirty-five.Reddit stays at one file per post on purpose. It has galleries, but the only
way to make one is an endpoint Reddit's own web client uses and Reddit
documents nowhere, with no published limit and no promise it keeps working.
Several ordinary posts that will still be there next month beat one gallery
built on that.The numbers are now sorted into the ones a platform documents and the ones
crier chose. Instagram's ten, Telegram's two-to-ten, x's four, LinkedIn's
twenty and TikTok's thirty-five are the platform's own words. Facebook,
Discord and Slack document the mechanism and no limit on it, so ten is crier's
ceiling rather than theirs, and the comments say so. Mastodon's four is the
instance's, advertised as max_media_attachments and merely defaulted to four,
so crier assumes the conservative number.One test lists every capacity with the source of each, so a number that
changes without that list changing is a post that would silently start
splitting. -
the platforms that take several files now do (21f8ef6) (by yohimik, Claude Fable 5)
Seven of the ten accept more than one file in a post, and each does it
differently. Every one of them keeps the page order.Instagram builds a carousel: a child container per image, a parent that lists
them, one publish. The caption belongs to the parent, which is what makes a
five-page changelog one entry in the feed rather than five. Stories have no
carousel at all, so a story run stays at one file and becomes one story per
page, published in order.Facebook uploads each photo unpublished and attaches the ids to one feed post.
Telegram sends a media group, with the caption on the first item because
Telegram shows an album's caption once; a batch of one still goes through
sendPhoto, since a media group has a minimum of two. x and Mastodon upload in
page order and list the ids. Discord numbers its file parts. Slack uploads each
file and shares the lot in one completeUploadExternal, which is what makes them
one message.A custom platform gets CRIER_ARTIFACTS and CRIER_URLS, one path per line
because a path may contain a space, plus a count and the post and page numbers.
Its capacity is whatever max-attachments says, since the command is the
platform and there is no API here to know better.The e2e suite proves the three shapes against the fakes: sequential stories,
one carousel, and a four-cap split. One scenario runs all three platforms
together and asserts each saw the same five pages in the same order. It is in
the smoke subset, so the release build proves it against the shipped bytes.LinkedIn, Reddit and TikTok still take one file each. They follow.
-
a page list becomes a sequence of posts (e1754f0) (by yohimik, Claude Fable 5)
The run has one ordered page list. Every platform receives it whole, in order,
and the only thing a platform may do to it is cut it into the sizes it accepts.
Nothing reorders, skips, merges or dedupes pages. That is what makes a carousel
at one platform and a run of single posts at another tell the same story in the
same sequence.Needs.MaxAttachments declares how many files a platform takes in one post, with
zero read as one. Every platform still declares one, so today a five-page
document is five posts everywhere; raising the numbers and implementing the
multi-file calls is the next commit. publish..max-attachments lowers
it, and only lowers it: asking a platform for more than it takes would only be
refused by the platform, which is a worse way to find out.A platform's posts go out one at a time, each finished before the next begins.
That is not caution. Several platforms order a feed by when a post completed,
so publishing two of one sequence at once is how a two-part post turns up back
to front. A post that fails stops the ones after it and the outcome says how
far it got: a gap in the middle of a sequence is worse than a short sequence,
because a reader cannot tell it happened. Platforms still run alongside each
other; the sequencing is within one.Captions are rendered once per post rather than once per run, with .Post,
.Posts, .Page and .Pages bound, so one line of configuration can write "2 of
3". They read 1 of 1 when nothing paginated, so a caption that mentions them is
safe to write either way. -
keep every page a document lays out into (8c35002) (by yohimik, Claude Fable 5)
Laying out was always producing pages. crier kept the first and refused the
rest, so a changelog too long for one card was an error telling you to shorten
it.It is a post now. A run produces one ordered page list, and that list is what
every platform receives: same pages, same order, everywhere. The fit is applied
per page, so a carousel is a set of pictures the same shape rather than one
fitted picture and four that were not. Staging gives each page an address of
its own, because a platform that fetches by URL fetches every page.render.pages-max, default 10, refuses a document past it. The check runs after
the layout, since the count is not knowable until the content has flowed: a
template with a loop that never ends fails here rather than at the platform,
which would have taken the first ten and said nothing about the rest. The hard
ceiling is 20, above every platform's own carousel limit bar Reddit's.A document that still fits on one page produces one page with the file name it
always had, so nothing downstream has to learn about pagination to keep
working.crier renderwrites the whole set, numbered when there is more than
one.Nothing publishes more than one page yet. That is the next commit.
Fixes
-
the page margin is the template's to choose (fdd258c) (by yohimik, Claude Fable 5)
crier appended its page rule after the document's own styles, and that rule
carried two declarations: the size and a zero margin. The size belongs there.
Putting it last is what makes --render-width win over a rule the template
happens to carry.The margin did not belong there. Appended last it overruled whatever margin the
template asked for, and a page's margin boxes draw in the page margin. With the
margin forced to zero they had no room: a running header and footer came out
clipped to a sliver, straddling the page edge. A paginated template could not
have worked, which is why this surfaced while verifying paged media at all.The rule is split across the document now. The margin goes first, as a default
a template can overrule. The size still goes last, where it cannot be. A
template that says nothing still gets an edge-to-edge page, because that is
what a social image is.Verified through the raster backend: page margin boxes paint, the page counters
resolve, the first-page selector picks page one, running headers from content
work, and a card that would straddle a page break moves whole. A three-page
golden pins the lot.
Authors
- yohimik
- Claude Fable 5
Install
curl -fsSL https://raw.githubusercontent.com/yohimik/crier/v1.0.0-rc.3/install.sh | CRIER_VERSION=1.0.0-rc.3 sh:CRIER_VERSION = '1.0.0-rc.3'
irm https://raw.githubusercontent.com/yohimik/crier/v1.0.0-rc.3/install.ps1 | iexdispat install yohimik/crier