<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Daniel Šebesta</title>
    <description>The latest articles on DEV Community by Daniel Šebesta (@danielsebesta).</description>
    <link>https://dev.to/danielsebesta</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F973704%2Fa806481f-394d-417e-b080-7d4f12054618.png</url>
      <title>DEV Community: Daniel Šebesta</title>
      <link>https://dev.to/danielsebesta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/danielsebesta"/>
    <language>en</language>
    <item>
      <title>Kecal: A 37.5 M Open-Weight Model That Writes Your Cover Chat for You</title>
      <dc:creator>Daniel Šebesta</dc:creator>
      <pubDate>Sun, 25 Oct 2026 18:16:50 +0000</pubDate>
      <link>https://dev.to/danielsebesta/kecal-a-375-m-open-weight-model-that-writes-your-cover-chat-for-you-m3o</link>
      <guid>https://dev.to/danielsebesta/kecal-a-375-m-open-weight-model-that-writes-your-cover-chat-for-you-m3o</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Kecal&lt;/strong&gt; is a 37.5 M parameter open-weight language model that does exactly one thing: it writes casual Czech chat messages, a few lines in a row, the way people actually type on Messenger or WhatsApp.&lt;/p&gt;

&lt;p&gt;I built it to power the &lt;strong&gt;Chat cipher&lt;/strong&gt; on &lt;a href="https://encrypt.click/tools/chat-cipher" rel="noopener noreferrer"&gt;encrypt.click&lt;/a&gt;. You type a message and a passphrase, the tool encrypts it, and then it &lt;em&gt;disguises the ciphertext as an ordinary chat conversation&lt;/em&gt;. Paste the conversation back in with the same passphrase and you get your message back.&lt;/p&gt;

&lt;p&gt;The lazy part: nobody has to invent a believable conversation by hand at 1 a.m. The model writes the cover text, in your browser, offline.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; &lt;a href="https://huggingface.co/danielsebesta/kecal" rel="noopener noreferrer"&gt;huggingface.co/danielsebesta/kecal&lt;/a&gt; (open weights, CC BY-NC-SA 4.0, non-commercial)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool repo (MIT):&lt;/strong&gt; &lt;a href="https://github.com/danielsebesta/encrypt" rel="noopener noreferrer"&gt;github.com/danielsebesta/encrypt&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://encrypt.click/tools/chat-cipher" rel="noopener noreferrer"&gt;encrypt.click/tools/chat-cipher&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What is new for this challenge:&lt;/strong&gt; encrypt.click (file sharing, encrypted chat, whiteboard) existed before. Everything in this post — the Kecal model itself, its training run, the neural steganography engine in &lt;code&gt;src/lib/chatCipher/&lt;/code&gt;, the Czech language pack and the ONNX export — was built and shipped during the challenge window, on 24–25 October 2026 (the model was uploaded to Hugging Face on 25 October 2026; the Chat cipher replaced the site's older "AES words" style in the commit &lt;code&gt;feat(tools): replace AES Words with Chat cipher using Kecal and Falcon packs&lt;/code&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Pick &lt;strong&gt;Czech&lt;/strong&gt;, download the language pack once (37.6 MB, stored only in your browser), type a message and a passphrase, hit &lt;em&gt;Encrypt to chat&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7iroqirhnvqpwieruyn9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7iroqirhnvqpwieruyn9.png" alt="Chat cipher with Kecal Czech language pack selected" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I tested it with a 30-character secret, &lt;code&gt;koupil jsem to vcera v obchode&lt;/code&gt;. First lines of the resulting cover:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ty uz si tam nebyl tak dva roky co sme se nevideli
tak sem ti chtel napsat ze se stehuju
uz nejsem v tom meste ani kde je centrum v novym centru no je takovej novej barak kde sem to nasel nazivo
je uplne v centru hned vedle stary benzinky vedle ty restaurace jak ty vzdycky jis a varis
maj tam nejlepsi parky na trhu jeste od patku
ja sem je vcera dal vsechny na chodbu aby bylo jidlo lepsi kdyz je vic casu pro malou na hriste
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frnnajwdcu4qxamnqj8yl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frnnajwdcu4qxamnqj8yl.png" alt="Encrypted cover chat text generated by Kecal in the browser" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full cover is &lt;strong&gt;243 words / 1,133 characters&lt;/strong&gt; — yes, that ciphertext is really in there — and writing it took about 90 seconds on my laptop, on single-threaded WASM.&lt;/p&gt;

&lt;p&gt;Paste the whole cover text back in with the same passphrase and the original message comes out:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0smozvbmaau706eghfdo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0smozvbmaau706eghfdo.png" alt="Round-trip decrypt restoring the original Czech message" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A wrong passphrase or an edited cover text &lt;strong&gt;fails closed&lt;/strong&gt; instead of returning garbage.&lt;/p&gt;

&lt;p&gt;The English mode uses Falcon-H1-Tiny (93.5 MB), Czech uses Kecal (37.6 MB). Both download once and then encrypt and decrypt without touching the network.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;Two independent halves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Encryption.&lt;/strong&gt; The message is sealed with AES-256-GCM under a key derived from your passphrase with Argon2id (the ECP3 envelope in &lt;code&gt;src/lib/passwordEnvelope.ts&lt;/code&gt;). The output is not just the ciphertext: it carries a 72-byte header with the salt and nonce, a length field and a 16-byte authentication tag. My 30-character test message came out at &lt;strong&gt;about 120 bytes&lt;/strong&gt; of sealed data — which is why the cover text is long.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Disguise.&lt;/strong&gt; This is the part the project is actually about — &lt;em&gt;deterministic top-k linguistic steganography&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At each step the model scores every word it could write next.&lt;/li&gt;
&lt;li&gt;We keep the &lt;strong&gt;top 16&lt;/strong&gt; candidates (special tokens and line-break tokens are banned so the cover never looks indented in a chat UI).&lt;/li&gt;
&lt;li&gt;16 candidates = 4 bits. We take the next 4 bits of the sealed ciphertext and use them as an index: bit pattern &lt;code&gt;0110&lt;/code&gt; means "take the 6th most likely word".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So every word in the cover carries &lt;strong&gt;exactly 4 bits — two words per byte of sealed data&lt;/strong&gt; — and the choice is fully deterministic: 120 bytes of sealed data → 240 words, which matches the 243 words measured above (the length header and the last partial group account for the extra three).&lt;/p&gt;

&lt;p&gt;Decoding runs the same model over the same cover text, looks up where each word ranked in its own top-16, reads the 4 bits back, rebuilds the bytes and decrypts them.&lt;/p&gt;

&lt;p&gt;That is also why sender and receiver need &lt;strong&gt;the same model and the same tokenizer&lt;/strong&gt;: decoding depends on reproducing the exact logits. Swap in different weights and the rankings shift, a word no longer appears in the expected top-16, and the tool reports &lt;em&gt;"Cover text does not match this language pack"&lt;/em&gt; rather than decrypting something wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Model
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Parameters&lt;/td&gt;
&lt;td&gt;37.5 M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Architecture&lt;/td&gt;
&lt;td&gt;decoder-only transformer (GPT-2), 8 layers, 8 heads, width 512&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tokens&lt;/td&gt;
&lt;td&gt;24,000 words + &lt;code&gt;&amp;lt;pad&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;eol&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;unk&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;turn&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context&lt;/td&gt;
&lt;td&gt;128 words&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perplexity&lt;/td&gt;
&lt;td&gt;~17 on held-out one-writer chat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web pack&lt;/td&gt;
&lt;td&gt;ONNX, int8 quantized → 37.6 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Licence&lt;/td&gt;
&lt;td&gt;CC BY-NC-SA 4.0 — open weights, &lt;strong&gt;non-commercial&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Published&lt;/td&gt;
&lt;td&gt;Hugging Face, 25 October 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Why a word-level tokenizer?&lt;/strong&gt; At this size a subword model spends most of its capacity on spelling. With a 24k vocabulary of whole words, 37.5 M parameters is enough for plausible Czech chat — and a word is a natural unit to hide 4 bits in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Training data (publicly available datasets):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Base run: &lt;a href="https://huggingface.co/datasets/open_subtitles" rel="noopener noreferrer"&gt;OpenSubtitles&lt;/a&gt;, ~800 M words of Czech&lt;/li&gt;
&lt;li&gt;Fine-tuning: &lt;a href="https://huggingface.co/datasets/CZLC/CNC_oral_ortofon" rel="noopener noreferrer"&gt;CZLC/CNC_oral_ortofon&lt;/a&gt; (spoken Czech), &lt;a href="https://huggingface.co/datasets/CZLC/fb_sentiment_balanced" rel="noopener noreferrer"&gt;CZLC/fb_sentiment_balanced&lt;/a&gt; (Facebook comments), &lt;a href="https://huggingface.co/datasets/lang-uk/Reddit-MultiGEC" rel="noopener noreferrer"&gt;lang-uk/Reddit-MultiGEC&lt;/a&gt; (Czech posts from r/czech, MIT)&lt;/li&gt;
&lt;li&gt;A final pass on synthetic chat messages generated for this project, biased toward one-writer bursts (a person sending several messages with no reply)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Licensing follows the training data: attribution, non-commercial, share-alike. I did not want a permissive licence on weights built from corpora that are not permissively licensed — "publicly available" and "open source" are not the same claim, and I would rather be precise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inference in the browser&lt;/strong&gt; runs through &lt;code&gt;@huggingface/transformers&lt;/code&gt; (transformers.js) on ONNX Runtime Web. The 37.5 M model quantized to int8 fits in 37.6 MB, which is small enough to ship as a one-time download from encrypt.click's own origin, cache in the browser and run from &lt;code&gt;local_files_only&lt;/code&gt; — after the first download there is no model host in the loop at all. WebGPU is tried first with a 20-second timeout, then it falls back to single-threaded WASM, which is the reliable path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Open Innovation Matters Here
&lt;/h2&gt;

&lt;p&gt;A privacy tool that calls a closed API is a contradiction. If the cover text came from someone else's server, you would be sending the context around your encrypted message to a third party — defeating the point of encrypting it.&lt;/p&gt;

&lt;p&gt;Open weights make the local path possible at all:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nothing leaves your device.&lt;/strong&gt; The model runs in the tab, offline, after one download.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nobody can revoke or change it.&lt;/strong&gt; No API deprecations, no terms-of-service changes, no price.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's auditable.&lt;/strong&gt; A steganographic tool asks you to trust it. With an open repo, open weights and a documented training set, you can check what the output looks like from the outside — including the exact top-k logic that hides the bits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's extensible.&lt;/strong&gt; Fine-tune Kecal for another language, or swap in a different small open model.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;I would rather say this up front:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It is slow.&lt;/strong&gt; About &lt;strong&gt;90 seconds&lt;/strong&gt; for a 30-character secret on single-threaded WASM. WebGPU is faster when the browser supports it, but the fallback path is what most people will hit on first use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No diacritics, no punctuation.&lt;/strong&gt; The vocabulary stores words folded (lowercase, without diacritics), so the tool's output looks like fast informal typing. The Python helper in the model repo restores the most common written form of each word; the web tool does not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A 37.5 M model sometimes repeats itself.&lt;/strong&gt; The full cover of my test run contains a mid-sentence &lt;code&gt;mas jeste jeste&lt;/code&gt;, and the model drifts between topics. It is plausible, not literary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The cover is statistically detectable.&lt;/strong&gt; Anyone who knows this tool can tell the text is generated, and a classifier could too. This is camouflage that reads naturally to a human, not a guarantee of invisibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The cover is long.&lt;/strong&gt; Salt, nonce, header and tag always travel with the message: a 30-character secret became 243 words. For very short secrets the cover is dominated by the envelope, not by your message.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Czech and English only&lt;/strong&gt;, and the model's licence is non-commercial.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The real protection is AES-256-GCM.&lt;/strong&gt; The cover text hides &lt;em&gt;that&lt;/em&gt; a secret exists; the encryption protects the content.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;Writing a believable chat that hides the fact that it hides something is slow, fiddly work — and when people are tired they skip it and send the ciphertext raw. Kecal does the boring part: you write your message, click once, and a plausible dialogue appears.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lazier output, safer output.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Adding Emojis to Your Website with Twemoji Made Easy</title>
      <dc:creator>Daniel Šebesta</dc:creator>
      <pubDate>Sat, 08 Apr 2023 14:07:28 +0000</pubDate>
      <link>https://dev.to/danielsebesta/adding-emojis-to-your-website-with-twemoji-made-easy-mc8</link>
      <guid>https://dev.to/danielsebesta/adding-emojis-to-your-website-with-twemoji-made-easy-mc8</guid>
      <description>&lt;p&gt;Hey! Today I'd like to tell you about Twemoji, a great library that allows you to add emoji to your website using SVG images.&lt;/p&gt;

&lt;p&gt;Adding Twemoji to your website is easy! Just copy and paste a few lines of code into the HTML file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;      &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://twemoji.maxcdn.com/v/latest/twemoji.min.js"&lt;/span&gt; &lt;span class="na"&gt;crossorigin=&lt;/span&gt;&lt;span class="s"&gt;"anonymous"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
         &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;    
             &lt;span class="nx"&gt;twemoji&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                     &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;folder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;svg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;ext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.svg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
             &lt;span class="p"&gt;);&lt;/span&gt;

         &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the following CSS to style the emojis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;img&lt;/span&gt;&lt;span class="nc"&gt;.emoji&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;inline&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1em&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1em&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;.07em&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;vertical-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;-0.1em&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;pointer-events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're planning to include Twemoji on your website, it's important to understand that it's best for small sites with low traffic. It may not be the best choice for large websites with a lot of emojis.&lt;/p&gt;

&lt;p&gt;The problem is that this script refreshes all emoji every time you refresh the page. This can cause your site to not appear at its best because system emoji are still loading before Twemoji. If you don't have a lot of emoji and don't update them regularly, it's better to use static emoji that aren't replaced every time you refresh the page.&lt;br&gt;
Overall, Twemoji is great for any site, but the way you do it is up to you and each way may not be ideal. &lt;/p&gt;

&lt;p&gt;That's it, if you have any questions, ask in the comments. This is also my first post on dev.to, so I apologize for any mistakes.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>css</category>
    </item>
  </channel>
</rss>
