Using Omicron
Writing posts
The editor, drafts, scheduling, tags, images, and what happens when you publish.
Open /compose to start writing. The editor is Tiptap, with full Markdown
support — type Markdown and it formats as you go, or use the toolbar.
The composer
| Field | Notes |
|---|---|
| Title | Plain text. Used for the page title, share cards, and federated name. |
| Body | Rich text: headings, bold, italic, links, lists, quotes, code blocks, images. |
| Description | One line, up to 150 characters. Optional. |
| Banner | The image in the feed, link previews, and federation — and, if you pick one, at the top of the post itself. Optional. |
| Tags | Free-form. Readers follow tags, so they are how a post gets discovered beyond your followers. |
| Language | Used by readers’ feed language filters, and declared to search engines. |
Description is the sentence shown under your title in search results and in link previews on the fediverse and elsewhere. Leave it blank and the opening lines of the body are used instead — which works, but often cuts mid-sentence. It is the one field that decides whether someone clicks a result, so it is worth the few seconds.
Language defaults to whatever you last published in, falling back to your browser’s language. It is declared on the page, so a post written in one language is not offered to people searching in another.
Banner
The banner is the picture that shows when the link is shared — the Open Graph image a chat app or social network puts on the card — the image remote instances render for the post in the fediverse, and the thumbnail readers see beside it in the feed. Pick one and it is also the wide image at the top of the published post itself.
Picking one is optional. Leave it alone and the first image in your body is used for the feed, link previews, and federation — which is what most posts want. The picker previews that fallback and marks it From your post, so you can always see what will be published. The post’s own page is the one place that does not fall back: with no banner chosen, it opens straight into your body, images and all, rather than promoting one of them to a hero above it.
A post with no pictures at all still gets a card when it is shared: the instance draws one from your title, with your name and the instance under it. Nothing to set up, and nothing you can pick — a banner, chosen or fallen back to, always wins over it.
Two ways to set one deliberately:
- Upload — your own image, from your machine.
- Free photos — search openly-licensed stock photography without leaving the editor.
Remove clears the choice rather than the picture: the feed, link previews, and federation fall back to the body’s first image again, and the preview updates to show it — but the post’s own page goes back to showing no hero at all.
Free photos
Openverse is searched by default and needs no setup — it indexes openly licensed images from Flickr, Wikimedia Commons, museums and others. Results are limited to photos that are commercially usable and modifiable, because an instance may carry sponsorship and the layout crops every banner to 16:9, which is a derivative work. Photos that could not be used on those terms are never offered.
If your admin has added an Unsplash key (Admin panel), Unsplash appears as a second tab.
Whichever you use, the credit is filled in for you and printed under the banner: the photographer, where the photo came from, and — for a Creative Commons image — the licence, each linking out. That attribution is the condition these photos are offered under, so it is stored on the post rather than reconstructed later, and it travels with the post if you edit it.
Two buttons: Save draft and Publish — though the composer saves on its own as you write. The arrow beside Publish also offers Schedule, which sets a time and lets the instance publish for you. See Drafts and Scheduling a post.
Markdown
The editor accepts Markdown input directly — ## for a heading, **bold**,
`code`, > for a quote, - for a list. Pasting Markdown works too. You
never have to choose between a rich editor and Markdown; it is the same surface.
Images
Three ways to add one:
- Paste an image from the clipboard.
- Drag and drop a file into the body.
- Use the toolbar’s image button.
Uploads go to the instance’s uploads volume and are served from your own
domain — no third-party image host. Images are downscaled and re-encoded to WebP
in your browser before uploading, so a phone photo does not arrive at full size.
Once placed, an image can be resized by dragging its corner.
Alt text
Select an image and an Alt button appears on it. That description is read aloud to people using a screen reader, shown if the image fails to load, and is the only thing a search engine can tell about the picture.
The button stays visible and marked while the description is missing, so you can see at a glance which images still need one. Leave it empty for an image that is purely decorative — that is a valid answer, and the correct markup for it.
Your posts
Everything you have written lives at /posts/manage, under three tabs:
Drafts, Scheduled, and Published. Opening it without naming a tab
takes you to the first one that has something in it.
/drafts still works and redirects here.
Drafts
Save draft stores the post privately. Drafts are:
- never publicly readable,
- never federated,
- reopenable — saving again updates the same post rather than creating a copy.
Autosave
The composer saves as you write. A save runs a couple of seconds after you stop typing, and at least every half-minute if you never stop, so a closed tab or a lost connection costs you seconds of work rather than an afternoon.
The header tells you where you stand: Saving…, then Saved just now, ageing into Saved 4 minutes ago and a clock time after a day. It stays quiet until the first save — an empty composer has nothing to store, so nothing is written until you have given the post a title, some body text, a tag, or a banner.
The first autosave creates the draft, and its address changes to
/compose?id=… at that moment. Reload, or reopen the tab tomorrow, and you
continue that same draft rather than starting a second one.
Leaving the composer by a link saves first, then follows the link. The browser’s “leave this page?” warning now only appears if you close or reload the tab during the couple of seconds before a save has run, or if a save has actually failed — in which case the editor tells you, keeps retrying, and asks before letting you leave.
Publishing
Publishing makes the post readable at its public URL and, when federation is
enabled, enqueues delivery as a Create activity to every remote follower’s
inbox. Delivery is asynchronous — a slow remote server never blocks your
publish.
A post is dated from the moment it goes live, not from when you started its draft. A draft begun a fortnight ago and published today is dated today, and appears at the top of the timeline rather than a fortnight down it. Editing a post that is already published does not re-date it — that is what the “last updated” date records.
Scheduling a post
Use the arrow beside Publish and choose Schedule. Pick a date and a time, and the instance publishes the post for you.
Until then it behaves exactly like a draft: private, not federated, absent from every feed, tag page, search result, your public profile, and the sitemap. A direct link to it returns “not found” for everyone but you.
The picker offers In an hour, Tomorrow 09:00, and Next Monday 09:00
alongside the calendar, and confirms the choice in full before you commit —
Publishes Saturday, August 22, 2026 at 05:25 · in 2 days.
The rules
| Rule | Detail |
|---|---|
| Earliest | One minute from now. Anything sooner is really “publish now”. |
| Latest | Five years out. |
| Title | Required, as it is to publish. Nobody is watching when a scheduled post goes out, so it cannot be left untitled to fail then. |
| Timing | The instance checks every 30 seconds, so a post goes out within about half a minute of its time. |
Changing your mind
From the Scheduled tab, each post offers Reschedule, Publish now, and Unschedule — the last returns it to a plain draft. Edit reopens it in the composer, where the header shows its time and autosave leaves the schedule alone.
A post that is already published cannot be scheduled. Publishing is not reversible into a future date; turn it back into a draft first if that is what you want.
You get a notification when a scheduled post goes live.
The post’s URL
A published post lives at your handle plus its title:
https://your-domain/@handle/europe-is-ditching-visa-and-mastercard
The title is lowercased, punctuation becomes dashes, and letters outside ASCII
are romanised — Çox yoruldum, dağa daşa sözünüzü becomes
cox-yoruldum-daga-dasa-sozunuzu. Publish two posts under the same title and
the second gets a -2.
Only the Latin alphabet is romanised. A title written entirely in another script
— Cyrillic, Greek, Arabic, CJK — leaves nothing to build a readable URL from, so
the post is addressed by a short id instead (/@handle/9e962281). It is a
working, permanent URL; it just does not spell out the title.
Untitled drafts have no public URL at all.
Editing and deleting
Edit a published post and readers on your instance see the change immediately. Deleting it removes it locally and federates the deletion.
Editing the title changes the post’s URL. The old address keeps working — it redirects permanently to the new one — so a link you have already shared, or one someone else has bookmarked, still arrives. That old address is also retired: no later post of yours can be given it, so a link can never quietly start pointing at different writing.
Comments
Readers comment on posts, and comments can be liked. Federated replies from other instances arrive in the same place as local comments — a reply from Mastodon shows up under Responses and notifies you, and your responses appear in their thread. Editing or deleting a response syncs it on both sides. Responses on a private author’s posts stay local-only, and likes never leave the instance. You can edit or delete your own comments.
Publishing from another tool
If you would rather draft somewhere else — Sanity, a folder of Markdown files, a static-site build — you can have that system publish into your blog directly.
Open Settings → Integrations, create a token, and give it to that system. Posts it sends are published under your name and federate like anything you write here. Re-sending the same document updates the post instead of duplicating it, so a CMS that retries is safe. Revoke the token any time to cut it off.
You do not need to be an admin, and nothing has to be configured on the server. See Content webhook for the request format.
Feeds
Every author has an RSS feed at:
https://your-domain/@handle/feed.xml
RSS readers are never challenged by the AI-scraper shield, so feeds keep working even with protection enabled.
What travels to the fediverse
| Yes | No |
|---|---|
| Published posts (title, body, images) | Drafts and scheduled posts |
| Edits and deletions of published posts | Your tag list’s internal state |
| Responses on public posts, with their edits and deletions | Responses on private authors’ posts |
| Likes (stay local) | |
| Anything from a suspended account |
See How federation works.
Found a mistake?Edit this page on GitHub.