Changelog
Cosa c'è di nuovo.
Ogni miglioramento alla piattaforma, come si spedisce.
· EmailService
Tasti DKIM e un segno rsa-sha256 rilassato/relaxed per l'invio di domini delle organizzazioni
DkimKeys genera una chiave RSA-2048 di dominio (kept in the org's crittografato bulk provider blob) e il TXT valore che un membro pubblica a kamoXXXXXXX. domainkey. DkimSigner firma un messaggio esattamente come il trasporto lo invierà — letto da writeTo dopo il salvataggio finaleChanges — che copre da e qualsiasi di i ricevitori di intestazione e l'uso dei loop di feedback sono presenti (Feedback-ID incluso, mai un intestazione X, dal momento che le strisce relè X-Kamo-Ref). Verificato nei test di Apache jDKIM, un'implementazione indipendente: una campagna- il messaggio a forma di verifica, verifica ancora una volta che il relè strisce X-Kamo-Ref, e non riesce su un corpo cambiato o Oggetto.
· EmailService
DNS per l'invio di domini — prima i nameserver di ogni dominio, SPF valutato, DNS provider chiamato
LiveDnsResolver chiede l'autorevole nameserver della zona (fondato attraverso 1.1.1.1/8.8.8.8), quindi un record il membro appena salvato al proprio provider DNS è visto subito piuttosto che dopo la cache negativa di un risolutore scade; torna ai risolutori pubblici su un rinvio o un timeout, e si riferisce su TCP quando un risposta non si adatta a un datagram (dnsjava 3.5 non riesce a parse google. Com'è troncato TXT altrimenti). SpfEvaluator valuta un criterio di dominio per un indirizzo IPv4 come server di ricezione (RFC 7208: ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** contact.kamocrm.com, un include, o un ip4 nudo tutti leggono lo stesso. DnsProviders nomina l'azienda in esecuzione DNS di una zona dai suoi nameserver, per istruzioni specifiche del fornitore.
· EmailService
Il relè org condiviso (47.181.8.86) è seme per ogni organizzazione; il relè della piattaforma rimane KamoCRM
PlatformRelayProperties ora conosce entrambi i relè in-cluster: postfix-bulk (47.181.8.87, hello.kamocrm.com) e postfix-orgs (47.181.8.86), con l'indirizzo di uscita, il selettore DKIM e le organizzazioni di destinazione DNS inviare domini CNAME a (contact.kamocrm.com). Entrambi contano come relè, quindi entrambi ottengono rapporti di consegna. I semi di backfill di avvio k3m1-org-relay come host piattaforma SHARED (STARTTLS + PLAIN sign-in dal opzionale Secret bulk-org-relay-auth, self-signed in modo tlsVerify off), spento nella rotazione di KamoCRM così la sua posta rimane su .87; seme spento fino a quando non è configurato un sign-in, e le sue credenziali seguono la configurazione su ogni inizio. k3m1-bulk-relay è fatto PLATFORM ONLY una volta.
· KlusterServices
Postfix-orgs, il relè di massa condiviso ogni organizzazione invia fino a 47.181.8.86
La posta di campagna di KamoCRM continua a partire attraverso postfix-bulk (47.181.8.87) e la posta ordinaria attraverso postfix (47.181.8.84). Ogni altra email di campagna dell'organizzazione ottiene il proprio IP: postfix-orgs funziona la rete host di k3m1 e lega il suo SMTP in uscita a eno1 (k3m1-ext), che node-config/k3m1-ext percorsi fuori quel porto e nient'altro usa. HELO è contact.kamocrm.com, il nome Frontier sta impostando come L'IP e' PTR. Un ascoltatore hostNetwork non ha NetworkPolicy, quindi la presentazione è SASL su richiesta STARTTLS sul porto 587 di l'indirizzo interno del nodo, dagli indirizzi del cluster solo (segreti in mail/SECRETS.md). Si riferisce solo come l'invio di domini EmailService ha verificato, aggiornato ogni minuto — fino a che la mappa non arriva, niente. La stessa guardia di egress come postfix-bulk detiene la consegna fino a eno1 è confermato di lasciare come .86, e la stessi risultati dei rapporti sidecar consegna-evento. Ogni rifiuto è un 4xx, mai un 5xx. Applicato ai file il flusso di lavoro di distribuzione già si applica, quindi il flusso di lavoro (e una piena riconciliazione di ogni componente) è intatto.
· kamo-internal
Le schede campagna ottenere frecce di scorrimento indietro, senza nascondere la scheda selezionata
Su uno schermo troppo stretto per i cinque sottotabs, la striscia ora mostra sinistra e destra frecce accanto a esso, come la striscia di linguetta massimizzata-finestra fa. Non aveva nessuno da quando prima versione, dove i pulsanti di scorrimento "auto" di MUI tagliano una scheda aperta dal link (?tab=archived) in metà: appaiono solo dopo che MUI ha perlustrato il selezionato scheda in vista, prendere 80px dalla striscia, e l'animazione di scorrimento di MUI proprio allora ha superato qualsiasi correzione. CampaignTabStrip mette le schede in un semplice pergamena senza barra del proprio (data-kamo-scrollbar="off"), mostra le frecce solo mentre le schede traboccano, e scorre la scheda selezionata in vista ogni volta che cambia e quando il frecce in arrivo o in uscita cambia la larghezza. frecciaState e ARROW SCROLL FRACTION provenire da massimizzatoTabStripModel, così entrambe le strisce concordano quando una freccia è vivere e quanto si muove. Controllato in Chrome: a 1600px senza frecce; a 700px e 520px ogni scheda aperta da il collegamento è completamente visibile con l'indicatore sotto di esso, compresi quelli centrali; le frecce pagina la striscia ogni modo; ArrowRight muove fuoco lungo le schede e mantiene la scheda focalizzata in vista, e Invio lo seleziona. Le sue etichette freccia sono componenti. rotolo, riparato a mano in ogni locale in kamo-translation-dictionary cc484906 (Arabic aveva "damn it" per Scroll destra). I rossi vitest qui non sono da questo cambiamento e falliscono identicamente sul principale: oneScrollbar.test.ts (su NavTopMenuPanel.tsx) e destinatarioStatus.test.ts (4, lagging 98156e52).
· kamo-internal
Un invio dal vivo nel widget Email Campaigns ottiene una scheda di faretto
Con un solo invio in corso, la scheda In-Progress era una fila sottile in una sola riga riquadro con spazio per molto di più, al momento il widget conta di più. Quando ogni campagna su una scheda è l'invio o la pausa, e il pannello dà ciascuno a meno la sua altezza minima, ogni ora ottiene una carta: - quanto è lontano dalla lista, in un gran numero arrotondato, quindi mai dice al 100% con tutto ciò che rimane; - la sua corsia a 10px, la testa e la lucentezza visibile; - ritmo e tempo a sinistra, e "N di totale"; - consegnato, aperto, cliccato e rimbalzato, come un imbuto accanto al passo grafico su una carta con altezza da risparmiare (le lunghezze e i tassi della barra reale), o come una fila di figure su una più corta o più stretta; - il suo ritmo negli ultimi 5 minuti, un bar per 15 secondi sul proprio orologio confini. Il ripieno della barra è acceso, e il tempo prima del riquadro ha visto il inviare è una stub, non uno zero. La carta ha il link della riga e la pausa / curriculum (entrambi ora condivisi, da CampagnaRow). Detiene attraverso la finitura che celebra. Due mandati siedono lato di lato in un ampio pannello. La scelta legge solo le dimensioni del pannello, che nulla dentro di esso può cambiare, in modo che non possa sgridare. Una carta che trabocca comunque è ricordato per questo dimensione del pannello, che poi mostra righe. I layout all'interno della scheda sono query del contenitore sulla dimensione della carta. Modello: paceBuckets diffonde ciò che si muove tra due cornici nel tempo tra loro. pushSample prende una finestra, e il gancio mantiene cinque minuti per live send, attraverso una pausa e una finitura. Controllato senza testa su un orologio 10x con un ritmo variabile, in regolare, largo, riquadri alti, 460 e 668x420, e con due invii nei riquadri ampi e alti: carte adatte senza troppopieno, e le barre di passo seguono le cornici, compresi un tratto tranquillo. Niente si muove sotto movimento ridotto.
· kamo-internal
Le schede dei widget delle campagne e-mail sono le fasi della schermata delle campagne
Il widget ha archiviato campagne sotto il proprio Live / Sent / Drafts, che ha messo un campagna annullata sotto Sent e una programmata sotto Live. Le sue schede sono ora In-Progress, Non Iniziato, Paused e Complete, archiviato dalla campagnaTabOf e nominato con marketing.bulkEmail.tabs.*, quindi il launchpad e /marketing/email mai mettere una campagna in due posti. I conti provengono dai nuovi `stages` di EmailService (7481f15); la risposta di un vecchio server è contata dalle campagne inviate. Scegliere la scheda: - Finché il membro non ne sceglie uno, il pannello atterra su quello che sta accadendo e rimane mentre quella scheda contiene ancora qualcosa. Si muove solo per mostrare un invio che solo iniziato, o quando la sua scheda viene esaurita. Un invio appena finito detiene In-Progresso per la sua celebrazione, poi il riquadro si muove. - Una fila che il membro si ferma o riprende rimane dove la preme, con la sua Riprendi, finché non lasciano la scheda. - I nomi delle fasi mostrano dove si adattano accanto a "N more", misurati contro un nascosto copia nella lingua del membro; altrimenti ogni fase mostra la sua icona, con il nome nel suo tooltip e il nome accessibile. Correzioni trovate durante il controllo del browser: - Scintille da nuove aperture e clic su una campagna finita non sono mai stati visibili: la linea delle figure li ha tagliati. Ora clip solo sotto e accanto a sé, e le scintille volano dalla fine del contatore, in modo da sopravvivere le barre cadere. - Una fila troppo stretta per le sue figure ha attirato il metro aperto sopra cliccato. The barre andare prima sotto 340px, e tutto ciò che ancora non si adatta avvolge di vista intero. - Una tegola KPI troppo stretta per il suo nome e tasso ellisse il nome ("Ope..."). Il tasso ora si avvolge dalla vista invece. - "N more" ha contato le righe lasciando la scheda precedente. Controllato senza testa alle larghezze di riquadro da 322 a 1360: nessun taglio di riga, nessun overflow di scheda, il nomi/icons commutare con e senza "N more", tasti freccia, una finitura tenuta poi si muoveva, e le scintille non aumentavano a 668 e 460. Il server del test di pausa ora risposte con la campagna interrotta. Ha fallito sotto carico quando il widget's rileggere 400ms dopo una pausa ha restituito la campagna ancora invio.
· EmailService
Il widget delle campagne legge per fase, gli stadi i file di schermo delle campagne da
Il widget di launchpad è letto ora gruppi e conteggia campagne per le fasi /marketing/email's schede uso: In-Progress (in attesa), Non avviato (disegnare o programmato), Paused (pausa o annullata), Complete (sent). File non riuscita da come lontano il suo mandato ottenuto, come campagnaTabOf fa lì. Ogni stadio è bloccato da solo: in programma prima delle bozze e prima; sospeso prima della cancellazione. `stages` viene aggiunto accanto a `groups`, che rimane fino a che non widget costruire che legge è distribuito. Prima di questo, una campagna annullata ha contato come finito, che è dove l'utente ha deciso oggi non appartiene.
· kamo-internal
La lista delle campagne segue quello che i colleghi fanno a una campagna, dal vivo
BulkEmailWorkspace prende le cornici di cambiamento utilizzareEmailCampaignsWebSocket ora consegna (onChanged, d0b56adf). Un frame nomina una campagna e quello che è successo, mai la campagna stessa, così la lista legge che una campagna di nuovo attraverso GET /campaigns/{id} e lo mette in posizione. Archivio o ripristino di un collega la riga tra le schede qui come accade, appare una nuova o duplicata campagna, e uno cancellato, o quello che ora risponde 404, lascia l'elenco. Il palco conta outbox segue gli stessi frame. creareCampaignChangeFollower mantiene una lettura per campagna alla volta. Cornici che arrivare mentre si legge una campagna (un elenco caricato a fette annuncia ogni fetta) chiedere un'altra lettura una volta che ritorna, quindi una scoppio costa due letti e un la risposta più vecchia non finisce mai sopra uno nuovo. Una campagna cancellata mentre la sua lettura era sulla strada non è messo indietro quando ritorna. Controllato in Chrome contro il componente reale spingendo cornici attraverso il gancio: un ripristino spostato la riga fuori da Archiviato con una sola lettura, una cancellazione rimosso la sua riga con nessuno, un progetto creato è apparso sotto Non Iniziato, e cinque cornici per uno la campagna costa due letture.
· kamo-internal
Il widget di Email Campaigns, live on the launchpad
Un nuovo widget di casa, e-mail.campaigns, sul launchpad di tutti coloro che possono aprire le campagne. I suoi cinque diritti (EMAIL CAMPAIGNS WIDGET, 321-325) VIEW BULK EMAIL, e ADDED, OPTIONAL e MOVABLE seme da esso in SecurityService, così arriva ed è il membro da rimuovere. Il cancello anche chiede l'applicazione Marketing e VIEW BULK EMAIL stesso. Cosa mostra, leggendo il nuovo /api/email/widget/campaigns una volta e muoversi in diretta dopo che: - Quattro cifre per le ultime due settimane (invio, apertura, click, rimbalzi), ognuna con una barra al giorno che legge per puntatore o tasti freccia, e aprire e fare clic sulle tariffe di posta consegnata dalla regola la carta di consegna utilizza (engagementRate, ora condiviso da entrambi). - Live / Sent / Draft, con conteggi. Una campagna di invio è una corsia che si muove, con il suo ritmo e il tempo a sinistra; si apre e fa clic si alzano mentre atterrano. A uno in pausa dice perché non può inviare; uno in programma conta giù; uno inviato mostra le tariffe aperte e clicca. Pausa e riprendere sedersi sulla riga per un membro con MANAGE BULK EMAIL. - Una campagna che termina mentre il pannello guarda rimane su Live per il suo momento, con un colpo, prima che si trasferisca a Sent. - La linea di fondo porta la notizia come accade; un ampio pannello lo tiene in un colonna con i totali di oggi. - Si stende per la sua stanza: due figure e righe compatte ad una colonna, intere righe solo a qualsiasi altezza (la lista avvolge piuttosto che tagli), e due colonne di campagne in un ampio riquadro solo una volta si nasconde un po'. Il live half rides /topic/campaigns/ <orgId>. useEmailCampaignsWebSocket reads ogni frame attraverso lettoCampaignFrame e guadagna suEngagement, onChanged e suSnapshot, più richiestaSnapshot, che il widget si spegne in modo da un launchpad non chiede mai l'intera organizzazione per una snapshot. onProgress vede ancora solo frame di progresso. Il finale si riscalda ora in una transizione in SENT, non in ogni frame successivo che ancora dice SENT (riporti di rimbalzo e di consegna ripubblicarlo per ore), e l'uncinetto non scrive più i suoi handlers ref durante render. Verificato con tsc, gli script di guardia, i nuovi e interessati file vitest, e un imbracatura senza testa sul componente reale a 1x1, 2x1, 2x2, 2x3 e larghezza completa.
· kamo-internal
In-Progress, non avviato, Paused, schede complete e archiviate, e il ⋮ apre il suo menu
/marketing/email divide le campagne in cinque sottotitoli, ciascuno con un conteggio live, e ogni campagna è sotto esattamente una: - In-Progresso: invio - Non iniziato: bozze e campagne programmate - Paused: campagne interrotte e annullate - Completo: inviato - Archiviato: qualsiasi membro archiviato Non è una fase propria: i destinatari falliscono, una campagna non lo fa, e EmailService non lo imposta mai. Una campagna che ha è presentata da quanto lontano il suo invio Ricevuto. La scheda vive in ?tab=, quindi una ricarica, il pulsante posteriore e un link condiviso mantenere esso; una campagna cambia scheda di per sé come il suo stato cambia dal vivo; e un vuoto La scheda dice a cosa serve. Archivio e ripristino sono nel menu ⋮ di ogni campagna (emailservice 39ffa54). Solo campagna con nulla da inviare può essere archiviato: un progetto, o un inviato o cancellata. Il pulsante ⋮ ha aperto la campagna così come il suo menu. AG Griglia fuoco filaClicked dal proprio ascoltatore nativo sul contenitore di fila, che corre prima di React Delegato suClick, così l'arresto del rendering cellularePropagazione è venuto troppo tardi e la riga navigata all'editor sotto il menu. Il maniglione di riga ora lascia passare clicca all'interno di un controllo data-campaign-own-click, come fa la griglia dei codici di monitoraggio, e un clic sul nome della campagna non spinge più il percorso dell'editor due volte. Controllato in Chrome contro il componente reale: sull'origine/mantenere il ⋮ click andato a Con questa modifica si apre il menu e si va Da nessuna parte. Tab, conteggi, archivio e ripristino, schede vuote e una striscia 520px erano controllato allo stesso modo. La formulazione è in kamo-translation-dictionary 02109cfc, spinta prima e scritta a mano in ogni locale.
· EmailService
Archivia una campagna, e il widget lascia fuori quelli archiviati
****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** liberare la campagna è archiviataAt, e la CampaignDTO lo trasporta. La /marketing/email file di schermo una campagna archiviata sotto la propria scheda Archiviata. - Solo una campagna con niente da mandare può essere archiviata. Un programmato, invio o uno sospeso è rifiutato: cancellarlo prima. Archiviando di nuovo mantiene il primo appuntamento. - Invia ora, Programma e Invia all'ultimo archivio chiaroAt, quindi una campagna inviata di nuovo è tornato sulle schede di lavoro. - Entrambi sono annunciati come frame di cambiamento ARCHIVED / UNARCHIVED, così ogni aperto lo schermo delle campagne e l'aggiornamento dei widget di casa dal vivo. - CampaignWidgetReads lascia campagne archiviate su recenti, inStati e ContoByStatus. Costruisce su kamo-shared-library ebdd15f1 **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** colonna archived at, entrambi già in posizione. TransactionalSendRatchetTest era rosso sul principale prima di questo commit e ancora è; Qui niente tocca InviaToUser. Gli altri 1554 test passano.
· kamo-shared-library
Una campagna può essere archiviata
EmailCampaignEntity acquisisce archiviatoAt (archived at): quando un membro ha archiviato campagna, null mentre non lo è. La schermata /marketing/email ottiene una scheda archiviata e il widget di casa lascia fuori campagne archiviate. La colonna è già sul cluster, applicata a mano come ogni cambiamento di schema è: ALTER TABLE email campaign.email campaigns ADD COLUMN IF NOT EXISTs archived at timestamp(6) con fuso orario; Nullable senza default, come gli altri istanti sulla tabella, quindi il codice costruito prima che questo commit legga la tabella invariata.
· EmailService
Una cornice live per il widget di casa di Email Campaigns
GET /api/email/widget/campaigns è l'unico letto del widget del launchpad, costruito per un riquadro che siede sulla home page di ogni visualizzatore di campagna tutto il giorno: righe magre senza corpo (CampaignLine), campagne dal vivo prima (in attesa, in pausa, in programma prima), poi il più recentemente finito e le bozze più recentemente modificate, ogni gruppo incassato; conteggi esatti per gruppo; ogni campagna mostrata apre, fa clic e relay report in un Redis conduttivo letto; l'ultima quattordicesima dell'organizzazione giorni; la sua scelta di tracciamento; e l'orologio del server per conto alla rovescia. Ci vuole VIEW BULK EMAIL, come fa la lista delle campagne. Tre tipi di frame ora cavalcano /topic/campaigns/♥orgId> accanto al progresso: - impegno: CampaignEngagementPulse carbonesces apre prima, primi clic e relay report per campagna e invia alla maggior parte un frame al secondo per pod, con quello che è nuovo dall'ultima cornice e i totali come Redis li tiene. - modificato: CampaignController annuncia la creazione, la modifica, l'eliminazione, duplicare, pianificare, inviare, mettere in pausa, riprendere, cancellare, pubblico e destinatario modifiche dopo la chiamata di servizio ha commesso, come id e un verbo solo. - Né ha una campagna di alto livello Id. Ogni schermata delle campagne legge una cornice con uno come progresso e copia i suoi contatori sulla riga, quindi una cornice di un'altra forma che trasporta uno avrebbe svuotato i conti sugli schermi ancora in esecuzione il codice più vecchio. Il mittente conta anche i messaggi accettati del giorno una volta per lotto (stats.daily "sent"), da cui il widget di due settimane brillano. La suite completa è di 1534 test con un guasto, TransactionalSendRatchetTest, che conta tre sendToUser sovraccarichi da c47fcf6 e non è correlato.
· SecurityService
Il widget Email Campaigns arriva su per tutti coloro che possono aprire le campagne
EMAIL CAMPAIGNS WIDGET e il suo seme di politiche ADDED, OPTIONAL e MOVABLE da VIEW BULK EMAIL sullo stivale che li presenta, quindi il riquadro si atterra il launchpad di ogni membro che può già leggere le campagne, ed è loro per rimuovere o muoversi. REQUIRED non seme, come per ogni widget: un dispiegare non pins mai un riquadro alla home page di nessuno.
· kamo-shared-library
I cinque diritti del widget di casa di Email Campaigns
EMAIL CAMPAIGNS WIDGET (321) e i suoi quattro bambini politici (322-325), appeso fuori VIEW BULK EMAIL: ogni lettura dietro il widget, la lista della campagna, la sua contatori e le cornici di progresso dal vivo, già la prende a destra, quindi widget non può mai essere un modo intorno a esso. 326 è il prossimo id libero.
· kamo-internal
Email Campaigns è la prima scheda Marketing
La scheda Strumenti di marketing strip ora legge campagne e-mail, materiali di marketing, Social Media, Tracking Codes. Bulk Email si sposta alla parte anteriore sotto il suo nuovo nome, e Materiali prende il nome completo la sua pagina mostra già. L'indice /marketing atterra sulla prima scheda che un membro può aprire, quindi il suo ordine si muove con la striscia: campagne e-mail per impostazione predefinita, materiali di marketing per una membro senza il diritto di e-mail. Il percorso, le chiavi dell'etichetta e VIEW BULK EMAIL Tieni i loro nomi. La formulazione è in kamo-translation-dictionary 98a21a21, spinta prima, con il due etichette scritte a mano in ogni locale.
· kamo-marketing
Le soluzioni si muovono sotto Risorse, un livello in basso
La riga superiore ha portato cinque categorie prima del numero di telefono, la lingua selettore e tre CTA. Le soluzioni sono ora il primo elemento all'interno delle risorse, sopra i due link articolo, e mantiene le sue otto pagine del settore come un Volante di terzo livello. Nulla nel renderr cambiato: NavChild già porta il proprio 'bambini', e Legale è stato annidato sotto Risorse in questo modo, sul desktop e nella fisarmonica mobile entrambi. Questi sono solo i dati. "All Industries" rimane come il primo nipote piuttosto che essere piegato nella riga genitore, perché il genitore mobile è un pulsante di attivazione, non un link — /solutions stesso è irraggiungibile su un telefono senza di esso. /Soluzioni pagine ancora illuminare la loro categoria in su: isCategoryActive già cammina i nipoti, quindi Risorse evidenzia dove le Soluzioni hanno usato. Confermato su /en/solutions/real-estate — Risorse rende #ffffffffffff rgba(107,142,58,0.1) e gli altri quattro soggiorni #9a9a9a. Verificato contro la pagina in esecuzione, non la fonte. La riga superiore legge Caratteristiche, Servizi, Prezzi, Azienda, Risorse; accumulare risorse Soluzioni apre le otto industrie con i loro prefissi /en. Il volantino è largo 200px e il suo bordo destro atterra a 1001, 1001, 1076 e 1316 per viewports of 1024 (il punto di rottura lg dove questo nav appare affatto), 1280, 1440 e 1920 — all'interno della vista a ciascuno, senza orizzontale overflow. Su un telefono di 390 Risorse si apre, Soluzioni si apre sotto di esso, e tutti e otto i collegamenti sono lì. tsc, check-client-navigation e check-i18n-chiavi sono puliti.
· kamo-marketing
Sviluppo delle applicazioni, web design e web marketing
****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** per posto sta pagando per software l'agenzia non ha costruito, ospitante, o mantenere Correre. Finisce chiedendo chi dovrebbe ottenere quei soldi e non ha mai avuto porta a punto. Questa è la porta. 59 pagine sotto /servizi: un hub, tre pilastri, 30 pagine di funzionalità, 12 pagine di prova, 5 confronti e sei su come un impegno in realtà corre. Struttura in TypeScript, prosa nel dizionario — il modello il 37 industrie, 45 integrazioni e 41 termini glossari già utilizzati, quindi traduttore può riscrivere ogni frase e non può danneggiare una slitta o un Percorso. Quattro nuove collezioni, gated sul namespace `services` piuttosto che `collezioni`: quest'ultimo è già tradotto in molti locali e riutilizzarlo richiederebbe una pagina di servizio francese esiste prima di una parola E' cosi'. Oggi ogni pagina di servizio canonici per l'inglese e appare in la mappa del sito inglese solo, che è quello che il macchinario già fa per un pagina la cui copia non è stata tradotta. Il portafoglio è la nostra piattaforma, perché è l'unica che possiamo lasciare un'ispezione del visitatore: i server di posta, gli interruttori telefonici, il WebRTC media stack, la pipeline di attribuzione, il cluster e questo sito web. Ogni numero su quelle pagine porta il comando da e il giorno è stato letto, e script/check-services.ts non riesce a costruire su un fatto che non ha né — insieme a un pilastro slug che un statico /servizio bambino sarebbe ombra, un riferimento di prova formidabile, una pagina di lavoro orfano, e un confronto che non può nominare un caso contro se stesso. L'ultima regola non è decorazione: una pagina di confronto che non può discutere contro se stessa è una pubblicità che indossa un tavolo. Il prezzo pubblica il meccanismo piuttosto che un tavolo. Citiamo dopo scoprire e fissare il numero prima; che cosa lo muove, che cosa non è mai in esso (nessuna percentuale di spesa pubblicitaria, nessun markup su nulla comprato per voi) e quando si scopre sono tutti su /services/how-we-quote. /servizi/start post un argomento esistente deliberatamente — il servizio di supporto risolve argomentoTitola contro argomenti che già esistono e risponde 400 altrimenti, così un argomento "Web Design" avrebbe compilato, distribuito, guardato corretto, e respinse ogni sottomissione. Due correzioni di accessibilità che non sono rigorosamente questa funzione, ma spediscono su ogni pagina. globals.css:52 dice di non usare mai un crudo --colore-primario* per il piccolo testo; il banner del consenso dei cookie ha fatto, a 2.18:1, in ogni pagina del sito, e RelatedContent ha fatto lo stesso su soluzioni, integrazioni, alternative e glossario. Entrambi ora usano l'accento leggibile, e banner's policy links are white — --color-accent-on-canvas è calcolato a ha colpito esattamente 4.5:1 contro la tela, che non lascia la testata per superficie leggermente rialzata il banner si siede. Tutte le 19 pagine di servizio, homepage, /pricing e /solutions/* ora passare l'ascia al WCAG 2.2 AA con zero violazioni; le tasse articolo di propria tabella di contenuti badge ancora falliscono e sono lasciati soli.
· kamo-marketing
Un articolo sul conteggio degli abbonamenti software, e il banner indica ad esso
/all-in-one-business-software chiede quanti abbonamenti un business sta pagando per: una lista di controllo che li conta e totalizza il mese e l'anno come il lettore lo fissa, che cosa una pila costa oltre il suo fatture, ciò che all-in-one deve significare valere nulla, le domande da porre prima di consolidare, e come KamoCRM copre lo stesso terreno. Due figure esterne, ciascuna denominata nella copia e collegata alla piede: Zylo's 2026 SaaS Management Index su licenze non utilizzate e che controlla la spesa software, e Cledara's 2025 Software Spend Report su quanto le aziende sottovalutino il loro numero di strumenti. L'annuncio del servizio pubblico dello striscione ora indica qui piuttosto che all'articolo della seduta. La etichetta è una nuova chiave, non un nuovo valore per il vecchio: il dizionario pipeline salta una chiave il cui traduzione già differisce dall'inglese, quindi ogni altra lingua avrebbe mantenuto il vecchio domanda su un link a questo articolo. Elencato nel menu Risorse, il hub Risorse e la mappa del sito.
· kamo-internal
Le bande di lancio si aprono nella propria superficie di discesa della barra
La barra degli amministratori e le bande pinned-app sono dipinte con la barra superiore gradiente, e poi ha risposto a un hover con qualcosa da un'altra app interamente: un white tooltip card galleggiante dodici pixel sotto la banda, e — su un app pinned chip — un popover MUI con didascalie grigie e nessuna cucitura per quello che è venuto fuori. Nove di loro, ciascuno che appare e scompare da solo. tavolozza sbagliato, sbagliato forma, arrivo dal posto sbagliato. Ora si aprono nella superficie SAME i menu della barra superiore. È dipinto nel marca dell'organizzazione, il suo bordo superiore prende il colore esatto che la band ha al posto lascia, i filetti lo saldano a quel bordo, e una superficie scivola e ridimensiona dall'ingresso all'ingresso come il puntatore viaggia la riga — quindi una band legge come apertura piuttosto che come una carta posata sopra il launchpad. • NavTopMenuHost prende qualsiasi elemento simile al bar, non solo l'intestazione di NavTop: un `edgeGap` per host, perché una band ha angoli arrotondati il bar non, e sia il pannello che il filetto devono incontrare la banda dipinta. La camera ha un pannello crescere in è misurato da dove realmente inizia (--kmenu-max-altezza) piuttosto che dall'altezza del nav, il che significa niente a metà strada in una pagina. • NavTopMenuPanel guadagna `kind="nota"`: la stessa superficie e lo stesso movimento, portare prosa sul grilletto invece di scelte. Non pretende alcun ruolo di menu e non si concentra, quindi le descrizioni della barra degli amministratori rimangono descrizioni e Inserisci segue ancora il link che descrivono. • Il chip dell'app pinned disegna le righe stesse che il nav disegna (NavToolSectionsPanel, sollevato da NavToolBarMenu), quindi un'opzione risponde con un menu ovunque è offerto — gruppi nidificati, distintivi, scatola di filtro e tutto. • Entrambe le bande leggono il loro gradiente da navTopSeam.ts. Una copia letterale del si ferma esattamente ciò che si allontana, e la cucitura è solo invisibile mentre la pannello e la band concordano su di esso. Test: la barra di amministratore reso e lavorato con un mouse, un dito e la tastiera (una superficie, tramandata dall'ingresso all'ingresso, mai rubare il fuoco), più un fonte guard che nessuna band raggiunge per un popover o una seconda copia del di nuovo.
· kamo-marketing
Embed homepage video di marketing su white-label CRM tasse articolo
Dare ai lettori la stessa bobina del prodotto dalla homepage dopo l'introduzione, prima della sezione risold-software.
· kamo-shared-library
WebinarNotifyMember, elenco notificato di un'organizzazione
Una riga per (organizzazione, membro del team) in webinar notify member, creato da Il Webinar di KamoInitializerServiceNotifyMemberMigration e già applicato. The repository fetch-joins il membro del team, dal momento che ogni lettore vuole la persona. Nessuna chiave straniera, corrispondente alla migrazione, quindi l'aggiornamento ddl-auto del inizializzatore non ne aggiunge mai uno.
· MediaService
Blind-copia i membri del team notificati Ulteriormente sulle e-mail del presentatore
GET/PUT /api/webinar/notify-members (MANAGE SUPPORT) leggere e sostituire un Inoltre elenco notificato dell'organizzazione; ogni id deve essere un membro del team quell'organizzazione, al massimo 25. WebinarEmailNotifier aggiunge la gestione elenco dell'organizzazione come copie cieche su ogni lettera a un presentatore — prenotato, partecipante si è unito, partecipante ha annullato, sessione annullata, promemoria — mai su un lettera del partecipante, mai l'indirizzo del presentatore, ogni persona una volta, e solo le persone che possono ancora essere scritte.
· EmailService
Copia cieca sul modello service-to-service invia
SendTransactionalRequest prende un elenco bcc opzionale, trasportato tramite sendToUser e consegnare sulla busta SMTP — compreso il retry di indirizzo della piattaforma — così una persona copiata ottiene esattamente il messaggio che il destinatario ottiene. blindCopies trims, cala il destinatario e duplicati, e cattura l'elenco a 25. Nessuna chiamata esistente modifiche: senza bcc l'invio prende il percorso che ha sempre fatto.
· InitializerService
Webinar notify member, i membri del team hanno copiato le email del presentatore
Una riga per (organizzazione, membro del team): l'elenco Ulteriormente notificato sulla Impostazioni Webinars programmate scheda. MediaService ciecocopie di questi indirizzi ogni email webinar inviata a un presentatore per l'organizzazione che possiede il tipo webinar. Una nuova tabella, quindi nessun tavolo altri servizi letti è alterato; nessuna riga significa che nessuno viene copiato. Applicato alla produzione 2026-09-13.
· kamo-internal
Lasciare un amministratore scegliere chi è copiato sulle e-mail del presentatore
La scheda Webinar pianificato acquisisce una sezione "Notificatamente" accanto l'elenco dei tipi webinar. I membri del team scelti là ottenere una copia cieca di ogni email automatizzata inviata a un presentatore (nuova prenotazione, partecipante si è unito o cancellazione, cancellazione della sessione, promemoria) per tutta l'organizzazione webinar. Legge e sostituisce l'elenco attraverso /api/webinar/notify-members, picks persone con lo stesso raccoglitore di directory multi-select la scheda Presenters utilizza, e salva esplicitamente con un accenno di cambio non salvato e una conferma salvata. Un 403 nasconde la sezione, un carico fallito offre una riprovazione piuttosto che un vuoto elenco, un salvataggio rifiutato mostra la ragione del server, e il cambiamento di un altro amministratore arriva dal vivo sul tema webinar org-change.
· kamo-shared-library
Modelli canonici per ogni lettera di prenotazione webinar
Sette modelli meet.webinar * — il presentatore ha prenotato / partecipante si è unito / il partecipante ha annullato le comunicazioni, la conferma e la cancellazione del partecipante, lettera di sessione e promemoria programmata — registrata in CANONICAL KEYS, con WebinarEmail costruendo l'unica mappa variabile che li riempie: tempi nella zona del lettore, il modulo del booker risponde per il presentatore, il link e link di cancellazione personale per i partecipanti, il link della console per il presentatore, e blocchi che crollano quando non c'è nulla da mostrare.
· kamo-marketing
Lascia che un visitatore annulli la registrazione dal link email
/webinar/cancel/ <token> è dove una e-mail di conferma webinar invia qualcuno che non ce la fa più. Guarda la registrazione attraverso il pubblico webinar API, mostra il webinar, il presentatore, la data e l'ora (nel visitatore proprio locale e fuso orario, con la zona denominata) e la lunghezza, e lo cancella dietro un passo di conferma. Un link sconosciuto, una registrazione già cancellata e un webinar che è già stato tenuto ciascuno ottenere il proprio stato, e un il rifiuto dall'API è mostrato come le parole API che esso. noindex/nofollow, e non nella mappa del sito: il percorso è dinamico, quindi il sitemap walker salta e nulla genera voci per esso. Copia le vite il nuovo webinarCancel namespace.
· KlusterServices
Feedback-ID dei segni nelle firme DKIM
Gmail conta un messaggio di campagna verso il suo Feedback Loop solo quando l'intestazione Feedback-ID è coperto dalla firma DKIM del dominio di invio. local.d/dkim.conf mantiene la firma predefinita di rspamd intestazioni e aggiunge feedback-id.

Il tuo universo ti sta aspettando.
Aggiungi i prodotti quando sei pronto: nessuna migrazione, nessun nuovo login, nessuna richiesta di pagamento.
Gratis per sempre — nessuna carta di credito richiesta