Existing Post Types:

A "post type" is just a template living in templates/html/components/forms/. Every post picks exactly one of them — it's what the Content Template dropdown selects when you edit a Series.

Description — what this post type is for Shown here when somebody picks this type. It is stored in the sidecar under x-tcms-post-type, which the validator never sees, so it can say whatever is useful.

Create a new Post Type:

Picking an existing type above fills this form in with what that type was made from, so you can change one thing and save it back. Overwrite is ticked for you when you do, since saving it under the same name is the point — change the name and you get a copy instead.
This writes a new template into the forms directory currently in use (<: $forms_dir :>) along with a matching .json sidecar describing any custom fields, so that the data model knows to keep them when a post is saved.
Type Name * — letters, numbers, dash and underscore only

Canned Fields

Most post types reuse the same handful of blocks. Tick whichever ones this type needs. The title input, the visibility selector (visibility.tx) and the ACL selector (acls.tx) are always included — every post has all three, and a type whose editor cannot set them produces posts nobody can title, find or restrict.








Title placeholder text

Where the posts come from

A datasource builds this type's posts from somewhere else every time the page is drawn, rather than from posts anybody wrote — and if it says its posts cannot be written, no editor is generated at all, because there would be nothing behind the form to save.
Content Body — this is always the last thing in the editor, and is what carries the post body itself.

Custom Fields

These become extra inputs in the editor, and are available in your display template below as <: $post.your_field_name :>. Uploads aren't supported here — use the Attachment uploader above for those.
Whatever a canned block already collects isn't listed here — each one has a sidecar beside it saying so (preview.tx has preview.json), so a preview image is that box being ticked rather than a field you have to add.
A field set to editors only is dropped before the page is rendered for anyone who cannot edit it, so it is safe to refer to in the display template below without guarding it yourself — useful for a connection string or anything else that shouldn't be public.
An Another Post field depends on a different post type. Pick one stores a single post's ID, chosen from a dropdown in the editor, and hands you the whole post as <: $post.your_field_name_post :>. All of them stores nothing and simply hands you every post of that type as <: $post.your_field_name :> to loop over.

Display Template

Kolon markup for how this post type renders when someone looks at it.
<: $tiled :> is true when the series asked for its posts to be tiled, so branch on it if this type wants a compact view — see forms/file.tx for the shape. The wrapper gets the tile class either way. Note that it is only ever true for logged-out visitors: an editor needs the full view. Use <: $post.yourfield :> for your custom fields, and <: render_it($post.data) | mark_raw :> for the post body.