<?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: Zack Webster</title>
    <description>The latest articles on DEV Community by Zack Webster (@zaxwebs).</description>
    <link>https://dev.to/zaxwebs</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F547113%2F34db4e5d-a355-492d-ac79-258570bb58f8.jpeg</url>
      <title>DEV Community: Zack Webster</title>
      <link>https://dev.to/zaxwebs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zaxwebs"/>
    <language>en</language>
    <item>
      <title>How TurboQuant Works for LLMs and Why It Uses Much Less RAM</title>
      <dc:creator>Zack Webster</dc:creator>
      <pubDate>Tue, 31 Mar 2026 20:27:15 +0000</pubDate>
      <link>https://dev.to/zaxwebs/how-turboquant-works-for-llms-and-why-it-uses-much-less-ram-3emk</link>
      <guid>https://dev.to/zaxwebs/how-turboquant-works-for-llms-and-why-it-uses-much-less-ram-3emk</guid>
      <description>&lt;p&gt;Most conversations about scaling large language models focus on obvious factors like model size, training data, and GPU power. While those matter, they stop being the main constraint surprisingly quickly. Once you start dealing with long conversations and many users, memory becomes the limiting factor. Not just how much memory you have, but how efficiently you use it.&lt;/p&gt;

&lt;p&gt;This is especially true during inference, when the model is actively generating responses. At that point, the system is not just running computations, it is also constantly reading and writing large amounts of intermediate data. That data, more than anything else, starts to define both cost and speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  How LLMs actually store words like “cat”
&lt;/h2&gt;

&lt;p&gt;When you type a word like “cat,” the model does not store it as text. It converts it into a vector of numbers, often thousands of values long. These numbers represent a position in a high-dimensional space where similar words are located near each other.&lt;/p&gt;

&lt;p&gt;For example, in a simplified form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat → [0.21, -1.3, 0.7, 2.1, …]
dog → [0.25, -1.1, 0.6, 2.0, …]
car → [-2.0, 0.5, 1.2, -0.3, …]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Words like “cat” and “dog” end up close together, while “car” is far away. This is how meaning is encoded, not through definitions, but through relationships.&lt;/p&gt;

&lt;p&gt;In real models, these vectors are much larger. A common size is around 4096 numbers per token. Each number is typically stored using 16 or 32 bits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why one word expands into thousands of numbers
&lt;/h2&gt;

&lt;p&gt;What is less obvious is that the embedding vector is only the starting point. As the token moves through the model, it gets transformed at every layer. At each layer, the model produces two new vectors per token, called keys and values. These are stored in what is known as the KV cache so the model can refer back to earlier tokens.&lt;/p&gt;

&lt;p&gt;If you actually calculate how many numbers are stored per token in a typical model, it looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;32 layers × 2 (K + V) × 4096 ≈ 262,000 numbers per token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So a single word like “cat” ends up associated with hundreds of thousands of numbers as it moves through the model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the KV cache consumes so much RAM
&lt;/h2&gt;

&lt;p&gt;Once you understand how many numbers are involved, the memory usage becomes easier to grasp. Consider a conversation with around 2000 tokens. That leads to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2000 × 262,000 ≈ 524,000,000 numbers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even if each number is stored in 16 bits (2 bytes), that is roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;≈ 1 GB of memory for a single conversation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And this is just for the KV cache. In a real system serving many users simultaneously, this memory usage scales quickly into tens or hundreds of gigabytes.&lt;/p&gt;

&lt;p&gt;An additional complication is that moving this data is expensive. In many cases, transferring data from memory is slower than performing the actual mathematical operations. This means memory bandwidth becomes a performance bottleneck.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why reducing precision alone is not enough
&lt;/h2&gt;

&lt;p&gt;A natural solution is to reduce how many bits are used per number. Instead of 16 or 32 bits, you could use 8 bits. This is a standard technique known as quantization.&lt;/p&gt;

&lt;p&gt;It works to some extent, but pushing it too far causes problems. The model relies on subtle numerical relationships, especially in attention calculations. If the numbers become too coarse, those relationships break down and accuracy drops.&lt;/p&gt;

&lt;h2&gt;
  
  
  The key idea behind TurboQuant: scale plus codes
&lt;/h2&gt;

&lt;p&gt;Instead of storing each number directly, TurboQuant and similar approaches store numbers in a structured way using a scale and a small integer code.&lt;/p&gt;

&lt;p&gt;For example, instead of storing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1.44
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you might store:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scale = 0.5
code = 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and reconstruct:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;value ≈ scale × code = 1.5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows a small set of integers, represented with very few bits, to approximate a wide range of real values.&lt;/p&gt;

&lt;p&gt;Here is a small illustrative example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Original: [0.2, -0.9, 1.4, 0.6]
scale = 0.47
codes = [0, -2, 3, 1]
Reconstructed ≈ [0, -0.94, 1.41, 0.47]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The numbers are not exact, but they are close enough to preserve the overall structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  How TurboQuant preserves attention accuracy
&lt;/h2&gt;

&lt;p&gt;The main challenge with aggressive compression is that it can distort dot products, which are central to attention. Attention works by comparing vectors and deciding which previous tokens are most relevant.&lt;/p&gt;

&lt;p&gt;TurboQuant addresses this by adding a lightweight correction step that reduces systematic errors introduced during compression. The goal is not to perfectly reconstruct every number, but to preserve the relative ordering of attention scores.&lt;/p&gt;

&lt;p&gt;For example, suppose the model computes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Token A → 5.36
Token B → 3.18
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After compression, this might become:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Token A → 5.10
Token B → 3.28
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact values change, but the ordering stays the same. Token A is still more important than Token B, so the model behaves the same way.&lt;/p&gt;

&lt;h2&gt;
  
  
  How much RAM TurboQuant actually saves
&lt;/h2&gt;

&lt;p&gt;By reducing the number of bits per value to around 3 bits, TurboQuant can significantly shrink the KV cache. In practice, reported results suggest around a 6× reduction in memory usage.&lt;/p&gt;

&lt;p&gt;That means a KV cache that previously required about 1 GB could be reduced to roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;≈ 150–200 MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This has several practical benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;longer context windows become feasible&lt;/li&gt;
&lt;li&gt;more users can be served per GPU&lt;/li&gt;
&lt;li&gt;latency improves due to reduced memory movement&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A useful way to think about TurboQuant
&lt;/h2&gt;

&lt;p&gt;One way to understand this is to compare a full transcript with a set of notes. Without compression, the model stores a very detailed numerical record of everything it has seen. With TurboQuant, it stores a compressed version that keeps what matters for future decisions.&lt;/p&gt;

&lt;p&gt;The details are not perfectly preserved, but the relationships are. And for the model, that is what matters most.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for the future of LLMs
&lt;/h2&gt;

&lt;p&gt;As models continue to grow and context lengths increase, memory and memory bandwidth are becoming central challenges. Techniques like TurboQuant suggest that significant efficiency gains are still possible without changing model architecture or training methods.&lt;/p&gt;

&lt;p&gt;At a deeper level, this highlights how LLMs actually work. They operate on vectors and relationships in high-dimensional space. Once you accept that, it becomes clear that exact precision is often unnecessary. What matters is preserving the structure of that space well enough for the model to make correct decisions.&lt;/p&gt;

&lt;p&gt;TurboQuant is essentially an answer to that question: how much can we compress these representations while keeping the model’s behavior intact? The answer, at least so far, is that we can compress them far more than most people would expect.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
    </item>
    <item>
      <title>Keep Forms Simple, Silly</title>
      <dc:creator>Zack Webster</dc:creator>
      <pubDate>Sun, 15 Mar 2026 02:17:21 +0000</pubDate>
      <link>https://dev.to/zaxwebs/keep-forms-simple-silly-5hhc</link>
      <guid>https://dev.to/zaxwebs/keep-forms-simple-silly-5hhc</guid>
      <description>&lt;p&gt;Online forms are one of the most common points of interaction between a business and its users. They appear in sign ups, checkout pages, contact pages, surveys, and support requests. Despite their importance, many forms are unnecessarily complicated. When forms become long, confusing, or intrusive, users abandon them.&lt;/p&gt;

&lt;p&gt;Keeping forms simple is not just a design preference. It directly affects conversion rates, user satisfaction, and overall website performance.&lt;/p&gt;

&lt;p&gt;This principle can be summarized in a simple idea: keep forms simple.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Simplicity Matters in Forms
&lt;/h2&gt;

&lt;p&gt;Users rarely enjoy filling out forms. Most people approach them with one goal, complete the task quickly and move on. Every additional field, unclear label, or unnecessary question adds friction.&lt;/p&gt;

&lt;p&gt;When friction increases, completion rates decrease.&lt;/p&gt;

&lt;p&gt;Research across multiple UX studies consistently shows that shorter, clearer forms produce higher conversions. When users understand exactly what is required and can complete the process quickly, they are far more likely to submit the form.&lt;/p&gt;

&lt;p&gt;Simple forms benefit both users and businesses.&lt;/p&gt;

&lt;p&gt;Key advantages include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Higher completion rates&lt;/li&gt;
&lt;li&gt;Lower abandonment rates&lt;/li&gt;
&lt;li&gt;Faster user interactions&lt;/li&gt;
&lt;li&gt;Cleaner, more accurate data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In many cases, reducing a form by just a few fields can significantly improve conversions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Only Ask for What You Truly Need
&lt;/h2&gt;

&lt;p&gt;One of the most common mistakes in form design is asking for too much information.&lt;/p&gt;

&lt;p&gt;Businesses often add fields because the data might be useful someday. While that intention makes sense internally, users see it differently. They see extra effort and potential privacy concerns.&lt;/p&gt;

&lt;p&gt;A good rule is to only ask for information that is necessary to complete the task.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contact Form (Simple)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name&lt;/li&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;Message&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Contact Form (Overcomplicated)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name&lt;/li&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;Phone number&lt;/li&gt;
&lt;li&gt;Company name&lt;/li&gt;
&lt;li&gt;Budget range&lt;/li&gt;
&lt;li&gt;Project timeline&lt;/li&gt;
&lt;li&gt;Country&lt;/li&gt;
&lt;li&gt;How did you hear about us&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those additional questions are not required, they should not appear in the form.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Clear and Familiar Labels
&lt;/h2&gt;

&lt;p&gt;Users should immediately understand what each field requires. Ambiguous labels create hesitation and mistakes.&lt;/p&gt;

&lt;p&gt;Good labels are direct and familiar.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;p&gt;Clear labels&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First Name&lt;/li&gt;
&lt;li&gt;Email Address&lt;/li&gt;
&lt;li&gt;Password&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Confusing labels&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identity&lt;/li&gt;
&lt;li&gt;Contact Handle&lt;/li&gt;
&lt;li&gt;Secure Access Key&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even small wording changes can improve clarity. Simplicity reduces cognitive load, which makes forms easier to complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reduce the Number of Fields
&lt;/h2&gt;

&lt;p&gt;The length of a form strongly influences whether users complete it.&lt;/p&gt;

&lt;p&gt;When a form looks long, users often abandon it before even starting. This is known as form intimidation.&lt;/p&gt;

&lt;p&gt;There are several ways to reduce perceived length:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Combine fields when possible&lt;/li&gt;
&lt;li&gt;Remove optional questions&lt;/li&gt;
&lt;li&gt;Use dropdowns carefully&lt;/li&gt;
&lt;li&gt;Ask for additional information later&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, during account creation you may only need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;Password&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additional details like phone numbers, preferences, or profile information can be collected later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Smart Defaults and Autofill
&lt;/h2&gt;

&lt;p&gt;Modern browsers and devices support autofill features that speed up form completion. Good form design should work with these features rather than against them.&lt;/p&gt;

&lt;p&gt;Helpful techniques include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Preselecting common options&lt;/li&gt;
&lt;li&gt;Automatically formatting phone numbers&lt;/li&gt;
&lt;li&gt;Allowing browser autofill for address fields&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The less typing required, the better the user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Show Progress in Longer Forms
&lt;/h2&gt;

&lt;p&gt;Sometimes longer forms are unavoidable, such as loan applications or detailed registrations. In these situations, breaking the form into steps can reduce frustration.&lt;/p&gt;

&lt;p&gt;Multi step forms provide two important benefits:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;They feel shorter&lt;/li&gt;
&lt;li&gt;Users can see their progress&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Progress indicators reassure users that they are moving toward completion.&lt;/p&gt;

&lt;p&gt;Instead of presenting twenty fields at once, divide them into logical sections.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;Step 1: Personal information&lt;br&gt;
Step 2: Address details&lt;br&gt;
Step 3: Payment information&lt;/p&gt;

&lt;p&gt;This structure makes the process feel more manageable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Provide Helpful Error Messages
&lt;/h2&gt;

&lt;p&gt;Errors are inevitable when users fill out forms. What matters is how those errors are handled.&lt;/p&gt;

&lt;p&gt;Poor error handling creates frustration.&lt;/p&gt;

&lt;p&gt;Examples of bad error messages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Invalid input&lt;/li&gt;
&lt;li&gt;Something went wrong&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Better error messages explain exactly what needs to be fixed.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Please enter a valid email address&lt;/li&gt;
&lt;li&gt;Password must contain at least 8 characters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clear feedback helps users correct mistakes quickly and continue the process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimize Forms for Mobile Users
&lt;/h2&gt;

&lt;p&gt;A large portion of form submissions now happens on mobile devices. Small screens make complex forms even more difficult to complete.&lt;/p&gt;

&lt;p&gt;Mobile friendly forms should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use large input fields&lt;/li&gt;
&lt;li&gt;Minimize typing&lt;/li&gt;
&lt;li&gt;Use appropriate keyboards for each field&lt;/li&gt;
&lt;li&gt;Avoid long dropdown lists&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, numeric fields should trigger numeric keyboards, and email fields should trigger email optimized keyboards.&lt;/p&gt;

&lt;p&gt;Small improvements like these make a significant difference on mobile devices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build Trust Through Minimalism
&lt;/h2&gt;

&lt;p&gt;Users are more likely to complete forms when they trust the website asking for their information.&lt;/p&gt;

&lt;p&gt;Overly complex forms can feel suspicious or intrusive. Simple forms communicate clarity and transparency.&lt;/p&gt;

&lt;p&gt;To reinforce trust:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explain why information is needed&lt;/li&gt;
&lt;li&gt;Avoid unnecessary personal questions&lt;/li&gt;
&lt;li&gt;Display privacy assurances when appropriate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When users feel comfortable sharing information, completion rates improve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test and Improve Your Forms
&lt;/h2&gt;

&lt;p&gt;Even well designed forms can benefit from testing.&lt;/p&gt;

&lt;p&gt;A/B testing different versions of a form can reveal which design performs better. Sometimes removing a single field can dramatically improve conversions.&lt;/p&gt;

&lt;p&gt;Useful metrics to monitor include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Form completion rate&lt;/li&gt;
&lt;li&gt;Abandonment rate&lt;/li&gt;
&lt;li&gt;Time to complete&lt;/li&gt;
&lt;li&gt;Error frequency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Continuous optimization helps ensure that forms remain efficient and user friendly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Forms play a critical role in digital experiences. They are the gateway to leads, customers, and meaningful interactions.&lt;/p&gt;

&lt;p&gt;Yet they are often treated as an afterthought.&lt;/p&gt;

&lt;p&gt;By focusing on simplicity, reducing unnecessary fields, and prioritizing clarity, businesses can dramatically improve form performance.&lt;/p&gt;

&lt;p&gt;The guiding principle remains simple.&lt;/p&gt;

&lt;p&gt;Keep forms simple.&lt;/p&gt;

</description>
      <category>marketing</category>
    </item>
    <item>
      <title>Why Value-Based Pricing Works Better Than Anxiety-Based Pricing</title>
      <dc:creator>Zack Webster</dc:creator>
      <pubDate>Sun, 15 Mar 2026 02:13:21 +0000</pubDate>
      <link>https://dev.to/zaxwebs/why-value-based-pricing-works-better-than-anxiety-based-pricing-25cp</link>
      <guid>https://dev.to/zaxwebs/why-value-based-pricing-works-better-than-anxiety-based-pricing-25cp</guid>
      <description>&lt;p&gt;Pricing is rarely just a financial decision. It is also psychological. Many businesses believe they set prices based on strategy, but in practice they often price based on fear. Fear of losing customers, fear of competitors charging less, or fear that buyers will say no. This pattern leads to what can be called &lt;strong&gt;anxiety-based pricing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Value-based pricing, on the other hand, approaches pricing from the customer’s perspective and the outcomes they receive. When businesses shift from fear-driven pricing to value-driven pricing, they typically see stronger margins, clearer positioning, and healthier customer relationships.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Anxiety-Based Pricing
&lt;/h2&gt;

&lt;p&gt;Anxiety-based pricing happens when companies set prices primarily to avoid discomfort or perceived risk. Instead of asking what their product is worth, they ask what price is least likely to scare customers away.&lt;/p&gt;

&lt;p&gt;Common signals of anxiety-based pricing include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Constantly lowering prices to match competitors&lt;/li&gt;
&lt;li&gt;Offering unnecessary discounts before customers even ask&lt;/li&gt;
&lt;li&gt;Underpricing new products out of fear of rejection&lt;/li&gt;
&lt;li&gt;Avoiding price increases despite rising costs or improved offerings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While these choices may feel safe in the short term, they often create long-term problems. Margins shrink, perceived quality declines, and the business begins attracting customers who care mostly about price rather than results.&lt;/p&gt;

&lt;p&gt;In many cases, companies become trapped in a race to the bottom where differentiation disappears.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Value-Based Pricing Means
&lt;/h2&gt;

&lt;p&gt;Value-based pricing starts with a different question: &lt;strong&gt;What outcome does the customer gain, and what is that outcome worth?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of focusing on internal costs or competitors, businesses focus on the value delivered. This could include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Time saved&lt;/li&gt;
&lt;li&gt;Revenue generated&lt;/li&gt;
&lt;li&gt;Risk reduced&lt;/li&gt;
&lt;li&gt;Convenience improved&lt;/li&gt;
&lt;li&gt;Expertise provided&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, if a software tool saves a company 10 hours of work per week, the value is not the cost of building the software. The value is the time and productivity it returns to the customer.&lt;/p&gt;

&lt;p&gt;When pricing reflects real outcomes, customers often accept higher prices because the value is clear and meaningful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Value-Based Pricing Works Better
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. It Aligns Price With Customer Outcomes
&lt;/h3&gt;

&lt;p&gt;Customers rarely buy products simply because they are cheap. They buy because something improves in their life or business.&lt;/p&gt;

&lt;p&gt;When pricing reflects the benefits customers receive, the price begins to feel justified. Instead of asking “Why is this so expensive?”, customers start asking “How much is this improvement worth to me?”&lt;/p&gt;

&lt;p&gt;This shift changes the entire buying conversation.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. It Protects Margins
&lt;/h3&gt;

&lt;p&gt;Anxiety-based pricing typically pushes prices downward. Over time this erodes profitability and makes it harder to invest in better products, customer support, or innovation.&lt;/p&gt;

&lt;p&gt;Value-based pricing protects margins because it anchors price to results, not to the lowest competitor.&lt;/p&gt;

&lt;p&gt;Companies that price on value often reinvest their stronger margins into improving the product, which further increases perceived value.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. It Strengthens Brand Positioning
&lt;/h3&gt;

&lt;p&gt;Low prices communicate a message, whether intentional or not. In many markets, low pricing signals lower quality or limited differentiation.&lt;/p&gt;

&lt;p&gt;Value-based pricing positions a product as a solution rather than a commodity. The focus moves from “cheap” to “effective.”&lt;/p&gt;

&lt;p&gt;This clarity helps attract customers who prioritize results instead of just looking for the lowest price.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. It Attracts Better Customers
&lt;/h3&gt;

&lt;p&gt;When businesses underprice, they often attract the most price-sensitive customers. These customers tend to demand more support, negotiate aggressively, and switch providers quickly if a cheaper option appears.&lt;/p&gt;

&lt;p&gt;Value-based pricing filters for customers who care about outcomes. These buyers are more likely to appreciate the product, stay longer, and contribute to healthier long-term relationships.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. It Encourages Better Products
&lt;/h3&gt;

&lt;p&gt;Pricing based on value forces businesses to deeply understand their customers.&lt;/p&gt;

&lt;p&gt;Questions naturally arise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What problem are we solving?&lt;/li&gt;
&lt;li&gt;How much does this solution matter?&lt;/li&gt;
&lt;li&gt;How can we increase the impact of what we deliver?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This mindset pushes companies to improve the real value they create instead of simply competing on price.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Cost of Pricing From Fear
&lt;/h2&gt;

&lt;p&gt;Anxiety-based pricing feels safe because it avoids short-term discomfort. But over time it creates several hidden costs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lower profitability&lt;/li&gt;
&lt;li&gt;Weak brand perception&lt;/li&gt;
&lt;li&gt;Limited investment in improvement&lt;/li&gt;
&lt;li&gt;A customer base focused only on price&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ironically, the attempt to avoid losing customers can eventually make the business less sustainable.&lt;/p&gt;

&lt;p&gt;Value-based pricing requires more confidence and research, but it often leads to stronger long-term growth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moving Toward Value-Based Pricing
&lt;/h2&gt;

&lt;p&gt;Businesses do not need to transform their pricing overnight. The transition can begin with a few practical steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify the most meaningful outcomes customers receive.&lt;/li&gt;
&lt;li&gt;Quantify the economic or emotional value of those outcomes.&lt;/li&gt;
&lt;li&gt;Communicate that value clearly in marketing and sales.&lt;/li&gt;
&lt;li&gt;Gradually align pricing with the results delivered.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Over time, the conversation shifts from price comparison to value recognition.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Pricing reflects how a company sees its own value. When businesses price from anxiety, they unintentionally tell the market that their offering is interchangeable and negotiable.&lt;/p&gt;

&lt;p&gt;Value-based pricing tells a different story. It says the product solves a meaningful problem and delivers measurable outcomes.&lt;/p&gt;

&lt;p&gt;Companies that embrace this mindset often discover that customers are not simply looking for the lowest price. They are looking for the greatest value.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>marketing</category>
    </item>
    <item>
      <title>JWT explained as Formulas</title>
      <dc:creator>Zack Webster</dc:creator>
      <pubDate>Mon, 27 Dec 2021 18:28:05 +0000</pubDate>
      <link>https://dev.to/zaxwebs/jwt-explained-as-formulas-1514</link>
      <guid>https://dev.to/zaxwebs/jwt-explained-as-formulas-1514</guid>
      <description>&lt;p&gt;Okay, so this is a rather different way of learning about JWTs. But I think, if done right it can teach more effectively than a long blog post filled with thousands of words. So, let's begin.&lt;/p&gt;

&lt;h1&gt;
  
  
  What are JWTs?
&lt;/h1&gt;

&lt;p&gt;JWT or JSON Web Token is structured token format of encoding JSON data in a way that can be cryptographically verified.&lt;/p&gt;

&lt;h1&gt;
  
  
  JWT Structure
&lt;/h1&gt;

&lt;p&gt;Example JWT:&lt;br&gt;
&lt;code&gt;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Notice the dots? If you "split" at dots you get 3 strings that make up the JWT.&lt;br&gt;
So, &lt;code&gt;JWT = headerString.payloadString.signatureString&lt;/code&gt;&lt;br&gt;
(or signature, doesn't matter in this case)&lt;/p&gt;

&lt;h2&gt;
  
  
  What are these strings?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;headerString = base64(header)&lt;/code&gt;&lt;br&gt;
&lt;code&gt;payloadString = base64(payload)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;They are just base64 encodings for header &amp;amp; payload (header is a JSON object with metadata (type of JWT) &amp;amp; payload is another object with user-defined data with some standard keys).&lt;/p&gt;

&lt;p&gt;Note: Here base64() implies base64URL(), assume them as functions that encode the object to base64 form, the later encodes it in URL-friendly manner. Similar assumptions ahead.&lt;/p&gt;

&lt;p&gt;To keep things less repetitive ahead, let:&lt;br&gt;
&lt;code&gt;headerPayloadString = headerString.payloadString&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;We can form JWTs in different ways, for educational purpose lets look at a simple one (but not used IRL as much).&lt;/p&gt;

&lt;p&gt;The signatureString/signature is discussed in following approach sections (sha256Signature, rsa256Signature).&lt;/p&gt;

&lt;h1&gt;
  
  
  The SHA256-HMAC Approach
&lt;/h1&gt;

&lt;p&gt;SHA is a hashing algorithm. As mentioned this approach not used IRL as much given it's drawbacks discussed later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the JWT (signing)
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;sha256Signature = sha256(headerPayloadString , 'sharedSecret')&lt;/code&gt;&lt;br&gt;
&lt;code&gt;sha256JWT = headerPayloadString.sha256Signature&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Verifying the JWT
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Split &lt;code&gt;headerPayloadString&lt;/code&gt; &amp;amp; &lt;code&gt;signatureString&lt;/code&gt; (input signature)&lt;/li&gt;
&lt;li&gt;Calculate signature as &lt;code&gt;sha256(headerPayloadString , 'sharedSecret')&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;If both the input signature and calculated signature match, the JWT is valid.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Why do we not use this?
&lt;/h3&gt;

&lt;p&gt;Notice how we need to use the same &lt;code&gt;sharedSecret&lt;/code&gt; or "key" for creating/signing &amp;amp; verifying? That means if we use an authentication server we have to share the same key between the server and the consumer/application. This leads to security concerns.&lt;/p&gt;

&lt;h1&gt;
  
  
  The RSA-SHA approach
&lt;/h1&gt;

&lt;p&gt;RSA is public key encryption algorithm, consisting of 2 keys a private and public key (pair).&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the JWT (signing)
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;sha256XSignature = sha256(headerPayloadString)&lt;/code&gt;&lt;br&gt;
We don't use a key here (non-HMAC way)&lt;br&gt;
&lt;code&gt;rsa256Signature = rsa256Encrypt(sha256XSignature, 'privateKey')&lt;/code&gt;&lt;br&gt;
&lt;code&gt;rsaJWT = headerPayloadString.rsa256Signature&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Verifying the JWT
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Take the headerPayloadString, and hash everything with SHA-256&lt;/li&gt;
&lt;li&gt;Decrypt (rsa256Decrypt) the JWT using the public key, and obtain the rsa256Signature&lt;/li&gt;
&lt;li&gt;Compare the received JWT signature with the calculated one, if they match, the JWT is valid.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  That Sums it Up
&lt;/h1&gt;

&lt;p&gt;Voila! You now know the basic mechanics of JWTs. I recommended researching a bit more to supplement this post with. Hope, this helped clear some doubts. &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>jamstack</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Most Important Elements of any Landing Page</title>
      <dc:creator>Zack Webster</dc:creator>
      <pubDate>Tue, 21 Dec 2021 15:15:55 +0000</pubDate>
      <link>https://dev.to/zaxwebs/the-most-important-elements-of-any-landing-page-3720</link>
      <guid>https://dev.to/zaxwebs/the-most-important-elements-of-any-landing-page-3720</guid>
      <description>&lt;p&gt;A good landing page can boost your campaign sales or signups by up to 10 times. But what are landing pages and how do they differ from general web pages? A landing page is a special type of web page where the focus is on one action such as a signup or sale of a specific product, they are often paired with search and social media advertisements. While general web pages are more about encouraging exploration and offering diverse information.&lt;/p&gt;

&lt;p&gt;So, what makes a good landing page? Let's have a look at the top elements you need to have.&lt;/p&gt;

&lt;h2&gt;
  
  
  Headline
&lt;/h2&gt;

&lt;p&gt;Your headline is the first thing a user is likely to read when going through your landing page. As such you need to make sure you have a compelling one. How does one craft a good headline? You are in luck, there are already some pre-established formulas that are known to work well. Have a look at the list of 5 proven conversion-boosting headline formulas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Testimonial&lt;/li&gt;
&lt;li&gt;Cliffhanger&lt;/li&gt;
&lt;li&gt;Value Proposition&lt;/li&gt;
&lt;li&gt;Listicle&lt;/li&gt;
&lt;li&gt;How-To&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The type of headline that works well for you depends on what you are trying to sell. Personal products, for example, can be more receptive to a testimonial headline. Each type of headline has its perks, try out different variations with A/B testing and optimize for conversion.&lt;/p&gt;

&lt;p&gt;Make sure to keep your headlines short and simple, easy to comprehend and remember. If need be, businesses can also use a sub-heading to elaborate a bit more about what is being offered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clear-cut Visual or Video
&lt;/h2&gt;

&lt;p&gt;"A picture is worth a thousand words", a video even more. The visuals are what will help grab attention and offer more context quickly. This is a major part of your landing page and has to work in sync with your heading. The heading and your primary visual need to go hand in hand to land an impactful first impression.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp7v9resxwlbowa5syayw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp7v9resxwlbowa5syayw.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you decide to use a video, make sure it's professional - it must have a good resolution &amp;amp; audio. If you don't have the budget to invest in a good video you might be better off with an image. You can be creative and blend with the type of heading. For example, a photo of a person benefiting from your product goes well with a testimonial heading.&lt;/p&gt;

&lt;h2&gt;
  
  
  Good Content
&lt;/h2&gt;

&lt;p&gt;Provide rich, useful content, so long as it is relevant. Good, confident content inspires trust. Don’t bore the visitor by talking too much about yourself. Tell them what you or your product does for them. Help them picture what makes you or your product something they need to get.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features &amp;amp; Benefits
&lt;/h2&gt;

&lt;p&gt;Adding to good content, a features &amp;amp; benefits list can be quite powerful. Tell your customers the things they get and their benefits in a sentence each. This also helps direct visualization of all the problems the visitor will overcome should they buy your product or service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Social Proof
&lt;/h2&gt;

&lt;p&gt;According to a report from Nielsen, 70% of people will trust a review from someone they’ve never even met. Social proof is your best friend when it comes to building credibility. Reviews, testimonials, badges, certificates, customer images, case studies, and company logos are all quite effective tools.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flxvbhm4rzp1nk41cq41k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flxvbhm4rzp1nk41cq41k.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
To make sure your social proof is effective, you must keep in mind that all not social proof is equal. It's ideal if the social proof comes from the type of audience that you are marketing to and the source is credible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Single Call to Action
&lt;/h2&gt;

&lt;p&gt;A confused customer is less likely to take any action. If you present too many choices you might be losing quite a few sales. One of our jobs as a designer is to reduce the cognitive load. The more you "direct", the easier things are and the more likely a user will be to do it. The best bet is to use a single call to action, the one goal of your landing page. You can further optimize your CTA buttons by offering a context-based label.&lt;/p&gt;

&lt;p&gt;You can further optimize your CTAs by optimizing your forms. Ask for the bare minimum information you need. The more fields you ask visitors to fill out in your form, the less chance you have of them completing your offer. People dread long tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Page Speed
&lt;/h2&gt;

&lt;p&gt;While not truly an "element", page speed is one of the most important aspects of a landing page. Nothing on the page matters if your customers leave cause your page took too long to load. We recommend utilizing static assets where possible as those generally can be easily cached and served faster. Use lazy-loading and compressed images.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffa585lw9tw6qez8fvlqs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffa585lw9tw6qez8fvlqs.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Tools like PageSpeed Insights can help you get an idea of what can be changed for faster load times on your existing pages. You should aim around the 90s.&lt;/p&gt;

&lt;h2&gt;
  
  
  Policies
&lt;/h2&gt;

&lt;p&gt;Adding links to your policies can help clear additional doubts a user might have. It also helps establish the terms between both parties.&lt;/p&gt;

&lt;p&gt;Here are some policy pages you can link to on your landing page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Terms &amp;amp; Conditions&lt;/li&gt;
&lt;li&gt;Privacy Policy&lt;/li&gt;
&lt;li&gt;Refund Policy&lt;/li&gt;
&lt;li&gt;Warranty Policy&lt;/li&gt;
&lt;li&gt;Disclosures&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;We hope the above has been insightful &amp;amp; will help you create landing pages that convert. If you’d like us to help you build one feel free to reach out.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Ultimate Website Checklist for 2022</title>
      <dc:creator>Zack Webster</dc:creator>
      <pubDate>Sat, 18 Dec 2021 16:17:13 +0000</pubDate>
      <link>https://dev.to/zaxwebs/the-ultimate-website-checklist-for-2022-373o</link>
      <guid>https://dev.to/zaxwebs/the-ultimate-website-checklist-for-2022-373o</guid>
      <description>&lt;p&gt;The web industry is ever-changing. There’s always new stuff just around the corner. If you are getting a new website in 2022 or upgrading an existing one, this checklist will come in handy. We’ll cover some of the fundamentals yet often overlooked aspects as well as some new trends that you can use to add some personality to your website. So without further ado, let’s jump right into it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimize your Logo for Web
&lt;/h2&gt;

&lt;p&gt;Logos are a big part of any business. If you are getting a new one, make sure it is versatile. That is, it will work on large and small screens, over different backgrounds. Sometimes to achieve that you might want to go with different (derived) versions of the logo. If you have an existing logo, you might want to get a variation or two or if feasible get a new one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2m26rrjis9stx73rgk2u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2m26rrjis9stx73rgk2u.jpg" alt="YT Logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Adopt Consistent Branding
&lt;/h2&gt;

&lt;p&gt;Your website should stay and look similar throughout. If things look out of place they can bring down the outlook of something good. But it’s not just about the looks, it’s also about how it feels.&lt;br&gt;
Here are a few tips to help you with branding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use appropriate color schemes and fonts.&lt;/li&gt;
&lt;li&gt;Don’t use too many fonts – 2-3 is a good number.&lt;/li&gt;
&lt;li&gt;Stay consistent with your tone.&lt;/li&gt;
&lt;li&gt;Utilize similar images.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use Professional &amp;amp; Optimized Images
&lt;/h2&gt;

&lt;p&gt;Photos taken off of a phone by just anyone will be nowhere near what a professional photographer will get you. Hiring a good photographer for portraits, some on-field work depending on if it’s useful will go a long way. It’s one of the often skipped aspects that is an investment that pays back for itself quickly and then a lot more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fajbjmts7odo4275zzk4t.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fajbjmts7odo4275zzk4t.jpg" alt="photographer"&gt;&lt;/a&gt;&lt;br&gt;
You can also utilize stock images depending on your use case. Another part of the puzzle is to optimize these images for the web. What does that mean? To put it simply, their size needs to be reduced to ensure fast loading.&lt;/p&gt;

&lt;h2&gt;
  
  
  Show Valuable Information
&lt;/h2&gt;

&lt;p&gt;People go through a number of websites. The world has never been busier which means you have to deliver essential information quickly. Tell your visitors who you are, what you do, what you offer, and how they can connect. Attention span is something you have to keep in mind when thinking about your paragraphs. You definitely don’t want a block of text that takes ages to get to the next section which might be what the customer was looking for. Too much can be harmful to your sales. But so is too little information. Finding the balance &amp;amp; assigning priorities is a good way to proceed here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Offer Insightful Content
&lt;/h2&gt;

&lt;p&gt;Content is king. If you want your visitors to keep coming back to your website your content strategy is what helps you achieve that better. It’s also a good way to share your expertise and keep your customers with all that’s happening around your business. Think of what your audience will be excited about and curate some content around. Curate something unique, always respect copyrights. If you are having a hard time writing, you might want to hire a writer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Responsive across Different Devices
&lt;/h2&gt;

&lt;p&gt;At this point, this should be a no-brainer. But there are still so many websites out there that aren’t responsive. Mobiles phones now account for more than 50% of the traffic. Make sure your websites work just as well on phones and tablets as it does on larger desktops.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk03gs700dt5nf1oyxhrt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk03gs700dt5nf1oyxhrt.jpg" alt="responsive"&gt;&lt;/a&gt;&lt;br&gt;
In 2022, you should be taking this a step further, think about how you can deliver a quicker experience for those on the go as one insight to keep in mind is visitors on phones spend a lot less time (per visit) on your website than on desktops.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ensure Fast Loading Times
&lt;/h2&gt;

&lt;p&gt;Earlier, we talked about optimizing images and how that is to optimize load times. Let’s talk about why your website should load fast and how it affects your business. As you might expect people don’t really like waiting. The ideal loading time would be 2-5 seconds, in fact, anything above 2 increases ‘bounce’ rates (no. of visitors that exit your website right away).&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0e9802ykmwa8mi5zfk6a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0e9802ykmwa8mi5zfk6a.png" alt="pagespeed"&gt;&lt;/a&gt;&lt;br&gt;
You can check your website performance via Google’s PageSpeed Insights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Good User Experience (UX)
&lt;/h2&gt;

&lt;p&gt;User experience is a highlight and a deserving one in 2022. A larger focus on it is an indicator that even small businesses now understand its importance. If you are wondering what UX is, let us simplify it for you: UX is an approach to designing by focusing on the way your website will be used instead of the way it looks. This ensures your visitors have a pleasant experience on your website and aren’t frustrated with having to click too much, close tons of popups, go through a lot of pages to get to something, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Be Found
&lt;/h2&gt;

&lt;p&gt;Search Engine Optimization (SEO), Social Media &amp;amp; advertising will all help you build more traffic. Depending on your type of business &amp;amp; exposure some priming might be needed in the form of advertising to get traffic to your website and get the ball rolling. Research on how people search you and things around your industry and adopt that into your content and marketing strategy. Make use of tools like Google Analytics to visualize how your visitors access and browse your website. List your website on your business cards, emails, and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Delightful Motion
&lt;/h2&gt;

&lt;p&gt;Animations, videos, GIFs, and micro-interactions are all getting more adopted as they help make your website just that much more lively. Check out tools such as &lt;a href="https://lottiefiles.com/" rel="noopener noreferrer"&gt;LottieFiles&lt;/a&gt; with tons of free-to-use animated graphics to spice up your website.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;We are glad that in 2022, it’s not just about having a website. UX is now much more prominent as the world is going truly digital and there’s that much more thought and strategy as the industry matures further. Is your business looking for a professional website? We hope the above has been insightful. If you’d like us to help you build one feel free to reach out.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>html</category>
      <category>wordpress</category>
    </item>
    <item>
      <title>Radio Tabs Component with Alpine.js &amp; Tailwind</title>
      <dc:creator>Zack Webster</dc:creator>
      <pubDate>Mon, 05 Jul 2021 09:28:10 +0000</pubDate>
      <link>https://dev.to/zaxwebs/radio-tabs-component-with-alpine-js-tailwind-17ib</link>
      <guid>https://dev.to/zaxwebs/radio-tabs-component-with-alpine-js-tailwind-17ib</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Radio buttons are pretty common on the web. It's a tiny bit harder to style them and have your custom radios. But if you do, that adds to making your UI just that much more attractive.&lt;br&gt;
In this article, I'll talk about how I built "radio tabs" with Alpine.js. So what are radio tabs? Consider them as radio buttons that look and feel like tabs.&lt;/p&gt;
&lt;h1&gt;
  
  
  Source Code &amp;amp; Preview
&lt;/h1&gt;

&lt;p&gt;You can have a look at the source on my GitHub Repo:&lt;br&gt;
&lt;a href="https://github.com/zaxwebs/tailwind-alpine/blob/main/radio-tabs.html" rel="noopener noreferrer"&gt;https://github.com/zaxwebs/tailwind-alpine/blob/main/radio-tabs.html&lt;/a&gt;&lt;br&gt;
To try it out live:&lt;br&gt;
&lt;a href="https://tailpine.netlify.app/radio-tabs.html" rel="noopener noreferrer"&gt;https://tailpine.netlify.app/radio-tabs.html&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  An Explanation
&lt;/h1&gt;

&lt;p&gt;I recommend going through the code on the repo as you read ahead.&lt;/p&gt;
&lt;h2&gt;
  
  
  Design
&lt;/h2&gt;

&lt;p&gt;Each radio button resides inside it's label. To hide the "radio button" I use &lt;code&gt;class="hidden"&lt;/code&gt; and is then referenced with a &lt;code&gt;for&lt;/code&gt; on the label that points to &lt;code&gt;id&lt;/code&gt; on the button.&lt;br&gt;
The whole group (outer div) of buttons has &lt;code&gt;.inline-flex&lt;/code&gt; among other classes, this is to stack the radios side by side.&lt;br&gt;
There's also a padding on this div except on the right. Why? The radios have a &lt;code&gt;padding-right&lt;/code&gt; that's the same.&lt;/p&gt;
&lt;h2&gt;
  
  
  Functioning
&lt;/h2&gt;

&lt;p&gt;The radio buttons are built off of an array using Alpine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;radioTabs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;radios&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;radios&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is then used as x-data for the outer div.&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;div&lt;/span&gt; &lt;span class="na"&gt;x-data=&lt;/span&gt;&lt;span class="s"&gt;"radioTabs('direction', directions)"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;x-for then loops over a template to generate the labels consisting of radio buttons.&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;input&lt;/span&gt;
&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt;
&lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"hidden"&lt;/span&gt;
&lt;span class="na"&gt;:id=&lt;/span&gt;&lt;span class="s"&gt;"radio.id"&lt;/span&gt;
&lt;span class="na"&gt;:value=&lt;/span&gt;&lt;span class="s"&gt;"radio.value"&lt;/span&gt;
&lt;span class="na"&gt;:name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;
&lt;span class="na"&gt;x-model=&lt;/span&gt;&lt;span class="s"&gt;"selectedDirection"&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In case you were wondering, this is what the directions array looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;directions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;radio-tab-direction-e&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;East&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;East&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="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;radio-tab-direction-w&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;West&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;West&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="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;radio-tab-direction-n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;North&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;North&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="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;radio-tab-direction-s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;South&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;South&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's sort of the general idea of it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Use Cases
&lt;/h1&gt;

&lt;p&gt;I recently used this for a comparison table, you can use radio tabs for similar such instances to add to the overall appeal.&lt;br&gt;
Here's how it looks:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa4x2v4jo8v3lm42d5x40.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa4x2v4jo8v3lm42d5x40.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbwrhwwcslfqzitfffj4c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbwrhwwcslfqzitfffj4c.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  That's it!
&lt;/h1&gt;

&lt;p&gt;Thank you for taking the time to read and check out this experiment/project. There's more Alpine and Tailwind related things up on my &lt;a href="https://github.com/zaxwebs/tailwind-alpine" rel="noopener noreferrer"&gt;Github repo&lt;/a&gt; &amp;amp; live on &lt;a href="https://github.com/zaxwebs/tailwind-alpine" rel="noopener noreferrer"&gt;Netlify&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>tailwindcss</category>
      <category>uiweekly</category>
      <category>webdev</category>
      <category>html</category>
    </item>
    <item>
      <title>Thoughts on Designing</title>
      <dc:creator>Zack Webster</dc:creator>
      <pubDate>Thu, 15 Apr 2021 09:19:52 +0000</pubDate>
      <link>https://dev.to/zaxwebs/thoughts-on-designing-1cek</link>
      <guid>https://dev.to/zaxwebs/thoughts-on-designing-1cek</guid>
      <description>&lt;p&gt;Learning to design can teach you so much more about so many other subjects. You get to learn about psychology (one of my favourite subjects), organization, culture, you name it.&lt;/p&gt;

&lt;p&gt;There's so much science to it and yet it's also so subjective. It is a never-ending quest given this nature.&lt;/p&gt;

&lt;p&gt;It can be fun and yet frustrating because well, it's not always easy. Like with everything, you have to learn the tools of trade and tricks to bring your vision into reality. But if you keep at it, you will eventually be able to spin some tasty visual treats that you can get paid for as well (Cough.. cough... NFTs seem good).&lt;/p&gt;

&lt;p&gt;"Practice makes perf... you better" or so people say. Perfection is an illusion when something is subjective. So go out there, create whatever. The good, the ugly... just create.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>design</category>
      <category>learning</category>
      <category>motivation</category>
    </item>
    <item>
      <title>How to Google with a Shortcut</title>
      <dc:creator>Zack Webster</dc:creator>
      <pubDate>Tue, 06 Apr 2021 19:24:56 +0000</pubDate>
      <link>https://dev.to/zaxwebs/how-to-google-with-a-shortcut-41lb</link>
      <guid>https://dev.to/zaxwebs/how-to-google-with-a-shortcut-41lb</guid>
      <description>&lt;p&gt;Being a software developer, I have to google quite a few things. And when it comes to doing that, here's what the usual flow looks like for most of us: Ctrl + C, Ctrl + V in the address bar of your browser, and that's if you use shortcuts and a browser that lets you search via the address bar. If you don't have your browser already open then that's one more step to the task. Not to mention the switching if you are on some other application.&lt;br&gt;
What if there was a way to just select a part of any text in any application and have it looked up for you in your default browser with a shortcut combo? That would save so many clicks and make searching more accessible. Apparently, such a future is not built into Windows natively. Let's hope they add it in the near future but for now, I do have something for you.&lt;/p&gt;

&lt;h1&gt;
  
  
  Here's what you need to do…
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Download and install &lt;a href="https://www.autohotkey.com/"&gt;AutoHotKey&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Clone or download my script from &lt;a href="https://github.com/zaxwebs/google-it"&gt;GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Extract google-it.ahk file from downloaded ZIP to your desktop.&lt;/li&gt;
&lt;li&gt;Double-click on this file and you are all set!
You can now press Ctrl + LWin (Left Windows Key) after selecting any text to open it in Google search.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  More about the script…
&lt;/h1&gt;

&lt;p&gt;Like any other AutoHotKey script, you can customize mine to your own liking: changing the shortcut keys, browser, search engine, website, etc. With a little bit of tinkering, you can set the script to run on startup.&lt;br&gt;
This was a fun little experiment out of curiosity that turned out to be very productive and something I now use often. Cheers!&lt;/p&gt;

</description>
      <category>tip</category>
      <category>trick</category>
    </item>
    <item>
      <title>Toast Notifications with Alpine.js &amp; Tailwind.css</title>
      <dc:creator>Zack Webster</dc:creator>
      <pubDate>Wed, 31 Mar 2021 07:01:15 +0000</pubDate>
      <link>https://dev.to/zaxwebs/toast-notifications-with-alpine-js-tailwind-css-lpc</link>
      <guid>https://dev.to/zaxwebs/toast-notifications-with-alpine-js-tailwind-css-lpc</guid>
      <description>&lt;p&gt;Toast notifications are notifications that silently pop up and fade away. They can be used to indicate events and their status such as if a document was saved successfully.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F812jlvunlem39hmlxaic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F812jlvunlem39hmlxaic.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recently, I implemented a basic "toaster" using Alpine.js and Tailwind.css.&lt;br&gt;
You can try it out live here: &lt;a href="https://tailpine.netlify.app/toast.html" rel="noopener noreferrer"&gt;Toaster Demo&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Features
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;"Hook" to create toasts from anywhere - uses Spruce for global state access.&lt;/li&gt;
&lt;li&gt;Auto-close after a set interval.&lt;/li&gt;
&lt;li&gt;Close on click.&lt;/li&gt;
&lt;li&gt;Stack toasts if more than one.&lt;/li&gt;
&lt;li&gt;Easy to expand.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  Implementation
&lt;/h1&gt;

&lt;p&gt;The following code is what powers the toast system:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Spruce&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;toasts&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="na"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="nf"&gt;createToast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;info&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;totalVisible&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;toast&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;toast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;visible&lt;/span&gt;
        &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;visible&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;destroyToast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;totalVisible&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nf"&gt;destroyToast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;visible&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Well, this and the HTML that consumes it.&lt;br&gt;
You can have a look at the full source code here: &lt;a href="https://github.com/zaxwebs/tailwind-alpine/blob/main/toast.html" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What's Next?
&lt;/h1&gt;

&lt;p&gt;One can add a whole ton of functionality quite easily. Here are a few examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Close-all button.&lt;/li&gt;
&lt;li&gt;History&lt;/li&gt;
&lt;li&gt;Headings and more.&lt;/li&gt;
&lt;li&gt;Scrolling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's all for this article. Thanks so much for reading.&lt;br&gt;
I publish one article every week, if you'd like to see more of my content consider subscribing.&lt;br&gt;
Have a great day.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Built a Slack clone with Tailwind &amp; Alpine.js</title>
      <dc:creator>Zack Webster</dc:creator>
      <pubDate>Mon, 15 Mar 2021 09:23:19 +0000</pubDate>
      <link>https://dev.to/zaxwebs/built-a-slack-clone-with-tailwind-alpine-js-43mk</link>
      <guid>https://dev.to/zaxwebs/built-a-slack-clone-with-tailwind-alpine-js-43mk</guid>
      <description>&lt;p&gt;After the sidebar last week, I thought let's build something bigger. And so Slackish came into existence - a quick prototype build of Slack. Links to demo and source are included in this article.&lt;/p&gt;

&lt;h1&gt;
  
  
  Intro
&lt;/h1&gt;

&lt;p&gt;So, here's a quick preview of what it looks like.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa4gj1dnwip6y3ufy9kwc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa4gj1dnwip6y3ufy9kwc.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Features
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Switch between conversations&lt;/li&gt;
&lt;li&gt;Channels and direct messages&lt;/li&gt;
&lt;li&gt;Indicate active conversation in sidebar.&lt;/li&gt;
&lt;li&gt;Display user online status indicator on title bar &amp;amp; sidebar for DMs.&lt;/li&gt;
&lt;li&gt;Auto scroll chat on new message.&lt;/li&gt;
&lt;li&gt;Custom scroll bars similar to Slack.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Demo &amp;amp; Code
&lt;/h1&gt;

&lt;p&gt;Take this project for a spin here: &lt;a href="https://tailpine.netlify.app/slack/" rel="noopener noreferrer"&gt;https://tailpine.netlify.app/slack/&lt;/a&gt;&lt;br&gt;
And here's the source code: &lt;a href="https://github.com/zaxwebs/tailwind-alpine/tree/main/slack" rel="noopener noreferrer"&gt;https://github.com/zaxwebs/tailwind-alpine/tree/main/slack&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Develop Further
&lt;/h1&gt;

&lt;p&gt;Feel free to fork and add to it.&lt;br&gt;
Here's a few ideas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Responsiveness&lt;/li&gt;
&lt;li&gt;Dropdown for channels &amp;amp; DMs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Tailwind and Alpine is a sweet combo to get up and running quick for setting up prototypes and more! The ecosystem is growing and there's so much more to come.&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>css</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Built a Dashboard Sidebar with Tailwind &amp; Alpine.js</title>
      <dc:creator>Zack Webster</dc:creator>
      <pubDate>Mon, 08 Mar 2021 19:45:42 +0000</pubDate>
      <link>https://dev.to/zaxwebs/built-a-dashboard-sidebar-with-tailwind-alpine-js-10pp</link>
      <guid>https://dev.to/zaxwebs/built-a-dashboard-sidebar-with-tailwind-alpine-js-10pp</guid>
      <description>&lt;p&gt;I came across Alpine.js while on my journey of learning Laravel. And it has been a blessing.&lt;br&gt;
In order to learn more about it, I've been building random things. This week, I tried building a dashboard sidebar. The design and functionality are inspired by that of &lt;a href="https://coreui.io/" rel="noopener noreferrer"&gt;CoreUI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here's how it looks like and works:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdzfuu4uczwb22tqad0ue.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdzfuu4uczwb22tqad0ue.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
I wanted the sidebar to be open by default on Desktops. And the rest of the page accessible to the right.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flwsrf23zxmsrzd6rfa1c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flwsrf23zxmsrzd6rfa1c.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
When closed, I wanted the content to take over the full width of the window.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fevawt631ehpjaqdkn6le.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fevawt631ehpjaqdkn6le.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
For mobile, I wanted to do the opposite. It has to be closed by default.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24xv9t8si2rmp33vq85p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24xv9t8si2rmp33vq85p.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
And when toggled open. I wanted it to be fixed. And the content outside it to be partly visible (opacity) but inaccessible. Additionally, clicking outside the sidebar should close it.&lt;/p&gt;

&lt;p&gt;Interested in seeing this in action? You can do so here: &lt;a href="https://tailpine.netlify.app/sidebar-2.html" rel="noopener noreferrer"&gt;https://tailpine.netlify.app/sidebar-2.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you'd like to see how this was built you can do so here: &lt;a href="https://github.com/zaxwebs/tailwind-alpine/blob/main/sidebar-2.html" rel="noopener noreferrer"&gt;https://github.com/zaxwebs/tailwind-alpine/blob/main/sidebar-2.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading. Signing out.&lt;/p&gt;

</description>
      <category>tailwindcss</category>
      <category>javascript</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
