33 Commits

Author SHA1 Message Date
metatroncubeswdev
aa56d2b531 Monthly client report from real numbers, emailed or automatic
- Posts and results for the month, follower change, best posts, formats that worked, every post,
  competitor comparison and next month's plan; branded PDF via tools/report-pdf (no AI key needed)
- Client page → Documents: create for any month, email the PDF to the client's reviewer
- Optional per client: create on the 1st of each month and email it; admins get a bell notification
- Documents list groups monthly reports separately

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 10:11:04 -04:00
metatroncubeswdev
3f800d46ad Notifications: bell in the sidebar, email, morning summary, client approval emails
- In-app list with unread count; per-person email and 8:00 summary settings
- Team is told when a client approves or asks for changes, a post fails or only partly publishes,
  or a TikTok post is waiting in the TikTok app; new drafts appear in the bell and the summary
- Clients get one email (batched over 5 minutes) when posts are sent to them, in the agency's name
- SMTP settings in .env; nodemailer pinned; express advisories fixed (npm audit: 0)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 10:07:20 -04:00
metatroncubeswdev
92ee5c28b2 Client approval portal: a private link per client to approve posts or ask for changes
- Admin creates/replaces/turns off the link and sets the reviewer on the client page (Client approval tab)
- Drafts get 'Send to client'; the client's answer (approved / changes + note + name) shows on the draft
- Editing a reviewed draft asks the client again; the admin's approval is still required to publish
- Client page is mobile-first, no login, noindex, media served only for posts in review

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 10:03:23 -04:00
metatroncubeswdev
8b6e1cf835 Competitors page: track Instagram competitors per client
- Add/remove competitor handles (public Business/Creator accounts); refreshed nightly, one snapshot a day
- Compare with the client: followers, 30-day change, trend, posts/week, typical post (median), engagement rate, format mix
- Engagement-rate chart and each competitor's top recent posts
- MCP tools competitors and competitor_add (audits can add the AI's suggestions)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 09:22:33 -04:00
metatroncubeswdev
e304626986 Content calendar: plan, production and the publishing queue per client
- Plan items (idea → brief → production → ready) with brief, caption, platforms, assignee, pillar
- Calendar merges plan items, library items with a target date and queued/published posts
- Month and week views, drag a card to another day (or change the date in the card), add from any day
- MCP tools content_plan, plan_add, plan_update; weekly-plan skill now fills the calendar

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 09:18:53 -04:00
metatroncubeswdev
999e9fbcec Published page: every client's posts with their numbers
- 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>
2026-10-23 09:15:34 -04:00
metatroncubeswdev
e5f24799ea TikTok: production version submitted for review
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 22:22:58 -04:00
metatroncubeswdev
014d96ddaf TikTok: link private posts to the profile (TikTok gives no public post id)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 21:47:03 -04:00
metatroncubeswdev
6dc35c8c8b TikTok post screen: media preview, max video length check, can't-post state
- 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>
2026-10-22 20:50:34 -04:00
metatroncubeswdev
482cf4253e Google: YouTube scopes submitted for verification
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 19:41:13 -04:00
metatroncubeswdev
5b5a14411f GMB Audit (Business Profile): in production and branding verified
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 19:19:24 -04:00
metatroncubeswdev
7f1d6fdc74 Google demo: YouTube only; GMB Audit needs branding check only
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 19:08:59 -04:00
metatroncubeswdev
f8f39aa689 Demo video scripts for Google and TikTok reviews, with test media
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 19:04:59 -04:00
metatroncubeswdev
6c65889597 Google verification: branding verified; paste-ready scope justification
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 20:19:17 -04:00
metatroncubeswdev
a201fdc437 Google verification: scope justifications and demo video script
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 20:12:52 -04:00
metatroncubeswdev
addf1c7787 Notes: TikTok inbox mode works before review; LinkedIn request status
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 20:06:16 -04:00
metatroncubeswdev
0a705a5c18 Publishing: say when a TikTok post was sent to the TikTok app inbox
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 20:06:04 -04:00
metatroncubeswdev
894940800b TikTok: option to send posts to the TikTok app's inbox to finish there
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>
2026-10-21 19:52:17 -04:00
metatroncubeswdev
fd87ba08aa Retry failed platforms on a post; clearer platform error codes
- 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>
2026-10-21 19:27:21 -04:00
metatroncubeswdev
4198ade454 Add the quorlasocial.com homepage
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 13:42:41 -04:00
metatroncubeswdev
059c236d3f Quorla look for the dashboard; move a connection to another client
- 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>
2026-10-21 12:32:30 -04:00
metatroncubeswdev
af2fbb9f8e Note Search Console verification of quorlasocial.com
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 08:16:49 -04:00
metatroncubeswdev
43ee21134f Use the approved GMB Audit project for Google Business Profile
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 08:04:43 -04:00
metatroncubeswdev
40ee68798f Note the Google project number in docs/google-app.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 21:57:17 -04:00
metatroncubeswdev
fc2179b343 Track platform quotas; wait and retry instead of failing
- 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>
2026-10-20 21:56:54 -04:00
metatroncubeswdev
006a27a203 Add Quorla logo set and build the app icon from the Q mark
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 21:30:58 -04:00
metatroncubeswdev
8537fddcce Document the TikTok app setup (org, app, sandbox, review text, demo script)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 21:29:41 -04:00
metatroncubeswdev
4da66b41a9 Add privacy/terms pages and TikTok posting-screen requirements
- 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>
2026-10-20 19:14:28 -04:00
metatroncubeswdev
f24e6ada4b Add LinkedIn, Google Business Profile, YouTube, TikTok, Pinterest, Threads, Reddit
- 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>
2026-10-20 08:19:33 -04:00
metatroncubeswdev
3cbc76e7f1 Support Instagram-only clients (no Facebook Page)
- 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>
2026-10-20 01:02:03 -04:00
metatroncubeswdev
7f7e41b617 Explain why Fetch now fails for unlinked clients; let admins link a Page
- 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>
2026-10-19 23:35:46 -04:00
metatroncubeswdev
e107c046a2 Add server hosting runbook; trim stray whitespace in env values
- docs/hosting.html: step-by-step setup of app.quorlasocial.com with Docker
- env.js: trim spaces/tabs Docker keeps after "=" (broke the Meta token)
- Dockerfile: chown only writable folders (build step 55s -> 2s)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 13:05:41 -04:00
metatroncubeswdev
c309581df0 Initial commit: Quorla social media manager
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>
2026-10-19 13:02:29 -04:00