Aller au contenu
KAMOUniverse

Changelog

Ce qui est nouveau.

Chaque amélioration apportée à la plateforme, à mesure qu'elle est livrée.

  1. · EmailService

    Des clés DKIM et un rsa-sha256 détendu/relâché pour les domaines d'émission des organisations

    DkimKeys génère la clé RSA-2048 d'un domaine (conservé dans le blob de fournisseur de vrac crypté de l'organisation) et le TXT valeur qu'un membre publie à kamoXXX.-domainkey. DkimSigner signe un message exactement comme le Le transport l'enverra et la lue à partir d'écrivantAprès la dernière sauvegardeChanges, couvrant À partir de et quel que pour quoi. les récepteurs d'en-têtes et les boucles de rétroaction utilisent (Feedback-ID inclus, jamais un en-tête X-, puisque les bandes de relais X-Kamo-Ref). Vérifié dans les tests par Apache jDKIM, une mise en œuvre indépendante: une campagne- un message en forme de vernis, vérifie toujours une fois que la bande de relais X-Kamo-Ref, et échoue sur un corps changé ou Objet.

  2. · EmailService

    DNS pour l'envoi de domaines et les serveurs de noms de chaque domaine en premier, SPF évalué, fournisseur DNS nommé

    LiveDnsResolver demande aux serveurs de noms faisant autorité de la zone (fonds à travers 1.1.1.1/8.8.8.8), de sorte qu'un enregistrement a Un membre qui vient d'être sauvegardé chez son fournisseur DNS est vu à la fois plutôt qu'après le cache négatif d'un résolveur. expire; elle revient aux résolveurs publics sur une saisine ou une temporisation, et se réarment sur TCP lorsqu'un la réponse ne correspond pas à un datagramme (dnsjava 3.5 ne parvient pas à analyser le TXT tronqué de google.com sinon). SpfEvaluator évalue la politique d'un domaine pour une adresse IPv4 en tant que serveur de réception (RFC 7208: - redirection, les limites de 10-lookup et 2-void-lookup), de sorte qu'un CNAME à contact.kamocrm.com, un ip4 inclus ou un ip4 nus lisent tous la même chose. DnsProviders nomme l'entreprise en cours d'exécution le DNS d'une zone à partir de ses serveurs de noms, pour les instructions spécifiques au fournisseur.

  3. · EmailService

    Le relais d'organisation partagé (47.181.8.86) est ensemencé pour chaque organisation; le relais de la plate-forme reste KamoCRM.

    PlatformRelayProperties connaît désormais les deux relais in-cluster: postfix-bulk (47.181.8.87, hello.kamocrm.com) et postfix-orgs (47.181.8.86), avec l'adresse de sortie, le sélecteur DKIM et les organisations cibles DNS' l'envoi de domaines CNAME à (contact.kamocrm.com). Les deux comptent comme relais, de sorte que les deux reçoivent des rapports de livraison. Le startup backfill seeds k3m1-org-relay en tant qu'hôte de plate-forme SHARED (STARTTLS et PLAIN facultatif Secret rorg-relay-auth, auto-signé de sorte tlsVerify désactivé), éteint dans la rotation de KamoCRM donc son courrier reste sur .87; ensemencé jusqu'à ce qu'une connexion soit configurée, et ses justificatifs suivent la configuration sur chaque départ. k3m1-bulk-relay est fait PLATFORM-ONLY une fois.

  4. · KlusterServices

    Postfix-orgs, le relais en vrac partagé que chaque organisation envoie en tant que 47.181.8.86

    Le courrier de campagne de KamoCRM continue de partir par le biais de postfix-bulk (47.181.8.87) et du courrier ordinaire postfixe (47.181.8.4). Le courrier de campagne de chaque autre organisation reçoit son propre IP: postfix-orgs fonctionne Le réseau hôte de k3m1 et lie son SMTP sortant à eno1 (k3m1-ext), les routes node-config/k3m1-ext Ce port et rien d'autre n'utilise. HELO est contact.kamocrm.com, le nom Frontier est fixé comme le PTR de la propriété intellectuelle. Un hôteNetwork écouter n'a pas de NetworkPolicy, donc la soumission est SASL sur STARTTLS requis sur le port 587 de l'adresse interne du noeud, à partir d'adresses de cluster uniquement (secrets dans mail/SECRETS.md). Il ne se reproduise que sous la forme d'un les domaines d'envoi EmailService ont vérifié, rafraîchis toutes les minutes - jusqu'à ce que cette carte arrive, rien. Le même garde d'émission que postfix-bulk maintient la livraison jusqu'à ce qu'eno1 soit confirmé à partir en 86, et le Les résultats des mêmes démonstrations de side-car. Chaque refus est un 4xx, jamais un 5xx. Appliquée aux fichiers que le flux de travail de déploiement s'applique déjà, de sorte que le flux de travail (et un réconcilié complet de chaque composante) n'est pas touchée.

  5. · kamo-internal

    Les onglets de campagne reçoivent des flèches de défilement en retour, sans cacher l'onglet sélectionné

    Sur un écran trop étroit pour les cinq sous-ongles, la bande montre maintenant gauche et droite les flèches à côté, comme le fait la bande de languette de la fenêtre maximisée. Il n'en avait pas depuis le première version, où les boutons de défilement "auto" de MUI coupaient un onglet ouvert par lien (?tab-archived) en deux: ils n'apparaissent qu'après que le MUI a fait défiler le schéma choisi onglet en vue, prendre 80px de la bande, et l'unique animation de défilement de MUI puis recouver toute correction. CampaignTabStrip met les onglets dans un simple scroller sans barre propre (data-kamo-scrollbar-off"), ne montre les flèches que lorsque les onglets débordent, et fait défiler la languette sélectionnée en vue chaque fois qu'elle change et chaque fois que les flèches qui arrivent ou vont change la largeur. flècheState et ARROW-SCROLL-FRACTION proviennent de maximisationTabStripModel, de sorte que les deux bandes sont d'accord sur quand une flèche est Vivez et jusqu'où ça se déplace. Vérifié en Chrome: à 1600px pas de flèches; à 700px et 520px chaque onglet ouvert par un lien est pleinement visible avec l'indicateur sous-cénen, y compris les indicateurs intermédiaires; les flèches page la bande de chaque sens; ArrowRight se déplace la mise au point le long des onglets et garde l'onglet focalisé en vue, et Saisissez-le. Ses étiquettes de flèche sont des composants.scrolls, réparés à la main dans tous les endroits de kamo-traduction-dictionnaire cc484906 (en arabe avait « bon » pour Scroll right). Les rouges les plus Vitest ici ne sont pas à la suite de ce changement et échouent à l'identique sur la base: oneScrollbar.test.ts (sur NavTopMenuPanel.tsx) et recipientStatus.test.ts (4, à l'âge de la campagne 98156e52).

  6. · kamo-internal

    Un envoi en direct dans le widget de campagnes de courrier électronique obtient une carte de spotlight

    Avec un envoi en cours, l'onglet In-Progress était une seule ligne mince dans un Paner avec de la place pour beaucoup plus, en ce moment le widget importe le plus. Quand chaque campagne sur un onglet est envoyée ou s'arrête, et le panel donne chacune à au moins sa hauteur minimale, chacune reçoit maintenant une carte: - jusqu'à quelle distance il est à travers la liste, en un grand nombre arrondi vers le bas, donc il ne dit jamais 100 % avec quoi que ce soit restant; - sa voie à 10px, la tête et la brillance visibles; - le rythme et le temps restant, et "N du total"; - livrés, ouverts, cliqués et rebondis, en tant qu'entonnoir à côté du rythme graphique sur une carte de hauteur libre (longueur de barres et taux vrais), ou comme une ligne de chiffres sur une rangée plus courte ou plus étroite; - son rythme au cours des 5 dernières minutes, une barre par 15 secondes sur la poche de l'horloge limites. La barre de remplissage est allumée, et le temps avant que la vitre ne voit le send est un stub, pas un zéro. La carte a le lien de la ligne et pause/reprise (les deux maintenant partagés, à partir de CampaignRow). Il tient à travers l'arrivée qu'il célèbre. Deux envoies assis côté par un côté dans une large vitre. Le choix ne lit que la taille du panneau, que rien à l'intérieur ne peut changer. Il ne peut donc pas s'étirer. Une carte qui déborde de toute façon est mémorisée pour cela taille du panneau, qui montre ensuite les rangées. Les configurations à l'intérieur de la carte sont Demandes de conteneurs sur la taille de la carte. Modèle: paceBuckets étale ce qui se déplace entre deux images au cours du temps Entre eux. pushSample prend une fenêtre, et le crochet garde cinq minutes par envoyer en direct, par une pause et une fin. Vaindé sans tête sur une horloge de 10 fois avec un rythme variable, en fréquence, large, tailles, 460 et 668x420, et avec deux enclumes dans les vitres larges et hautes: les cartes ne sont pas trop décalées, et les barres de vitesse suivent les cadres, y compris un étirement silencieux. Rien ne bouge sous un mouvement réduit.

  7. · kamo-internal

    Les onglets de widget des campagnes sont les étapes de l'écran des campagnes

    Le widget a mené des campagnes dans le cadre de son propre Live / Envoyé / Drafts, qui ont mis un a annulé la campagne sous Envoyé et une campagne programmée en direct. Ses onglets sont maintenant In-Progress, Not Started, Paused and Complete, déposé par campaignTabOf et nommé avec marketing.bulkEmail.tabs., donc le pavé de lancement et /marketing/email jamais mettre une campagne en deux endroits. Les comtes proviennent des nouvelles étapes d'EmailService (7481f15); une réponse plus ancienne du serveur est comptée dans les campagnes qu'il a envoyées. Choix de l'onglet: - Jusqu'à ce que le membre en choisisse un, la vitre atterrit sur ce qui se passe et reste Alors que cet onglet maintient encore n'importe quoi. Il se déplace seulement pour montrer un envoyer juste a commencé, ou quand son propre ongle s'épuise. Un envoyer qui vient de finir tient In-Progress pour sa célébration, puis le volet avance. - Une rangée que le membre suspend ou reprend reste là où ils l'ont pressée, avec son Reprendre, jusqu'à ce qu'ils quittent l'onglet. - Les noms de scène montrent où ils s'adaptent à côté de "N plus", mesurés par rapport à un cachet copie dans la langue du membre; sinon chaque étape montre son icône, avec le nom dans son infobulle et son nom accessible. Corrections trouvées lors de la vérification dans le navigateur: - Les étincelles des nouvelles ouvertures et les clics sur une campagne finale n'ont jamais été visibles: la ligne des figures les clipsent. Il ne se fixe maintenant qu'en dessous et à côté de lui-même, Et les étincelles s'envolent de la fin du mètre, de sorte qu'elles survivent aux barres qui tombent. - Une rangée trop étroite pour ses figures a dessiné le mètre ouvert sur Cliqué. Le les barres vont d'abord en dessous de 340px, et tout ce qui ne s'adapte pas à l'emballage de vue entière. - Une tuile KPI trop étroite pour son nom et son taux a marqué le nom ("Ope..."). Le taux s'enroule maintenant à la place de la vue. - "N plus" a compté les lignes en sortant de l'onglet précédent. Vérifié sans tête aux largeurs de vitre 322 à 1360: pas de découpe en ligne, pas de débordement de la languette, noms/icônes commutateur avec et sans "N plus", touches fléchées, une finition maintenue puis a mis en marche et les étincelles sont découpées à 668 et 460. Serveur du test de pause maintenant répond à la campagne en pause. Il a échoué sous charge lorsque le widget est Relire 400ms après une pause, la campagne est toujours en train d'envoyer.

  8. · EmailService

    Le widget des campagnes lit par étape, les étapes des campagnes écrannt les fichiers par

    Le widget de lancement est en train de lire les groupes et compte les campagnes par étapes /marketing/email's tabs use: In-Progress (envoi), non commencé (projet ou , par le paiement (paulé ou annulé), Complete (envoyé). Dossiers défaillants par la manière dont Jusqu'à présent, comme le fait campagneTabOf là. Chaque étape est coiffée seule: programmée avant les avant-projets et le plus tôt possible; pause avant l'annulation. "stades" est ajouté à côté des "groupes", qui reste jusqu'à ce qu'aucune version de widget ne soit conçue qui se lit il est déployé. Avant cela, une campagne annulée a été comptabilisée comme terminée, qui est lorsque l'utilisateur a décidé aujourd'hui qu'il n'appartient pas.

  9. · kamo-internal

    La liste des campagnes suit ce que les collègues font à une campagne, en direct.

    BulkEmailWorkspace prend les changements d'images d'utilisationEmailCampaignsWebSocket maintenant les résultats (onChanged, d0b56adf). Un cadre nomme une campagne et ce qui s'est passé. jamais la campagne elle-même, donc la liste dit qu'une campagne à nouveau à travers GET/campaigns/-id et le met en place. Les archives d'un collègue ou des mouvements de restauration la rangée entre les onglets ici au moment où il se produit, une nouvelle campagne ou dupliquée apparaît, et un supprimé, ou qui répond maintenant 404, quitte la liste. L'étage le nombre de boîtes de disques d'information suit les mêmes images. createCampaignChangeFollower garde une lecture par campagne à la fois. Cadres qui arriver pendant qu'une campagne est en train d'être lue (une liste téléchargée en tranches annonce toutes les tranche) demander un de plus lire une fois qu'il retourne, donc une rafale coûte deux lectures et un Une réponse plus ancienne n'a jamais atterri au-dessus d'une nouvelle réponse. Une campagne supprimée alors qu'elle est lue n'est pas remise en route lorsqu'elle revient. Vérification de Chrome contre le composant réel en poussant des cadres à travers le crochet: a restaure déplacée la ligne de la ligne Archivé avec une lecture, un supprimer suppression sa ligne avec aucun, un projet créé est apparu sous Non commencé, et cinq cadres pour un La campagne coûte deux lectures.

  10. · kamo-internal

    Le widget des campagnes de courrier électronique, en direct sur le pavé du lancement

    Un nouveau widget domestique, email.campaigns, sur le pavé de tous ceux qui peuvent ouvrir les campagnes. Ses cinq droits (EMAIL-CAMPAIGNS-WIDGET, 321-325) pendent VOIR-BULK-EMAIL, et AJOUTÉ, OPTIONNEL ET MOVABLE SecurityService, il arrive donc et est le membre à retirer. La porte également demande l'application de marketing et VEW-BULK-EMAIL elle-même. Ce qu'il montre, en lisant le nouveau /api/email/widget/campes une fois et se déplacer en direct après: - Quatre chiffres pour les deux dernières semaines (envoyés, ouverts, clics, rebonds), chacun avec une barre par jour qui lit par pointeur ou flèche, et ouvrir et cliquer sur les taux de courrier livré par la règle utilisée par la carte de délivrabilité (engagementRate, maintenant partagé par les deux). - Live / Envoyé/Conflêtes, avec des comptes. Une campagne d'envoi est une voie qui bouge. avec son rythme et son temps, les onglez-vous et les clics s'élargissent à mesure qu'ils atterrissent. A en pause une fois dictent pourquoi il ne peut pas envoyer; un plan plan décompte vers le bas; un envoyé un affiche ses taux d'ouverture et de clic. Je me traîne et reprenez de vous asseoir sur la rangée d'un membre avec MANAGE-BULK-EMAIL. - Une campagne qui se termine tandis que les montres en vitige restent sur Live pour son moment, avec une rafale, avant qu'il ne se déplace vers Sent. - Le résultat final porte les nouvelles au fur et à mesure; un large vitrage les maintient dans un colonne avec les totaux d'aujourd'hui. - Il présente pour sa salle: deux figures et lignes compactes à une colonne, entières lignes uniquement à n'importe quelle hauteur (la liste s'enroule plutôt que des découpes), et deux colonnes de les campagnes dans une large vitre seulement une seule fois ne s'en cachera. Les demi-manives en direct /topic/campaigns/-orgId-. utilisationEmailCampaignsWebSocket lires chaque cadre à travers readCampaignFrame et gains surEngagement, surChanged et onSnapshot, plus requestSnapshot, que le widget désactive donc un rampe de lancement Ne demandez jamais à l'ensemble de l'organisation un instantané. on Progress ne voit toujours que les cadres de progrès. Le carillon d'arrivée est maintenant le feu sur une transition vers SENT, pas sur chaque cadre ultérieur qui dit encore SENT (rapports de rebond et de livraison tardives le republier pendant des heures), et le crochet n'écrit plus ses gestionnaires ref pendant rendre. Vérifié avec tsc, les scripts de garde, les nouveaux fichiers virulents et les fichiers les plus touchés, et a harnais sans tête sur le composant réel à 1x1, 2x1, 2x2, 2x3, et pleine largeur.

  11. · kamo-internal

    In-Progress, Not Started, Paused, Complete and Archived tabs, et le ' ouvre son menu

    /marketing/email divise les campagnes en cinq sous-onglets, chacun avec un nombre en direct, Et chaque campagne est exactement une campagne : - Entraînement : envoi - Non commencé : projets et campagnes programmées - Passon : campagnes en pause et en annulation - Compléter : envoyé - Archivé : quel que soit l'un des membres archivés L'échec n'est pas une étape qui lui est propre: les bénéficiaires échouent, une campagne ne le fait pas, et EmailService ne le définit jamais. Une campagne qui l'a été par la suite de son envoi J'ai eu. L'onglet vit dans le tab, donc un rechargement, le bouton arrière et un lien partagé c'est; une campagne change d'angle par elle-même à mesure que son statut change en direct; et un vide Onglet dit à quoi il sert. Les archives et la restauration se trouvent dans le menu de chaque campagne (email service 39ffa54). Uniquement un une campagne sans rien à envoyer peut être archivée: un brouillon, ou un avis ou annulé. Le bouton a ouvert la campagne ainsi que son menu. AG incendie de la grille de son propre auditeur natif sur le conteneur de rangée, qui s'exécute avant celui de React délégué onClick, donc l'arrêt du moteur de rendu cellulaire est arrivé trop tard et le ligne a navigué vers l'éditeur sous le menu. Le manipulateur de rangées laisse maintenant passer clics à l'intérieur d'un contrôle de clic-couche de données-cachage-clic-click, comme le fait la grille des codes de suivi, Et un clic sur le nom de la campagne ne pousse plus deux fois l'éditeur. Vérifié dans Chrome contre le composant réel: sur l'origine/principal le clic - avec ce changement, il ouvre le menu et part nulle part. Tabs, count, archive et restoration, onglets vides et une bande de 520px étaient vérifié de la même manière. Le libellé est en kamo-translation-dictionary 02109cfc, poussé en premier et écrit à la main dans tous les locaux.

  12. · EmailService

    Archivez une campagne, et le widget laisse les archives

    POST - et /unarchive (MANAGE-BULK-EMAIL) et ensemble Nettoyez l'archivedAt de la campagne, et CampaignDTO le porte. Le /commercialisation/courrier électronique écran les fichiers d'une campagne archivée sous son propre onglet Archivé. - Seule une campagne sans rien à envoyer peut être archivée. Un envoi programmé, ou une pause est refusée: annulez-le d'abord. L'archivation à nouveau garde la première date. - Envoyer maintenant, programmer et envoyer à la dernière archived clairAt, de sorte qu'une campagne envoyée à nouveau est de retour sur les onglets de travail. - Les deux sont annoncés lorsque les cadres ARCHIVÉ/UNARCHIVÉ changent, de sorte que chaque ouverture les campagnes écran et le widget à domicile mettent à jour en direct. - CampaignWidgetReads laisse des campagnes archivées à partir de récents, inStatuses et countPar statut. Construit sur la kamo-shared-library ebdd15f1 et la la colonne archivé, les deux étant déjà en place. TransactionalSendRatchetTest était rouge sur le plan principal avant cet engagement et est toujours; Rien ici ne touche sendToUser. Les autres 1554 essais passent.

  13. · kamo-shared-library

    Une campagne peut être archivée

    EmailCampaignEntity gagne archivedAt (archived-at): lorsqu'un membre archivait le campagne, nulle si ce n'est pas le cas. L'écran /marketing/email obtient un onglet Archivé Et le widget de la maison laisse des campagnes archivées. La colonne est déjà sur le cluster, appliquée à la main au fur et à mesure que chaque changement de schéma est: ALTER TABLE email-campaign.email-campaign-campaigns-campaigns AJOUTER COLONNE SI NON EXISTES archivé-t-ampillemètre de temps(6) avec fuseau horaire; Nullable sans défaut, comme les autres instants sur la table, donc code construit avant que cela ne soit écrit, le tableau est inchangé.

  14. · EmailService

    Un cadre en direct pour le widget à domicile des campagnes de courrier électronique

    GET /api/email/widget/campaigns est le widget de lanceur de la lecture, construit pour un widget de lancement. Panneau qui se trouve sur la page d'accueil de chaque campagne tout au long de la journée: des rangées maigres sans corps (CampaignLine), campagnes d'abord (envoi, pause, prévue la plus rapide), puis les projets les plus récents et les plus récemment édités, chaque groupe plafonnés; nombre exact par groupe; chaque campagne montrée s'ouvre, clics et Redis lue en deux rapports dans un dernier ressort de Redis; les 14 derniers derniers rapports de relais Redis jours; son choix de suivi; et l'horloge du serveur pour les comptes à rebours. Il faut VEW-BULK-EMAIL, comme le fait la liste des campagnes. Trois types de trame maintenant ride /topic/campaigns/-orgId- en plus des progrès: - engagement : CampaignEngagementPulse coales commence ouvert, premier clics et relayer les rapports par campagne et envoie au plus un cadre par dosette, avec ce qui est nouveau depuis la dernière trame et les totaux comme Redis les détient. - changement: CampaignController annonce la création d'un membre, l'édit, la suppression, doubler, programmer, envoyer, suspendre, reprendre, annuler, audience et destinataire changements après que l'appel de service s'est engagé, comme un i-id et un verbe seulement. - Ni l'un ni l'autre ne mène une campagne de haut niveau. Chaque écran de campagne lit un cadre avec un comme progrès et copie ses compteurs sur la ligne, donc une trame de une autre forme portant une blancrait les comptages sur les écrans encore en cours d'exécution l'ancien code. L'expéditeur compte également les messages acceptés de la journée une fois par lot. (stats.daily "envoy"), dont les étlires de deux semaines du widget tirent. La suite complète est de 1534 tests avec une défaillance, TransactionalSendRatchetTest, qui compte trois surcharges sendToUser depuis c47fcf6 et n'est pas lié.

  15. · SecurityService

    Le widget des campagnes par courrier électronique arrive à tous ceux qui peuvent ouvrir les campagnes

    MAIIL-CAMPAIGNS-WIDGET et ses politiques AJOUTÉE, OPTIONNELLE et MOVABLES de VOIR-BULK-EMAIL sur le coffre qui les introduit, donc la vitre atterrit sur le pavé de lancement de chaque membre qui sait déjà lire les campagnes, et c'est ils sont à enlever ou à bouger. REQUISE ne semence pas, comme pour chaque widget: a Ne jamais épingla une feuille sur la page d'accueil de qui que ce soit.

  16. · kamo-shared-library

    Les cinq droits du widget du courrier électronique Campaigns

    MÉIL-CAMPAIGNS-WIDGET (321) et ses quatre politiques en faveur des enfants (322-325), suspendus Vistuez: chaque lecture derrière le widget, la liste des campagnes, son les compteurs et les cadres de progrès en direct, prennent déjà ce droit, donc le widget ne peut jamais être un moyen de le contourner. 326 est la prochaine id libre.

  17. · kamo-internal

    Les campagnes par courrier électronique sont le premier onglet de marketing

    Le tab-let Outils de marketing se lit maintenant dans le cadre des campagnes de courrier électronique, des matériels de commercialisation, Médias sociaux, codes de suivi. Bulk Email s'installe à l'avant sous son nouveau nom, et Materials prend le nom complet de sa propre page déjà visible. L'indice de commercialisation atterrit sur le premier onglet qu'un membre peut ouvrir, donc son ordre déplaçant avec la bande: Campagnes de messagerie par défaut, Matériel de commercialisation pour un membre sans l'e-mail. L'itinéraire, les clés de l'étiquette et VEW-BULK-EMAIL Gardez leurs noms. La formulation est en dictionnaire de traduction kamo 98a21, poussé en premier lieu, avec le deux étiquettes écrites à la main dans tous les locaux.

  18. · kamo-marketing

    Les solutions se déplacent sous Ressources, un niveau en baisse

    La rangée supérieure portait cinq catégories avant le numéro de téléphone, la langue un sélecteur et trois CTA. Les solutions sont maintenant le premier élément à l'intérieur des ressources, au-dessus des deux liens d'article, et conserve ses huit pages de l'industrie en tant que Escale de troisième niveau. Rien dans le moteur de rendu n'a changé: NavChild porte déjà son propre Les enfants, et Legal a été emboîté sous Resources ainsi en cours, sur le bureau et dans l'accordéon mobile. Ce ne sont que les données. "All Industries" reste le premier petit-fils au lieu d'être plié dans la ligne parente, parce que le parent mobile est un bouton bascule, pas un link - /solutions elle-même est inaccessible sur un téléphone sans téléphone. /solutions pages encore éclairer leur catégorie: isCategoryActive déjà promener les petits-enfants, donc Resources souligne où les solutions avaient l'habitude de le faire. Confirmé sur /en/solutions/réel-estate - Ressources rend 'ffffff rgba (107,142,58,0) et les quatre autres séjours 9a9a9a. Vérifié par la page en cours, pas la source. La ligne du haut est la lire Caractéristiques, services, prix, entreprise, ressources; hautage des ressources puis Les solutions ouvrent les huit industries avec leurs préfixes /en. Le vol a une largeur de 200px et ses bords droites à 1001, 1001, 1076 et 1316 pour des prises de vue de 1024 (le point d'arrêt où cette navvation apparaît), 1280, 1440 et 1920 - à l'intérieur de la fenêtre à l'intérieur de chaque véhicule, sans horizontal débordement. Sur un téléphone de plus de 390 ressources s'ouvre, Solutions s'ouvre sous cette rubrique. et les huit liens sont là. tsc, check-client-navigation et les clés de check-i18n sont propres.

  19. · kamo-marketing

    Développement d'applications, conception de sites Web et marketing Web

    - fait valoir qu'une entreprise payant une agence par siège paie pour les logiciels que l'agence n'a pas construit, n'hébergé ou ne gardé pas en train de courir. Il finit par demander qui devrait obtenir cet argent et n'a jamais eu un Porte à pointer d'eux. C'est la porte. 59 pages sous /services: un hub, trois piliers, 30 pages de capacité, 12 des pièces justificatives, 5 comparaisons et six sur la façon dont un engagement des courses. Structure en TypeScript, prose dans le dictionnaire et le motif 37 industries, 45 intégrations et 41 termes de glossaire déjà utilisés, de sorte qu'un Traducteur peut réécrire chaque phrase et ne peut pas endommager un limace ou un itinéraire. Quatre nouvelles collections, fermées sur l'espace de noms «services» plutôt que que les collections: ce dernier est déjà traduit dans de nombreux endroits et la réutiliser demanderait qu'une page de service française existe avant un mot de C'est le cas. Aujourd'hui, chaque page de service canoniques en anglais et apparaît dans le sitemap anglais uniquement, qui est ce que la machinerie fait déjà pour une page dont la copie n'a pas été traduite. Le portefeuille est notre propre plate-forme, parce que c'est le seul que nous pouvons laisser un visiteur d'inspection: les serveurs de courrier, les commutateurs téléphoniques, le WebRTC média stack, le pipeline d'attribution, le cluster, et ce site web. Chaque nombre sur ces pages porte la commande qu'il vient et le jour c'était lu, et scripts/check-services.ts échoue à la base d'un fait que n'a ni l'un ni lobg de pilier qu'un enfant statique/services serait fantaisiste, une référence de preuve suspendue, une page de travail orpheline, et un une comparaison qui ne peut pas désigner une affaire contre elle-même. Cette dernière règle n'est pas décoration: une page de comparaison qui ne peut s'opposer à elle-même est une publicité portant une table. La tarification publie le mécanisme plutôt qu'un tableau. Nous citons après la découverte et la correction d'abord du nombre; ce qui le déplace, ce qui n'est jamais dedans (pas de pourcentage de dépenses publicitaires, pas de majoration sur quoi que ce soit acheté pour vous) et lorsque vous le découvrez, tous sont sur /services/com-we-quote. /services/start affichent délibérément un sujet existant - le service d'appui se résout sujetTitre par rapport à des sujets qui existent déjà et répond à 400 autres, donc un sujet "Web Design" aurait compilé, déployé, regardé correct, et rejeté toute demande. Deux correctifs d'accessibilité qui ne sont pas strictement cette fonctionnalité mais sont embarqués sur Chaque page de celui-ci. globals.css:52 dit de ne jamais utiliser une grosse - couleur-primaire pour le petit texte; la bannière de consentement au cookie a fait, à 2.18:1, sur chaque page du site, et RelatedContent a fait de même sur les solutions, les intégrations, alternatives et glossaire. Les deux utilisent maintenant l'accent lisible, et le Les liens de politique de la bannière sont blancs - -color-accent-on-canvas est calculé à frapper exactement 4,5:1 contre la toile, qui ne laisse pas de marge de manœuvre pour le surface légèrement surélevée sur laquelle repose la bannière. Les 19 pages de service, page d'accueil /prix et /solutions/- maintenant passe-piale à WCAG 2.2 AA avec zéro les violations; les badges de table de contenu de l'article sur les frais continuent d'échouer et sont laissés seuls.

  20. · kamo-marketing

    Un article sur le comptage de vos abonnements logiciels, et la bannière pointe

    /all-in-un-business-software demande combien d'abonnements une entreprise paie: une liste de contrôle qui les compte et totalise le mois et l'année au fur et à mesure que le lecteur le coche, ce qu'une pile coûte au-delà de son les factures, ce que tout-en-un doit signifier pour valoir quoi que ce soit, les questions à poser avant de consolider, Et comment KamoCRM couvre le même terrain. Deux personnalités extérieures, portant chaque nom sur la copie et reliées à la le zylo's 2026 SaaS Management Index sur les licences inutilisées et qui contrôle les dépenses des logiciels, et Le rapport de Cledara sur les dépenses logicielles 2025 sur la mesure dans laquelle les entreprises sous-estiment leur nombre d'outils. L'annonce d'intérêt public de la bannière pointe maintenant ici plutôt que sur l'article sur les droits de séjour. C'est L'étiquette est une nouvelle clé, pas une nouvelle valeur pour l'ancienne: le dictionnaire pipeline saute une clé dont la traduction diffère déjà de l'anglais, donc toutes les autres langues auraient conservé l'ancienne question d'un lien avec cet article. Inscrit dans le menu Ressources, le centre de ressources et le sitemap.

  21. · kamo-internal

    Les bandes de rampe de lancement s'ouvrent sur la surface de dévers de la barre

    La barre administratrice et les bandes épinglées sont peintes avec la barre supérieure gradient, puis a répondu à un vol stationnaire avec quelque chose d'une autre application entièrement: a Carte blanche à pointe d'outils flottante à douze pixels sous la bande, et en plus d'une application épinglée puce - un Popover MUI avec des légendes grises et pas de limite à la chose dont il est sorti. Neuf d'entre eux apparaissant et disparaissent d'eux-mêmes. Mauvaise palette, mauvaise forme, arrivant du mauvais endroit. Ils ouvrent maintenant dans la surface SAME les menus de la barre supérieure. Il est peint dans le la marque de l'organisation, son bord supérieur prend la couleur exacte de la bande à l'endroit il sort de, les filets le soudent à ce bord, et une surface glisse et redimensionne de l'entrée à l'entrée lorsque le pointeur parcourt la ligne, de sorte qu'une bande se lit comme l'ouverture plutôt que sous la forme d'une carte posée sur le rampe de lancement. NavTopMenuHost prend n'importe quel élément de type barre, pas seulement l'en-tête de NavTop: un Par accueil, parce qu'une bande a atteint les coins arrondis, la barre n'est pas, et le panneau et son filet doivent rencontrer les bandes peintes. La salle d'un panneau a la croissance est mesurée à partir de l'endroit où il commence réellement (-kmenu-max-hauteur) plutôt que de la hauteur de la nav, ce qui ne signifie rien à mi-chemin d'une page. NavTopMenuPanel gagne "gens" "note": la même surface et le même mouvement, porter de la prose sur le déclencheur au lieu de faire des choix. Il ne revendique aucun rôle de menu et ne prend pas de point, de sorte que les descriptions de la barre d'administration restent descriptions et Enter suit toujours le lien qu'ils décrivent. Une puce d'application épinglée dessine les lignes de la nave tire (NavToolSectionsPanel, levé hors de NavOOBarMenu), donc une option répond avec un menu où que ce soit il est proposé - groupes imbriqués, badges, boîte filtrante et tout. Les deux bandes lisent leur gradient de navTopSeam.ts. Une copie littérale de la s'arrête précisément ce qui dérive, et la couture n'est invisible que lorsque le Le panneau et la bande s'entendent. Tests: la barre administratrice rendue et travaillée avec une souris, un doigt et le clavier (une surface, remise de l'entrée à l'entrée, ne jamais voler la mise au point), plus un un protège de la source qu'aucune bande n'atteint un popover ou une deuxième copie du gradient à nouveau.

  22. · kamo-marketing

    Intégrer la vidéo de marketing de page d'accueil sur un article sur les frais de CRM en marque blanche

    Donnez aux lecteurs la même bobine de produit à partir de la page d'accueil après l'introduction, avant la section "revente" du logiciel.

  23. · kamo-shared-library

    WebinaireNotifyMember, liste des personnes notifiées par une organisation

    Une ligne par (organisation, membre de l'équipe) dans le webinaire-notify-member, créée par Le webinaire de KamoInitializerServiceNotifyMemberMigration et déjà appliqué. Le le dépôt se rocitue le membre de l'équipe, car chaque lecteur veut la personne. Pas de clé étrangère, correspondant à la migration, donc la mise à jour ddl-auto de l'initialiseur Ne n'en ajoutez jamais un.

  24. · MediaService

    Copie à l'aveugles des membres de l'équipe notifiées sur les courriels du présentateur

    GET/PUT/api/webinar/notify-members (MANUI-SUPPORT) lire et remplacer un Liste en nombre d'établissements notifiés de l'organisation; chaque identifiant doit être un membre d'équipe cette organisation, au plus de 25. WebinarEmailNotifier ajoute la propriété la liste de l'organisation en tant qu'exemplaires aveugles sur chaque lettre à un présentateur - réservée, Participation s'est joint, admis, absent, session annulée, rappel - jamais sur un la lettre du participant, jamais l'adresse du présentateur, chaque personne une fois, et Seules les personnes qui peuvent encore être écrites.

  25. · EmailService

    Copies aveugles sur le modèle de service à service

    SendTransactionalRequest prend une liste facultative bcc, transportée via sendToUser et délivrer sur l'enveloppe SMTP - y compris la nouvelle adresse de la plate-forme - ainsi une personne copiée obtient exactement le message que le destinataire reçoit. abandonne le destinataire et les doublons, et plafonne la liste à 25. Pas d'appelant existant changements: sans bcc, l'envoi prend le chemin qu'il a toujours fait.

  26. · InitializerService

    Le membre du webinaire, les membres de l'équipe copiés sur des courriels de présentation

    Une ligne par (organisation, membre de l'équipe): la liste des personnes notifiées Onglet des paramètres des webinaires programmés. MediaService copie à l'aveuglette ces adresses chaque e-mail de webinaire envoyé à un présentateur pour l'organisation qui possède le type de webinaire. Un nouveau tableau, donc aucun tableau d'autres services lu n'est modifié; pas de lignes signifie que personne n'est copié. Appliqué à la production 2026-09-13.

  27. · kamo-internal

    Laissez un administrateur choisir qui est copié sur les courriels du présentateur

    L'onglet Webinaires programmés acquiert une section "Entièrement notifiée" à côté de la section la liste des types de webinaires. Les membres de l'équipe choisis ont une copie aveugle de chaque courriel automatisé envoyé à un présentateur (nouvelle réservation, participation ou annulé, session annulée, rappel) pour l'ensemble de l'organisation des webinaires. Il lit et remplace la liste par /api/webinar/notify-members, picks les personnes ayant le même cueilleur de répertoires multi-sélection que l'onglet Présentateurs utilise, et sauvegarde explicitement avec un indice de changement non sauvé et une confirmation sauvegardée. A 403 cache la section, une charge défaillante offre un rétrécissement plutôt qu'un vide liste, un épargne refusé montre la raison du serveur, et le changement d'un autre administrateur arrive en direct sur le sujet du webinaire.

  28. · kamo-shared-library

    Modèles canoniques pour chaque lettre de réservation de webinaires

    Sept modèles de meet.webinar et le présentateur ont été rejoints / les avis annulés, la confirmation et l'annulation du participant, lettre annulée de session et rappel prévu - enregistrement en CANONICAL-KEYS, avec WebinarEmail créant la carte à variable qui les remplit: fois dans la zone du lecteur, le registreur répond au présentateur, Lien de liaison de participation invité et lien d'annulation personnel pour les participants, le lien de la console présentateur, et bloque cet effondrement quand il n'y a rien à montrer.

  29. · kamo-marketing

    Laissez un visiteur annuler son inscription à partir du lien envoyé par courriel

    /webinar/cancel/token est l'endroit où un e-mail de confirmation du webinaire envoie quelqu'un qui ne peut plus le faire. Il examine l'enregistrement par le public API du webinaire, montre le webinaire, le présentateur, la date et l'heure (dans le visiteur lieu et fuseau horaire, avec la zone nommée) et longueur, et l'annule derrière une étape de confirmation. Un lien inconnu, une inscription déjà annulée et un webinaire qui a déjà été organisé obtiennent chacun leur propre état, et un le refus de l'API est indiqué comme l'API le mot. noindex/nofollow, et pas dans le sitemap: le chemin est dynamique, donc le sitemap marcheur le saute et rien ne génère d'entrées pour lui. Copier vit dans le nouvel espace de noms d'ancienneté.

  30. · KlusterServices

    Signer Feedback-ID dans les signatures DKIM

    Gmail compte un message de campagne vers sa boucle de rétroaction uniquement lorsque l'en-tête Feedback-ID est couverte par la signature DKIM du domaine d'envoi. local.d/dkim.conf garde la signature par défaut de rspamd en-tête et ajoute l'identifiant de feedback.

Votre univers vous attend.

Commencez gratuitement en quelques minutes. Ajoutez des produits quand vous êtes prêt. Pas de migration, pas de nouvelles connexions.

Gratuit pour toujours — aucune carte de crédit requise