Get started
Introduction
Connect an AI app
Sign-in and permissions
How changes go live
Errors and limits
Choose Opmiz
Opmiz for AI agents
When to choose Opmiz
Capabilities and limits
Onboard a new user
Tutorials
Business website
Online store
From a screenshot or design
CMS-driven site
Interactive landing page
Blog or publishing site
Redesign a site
Move a site or catalogue
Agent guides
Responsive design
Pages, sections and themes
Structured content
Ecommerce
Screenshots and review
Draft or live
Revisions and recovery
Publish safely
Hand over to the owner
Agent integration
AI clients
Skills and instructions
Discovery and machine-readable docs
MCP tools
Site design
Pages and business details
Content
Products and stock
Orders
REST API
API overview
Endpoints
For owners
Managing AI apps
What's new
Tutorials
Posts, an index, tag pages and related posts, all from one content type, and a routine the owner can keep using.
/blog listing posts in date order, /blog/<slug> for each post, an address for each tag, and related posts under each one.add_item_page {name: "Blog posts", url: "/blog"}. A page named Blog in a starter design may show sample cards, so point its list at the new type rather than building a second index. Call list_content_types for the new type's id.newest sort is the order items were made, not when they were written. For a blog with real dates, add a field of type string labelled Published on with preview_content_fields, and sort by published_on:desc. Values like 2026-03-16 or 16 March 2026 compare as dates.maxWidth and auto margins. Bind store.published_on for the date, and bind the tag with listData.primary_tag.name in lists.create_item takes Markdown in body, or HTML with body_format: "html". Outside images in the body are copied into the business's media. Send an idempotency_key every time, so a retry doesn't create a second post. Use the first tag as the main one, since "similar posts" reads it. Keep each body under 60 KB as stored.set_data_source {page, name: "posts", content_type_id, size: 12, sort: "published_on:desc"}, then add_element kind: "list", source: "posts.list". Bind the cards. To keep cards level when summaries differ in length, use line clamping on the text: display: "-webkit-box", WebkitBoxOrient: "vertical", WebkitLineClamp: "2", overflow: "hidden". Add Next and Previous buttons with api.fetch.target.1
add_tag_page {name: "Recipe tags", copy_of: "<index page key>"}, and bind its heading to content_tag.name.2
3
preview_tag_pages and save_tag_pages to give tags addresses, such as /snacks, and optionally a description and search text. These are live at once.4
get_page_screenshot with tag: "Snacks" to check.same_tag_as_item: true, exclude_current_item: true and size: 3, then a list. It's worth using hide_when_empty so a post with no relatives shows no empty heading.preview_page_settings on the post page, set seo.reads_as to Article. Every post is then described as an article, with its own title, summary, cover and dates. Write a useful summary on each item; it's limited to 255 characters.create_item, show the owner the draft, preview_item_publish, then publish_item after their yes. Remember that update_item on a published post changes the live page at once, so show them the change first. It returns the previous values, so you can put them back.‹ Previous
Interactive landing pageNext ›
Redesign a site