Features

A publishing desk, not a link in bio tool.

Postiva does one job: it takes content you already made and gets it onto the accounts you own, at the times you chose, without you opening three apps at 09:00. Everything below is in the product today.

Planning

Calendar, composer, bulk placement.

Put a month on screen and move it around.

Month and week views
Scheduled posts appear as chips coloured by platform. Drag a chip to another day or hour and the underlying jobs move with it. Nothing is rewritten behind your back: the queue row shows the new time immediately.
Composer
Media, caption, content type and target accounts in one sheet. Content types follow what each platform actually supports: reels, single images, carousels and stories on Instagram, video and photo posts on TikTok, text and media on Threads.
Per account captions
The same media can go out with a different caption on every account it targets. This is a first class field, not a copy of the post.
Bulk placement
Select a batch of media and lay it onto a repeating time template, for example three slots a day across the next month. Useful when a content batch arrives as a folder of files.
Quick time presets
The composer offers the slots you use most, so scheduling a post is two clicks rather than a date picker crawl.

Media

Upload once, reuse everywhere.

A library that knows what it is holding.

Normalisation
Images pass through sharp and videos through ffmpeg on upload. Dimensions, duration and thumbnails are stored alongside the file so the calendar and composer never have to decode a video to draw a preview.
Checksum deduplication
Uploading the same file twice reuses the existing entry instead of filling the disk with copies.
Public media URLs on demand
Some platform endpoints fetch media by URL rather than by upload. Postiva serves those files from the same domain with range request support, which is what the platform crawlers expect from a video.
Usage tracking
Each file shows how many posts reference it, so you can tell at a glance what has already been used.

Reliability

The part that matters at 03:00 when nobody is watching.

A queue you can read, and retries that cannot double post.

One row per target
A post that goes to four accounts is four job rows, each with its own status, attempt count, error text and permalink. A failure on one account does not hold the other three.
Checkpoints before irreversible steps
Platform publishing is multi step: initialise, upload, then poll for the result. Postiva writes the platform side id to the database before each step that cannot be undone, so a crash and retry resumes the existing publish instead of starting a second one.
Backoff and manual retry
Temporary platform errors are retried with growing delays. Permanent ones stop and say why. You can retry a failed target by hand, and a manual retry is exempt from the late window check.
Late window
If the machine was off when a slot passed, the worker still publishes when it comes back, as long as the slot is inside the catch up window you configured. Anything older is marked missed instead of posting a morning update in the evening.
Rate limit awareness
Platform limits are respected in code, including TikTok's cap on pending shares per account per day, which defers the job rather than burning an attempt.

Captions

Optional. The panel works with the AI settings empty.

Personas instead of a blank prompt box.

Each account carries a persona: tone, language, emoji level, hashtag style, brand notes and a few sample captions. When you ask for a caption, that persona is the prompt, so the English profile does not suddenly start writing like the Turkish one. Text streams into the composer field and you edit it before the post is queued. Gemini and OpenRouter are both supported, and the key lives in your own settings.

Operations

Self hosted means you own the uptime, so the panel tells you the truth about it.

Notifications, health and backups.

Worker heartbeat
The panel shows whether the publishing worker is alive. If it is down, scheduled posts will not go out, and the sidebar says so instead of pretending everything is fine.
Telegram notifications
Success with permalink, failure with the platform error, and token renewal warnings, sent to your own bot.
One click database backup
A consistent snapshot of the SQLite database from the settings page, plus a nightly cron on the server.
Simulation mode
A switch that routes every publish through a mock adapter, for testing a schedule end to end without posting anything real.