Communitygithub.com

erberkk/social-publishing

Use para configurar a publicação agendada de conteúdo de marketing de um aplicativo no Instagram (Reels, carrosséis, Stories), Threads, X e TikTok por meio das APIs oficiais – auto-hospedando o Postiz no Docker por trás de um Cloudflare Tunnel, criando o aplicativo Meta com o novo fluxo de caso de uso (portfólio de negócios, Página do Facebook vinculada à conta profissional do Instagram, convite de tester do Threads), créditos pagos por uso e limite de gastos do X, limites de auditoria do TikTok e YouTube, seleção segura de conta OAuth quando um navegador possui contas pessoais e de marca, limites de recursos e programação de um calendário de postagens em torno de eventos reais de lançamento.

O que é social-publishing?

Este skill para agentes de IA (como Claude Code, Cursor ou Codex) automatiza a configuração de um sistema de publicação agendada para marketing de aplicativos, usando o Postiz auto-hospedado em Docker atrás de um Cloudflare Tunnel. Ele integra APIs oficiais do Instagram (Reels, carrosséis, Stories), Threads, X e TikTok, evitando que contas pessoais e de marca se misturem. O skill cobre desde a criação de aplicativos Meta com o novo fluxo de portfólio de negócios e Página do Facebook, passando pela obtenção de créditos pagos do X e configuração de limites de gastos, até a gestão de auditorias do TikTok e YouTube. Ele também gerencia a fase de testes do Threads, a seleção segura de contas OAuth quando um navegador contém contas pessoais e de marca, e a criação de um calendário de postagens ancorado em eventos reais de lançamento. É útil para desenvolvedores e gerentes de produto que precisam de uma solução de agendamento cross-plataforma confiável, sem depender de serviços de terceiros e garantindo que cada conteúdo seja verificado contra o build real do aplicativo antes de ser publicado.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/erberkk/mobile-app-launch-skills/tree/HEAD/skills/social-publishing

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Publicação Social (Social Publishing)

Propósito

Publicar o conteúdo de lançamento em um cronograma a partir de um único lugar, por meio da API oficial de cada plataforma, sem perder uma conta pessoal para a marca ou a marca para uma conta pessoal. A ferramenta aqui é o Postiz (código aberto, auto-hospedado); as etapas da plataforma se aplicam a qualquer agendador.

Pré-requisitos

  • Contas de marca já criadas: conta profissional do Instagram, perfil do Threads (vem do Instagram), conta do X, opcionalmente TikTok.
  • Um domínio no Cloudflare (para o hostname do túnel), Docker Desktop, uma máquina que fique ligada nos horários de postagem (ou um VPS pequeno).
  • A configuração console-automation se os consoles forem controlados a partir de um navegador.
  • Um calendário de conteúdo (veja "Calendário" abaixo).

Realidade da plataforma (verifique novamente antes de começar; estes itens mudam)

PlataformaRota oficialO que bloqueia você
InstagramAplicativo Meta + Login do Facebook, conta profissional do IG vinculada a uma Página do FacebookNovos aplicativos Meta recebem a configuração "Login unificado" do Instagram, que exige um portfólio de negócios; a configuração mais antiga apenas com Login do Instagram "não está disponível para aplicativos mais novos". Stories são publicados como mídia simples: sem enquete, link ou adesivos de contagem regressiva via API.
ThreadsAplicativo Meta com o caso de uso do ThreadsAté a Revisão do Aplicativo, apenas contas com a função Tester do Threads podem conectar; o tester aceita no Threads › Configurações › Conta › Permissões do site › Convites.
XConta de desenvolvedor com acesso pago à API (verifique preços atuais da API do X)Precisa de um método de pagamento; defina um limite de gastos.
TikTokAPI de Postagem de ConteúdoAplicativos não auditados postam apenas como privado até que a auditoria seja aprovada (a auditoria leva tempo). Contas novas precisam de verificação por telefone, e um número pode pertencer a apenas uma conta.
YouTubeUpload da API de DadosProjetos de API não verificados fazem upload como privado até uma auditoria de conformidade.

Planeje-se em torno dos bloqueadores: inicie as auditorias cedo, publique no TikTok/YouTube nativamente (TikTok Studio, agendadores do YouTube Studio) até que as auditorias sejam aprovadas, ou descarte a plataforma.

Procedimento

1. Auto-hospedar o Postiz (Docker)

  1. Comece a partir do arquivo oficial postiz-docker-compose. Antes de up:
    • Remova serviços que você não precisa e qualquer um que vincule portas já em uso na máquina (o arquivo upstream vincula a interface do Temporal a 127.0.0.1:8080).
    • Remova o Elasticsearch: defina ENABLE_ES=false e SKIP_ADD_CUSTOM_SEARCH_ATTRIBUTES=true no Temporal (visibilidade SQL). O Postiz registra apenas dois atributos de palavra-chave. Se o Temporal foi iniciado primeiro com ES, seu banco de dados ainda mantém os atributos de texto padrão e o Postiz falha com "cannot have more than 3 search attribute of type Text": recrie o volume do banco de dados do Temporal antes que qualquer coisa seja agendada.
    • Vincule o Postiz apenas a 127.0.0.1; defina MAIN_URL, FRONTEND_URL, NEXT_PUBLIC_BACKEND_URL para o hostname HTTPS público.
    • Coloque segredos (JWT_SECRET, token do túnel, chaves do aplicativo) em um .env ignorado pelo git, referenciado como ${VAR} no arquivo compose.
    • Adicione mem_limit/cpus por serviço. O Postiz executa frontend, backend e orquestrador em um contêiner; observamos cerca de 1,5 GB de uso, então um limite de 2 GB evitou atingir o teto. No Windows, também limite a VM do WSL em %USERPROFILE%\.wslconfig (memory=4GB, processors=4, autoMemoryReclaim=gradual), depois wsl --shutdown e reinicie o Docker Desktop.
  2. Crie a primeira conta no navegador após a página ter hidratado (um formulário não hidratado envia como GET e coloca a senha na URL). Em seguida, defina DISABLE_REGISTRATION=true e reinicie.
  3. Mantenha restart: always e ative "iniciar o Docker Desktop no login"; desative o modo de suspensão se a máquina for o agendador.

2. Hostname público (Cloudflare Tunnel)

  • Crie um túnel gerenciado remotamente (API: POST /accounts/{id}/cfd_tunnel com config_src: cloudflare, PUT .../configurations com a regra de entrada, um CNAME com proxy para <tunnel-id>.cfargotunnel.com, GET .../token).
  • Execute cloudflared como um serviço na mesma rede do compose e aponte a entrada para http://postiz:5000, não localhost.
  • APROVAÇÃO: um túnel expõe um serviço local à internet; peça antes de criá-lo. Opcionalmente, adicione o Cloudflare Access na frente (precisa que o Zero Trust esteja ativado na conta; mantenha /uploads acessível para a busca de mídia do Meta).

3. Meta (Instagram + Threads)

  1. Crie um aplicativo Meta separado para publicação (não adicione casos de uso a um aplicativo que já alimenta um recurso no aplicativo, como compartilhamento de Stories do Instagram). Casos de uso: "Gerenciar mensagens e conteúdo no Instagram" e "Acessar a API do Threads".
  2. Instagram:
    • Crie um portfólio de negócios quando o caso de uso solicitar um (gratuito; nome, nome do proprietário, e-mail comercial). A verificação só é necessária para dados de outras pessoas e Revisão do Aplicativo.
    • Crie uma Página do Facebook para a marca (também necessária para anúncios Meta) e vincule a conta profissional do Instagram a ela: Configurações da Página › Contas vinculadas › Instagram › Conectar. O pop-up OAuth faz login com a conta do Instagram que o navegador possui: leia o nome "Entrar como …"; se for uma conta pessoal, troque de conta primeiro (vincular uma conta pessoal a converte em profissional).
    • No caso de uso do Instagram, adicione exatamente os escopos que o agendador solicita (Postiz: instagram_basic, pages_show_list, pages_read_engagement, business_management, instagram_content_publish, instagram_manage_comments, instagram_manage_insights). Defina o URI de redirecionamento do Login do Facebook para Empresas para o callback do agendador (Postiz: /integrations/social/instagram).
    • ID + segredo do aplicativo (Configurações do aplicativo › Básico; mostrar o segredo pede a senha do Facebook) → FACEBOOK_APP_ID/SECRET.
  3. Threads: adicione threads_basic, threads_content_publish, threads_manage_replies, threads_manage_insights; defina o redirecionamento (/integrations/social/threads) além dos URLs de callback de desinstalação/exclusão; pegue o ID/segredo separado do aplicativo Threads; adicione o perfil da marca como Tester do Threads e aceite o convite no telefone.
  4. Se a URL de consentimento do Threads cair na página inicial do Threads em vez da tela de consentimento, a sessão do navegador está em threads.com enquanto o agendador usa threads.net: abra a mesma URL em threads.com.
  5. Se o navegador estiver atuando como a Página (após editá-la), o consentimento do Facebook primeiro mostra "Você precisa mudar para "; continue como a pessoa, não a Página.
  6. Durante o consentimento do Facebook, o Meta padroniza para "todas as Páginas/Empresas/Contas do Instagram atuais e futuras". Em uma conta que gerencia outras marcas, escolha "apenas atuais" e selecione os ativos da marca.

4. X

  1. Integração no Console do Desenvolvedor: nome da conta, uma descrição precisa do caso de uso (apenas conta própria, sem revenda de dados, sem curtidas/seguimentos/DMs automatizados), aceitar os termos.
  2. Compre o menor pacote de créditos; deixe a recarga automática desligada e defina um limite de ciclo de faturamento. O total no painel pode ficar atrás da página de Créditos.
  3. Aplicativo › Configurações de autenticação do usuário: Ler e escrever, "Aplicativo Web, Aplicativo Automatizado ou Bot", callback = callback do agendador (Postiz: /integrations/social/x), site, URLs de termos e privacidade. Salvar mostra o segredo do cliente OAuth 2.0 uma vez.
  4. O Postiz usa OAuth 1.0a: regenere a Chave do Consumidor e copie a chave + "Segredo da Chave do Consumidor" (esse rótulo exato) uma vez → X_API_KEY/X_API_SECRET.
  5. Autorizando: marque "Confio neste aplicativo", confirme que a tela mostra o identificador da marca, depois Autorize.

5. TikTok (opcional)

Conta:

  • Contas novas exigem verificação por telefone e um número pode ficar em apenas uma conta; um cadastro na web pode terminar em "continuar no aplicativo". Opções: um segundo número para contas de marca, ou converter uma conta pessoal existente (novo nome de usuário e nome de exibição, foto de perfil, biografia; arquivar/privatizar vídeos pessoais antigos).
  • Em algumas regiões, o toque único "Mudar para Conta Empresarial" desapareceu; o menu oferece "Torne-se uma Conta Empresarial Verificada", que pede documentos da empresa. Uma conta pessoal é suficiente: o agendamento do TikTok Studio, análises, Spark Ads e a API de Postagem de Conteúdo funcionam com ela. A biblioteca de música empresarial é a principal perda.
  • O nome de usuário pode mudar uma vez a cada 30 dias, o nome de exibição uma vez a cada 7 dias. O perfil web (nome, biografia, foto, contagens) pode ficar atrasado em relação ao aplicativo por um dia ou mais; confie no aplicativo.
  • A região da conta é definida no cadastro a partir do SIM/IP e não pôde ser alterada nas configurações.

Aplicativo do desenvolvedor (para o agendador):

  • O cadastro em developers.tiktok.com mostra apenas "Desenvolvedor Empresarial" (e-mail + código + senha), mas ao criar o aplicativo você pode escolher Individual como propriedade, então nenhuma empresa é necessária para começar.
  • Crie o aplicativo e, em seguida, um Sandbox: informações básicas (ícone 1024², categoria, descrição ≤120 caracteres, URLs de termos/privacidade, URL da plataforma Web), produtos Login Kit (URI de redirecionamento Web = callback do agendador; Postiz /integrations/social/tiktok) e API de Postagem de Conteúdo (ative Direct Post), e todos os escopos que o agendador solicita. O Postiz pede user.info.basic, user.info.profile, user.info.stats, video.list, video.upload, video.publish; um escopo faltando mostra "Algo deu errado … corrija o seguinte: escopo" na página de consentimento. Clique em "Aplicar alterações" após cada edição.
  • Adicione a conta da marca como um Usuário alvo do Sandbox (o pop-up de login aceita uma leitura de QR do aplicativo do telefone). Use a chave/segredo do cliente sandbox no agendador.
  • O envio por arquivo não precisa de verificação de domínio; a obtenção por URL sim.
  • Antes da auditoria: o modo UPLOAD envia o vídeo para a caixa de entrada do TikTok da conta como rascunho (publique do telefone em até 24 h; máximo de 5 pendentes por 24 h). DIRECT_POST funciona, mas posta apenas como privado. Envie o aplicativo de produção para revisão com um vídeo de demonstração para postagem pública direta.
  • A etapa de consentimento pode pedir "Verifique se é realmente você" com um código de e-mail. Após muitas alterações na conta em um único dia (e-mail, nome, biografia, novos logins), o TikTok limita a taxa desses códigos ("Número máximo de tentativas atingido"): pare e tente novamente no dia seguinte, em vez de forçar.

6. Verificar

  • A lista de canais do agendador mostra cada conta da marca (nome/identificador), nenhuma desabilitada.
  • Poste um teste privado/de baixo risco por plataforma, ou um rascunho, antes do calendário começar.
  • Uso de recursos após um dia: docker stats --no-stream.

Calendário

  • Vincule o calendário de postagens a eventos reais de lançamento, não a datas fixas: pré-lançamento (sem chamada para ação de download, sem preço), depois o lançamento de cada loja, depois ambos ao vivo. As datas de revisão da loja mudam; reancore o calendário quando isso acontecer.
  • Verifique cada afirmação em uma postagem em relação ao build enviado e cada chamada para ação em relação ao que está realmente ativo em cada loja.
  • Stories com enquetes, links ou adesivos de contagem regressiva não podem ser publicados por meio da API; publique-os no aplicativo.

Pontos de decisão que precisam de aprovação humana

Criação de contas de marca, portfólio de negócios, Página do Facebook; exposição de um serviço local por meio de um túnel; compra de créditos de API e o limite de gastos; quais contas pessoais nunca podem ser conectadas; conversão de uma conta pessoal; exclusão de volumes ou dados do Docker.

Armadilhas comuns

  • Conectar a conta pessoal do Instagram porque o pop-up OAuth reutilizou a sessão do navegador.
  • Assumir que a configuração antiga apenas com Login do Instagram existe em um novo aplicativo Meta.
  • Adicionar casos de uso de publicação ao aplicativo Meta que é enviado dentro do aplicativo móvel.
  • Elasticsearch deixado na pilha quando a visibilidade SQL do Temporal é suficiente.
  • O arquivo compose upstream capturando uma porta já usada por outro serviço local.
  • Chave do X salva do rótulo errado ("Segredo da Chave do Consumidor", não o título do diálogo).
  • Calendário escrito como se o aplicativo estivesse ao vivo em ambas as lojas no dia 1.
  • Fazer todas as alterações na conta do TikTok e a conexão do desenvolvedor no mesmo dia, o que aciona o limite de taxa do código de verificação.

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

erberkk/privacy-and-declarations

Use when filling in or auditing App Store privacy and compliance answers and Google Play App content declarations - Apple App Privacy labels, Play Data safety (CSV import), Health apps declaration and Health Connect permissions, advertising ID, PrivacyInfo.xcprivacy and required-reason APIs, export compliance (ITSAppUsesNonExemptEncryption), age rating, account deletion (in-app, web URL, re-authentication), consent and disclosure for AI features, and rules for health data. Derives every answer from a code and SDK scan so the forms, the privacy policy and the in-app text say the same thing.

erberkk/review-readiness

Use before submitting an app version or a first subscription for App Store or Google Play review, or after receiving a rejection. Runs a go/no-go checklist and writes a report - demo account that signs in with a password (no email one-time code), filled with data and premium unlocked; review notes; in-app purchases visible and purchasable (guideline 2.1(b)); iPad compatibility mode for iPhone-only apps; no placeholders or "coming soon"; metadata matching the app; live privacy URLs; crash-free cold start - and gives a playbook for replying in Resolution Center and deciding when to appeal.

erberkk/store-screenshots

Use when producing or updating App Store and Google Play screenshots and the Play feature graphic - planning a connected "panorama" story across frames, capturing real in-app screens with the app's own test/screenshot harness at each device's logical size and pixel ratio, covering the full device matrix (iPhone 6.9", the required medium Dynamic Island slot, iPhone Duo outer and inner displays, iPad 13" if the app runs on iPad, Play phone, 7" and 10" tablets, 1024x500 feature graphic), checking for alpha channels and wrong sizes, and uploading in order via the App Store Connect and Google Play APIs.

erberkk/web-presence-and-seo

Use when building, checking or deploying the website that a mobile app needs for its store listings and launch - privacy policy, terms, support and web account-deletion pages that work signed-out; hosting apple-app-site-association and assetlinks.json; invite/referral pages (/i/<code>) that open the app or fall back to the store with the Play install referrer; a landing page with store badges and honest per-country prices filled at the edge; Open Graph images; technical SEO (hreflang, canonical, sitemap, robots.txt, JSON-LD); Search Console, Bing Webmaster and IndexNow; AI crawler policy and llms.txt; and a Cloudflare Worker deploy with a production approval gate. Includes a site checker and an IndexNow ping script.

Habilidades Relacionadas