@omnizap-system/omnizap 2.5.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.clusterfuzzlite/Dockerfile +10 -0
- package/.env.example +907 -0
- package/.github/codeql/codeql-config.yml +10 -0
- package/.github/dependabot.yml +35 -0
- package/.github/workflows/ci.yml +73 -0
- package/.github/workflows/codeql.yml +106 -0
- package/.github/workflows/db-migration-check.yml +98 -0
- package/.github/workflows/dependency-review.yml +22 -0
- package/.github/workflows/deploy.yml +95 -0
- package/.github/workflows/release.yml +106 -0
- package/.github/workflows/security-attest-provenance.yml +51 -0
- package/.github/workflows/security-gitleaks.yml +34 -0
- package/.github/workflows/security-runner-hardening.yml +31 -0
- package/.github/workflows/security-scorecard.yml +44 -0
- package/.github/workflows/security-zap-baseline.yml +44 -0
- package/.github/workflows/security-zap-full-scan.yml +43 -0
- package/.github/workflows/security-zizmor.yml +36 -0
- package/.github/workflows/wiki-sync.yml +44 -0
- package/.gitleaks.toml +15 -0
- package/.prettierrc +34 -0
- package/CODE_OF_CONDUCT.md +114 -0
- package/LICENSE +56 -0
- package/README.md +110 -0
- package/SECURITY.md +110 -0
- package/app/config/index.js +4 -0
- package/app/configParts/adminIdentity.js +92 -0
- package/app/configParts/baileysConfig.js +1818 -0
- package/app/configParts/groupUtils.js +692 -0
- package/app/configParts/loggerConfig.js +394 -0
- package/app/configParts/messagePersistenceService.js +305 -0
- package/app/connection/baileysCompatibility.test.js +40 -0
- package/app/connection/baileysDbAuthState.js +344 -0
- package/app/connection/socketController.js +2243 -0
- package/app/controllers/messageController.js +7 -0
- package/app/controllers/messagePipeline/commandMiddleware.js +146 -0
- package/app/controllers/messagePipeline/conversationMiddleware.js +183 -0
- package/app/controllers/messagePipeline/messagePipelineMiddlewares.test.js +522 -0
- package/app/controllers/messagePipeline/postProcessingMiddleware.js +41 -0
- package/app/controllers/messagePipeline/preProcessingMiddlewares.js +166 -0
- package/app/controllers/messageProcessingPipeline.js +699 -0
- package/app/modules/adminModule/AGENT.md +4056 -0
- package/app/modules/adminModule/adminAiHelpService.js +56 -0
- package/app/modules/adminModule/adminConfigRuntime.js +177 -0
- package/app/modules/adminModule/commandConfig.json +7122 -0
- package/app/modules/adminModule/groupCommandHandlers.js +1823 -0
- package/app/modules/adminModule/groupCommandHandlers.test.js +350 -0
- package/app/modules/adminModule/groupEventHandlers.js +399 -0
- package/app/modules/aiModule/AGENT.md +547 -0
- package/app/modules/aiModule/aiAiHelpService.js +14 -0
- package/app/modules/aiModule/aiConfigRuntime.js +135 -0
- package/app/modules/aiModule/catCommand.js +967 -0
- package/app/modules/aiModule/commandConfig.json +981 -0
- package/app/modules/analyticsModule/messageAnalysisEventRepository.js +83 -0
- package/app/modules/gameModule/AGENT.md +196 -0
- package/app/modules/gameModule/commandConfig.json +366 -0
- package/app/modules/gameModule/diceCommand.js +42 -0
- package/app/modules/gameModule/gameAiHelpService.js +14 -0
- package/app/modules/gameModule/gameConfigRuntime.js +68 -0
- package/app/modules/menuModule/AGENT.md +205 -0
- package/app/modules/menuModule/commandConfig.json +366 -0
- package/app/modules/menuModule/common.js +316 -0
- package/app/modules/menuModule/menuAiHelpService.js +14 -0
- package/app/modules/menuModule/menuConfigRuntime.js +68 -0
- package/app/modules/menuModule/menus.js +66 -0
- package/app/modules/playModule/AGENT.md +321 -0
- package/app/modules/playModule/commandConfig.json +584 -0
- package/app/modules/playModule/playAiHelpService.js +14 -0
- package/app/modules/playModule/playCommand.js +1417 -0
- package/app/modules/playModule/playConfigRuntime.js +68 -0
- package/app/modules/quoteModule/AGENT.md +199 -0
- package/app/modules/quoteModule/commandConfig.json +366 -0
- package/app/modules/quoteModule/quoteAiHelpService.js +14 -0
- package/app/modules/quoteModule/quoteCommand.js +842 -0
- package/app/modules/quoteModule/quoteConfigRuntime.js +68 -0
- package/app/modules/rpgPokemonModule/AGENT.md +229 -0
- package/app/modules/rpgPokemonModule/commandConfig.json +386 -0
- package/app/modules/rpgPokemonModule/rpgBattleCanvasRenderer.js +795 -0
- package/app/modules/rpgPokemonModule/rpgBattleService.js +2110 -0
- package/app/modules/rpgPokemonModule/rpgBattleService.test.js +770 -0
- package/app/modules/rpgPokemonModule/rpgEvolutionUtils.js +22 -0
- package/app/modules/rpgPokemonModule/rpgPokemonAiHelpService.js +14 -0
- package/app/modules/rpgPokemonModule/rpgPokemonCommand.js +174 -0
- package/app/modules/rpgPokemonModule/rpgPokemonConfigRuntime.js +68 -0
- package/app/modules/rpgPokemonModule/rpgPokemonDomain.js +192 -0
- package/app/modules/rpgPokemonModule/rpgPokemonDomain.test.js +93 -0
- package/app/modules/rpgPokemonModule/rpgPokemonEvolution.test.js +46 -0
- package/app/modules/rpgPokemonModule/rpgPokemonMessages.js +746 -0
- package/app/modules/rpgPokemonModule/rpgPokemonRepository.js +1847 -0
- package/app/modules/rpgPokemonModule/rpgPokemonService.js +6839 -0
- package/app/modules/rpgPokemonModule/rpgProfileCanvasRenderer.js +354 -0
- package/app/modules/statsModule/AGENT.md +320 -0
- package/app/modules/statsModule/commandConfig.json +540 -0
- package/app/modules/statsModule/globalRankingCommand.js +64 -0
- package/app/modules/statsModule/rankingCommand.js +41 -0
- package/app/modules/statsModule/rankingCommon.js +1305 -0
- package/app/modules/statsModule/statsAiHelpService.js +14 -0
- package/app/modules/statsModule/statsConfigRuntime.js +68 -0
- package/app/modules/stickerModule/AGENT.md +692 -0
- package/app/modules/stickerModule/addStickerMetadata.js +239 -0
- package/app/modules/stickerModule/commandConfig.json +1216 -0
- package/app/modules/stickerModule/convertToWebp.js +367 -0
- package/app/modules/stickerModule/stickerAiHelpService.js +14 -0
- package/app/modules/stickerModule/stickerCommand.js +446 -0
- package/app/modules/stickerModule/stickerConfigRuntime.js +68 -0
- package/app/modules/stickerModule/stickerConvertCommand.js +159 -0
- package/app/modules/stickerModule/stickerTextCommand.js +653 -0
- package/app/modules/stickerPackModule/AGENT.md +215 -0
- package/app/modules/stickerPackModule/autoPackCollectorRuntime.js +20 -0
- package/app/modules/stickerPackModule/autoPackCollectorService.js +357 -0
- package/app/modules/stickerPackModule/commandConfig.json +387 -0
- package/app/modules/stickerPackModule/domainEventOutboxRepository.js +227 -0
- package/app/modules/stickerPackModule/domainEvents.js +52 -0
- package/app/modules/stickerPackModule/semanticReclassificationEngine.js +429 -0
- package/app/modules/stickerPackModule/semanticReclassificationEngine.test.js +75 -0
- package/app/modules/stickerPackModule/semanticThemeClusterService.js +544 -0
- package/app/modules/stickerPackModule/stickerAssetClassificationRepository.js +400 -0
- package/app/modules/stickerPackModule/stickerAssetRepository.js +400 -0
- package/app/modules/stickerPackModule/stickerAssetReprocessQueueRepository.js +175 -0
- package/app/modules/stickerPackModule/stickerAutoPackByTagsRuntime.js +3702 -0
- package/app/modules/stickerPackModule/stickerClassificationBackgroundRuntime.js +559 -0
- package/app/modules/stickerPackModule/stickerClassificationService.js +557 -0
- package/app/modules/stickerPackModule/stickerDedicatedTaskWorkerRuntime.js +249 -0
- package/app/modules/stickerPackModule/stickerDomainEventBus.js +65 -0
- package/app/modules/stickerPackModule/stickerDomainEventConsumerRuntime.js +208 -0
- package/app/modules/stickerPackModule/stickerMarketplaceDriftService.js +99 -0
- package/app/modules/stickerPackModule/stickerObjectStorageService.js +285 -0
- package/app/modules/stickerPackModule/stickerPackAiHelpService.js +14 -0
- package/app/modules/stickerPackModule/stickerPackCommandHandlers.js +1148 -0
- package/app/modules/stickerPackModule/stickerPackConfigRuntime.js +68 -0
- package/app/modules/stickerPackModule/stickerPackEngagementRepository.js +152 -0
- package/app/modules/stickerPackModule/stickerPackErrors.js +30 -0
- package/app/modules/stickerPackModule/stickerPackInteractionEventRepository.js +101 -0
- package/app/modules/stickerPackModule/stickerPackItemRepository.js +432 -0
- package/app/modules/stickerPackModule/stickerPackMarketplaceService.js +313 -0
- package/app/modules/stickerPackModule/stickerPackMessageService.js +268 -0
- package/app/modules/stickerPackModule/stickerPackRepository.js +450 -0
- package/app/modules/stickerPackModule/stickerPackScoreSnapshotRepository.js +179 -0
- package/app/modules/stickerPackModule/stickerPackScoreSnapshotRuntime.js +271 -0
- package/app/modules/stickerPackModule/stickerPackService.js +733 -0
- package/app/modules/stickerPackModule/stickerPackServiceRuntime.js +32 -0
- package/app/modules/stickerPackModule/stickerPackUtils.js +107 -0
- package/app/modules/stickerPackModule/stickerStorageService.js +559 -0
- package/app/modules/stickerPackModule/stickerWorkerPipelineRuntime.js +242 -0
- package/app/modules/stickerPackModule/stickerWorkerTaskQueueRepository.js +242 -0
- package/app/modules/systemMetricsModule/AGENT.md +193 -0
- package/app/modules/systemMetricsModule/commandConfig.json +344 -0
- package/app/modules/systemMetricsModule/pingCommand.js +399 -0
- package/app/modules/systemMetricsModule/systemMetricsAiHelpService.js +14 -0
- package/app/modules/systemMetricsModule/systemMetricsConfigRuntime.js +68 -0
- package/app/modules/tiktokModule/AGENT.md +196 -0
- package/app/modules/tiktokModule/commandConfig.json +366 -0
- package/app/modules/tiktokModule/tiktokAiHelpService.js +14 -0
- package/app/modules/tiktokModule/tiktokCommand.js +716 -0
- package/app/modules/tiktokModule/tiktokConfigRuntime.js +68 -0
- package/app/modules/userModule/AGENT.md +200 -0
- package/app/modules/userModule/commandConfig.json +386 -0
- package/app/modules/userModule/userAiHelpService.js +14 -0
- package/app/modules/userModule/userCommand.js +1155 -0
- package/app/modules/userModule/userConfigRuntime.js +68 -0
- package/app/modules/waifuPicsModule/AGENT.md +431 -0
- package/app/modules/waifuPicsModule/commandConfig.json +780 -0
- package/app/modules/waifuPicsModule/waifuPicsAiHelpService.js +14 -0
- package/app/modules/waifuPicsModule/waifuPicsCommand.js +586 -0
- package/app/modules/waifuPicsModule/waifuPicsConfigRuntime.js +68 -0
- package/app/observability/metrics.js +766 -0
- package/app/services/ai/aiHelpResponseCacheRepository.js +280 -0
- package/app/services/ai/aiLearningRepository.js +400 -0
- package/app/services/ai/commandConfigEnrichmentRepository.js +769 -0
- package/app/services/ai/commandConfigEnrichmentService.js +452 -0
- package/app/services/ai/commandConfigValidationService.js +443 -0
- package/app/services/ai/commandToolBuilderService.js +192 -0
- package/app/services/ai/conversationRouterService.js +516 -0
- package/app/services/ai/geminiService.js +115 -0
- package/app/services/ai/geminiService.test.js +87 -0
- package/app/services/ai/globalModuleAiHelpService.js +1412 -0
- package/app/services/ai/globalToolCallingService.js +203 -0
- package/app/services/ai/messageCommandExecutionService.js +391 -0
- package/app/services/ai/moduleAiHelpCoreService.js +1099 -0
- package/app/services/ai/moduleAiHelpWrapperFactory.js +65 -0
- package/app/services/ai/moduleCommandConfigRuntimeService.js +113 -0
- package/app/services/ai/moduleToolExecutorService.js +464 -0
- package/app/services/ai/moduleToolRegistryService.js +178 -0
- package/app/services/ai/toolCandidateSelectorService.js +781 -0
- package/app/services/auth/googleWebLinkService.js +80 -0
- package/app/services/auth/whatsappLoginLinkService.js +230 -0
- package/app/services/external/pokeApiService.js +398 -0
- package/app/services/group/groupMetadataService.js +311 -0
- package/app/services/infra/dbWriteQueue.js +874 -0
- package/app/services/infra/featureFlagService.js +131 -0
- package/app/services/infra/queueUtils.js +55 -0
- package/app/services/messaging/captchaService.js +491 -0
- package/app/services/messaging/messagePersistenceService.js +1 -0
- package/app/services/messaging/newsBroadcastService.js +347 -0
- package/app/services/sticker/stickerFocusService.js +347 -0
- package/app/services/sticker/stickerFocusService.test.js +43 -0
- package/app/store/aiPromptStore.js +38 -0
- package/app/store/conversationSessionStore.js +131 -0
- package/app/store/groupConfigStore.js +58 -0
- package/app/store/premiumUserStore.js +54 -0
- package/app/utils/antiLink/antiLinkModule.js +700 -0
- package/app/utils/http/getImageBufferModule.js +18 -0
- package/app/utils/json/jsonSanitizer.js +113 -0
- package/app/utils/json/jsonSanitizer.test.js +40 -0
- package/app/utils/systemMetrics/systemMetricsModule.js +88 -0
- package/app/workers/aiLearningWorker.js +605 -0
- package/app/workers/commandConfigEnrichmentWorker.js +242 -0
- package/database/index.js +2075 -0
- package/database/init.js +151 -0
- package/database/migrations/.gitkeep +0 -0
- package/database/migrations/20260307_d0_hardening_down.sql +64 -0
- package/database/migrations/20260307_d0_hardening_up.sql +79 -0
- package/database/migrations/20260307_d1_terms_acceptance_down.sql +11 -0
- package/database/migrations/20260307_d1_terms_acceptance_up.sql +37 -0
- package/database/migrations/20260307_d2_auth_hardening_down.sql +75 -0
- package/database/migrations/20260307_d2_auth_hardening_up.sql +100 -0
- package/database/migrations/20260314_d7_canonical_sender_down.sql +53 -0
- package/database/migrations/20260314_d7_canonical_sender_up.sql +114 -0
- package/database/migrations/20260406_d30_security_analytics_down.sql +95 -0
- package/database/migrations/20260406_d30_security_analytics_up.sql +292 -0
- package/database/migrations/20260407_d31_web_google_session_token_hardening_down.sql +2 -0
- package/database/migrations/20260407_d31_web_google_session_token_hardening_up.sql +17 -0
- package/database/migrations/20260408_d32_ai_help_response_cache_down.sql +1 -0
- package/database/migrations/20260408_d32_ai_help_response_cache_up.sql +22 -0
- package/database/migrations/20260409_d33_ai_learning_tables_down.sql +4 -0
- package/database/migrations/20260409_d33_ai_learning_tables_up.sql +52 -0
- package/database/migrations/20260410_d34_command_config_enrichment_down.sql +3 -0
- package/database/migrations/20260410_d34_command_config_enrichment_up.sql +48 -0
- package/database/schema.sql +1186 -0
- package/docker-compose.yml +104 -0
- package/docs/audits/stickerCatalogController-out-of-scope.md +103 -0
- package/docs/audits/stickerCatalogController-symbols.md +58 -0
- package/docs/compliance/acceptable-use-policy-2026-03-07.md +35 -0
- package/docs/compliance/dpa-b2b-standard-2026-03-07.md +80 -0
- package/docs/compliance/monthly-compliance-checklist-2026-03-07.md +88 -0
- package/docs/compliance/notice-and-takedown-policy-2026-03-07.md +34 -0
- package/docs/compliance/privacy-policy-2026-03-07.md +75 -0
- package/docs/compliance/subprocessors-inventory-2026-03-07.md +16 -0
- package/docs/database/production-db-evolution-runbook-2026q1.md +365 -0
- package/docs/security/dsar-lgpd-runbook-2026-03-07.md +86 -0
- package/docs/security/incident-response-lgpd-anpd-runbook-2026-03-07.md +77 -0
- package/docs/security/network-hardening-runbook-2026-03-07.md +137 -0
- package/docs/seo/omnizap-seo-playbook-br-2026-02-28.md +238 -0
- package/docs/seo/satellite-page-template.md +116 -0
- package/docs/seo/satellite-pages-phase1.json +364 -0
- package/docs/wiki/Home.md +120 -0
- package/docs/wiki/pair-extraordinaire-2026-03-08.md +3 -0
- package/docs/wiki/recent-changes-2026-03-08.md +47 -0
- package/ecosystem.prod.config.cjs +135 -0
- package/eslint.config.js +89 -0
- package/index.js +488 -0
- package/ml/clip_classifier/Dockerfile +18 -0
- package/ml/clip_classifier/README.md +118 -0
- package/ml/clip_classifier/adaptive_scoring.py +40 -0
- package/ml/clip_classifier/classifier.py +654 -0
- package/ml/clip_classifier/embedding_store.py +481 -0
- package/ml/clip_classifier/env_loader.py +15 -0
- package/ml/clip_classifier/llm_label_expander.py +144 -0
- package/ml/clip_classifier/main.py +213 -0
- package/ml/clip_classifier/requirements.txt +10 -0
- package/ml/clip_classifier/similarity_engine.py +74 -0
- package/new-logo.png +0 -0
- package/observability/alert-rules.yml +60 -0
- package/observability/grafana/dashboards/omnizap-mysql.json +136 -0
- package/observability/grafana/dashboards/omnizap-overview.json +170 -0
- package/observability/grafana/provisioning/dashboards/dashboards.yml +11 -0
- package/observability/grafana/provisioning/datasources/datasources.yml +15 -0
- package/observability/loki-config.yml +38 -0
- package/observability/mysql-setup.sql +46 -0
- package/observability/prometheus.yml +35 -0
- package/observability/promtail-config.yml +84 -0
- package/observability/sticker-catalog-slo.md +83 -0
- package/observability/sticker-scale-hardening-rollout.md +128 -0
- package/package.json +144 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/assets/css/commands-react.input.css +71 -0
- package/public/assets/css/create-pack-react.input.css +31 -0
- package/public/assets/css/home-react.input.css +106 -0
- package/public/assets/css/login-react.input.css +58 -0
- package/public/assets/css/stickers-react.input.css +18 -0
- package/public/assets/css/terms-react.input.css +115 -0
- package/public/assets/css/user-react.input.css +57 -0
- package/public/assets/images/brand-icon-192.png +0 -0
- package/public/assets/images/brand-logo-128.webp +0 -0
- package/public/assets/images/hero-banner-1280.jpg +0 -0
- package/public/comandos/commands-catalog.json +4517 -0
- package/public/css/api-docs.css +161 -0
- package/public/css/stickers-admin.css +1288 -0
- package/public/css/styles.css +679 -0
- package/public/css/systemadm/admin.css +474 -0
- package/public/css/systemadm/base.css +73 -0
- package/public/css/systemadm/components.css +662 -0
- package/public/css/systemadm/layout.css +229 -0
- package/public/css/systemadm/tokens.css +56 -0
- package/public/favicon-16x16.png +0 -0
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/js/apps/apiDocsApp.js +235 -0
- package/public/js/apps/commandsReactApp.js +528 -0
- package/public/js/apps/createPackApp.js +1646 -0
- package/public/js/apps/homeReactApp.js +942 -0
- package/public/js/apps/loginReactApp.js +496 -0
- package/public/js/apps/stickersAdminApp.js +1753 -0
- package/public/js/apps/stickersApp.js +3797 -0
- package/public/js/apps/termsReactApp.js +528 -0
- package/public/js/apps/userApp.js +2540 -0
- package/public/js/apps/userProfile/actions.js +66 -0
- package/public/js/apps/userReactApp.js +547 -0
- package/public/js/catalog.js +950 -0
- package/public/pages/api-docs.html +40 -0
- package/public/pages/aup.html +158 -0
- package/public/pages/comandos.html +41 -0
- package/public/pages/dpa.html +227 -0
- package/public/pages/home.html +45 -0
- package/public/pages/licenca.html +182 -0
- package/public/pages/login.html +40 -0
- package/public/pages/notice-and-takedown.html +234 -0
- package/public/pages/politica-de-privacidade.html +251 -0
- package/public/pages/seo-bot-whatsapp-para-grupo.html +350 -0
- package/public/pages/seo-bot-whatsapp-sem-programar.html +350 -0
- package/public/pages/seo-como-automatizar-avisos-no-whatsapp.html +350 -0
- package/public/pages/seo-como-criar-comandos-whatsapp.html +350 -0
- package/public/pages/seo-como-evitar-spam-no-whatsapp.html +350 -0
- package/public/pages/seo-como-moderar-grupo-whatsapp.html +350 -0
- package/public/pages/seo-como-organizar-comunidade-whatsapp.html +350 -0
- package/public/pages/seo-melhor-bot-whatsapp-para-grupos.html +350 -0
- package/public/pages/stickers-admin.html +31 -0
- package/public/pages/stickers-create.html +41 -0
- package/public/pages/stickers.html +45 -0
- package/public/pages/suboperadores.html +237 -0
- package/public/pages/termos-de-uso-texto-integral.html +241 -0
- package/public/pages/termos-de-uso.html +41 -0
- package/public/pages/user-password-reset.html +32 -0
- package/public/pages/user-systemadm.html +508 -0
- package/public/pages/user.html +39 -0
- package/public/robots.txt +9 -0
- package/public/site.webmanifest +24 -0
- package/public/sitemap.xml +98 -0
- package/schemas/command-config.schema.json +582 -0
- package/scripts/baileys-compat-smoke.mjs +12 -0
- package/scripts/cache-bust.mjs +142 -0
- package/scripts/deploy.sh +916 -0
- package/scripts/email-broadcast-terms-update.mjs +170 -0
- package/scripts/enrich-command-discovery-fields.mjs +286 -0
- package/scripts/generate-command-config-schema.mjs +273 -0
- package/scripts/generate-commands-catalog.mjs +308 -0
- package/scripts/generate-module-agents.mjs +631 -0
- package/scripts/generate-seo-satellite-pages.mjs +400 -0
- package/scripts/github-deploy-notify.mjs +174 -0
- package/scripts/github-release-notify.mjs +219 -0
- package/scripts/release.sh +599 -0
- package/scripts/run-codeql-local.sh +116 -0
- package/scripts/run-prettier-all.mjs +25 -0
- package/scripts/security-smoketest.mjs +581 -0
- package/scripts/sticker-catalog-loadtest.mjs +210 -0
- package/scripts/sticker-worker-task.mjs +119 -0
- package/scripts/sync-readme-snapshot.mjs +133 -0
- package/scripts/validate-command-config-schema.mjs +130 -0
- package/scripts/validate-command-configs.mjs +15 -0
- package/scripts/wiki-sync.sh +191 -0
- package/server/auth/googleWebAuth/googleWebAuthRuntime.js +62 -0
- package/server/auth/googleWebAuth/googleWebAuthService.js +807 -0
- package/server/auth/jwt/webJwtService.js +147 -0
- package/server/auth/stickerCatalogAuthContext.js +165 -0
- package/server/auth/termsAcceptance/termsAcceptanceHandler.js +189 -0
- package/server/auth/userPassword/index.js +14 -0
- package/server/auth/userPassword/userPasswordAuthService.js +422 -0
- package/server/auth/userPassword/userPasswordCrypto.js +199 -0
- package/server/auth/userPassword/userPasswordCrypto.test.js +76 -0
- package/server/auth/userPassword/userPasswordRecoveryService.js +728 -0
- package/server/auth/validation/authSchemas.js +236 -0
- package/server/auth/webAccount/webAccountHandlers.js +1434 -0
- package/server/controllers/admin/adminBanService.js +138 -0
- package/server/controllers/admin/adminPanelHandlers.js +2083 -0
- package/server/controllers/admin/stickerCatalogAdminContext.js +17 -0
- package/server/controllers/admin/systemAdminController.js +201 -0
- package/server/controllers/email/emailAutomationController.js +239 -0
- package/server/controllers/metricsController.js +21 -0
- package/server/controllers/seo/stickerCatalogSeoContext.js +514 -0
- package/server/controllers/sticker/nonCatalogHandlers.js +303 -0
- package/server/controllers/sticker/stickerCatalogController.js +4700 -0
- package/server/controllers/system/contactController.js +115 -0
- package/server/controllers/system/githubController.js +137 -0
- package/server/controllers/system/stickerCatalogSystemContext.js +758 -0
- package/server/controllers/system/storageController.js +154 -0
- package/server/controllers/system/systemController.js +135 -0
- package/server/controllers/system/systemMetricsController.js +156 -0
- package/server/controllers/system/visitController.js +90 -0
- package/server/controllers/userController.js +145 -0
- package/server/email/emailAutomationRuntime.js +225 -0
- package/server/email/emailAutomationService.js +125 -0
- package/server/email/emailOutboxRepository.js +282 -0
- package/server/email/emailTemplateService.js +480 -0
- package/server/email/emailTransportService.js +156 -0
- package/server/http/clientIp.js +95 -0
- package/server/http/httpRequestUtils.js +262 -0
- package/server/http/httpRequestUtils.test.js +80 -0
- package/server/http/httpServer.js +180 -0
- package/server/http/requestContext.js +20 -0
- package/server/http/siteRoutingUtils.js +87 -0
- package/server/index.js +1 -0
- package/server/middleware/cachePolicy.js +26 -0
- package/server/middleware/cachePolicyHelpers.js +1 -0
- package/server/middleware/endpointRateLimit.js +181 -0
- package/server/middleware/rateLimit.js +70 -0
- package/server/middleware/requireAdminAuth.js +48 -0
- package/server/middleware/securityHeaders.js +97 -0
- package/server/routes/admin/systemAdminRouter.js +64 -0
- package/server/routes/email/emailAutomationRouter.js +46 -0
- package/server/routes/health/healthRouter.js +41 -0
- package/server/routes/indexRouter.js +234 -0
- package/server/routes/metrics/metricsRouter.js +58 -0
- package/server/routes/static/staticPageRouter.js +134 -0
- package/server/routes/sticker/catalogHandlers/catalogAdminHttp.js +105 -0
- package/server/routes/sticker/catalogHandlers/catalogAuthHttp.js +77 -0
- package/server/routes/sticker/catalogHandlers/catalogPublicHttp.js +120 -0
- package/server/routes/sticker/catalogHandlers/catalogUploadHttp.js +83 -0
- package/server/routes/sticker/catalogRouter.js +77 -0
- package/server/routes/sticker/stickerApiRouter.js +84 -0
- package/server/routes/sticker/stickerDataRouter.js +145 -0
- package/server/routes/sticker/stickerSiteRouter.js +43 -0
- package/server/routes/user/userApiPaths.js +66 -0
- package/server/routes/user/userRouter.js +65 -0
- package/server/utils/safePath.js +26 -0
- package/utils/logger/loggerModule.js +35 -0
- package/vite.config.mjs +38 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# OmniZap SEO Playbook BR (2026-02-28)
|
|
2
|
+
|
|
3
|
+
Objetivo: posicionar o OmniZap como "bot pronto para WhatsApp" para usuário final, mantendo stickers como feature de aquisição e expansão.
|
|
4
|
+
|
|
5
|
+
## Status de execução (2026-02-28)
|
|
6
|
+
|
|
7
|
+
- Primeira leva de satélites da fase 1 publicada:
|
|
8
|
+
- `/seo/bot-whatsapp-para-grupo/`
|
|
9
|
+
- `/seo/como-moderar-grupo-whatsapp/`
|
|
10
|
+
- `/seo/como-evitar-spam-no-whatsapp/`
|
|
11
|
+
- `/seo/como-organizar-comunidade-whatsapp/`
|
|
12
|
+
- `/seo/como-automatizar-avisos-no-whatsapp/`
|
|
13
|
+
- `/seo/como-criar-comandos-whatsapp/`
|
|
14
|
+
- `/seo/melhor-bot-whatsapp-para-grupos/`
|
|
15
|
+
- `/seo/bot-whatsapp-sem-programar/`
|
|
16
|
+
- Hub comercial publicado para conversão de comandos:
|
|
17
|
+
- `/comandos/`
|
|
18
|
+
- Template padrão para escala em lote:
|
|
19
|
+
- Gerador: `scripts/generate-seo-satellite-pages.mjs`
|
|
20
|
+
- Configuração principal: `docs/seo/satellite-pages-phase1.json`
|
|
21
|
+
- Guia de uso: `docs/seo/satellite-page-template.md`
|
|
22
|
+
|
|
23
|
+
## 1) FAQ + JSON-LD prontos
|
|
24
|
+
|
|
25
|
+
Status implementado no projeto:
|
|
26
|
+
|
|
27
|
+
- Home (`/`): FAQ visual + `FAQPage` JSON-LD alinhado ao posicionamento "adicionar e usar".
|
|
28
|
+
- Catálogo (`/stickers/`): `FAQPage` JSON-LD no HTML público.
|
|
29
|
+
- Pack (`/stickers/{packKey}`): `FAQPage` JSON-LD dinâmico no HTML SEO server-side.
|
|
30
|
+
- API Docs (`/api-docs/`): já possui `SoftwareApplication` + `FAQPage`.
|
|
31
|
+
|
|
32
|
+
Checklist técnico para manutenção:
|
|
33
|
+
|
|
34
|
+
- FAQ da página deve corresponder 1:1 ao JSON-LD.
|
|
35
|
+
- Linguagem da FAQ deve seguir a intenção da página (usuário final na home, integração no cluster técnico).
|
|
36
|
+
- Atualizar cache-bust quando houver mudança textual relevante.
|
|
37
|
+
- Validar rich results após alterações de conteúdo.
|
|
38
|
+
|
|
39
|
+
## 2) Estratégia de páginas satélite para dominar Google
|
|
40
|
+
|
|
41
|
+
Observação: o mapa abaixo orienta expansão. A fase 1 está publicada; os itens restantes permanecem no backlog priorizado.
|
|
42
|
+
|
|
43
|
+
### Cluster principal (comercial)
|
|
44
|
+
|
|
45
|
+
- `/bot-whatsapp-para-grupo/`
|
|
46
|
+
- `/bot-whatsapp-para-comunidade/`
|
|
47
|
+
- `/bot-whatsapp-para-loja-online/`
|
|
48
|
+
- `/bot-whatsapp-para-grupo-de-estudos/`
|
|
49
|
+
- `/bot-whatsapp-para-equipes-internas/`
|
|
50
|
+
|
|
51
|
+
### Cluster de dores (intenção alta)
|
|
52
|
+
|
|
53
|
+
- `/como-moderar-grupo-whatsapp/`
|
|
54
|
+
- `/como-evitar-spam-no-whatsapp/`
|
|
55
|
+
- `/como-organizar-comunidade-whatsapp/`
|
|
56
|
+
- `/como-automatizar-avisos-no-whatsapp/`
|
|
57
|
+
- `/como-criar-comandos-whatsapp/`
|
|
58
|
+
|
|
59
|
+
### Cluster comparativo (captura de decisão)
|
|
60
|
+
|
|
61
|
+
- `/melhor-bot-whatsapp-para-grupos/`
|
|
62
|
+
- `/omnizap-vs-blip/`
|
|
63
|
+
- `/omnizap-vs-zenvia/`
|
|
64
|
+
- `/omnizap-vs-huggy/`
|
|
65
|
+
|
|
66
|
+
### Cluster de feature (stickers como módulo)
|
|
67
|
+
|
|
68
|
+
- `/stickers-para-bot-whatsapp/`
|
|
69
|
+
- `/como-usar-stickers-no-bot/`
|
|
70
|
+
- `/pack-de-stickers-para-grupos/`
|
|
71
|
+
|
|
72
|
+
### Regra de interlink obrigatória
|
|
73
|
+
|
|
74
|
+
- Toda página satélite deve linkar para: `/`, `/api-docs/`, `/stickers/`.
|
|
75
|
+
- Toda página de pack deve linkar para: `/api-docs/`, `/`, `/stickers/`.
|
|
76
|
+
- Home deve apontar para satélites comerciais e satélites de dores.
|
|
77
|
+
|
|
78
|
+
## 3) Mapa de palavras-chave Brasil
|
|
79
|
+
|
|
80
|
+
### Head terms (alto volume)
|
|
81
|
+
|
|
82
|
+
- bot para WhatsApp
|
|
83
|
+
- chatbot para WhatsApp
|
|
84
|
+
- automação WhatsApp
|
|
85
|
+
- WhatsApp API
|
|
86
|
+
- bot para grupo WhatsApp
|
|
87
|
+
|
|
88
|
+
### Mid-tail (intenção de solução)
|
|
89
|
+
|
|
90
|
+
- bot para moderar grupo WhatsApp
|
|
91
|
+
- bot para comunidade WhatsApp
|
|
92
|
+
- bot para responder mensagens no WhatsApp
|
|
93
|
+
- bot para avisos automáticos WhatsApp
|
|
94
|
+
- bot de atendimento WhatsApp sem programar
|
|
95
|
+
|
|
96
|
+
### Long-tail (oportunidade de ranking rápido)
|
|
97
|
+
|
|
98
|
+
- como organizar grupo de WhatsApp automaticamente
|
|
99
|
+
- como evitar spam em grupo de WhatsApp com bot
|
|
100
|
+
- bot pronto para grupo de estudos no WhatsApp
|
|
101
|
+
- bot para loja online no WhatsApp sem configuração
|
|
102
|
+
- como adicionar bot no grupo do WhatsApp
|
|
103
|
+
|
|
104
|
+
### Keywords de módulo (stickers)
|
|
105
|
+
|
|
106
|
+
- sticker para bot WhatsApp
|
|
107
|
+
- pack de stickers para WhatsApp
|
|
108
|
+
- catálogo de stickers para bot
|
|
109
|
+
- stickers integrados via API
|
|
110
|
+
|
|
111
|
+
### Mapa por intenção
|
|
112
|
+
|
|
113
|
+
- Descoberta: "como", "o que é", "vale a pena".
|
|
114
|
+
- Consideração: "melhor", "comparativo", "preço", "funciona".
|
|
115
|
+
- Conversão: "adicionar bot", "testar bot", "bot pronto", "sem configuração".
|
|
116
|
+
|
|
117
|
+
## 4) Estratégia para ranquear antes dos concorrentes
|
|
118
|
+
|
|
119
|
+
### Fase 1 (dias 0-30) - ganhar velocidade
|
|
120
|
+
|
|
121
|
+
- Publicar 8-12 conteúdos long-tail de dor real (moderar, spam, avisos, comunidade).
|
|
122
|
+
- Criar comparativos orientados a decisão (sem ataque de marca; foco em aderência por cenário).
|
|
123
|
+
- Melhorar CTR com titles orientados a resultado: "em 1 minuto", "sem configuração", "sem programar".
|
|
124
|
+
- Revisar links internos para formar ciclo fechado entre Home -> API -> Stickers -> Packs.
|
|
125
|
+
|
|
126
|
+
### Fase 2 (dias 31-60) - escalar cobertura
|
|
127
|
+
|
|
128
|
+
- Expandir para satélites por nicho (comunidade, loja, estudo, creators).
|
|
129
|
+
- Criar template de prova social por caso de uso (antes/depois em métricas simples).
|
|
130
|
+
- Atualizar sitemap priorizando satélites novos e hubs de cluster.
|
|
131
|
+
|
|
132
|
+
### Fase 3 (dias 61-90) - defender posição
|
|
133
|
+
|
|
134
|
+
- Criar FAQ adicional por página (3-5 perguntas de objeção).
|
|
135
|
+
- Otimizar páginas em top 20 para top 10 (title, intro, links internos, schema).
|
|
136
|
+
- Construir backlinks contextuais (comunidades, creators, automação e WhatsApp).
|
|
137
|
+
|
|
138
|
+
### KPI alvo (90 dias)
|
|
139
|
+
|
|
140
|
+
- +30% impressões orgânicas (GSC) nas queries com "bot", "grupo", "WhatsApp".
|
|
141
|
+
- +20% CTR médio nas páginas comerciais.
|
|
142
|
+
- 20+ keywords long-tail em top 10.
|
|
143
|
+
- 5+ keywords comerciais em top 20.
|
|
144
|
+
|
|
145
|
+
## 5) Análise de concorrência nacional (snapshot)
|
|
146
|
+
|
|
147
|
+
### Camada 1: suites enterprise (fortes em marca e CAC)
|
|
148
|
+
|
|
149
|
+
1. Blip
|
|
150
|
+
|
|
151
|
+
- Sinal: posicionamento forte em WhatsApp + IA + vendas.
|
|
152
|
+
- Evidência pública: discurso de plataforma oficial e escala de mensagens/chatbots.
|
|
153
|
+
- Risco para OmniZap: domínio de termos institucionais/enterprise.
|
|
154
|
+
- Brecha para OmniZap: menor foco em "bot pronto para grupo em 1 minuto".
|
|
155
|
+
|
|
156
|
+
2. Zenvia
|
|
157
|
+
|
|
158
|
+
- Sinal: narrativa de customer cloud multicanal com WhatsApp no centro.
|
|
159
|
+
- Evidência pública: foco em automação, campanhas, API e atendimento.
|
|
160
|
+
- Risco para OmniZap: forte presença B2B para atendimento e vendas.
|
|
161
|
+
- Brecha para OmniZap: proposta mais orientada a suite do que a operação plug-and-play de comunidade.
|
|
162
|
+
|
|
163
|
+
3. Huggy
|
|
164
|
+
|
|
165
|
+
- Sinal: oferta de chatbot/atendimento com prova social de mercado.
|
|
166
|
+
- Evidência pública: foco em centralização de canais + automação 24/7.
|
|
167
|
+
- Risco para OmniZap: captura de mid-tail em atendimento WhatsApp.
|
|
168
|
+
- Brecha para OmniZap: menor foco em operação de grupos e moderação.
|
|
169
|
+
|
|
170
|
+
4. Leadster
|
|
171
|
+
|
|
172
|
+
- Sinal: força em marketing conversacional + WhatsApp.
|
|
173
|
+
- Evidência pública: foco em captação e qualificação de leads.
|
|
174
|
+
- Risco para OmniZap: ocupação de termos como "chatbot para vender".
|
|
175
|
+
- Brecha para OmniZap: menor profundidade em moderação/organização de grupos.
|
|
176
|
+
|
|
177
|
+
### Camada 2: nicho "bot para grupos" (fragmentado)
|
|
178
|
+
|
|
179
|
+
1. BotAdmin
|
|
180
|
+
|
|
181
|
+
- Foco: moderação de grupos, comandos e automação.
|
|
182
|
+
- Risco: captura de keywords de intenção alta (grupo/moderação).
|
|
183
|
+
|
|
184
|
+
2. AutoGrupo
|
|
185
|
+
|
|
186
|
+
- Foco: monetização de grupos pagos.
|
|
187
|
+
- Risco: captura de nicho creator/infoproduto.
|
|
188
|
+
|
|
189
|
+
3. Sites pequenos de "bot de figurinhas"
|
|
190
|
+
|
|
191
|
+
- Foco: cauda longa transacional de baixo ticket.
|
|
192
|
+
- Risco: volume pulverizado, qualidade média menor e alta capilaridade de indexação.
|
|
193
|
+
|
|
194
|
+
### Leitura competitiva objetiva
|
|
195
|
+
|
|
196
|
+
- Grandes players defendem termos amplos (chatbot, plataforma, API, atendimento).
|
|
197
|
+
- A oportunidade principal do OmniZap está no desconforto operacional de quem administra grupos.
|
|
198
|
+
- Melhor estratégia: dominar long-tail de dor + CTA de uso imediato + prova de simplicidade.
|
|
199
|
+
|
|
200
|
+
## 6) Prioridade de execução recomendada
|
|
201
|
+
|
|
202
|
+
1. Publicar satélites de dor (moderar, spam, avisos, organização).
|
|
203
|
+
2. Publicar satélites por público (comunidade, loja, estudo, creators).
|
|
204
|
+
3. Criar 3 comparativos leves (OmniZap vs suites enterprise por cenário de uso).
|
|
205
|
+
4. Fortalecer links internos e breadcrumbs semânticos.
|
|
206
|
+
5. Revisar FAQ/JSON-LD a cada 30 dias com base no Search Console.
|
|
207
|
+
|
|
208
|
+
## 7) Governança de execução
|
|
209
|
+
|
|
210
|
+
- Cadência editorial: semanal (publicação) e quinzenal (otimização).
|
|
211
|
+
- Revisão técnica: validar links, schema, canonical e renderização.
|
|
212
|
+
- Revisão de conteúdo: precisão factual, clareza e aderência à intenção.
|
|
213
|
+
- Critério de atualização: páginas abaixo da mediana de CTR por 28 dias devem entrar em refresh.
|
|
214
|
+
|
|
215
|
+
## 8) Fontes usadas nesta análise (snapshot 2026-02-28)
|
|
216
|
+
|
|
217
|
+
### Concorrência e mercado
|
|
218
|
+
|
|
219
|
+
- Blip (site oficial): https://www.blip.ai/
|
|
220
|
+
- Blip (plataforma): https://www.blip.ai/plataforma/
|
|
221
|
+
- Zenvia WhatsApp: https://www.zenvia.com/whatsapp/
|
|
222
|
+
- Zenvia Devs: https://www.zenvia.com/devs/
|
|
223
|
+
- Huggy (site oficial): https://www.huggy.io/
|
|
224
|
+
- Huggy WhatsApp: https://www.huggy.io/whatsapp
|
|
225
|
+
- Leadster: https://leadster.com.br/
|
|
226
|
+
- BotAdmin: https://botadmin.shop/
|
|
227
|
+
- AutoGrupo: https://autogrupo.com.br/
|
|
228
|
+
- DataReportal Brazil 2025: https://datareportal.com/reports/digital-2025-brazil
|
|
229
|
+
|
|
230
|
+
### Referências de SEO e conteúdo
|
|
231
|
+
|
|
232
|
+
- Google Search Central - SEO Starter Guide: https://developers.google.com/search/docs/fundamentals/seo-starter-guide
|
|
233
|
+
- Google Search Central - Helpful Content: https://developers.google.com/search/docs/fundamentals/creating-helpful-content
|
|
234
|
+
- Google Search Central - Title links: https://developers.google.com/search/docs/appearance/title-link
|
|
235
|
+
- Google Search Central - Snippets: https://developers.google.com/search/docs/appearance/snippet
|
|
236
|
+
- Schema.org FAQPage: https://schema.org/FAQPage
|
|
237
|
+
- Schema.org SoftwareApplication: https://schema.org/SoftwareApplication
|
|
238
|
+
- Rich Results Test: https://search.google.com/test/rich-results
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# Template padrão para página satélite de SEO
|
|
2
|
+
|
|
3
|
+
Objetivo: publicar páginas satélite com estrutura consistente (SEO on-page, interlink interno e FAQ com JSON-LD) sem retrabalho manual.
|
|
4
|
+
|
|
5
|
+
## Como gerar páginas
|
|
6
|
+
|
|
7
|
+
1. Edite o arquivo de configuração:
|
|
8
|
+
|
|
9
|
+
- `docs/seo/satellite-pages-phase1.json`
|
|
10
|
+
|
|
11
|
+
2. Execute o gerador:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
node scripts/generate-seo-satellite-pages.mjs --config docs/seo/satellite-pages-phase1.json --out public/pages --route-prefix /seo
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Opção via script npm:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm run seo:generate:satellites:phase1
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
3. Verifique os arquivos criados em:
|
|
24
|
+
|
|
25
|
+
- `public/pages/seo-<slug>.html`
|
|
26
|
+
|
|
27
|
+
## Campos do template (por página)
|
|
28
|
+
|
|
29
|
+
- `slug`: identificador sem barras (ex.: `como-evitar-spam-no-whatsapp`; rota final padrão: `/seo/<slug>/`)
|
|
30
|
+
- `title`: título SEO da página
|
|
31
|
+
- `description`: meta description
|
|
32
|
+
- `keywords`: lista de palavras-chave
|
|
33
|
+
- `h1`: título principal da página
|
|
34
|
+
- `intro`: parágrafo de abertura
|
|
35
|
+
- `intent_label`: rótulo visual da intenção da página
|
|
36
|
+
- `sections`: blocos de conteúdo
|
|
37
|
+
- `faq`: perguntas e respostas para a seção visual e JSON-LD
|
|
38
|
+
- `related_links`: links internos para reforçar cluster semântico
|
|
39
|
+
|
|
40
|
+
## Exemplo mínimo
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"slug": "exemplo-pagina-satelite",
|
|
45
|
+
"title": "Exemplo de página satélite | OmniZap",
|
|
46
|
+
"description": "Descrição curta com foco na intenção de busca.",
|
|
47
|
+
"keywords": ["keyword 1", "keyword 2"],
|
|
48
|
+
"h1": "Título principal orientado a resultado",
|
|
49
|
+
"intro": "Abertura da página com problema + promessa de solução.",
|
|
50
|
+
"intent_label": "Guia prático",
|
|
51
|
+
"sections": [
|
|
52
|
+
{
|
|
53
|
+
"title": "Bloco 1",
|
|
54
|
+
"paragraphs": ["Texto 1", "Texto 2"],
|
|
55
|
+
"bullets": ["Ponto A", "Ponto B"]
|
|
56
|
+
}
|
|
57
|
+
],
|
|
58
|
+
"faq": [
|
|
59
|
+
{
|
|
60
|
+
"q": "Pergunta frequente?",
|
|
61
|
+
"a": "Resposta curta e objetiva."
|
|
62
|
+
}
|
|
63
|
+
],
|
|
64
|
+
"related_links": [
|
|
65
|
+
{ "href": "/", "label": "OmniZap Home" },
|
|
66
|
+
{ "href": "/stickers/", "label": "Catálogo de Stickers" },
|
|
67
|
+
{ "href": "/api-docs/", "label": "Área de Desenvolvedor" }
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Padrão técnico aplicado automaticamente
|
|
73
|
+
|
|
74
|
+
- Meta tags básicas (`title`, `description`, `canonical`, `robots`)
|
|
75
|
+
- Open Graph + Twitter Card
|
|
76
|
+
- JSON-LD `WebPage`
|
|
77
|
+
- JSON-LD `FAQPage` quando houver FAQ
|
|
78
|
+
- Interlink obrigatório para:
|
|
79
|
+
- `/`
|
|
80
|
+
- `/stickers/`
|
|
81
|
+
- `/comandos/`
|
|
82
|
+
- `/api-docs/`
|
|
83
|
+
- `/login/`
|
|
84
|
+
|
|
85
|
+
## Padrão editorial recomendado
|
|
86
|
+
|
|
87
|
+
- Priorize clareza e foco em uma intenção por página.
|
|
88
|
+
- Evite duplicação de conteúdo entre satélites do mesmo cluster.
|
|
89
|
+
- Use linguagem direta, com exemplos práticos e orientação acionável.
|
|
90
|
+
- Inclua pelo menos 1 CTA interno para página comercial/hub.
|
|
91
|
+
- Mantenha consistência entre `title`, `h1`, `intro` e FAQ.
|
|
92
|
+
|
|
93
|
+
## Checklist antes de publicar
|
|
94
|
+
|
|
95
|
+
- Slug sem acentos e sem espaços
|
|
96
|
+
- Title com foco na query principal
|
|
97
|
+
- H1 alinhado ao title
|
|
98
|
+
- FAQ coerente com o texto da página
|
|
99
|
+
- Pelo menos 3 links internos relevantes
|
|
100
|
+
- Ausência de promessas exageradas ou claims sem evidência
|
|
101
|
+
|
|
102
|
+
## Checklist pós-publicação
|
|
103
|
+
|
|
104
|
+
- Página indexável (`robots` e `canonical` corretos)
|
|
105
|
+
- Linkagem interna funcionando
|
|
106
|
+
- Renderização sem erro de layout em mobile/desktop
|
|
107
|
+
- Validação do JSON-LD em ferramenta de rich results
|
|
108
|
+
- Monitoramento inicial de impressões/CTR no Search Console
|
|
109
|
+
|
|
110
|
+
## Referências
|
|
111
|
+
|
|
112
|
+
- Google Search Central - SEO Starter Guide: https://developers.google.com/search/docs/fundamentals/seo-starter-guide
|
|
113
|
+
- Google Search Central - Creating helpful, reliable, people-first content: https://developers.google.com/search/docs/fundamentals/creating-helpful-content
|
|
114
|
+
- Google Rich Results Test: https://search.google.com/test/rich-results
|
|
115
|
+
- Schema.org `FAQPage`: https://schema.org/FAQPage
|
|
116
|
+
- Schema.org `WebPage`: https://schema.org/WebPage
|