Changelog
Ada kabar baru.
Setiap perbaikan pada platform, sebagai kapal.
· EmailService
Kunci-kunci DKIM dan rsa santai / santai-sha256 signer untuk organisasi 'pengiriman domain
DkimKeys menghasilkan suatu domain 's RSA-2048 kunci (disimpan dalam org' s dienkripsi besar penyedia blob) dan TXT nilai anggota mempublikasikan di kamoXXXXX. _ domainkey. < domain >. DkimSigner menandatangani pesan persis seperti transport will send it - read from writeTo after the final saveChanges cover From and which of penerima header dan loop feedback gunakan ada (Feedback-ID termasuk, tidak pernah sebuah X- header, karena strip relay X-Kamo-Ref). Diverifikasi dalam tes oleh Apache JDKIM, sebuah implementasi independen: sebuah kampanye bentuk pesan memverifikasi, masih memverifikasi sekali strip relay X-Kamo-Ref, dan gagal pada tubuh yang berubah atau Subyek.
· EmailService
DNS untuk mengirim domain - setiap server nama domain sendiri pertama, SPF dievaluasi, penyedia DNS bernama
LiveDnsResolver menanyakan nama-nama otoritatif daerah (ditemukan melalui 1,1,1,1 / 8.8.8.8), jadi sebuah catatan anggota baru saja disimpan di penyedia DNS mereka terlihat sekaligus daripada setelah cache negatif resolver berakhir; itu kembali ke resolver publik pada rujukan atau timeout, dan mengulang lebih dari TCP ketika sebuah jawaban tidak cocok dengan sebuah datagram (dnsjava 3.5 gagal mengurai google. com dipotong TXT sebaliknya). SpfEvaluasi mengevaluasi kebijakan domain untuk satu alamat IPv4 sebagai server penerima (RFC 7208: * * * * * * * * * * * * * direksikan, 10- lookup dan 2-void-lookup batas), sehingga CNAME ke kontak.kamocrm.com, sebuah include, atau ip4 telanjang semua membaca hal yang sama. DnsProviders nama perusahaan yang berjalan zona 's DNS dari nameserver, untuk provider-spesifik instruksi.
· EmailService
Relay org terbagi (47.181.8,86) ditujukan untuk setiap organisasi; relay platform tetap KamoCRM 's
PlatformRelayProperties now knows both in-cluster relays: postfix-masse (47.181.8.87, hello.kamocrm.com) dan postfix-orgs (47.181.8,86), dengan alamat keluar, DKIM selector dan DNS target organisasi ' mengirim domain CNAME ke (contactkamocrm.com). Keduanya dihitung sebagai relay, sehingga keduanya mendapatkan laporan pengiriman. Startup backfill biji k3m1- org- relay sebagai sebuah SHARED platform host (STARTLS + PLAIN sinyal-in dari opsional Secret bulk- org- relay -auth, self-signed so tlsVerify mati), dimatikan dalam rotasi KamoCRM sendiri sehingga surat tetap pada .87; seeded off sampai tanda -in dikonfigurasi, dan kredensial mengikuti config on setiap awal. k3m1-bulk- relay dibuat PLATFORM _ HANYA sekali.
· KlusterServices
Postfix- orgs, relay bersama besar setiap organisasi mengirimkan melalui sebagai 47.181.8.86
Surat kampanye KamoCRM sendiri terus meninggalkan melalui postfix-massive (47.181.8.87) dan regular mail melalui postfix (47.181.8.84). Setiap email kampanye organisasi lain mendapatkan IP sendiri: postfix- orgs berjalan pada jaringan host k3m1 dan mengikat keluar SMTP ke eno1 (k3m1 -ext), yang node- config / k3m1- rute ext keluar pelabuhan itu dan tidak ada yang lain yang menggunakan. HELO adalah kontact.kamocrm.com, nama Frontier ditetapkan sebagai IP 's PTR. Seorang pendengar hostNetwork tidak memiliki NetworkPolicy, sehingga penyerahan SASL lebih dibutuhkan STARTLS pada port 587 dari titik alamat internal, dari alamat cluster saja (rahasia dalam surat / SECRETS.md). Ini hanya relays sebagai domains pengiriman EmailService telah diverifikasi, segar setiap menit - sampai peta yang tiba, apa-apa. Penjaga jalan yang sama sebagai postfix-mast memegang pengiriman sampai eno1 dikonfirmasi untuk meninggalkan sebagai .86, dan sama pengiriman-peristiwa samping laporan hasil. Setiap penolakan adalah 4xx, tidak pernah 5xx. Ditambahkan ke berkas-berkas yang telah diterapkan oleh layout, sehingga alur kerja (dan kalibrasi penuh dari setiap komponen) tidak tersentuh.
· kamo-internal
Tab kampanye mendapatkan panah penggulung kembali, tanpa menyembunyikan tab yang dipilih
Pada layar terlalu sempit bagi lima tab bawah, strip sekarang menunjukkan kiri dan kanan panah di sampingnya, seperti yang dimaksimalkan strip tab jendela. Itu tidak ada sejak versi pertama, di mana gulir "auto" tombol MUI membuka tab dengan link (? tab = archived) dalam setengah: mereka muncul hanya setelah MUI telah scrolled yang dipilih tab ke tampilan, mengambil 80px dari strip, dan animasi gulir MUI sendiri kemudian menimpa semua koreksi. CampaignTabStrip menempatkan tab dalam scroller polos dengan tidak ada bar sendiri (data- kamo-scrollbar = "off"), menampilkan panah hanya ketika tab overflow, dan Gulung tab yang dipilih kembali ke tampilan kapanpun berubah dan kapanpun panah datang atau akan mengubah lebar. panah dan ARROW _ SCROLL _ FRACTION berasal dari maximizedTabStripModel, sehingga kedua strip setuju ketika panah Hidup dan seberapa jauh ia bergerak. Diperiksa di Chrome: di 1600px tidak ada panah, di 700px dan 520px setiap tab dibuka oleh link sepenuhnya terlihat dengan indikator di bawahnya, termasuk yang tengah; panah halaman strip setiap jalan; Gerakan ArrowRight fokus sepanjang tab dan menjaga tab fokus dalam tampilan, dan Masukkan memilihnya. Label panahnya adalah komponen. scroll, diperbaiki dengan tangan dalam setiap lokal di kamo- terjemahan - kamus cc484906 (Arab telah "sialan" untuk Gulungan kanan). Reds vital di sini bukan dari perubahan ini dan gagal identik pada utama: oneScrollbar.testlits (pada NavToPMenuPanel.tsx) dan penerima Status. lagging 98156e52).
· kamo-internal
Siaran langsung pada widget Campaigns Email mendapat kartu sorotan
Dengan satu pengiriman dalam proses, tab In- Kemajuan adalah sebuah baris tipis tunggal dalam panel dengan ruang untuk jauh lebih banyak, saat widget paling penting. Kapan setiap kampanye pada tab sedang mengirim atau berhenti, dan panel memberikan masing-masing pada Setidaknya tingginya minimum, masing-masing sekarang mendapat kartu: - seberapa jauh melalui daftar itu, dalam sejumlah besar dibulatkan turun, sehingga tidak pernah mengatakan 100% dengan apa pun yang tersisa; - Lajur pada 10px, kepala dan bersinar terlihat; - kecepatan dan waktu kiri, dan "N total"; - Diantar, dibuka, diklik dan memantul, sebagai corong di samping kecepatan bagan pada kartu dengan tinggi untuk cadangan (panjang dan laju batang true), atau sebagai (yaitu) penduduk Iram yang mempunyai bangunan-bangunan yang tinggi, - kecepatan selama 5 menit terakhir, bar per 15 detik pada jam sendiri batas. Bar masih mengisi menyala, dan waktu sebelum panel melihat kirim adalah sebuah stub, bukan nol. Kartu memiliki link baris dan jeda / resume (keduanya sekarang bersama, dari Campaigrow). Ini memegang melalui finish itu merayakan. Dua mengirimkan sisi duduk (Dan demi angin yang menyebarkan rahmat) yaitu angin yang menyebarkan hujan. Pilihan hanya membaca ukuran panel, yang tidak ada di dalamnya dapat berubah, sehingga tidak dapat berkedip. Sebuah kartu yang meluap pula diingat untuk itu ukuran panel, yang kemudian menunjukkan baris. Tata letak di dalam kartu adalah wadah kueri pada kartu apos; s ukuran sendiri. Model: paceBuckets menyebarkan apa yang bergerak antara dua frame selama waktu antara mereka. pushSample mengambil jendela, dan hook terus lima menit per Langsung kirim, melalui jeda dan finish. Diperiksa tanpa kepala pada jam 10x dengan kecepatan yang berbeda, secara teratur, lebar, Tinggi, 460 dan 668x420 panel, dan dengan dua mengirimkan panel lebar dan tinggi: Kartu cocok tanpa overflow, dan batang kecepatan mengikuti frame, termasuk peregangan yang tenang. Tidak ada yang bergerak di bawah gerakan berkurang.
· kamo-internal
Tab widget Email Campaigns adalah tahap layar kampanye
Widget yang mengajukan kampanye di bawah Live / Dikirim / Drafts sendiri, yang menempatkan kampanye dibatalkan di bawah Dikirim dan yang dijadwalkan di bawah Live. tab-nya sekarang In- Progress, Not Started, pause and Complete, filled by mechanigTaOf and named dengan pasar.bulkEmail.tabs. *, sehingga launchpad dan / marketing / email tidak pernah menempatkan satu kampanye di dua tempat. Menghitung datang dari EmailService baru 'Stares' (7481f15); jawaban server yang lebih tua dihitung dari kampanye yang dikirim. Memilih tab: - Sampai anggota memilih satu, panel tanah pada apa yang terjadi dan tetap sementara tab yang masih memegang apa pun. Ini bergerak hanya untuk menunjukkan mengirim yang hanya dimulai, atau ketika tab sendiri habis. Sebuah pengiriman yang baru saja selesai dipegang In- Kemajuan untuk perayaannya, kemudian panel bergerak. - Sebuah baris anggota jeda atau resume tetap di mana mereka menekan itu, dengan nya Lanjutkan, sampai mereka meninggalkan tab. - Nama panggung menunjukkan di mana mereka cocok selain "N lebih", diukur terhadap tersembunyi salin dalam bahasa anggota; jika tidak setiap tahap menunjukkan ikon, dengan nama dalam tooltip dan nama yang dapat diakses. Perbaikan ditemukan ketika memeriksa pada peramban: - Sparks dari baru terbuka dan klik pada kampanye selesai tidak pernah terlihat: garis angka dipotong mereka. Sekarang klip hanya di bawah dan di samping dirinya sendiri, dan bunga api terbang dari ujung meter, sehingga mereka bertahan batang menjatuhkan. - Sebuah baris terlalu sempit untuk angka menarik Opened meter atas klik. The bar pergi pertama di bawah 340px, dan apa pun yang masih tidak cocok membungkus keluar seluruh penglihatan. - Ubin KPI terlalu sempit untuk nama dan tingkat elips nama ("Ope"...). Tingkat sekarang membungkus dari pandangan sebagai gantinya. - "N more" menghitung baris meninggalkan tab sebelumnya. Diperiksa tanpa kepala di panel widget 322-1360: tidak ada potongan baris, tidak ada tab overflow, nama / ikon switch dengan dan tanpa "N lebih", tombol panah, sebuah finish diadakan kemudian pindah, dan percikan terbuka di 668 dan 460. Server tes jeda sekarang jawaban dengan kampanye jeda. Gagal saat memuat widget baca ulang 400m setelah jeda kembali kampanye masih mengirim.
· EmailService
Widget yang ada di panggung membaca, tahap dari berkas layar layar oleh
Widget launchpad dibaca sekarang grup dan menghitung kampanye berdasarkan tahap tab / marketing / email digunakan: In- Progress (sending), Tidak Dimulai (draft atau dijadwalkan), jeda (jeda atau dibatalkan), Lengkap (dikirim). Gagal berkas oleh bagaimana jauh pengirimannya mendapat, sebagai MediterorignTaOf tidak ada. Setiap tahap tertutup sendiri: dijadwalkan sebelum draft dan paling cepat pertama; jeda sebelum dibatalkan. 'tahap' ditambahkan di samping 'grup', yang tetap sampai tidak ada dibangun widget yang berbunyi itu dikerahkan. Sebelum ini, kampanye dibatalkan dihitung sebagai selesai, yang di mana pengguna memutuskan hari ini bukan milik.
· kamo-internal
Daftar kampanye mengikuti apa yang rekan-rekan lakukan untuk kampanye, hidup
BulkEmailWorkspace mengambil frame perubahan Use EmailCampagsWebSocket sekarang antarkan (onchanged, d0b56adf). Sebuah nama frame kampanye dan apa yang terjadi padanya, tidak pernah kampanye itu sendiri, sehingga daftar membaca bahwa satu kampanye lagi melalui GET / kampanye / {id} dan meletakkannya di tempat. Sebuah arsip kolega atau mengembalikan gerakan baris antara tab di sini seperti yang terjadi, kampanye baru atau duplikasi muncul, dan yang dihapus, atau yang kini menjawab 404, meninggalkan daftar. Yang dipentaskan jumlah outbox mengikuti frame yang sama. CreateCampaigning ChangeFollower terus satu membaca per kampanye pada suatu waktu. Frames yang tiba ketika kampanye sedang dibaca (daftar diunggah dalam irisan mengumumkan setiap slice) meminta satu lagi membaca setelah kembali, sehingga biaya meledak dua membaca dan Jawaban lama tidak pernah mendarat di atas yang lebih baru. Kampanye dihapus saat dibaca dalam perjalanan tidak dimasukkan kembali ketika kembali. Diperiksa di Chrome terhadap komponen nyata dengan mendorong frame melalui hook: sebuah restore memindahkan baris keluar dari Archived dengan satu baca, sebuah hapus menghapus baris nya dengan tidak ada, draft diciptakan muncul di bawah Tidak Dimulai, dan lima frame untuk satu biaya kampanye dua membaca.
· kamo-internal
Widget Campaigns Email, hidup di launchpad
Widget rumah baru, email.kampanye, pada launchpad semua orang yang dapat membuka Kampanye. Its lima hak (EMAIL _ CAMPAIGNS _ WIDGET, 321- 325) hang off VIEW _ BULK _ EMAIL, and ADDED, OPTIONAL and movable seed from it in SecurityService, sehingga tiba di dan adalah anggota untuk menghapus. Pintu gerbang juga meminta aplikasi Pemasaran dan VIEW _ BULK _ EMAIL itu sendiri. Apa yang ditunjukkan, membaca EmailService baru / api / email / widget / kampanye sekali dan pindah hidup setelah itu: - Empat angka selama dua minggu terakhir (dikirim, terbuka, klik, memantul), masing-masing dengan sebuah bar sehari yang dibaca oleh penunjuk atau panah kunci, dan terbuka dan klik rate keluar dari surat yang dikirim oleh aturan kartu pengantar menggunakan (engagementRate, sekarang dibagi oleh keduanya). - Langsung / Dikirim / Draft, dengan jumlah. Sebuah kampanye pengiriman adalah jalur yang bergerak, Dengan kecepatan dan waktu yang tersisa, membuka dan klik bangkit dari itu sebagai mereka tanah. A orang berhenti mengatakan mengapa tidak dapat mengirim, yang dijadwalkan menghitung turun, yang dikirim menunjukkan tingkat terbuka dan klik. Jeda dan lanjutkan duduk di baris untuk anggota dengan daya tahan manusia. - Sebuah kampanye yang selesai sementara panel jam tangan tetap hidup untuk saat ini, dengan ledakan, sebelum bergerak ke Dikirim. - Garis bawah membawa berita seperti yang terjadi; sebuah panel lebar terus dalam kolom dengan total hari ini. - Ini meletakkan keluar untuk kamarnya: dua angka dan baris kompak di satu kolom, keseluruhan baris hanya pada setiap tinggi (daftar membungkus daripada pemotongan), dan dua kolom kampanye dalam sebuah panel lebar hanya sekali satu akan menyembunyikan beberapa. Setengah wahana hidup / topik / kampanye / < orgId >. Use EmailCampaignsWebSocket reads setiap frame melalui readCampaignFrame dan keuntungan Pertunangan, onDiubah dan onSnapshot, plus request Snapshot, which the widget turns off so a launchpad tidak pernah meminta seluruh organisasi untuk snapshot. onprogress still see only kemajuan frame. The finish chime now fires on a transisi into Sent, not on setiap frame kemudian yang masih mengatakan Sent (terlambat bounce dan laporan pengiriman menerbitkannya selama berjam-jam), dan kait tidak lagi menulis penangan ref selama render. Diverifikasi dengan tsc, skrip penjaga, berkas vitest baru dan terpengaruh, dan harness tanpa kepala atas komponen nyata pada 1x1, 2x2, 2x3 dan lebar penuh.
· kamo-internal
In- Progress, Not Started, pause, Complete and Archived tab, and the leveropens opened its menu
/ marketing / email membagi kampanye menjadi lima sub- tab, masing-masing dengan menghitung hidup, dan setiap kampanye berada di bawah persis satu: - In- Kemajuan: pengiriman - Tidak Dimulai: draf dan dijadwalkan kampanye - Jeda: mengistirahatkan dan membatalkan kampanye - Lengkap: dikirim - Arsip: apa pun anggota diarsipkan Gagal bukan panggung tersendiri: penerima gagal, kampanye tidak, dan EmailService tidak pernah mengaturnya. Sebuah kampanye yang telah diajukan oleh seberapa jauh pengiriman Dapat. Tab hidup di? tab =, sehingga reload, tombol belakang dan sebuah link bersama tetap itu; kampanye mengubah tab dengan sendirinya sebagai status perubahan hidup; dan kosong tab mengatakan apa itu untuk. Archive dan Restore berada di setiap menu kampanye (emailservice 39ffa54). Hanya kampanye dengan apa-apa yang tersisa untuk mengirim dapat diarsipkan: draft, atau dikirim atau Membatalkan satu. Tombol yang membuka kampanye serta menu. AG Grid fires rowccked dari pendengar asli pada kotak baris, yang berjalan sebelum React 's mendelegasikan onClick, sehingga penekanan sel 's stopPropagasi datang terlambat dan baris navigasi ke penyunting di bawah menu. Penangan baris sekarang memungkinkan melalui klik dalam sebuah data-meduigns-sendiri-klik kontrol, seperti yang dilakukan Kode Pelacak, dan klik pada nama kampanye tidak lagi mendorong rute editor dua kali. Diperiksa dalam Chrome terhadap komponen nyata: pada asal / utama klik grunclick pergi ke Dengan perubahan ini membuka menu dan pergi Entah dimana. Tab, jumlah, arsip dan pengembalian, tab kosong dan strip 520px adalah memeriksa dengan cara yang sama. Kata-kata dalam bahasa kamo- terjemahan - kamus 02109cfc, didorong pertama dan ditulis dengan tangan di setiap tempat.
· EmailService
Archive suatu kampanye, dan widget meninggalkan yang diarsipkan keluar
POST * * * * * * * * * * * * * dan / unarchive (MANUGE _ BULK _ EMAIL) set dan Bersihkan arsip kampanye, dan Kampanye membawanya. The / marketing / email berkas layar sebuah kampanye terarsip di bawah tab Arsip sendiri. - Hanya kampanye dengan tidak ada yang tersisa untuk mengirim dapat diarsipkan. Sebuah jadwal, pengiriman atau pause satu ditolak: batalkan dulu. Mengarsip lagi membuat kencan pertama. - Kirim sekarang, Jadwal dan Kirim ke archivedAt terbaru jelas, sehingga kampanye dikirim lagi kembali bekerja tab. - Keduanya diumumkan sebagai ARCHIVED / UNARCHIVED frame perubahan, jadi setiap terbuka kampanye layar dan widget rumah memutakhirkan langsung. - Kampanye WidgetReads meninggalkan kampanye terarsip baru-baru ini, inStatuses dan countByStatus. Builds on kamo- shared-library ebdd15f1 * * * * * * * * * * * * * * * dan archived _ at kolom, keduanya sudah di tempat. TransaktionalSendRatchetTest merah pada utama sebelum ini berkomitmen dan masih adalah; disini tidak menyentuh sendToUser. 1554 tes lainnya lulus.
· kamo-shared-library
Kampanye dapat diarsipkan
EmailCampaigEntity memperoleh archivedat (archived _ at): ketika anggota diarsipkan kampanye, kosong sementara tidak. Layar / marketing / email mendapat tab Archived dan widget rumah meninggalkan kampanye terarsip keluar. Kolom sudah pada cluster, diterapkan dengan tangan sebagai setiap perubahan skema adalah: ALTER TABEL email _ mechanig.email _ kampanye ADD COLUMN IF TIDAK TERLIKSI diarsipkan _ at timestamp (6) dengan zona waktu; Bernomor dengan tidak baku, seperti instants lain di atas meja, sehingga kode dibangun sebelum commit ini membaca tabel tidak berubah.
· EmailService
Sebuah frame baca dan hidup untuk widget rumah Campaigns Email
GET / api / email / widget / kampanye adalah satu yang dibaca widget launchpad, dibangun untuk panel yang duduk di setiap halaman rumah penampil kampanye sepanjang hari: baris ramping tanpa tubuh (Kampanye), kampanye langsung pertama (mengirim, pause, dijadwalkan cepat), maka yang terbaru selesai dan yang paling baru-baru ini diedit draf, setiap kelompok capped; jumlah yang tepat per grup; setiap kampanye yang ditampilkan terbuka, klik dan Laporan relay di salah satu Redis pipelined membaca; organisasi terakhir empat belas hari; yang pelacakan pilihan; dan server jam untuk hitung mundur. Dibutuhkan VIEW _ BULK _ EMAIL, sebagaimana daftar kampanye lakukan. Tiga jenis frame sekarang naik / topik / kampanye / < orgId > di samping kemajuan: - Pertunangan: koalesi Dungignment Pulse pertama terbuka, klik pertama dan Laporan relay per kampanye dan mengirimkan paling banyak satu frame per pod kedua, dengan apa yang baru sejak frame terakhir dan totals sebagai Redis memegang mereka. - berubah: CampaigController mengumumkan pembuatan anggota, menyunting, menghapus, duplikasi, jadwal, kirim, jeda, lanjutkan, batalkan, penonton dan penerima perubahan setelah layanan panggilan telah berkomitmen, sebagai id dan hanya kata kerja. - Baik membawa kampanye tingkat atas Id. Setiap kampanye layar membaca bingkai dengan satu sebagai kemajuan dan salinan counter ke baris, sehingga bingkai bentuk lain membawa satu akan mengosongkan jumlah pada layar masih berjalan Kode lama. Pengirim juga menghitung hari menerima pesan sekali per batch (status.daily "sent"), dimana widget dua minggu berkilau menarik dari. Kamar lengkap adalah 1534 tes dengan satu kegagalan, Transaksional RatchetTest, yang menghitung tiga sendToUser overloads sejak c47fcf6 dan tidak berhubungan.
· SecurityService
Widget Email Campaigns tiba bagi semua orang yang dapat membuka kampanye
EMAIL _ CAMPAIGNS _ WIDGET dan nya ADDED, OPSIONAL dan MOVABLE poIONAL seed dari VIEW _ BULK _ EMAIL pada boot yang memperkenalkan mereka, sehingga panel mendarat di launchpad dari setiap anggota yang sudah dapat membaca kampanye, dan itu mereka untuk menghapus atau bergerak. REQUIRED tidak benih, seperti untuk setiap widget: a menyebarkan tidak pernah pin panel ke home page siapa pun.
· kamo-shared-library
Surel Campaigns rumah widget lima hak
EMAIL _ CAMPAIGNS _ WIDGET (321) dan empat kebijakan anak-anak (32- 325), digantung diluar VIEW _ BULK _ EMAIL: setiap baca dibelakang widget, daftar kampanye, counter dan frame kemajuan hidup, sudah mengambil hak itu, sehingga widget tidak pernah bisa menjadi jalan bulat itu. 326 adalah id gratis berikutnya.
· kamo-internal
Campaigns Email adalah tab Pemasaran pertama
Jalur tab Alat Pemasaran sekarang membaca Email Campaigns, Materials Pemasaran, Media Sosial, Kode Pelacakan. Bolak Email bergerak ke depan dengan nama barunya, dan Materials mengambil nama lengkap halamannya sendiri sudah menunjukkan. Indeks pemasaran tanah pada tab pertama anggota dapat membuka, sehingga perintah move with the strip: Email Campaigns by default, Marketing Materials for a anggota tanpa hak email. Rute, kunci label dan VIEW _ BULK _ EMAIL menjaga nama mereka. Kata-kata ini dalam bahasa kamo- terjemahan - kamus 98a21a21, didorong pertama, dengan dua label ditulis dengan tangan di setiap lokal.
· kamo-marketing
Solusi bergerak di bawah sumber daya, satu tingkat ke bawah
Baris atas membawa lima kategori sebelum nomor telepon, bahasa pemilih dan tiga CTA. Solusi sekarang adalah item pertama di dalam Sumber Daya, di atas dua artikel link, dan terus delapan halaman industri sebagai Ketiga tingkat terbang. Tidak ada di renderer berubah: NavChild sudah membawa sendiri 'Anak-anak', dan Hukum telah bersarang di bawah sumber daya selama ini, pada desktop dan di akordion mobile keduanya. Ini hanya data. "All Industries" tetap sebagai cucu pertama daripada dilipat ke baris induk, karena orang tua seluler adalah tombol togel, bukan link - / solusi itu sendiri tidak dapat dihubungi di telepon tanpa itu. / halaman solusi masih menyala kategori mereka: isKategoryActive sudah berjalan cucu-cucu, sehingga sumber daya menyoroti mana Solusi digunakan untuk. Dikonfirmasi pada / en / solusi / real-estate - Sumber daya menghasilkan # ffleon rgba (107.142,58,0.1) dan empat lainnya tinggal # 9a99a. Diverifikasi terhadap halaman running, bukan sumbernya. Baris atas berbunyi Fitur, Layanan, Harga, Perusahaan, Sumber Daya; tersedia Sumber daya kemudian Solusi membuka delapan industri dengan prefiks mereka / en. Terbang keluar adalah 200px lebar dan yang kanan tepi tanah di 1001, 1001, 1076 dan 1316 untuk viewport dari 1024 (the lg breakpoint dimana nav ini muncul sama sekali), 1280, 1440 dan 1920 - di dalam viewport di setiap satu, tanpa horisontal overflow. Pada 390- luas Sumber daya telepon terbuka, Solusi terbuka di bawahnya, dan semua delapan link di sana. tsc, check-client-navigation dan cek-i18n-kunci bersih.
· kamo-marketing
Pengembangan aplikasi, desain web dan pemasaran web
* * * * * * * * * * * * * berpendapat bahwa bisnis membayar sebuah lembaga per kursi membayar untuk perangkat lunak lembaga tidak membangun, host, atau menyimpan lari. Berakhir dengan menanyakan siapa yang harus mendapatkan uang itu dan tidak pernah memiliki pintu ke titik. Ini pintunya. 59 halaman di bawah / layanan: hub, tiga pilar, 30 halaman kapabilitas, 12 halaman bukti, 5 perbandingan, dan enam tentang bagaimana keterlibatan sebenarnya lari. Struktur dalam TypeScript, prosa dalam kamus - pola 37 industri, 45 integration dan 41 istilah Glossary sudah digunakan, jadi Penerjemah dapat menulis ulang setiap kalimat dan tidak dapat merusak siput atau rute. Empat koleksi baru, gated pada 'layanan' namespace agak daripada 'collets': yang terakhir telah diterjemahkan ke banyak locales dan menggunakan kembali akan mengklaim halaman layanan Perancis ada sebelum kata Ya. Hari ini setiap halaman layanan canonicals untuk bahasa Inggris dan muncul di hanya siemap Inggris, yang adalah apa mesin sudah lakukan untuk halaman yang salinan belum diterjemahkan. Portofolio adalah platform kita sendiri, karena itu adalah satu-satunya kita bisa membiarkan pemeriksaan pengunjung: server surat, tombol telepon, WebRTC media stack, pipa atmast, cluster, dan website ini. Setiap nomor pada halaman tersebut membawa perintah itu datang dari dan hari itu dibaca, dan script / check-serves.ts gagal membangun pada fakta bahwa tidak memiliki - bersama dengan sebuah pilar siput bahwa anak statis / layanan akan bayangan, referensi bukti menggantung, halaman kerja yatim piatu, dan perbandingan yang tidak dapat nama kasus terhadap dirinya sendiri. Aturan terakhir itu bukan dekorasi: sebuah halaman perbandingan yang tidak dapat berdebat terhadap dirinya sendiri adalah iklan memakai meja. Harga menerbitkan mekanisme daripada meja. Kami mengutip setelah penemuan dan memperbaiki nomor pertama, apa yang bergerak itu, apa yang tidak pernah di dalamnya (tidak ada persentase ad pengeluaran, tidak markup pada apa pun yang dibeli untuk Anda) dan ketika Anda mencari tahu semua pada / layanan / bagaimana - kita - quote. / layanan / mulai memposting topik yang sudah ada dengan sengaja - layanan dukungan menyelesaikan topicJudul terhadap topik yang sudah ada dan jawaban 400 sebaliknya, sehingga topik "Desain Web" akan dikompilasi, dikerahkan, tampak benar, (Dan mereka mendustakan) Nabi saw. (tiap-tiap rasul) yakni orang-orang kafir (tentang apa yang telah dikerjakannya) yaitu amal perbuatan dan keburukan yang telah disebutkan tadi. Dua perbaikan aksesibilitas yang tidak sepenuhnya fitur ini tapi kapal pada setiap halaman itu. globals.css: 52 mengatakan tidak pernah menggunakan sebuah mentah --color -primary * untuk teks kecil; spanduk persetujuan cookie lakukan, pada 2.18: 1, di setiap halaman Situs tersebut, dan RelatedContent melakukan hal yang sama pada solusi, integrasinya, alternatif dan mengkilap. Keduanya sekarang menggunakan aksen yang dapat dibaca, dan link kebijakan banner putih - --color-accent-on- kanvas dihitung ke hit tepat 4.5: 1 terhadap kanvas, yang tidak meninggalkan headroom untuk sedikit mengangkat permukaan banner duduk di. Semua 19 halaman layanan, homepage, / harga dan / solusi / * sekarang oper kapak di WCAG 2.2 AA dengan nol pelanggaran; biaya artikel sendiri tabel -of- isi lencana masih gagal dan ditinggalkan sendirian.
· kamo-marketing
Sebuah artikel tentang menghitung subscriptions perangkat lunak Anda, dan spanduk poin untuk itu
/ all-in-one-businestions software asks how many subscriptions a business is paying for: a checklist that menghitung mereka dan total bulan dan tahun sebagai pembaca kutu itu, apa biaya tumpukan di luar nya faktur, apa semua - dalam - seseorang harus berarti bernilai apa-apa, pertanyaan untuk meminta sebelum konsolidasi, dan bagaimana KamoCRM mencakup tanah yang sama. Dua angka luar, masing-masing bernama dalam salinan dan terkait di foot: Zylo 2026 SaaS Management Indeks pada lisensi yang tidak digunakan dan yang mengontrol pengeluaran perangkat lunak, dan Pengeluaran Perangkat Lunak Cledara tahun 2025 melaporkan seberapa jauh bisnis meremehkan jumlah alat mereka. Pengumuman layanan publik spanduk sekarang menunjuk di sini daripada di artikel Licen- fee. Its label adalah kunci baru, bukan nilai baru untuk yang lama: pipeline kamus melewati kunci yang terjemahan sudah berbeda dari bahasa Inggris, sehingga setiap bahasa lain akan terus lama Pertanyaan atas link ke artikel ini. Terdaftar di menu Sumber Daya, Pusat Sumber Daya dan saitmap.
· kamo-internal
The launchpad bands open into the bar 's own dropdown permukaan
Bar administrator dan pinned- app band dicat dengan bar atas gradien, dan kemudian menjawab hover dengan sesuatu dari aplikasi lain sepenuhnya: a kartu tooltip putih mengambang 12 piksel di bawah band, dan - pada aplikasi yang disematkan chip - sebuah muI popover dengan captions abu-abu dan tidak ada jahitan untuk hal itu keluar dari. Sembilan dari mereka, masing-masing muncul dan menghilang sendiri. Palet salah, salah bentuk, tiba dari tempat yang salah. Mereka sekarang membuka ke permukaan SAME menu di atas. Hal ini dicat di merek organisasi, tepi atas mengambil warna yang tepat band memiliki di tempat ia daun dari, fillet basah ke tepi itu, dan satu permukaan glides dan mengubah ukuran dari masukan ke masukan sebagai penunjuk perjalanan baris - sehingga sebuah band membaca sebagai Membuka daripada sebagai kartu diletakkan di atas launchpad. NavToPMenuHost mengambil elemen seperti bar, bukan hanya header NavTop: 'edgeGap' per host, karena sebuah band telah dibulatkan sudut bar tidak, dan baik panel dan fillet nya harus memenuhi dicat band. Ruangan panel memiliki untuk tumbuh ke diukur dari mana itu benar-benar dimulai (--kmenu-max-tinggi) daripada dari ketinggian nav itu, yang berarti tidak setengah halaman. NavToPMenuPanel memperoleh 'jenis = "catatan"': permukaan yang sama dan gerakan yang sama, membawa prosa tentang pemicu bukan pilihan. Ia mengklaim tidak ada peran menu dan tidak membutuhkan fokus, sehingga deskripsi administrator bar tetap deskripsi Dan masuk masih mengikuti link yang mereka gambarkan. Chip aplikasi switched A menarik baris nav menarik (NavToolSectionPanel, terangkat dari Naval ToolBarMenu), jadi satu pilihan jawaban dengan satu menu dimanapun ditawarkan - nested kelompok, lencana, kotak filter dan semua. Kedua band membaca gradien mereka dari navToPSeam.ts. Salinan literal dari berhenti adalah persis apa melayang, dan jahitan hanya terlihat sementara panel dan band setuju. Tes: batang administrator diberikan dan bekerja dengan mouse, jari dan papan tik (satu permukaan, diberikan dari entri ke entri, tidak pernah mencuri fokus), plus source guard bahwa baik band mencapai untuk popover atau salinan kedua dari gradien lagi.
· kamo-marketing
Tempelkan video pemasaran homepage pada artikel biaya CRM white- label
Berikan pembaca gulungan produk yang sama dari homepage setelah intro, sebelum resold- bagian perangkat lunak.
· kamo-shared-library
WebinarNotifyAnggota, sebuah organisasi Daftar Bersyarat Tambahan
Satu baris per (organisasi, anggota tim) dalam webinar _ notify _ member, dibuat oleh KamoInitializerService WebinarNotifyAnggota Migrasi dan sudah diterapkan. The fetch- repositori bergabung dengan anggota tim, karena setiap pembaca ingin orang itu. Tidak ada kunci asing, pencocokan migrasi, sehingga pemutakhiran penginisialisasi -auto tidak pernah menambahkan satu.
· MediaService
Blind- salin anggota tim Addonially Notifikasi pada email presenter
GET / PUT / api / webinar / notify-anggota (Manage _ SUPORT) baca dan ganti sebuah daftar Notifikasi Organisasi; setiap id harus menjadi anggota tim organisasi itu, paling banyak 25. WebinarEmailNotifier menambahkan owning daftar organisasi sebagai salinan buta pada setiap surat untuk presenter - dipesan, peserta bergabung, peserta dibatalkan, sesi dibatalkan, pengingat - tidak pernah pada Surat peserta, tidak pernah alamat presenter sendiri, setiap orang sekali, dan hanya orang yang masih berhak untuk ditulis.
· EmailService
Salinan buta pada layanan-ke-layanan template kirim
SendTransaktionalRequest mengambil sebuah daftar bcc opsional, dibawa melalui sendToUser dan kirimkan ke amplop SMTP - termasuk alamat platform-coba lagi - jadi orang disalin mendapat pesan persis addressee mendapat. Tumpukan Copies buta, jatuhkan alamat dan duplikat, dan tutup daftar di 25. Tidak ada pemanggil yang ada perubahan: tanpa bcc pengiriman mengambil jalur yang selalu dilakukan.
· InitializerService
Webinar _ notify _ member, anggota tim disalin pada surel presenter
Satu baris per (organisasi, anggota tim): Daftar Notifikasi Tambahan pada Jadwal tab pengaturan Webinars. MediaService buta-salinan alamat ini pada setiap email Webinar dikirim ke presenter untuk organisasi yang memiliki tipe webinar. Tabel baru, tak ada layanan lain yang dibaca; tak ada baris berarti tidak ada yang disalin. Terapan untuk produksi 2026-09-13.
· kamo-internal
Biarkan admin yang memilih yang disalin pada email presenter
Scheduled Webinars tab memperoleh bagian "Additially Notified" di samping daftar tipe Webinar. Anggota tim yang dipilih di sana mendapatkan salinan buta setiap email otomatis dikirim ke presenter (pemesanan baru, peserta bergabung atau dibatalkan, sesi dibatalkan, pengingat) untuk semua organisasi Webinar. Ini membaca dan menggantikan daftar melalui / api / webinar / notify- anggota, pick orang dengan multi- pilih direktori yang sama picker yang digunakan tab Presenters, dan menyimpan secara eksplisit dengan unsaved- perubahan petunjuk dan konfirmasi tersimpan. A 403 menyembunyikan bagian, gagal beban menawarkan coba ulang daripada kosong daftar, menyimpan ditolak menunjukkan alasan server, dan perubahan admin lain tiba secara langsung di atas topik webinar org- perubahan.
· kamo-shared-library
Templat kanonikal untuk setiap surat pemesanan webinar
Tujuh meet.webinar _ * templates - presenter dipesan / peserta bergabung / peserta dibatalkan pemberitahuan, peserta konfirmasi dan pembatalan, session- surat dibatalkan dan pengingat dijadwalkan - terdaftar di CANONICAL _ KEYS, dengan WebinarEmail membangun satu peta variabel yang mengisi mereka: kali dalam zona pembaca, booker bentuk jawaban untuk presenter, tamu bergabung link dan sambungan pribadi batal untuk peserta, sambungan konsol untuk presenter, dan blok yang runtuh ketika tidak ada untuk menunjukkan.
· kamo-marketing
Biarkan pengunjung membatalkan pendaftaran mereka dari link email
/ webinar / cancel / < token > adalah dimana surat konfirmasi webinar mengirim seseorang yang tidak bisa lagi membuatnya. Ini terlihat pendaftaran up melalui publik webinar API, menampilkan webinar, presenter, tanggal dan waktu (dalam pengunjung lokal dan zona waktu sendiri, dengan zona bernama) dan panjang, dan membatalkan itu di belakang langkah konfirmasi. Sebuah link tidak dikenal, sebuah pendaftaran sudah dibatalkan dan Webinar yang sudah diadakan masing-masing mendapatkan negara mereka sendiri, dan Penolakan dari API ditampilkan sebagai kata API itu. noindex / nofollow, dan tidak dalam sitmap: path dinamis, jadi sitmap walker melewatinya dan tidak menghasilkan masukan untuk itu. Copy tinggal di WebinarBatal namespace baru.
· KlusterServices
Tanda tangan Feedback-ID dalam tanda tangan DKIM
Gmail menghitung pesan kampanye terhadap Loop Feedback hanya ketika Header Feedback-ID adalah tertutup oleh tanda tangan DKIM domain pengiriman. local.d / dkim.conf menyimpan rspamd baku signed tajuk dan tambahkan advanback- id.

Alam semestamu menunggu.
Mulai gratis dalam beberapa menit. Tambahkan produk kapanpun Anda siap — tidak ada migrasi, tidak ada login baru.
Gratis selamanya — tidak diperlukan kartu kredit