Social Posts HQ — Overview
A professional content preview, review, and approval tool. Preview every social post across all major platforms and formats before publishing. Load your brand via JSON file, local folder mount, or WordPress REST API.
Core Features
Platform Simulators
Pixel-accurate simulators for Facebook, Instagram, LinkedIn, TikTok, and YouTube Shorts — Feed, Reels, and Stories for each.
Three Archive Views
Grid cards, Thumbnail List rows, and a visual Calendar view driven by scheduledDate.
Approval Workflow
Approved · Needs Revision · Draft — with internal notes. All persisted in localStorage.
Inline Edit
Edit any post field directly in the right detail panel. Changes saved to localStorage override.
WordPress REST
Auto-connects to social-post CPT on page load. Manual fetch available in Settings → Data.
Local Mount
Mount a folder for read/write JSON versioning. Images served as blob URLs. Auto write-back on export.
Data loading priority
- localStorage override — upload/paste in Settings → Data
- WordPress page content block —
psm-page-content-json element
- WordPress REST API — auto-fetches
social-post CPT from current origin
- Built-in demo posts — neutral onboarding fallback
Image URL resolution priority
brand.imagePath in JSON — always authoritative
- WP / page-content load — derives from
origin/wp-content/uploads/
- Local mount — blob URLs from mounted folder images
brand.wpUploadsBase — fallback absolute URL
App Layout — Push Panels
☰ Left Nav Drawer — pushes content right
Slides in from the left and pushes the entire app canvas right. Contains the full post list with search, date badges, and campaign colour coding. Footer has a Documentation button.
Left Tool Panel (permanent)
Always-visible sidebar containing Platform selector, Format selector, Image Spec grid, and Brand Colour swatches. Hidden on screens below 640px — use Settings panel on mobile.
Centre — Preview Canvas
Feed posts render as accurate social media cards. Reels and Stories render inside a phone frame (393×852 aspect ratio). Dynamic island notch simulated via CSS ::before.
Right Detail Panel
Info tab: caption copy with one-click copy buttons, hashtags, scheduled date, campaign, strategy, goal, best time, CTA, and approval workflow.
Edit tab: inline edit every field on the post, saved to localStorage override.
⚙ Settings Panel — pushes content left
Five tabs: Data (upload/paste/export/flush/WP REST connect), Platforms (enable/disable toggles), Mount (local folder), Status (data source + approval list), Info (loading priority docs).
Main Screen Data Loader
Persistent CTA strip shown only when demo data is active. Upload JSON, Mount Folder, and Connect WP buttons inline at the bottom of archive views.
Archive Views
Grid View G
Default. Cards with square image, date badge, platform icons, content tags, approval status, campaign colour top border.
Thumbnail List View T
List rows: 64×64 thumbnail left, post title, date, campaign badge, tags, and platform icons. Rich detail in a compact layout.
Calendar View C
Driven by scheduledDate (YYYY-MM-DD). First post on a date shows as full-width featured thumbnail. Additional posts show as 2-up smaller thumbs. Click any thumbnail to open that post.
Filters & Sort
The filter bar is a compact auto-fit grid — no horizontal scrolling. All controls collapse responsively on small screens.
Available filters
- Platform — show only posts targeting a specific platform
- Format — Post, Reels, or Stories
- Content Type — populated dynamically from your post
tags[].type values
- Approval Status — All, Approved, Needs Revision, Draft
- Campaign — populated dynamically from your post
campaign field
- Month — populated dynamically from your post
scheduledDate field
- Sort — Post #, Newest, Oldest, Title A–Z
- Search — full-text across titles, captions, strategy, goal, CTA, campaign
Mix bar
Colour-coded content type pill bar above the grid. Click any pill to filter by that type instantly. Active pill shows a border. Click again to deselect.
Campaign grouping
When no filters are active and sort is Post #, posts are automatically grouped by campaign field with colour-coded headers. Each group is collapsible. Campaign colours are assigned from a fixed palette and persist across views.
Captions & Inline Edit
Right Detail Panel — Info Tab
Shows the active platform's caption with one-click copy, hashtag string with copy, hashtag count, then: Scheduled date, Approval status, Campaign, Strategy, Goal, Best Time to Post, CTA. Campaign name is colour-coded to match its group.
Right Detail Panel — Edit Tab
Inline edit fields for every content field: title, filename, alt text, all platform captions, hashtags, strategy, goal, best time, CTA, stories sticker text, and stories link label. Click Save & Apply to write to localStorage override and re-render immediately.
Download Preview (PNG)
Uses html2canvas to capture the active platform simulator as a PNG. Auto-named {post-slug}-{platform}.png.
Calendar View
Driven entirely by the scheduledDate field (YYYY-MM-DD format). Posts appear on their scheduled date as clickable thumbnails.
Layout
- First post on a date renders as a full-width featured thumbnail
- Additional posts render as 2-up half-width thumbnails below
- More than 3 posts: a +N more pill shows the overflow count
- Approval status dots (green/yellow/grey) overlay thumbnails
- Campaign colour borders on thumbnails match the group colour
Navigation
Use the ← → buttons to move between months. On load, the calendar automatically jumps to the month containing the earliest scheduled post.
Clicking
Click any thumbnail to open that specific post in single view. Clicking the day cell (not a thumbnail) opens the first post on that date. If multiple posts share a date, a toast notifies you to use ← → to navigate between them.
Approval Workflow
- ✓ Approved — signed off and ready to publish
- ✎ Needs Revision — changes required before publishing
- ◻ Draft — work in progress
Status badges appear on archive grid cards, thumbnail list rows, calendar thumbnails, and the Info tab in the right detail panel. All approval data persists in localStorage across sessions. The Settings → Status tab shows a full list of all reviewed posts with one-click navigation.
Data & JSON
JSON comment support
Your JSON files can include // line comments and /* block comments */ anywhere. They are stripped before parsing. Trailing commas and smart/curly quotes are also handled automatically.
Image base URL — brand.imagePath
Set brand.imagePath in your JSON to the absolute URL of your image folder. This is the authoritative image base and overrides everything else.
"brand": {
"name": "Your Brand",
"imagePath": "https://yourdomain.com/wp-content/uploads/",
"primaryColor": "#6c5ce7"
}
Export filename
Exports are named {brand-slug}-social-posts-{timestamp}.json with full datetime stamp. If a folder is mounted, the file is also written there automatically on every export.
Top-level JSON keys
brand — name, tagline, logoUrl, logoUrlSquare, imagePath, primaryColor, accentColor, websiteUrl
platforms — per-platform handle, displayName, followers, enabled, verified
hashtags — array or { core: [] }
posts — array of post objects
ui — toolName, defaultTheme, defaultPlatform, defaultFormat
fbPostPreferredFormat — 'landscape' or 'square'
linkedinPostPreferredFormat — 'landscape' or 'square'
Minimum post object
id, title, filename or images.square — required
scheduledDate — YYYY-MM-DD for calendar view and month filter
campaign — drives campaign grouping and campaign filter
igCaption / fbBody / liBody / ttCaption / ytCaption / ytTitle
hashtags, tags, platforms, formats
images.square / portrait / landscape / vertical
strategy, goal, bestTime, cta
WordPress Integration
CPT slug
The WordPress custom post type slug is always social-post — brand-agnostic. You register one CPT per site.
Auto-connect via REST API
On every page load the app attempts to fetch from:
/wp-json/wp/v2/social-post?per_page=100
If posts are returned they are loaded automatically and the image base is locked to PAGE_ORIGIN/wp-content/uploads/ — unless brand.imagePath is set in the JSON, which always wins.
Manual connect (Settings → Data → WordPress)
Click Fetch to manually trigger the REST API connection. If a folder is mounted, a local timestamped copy is also written automatically.
WordPress page content block
Paste a full brand JSON into a WordPress HTML block using <pre id="psm-page-content-json">. The data loader detects this on page load and shows a one-click load banner — content is NOT auto-applied, preserving any active localStorage override.
ACF / Custom Fields mapping
image_square, image_portrait, image_landscape, image_vertical
fb_body, ig_caption, li_body, tt_caption, yt_title, yt_caption
scheduled_date, campaign, strategy, goal, best_time, cta
hashtags, platforms, formats, tags
stories_sticker_text, stories_link_label, reels_video, reels_cover, stories_img
Keyboard Shortcuts
← →Navigate posts in single view
EscReturn to grid/calendar, or close open panels
GGrid view
CCalendar view
TThumbnail list view
Swipe ←/→Next/previous post on mobile