---
title: Posts
description: Write, publish, schedule and edit the dated posts your site lists on its blog.
sidebar:
  order: 4
---

The Posts screen appears when your site has a table called Posts. Your agent
creates it once, along with the page that lists the posts, and after that you
can write them yourself.

## Writing one

New post opens a form built from your own table. Title, body and a published
date are always there; anything else your agent added shows up too, in the
order the table asks for it.

The body opens in a visual editor. Type `/` on a new line, or press the **+**
beside a block, to add a heading, a list, a quote, code, a divider, a table or
an image. Select some text and a small bar offers bold, italic, strikethrough,
code and a link; inside a table, the same bar adds and removes rows and
columns. To move a block, drag the handle beside it, or click the handle for
**Move up** and **Move down**.

Adding an image opens a picker over your [Disk](/dashboard/disk/). Upload a
file there and then, choose one that is already on it, or paste an `https`
address instead. Every image needs a short description for people who cannot
see it, and the editor adds nothing without one. Remember that anything you
upload is public at your site's address as soon as it lands on Disk, before
this post is published, and that saving waits for an upload to finish.

A picture from your Disk also takes an **Alignment** and a **Size**: on its own
line, centered, or left or right with the text beside it, at full width or a
quarter, a half or three quarters of it. What those come to on the page is your
site's own look, not a number you set here. Choose anything other than the
defaults and the picture is saved as an `::image[Alt text]{key=... align=...}`
line, which is what you see in Markdown mode; leave both alone and it stays an
ordinary Markdown picture. A picture from an `https` address takes neither.

What is saved is Markdown, and **Markdown** above the editor shows you the text
itself. **Preview** beside it draws the body in your site's own look, at a
desktop's width or a phone's, and saves nothing. Some Markdown cannot be held
in the visual editor exactly (raw HTML, reference-style links, task lists,
tables with aligned or complicated cells), and a body like that stays in
Markdown: the editor names the feature that is in the way rather than
switching over and rewriting it. It also counts the body's characters against
the most a body can hold.

Opening a body is not an edit. Save a post whose body you only looked at, or
changed only in Markdown mode, and the Markdown is kept exactly as it was
written, spacing and all. The editor writes the body its own way only once you
change something in the visual editor, even if you then undo it. And if the
visual editor cannot load, the screen says so and leaves you the Markdown box,
which saves the post just the same.

If you leave the page with changes you have not saved, the browser asks first.

Nothing is live until it has a published date and that day has come. Fill one
in on the form, or use the publish button beside the post on the list, which
fills in today. That date is the one your site prints, and the blog and its
feed are in its order. A date still to come schedules the post: the list marks
it **Scheduled for** that day, nobody is served it until then, and it appears
on your blog and in its feed by itself when the day starts, at midnight UTC.
The publish button puts a scheduled post out today instead. Clearing the date
takes a post back off your site. Until a post is live, the list gives it a
Preview link, which opens the page at your site's preview address so you see
exactly what a visitor would.

The published date is the rule Posts starts with, and the **Publish** setting
on the table's card under
[Database](/dashboard/database/#showing-a-row-on-your-site) can change it.
**All rows** puts every post out as soon as it is saved, drafts and scheduled
ones included. A checkbox column shows only the posts where it is ticked, and
the publish button then ticks it. Under either, no date decides the order, so
the blog and its feed list posts by when they were written, newest first.

## Addresses

Each post answers at the blog's own address plus its slug, so a post called
"Two hours in Kreuzberg" is at `/blog/two-hours-in-kreuzberg`. The slug is
filled in from the title when you leave it blank.

Your posts are shown through a page of their own, which sits at that address on
[Pages](/dashboard/pages/). Until that page is live, every post answers 404
no matter how many of them you have published, and the Posts screen says so
above the list.

A title in Ukrainian, Russian, Bulgarian, Macedonian, or Serbian is spelled out
in Latin letters for the address, so "Два роки в Києві" becomes
`/blog/dva-roky-v-kyievi`. Which spelling is used follows the language the post
is written in, then your site's own, then Ukrainian. A title in a script that
cannot be spelled out this way, Japanese or Chinese for instance, makes no
address, and the screen asks you to type one.

Type it yourself and it has to be lowercase a to z, numbers, and hyphens, even
when the title is not. That is the one thing Vizitka will not rewrite for you:
an address you chose is stored exactly as you wrote it, or refused.

Two posts can share a title. The second one still gets an address, with a long
unique ending after it, rather than refusing to save. That is not an address
anybody would choose, so give the second post one of its own. An address you
typed never gets an ending like that: if another post already answers there,
you are told, and nothing is saved.

You can change a slug afterwards, but the old address stops working and nothing
forwards it. If the post has been shared or linked to, leave it alone.

## Editing and deleting

An edit to a published post is live as soon as you save it. There is no second
publish step and no draft, which is the difference between a post and a page.

Delete removes the post and the address it answered at. Nothing else removes a
post, unless you give the Posts table a number of days to [keep its rows
for](/dashboard/database/#how-long-a-table-keeps-its-rows) on Database.

## The feed

Your blog is also served as a feed, at its own address plus `feed.xml`, so a
blog at `/blog` has one at `/blog/feed.xml`. It carries the twenty most recent
published posts, and readers, aggregators, and anything else that follows feeds
can subscribe to it. There is nothing to switch on and nothing to maintain.

## Languages

A post is written in one language. If your site speaks two, write two posts and
ask your agent to add a language field to the table, so each visitor is shown
the posts in the language they are reading.

Give the two the same slug and they are one post in two languages, each at
that address under its own language: on a site that speaks English first,
`/blog/<slug>` and `/uk/blog/<slug>`. The language switcher on either one goes
to the other, and the list shows each post's address the way its language
serves it.

Each language has its own feed, at `/uk/blog/feed.xml` and so on. A post that
names one of your languages is in that language's feed alone, and one that names
none is in every feed the site has.
