A desktop-first workflow for preparing reviewed photography posts, creating and improving captions, scheduling them locally or online, and publishing to multiple social platforms with operational checks.
Scope note: this page documents the implemented workflow and verified behavior. It intentionally does not publish API tokens, SMTP secrets, full source files, or credential-bearing configuration.
Posting photography sets manually across several platforms creates repeated work and repeated risk: captions can drift, platform selections can be missed, schedules depend on the computer being on, and partial failures are hard to track cleanly.
Objective: keep the creative review step manual, but automate the repetitive operational work around scheduling, publishing, logging, email reporting, and cleanup.
The workflow is deliberately staged. The tool does not immediately post from a folder scan. It first builds a reviewed Post 1 queue, then saves a scheduled record with captions, selected platforms, image references, and status fields.
The local workflow keeps the full desktop experience available through the Social Media Picker and a Windows scheduled task.
social_media_picker.py, a Tkinter desktop application.autopost_runner.py, used by the local AutoPost task.social_media_history.db, used for saved sessions, scheduled records, posted records, source references, and restore flows.Social Media Picker.vbs, used to open the app without the extra PowerShell window.Current caption controls provide a quality workflow, a local draft workflow, and an improvement workflow. Each leaves the all-platform and X captions editable, so the creative approval step remains manual. Confirmed local behavior also includes session save/restore, history view, scheduled posting, and HTML email summaries after post runs.
The online scheduler removes the requirement that the local computer stays on at the posting time. The desktop app exports a queue package, uploads it by FTP, and a Hostinger PHP cron processes due items.
cron.php under the online social_autopost folder.data/queue.Europe/Amsterdam.data/archive/posted; terminal attention entries move to data/archive/needs_attention. Matching temporary media/post_ID folders are removed in either terminal case..htaccess rules.The online queue carries only the operational data needed for the run: schedule time, timezone, selected platforms, captions, Instagram preparation and split settings, media references, source references, and platform results.
{
"id": "post_ID",
"local_post_id": 0,
"status": "scheduled",
"scheduled_for": "YYYY-MM-DD HH:MM",
"timezone": "Europe/Amsterdam",
"platforms": ["FB Page", "Instagram", "Threads", "Tumblr", "Mastodon"],
"instagram_mode": "Original",
"instagram_split_count": 10,
"media": [
{
"filename": "image.jpg",
"relative_path": "media/post_ID/image.jpg",
"public_url": "https://www.amir2000.nl/..."
}
],
"platform_results": {}
}
The confirmed auto-post targets are FB Page, Instagram, Threads, Tumblr, and Mastodon. X remains visible in the UI but intentionally unchecked and disabled for auto-posting because automated posting requires paid API access.
Split rules currently implemented:
IG Split size from 1 to 10 images per part. Larger sets are split and numbered without changing the limits of other platforms.The scheduler treats every platform result separately instead of assuming that a post is all-or-nothing. This matters because real platform APIs can return transient failures or token/authentication errors.
needs_attention so the scheduler does not retry forever.partial first, then completed successfully on the next cron pass.posted and needs_attention, archive their JSON and remove temporary media.A documented 19 July 2026 scheduled run posted successfully to all selected targets. Its results show Instagram completing in two parts and Mastodon completing in four parts, with the final record marked posted at 18:10:06 Europe/Amsterdam.
The screenshots document the current main operating surface and its scheduling controls, including local scheduling, online scheduling and result sync, Instagram preparation, per-post IG Split, and platform selection.
This public case study should not include the full code. The full implementation contains configuration paths, platform integration details, and operational wiring that should stay private or be shared only in a cleaned repository.
Best public approach:
Captioning remains reviewable and editable before scheduling: the tool provides quality, local-draft, and improvement workflows, but it does not remove the photographer's approval step. X auto-posting remains intentionally disabled because automated posting requires paid API access.