Settings

Publishing preferences and API credentials. Stored locally in your app database.

Display and scheduling

Used for calendar days, publish-at fields, post elsewhere, and explicit scheduled_at values in bulk imports. Account timezones still control auto time-slots.

Instagram (Meta app)

Configured

Must match a redirect URI registered in your Meta app. Defaults to https://localhost:3001/auth/instagram/callback.

Find these at developers.facebook.com → your app → Instagram → API setup with Instagram login. Use the Instagram app ID/secret (not the Facebook ones). Add your Instagram account as a tester under Roles until the app is approved.

Facebook Pages

Configured

Create this under Facebook Login for Business → Configurations. Use a User access token configuration with Page assets and Page posting permissions.

Must match a Facebook Login redirect URI registered in your Meta app. Defaults to https://localhost:3001/auth/facebook/callback.

Add Facebook Login for Business to your Meta app, create a User access token configuration with pages_show_list, pages_manage_metadata, pages_read_engagement, and pages_manage_posts, then save its Configuration ID here. Add business_management too if your Page is owned by a Business Portfolio and Meta still returns no Pages. Connected Pages linked to Instagram professional accounts are auto-added when that Instagram account is scheduled.

Threads

Incomplete

Must match a redirect URI registered in your Threads app. Defaults to https://localhost:3001/auth/threads/callback.

Create a Meta app with the Threads use case and request threads_basic plus threads_content_publish. Media posts need the media host below because Threads fetches images and videos from public URLs before publishing.

TikTok

Configured

For local TikTok testing, register this exact HTTPS callback in TikTok and proxy it to Rails with Tailscale Serve.

Until TikTok audits your app, posts are forced to Private; the TikTok creator account may also need to be private.

Until the Direct Post audit is complete, TikTok uploads are sent to the TikTok inbox as drafts. TikTok video drafts cannot receive captions through the Upload API, so TikTok may show #SocialPost; edit the caption in TikTok before posting.

Required for TikTok photo/carousel posts, including drafts. Verify this exact public URL prefix in your TikTok developer app, and make sure generated image URLs start with it.

From developers.tiktok.com → your app: add Login Kit and Content Posting API, request the video.upload and video.publish scopes, and register the Redirect URI. TikTok stays in draft upload mode until the Direct Post audit is complete; TikTok photo carousels use public image URLs from the media host below.

X

Configured

Must exactly match the callback URL registered in your X developer app.

In the X developer portal, enable OAuth 2.0, set app permissions to Read and Write, and request the tweet.read, tweet.write, users.read, media.write, and offline.access scopes. After changing X app permissions or scopes, reconnect the X account so the token gets the new grants. The adapter uploads media directly to X, then creates the post.

LinkedIn

Incomplete

Must exactly match an authorized redirect URI in your LinkedIn developer app.

Enable Sign In with LinkedIn and the Community Management posting scopes. The app requests w_member_social for personal profiles and w_organization_social/r_organization_social to connect organization authors when LinkedIn grants access.

Pinterest

Incomplete

Must exactly match a redirect URI configured for your Pinterest app.

Pinterest connects boards as posting destinations. The app requests boards:read, pins:write, and related read scopes, then creates image Pins from hosted image URLs and video Pins through Pinterest's media upload flow.

YouTube

Configured

Must exactly match an authorized redirect URI in your Google Cloud OAuth client.

22 is People & Blogs.

Create a Google Cloud OAuth client with the YouTube Data API enabled. The app requests youtube.upload for publishing and youtube.readonly to identify the connected channel.

Video storage (Cloudflare R2 / S3)

Configured

Host only — do not append the bucket name. Leave blank for AWS S3.

The 32-character Access Key ID — not the cfat… "Token value".

In Cloudflare → R2: create a bucket, then Manage R2 API Tokens → Create API Token (Object Read & Write). Copy the Access Key ID and Secret Access Key from the same screen — the secret is shown only once. Region is auto for R2. The bucket can stay private for platforms that accept temporary signed URLs.

Cloudinary (optional image fallback)

Configured
Some platforms fetch media from public URLs, so images can upload to Cloudinary first. In your Cloudinary dashboard go to Settings → Upload → Upload presets, add one with Signing Mode: Unsigned, and paste its name here.
Save first, then test — writes and deletes a tiny file in your R2 bucket.