Changelog
O que há de novo.
Cada melhoria para a plataforma, como ele envia.
· EmailService
Teclas DKIM e um sinalizador rsa-sha256 relaxado para os domínios de envio das organizações
DkimKeys gera a chave RSA-2048 de um domínio (mantida no blob de provedor de massa criptografada do org) e o TXT value a member publica em kamoXXXXX. domainkey.<domain>. DkimSigner assina uma mensagem exatamente como o transporte irá enviá-lo — leia do writePara depois do salvo finalAlterações — cobrindo de e qualquer de os receptores de cabeçalhos e loops de feedback estão presentes (Feedback-ID incluído, nunca um cabeçalho X-, desde o relé tira X-Kamo-Ref). Verificado em testes por Apache jDKIM, uma implementação independente: uma campanha- mensagem em forma verifica, ainda verifica uma vez que o relé tira X-Kamo-Ref, e falha em um corpo alterado ou Assunto.
· EmailService
DNS para envio de domínios — os próprios servidores de nomes de cada domínio primeiro, SPF avaliado, provedor DNS nomeado
LiveDnsResolver pergunta aos servidores de nomes autorizados da zona (encontrado até 1.1.1.1/8.8.8), então um registro a membro apenas salvo em seu provedor de DNS é visto ao invés de após cache negativo de um solucionador expira; recai para os resolvedores públicos sobre uma referência ou um tempo limite, e volta sobre TCP quando um a resposta não se encaixa em um datagram (dnsjava 3.5 falha em processar o google. Com é truncado TXT caso contrário). O SpfEvaluator avalia a política de um domínio para um endereço IPv4 como um servidor receptor (RFC 7208: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * contact.kamocrm.com, um include, ou um ip4 nu todos leram o mesmo. DnsProviders nomeia a empresa em execução DNS de uma zona a partir dos seus servidores de nomes, para instruções específicas do fornecedor.
· EmailService
O relé de org compartilhado (47.181.8.86) é semeado para cada organização; o relé de plataforma permanece KamoCRM's
PlatformRelayProperties agora sabe ambos os relés em grupo: postfix-bulk (47.181.8.87, hello.kamocrm.com) e pós-fix-orgs (47.181.8.86), com o endereço de saída, o seletor DKIM e as organizações-alvo DNS' enviando domínios CNAME para (contact.kamocrm.com). Ambos contam como relés, então ambos recebem relatórios de entrega. As sementes de backfill inicial k3m1-org-relay como uma máquina de plataforma SHARED (STARTTLS + PLAIN opcional Secret bulk-org-relay-auth, auto-assinado assim tlsVerify off), desligado na rotação do próprio KamoCRM assim seu e-mail permanece em .87; semeado até que um login seja configurado, e suas credenciais seguem config on Todos os começos. k3m1-bulk-relay é feito PLATFORM ONLY uma vez.
· KlusterServices
Postfix-orgs, o relé a granel compartilhado cada organização envia através de como 47.181.8.86
O correio de campanha do próprio KamoCRM continua saindo através do postfix-bulk (47.181.8.87) e do correio regular através postfix (47.181.8.84). O correio de campanha de cada outra organização recebe seu próprio IP: postfix-orgs roda em A rede host do k3m1 e liga o seu SMTP de saída ao eno1 (k3m1- ext), que rotas de nó- config/k3m1- ext fora do porto e nada mais usa. HELO é contact.kamocrm.com, o nome Frontier é definido como o IP é PTR. Um ouvinte de rede host não tem nenhuma Política de Rede, então o envio é SASL sobre STARTTLS requerido na porta 587 do o endereço interno do nó, apenas a partir de endereços de cluster (segredos no mail/SECRETS.md). Retransmite apenas como os domínios de envio O EmailService verificou, atualizou a cada minuto — até que o mapa chegue, nada. A mesma guarda de saída como postfix-bulk mantém a entrega até eno1 é confirmado para sair como .86, eo A mesma entrega-eventos sidecar relata resultados. Cada recusa é um 4xx, nunca um 5xxx. Anexado aos arquivos o fluxo de trabalho de implantação já se aplica, então o fluxo de trabalho (e uma reconciliação completa de cada componente) está intocado.
· kamo-internal
As páginas da campanha recebem as setas de rolagem de volta, sem esconder a página seleccionada
Em uma tela muito estreita para os cinco sub-tabs, a tira agora mostra esquerda e direita setas ao lado dele, como faz a tira da aba de janela maximizada. Não teve nenhum desde o primeira versão, onde os botões de rolagem "auto" da MUI cortam uma aba aberta por link (?tab=archived) ao meio: eles aparecem apenas após MUI ter rolado o selecionado aba para ver, pegue 80px da tira e a animação de rolagem da MUI Sobrescrever qualquer correcção. CampaignTabStrip coloca as abas em um roller simples sem barra própria (data-kamo-scrollbar="off"), mostra as setas apenas enquanto as abas transbordam, e rola a aba selecionada de volta para a vista sempre que ela muda e sempre que a as setas que vêm ou vão alteram a largura. ArrowState e ARROW SCROLL FRACTION vir de maximizadoTabStripModel, então ambas as tiras concordam em quando uma seta é viver e quão longe se move. Verificado no Chrome: em 1600px sem setas; em 700px e 520px cada aba aberta por A ligação está totalmente visível com o indicador sob o mesmo, incluindo os do meio; as setas paginam a tira de cada forma; ArrowRight move o foco ao longo das abas e mantém a aba focada na visualização e o Enter seleciona- a. As suas setas são componentes. pergaminho, reparado à mão em cada local em kamo-traducation-dictionary cc484906 (arábico tinha "maldito" para o Scroll right). Os vermelhos Vitest aqui não são desta mudança e falham idênticamente na principal: umScrollbar.test.ts (em NavTopMenuPanel.tsx) e destinatárioStatus.test.ts (4, 88156e52).
· kamo-internal
Um envio ao vivo no widget Campanhas de Email recebe um cartão de destaque
Com um envio em andamento, a aba In-Progress foi uma única linha fina em um painel com espaço para muito mais, no momento o widget mais importa. Quando cada campanha em uma aba está enviando ou pausado, e o painel dá pelo menos a sua altura mínima, cada um agora recebe um cartão: - quão longe está da lista, num grande número arredondado, por isso nunca diz 100% com nada sobrando; - a sua faixa às 10px, a cabeça e o brilho visíveis; - ritmo e tempo restantes, e "N do total"; - entregue, aberto, clicado e saltado, como funil ao lado do ritmo gráfico em um cartão com altura de reposição (comprimentos de barras verdadeiras e taxas), ou como uma linha de figuras numa linha mais curta ou mais estreita; - o seu ritmo ao longo dos últimos 5 minutos, um bar por 15 segundos limites. A barra de enchimento ainda é acesa, e tempo antes do painel viu o Enviar é um toco, não um zero. O cartão tem o link da linha e pausa/continua (ambos agora compartilhados, de CampaignRow). Mantém-se no final que celebra. Dois enviam o lado sentado de lado num painel largo. A escolha lê apenas o tamanho do painel, que nada dentro dele pode mudar, Por isso não pode piscar. Um cartão que transborda de qualquer maneira é lembrado por isso tamanho do painel, que então mostra linhas. Os layouts dentro do cartão são consultas de contentores no próprio tamanho do cartão. Modelo: paceBuckets espalha o que se moveu entre dois quadros ao longo do tempo entre eles. pushSample pega uma janela, e o gancho mantém cinco minutos por enviar ao vivo, através de uma pausa e um acabamento. Verificado sem cabeça em um relógio 10x com um ritmo variável, em regular, largo, alto, 460 e 668x420 painéis, e com dois envios nos painéis largos e altos: cartas cabem sem transbordamento, e as barras de ritmo seguem os quadros, incluindo Um pouco de calma. Nada se move sob movimento reduzido.
· kamo-internal
Páginas de widget de Campanhas de Email são as etapas da tela de campanhas
O widget arquivou campanhas sob seu próprio Live / Sent / Drafts, que colocou um campanha cancelada sob Enviado e um programado em Live. Suas abas estão agora In-Progress, Não Iniciado, Pausado e Completo, arquivado pela campanhaTabOf e nomeado com marketing.bulkEmail.tabs.*, então o launchpad e /marketing/email nunca colocar uma campanha em dois lugares. As contas vêm dos novos ‘estágios’ do EmailService (7481f15); a resposta de um servidor mais antigo é contada a partir das campanhas que enviou. Escolhendo a aba: - Até que o membro escolha um, o painel cai sobre o que está acontecendo e fica enquanto essa conta ainda guarda alguma coisa. Ele se move apenas para mostrar um envio que apenas iniciado, ou quando a sua própria aba se esgota. Um envio que acaba de terminar detém In-Progress para sua celebração, então o painel segue em frente. - Uma linha que o membro pausa ou retoma permanece onde o pressionam, com o seu Retoma, até deixarem a conta. - Nomes de palco mostram onde se encaixam ao lado de "N more", medidos contra um oculto cópia na língua do membro; caso contrário cada etapa mostra o seu ícone, com o nome na sua dica e nome acessível. Correcções encontradas ao verificar no navegador: - Sparks de novas aberturas e cliques em uma campanha concluída nunca foram visíveis: A linha de figuras cortou-os. Ele agora clips apenas abaixo e ao lado de si, E as faíscas voam da extremidade do medidor, para sobreviverem à queda das barras. - Uma linha demasiado estreita para as suas figuras desenhou o medidor aberto sobre Clicked. A barras ir primeiro abaixo de 340px, e qualquer coisa que ainda não se encaixa envolve da visão inteira. - Um azulejo KPI demasiado estreito para o seu nome e taxa elipsou o nome ("Ope..."). A taxa agora fica fora de vista. - "N mais" contou as linhas que deixaram a aba anterior. Verificado sem cabeça nas larguras do painel 322 a 1360: nenhuma linha cortada, nenhuma aba transborda, o nomes/ícones interruptor com e sem "N mais", setas, um acabamento realizada então Seguiu em frente, e faíscas não cortadas em 668 e 460. O servidor do teste de pausa agora respostas com a campanha pausada. Falha ao carregar quando o elemento re-ler 400ms após uma pausa retornou a campanha ainda enviando.
· EmailService
O widget de campanhas lê por fase, as etapas dos arquivos de tela de campanhas por
O widget do launchpad é lido agora agrupa e conta as campanhas pelas etapas /marketing/email's tabs use: In-Progress (enviando), Não Iniciado (projeto ou agendado), pausado (pausado ou cancelado), completo (enviado). Falha nos ficheiros através de como longe o seu envio chegou, como campanhaTabOf faz lá. Cada etapa é tapada por conta própria: agendado antes dos rascunhos e mais cedo primeiro; pausado antes de cancelado. `stages' é adicionado ao lado de `groups', que permanece até que nenhum widget construa que lê Está implantado. Antes disso, uma campanha cancelada contada como terminada, que é onde o usuário decidiu hoje que não pertence.
· kamo-internal
A lista de campanhas segue o que os colegas fazem a uma campanha, ao vivo
BulkEmailWorkspace leva os quadros de mudança usarEmailCampaignsWebSocket agora liberta (onChanged, d0b56adf). Um frame nomeia uma campanha e o que lhe aconteceu, nunca a campanha em si, então a lista lê que uma campanha novamente através Obter /campanhas e colocá-lo no lugar. O arquivo ou restauração de um colega se move a linha entre tabulações aqui como acontece, uma campanha nova ou duplicada aparece, e um deletado, ou um que agora responde 404, deixa a lista. A encenada a contagem da caixa de saída segue os mesmos quadros. createCampaignChangeFollower mantém uma leitura por campanha de cada vez. Frames que chegar enquanto uma campanha está sendo lida (uma lista enviada em fatias anuncia cada fatia) pedir mais uma leitura uma vez que ele retorna, então uma explosão custa duas leituras e um Respostas antigas nunca caem em cima de uma mais nova. Uma campanha apagada enquanto sua leitura estava a caminho não é colocado de volta quando retorna. Verificado no Chrome contra o componente real empurrando quadros através do gancho: uma restauração moveu a linha para fora do Arquivado com uma leitura, uma exclusão removeu sua linha sem nenhum, um rascunho criado apareceu em Not Started, e cinco quadros para um A campanha custou duas leituras.
· kamo-internal
O widget Campanhas de Email, ao vivo na plataforma de lançamento
Um novo widget home, email.campaigns, no launchpad de todos que podem abrir As campanhas. Os seus cinco direitos (EMAIL CAMPAIGNS WIDGET, 321-325) são suspensos VER BULK EMAIL, e ADDED, sementes OPTIONAIS e MÓVEIS da mesma em Serviço de Segurança, então ele chega e é o membro a remover. O portão também solicita o aplicativo de Marketing e o próprio VEZ BULK EMAIL. O que mostra, lendo o novo /api/email/widget/campaigns do EmailService uma vez e em movimento ao vivo depois disso: - Quatro figuras para as últimas duas semanas (enviado, aberto, cliques, saltos), cada um com uma barra por dia que lê por ponteiro ou teclas de seta, e abrir e clicar taxas para fora do correio entregue pela regra que o cartão de entregabilidade usa (engajamentoRate, agora compartilhado por ambos). - Live / Enviado / Rascunhos, com contagens. Uma campanha de envio é uma faixa que se move, com o seu ritmo e tempo à esquerda; abre-se e estala-se dele enquanto pousa. A um pausado diz por que ele não pode enviar; um agendado conta para baixo; um enviado mostra suas taxas de abertura e clique. Pausar e retomar sentar na linha para um membro COM GESTÃO BULK MAIL. - Uma campanha que termina enquanto o painel vigia permanece no Live por um momento, com uma explosão, antes que se mova para Enviar. - A linha de fundo carrega a notícia como acontece; um amplo painel a mantém em um coluna com os totais de hoje. - Ele estabelece para o seu quarto: duas figuras e linhas compactas em uma coluna, inteiro linhas apenas em qualquer altura (a lista envolve em vez de cortes), e duas colunas de campanhas em um amplo painel apenas uma vez iria esconder alguns. A metade ao vivo monta /tópico/campanhas/<orgId>. useEmailCampaignsWebSocket reads cada frame através de readCampaignFrame e ganhos emEngajamento, emChanged e onSnapshot, mais requestSnapshot, que o widget desliga para um launchpad nunca pede uma fotografia a toda a organização. no Progresso ainda vê apenas Quadros de progresso. O toque final agora dispara em uma transição para SENT, não em cada frame posterior que ainda diz SENT (lease release e relatórios de entrega republicar por horas), e o gancho não escreve mais seus manipuladores ref durante renderizar. Verificado com tsc, os scripts de guarda, os arquivos vitest novos e afetados, e um Arnês sem cabeça sobre o componente real a 1x1, 2x1, 2x2, 2x3 e largura total.
· kamo-internal
In-Progress, Not Started, Paused, Complete and Archived tabs, and the opens your menu
/marketing/email divide as campanhas em cinco sub-tabs, cada um com uma contagem ao vivo, e cada campanha está sob exatamente uma: - Progresso: envio - Não Iniciado: rascunhos e campanhas agendadas - Pausado: campanhas pausadas e canceladas - Completa: enviado - Arquivado: qualquer que seja o arquivo de um membro Falhado não é uma fase própria: os destinatários falham, uma campanha não, e O EmailService nunca o define. Uma campanha que o tem é arquivado por até que ponto o seu envio Tenho. A aba vive em ?tab=, então uma recarga, o botão traseiro e um link compartilhado manter it; uma página da campanha muda por si só à medida que o seu estado muda ao vivo; e uma página vazia tab diz para que serve. Arquivo e Restauração estão no menu de cada campanha (emailservice 39ffa54). Apenas um campanha sem nada para enviar pode ser arquivado: um rascunho, ou um envio ou Cancelou uma. O botão □ abriu a campanha, bem como seu menu. AG Grelha dispara linhaCliquei de seu próprio ouvinte nativo no recipiente da linha, que corre antes de React delegado onClick, então o renderizador de células parouPropagation veio tarde demais e o a linha navegou para o editor sob o menu. O manipulador de linha agora deixa passar estala dentro de um controle de dados-campanha-própria-clique, como faz a grade de códigos de rastreamento, e um clique no nome da campanha não empurra mais a rota do editor duas vezes. Verificado no Chrome contra o componente real: na origem/principal o clique foi para Com esta mudança, abre o menu e vai A lado nenhum. Páginas, contagens, arquivo e restauração, páginas vazias e uma tira de 520px foram Verifiquei da mesma forma. O texto está em kamo-tradução-dicionário 02109cfc, empurrado primeiro e escrito à mão em cada localidade.
· EmailService
Arquivar uma campanha e o elemento deixa os arquivados para fora
POST ************* e /unarchive (MANAGEM BULK EMAIL) conjunto e limpar o arquivo da campanha, e CampaignDTO carrega-o. O /marketing/email arquivos de tela uma campanha arquivada sob sua própria aba Arquivo. - Só uma campanha sem nada para enviar pode ser arquivada. Um agendado, enviando ou uma pausa é recusada: cancele-a primeiro. Arquivar novamente mantém o primeiro encontro. - Envie agora, Agendar e Enviar para o mais recente arquivamento limpo, então uma campanha enviada novamente está de volta nas abas de trabalho. - Ambos são anunciados como ARCHIVED / UNARCHIVED mudar quadros, então cada aberto tela de campanhas e a atualização do widget inicial ao vivo. - CampaignWidgetReads deixa campanhas arquivadas fora de recentes, inStatuses e Contagem por Status. Constrói-se na biblioteca partilhada ebdd15f1 coluna arquivada em, ambos já no lugar. TransactionalSendRatchetTest foi vermelho no main antes deste commit e ainda é; nada aqui toca sendToUser. Os outros 1554 testes passam.
· kamo-shared-library
Uma campanha pode ser arquivada
EmailCampaignEntity ganha arquivosAt (archived at): quando um membro arquivou o campanha, nulo enquanto não é. A tela /marketing/email recebe uma aba Arquivo e o widget inicial deixa de fora campanhas arquivadas. A coluna já está no cluster, aplicado à mão como cada mudança de esquema é: ALTER TABLE email campaign.email campaigns ADD COLUMN SE NÃO EXISTE arquivado at timestamp(6) com fuso horário; Nulable sem padrão, como os outros instantes na tabela, então o código foi construído antes deste commit lê a tabela inalterada.
· EmailService
Um live e imagens ao vivo para o widget inicial Campanhas de Email
GET /api/email/widget/campaigns é o widget do launchpad uma leitura, construído para um painel que se senta na página inicial de cada visualizador de campanha o dia todo: filas magras sem body (CampaignLine), campanhas ao vivo em primeiro lugar (enviar, pausar, agendar mais cedo), então os rascunhos mais recentemente terminados e os rascunhos mais recentemente editados, cada grupo capped; conta exata por grupo; cada campanha mostrada abre, clica e relé relatórios em um pipelined Redis lido; os últimos quatorze da organização dias; sua escolha de rastreamento; e o relógio do servidor para contagem regressiva. É preciso. VER BULK EMAIL, como a lista de campanhas faz. Três tipos de quadro agora andar /tópico/campanhas/<orgId> ao lado do progresso: - Engajamento:Engajamento de CampanhaCoalesces pulse primeiro abre, primeiros cliques e Relatórios por campanha e envia, no máximo, um quadro por segundo por cápsula, com o que é novo desde o último quadro e os totais como Redis os mantém. - alterado: CampaignController anuncia criação, edição, exclusão, duplicar, programar, enviar, pausar, retomar, cancelar, audiência e destinatário alterações após a chamada de serviço ter cometido, como um ID e um verbo apenas. - Nem uma campanha de alto nível. Id. Cada tela de campanhas lê uma moldura com um como progresso e copia seus contadores para a linha, então uma moldura de outra forma carregando um seria em branco as contagens em telas ainda em execução O código mais antigo. O remetente também conta as mensagens aceitas do dia uma vez por lote (stats.daily "enviado"), de onde as linhas de luz de duas semanas do widget extraem. A suite completa é de 1534 testes com uma falha, TransactionalSendRatchetTest, que conta três sendToUser sobrecargas desde c47fcf6 e não está relacionado.
· SecurityService
O widget Campanhas de Email chega para todos que podem abrir as campanhas
EMAIL CAMPAIGNS WIDGET e as suas políticas adicionais, opcionais e móveis do VER BULK EMAIL na bota que os introduz, assim o painel pousa em o launchpad de cada membro que já pode ler as campanhas, e é os seus para remover ou mover. REQUERIDO não semeia, como para cada elemento: a A implantação nunca coloca um painel na página inicial de ninguém.
· kamo-shared-library
Os cinco direitos do widget inicial das Campanhas de Email
EMAIL CAMPAIGNS WIDGET (321) e os seus quatro filhos de política (322-325), suspensos OFF VEZ BULK EMAIL: cada leitura por trás do widget, a lista de campanha, sua contadores e os quadros de progresso ao vivo, já toma esse direito, assim o widget nunca pode ser uma maneira em torno dele. 326 é o próximo ID gratuito.
· kamo-internal
Campanhas de Email é a primeira página de Marketing
A aba Ferramentas de Marketing agora lê Campanhas de Email, Materiais de Marketing, Redes sociais, códigos de localização. Bulk Email move-se para a frente sob o seu novo nome, e Materiais leva o nome completo sua própria página já mostra. O índice /marketing pousa na primeira aba que um membro pode abrir, então sua ordem move com a tira: Campanhas de Email por padrão, Materiais de Marketing para membro sem o e-mail direito. A rota, as teclas de etiqueta e o VER BULK EMAIL Mantenham os nomes deles. O texto está em kamo-tradução-dicionário 98a21a21, empurrado em primeiro lugar, com o duas etiquetas escritas à mão em cada localidade.
· kamo-marketing
Soluções movem-se sob recursos, um nível para baixo
A linha superior carregava cinco categorias antes do número de telefone, a língua Selector e três CTAs. Soluções é agora o primeiro item dentro de Recursos, acima dos dois links de artigo, e mantém suas oito páginas da indústria como um voo de terceiro nível. Nada no renderizador mudou: NavChild já carrega seu próprio "Crianças", e legal foi aninhado sob recursos desta forma o tempo todo, no desktop e no acordeão móvel ambos. Estes são apenas os dados. "Todas as Indústrias" fica como o primeiro neto em vez de ser dobrado na linha pai, porque o pai móvel é um botão de comutação, não um link — /soluções em si é inacessível em um telefone sem ele. /solutions páginas ainda iluminar a sua categoria: isCategoryActive ja caminha com os netos, por isso os Recursos destacam onde as Soluções costumavam. Confirmado em /en/solutions/real-estate — Os recursos tornam #ffffff on rgba(107,142,58,0.1) e os outros quatro stay #9a9a9a. Verificado na página em execução, não na fonte. A linha superior lê Características, Serviços, Preços, Empresa, Recursos; Recursos pairando então As soluções abrem as oito indústrias com seus prefixos /en. O voo para fora é 200px de largura e sua borda direita pousa em 1001, 1001, 1076 e 1316 para viewports de 1024 (o ponto de paragem lg onde este nav aparece em tudo), 1280, 1440 e 1920 — dentro do viewport em cada um, sem horizontal transbordar. Em um telefone de 390 recursos abertos, Solutions abre sob ele, e todos os oito links estão lá. tsc, verificação-cliente-navegação e As chaves estão limpas.
· kamo-marketing
Desenvolvimento de aplicações, web design e web marketing
* ************* argumenta que um negócio que paga uma agência por assento é pagar por software que a agência não construiu, host, ou manter Correndo. Acaba perguntando quem deveria conseguir esse dinheiro e nunca teve um porta para apontar. Esta é a porta. 59 páginas em /serviços: um hub, três pilares, 30 páginas de capacidade, 12 páginas de evidência, 5 comparações, e seis sobre como um engajamento realmente Corre. Estrutura em TypeScript, prosa no dicionário — o padrão 37 indústrias, 45 integrações e 41 termos glossários já tradutor pode reescrever cada frase e não pode danificar uma lesma ou um rota. Quatro novas coleções, trancadas no espaço de nomes dos serviços que `coleções': este último já está traduzido para muitos locais e reutilizá-lo iria reivindicar uma página de serviço francês existe antes de uma palavra de Sim. Hoje cada página de serviço canônicos para Inglês e aparece em o sitemap inglês, que é o que o maquinário já faz para um página cuja cópia não foi traduzida. O portfólio é nossa própria plataforma, porque é o único que podemos deixar um visitante inspecionar: os servidores de e-mail, os interruptores de telefone, o WebRTC pilha de mídia, o pipeline de atribuição, o cluster, e este site. Cada número nessas páginas carrega o comando de onde veio e o dia foi lido, e scripts/check-services.ts falha a compilação sobre um fato de que não tem nenhum — juntamente com uma lesma pilar que uma criança estática / serviços seria sombra, uma referência de evidência pendurado, uma página de trabalho órfã, e um comparação que não pode nomear um caso contra si mesmo. Essa última regra não é decoração: uma página de comparação que não pode argumentar contra si mesma é um anúncio usando uma mesa. Os preços publicam o mecanismo em vez de um quadro. Citamos depois. descobrir e corrigir o número primeiro; o que o move, o que nunca está nele (nenhuma percentagem de gastos publicitários, nenhuma marcação em qualquer coisa comprada para você) e quando descobrires que estão todos em /services/how-we-quote. /services/start publica deliberadamente um tópico existente — o serviço de apoio resolve tópicoTítulo contra tópicos que já existem e responde 400 de outra forma, então um tópico "Web Design" teria compilado, implantado, parecia correto, e rejeitou todas as observações. Duas correções de acessibilidade que não são estritamente esta característica, mas enviar em Cada página. globals.css:52 diz para nunca usar um bruto --color-primary* para texto pequeno; o banner do consentimento do cookie fez, em 2.18:1, em cada página do site, e RelatedContent fez o mesmo em soluções, integrações, alternativas e glossário. Ambos usam agora o sotaque legível, e o os links de política do banner são brancos — -- color- acent- on- canvas é calculado para bater exatamente 4.5:1 contra a tela, o que não deixa nenhum headroom para o ligeiramente levantada superfície o banner senta-se. Todas as 19 páginas de serviço, o homepage, /pricing e /solutions/* agora passe o machado na WCAG 2.2 AA com zero violações; os próprios crachás da tabela de conteúdos do artigo ainda falham e são deixados em paz.
· kamo-marketing
Um artigo sobre contar suas assinaturas de software, e o banner aponta para ele
/all-in-one-business-software pergunta quantas assinaturas uma empresa está pagando: uma lista de verificação que conta-lhes e totaliza o mês e o ano como o leitor o marca, o que uma pilha custa além de sua faturas, o que tudo-em-um tem que significar para valer qualquer coisa, as perguntas a fazer antes de consolidar, e como KamoCRM cobre o mesmo terreno. Duas figuras externas, cada uma nomeada na cópia e vinculada no pé: Zylo's 2026 SaaS Management Index em licenças não utilizadas e que controla software gastar, e O Relatório de Gasto de Software 2025 do Cledara sobre o quão longe as empresas subestimam sua contagem de ferramentas. O anúncio de serviço público do banner agora aponta aqui em vez de no artigo do assento-fee. Sua label é uma nova chave, não um novo valor para a antiga: o oleoduto do dicionário salta uma chave cuja tradução já difere do inglês, então qualquer outra língua teria mantido o velho pergunta sobre um link para este artigo. Listado no menu Recursos, no hub Recursos e no mapa do site.
· kamo-internal
As bandas de lançamento abrem na própria superfície dropdown da barra
A barra de administrador e as bandas de app presa são pintadas com a barra superior gradiente, e então respondeu um hover com algo de outro app inteiramente: a cartão de dica branca flutuando doze pixels abaixo da banda, e — em um aplicativo chip — um popover MUI com legendas cinzentas e nenhuma costura para o que saiu. Nove deles, cada um aparecendo e desaparecendo sozinho. Paleta errada, errada Forma, chegando do lugar errado. Eles agora abrem para a superfície SAME os menus da barra superior usar. É pintado no marca da organização, sua borda superior toma a cor exata que a banda tem no local sai de, os filés soldaram-no a essa borda, e uma superfície plana e redimensiona da entrada à entrada à medida que o ponteiro percorre a linha — então uma banda lê como abertura em vez de como um cartão colocado sobre o lawsetpad. • NavTopMenuHost leva qualquer elemento de barras, não apenas o cabeçalho do NavTop: um `edgeGap` por host, porque uma banda tem cantos arredondados a barra não, e Tanto o painel como o seu filé têm de conhecer a banda pintada. O quarto que um painel tem para crescer é medido de onde ele realmente começa (---kmenu-máx-altura) em vez de ser da altura do navegador, o que significa nada a meio caminho de uma página. • NavTopMenuPanel ganha `kind="note"`: a mesma superfície e o mesmo movimento, carregando prosa sobre o gatilho em vez de escolhas. Não reivindica nenhuma função de menu e não tem foco, então as descrições da barra de administrador permanecem descrições e Enter segue ainda o link que eles descrevem. • O chip de um aplicativo preso desenha as próprias linhas que o nav desenha (NavToolSectionsPanel, retirado do NavToolBarMenu), então uma opção responde com um menu em qualquer lugar é oferecido — grupos aninhados, crachás, caixa de filtro e tudo. • Ambas as bandas ler seu gradiente de navTopSeam.ts. Uma cópia literal do pára é precisamente o que deriva, e a costura é apenas invisível enquanto o O painel e a banda concordam. Testes: a barra de administrador renderizada e trabalha com um mouse, um dedo e o teclado (uma superfície, entregue da entrada à entrada, nunca roubando foco), mais um guarda fonte que nenhuma banda alcança para um popover ou uma segunda cópia do Gradiente outra vez.
· kamo-marketing
Adicionar vídeo de marketing homepage em branco-label CRM taxas artigo
Dê aos leitores o mesmo rolo de produto da página inicial após a introdução, antes da seção de software revendida.
· kamo-shared-library
WebinarNotifyMember, a lista de notificações adicionais de uma organização
Uma linha por (organização, membro da equipe) no webinar notify member, criado por Webinar do KamoInitializerServiceNotificar a migração de membros e já aplicada. A repositório fetch-joins o membro da equipe, uma vez que todo leitor quer a pessoa. Nenhuma chave estrangeira, correspondente à migração, por isso a atualização automática ddl do inicializador Nunca acrescenta uma.
· MediaService
Copia cegamente os membros da equipe notificada em e-mails do apresentador
GET/PUT /api/webinar/notify-members (MANAGE SUPPORT) ler e substituir um lista adicional notificada da organização; cada ID deve ser um membro da equipe Essa organização, no máximo 25. WebinarEmailNotifier adiciona a posse lista da organização como cópias cegas em cada carta a um apresentador — reservada, participante entrou, participante cancelou, sessão cancelou, lembrete — nunca em um carta do participante, nunca o próprio endereço do apresentador, cada pessoa uma vez, e apenas pessoas ainda elegíveis para serem escritas.
· EmailService
Cópias cegas no envio do modelo de serviço a serviço
SendTransactionalRequest toma uma lista Bcc opcional, realizada através do sendToUser e entregar no envelope SMTP — incluindo a repetição do endereço da plataforma — assim uma pessoa copiada recebe exatamente a mensagem que o destinatário recebe. CegosCopies aparas, deixa cair o destinatário e duplicados, e fecha a lista em 25. Nenhuma chamada existente mudanças: sem bcc o envio toma o caminho que sempre fez.
· InitializerService
Webinar notify member, os membros da equipe copiados em e-mails do apresentador
Uma linha por (organização, membro da equipe): a lista Página de configurações Webinars agendadas. MediaService copia cegamente estes endereços em cada email webinar enviado a um apresentador para a organização que possui o tipo webinar. Uma nova tabela, por isso nenhum outro serviço lido é alterado; nenhuma linha significa que ninguém é copiado. Aplicado à produção 2026-09-13.
· kamo-internal
Deixe um administrador escolher quem é copiado nos e-mails do apresentador
A aba Webinars agendados ganha uma seção "Notificada Adicional" ao lado a lista dos tipos webinar. Os membros da equipe escolhidos lá obter uma cópia cega de cada email automatizado enviado a um apresentador (nova reserva, participante associado ou cancelado, sessão cancelada, lembrete) para toda a organização Webinars. Lê e substitui a lista através de /api/webinar/notify-members, escolhe pessoas com o mesmo seletor de diretório multi-selecionado que a aba Apresentadores usa, e salva explicitamente com uma dica não salva e uma confirmação salva. Um 403 esconde a seção, uma carga falha oferece uma repetição em vez de uma vazia lista, uma gravação recusada mostra a razão do servidor, e outra mudança de administrador chega ao vivo sobre o tópico de mudança de org webinar.
· kamo-shared-library
Modelos canônicos para cada carta de reserva webinar
Sete modelos meet.webinar * — o apresentador está reservado / participante se juntou / o participante cancelou avisos, a confirmação e cancelamento do participante, o carta com cancelamento de sessão e o lembrete agendado — registrado em CANONICAL KEYS, com WebinarEmail construindo o único mapa variável que os preenche: tempos na zona do leitor, a forma do livro responde ao apresentador, o guest join link e link de cancelamento pessoal para os participantes, o link de console para Apresentador, e bloqueia aquele colapso quando não há nada para mostrar.
· kamo-marketing
Deixe um visitante cancelar seu registro do link enviado por e-mail
/webinar/cancel/<token> é onde um e-mail de confirmação webinar envia alguém que já não pode vir. Procura o registo através do público. webinar API, mostra o webinar, apresentador, data e hora (no visitante locale próprio e fuso horário, com a zona nomeada) e comprimento, e cancela-lo atrás de um passo confirmado. Um link desconhecido, um registro já cancelado e um webinar que já foi realizado cada um obter seu próprio estado, e um a recusa da API é mostrada como a palavra da API. noindex/nofollow, e não no sitemap: o caminho é dinâmico, então o o walker do mapa do site o ignora e nada gera entradas para ele. Copiar vidas em o novo webinarCancel namespace.
· KlusterServices
Sign Feedback-ID em assinaturas DKIM
Gmail conta uma mensagem de campanha para o seu Feedback Loop apenas quando o cabeçalho Feedback-ID é coberto pela assinatura DKIM do domínio de envio. local.d/dkim.conf mantém o padrão do rspamd assinado cabeçalhos e adiciona feedback-id.

Seu universo está esperando.
Comece gratuitamente em minutos.Adicione produtos sempre que estiver pronto — sem migração, sem novos logins.
Gratuito para sempre — não é necessário cartão de crédito