- Feed merges Instagram/Facebook snapshot posts (with insights) and everything Quorla published
- Filters (client, platform, 7/30/90 days), sort by interactions/reach/views, via-Quorla badge
- YouTube view/like/comment counts fetched nightly and on demand (1 quota unit per 50 videos)
- Snapshots now keep post thumbnails (IG media/thumbnail url, FB full_picture)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- New post shows image/video previews; the TikTok panel shows a preview of what will be posted
- Videos longer than the account's TikTok limit (creator_info) block saving with a clear message
- If TikTok's creator info says the account can't post now, the panel shows TikTok's message and saving is blocked
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Direct Post from an unaudited app only works for private accounts. Inbox upload lets a
person finish and post from the TikTok app.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Publishing: admins can retry a failed or partly published post; parts that already posted are skipped
- API errors now include the platform's error code, with plain fixes for common TikTok ones
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Quorla logo, navy/coral colours and page titles in the app (PDF reports keep agency branding)
- Connections: Move button reassigns an account to another client without reconnecting
- Fix double @ on YouTube handles
- HANDOFF.md with current status and next steps
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- quota.js: per-platform limits (YouTube 10,000 units/day Pacific per project,
Instagram 100 / Threads 250 / TikTok 15 posts per 24 h per account, ...),
usage log, .env overrides (QUOTA_<PLATFORM>)
- Publishing checks the budget first and records usage; when a platform is
out of quota (or answers quota exceeded / 429) the post stays approved and
the queue retries after the reset, without re-posting finished platforms
- Drafts that exceed a day's limit get a warning
- Connections page shows used/limit and when it frees up
- Tests for windows (incl. DST), shared vs per-account limits and the
wait-and-retry queue flow; docs for quotas and the Google app setup
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Public /privacy and /terms pages (Quorla, operated by Metatroncube
Software Solutions) for platform app listings; includes Google API
Limited Use statement and TikTok data use
- TikTok post panel follows the Content Posting API guidelines: shows the
creator's name/avatar, audience options from creator info with no
default, comment/Duet/Stitch off by default and locked when the creator
disabled them, max video length, commercial content disclosure (Your
brand / Branded content, branded content can't be private), Music Usage
Confirmation / Branded Content Policy consent
- Placeholder app icon (branding/quorla-icon-1024.png)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Connections page: admins set up each platform's developer app (keys stored
encrypted), connect a client's account via OAuth, choose company Page /
business location, check or disconnect
- Adapters per platform with sign-in, identity, targets and publishing;
token refresh with "reconnect needed" when a sign-in expires
- Publishing and Content library: "Post to" lists the client's connected
platforms with their own fields and optional per-platform caption
- Queue validates drafts per platform and publishes through the adapters;
Facebook/Instagram unchanged
- Signed, expiring media links (/m/...) for platforms that fetch media by URL
- Agent: list_connections tool; schedule tools accept all platforms + options
- Offline test suite with simulated platform APIs (15 tests)
- docs/platforms.md: setup, approvals per platform, what is and isn't tested
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Connector lists Instagram accounts assigned to the system user without a
Page; numbers, inbox, mentions and publishing work for them
- Clients link by Page or Instagram account ("Link an account"); Facebook
features explain the client has no Page instead of failing
- Drafts for Instagram-only clients drop Facebook automatically
- Images for Instagram-only clients are hosted via the agency's own Page
(META_MEDIA_PAGE_ID, unpublished); never falls back to a client's Page
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Refresh on a client with no Facebook Page now returns a clear 400 error
instead of silently replying "started"
- Client page shows "Not linked to a Facebook Page" with a Link a Page
dialog (admins) and shows refresh errors
- New POST /api/clients/:slug/link-page links an existing client folder to
an unlinked Meta Page, keeping its name and files
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dashboard (content library, publishing queue with approvals, inbox, team
management, AI runs), Meta connector, branded PDF reports, agent skills,
and Docker packaging (Dockerfile, docker-compose with Caddy HTTPS,
backup and path-relocation scripts).
Client data, live data and secrets are excluded via .gitignore.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>