<?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>Forem: Nebojsa Radakovic</title>
    <description>The latest articles on Forem by Nebojsa Radakovic (@cookieduster_n).</description>
    <link>https://forem.com/cookieduster_n</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%2F136485%2F2034e0a1-016c-424f-8709-c04d472e3b6b.jpg</url>
      <title>Forem: Nebojsa Radakovic</title>
      <link>https://forem.com/cookieduster_n</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/cookieduster_n"/>
    <language>en</language>
    <item>
      <title>React Norway 2026: The Schedule Is Live</title>
      <dc:creator>Nebojsa Radakovic</dc:creator>
      <pubDate>Thu, 26 Feb 2026 13:13:08 +0000</pubDate>
      <link>https://forem.com/cookieduster_n/react-norway-2026-the-talks-are-live-in4</link>
      <guid>https://forem.com/cookieduster_n/react-norway-2026-the-talks-are-live-in4</guid>
      <description>&lt;p&gt;Security, observability, compilers, AI agents, pair-programming, and fewer lines of code. We designed this year like a well-produced album. No filler tracks - every talk moves the story forward.&lt;/p&gt;

&lt;p&gt;Picture this.&lt;/p&gt;

&lt;p&gt;You walk into &lt;strong&gt;Rockefeller in Oslo&lt;/strong&gt; on &lt;strong&gt;Jun 5th&lt;/strong&gt;. Guitars on the walls. Coffee in hand. Developers everywhere. It smells like caffeine, code, and ambition.&lt;/p&gt;

&lt;p&gt;That’s how we envisioned &lt;strong&gt;&lt;a href="https://reactnorway.com/" rel="noopener noreferrer"&gt;React Norway 2026 — Rock &amp;amp; React&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And today, we’re finally opening the curtain, delivering the vision with the full talk and program schedule.&lt;/p&gt;

&lt;h2&gt;
  
  
  Schedule
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ☕ We start early 08:00
&lt;/h3&gt;

&lt;p&gt;Sign in, coffee, reconnect with your internet friends in real life, and get ready for the welcome talk. Other than &lt;em&gt;it's gonna be quick, sharp, no corporate fluff,&lt;/em&gt; we won't disclose much. But... then we hit play.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔐 09:30 – React with Caution – How to Hack Your React App (And Fix It Too) by Ramona
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Ramona Schwering, Developer Advocate at Auth0&lt;/strong&gt;, kicks us off by doing what most conferences don’t: she hacks a React app live.&lt;/p&gt;

&lt;p&gt;You’ll see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real XSS and injection scenarios&lt;/li&gt;
&lt;li&gt;Where React protects you&lt;/li&gt;
&lt;li&gt;Where you are the last line of defense&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;React is inherently secure, with almost no recent CVEs in its core, but developers must stay vigilant because they remain the final line of defense against vulnerabilities. This session demonstrates real-world attacks like XSS and injection to show where React protects you and where your own security practices matter most.&lt;/p&gt;

&lt;h3&gt;
  
  
  🤖 10:00 – Rockin' With TanStack Start and AI! by Jack Herrington
&lt;/h3&gt;

&lt;p&gt;TanStack Start meets AI? That's what &lt;strong&gt;Jack Herrington, core TanStack maintainer and full-stack powerhouse&lt;/strong&gt;, is going to talk about.&lt;/p&gt;

&lt;p&gt;This talk introduces the new TanStack Start, a client-first full-stack framework, combined with TanStack AI to seamlessly integrate advanced AI capabilities into your applications. Beyond chat, it enables multimedia features like image and video generation, bringing powerful AI experiences directly into modern web apps.&lt;/p&gt;

&lt;p&gt;If you care about frameworks evolving beyond CRUD, this is your moment.&lt;/p&gt;

&lt;h3&gt;
  
  
  ☕ 10:30 – Coffee + Networking
&lt;/h3&gt;

&lt;p&gt;Let the talks sink in...and network with peers, speakers, and industry leaders. Maybe even check sponsor booths.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 11:00 – Pair Programming at Ludicrous Speed with Costa Alexoglou
&lt;/h3&gt;

&lt;p&gt;This is a brutally honest breakdown of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ultra-low latency challenges&lt;/li&gt;
&lt;li&gt;State sync across windows&lt;/li&gt;
&lt;li&gt;Desktop caching realities&lt;/li&gt;
&lt;li&gt;Video latency hacks&lt;/li&gt;
&lt;li&gt;And… WebKit frustrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Costa Alexoglou's&lt;/strong&gt; talk (he is a Software Engineer at Grafana Labs) shares hard-earned lessons from building and maintaining a super-low-latency open-source pair-programming app. It covers desktop caching, cross-window state synchronization, video latency hacks, and the unexpected challenges that come with browser quirks like WebKit.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧪 11:30 – UX Research at Developer Speed with Dora Makszy
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Dora Makszy is the Head of Design @ Element Logic&lt;/strong&gt;. Don't let that sway you off from the talk. This talk shows how automated, self-service UX testing can keep pace with modern product development without sacrificing quality. By building a fully automated framework in Figma Make to capture real user behavior and analyze results at scale, it demonstrates how teams can integrate fast, data-driven research into rapid prototyping cycles and strengthen collaboration across engineering, product, and design.&lt;/p&gt;

&lt;p&gt;If you believe React devs should influence product decisions, not just implement tickets — don’t miss this.&lt;br&gt;
&lt;em&gt;&lt;strong&gt;P.S.&lt;/strong&gt; No researchers were harmed in the making of this test suite&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.amazonaws.com%2Fuploads%2Farticles%2Fyjt0l8lkvv2a6mm4xsex.jpg" 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.amazonaws.com%2Fuploads%2Farticles%2Fyjt0l8lkvv2a6mm4xsex.jpg" alt="Rock &amp;amp; React festival 2026. Rockefeller, Oslo, Norway" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🧹 12:00 – Dead Code Shouldn’t Exist: How We Removed 28k Lines of Code by Dominik Dorfmeister
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Dominik Dorfmeister&lt;/strong&gt; is a Frontend engineer at Sentry and TanStack Query maintainer, and he brings a simple talk that goes something like this:&lt;/p&gt;

&lt;p&gt;They ran Knip. They found ghosts. They deleted 28,000 lines.&lt;/p&gt;

&lt;p&gt;You’ll walk away knowing practical steps, workflow integration tips, and lessons learned so you can safely declutter your own project and reduce technical debt.&lt;/p&gt;

&lt;h3&gt;
  
  
  🍔 12:30 – Lunch (not your average conference food)
&lt;/h3&gt;

&lt;p&gt;Refuel. Debate. Argue. Enjoy the best food you've ever had at a conference.&lt;/p&gt;

&lt;h3&gt;
  
  
  📊 13:30 – Observability Isn’t a Backend Thing with Neha Sharma
&lt;/h3&gt;

&lt;p&gt;You just came back from lunch and might be looking for a nap. The thing is, this goes beyond console.log.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Neha Sharma's (Amazon Solution Architect and Founder of JSLovers)&lt;/strong&gt; talk explores frontend observability beyond basic logging, covering traces, metrics, logs, and correlation IDs within an enterprise strategy. You’ll learn how to design for observability, integrate it into CI/CD, and build a culture that makes React systems measurable, scalable, and resilient.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎨 14:00 – Designing the In-Between States with Async React by Aurora Scharff
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Aurora Scharff, a Software Engineer from Norway&lt;/strong&gt; (we say it with pride, explores how the “in-between” states—loading, errors, and pending UI—shape the perceived quality and performance of React applications. The session takes a practical approach using Async React and Next.js 16, sharing reusable patterns and architectural decisions that help teams design smoother, more intentional user experiences.&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.amazonaws.com%2Fuploads%2Farticles%2Fs3dbhwmyuq7nf0q7skqz.jpg" 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.amazonaws.com%2Fuploads%2Farticles%2Fs3dbhwmyuq7nf0q7skqz.jpg" alt="Rock &amp;amp; React festival 2026. Rockefeller, Oslo, Norway" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 14:30 – AI Agents, Running in the Browser with Nico Martin
&lt;/h3&gt;

&lt;p&gt;Machine Learning Engineer at Hugging Face, Nico Martin, will demonstrate how to build multimodal AI agents that process voice, images, and short-term memory entirely in the browser, without servers or cloud APIs. Using WebGPU and WebAssembly, it showcases real-time, privacy-preserving AI powered purely by modern web technologies.&lt;/p&gt;

&lt;p&gt;This isn’t theory. It’s the future of client-side AI.&lt;/p&gt;

&lt;h3&gt;
  
  
  ☕ 15:00 – Coffee Break
&lt;/h3&gt;

&lt;p&gt;You’ll need a second brain after Nico.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧬 15:30 – Robert Balicki brings you A Compiler for Your UI
&lt;/h3&gt;

&lt;p&gt;Staff Engineer at Pinterest. Former Meta Relay contributor. Former rock band member.&lt;/p&gt;

&lt;p&gt;Robert Balicki will introduce Isograph, a compiler-driven framework that eliminates boilerplate and ensures your UI fetches exactly the data it needs—no more, no less. By scanning your codebase and generating optimized queries automatically, it enables stable, performant apps through simple annotations instead of manual data orchestration.&lt;/p&gt;

&lt;p&gt;Compiler-driven UI architecture is coming. This is your preview.&lt;/p&gt;

&lt;h3&gt;
  
  
  🕵️ 16:00 – Sébastien Morel (Secret Talk)
&lt;/h3&gt;

&lt;p&gt;You know Sébastien Morel, CTO at Crystallize, from the React Norway stage — just not that role this time. After serving as MC for two years in a row, he’s switching sides of the mic and joining the speaker lineup to share lessons from building real-world systems with the community he’s helped shape.&lt;/p&gt;

&lt;p&gt;Let’s just say… if you care about performance, architecture, and developer experience — you’ll want to be in the room.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎸 18:00 – Rock n Roll
&lt;/h3&gt;

&lt;p&gt;And then when you think it is over, get ready to crank up the volume with &lt;strong&gt;DATAROCK, Iversen,&lt;/strong&gt; and &lt;strong&gt;God Bedring&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Talk/Lineup Matters
&lt;/h2&gt;

&lt;p&gt;Look at the flow:&lt;br&gt;
&lt;em&gt;Security → AI frameworks → Real-time collaboration → UX automation → Code minimalism → Observability → Async UX → Browser AI → Compiler-driven UI → Secret architecture insights.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is modern React engineering. Not just hooks. Not just state management debates.&lt;/p&gt;

&lt;p&gt;It’s how React fits into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI-native apps&lt;/li&gt;
&lt;li&gt;Enterprise systems&lt;/li&gt;
&lt;li&gt;Real-time collaboration&lt;/li&gt;
&lt;li&gt;Performance-first architecture&lt;/li&gt;
&lt;li&gt;Developer experience evolution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re building serious products in 2026, this is your room.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who Should Be There?
&lt;/h3&gt;

&lt;p&gt;Senior React engineers&lt;br&gt;
Frontend architects&lt;br&gt;
Tech leads&lt;br&gt;
Full-stack developers&lt;br&gt;
AI-curious builders&lt;br&gt;
People who are tired of shallow conference talks&lt;/p&gt;

&lt;p&gt;If that’s you, don’t “maybe” this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tickets Are Live
&lt;/h2&gt;

&lt;p&gt;Rock &amp;amp; React 2026 is not just another conference. It’s a gathering of people who care about building well.&lt;/p&gt;

&lt;p&gt;Seats are limited at Rockefeller. And once they’re gone, they’re gone.&lt;/p&gt;

&lt;p&gt;Join us in Oslo. &lt;a href="https://reactnorway.com/tickets/rock-and-react-festival" rel="noopener noreferrer"&gt;&lt;strong&gt;Reserve your seat here&lt;/strong&gt;&lt;/a&gt;.&lt;br&gt;
Bring your curiosity.&lt;br&gt;
Leave with sharper instincts.&lt;/p&gt;

&lt;p&gt;See you in the pit. ⚛️🎸&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>techtalks</category>
    </item>
    <item>
      <title>⚡ SEO for Astro: How to Make the Fastest Framework Also the Smartest</title>
      <dc:creator>Nebojsa Radakovic</dc:creator>
      <pubDate>Thu, 16 Oct 2025 13:54:49 +0000</pubDate>
      <link>https://forem.com/cookieduster_n/seo-for-astro-how-to-make-the-fastest-framework-also-the-smartest-501o</link>
      <guid>https://forem.com/cookieduster_n/seo-for-astro-how-to-make-the-fastest-framework-also-the-smartest-501o</guid>
      <description>&lt;p&gt;Because speed is useless if search engines can’t find you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Astro’s “content-first, JavaScript-last” philosophy gives you a massive SEO advantage right out of the box.&lt;/li&gt;
&lt;li&gt;But to turn that raw performance into actual organic visibility, you need to wire structured data, routing, metadata, and caching correctly.&lt;/li&gt;
&lt;li&gt;This playbook shows how to make Astro not just the fastest framework—but the smartest one too.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Why SEO Still Matters (Even for Lightning-Fast Sites)
&lt;/h2&gt;

&lt;p&gt;Speed doesn’t guarantee visibility. Search engines don’t just reward performance; they reward clarity—clean HTML, accurate metadata, and structured relationships between pages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.astro.build/en/concepts/islands/" rel="noopener noreferrer"&gt;Astro’s island architecture&lt;/a&gt; makes pages feel instant, but if your meta tags or sitemaps are off, Google still has to guess what’s inside.&lt;/p&gt;

&lt;p&gt;That’s why technical SEO is just as important in Astro as in any JavaScript framework; only here, you’re working from a stronger base.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Rendering Models: The Astro Advantage
&lt;/h2&gt;

&lt;p&gt;Astro flips the rendering problem on its head: it ships zero JavaScript by default and hydrates components only where needed.&lt;/p&gt;

&lt;p&gt;That means Googlebot receives full, clean HTML—no hydration delay, no broken metadata, no client-side rendering headaches.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;SEO Impact&lt;/th&gt;
&lt;th&gt;Typical Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Static (SSG)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Best crawlability and performance.&lt;/td&gt;
&lt;td&gt;Blogs, docs, landing pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hybrid (SSR)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Still SEO-friendly, as Astro serverside-renders full HTML.&lt;/td&gt;
&lt;td&gt;Dynamic catalogs, search results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Islands (Partial Hydration)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Small interactive areas without hurting indexability.&lt;/td&gt;
&lt;td&gt;Product cards, carts, forms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Rule of thumb: Let Astro handle static HTML by default, and hydrate only what’s truly interactive. Every unused &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; is one less millisecond in your LCP.&lt;/p&gt;

&lt;p&gt;Explore &lt;a href="https://crystallize.com/blog/web-rendering" rel="noopener noreferrer"&gt;web rendering&lt;/a&gt; options and solutions.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Core Web Vitals: Performance Is the Starting Line
&lt;/h2&gt;

&lt;p&gt;Astro sites often crush Lighthouse scores straight out of npm create astro@latest, but it’s worth locking down a few habits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LCP under 2.5s: preload hero images and fonts.&lt;/li&gt;
&lt;li&gt;INP under 200ms: keep client components tiny.&lt;/li&gt;
&lt;li&gt;CLS below 0.1: define image sizes and avoid late-loading elements.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;img src={Astro.resolve('../assets/hero.webp')} width="1200" height="600" alt="Hero image" loading="eager" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use Astro’s built-in image service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
import { Image } from 'astro:assets'
---
&amp;lt;Image src={hero} alt="Hero image" width={1200} height={600} format="webp" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Combine that with compression (vite-plugin-compression), HTTP/2, and caching headers. Your SEO foundation becomes almost bulletproof.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Crawlability &amp;amp; Indexation
&lt;/h2&gt;

&lt;p&gt;Astro makes serving static HTML trivial, but don’t forget the navigation signals crawlers rely on:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;robots.txt&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install astro-robots-txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import robotsTxt from 'astro-robots-txt';

export default {
  integrations: [robotsTxt({
    policy: [{ userAgent: '*', allow: '/' }],
    sitemap: 'https://yourdomain.com/sitemap-index.xml'
  })]
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Sitemaps&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install @astrojs/sitemap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import sitemap from '@astrojs/sitemap';
export default {
  site: 'https://yourdomain.com',
  integrations: [sitemap()],
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both update automatically on build, meaning your content and product URLs stay discoverable—no manual updates required.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Metadata &amp;amp; Structured Data
&lt;/h2&gt;

&lt;p&gt;Every page in Astro can export metadata directly in its frontmatter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { getProduct } from '../lib/api';
const product = await getProduct(Astro.params.slug);

export const prerender = true;
export const seo = {
  title: `${product.name} | My Store`,
  description: product.shortDescription,
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then inject metadata inside &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;head&amp;gt;
  &amp;lt;title&amp;gt;{seo.title}&amp;lt;/title&amp;gt;
  &amp;lt;meta name="description" content={seo.description} /&amp;gt;
  &amp;lt;link rel="canonical" href={`https://yourdomain.com${Astro.url.pathname}`} /&amp;gt;
&amp;lt;/head&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For &lt;a href="https://crystallize.com/blog/ecommerce-seo-guide#structured-data" rel="noopener noreferrer"&gt;structured data&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script type="application/ld+json"&amp;gt;
  {JSON.stringify({
    "@context": "https://schema.org",
    "@type": "Product",
    "name": product.name,
    "image": product.image,
    "offers": {
      "@type": "Offer",
      "price": product.price,
      "priceCurrency": "EUR"
    }
  })}
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rich results often come down to clean, consistent markup like this. If you’re using a &lt;a href="https://crystallize.com/headless-ecommerce" rel="noopener noreferrer"&gt;headless commerce like Crystallize&lt;/a&gt; or CMS like Contentful, you can inject data via Astro’s server-side GraphQL calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. URL Structure and Routing Hygiene
&lt;/h2&gt;

&lt;p&gt;Astro’s routing is file-based and static—great news for SEO.&lt;/p&gt;

&lt;p&gt;✅ Use human-readable slugs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/blog/how-astro-handles-hydration/
/shop/coffee-beans/ethiopian-blend/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Configure canonical URLs globally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// src/components/Canonical.astro
&amp;lt;link rel="canonical" href={`https://yourdomain.com${Astro.url.pathname}`} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Avoid:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Query parameters for canonical pages&lt;/li&gt;
&lt;li&gt;Duplicate &lt;code&gt;/index.html&lt;/code&gt; or &lt;code&gt;/&lt;/code&gt; variations&lt;/li&gt;
&lt;li&gt;Trailing slash inconsistencies (&lt;code&gt;astro.config.mjs&lt;/code&gt; → &lt;code&gt;trailingSlash: 'always'&lt;/code&gt; or &lt;code&gt;'never'&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Predictable paths = better crawl budget.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Image Optimization &amp;amp; Lazy Loading
&lt;/h2&gt;

&lt;p&gt;Images often make or break both UX and rankings. Astro’s image service converts, resizes, and optimizes assets automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Image
  src={product.image}
  widths={[320, 640, 1280]}
  formats={['avif', 'webp']}
  alt={product.name}
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tips:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always set alt attributes (semantic relevance matters).&lt;/li&gt;
&lt;li&gt;Don’t lazy-load above-the-fold media.&lt;/li&gt;
&lt;li&gt;Cache assets at the CDN edge (Netlify, Vercel, or Cloudflare Pages).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  8. Dynamic Content &amp;amp; Revalidation
&lt;/h2&gt;

&lt;p&gt;Static generation is perfect for blogs—but what about stores, catalogs, or fast-changing data?&lt;/p&gt;

&lt;p&gt;Astro supports SSR with caching and revalidation, keeping both performance and freshness in play.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const prerender = false;

export async function get({ params }) {
  const product = await getProduct(params.slug);
  return {
    body: JSON.stringify(product),
    headers: { 'Cache-Control': 'public, max-age=3600' }
  };
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures crawlers always see up-to-date HTML without waiting for rebuilds.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Analytics &amp;amp; Script Strategy
&lt;/h2&gt;

&lt;p&gt;Astro discourages unnecessary JavaScript—and that’s good SEO hygiene. When you do need tracking, load it responsibly. Say you use Plausible as your analytics tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script is:inline async src="https://plausible.io/js/script.js" data-domain="yourdomain.com"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you must, or rather if you are packed with 3rd party scripts, to &lt;a href="https://crystallize.com/blog/fast-loading-google-tag-manager" rel="noopener noreferrer"&gt;keep websites loading fast, use Google Tag Manager&lt;/a&gt;.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Script type="text/partytown"&amp;gt;
  {`(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
  new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
  j=d.createElement(s),dl=l!='dataLayer'?'&amp;amp;l='+l:'';j.async=true;j.src=
  'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
  })(window,document,'script','dataLayer','GTM-XXXX');`}
&amp;lt;/Script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, consider Partytown to offload heavy third-party scripts to web workers and preserve performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Debugging &amp;amp; QA
&lt;/h2&gt;

&lt;p&gt;Finally, before going live, run a few sanity checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Crawl simulation – Use Screaming Frog or Sitebulb with JavaScript rendering off.&lt;/li&gt;
&lt;li&gt;Rich result testing – Validate JSON-LD markup.&lt;/li&gt;
&lt;li&gt;Core Web Vitals – Test on mobile using PageSpeed Insights.&lt;/li&gt;
&lt;li&gt;Sitemap inspection – Confirm that newly added pages appear in your sitemap.&lt;/li&gt;
&lt;li&gt;Cache headers – Check Cache-Control responses to avoid stale content.
Remember: a build that’s “green” locally can still fail SEO audits if you forget canonical consistency or structured data validation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  11. FAQs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do Astro sites rank better automatically?&lt;/strong&gt;&lt;br&gt;
They often do, but only if metadata and routing are handled correctly. Performance alone doesn’t guarantee SEO.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Astro good for eCommerce?&lt;/strong&gt;&lt;br&gt;
Yes. Combine static builds for categories with SSR for product availability, and you get the best of both worlds. Check out a &lt;a href="https://crystallize.com/blog/building-ecommerce-with-astro" rel="noopener noreferrer"&gt;Crystallize + Astro demo store&lt;/a&gt; built for speed and structure as an example.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What about multilingual or region-based sites?&lt;/strong&gt;&lt;br&gt;
Use hreflang tags and folder-based routes. Static output makes localization simple and SEO-safe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want to learn more SEO?&lt;/strong&gt;&lt;br&gt;
Continue with my original and complete &lt;a href="https://crystallize.com/blog/ecommerce-seo-guide" rel="noopener noreferrer"&gt;eCommerce SEO Guide&lt;/a&gt;: How To Drive Organic Traffic In 2025?&lt;/p&gt;

&lt;p&gt;Astro solved the performance problem. The rest—metadata, structured content, and crawl clarity—is up to you.&lt;/p&gt;

&lt;p&gt;When you combine its speed with intelligent information architecture, your site stops just being fast… it becomes findable.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>astro</category>
      <category>seo</category>
    </item>
    <item>
      <title>Tag manager for eCommerce decision checklist (developer + marketer friendly)</title>
      <dc:creator>Nebojsa Radakovic</dc:creator>
      <pubDate>Wed, 08 Oct 2025 08:31:17 +0000</pubDate>
      <link>https://forem.com/cookieduster_n/tag-manager-for-ecommerce-decision-checklist-developer-marketer-friendly-2fc1</link>
      <guid>https://forem.com/cookieduster_n/tag-manager-for-ecommerce-decision-checklist-developer-marketer-friendly-2fc1</guid>
      <description>&lt;p&gt;While working this week on a project to evaluate &lt;a href="https://crystallize.com/blog/google-tag-manager-alternatives" rel="noopener noreferrer"&gt;&lt;strong&gt;alternatives to Google Tag Manager (GTM)&lt;/strong&gt;&lt;/a&gt;, I dug into what both marketers like me and developers truly need when choosing a tag manager for eCommerce.&lt;/p&gt;

&lt;p&gt;What follows is a decision checklist I put together (with a little help from my dev friends), based on real trade-offs I uncovered in my research, to help teams pick what’s best for them — balancing performance, privacy, governance, integration, cost, and vendor reliability.&lt;br&gt;
What follows is a clear decision framework to help you choose the right tag manager before things get complicated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Do we audit tags quarterly and delay non-critical ones? (Y/N)&lt;/li&gt;
&lt;li&gt;Do we have a plan for server-side/edge where it helps? (Y/N)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Privacy &amp;amp; Compliance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Do we need EU data residency/self-hosting? (Matomo/Tealium)&lt;/li&gt;
&lt;li&gt;Do we have consent capture integrated with our TMS workflows? (Y/N)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Governance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Do we need fine-grained RBAC, approvals, audit logs across multiple teams/brands? (Adobe/Tealium/Ensighten)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Integrations &amp;amp; Data
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Do we prefer a CDP-first approach (Segment) to reduce pixels and unify schema? (Y/N) &lt;/li&gt;
&lt;li&gt;Number of downstream tools we must support (now/12 months)?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cost / TCO
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Is a free client TMS enough (GTM), or do we need enterprise support &amp;amp; SLAs (Tealium/Adobe/Ensighten)?&lt;/li&gt;
&lt;li&gt;If we need EU hosting or self-host, do we have infra budget/skills (Matomo)?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Vendor outlook
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Any org-level preference/commitment to Adobe/Google/Twilio ecosystems? (If yes, bias selection accordingly.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My Recommended Path Forward
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Audit current tag setup.&lt;/strong&gt; Measure how many tags you have, what third-party scripts they pull, tag firing order, and whether they affect key performance metrics (LCP, FID, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define non-negotiables up front.&lt;/strong&gt; Privacy &amp;amp; compliance (data location, consent), performance SLAs, governance (who deploys, reviews), cost ceiling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pilot one alternative.&lt;/strong&gt; If you suspect GTM will become limiting, pick one alternative (say, Matomo for privacy, or Tealium / Adobe for enterprise) and run as a pilot for a subset of properties. Compare overhead, performance, and team effort.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan migration &amp;amp; training.&lt;/strong&gt; If moving from GTM, migration will involve reconfiguring tags/triggers, retraining marketers/analysts/devs, and ensuring monitoring and rollback tools are in place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuously monitor.&lt;/strong&gt; Even with alternatives, monitoring tag performance, compliance, data fidelity, and costs over time is essential. Technology, regulation, and tool performance evolve.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  References &amp;amp; Data Sources
&lt;/h2&gt;

&lt;p&gt;Here are the main sources I used / that support claims above. You can check further details there.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"&lt;a href="https://crystallize.com/blog/fast-loading-google-tag-manager#what-is-google-tag-manager" rel="noopener noreferrer"&gt;All about Googlr Tag Manager&lt;/a&gt;" - Tag Managers don’t have to be page-load killers.&lt;/li&gt;
&lt;li&gt;“Tag Management Systems: A Comparative Insight on Google Tag Manager, Tealium, Matomo, and More” — pros &amp;amp; cons, overview of TMS options. &lt;a href="https://www.loungelizard.com/blog/tag-management-systems-a-comparative-insight-on-google-tag-manager-tealium-matomo-and-more/" rel="noopener noreferrer"&gt;Lounge Lizard&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;"&lt;a href="https://crystallize.com/answers/tech-dev/google-tag-manager-test-environment" rel="noopener noreferrer"&gt;GTM Test Environments Done Right&lt;/a&gt;" - Testing is a crucial part of managing and deploying tag.&lt;/li&gt;
&lt;li&gt;“Choosing a Tag Management System: A Comparative Analysis” — useful on what to evaluate, how GTM, Tealium differ especially for privacy, integrations. &lt;a href="https://www.trackingplan.com/blog/choosing-a-tag-management-system-a-comparative-analysis" rel="noopener noreferrer"&gt;Trackingplan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;“70-point comparison of 7 tag managers” including Matomo, GTM etc.; especially strong on privacy and hosting options. &lt;a href="https://piwik.pro/blog/tag-manager-comparison/" rel="noopener noreferrer"&gt;Piwik PRO&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;"&lt;a href="https://crystallize.com/answers/tech-dev/what-are-gtm-security-risks" rel="noopener noreferrer"&gt;What Are Google Tag Manager Security Risks?&lt;/a&gt;" - Google Tag Manager (GTM) is powerful precisely because it can inject and orchestrate third-party JavaScript at scale. That power is the attack surface.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The main thing is to figure out what you absolutely can't live without. Next, try out a few different options to see what clicks. &lt;/p&gt;

&lt;p&gt;There are a bunch of "yes/no" questions for each category to help you nail down your decision. Use the resources shared here and good luck!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>gtm</category>
      <category>marketing</category>
      <category>data</category>
    </item>
    <item>
      <title>Tech SEO with Headless</title>
      <dc:creator>Nebojsa Radakovic</dc:creator>
      <pubDate>Mon, 21 Jul 2025 12:26:56 +0000</pubDate>
      <link>https://forem.com/cookieduster_n/tech-seo-with-headless-12fd</link>
      <guid>https://forem.com/cookieduster_n/tech-seo-with-headless-12fd</guid>
      <description>&lt;p&gt;A headless architecture empowers eCommerce businesses to deliver lightning‑fast, highly interactive storefronts without sacrificing search engine visibility. By decoupling content and presentation layers, you gain full control over crawlable sitemaps, semantic URLs, and metadata management—all critical for ranking in today’s AI‑driven search landscape.&lt;/p&gt;

&lt;p&gt;So, what (and how) can you control via a framework or platform of your choice in a headless setup for SEO? Fortunately, as a headless commerce platform, Crystallize offers a rather unique perspective.&lt;/p&gt;

&lt;p&gt;(Everything else &lt;a href="https://crystallize.com/blog/ecommerce-seo-guide" rel="noopener noreferrer"&gt;ecommerce SEO&lt;/a&gt; can be found in the linked article)&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementing Sitemaps &amp;amp; robots.txt &amp;amp; LLM.txt in Your Headless Frontend
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Next.js&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;robots.txt&lt;/code&gt;: Simply create a robots.txt file in your project’s &lt;code&gt;/public directory&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sitemap.xml&lt;/code&gt;: Either hand‑craft a static sitemap.xml under &lt;code&gt;/public&lt;/code&gt; or generate it at runtime via &lt;code&gt;getServerSideProps&lt;/code&gt;, returning XML with your product and category URL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the astro-sitemap integration to crawl static routes and output &lt;code&gt;sitemap.xml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Leverage &lt;code&gt;astro-robots-txt&lt;/code&gt; to auto‑generate &lt;code&gt;robots.txt&lt;/code&gt; based on your published page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;SvelteKit&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define a &lt;code&gt;+server.js&lt;/code&gt; endpoint that returns XML for your &lt;code&gt;sitemap.xml&lt;/code&gt;, mapping over your route manifest.&lt;/li&gt;
&lt;li&gt;Create a separate &lt;code&gt;+server.js&lt;/code&gt; or static asset for &lt;code&gt;robots.txt&lt;/code&gt;, listing disallowed paths (e.g., &lt;code&gt;/admin/*&lt;/code&gt;, &lt;code&gt;/search/*&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While &lt;code&gt;robots.txt&lt;/code&gt; guides crawlers on URL access, &lt;code&gt;llms.txt&lt;/code&gt;, an experimental best practice, helps LLMs prioritize, fetch, and order content. It should not be considered a guaranteed method for driving traffic or indexing. Implementation-wise, you can upload it to your project’s public directory. &lt;/p&gt;

&lt;p&gt;Alternatively, you can rely on a platform you are using (like Crystallize) to define LLM text per page that would be included in the file at build time. Basically, you’d model out the fields you need from scratch. &lt;/p&gt;

&lt;h2&gt;
  
  
  Custom 4XX Error Pages
&lt;/h2&gt;

&lt;p&gt;Delivering branded, helpful error pages improves UX and ensures crawlers don’t get stuck on dead ends.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js&lt;/strong&gt;: Drop a &lt;code&gt;pages/404.js&lt;/code&gt; file—Next will statically generate it at build time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Astro&lt;/strong&gt;: Add &lt;code&gt;404.astro&lt;/code&gt; (or 404.md) in &lt;code&gt;/src/pages;&lt;/code&gt; Astro will serve it for any missing route.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SvelteKit&lt;/strong&gt;: Use a Svelte component at &lt;code&gt;+error.svelte&lt;/code&gt; to customize both 404 and other 4XX responses.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For complete control, you can also configure your hosting platform’s error‐page behavior (e.g., Netlify’s &lt;code&gt;_redirects&lt;/code&gt; file or a Vercel &lt;code&gt;error&lt;/code&gt; edge function).&lt;/p&gt;

&lt;h2&gt;
  
  
  Managing 301 Redirects
&lt;/h2&gt;

&lt;p&gt;Permanent redirects preserve link equity when URLs change. In headless setups, you can choose framework‑level or hosting‑level redirects.&lt;br&gt;
Next.js: Define a &lt;code&gt;redirects&lt;/code&gt; array in &lt;code&gt;next.config.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module.exports = {
  async redirects() {
    return [
      { source: '/old-path', destination: '/new-path', permanent: true },
    ];
  },
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Astro: In &lt;code&gt;astro.config.mjs&lt;/code&gt;, add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default {
  redirects: [
    { from: '/old-url', to: '/new-url', status: 301 },
  ],
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SvelteKit: Use the redirect helper in your &lt;code&gt;+server.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { redirect } from '@sveltejs/kit';
export function GET() {
  throw redirect(301, '/new-location');
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hosting‑Level (Netlify/Vercel/Cloudflare):&lt;br&gt;
Netlify: &lt;code&gt;_redirects&lt;/code&gt; file in publish folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/old-path  /new-path  301
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vercel: &lt;code&gt;vercel.json&lt;/code&gt; with a redirects array.&lt;br&gt;
Cloudflare Pages: Plain‑text &lt;code&gt;_redirects&lt;/code&gt; in your output directory.&lt;/p&gt;
&lt;h2&gt;
  
  
  Rendering Canonicals in a Decoupled Frontend
&lt;/h2&gt;

&lt;p&gt;To prevent duplicate‑content issues, emit a self‑referencing or preferred canonical URL tag in your headless pages.&lt;br&gt;
Next.js: Use &lt;code&gt;&amp;lt;Head&amp;gt;&lt;/code&gt; (or next-seo) in your page component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Head from 'next/head';
// ...
&amp;lt;Head&amp;gt;
  &amp;lt;link rel="canonical" href={`https://example.com${router.asPath}`} /&amp;gt;
&amp;lt;/Head&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Astro: Build the canonical using &lt;code&gt;Astro.url&lt;/code&gt; in your &lt;/p&gt;:&lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
const canonical = Astro.url.pathname;
&amp;lt;link rel="canonical" href={`https://example.com${canonical}`} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;SvelteKit: In your &lt;code&gt;+layout.svelte&lt;/code&gt; or page component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;svelte:head&amp;gt;
  &amp;lt;link rel="canonical" href="https://example.com{$page.url.pathname}" /&amp;gt;
&amp;lt;/svelte:head&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Embedding these tags at build or render time ensures crawlers always see the correct URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  3rd Party Scripts
&lt;/h2&gt;

&lt;p&gt;Astro components support interactive elements through standard HTML &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tags. For Next.js, &lt;code&gt;next/script&lt;/code&gt; enhances the HTML &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; element to optimize the fetching and execution of additional scripts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structured Data
&lt;/h2&gt;

&lt;p&gt;In a Next.js project, you can manage &lt;a href="https://crystallize.com/answers/tech-dev/structured-data" rel="noopener noreferrer"&gt;structured data&lt;/a&gt; (JSON‑LD) just as you would any other page head content—by injecting a &lt;code&gt;&amp;lt;script type="application/ld+json"&amp;gt;&lt;/code&gt; block via the built‑in &lt;/p&gt; component or a helper library.

&lt;p&gt;Here are a couple of ways you can do it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assemble your schema object.&lt;/strong&gt;  In your page’s data‑fetching function (e.g. &lt;code&gt;getStaticProps&lt;/code&gt; or &lt;code&gt;getServerSideProps&lt;/code&gt;), build the JSON‑LD payload.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// pages/products/[slug].js
export async function getStaticProps({ params }) {
  const product = await fetchProduct(params.slug);
  const schema = {
    "@context": "https://schema.org/",
    "@type": "Product",
    name: product.name,
    image: product.images,
    description: product.description,
    sku: product.sku,
    brand: { "@type": "Brand", name: product.brand },
    offers: {
      "@type": "Offer",
      priceCurrency: "USD",
      price: product.price,
      availability: "https://schema.org/InStock",
    },
  };
  return { props: { product, schema } };
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inject via &lt;code&gt;&amp;lt;Head&amp;gt;&lt;/code&gt;. In your page component, serialize and insert the JSON‑LD inside the &lt;code&gt;&amp;lt;Head&amp;gt;&lt;/code&gt; tag so it’s rendered on the client and server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Head from 'next/head';
export default function ProductPage({ product, schema }) {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;Head&amp;gt;
        &amp;lt;title&amp;gt;{product.name} -- My Shop&amp;lt;/title&amp;gt;
        &amp;lt;script
          type="application/ld+json"
          dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }}
        /&amp;gt;
      &amp;lt;/Head&amp;gt;
      {/* ...rest of your page... */}
    &amp;lt;/&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use a helper library (optional).  For larger sites, &lt;a href="https://github.com/garmeeh/next-seo" rel="noopener noreferrer"&gt;next-seo&lt;/a&gt; simplifies SEO—including structured data—by letting you define your schema in a centralized config.&lt;/p&gt;

&lt;p&gt;After deployment, test each page in Google’s Rich Results Test or Schema Validator to ensure your JSON‑LD is correct and being picked up by crawlers.&lt;/p&gt;

&lt;p&gt;If you have repeated schema across many pages (e.g., site­wide Organization or Breadcrumb data), consider adding a custom &lt;code&gt;_document.js&lt;/code&gt; or a top‑level layout component that injects those elements globally.&lt;/p&gt;

&lt;p&gt;As for Astro, you treat structured data much the same way you would in any static‐site setup, including the above one with Next.js.&lt;/p&gt;

&lt;p&gt;Your CMS or e-commerce platform defines structured data. Crystallize, for example, utilizes &lt;a href="https://crystallize.com/learn/best-practices/information-architecture/content-modeling" rel="noopener noreferrer"&gt;content modeling&lt;/a&gt; to describe all the necessary product information for your product page (including structured data, LLM summary, etc.). Your chosen frontend can then request and display this information via the API, including in Schema.org format.&lt;/p&gt;

&lt;h2&gt;
  
  
  Images Handling
&lt;/h2&gt;

&lt;p&gt;Optimizing images can be achieved through various methods. Many frontend frameworks offer built-in solutions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js: The &lt;code&gt;&amp;lt;Image/&amp;gt; component&lt;/code&gt; handles rendering and optimizes images for different viewports by incorporating lazy loading, responsiveness, resizing, and optimized file size and format by default.&lt;/li&gt;
&lt;li&gt;Svelte: Vite's built-in image handling is often the most effective approach.&lt;/li&gt;
&lt;li&gt;Astro: The &lt;code&gt;&amp;lt;Image /&amp;gt; Astro component&lt;/code&gt; optimizes both local and configured remote images.
Alternatively, consider using a third-party service, such as Cloudflare Image Optimization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, some CMS and e-commerce platforms like Crystallize  provide image optimization as part of their service. For instance, Crystallize automatically compresses and converts uploaded images to AVIF and WebP formats, resizing them into multiple resolutions (e.g., 100px, 300px, up to the original image's maximum width). The &lt;code&gt;@crystallize/react-image&lt;/code&gt; npm package then assists with rendering responsive and fast images.&lt;/p&gt;

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

&lt;p&gt;By surfacing &lt;code&gt;robots.txt&lt;/code&gt;, &lt;code&gt;sitemap.xml&lt;/code&gt;, custom error pages, 301 redirects, and canonical tags directly in your headless frontend or hosting layer, you maintain tight control over SEO without sacrificing the flexibility of modern frameworks.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Continue with the original and complete version of the guide at the Crystallize blog 👉&lt;a href="https://crystallize.com/blog/ecommerce-seo-guide" rel="noopener noreferrer"&gt;eCommerce SEO Guide&lt;/a&gt;: How To Drive Organic Traffic In 2025?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>nextjs</category>
      <category>astro</category>
    </item>
    <item>
      <title>React Norway 2025: Reboot Your Dev Game in Oslo</title>
      <dc:creator>Nebojsa Radakovic</dc:creator>
      <pubDate>Wed, 14 May 2025 09:47:03 +0000</pubDate>
      <link>https://forem.com/cookieduster_n/react-norway-2025-reboot-your-dev-game-in-oslo-2ppo</link>
      <guid>https://forem.com/cookieduster_n/react-norway-2025-reboot-your-dev-game-in-oslo-2ppo</guid>
      <description>&lt;p&gt;&lt;strong&gt;Attention React aficionados!&lt;/strong&gt; React Norway conference is now just a month away, and excitement is building. &lt;strong&gt;React Norway&lt;/strong&gt; isn't just another tech conference; it's a unique opportunity to witness web tech's transformative power firsthand and connect with a passionate and welcoming community.&lt;/p&gt;

&lt;p&gt;It's been a place where abstract concepts become tangible solutions and where individual developers coalesce into a supportive network of peers. So, whether you're a seasoned React or frontend veteran or just beginning your journey, &lt;strong&gt;React Norway&lt;/strong&gt; is an unforgettable event.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🗓️ Mark Your Calendar: June 13, 2025&lt;/strong&gt;&lt;br&gt;
On June 13, 2025, the Scandic Holmenkollen Park Hotel in Oslo transforms into a haven for frontend developers. With only 350 seats available, this is an exclusive opportunity to immerse yourself in a day filled with cutting-edge talks, hands-on workshops, and networking that feels more like a reunion than a conference.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎤 What’s on the Agenda?
&lt;/h2&gt;

&lt;p&gt;Single track. 11 talks total and enough time to network and discuss with speakers and React like-minded folks. Quick intro to the talks.&lt;br&gt;
&lt;strong&gt;Welcoming Talk: How do we React?&lt;/strong&gt;&lt;br&gt;
Our MC, Pedro Miranda, a backend developer at Crystallize, kicks off the day with a lighthearted yet insightful look at React's evolution. Expect a blend of humor, history, and a touch of Norwegian charm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-time React Applications with WebSocket and Event Sourcing&lt;/strong&gt;&lt;br&gt;
Johannes Brodwall, Principal Software Engineer at Sopra Steria, delves into building real-time applications using WebSockets and event sourcing. Learn how to create seamless, live user experiences that go beyond traditional polling methods.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ten Reasons Your Application Isn't Accessible and What You Can Do About It&lt;/strong&gt;&lt;br&gt;
Elise Kristiansen, Frontend Developer at Variant, addresses common accessibility pitfalls and offers practical solutions to make your applications more inclusive. A must-attend for developers aiming to build universally accessible web experiences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tanstack Start: Fresh Air for React&lt;/strong&gt;&lt;br&gt;
Atila Fassina, Senior Fullstack Engineer at Neon, introduces Tanstack Start—a client-side-first framework that leverages the best of the React ecosystem. Discover how this meta-framework can streamline your development process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacy-First Architecture: Local-First and Alternatives to GDPR Popups&lt;/strong&gt;&lt;br&gt;
Explore privacy-conscious development practices with Radoslav Stankov, CTO at Angry Building. Learn how to design applications that prioritize user privacy without the annoyance of intrusive popups.&lt;/p&gt;

&lt;p&gt;Check the full agenda at the &lt;a href="https://reactnorway.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;React Norway website&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎉 The React Norway Experience
&lt;/h2&gt;

&lt;p&gt;Beyond the talks, &lt;strong&gt;React Norway&lt;/strong&gt; is renowned for its vibrant community spirit. Last year, attendees enjoyed legendary meals and an afterparty that kept the energy high.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔮 Looking Back to Look Forward
&lt;/h2&gt;

&lt;p&gt;Reflecting on 2024, the conference was a resounding success. From engaging talks to unforgettable networking moments, it set a high bar. But as always, React Norway is about growth and evolution. &lt;/p&gt;

&lt;p&gt;In 2025, we're scaling up—old-school, pixel art style—while maintaining the intimate, community-driven atmosphere that makes this event unique.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎟️ Secure Your Spot
&lt;/h2&gt;

&lt;p&gt;Tickets are limited, and with the event just around the corner, now's the time to act. Don't miss out on this opportunity to level up your React skills, connect with like-minded developers, and be part of a conference that feels more like a celebration of the React community.&lt;/p&gt;

&lt;p&gt;👉&lt;strong&gt;&lt;a href="https://reactnorway.com/" rel="noopener noreferrer"&gt; Get your ticket now!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;See you in Oslo!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
    </item>
    <item>
      <title>React Conferences – More Than Just Hype in 2025</title>
      <dc:creator>Nebojsa Radakovic</dc:creator>
      <pubDate>Mon, 10 Feb 2025 13:55:18 +0000</pubDate>
      <link>https://forem.com/cookieduster_n/react-conferences-more-than-just-hype-in-2025-1gl5</link>
      <guid>https://forem.com/cookieduster_n/react-conferences-more-than-just-hype-in-2025-1gl5</guid>
      <description>&lt;p&gt;Over the years, React conferences have evolved from niche meetups and technical deep dives to full-blown festivals of innovation, collaboration, and even a bit of showmanship.&lt;/p&gt;

&lt;p&gt;As someone involved in event organization, I can attest that today’s conferences blend serious learning with unexpected, playful moments that remind us why we love community events. Just last year at &lt;a href="https://reactnorway.com/?utm_medium=social&amp;amp;utm_source=DevTo" rel="noopener noreferrer"&gt;&lt;strong&gt;React Norway&lt;/strong&gt;&lt;/a&gt;, we had one of the most entertaining talks ever (proper entertainment). And it already feels like this year will be particularly pivotal as hybrid formats and global participation push the boundaries of accessibility and innovation, ensuring that every React enthusiast—from beginners to veterans—finds immense value and inspiration.&lt;/p&gt;

&lt;h3&gt;
  
  
  The React Landscape in 2025
&lt;/h3&gt;

&lt;p&gt;The React ecosystem in 2025 is already buzzing with innovation, driven by advancements reshaping how we build and think about web applications. Cutting-edge features like server components, concurrent rendering, and the ever-evolving hooks system are not just buzzwords—they’re practical tools that enhance performance and developer experience daily.&lt;/p&gt;

&lt;p&gt;Alongside these improvements, emerging frameworks and tools challenge the status quo, pushing for more streamlined workflows and better integration with serverless and cloud-native environments.&lt;/p&gt;

&lt;p&gt;Meanwhile, the community is more vibrant and collaborative than ever, with a healthy mix of open-source contributions, cross-framework experiments, and plenty of spirited debates on best practices that continue driving React’s evolution.&lt;/p&gt;

&lt;p&gt;And it's growing. Right now, there are more than 50 conferences/events for developers you can check in 2025. Same as every year, the following stand out to me for various reasons, with how close the location is being the most important one. &lt;/p&gt;

&lt;h2&gt;
  
  
  Conference Rundown: The Must-Attend Events
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://react.paris/" rel="noopener noreferrer"&gt;&lt;strong&gt;React Paris&lt;/strong&gt;&lt;/a&gt; – Scheduled for March 20–21, 2025, in the City of Lights, React Paris promises an immersive experience combining technical deep dives with inspiring keynotes. Attendees can expect sessions covering the latest React patterns and innovations and plenty of opportunities to network with European thought leaders.&lt;/p&gt;

&lt;p&gt;Who's talking? 2 days, 18 speakers including Tejas Kumar, Dominika Zając, Kent C. Dodds, Aurora Scharff, David Khourshid, Elian Van Cutsem and many more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ti.to/cityjsconf-london/cityjslondon2025/with/community-free-ticket-react-norway-community" rel="noopener noreferrer"&gt;&lt;strong&gt;CITY JS LONDON 2025&lt;/strong&gt;&lt;/a&gt; from 23-25 April, 2025, is the culmination of boundless energy and success of a thriving community in London. Emerging from the collaborating efforts of four meetup groups in London, JS Monthly, Halfstack London Node User group and London JS Community in 2018. 3-day event, featuring 25+ speakers. Hurry up.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fwdays.com/en/event/javascript-fwdays-2025" rel="noopener noreferrer"&gt;&lt;strong&gt;JavaScript fwdays’25&lt;/strong&gt;&lt;/a&gt; – Taking place in Kyiv on May 24, 2025, this conference brings together a vibrant mix of front-end experts. While primarily a JavaScript festival, its dedicated React tracks and workshops focus on cutting-edge developments and real-world use cases that push the boundaries of web development.&lt;/p&gt;

&lt;p&gt;Featured speakers include Illya Klymov and Yuri Artiukh for now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://futurefrontend.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Future Frontend&lt;/strong&gt;&lt;/a&gt; – May 27–28, 2025 at Dipoli in Espoo, Finland, Future Frontend is a celebration of what’s next in front-end development. With an emphasis on progressive frameworks, interactive demos, and live coding sessions, it’s the perfect venue for developers eager to see future trends in action.&lt;/p&gt;

&lt;p&gt;For 2025, main themes are within the intersection of artificial intelligence (AI), web design, and web development. &lt;/p&gt;

&lt;p&gt;17 speakers and 6 workshops have been announced for now.&lt;/p&gt;

&lt;p&gt;🤘&lt;a href="https://reactnorway.com/?utm_medium=social&amp;amp;utm_source=DevTo" rel="noopener noreferrer"&gt;&lt;strong&gt;React Norway&lt;/strong&gt;&lt;/a&gt; – Set for June 13, 2025 in Oslo, React Norway offers a cozy yet dynamic setting where community-driven talks mix with hands-on workshops. &lt;strong&gt;Bigger venue, same core: React, Reload, Repeat.&lt;/strong&gt; We are known for candid, down-to-earth sessions that tackle both fundamental concepts and the latest React advancements, the best conference food ever (including Brunost), and networking even bigger event envy.&lt;/p&gt;

&lt;p&gt;Who's talking? For now, we have:&lt;br&gt;
&lt;a href="https://reactnorway.com/?utm_medium=social&amp;amp;utm_source=DevTo" rel="noopener noreferrer"&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.amazonaws.com%2Fuploads%2Farticles%2Fajyms6engrrar6otjs87.png" alt="Reract Norway 2025" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The call for speakers is still open. Whether you're a seasoned pro or a rising star speaker, we want to hear from you!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reactsummit.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;React Summit&lt;/strong&gt;&lt;/a&gt; – From June 13 to 17, 2025 in Amsterdam, React Summit is one of the marquee events on the React calendar. With 60 60-speaker lineup across 3 days and a focus on both technical mastery and industry insights, it’s a must for anyone serious about React.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.wearedevelopers.com/world-congress" rel="noopener noreferrer"&gt;&lt;strong&gt;WeAreDevelopers World Congress&lt;/strong&gt;&lt;/a&gt; – Taking place in Berlin from July 9–11, 2025, this global congress isn’t solely focused on React but offers a comprehensive view of the developer ecosystem. Github, Microsoft, Stacjoverflow, Vercel, and others have their teams and speakers there. Expect cutting-edge sessions, inspiring keynotes, and a holistic approach to the future of software development.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.reactuniverseconf.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;REACT UNIVERSE CONF&lt;/strong&gt;&lt;/a&gt; – Hosted in Wrocław, Poland, from September 2–4, 2025, this conference dives deep into the React universe. It blends technical sessions with creative storytelling, giving developers both the hard skills and the big-picture perspective necessary to innovate. 25 speakers, 4 workshops in 3 days. Call for papers open.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shift.infobip.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Shift Conference&lt;/strong&gt;&lt;/a&gt; – Held in Zadar, Croatia from September 14–16, 2025, Shift Conference offers a refreshing twist with a focus on composable architecture and modern web paradigms. Its mix of technical talks, interactive panels, and relaxed networking sessions makes it a standout event in the region.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.reactjsday.it/" rel="noopener noreferrer"&gt;&lt;strong&gt;reactjsday 2025&lt;/strong&gt;&lt;/a&gt; – Set for October 16, 2025 in Verona, Italy, reactjsday is the Italian React Conference that combines tradition with modernity. Expect intimate sessions led by passionate speakers, plenty of collaborative workshops, and a distinctly Mediterranean vibe that makes learning fun. Call for papers open.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.reactindia.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;REACT INDIA 2025&lt;/strong&gt;&lt;/a&gt; – Taking place from October 31 to November 1, 2025 in Goa, India, this conference is a vibrant mix of technical rigor and cultural flair. With a strong focus on community building and real-world applications, REACT INDIA is perfect for developers looking to expand their horizons in a dynamic, emerging market.&lt;/p&gt;

&lt;p&gt;As I said, my favorites. Still... each of these events brings its own unique flavor and focus, ensuring that whether you’re looking to sharpen your technical skills, expand your network, or get inspired, there’s a React conference in 2025 tailored just for you.&lt;/p&gt;

&lt;p&gt;Honestly, I'm still planning which ones to attend besides &lt;strong&gt;React Norway&lt;/strong&gt; OFC. May and September look like there are holes in my work schedule.&lt;/p&gt;

&lt;p&gt;Any favorites of yours in this list? Or what are your favorites that I did not include here?&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>techtalks</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Final Testing, Going Live, and Summary (Nerd Streetwear Online Store) Part IV</title>
      <dc:creator>Nebojsa Radakovic</dc:creator>
      <pubDate>Wed, 18 Sep 2024 08:05:31 +0000</pubDate>
      <link>https://forem.com/cookieduster_n/final-testing-going-live-and-summary-nerd-streetwear-online-store-part-iv-2dam</link>
      <guid>https://forem.com/cookieduster_n/final-testing-going-live-and-summary-nerd-streetwear-online-store-part-iv-2dam</guid>
      <description>&lt;p&gt;From ideation to examples to step-by-step setup, the side hustle nerd t-shirt store built with &lt;strong&gt;Astro&lt;/strong&gt;, &lt;strong&gt;Crystallize&lt;/strong&gt;, and &lt;strong&gt;Stripe&lt;/strong&gt; for payment by &lt;strong&gt;ChatGPT&lt;/strong&gt; and proofread for accuracy.&lt;/p&gt;

&lt;p&gt;This is a four-piece article:&lt;br&gt;
1️⃣ &lt;a href="https://dev.to/cookieduster_n/built-with-astro-crystallize-and-stripe-nerd-streetwear-online-store-part-i-15a"&gt;Bringing Idea to Life and Setting Up the Backend&lt;/a&gt;&lt;br&gt;
2️⃣ &lt;a href="https://dev.to/cookieduster_n/building-the-frontend-with-astro-and-integration-with-stripe-nerd-streetwear-online-store-part-ii-2dd9"&gt;Building the Frontend with Astro and Integration with Stripe&lt;/a&gt;&lt;br&gt;
3️⃣ &lt;a href="https://dev.to/cookieduster_n/advance-features-and-deploying-the-project-nerd-streetwear-online-store-part-iii-3jmk"&gt;Advance Features and Deploying the Project&lt;/a&gt;&lt;br&gt;
4️⃣ &lt;strong&gt;Final Testing, Going Live, and Summary&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Almost done. Final testing and going live plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Final Testing
&lt;/h2&gt;

&lt;p&gt;Before going live, it’s critical to thoroughly test your site to ensure that everything works as expected. Even on such a small project, i.e., just a few products. Here’s a checklist to help you through this process with purpose and tooling explained.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cross-Browser Testing:

&lt;ul&gt;
&lt;li&gt;Purpose: Ensure your site looks and functions correctly across browsers (e.g., Chrome, Firefox, Safari, Edge).&lt;/li&gt;
&lt;li&gt;Tools: Use tools like &lt;a href="https://www.browserstack.com/" rel="noopener noreferrer"&gt;BrowserStack&lt;/a&gt; or LambdaTest to automate cross-browser testing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mobile Responsiveness:

&lt;ul&gt;
&lt;li&gt;Purpose: Verify that your site is fully responsive and provides a good user experience on mobile devices.&lt;/li&gt;
&lt;li&gt;Tools: Use your browser's developer tools to simulate different device viewports or test on actual mobile devices.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Functionality Testing:

&lt;ul&gt;
&lt;li&gt;Checkout Process: Test the entire checkout flow, from adding items to the cart to completing a purchase with Stripe.&lt;/li&gt;
&lt;li&gt;Product Filtering and Wishlist: Ensure product filtering works as expected and the wishlist feature correctly adds/removes products.&lt;/li&gt;
&lt;li&gt;Dynamic Routing: Verify that dynamic product pages load correctly for different products.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Performance Testing:

&lt;ul&gt;
&lt;li&gt;Purpose: Check your site’s performance, focusing on load times, interactivity, and overall user experience. You can find more information on &lt;a href="https://crystallize.com/blog/frontend-performance-measuring-and-kpis" rel="noopener noreferrer"&gt;performance KPIs and measuring&lt;/a&gt; here.&lt;/li&gt;
&lt;li&gt;Tools: Use Lighthouse (integrated into Chrome DevTools) or &lt;a href="https://www.webpagetest.org/" rel="noopener noreferrer"&gt;WebPageTest&lt;/a&gt; to analyze your site’s performance. Monitor metrics like First Contentful Paint (FCP) and Time to Interactive (TTI).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SEO Testing:

&lt;ul&gt;
&lt;li&gt;Purpose: Ensure that your site is optimized for search engines.&lt;/li&gt;
&lt;li&gt;Tools: Use the Lighthouse SEO audit to check for best practices, including meta tags, structured data, and mobile-friendliness. Track your progress with this &lt;a href="https://crystallize.com/blog/ecommerce-seo-checklist" rel="noopener noreferrer"&gt;eCommerce SEO checklist&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Security Testing:

&lt;ul&gt;
&lt;li&gt;Purpose: Verify that your site is secure, particularly with regard to payment processing and user data.&lt;/li&gt;
&lt;li&gt;Tools: Conduct a security audit using tools like &lt;a href="https://www.zaproxy.org/" rel="noopener noreferrer"&gt;OWASP ZAP&lt;/a&gt; to identify vulnerabilities.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Accessibility Testing:

&lt;ul&gt;
&lt;li&gt;Purpose: Ensure your site is accessible to users with disabilities.&lt;/li&gt;
&lt;li&gt;Tools: Use accessibility testing tools like Axe or Lighthouse to identify issues and ensure compliance with WCAG standards.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Final Content Check:

&lt;ul&gt;
&lt;li&gt;Purpose: Review all content on your site for accuracy, consistency, and clarity.&lt;/li&gt;
&lt;li&gt;Steps: Ensure product descriptions, pricing, images, and other content are properly displayed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  8. Going Live
&lt;/h2&gt;

&lt;p&gt;Once your site has passed all the necessary tests, it’s time to go live:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Final Deployment:

&lt;ul&gt;
&lt;li&gt;Ensure that your final build is deployed using your CI/CD pipeline. Verify that all environment variables and configurations are set correctly.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Domain Configuration:

&lt;ul&gt;
&lt;li&gt;If you are using a custom domain, configure DNS settings to point to your hosting platform (e.g., Vercel or Netlify).&lt;/li&gt;
&lt;li&gt;Ensure that SSL is enabled for secure HTTPS access.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Monitoring and Analytics:

&lt;ul&gt;
&lt;li&gt;Set up monitoring tools like Google Analytics or Mixpanel to track user behavior and site performance after launch.&lt;/li&gt;
&lt;li&gt;Configure error-tracking tools like &lt;a href="https://sentry.io/welcome/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt; to catch and report any user issues.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Launch Announcement:

&lt;ul&gt;
&lt;li&gt;Announce the launch of DisBar store through your marketing channels, including social media, newsletters, and any relevant online communities.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Post-Launch Monitoring:

&lt;ul&gt;
&lt;li&gt;After the site goes live, monitor performance, user feedback, and any issues. Be prepared to iterate and improve based on real-world usage.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  9. Next Steps
&lt;/h2&gt;

&lt;p&gt;While the &lt;strong&gt;DisBar&lt;/strong&gt; store is now fully functional, there are always opportunities for further enhancements and additional features. Here are some suggestions for the next steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User Authentication:

&lt;ul&gt;
&lt;li&gt;Implement user authentication using services like &lt;a href="https://auth0.com/" rel="noopener noreferrer"&gt;Auth0&lt;/a&gt; or Firebase to allow customers to create accounts, track orders, and manage wishlists.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Advanced Search Functionality:

&lt;ul&gt;
&lt;li&gt;Integrate an advanced search feature using &lt;a href="https://www.algolia.com/" rel="noopener noreferrer"&gt;Algolia&lt;/a&gt; or Elasticsearch to improve product discoverability and user navigation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Personalization:

&lt;ul&gt;
&lt;li&gt;Implement personalized product recommendations based on user behavior, previous purchases, and browsing history.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Content Management with CMS:

&lt;ul&gt;
&lt;li&gt;The best thing about &lt;strong&gt;Crystallize&lt;/strong&gt; is that you can use it for product management and as a CMS to manage additional content such as blogs, news updates, or promotional banners. Back to content modeling for those types.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Marketing Automation:

&lt;ul&gt;
&lt;li&gt;Set up marketing automation tools to engage customers with personalized emails, abandoned cart notifications, and targeted promotions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Enhanced Analytics and Reporting:

&lt;ul&gt;
&lt;li&gt;Integrate more robust analytics and reporting tools to gain deeper insights into customer behavior, sales trends, and site performance.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Expand Payment Options:

&lt;ul&gt;
&lt;li&gt;To cater to a broader audience, offer additional payment methods, such as &lt;strong&gt;PayPal&lt;/strong&gt;, &lt;strong&gt;Apple Pay&lt;/strong&gt;, or regional payment providers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mobile App Development:

&lt;ul&gt;
&lt;li&gt;Consider developing a mobile app for the &lt;strong&gt;DisBar&lt;/strong&gt; store to provide a more seamless shopping experience on smartphones and tablets.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Summary: Instead of Conclusion
&lt;/h2&gt;

&lt;p&gt;The last time I did one of these, I was still &lt;a href="https://dev.to/cookieduster_n/jamstack-for-dummies-moving-a-side-hustle-to-jamstack-1d31"&gt;using WordPress and moving to the Gatsby + DatoCMS stack&lt;/a&gt; on a side hustle🤪&lt;/p&gt;

&lt;p&gt;It has been four years since then, and a lot has changed. For a marketing guy like me, building &lt;strong&gt;the nerd streetwear Online Store DisBar&lt;/strong&gt; has been a challenging journey.&lt;/p&gt;

&lt;p&gt;But it was not impossible. Thanks to the amazing tools in the space and, quite frankly, &lt;strong&gt;ChatGPT&lt;/strong&gt;. I did all of this for $20$ per month and invested some time in training the assistant😎&lt;/p&gt;

&lt;p&gt;Sure, I need feedback and code checking (whatever you do with AI needs to be vetted); sure, I could/should have done a better job at writing more precise prompts; sure, the name is terrible😁 (I hope to compensate for that with the hype), but you can't say you are not impressed with what is possible today.&lt;/p&gt;

&lt;p&gt;I know I am.&lt;/p&gt;

&lt;p&gt;Here’s a recap of the significant steps throughout this process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Introduction and Project Overview&lt;/strong&gt;:
We started by defining the project’s scope, targeting the niche market of nerd streetwear. The project leveraged 🚀&lt;a href="https://astro.build/" rel="noopener noreferrer"&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;/a&gt; for the front end, 🛒&lt;a href="https://crystallize.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Crystallize&lt;/strong&gt;&lt;/a&gt; for the back end, and 💰&lt;a href="https://stripe.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Stripe&lt;/strong&gt;&lt;/a&gt; for payment processing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setting Up the Backend with Crystallize&lt;/strong&gt;:
We created a tenant in &lt;strong&gt;Crystallize&lt;/strong&gt;, defined roles and permissions, and set up content models tailored to the nerd streetwear products.
We populated the catalog with products and configured the home page, laying the groundwork for a structured and scalable e-commerce platform.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Building the Frontend with Astro&lt;/strong&gt;:
The front end was built using &lt;strong&gt;Astro&lt;/strong&gt;, which allowed for the creation of a fast, optimized, and SEO-friendly static site.
We connected the Astro frontend to the Crystallize backend using GraphQL, enabling dynamic routing and content fetching for product pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Designing the UI/UX&lt;/strong&gt;:
The design phase included creating logos, app icons, and t-shirt mockups using tools like DALL-E, ensuring the brand identity was consistent and visually striking.
We also wireframed the site's main pages, focusing on usability and user experience, before translating those designs into actual code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrating with Stripe&lt;/strong&gt;:
&lt;strong&gt;Stripe&lt;/strong&gt; was integrated to handle secure payment processing, providing customers with a smooth and reliable checkout experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced Features&lt;/strong&gt;:
We implemented product filtering, wishlist functionality, and internationalization (i18n) to enhance the user experience.
SEO and performance optimizations were applied, ensuring the site was fast, accessible, and easily discoverable by search engines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploying the Project on Netlify&lt;/strong&gt;:
The project was deployed on &lt;strong&gt;Netlify&lt;/strong&gt;, leveraging its features for continuous deployment, global CDN, and custom domain management.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What now? Well, now that you’ve seen how to build a fully functional, modern e-commerce site using &lt;strong&gt;Astro&lt;/strong&gt;, &lt;strong&gt;Crystallize&lt;/strong&gt;, and &lt;strong&gt;Stripe&lt;/strong&gt;, it’s time to apply these skills to your projects.&lt;/p&gt;

&lt;p&gt;Whether you’re a marketer, developer, designer, or entrepreneur, the tools and techniques covered can help you create a unique online store that stands out in any niche market.&lt;/p&gt;

&lt;p&gt;¯&lt;em&gt;(ツ)&lt;/em&gt;/¯&lt;/p&gt;

&lt;p&gt;As always, if you enjoyed reading this, please support my efforts by recommending and sharing this post to help others find it!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let me know what you think.&lt;/strong&gt; Please share your feedback and suggestions in the comment section below.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>astro</category>
      <category>frontend</category>
      <category>testing</category>
    </item>
    <item>
      <title>Advance Features and Deploying the Project (Nerd Streetwear Online Store) Part III</title>
      <dc:creator>Nebojsa Radakovic</dc:creator>
      <pubDate>Tue, 17 Sep 2024 13:29:18 +0000</pubDate>
      <link>https://forem.com/cookieduster_n/advance-features-and-deploying-the-project-nerd-streetwear-online-store-part-iii-3jmk</link>
      <guid>https://forem.com/cookieduster_n/advance-features-and-deploying-the-project-nerd-streetwear-online-store-part-iii-3jmk</guid>
      <description>&lt;p&gt;From ideation to examples to step-by-step setup, the side hustle nerd t-shirt store built with &lt;strong&gt;Astro&lt;/strong&gt;, &lt;strong&gt;Crystallize&lt;/strong&gt;, and &lt;strong&gt;Stripe&lt;/strong&gt; for payment by &lt;strong&gt;ChatGPT&lt;/strong&gt; and proofread for accuracy.&lt;/p&gt;

&lt;p&gt;This is a four-piece article:&lt;br&gt;
1️⃣ &lt;a href="https://dev.to/cookieduster_n/built-with-astro-crystallize-and-stripe-nerd-streetwear-online-store-part-i-15a"&gt;Bringing Idea to Life and Setting Up the Backend&lt;/a&gt;&lt;br&gt;
2️⃣ &lt;a href="https://dev.to/cookieduster_n/building-the-frontend-with-astro-and-integration-with-stripe-nerd-streetwear-online-store-part-ii-2dd9"&gt;Building the Frontend with Astro and Integration with Stripe&lt;/a&gt;&lt;br&gt;
3️⃣ &lt;strong&gt;Advance Features and Deploying the Project&lt;/strong&gt;&lt;br&gt;
4️⃣ &lt;a href="https://dev.to/cookieduster_n/final-testing-going-live-and-summary-nerd-streetwear-online-store-part-iv-2dam"&gt;Final Testing, Going Live, and Summary&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The backend and frontend are done. Let’s examine any advanced features I may need and where to deploy the project.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. Advanced Features
&lt;/h2&gt;

&lt;p&gt;To enhance the functionality and user experience of my &lt;strong&gt;DisBar online store&lt;/strong&gt;, consider implementing the following advanced features.&lt;/p&gt;
&lt;h3&gt;
  
  
  Product Filtering
&lt;/h3&gt;

&lt;p&gt;Product filtering allows users to narrow the product catalog based on specific criteria, such as size, color, or price.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Setting Up Filters:

&lt;ul&gt;
&lt;li&gt;Define the filtering options based on your product attributes (e.g., size, color).&lt;/li&gt;
&lt;li&gt;Create a &lt;code&gt;FilterComponent&lt;/code&gt; that allows users to select their preferences.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Implementing Filter Logic:

&lt;ul&gt;
&lt;li&gt;Use Crystallize &lt;a href="https://crystallize.com/learn/developer-guides/api-overview/api-endpoints" rel="noopener noreferrer"&gt;Discovery or Search API&lt;/a&gt; to update the product list dynamically based on the selected filters via GraphQL queries.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Integrating Filters on the Frontend:

&lt;ul&gt;
&lt;li&gt;Display the filter options prominently on the product listing page.&lt;/li&gt;
&lt;li&gt;Ensure that the filtering is intuitive and provides real-time feedback.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Wishlist Functionality
&lt;/h3&gt;

&lt;p&gt;Adding a wishlist feature allows users to save products they are interested in and return to them later.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creating a Wishlist Context:

&lt;ul&gt;
&lt;li&gt;Use React Context or another state management solution to handle the wishlist logic.&lt;/li&gt;
&lt;li&gt;Allow users to add and remove products from the wishlist.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Storing Wishlist Data:

&lt;ul&gt;
&lt;li&gt;Store the wishlist data in local storage or sync it with the user’s account if authentication is implemented.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Displaying the Wishlist:

&lt;ul&gt;
&lt;li&gt;Create a wishlist page that displays all the saved products.&lt;/li&gt;
&lt;li&gt;Provide options to move items from the wishlist to the shopping cart.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Internationalization (i18next)
&lt;/h3&gt;

&lt;p&gt;To reach a global audience, implement multi-language support using a library like i18next.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Setting Up i18next:

&lt;ul&gt;
&lt;li&gt;Install i18next and configure it with your available languages.&lt;/li&gt;
&lt;li&gt;Define translation files for each language, or use the Crystallize &lt;a href="https://crystallize.com/blog/chatgpt-translation-app" rel="noopener noreferrer"&gt;translation app&lt;/a&gt; to do the work for you.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Integrating i18n in Astro:

&lt;ul&gt;
&lt;li&gt;Wrap your components with translation functions to serve content in the selected language.&lt;/li&gt;
&lt;li&gt;Provide a language switcher on the frontend to allow users to select their preferred language.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Handling Dynamic Content:

&lt;ul&gt;
&lt;li&gt;Ensure that product descriptions, reviews, and other dynamic content are translated appropriately. In Crystallize, components are &lt;a href="https://crystallize.com/learn/user-guides/getting-started/configuring-languages" rel="noopener noreferrer"&gt;multilingual&lt;/a&gt;, so you can fetch your content based on the user's chosen language.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  SEO and Performance Optimizations
&lt;/h3&gt;

&lt;p&gt;Optimizing your site for search engines and performance is crucial for visibility and user experience.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm06ffhmnvpy9sly69gno.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm06ffhmnvpy9sly69gno.jpg" alt="SEO and Performance Optimizations" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://crystallize.com/learn/best-practices/seo/seo-checklist" rel="noopener noreferrer"&gt;SEO Best Practices&lt;/a&gt;:

&lt;ul&gt;
&lt;li&gt;Use semantic HTML and appropriate meta tags for all pages.&lt;/li&gt;
&lt;li&gt;Generate a sitemap and robots.txt file for better crawlability.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Structured Data:

&lt;ul&gt;
&lt;li&gt;Implement JSON-LD structured data to enhance search engine understanding of your content.&lt;/li&gt;
&lt;li&gt;Add structured data for products, reviews, and breadcrumbs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Lazy Loading Images:

&lt;ul&gt;
&lt;li&gt;Use the &lt;code&gt;loading="lazy"&lt;/code&gt; attribute on images to defer the loading of off-screen images until the user scrolls to them.&lt;/li&gt;
&lt;li&gt;This improves initial page load times and overall performance.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Minimizing JavaScript:

&lt;ul&gt;
&lt;li&gt;Ensure that your Astro project delivers minimal JavaScript to the client by default.&lt;/li&gt;
&lt;li&gt;Use Astro’s built-in optimizations to split and defer non-essential scripts.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By following these steps, or the steps I mentioned in the &lt;a href="https://crystallize.com/learn/best-practices/seo/seo-checklist" rel="noopener noreferrer"&gt;SEO checklist&lt;/a&gt;, you’ll create a highly functional, visually appealing, and performant e-commerce site that meets the needs of your target audience while showcasing your expertise in modern web development technologies.&lt;/p&gt;
&lt;h2&gt;
  
  
  5. Deploying the Project
&lt;/h2&gt;

&lt;p&gt;Once my &lt;strong&gt;DisBar online store&lt;/strong&gt; is built and tested, the next step is to deploy it so users can access it. This involves choosing a hosting platform for your eCommerce frontend, configuring continuous integration and deployment (CI/CD), and performing final testing before going live.&lt;/p&gt;
&lt;h3&gt;
  
  
  Choosing a Hosting Platform
&lt;/h3&gt;

&lt;p&gt;Several hosting platforms are well-suited for deploying an Astro project. Here are some of the top options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://vercel.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Vercel&lt;/strong&gt;&lt;/a&gt;:

&lt;ul&gt;
&lt;li&gt;Strengths: Vercel is optimized for static site generation and serverless functions, making it an excellent choice for deploying Astro projects. It offers fast build times, automatic SSL certificates, and a global content delivery network (CDN) for fast load times.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration&lt;/strong&gt;: Vercel integrates seamlessly with GitHub, GitLab, and Bitbucket, allowing automatic deployments from your repository.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ease of Use&lt;/strong&gt;: The deployment process is straightforward—simply connect your Git repository, and Vercel will automatically detect and build your Astro project.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;🗄️🌐☁🖥️&lt;a href="https://www.netlify.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Netlify&lt;/strong&gt;&lt;/a&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Strengths&lt;/strong&gt;: Netlify is another powerful platform for deploying static sites and serverless functions. It provides automatic deployments, continuous deployment, and instant rollbacks. Netlify also has built-in forms, identity management, and analytics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration&lt;/strong&gt;: Like Vercel, Netlify integrates with Git platforms for automatic deployments and offers a simple, user-friendly interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Additional Features&lt;/strong&gt;: Netlify’s Build Plugins and integrations can help automate tasks like image optimization, SEO checks, and more.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/amplify/" rel="noopener noreferrer"&gt;&lt;strong&gt;AWS Amplify&lt;/strong&gt;&lt;/a&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Strengths&lt;/strong&gt;: AWS Amplify is a robust platform for deploying full-stack applications. It’s backed by AWS infrastructure and offers scalability and a wide range of services, including hosting, authentication, and real-time data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration&lt;/strong&gt;: Amplify integrates with popular Git services and offers a CI/CD pipeline that supports automatic deployments.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Choosing the Right Platform:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Small to Medium Projects&lt;/strong&gt;: Vercel and Netlify are excellent choices, offering ease of use, powerful features, and automatic deployments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Large or Complex Projects&lt;/strong&gt;: AWS Amplify might be more suitable if you need more control over the infrastructure and plan to integrate additional AWS services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simple Static Sites&lt;/strong&gt;: GitHub Pages can be a good option if your project is straightforward and doesn’t require advanced features.&lt;/p&gt;

&lt;p&gt;There is a fantastic post to dig deeper into the subject here &amp;gt;  &lt;a href="https://crystallize.com/blog/ecommerce-frontend" rel="noopener noreferrer"&gt;Where To Host Your eCommerce Frontend&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F89tkgz4uy6ld5gax1p87.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F89tkgz4uy6ld5gax1p87.png" alt="Connect everything. Build anything. Netlify." width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  6. Deploying DisBar online store project on Netlify
&lt;/h2&gt;

&lt;p&gt;I’ve decided to deploy &lt;strong&gt;DisBar&lt;/strong&gt; online store project on 🗄️🌐☁🖥️ &lt;a href="https://www.netlify.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Netlify&lt;/strong&gt;&lt;/a&gt;. A couple of reasons for that. &lt;strong&gt;I like them from day one&lt;/strong&gt;. They support Astro, and the process is straightforward, thanks to Netlify's powerful tools for hosting, continuous deployment, and serverless functions.&lt;/p&gt;

&lt;p&gt;Below is a detailed guide on deploying your Astro-based project integrated with &lt;strong&gt;Crystallize&lt;/strong&gt; and &lt;strong&gt;Stripe&lt;/strong&gt; on &lt;strong&gt;Netlify&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Set Up Your Project for Deployment
&lt;/h3&gt;

&lt;p&gt;Before deploying to Netlify, ensure that your project is properly set up for production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build Your Project: Ensure your Astro project builds correctly. You can do this by running:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;This command will generate a &lt;code&gt;dist/&lt;/code&gt; folder containing Astro's generated static files, which will be deployed to Netlify.&lt;/li&gt;
&lt;li&gt;Install Necessary Plugins: For optimal deployment on Netlify, you might want to use the &lt;a href="https://docs.astro.build/en/guides/integrations-guide/netlify/" rel="noopener noreferrer"&gt;Netlify adapter for Astro&lt;/a&gt;, which configures your project specifically for deployment on Netlify:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install @astrojs/netlify --save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In your &lt;code&gt;astro.config.mjs file&lt;/code&gt;, configure Astro to use the Netlify adapter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { defineConfig } from 'astro/config';
import netlify from '@astrojs/netlify/functions';

export default defineConfig({
  output: 'server',
  adapter: netlify(),
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Set Up a Netlify Account
&lt;/h3&gt;

&lt;p&gt;If you haven’t already, sign up for a Netlify account:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sign Up: Go to Netlify and sign up using your GitHub, GitLab, or Bitbucket account. This will allow Netlify to link directly to your project repository.&lt;/li&gt;
&lt;li&gt;Create a New Site: Once logged in, click "New site from Git" on your Netlify dashboard.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Connect Your Repository
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Choose Your Git Provider: Select the Git provider where your project repository is hosted (GitHub, GitLab, Bitbucket).&lt;/li&gt;
&lt;li&gt;Authorize Netlify: Authorize Netlify to access your repositories.&lt;/li&gt;
&lt;li&gt;Select Your Repository: Choose the repository that contains your DisBar project. Netlify will display a list of your repositories; simply click on the correct one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4: Configure the Deployment Settings
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Set the Build Command: In the "Build command" field, enter:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells Netlify to run the build process for your Astro project.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set the Publish Directory: In the "Publish directory" field, specify:
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;/div&gt;



&lt;p&gt;This is the directory where Astro outputs the final build files.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Environment Variables: If your project relies on environment variables (e.g., for Crystallize API keys or Stripe keys), add them under "Environment" settings.
For example:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CRYSTALLIZE_TENANT_IDENTIFIER=your-tenant-identifier
STRIPE_SECRET_KEY=your-stripe-secret-key
ASTRO_ENV=production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensure that sensitive information is stored as environment variables rather than hard-coded in your project.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy Preview Settings (Optional): You can configure settings for deploy previews, which allow you to preview changes before they go live. This is especially useful for collaborative projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 5: Deploy the Site
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Deploy Your Site: After configuring your settings, click "Deploy site."
Netlify will start the deployment process, which includes pulling the code from your repository, installing dependencies, building the project, and deploying the static files.&lt;/li&gt;
&lt;li&gt;Monitor the Deployment: You can monitor the deployment process in real-time through the Netlify dashboard.
If there are any issues, Netlify will provide error messages to help you troubleshoot.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 6: Configure DNS and Domain Settings
&lt;/h3&gt;

&lt;p&gt;If you want to use a custom domain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a Custom Domain: In the Netlify dashboard, go to your site's "Domain settings."
Click "Add a custom domain" and enter your domain name.&lt;/li&gt;
&lt;li&gt;Update DNS Settings: You’ll need to update the DNS settings for your domain registrar to point to Netlify’s servers. Netlify provides the necessary DNS records.
If you’ve purchased the domain through a provider like Namecheap or GoDaddy, follow their instructions to update the DNS settings.&lt;/li&gt;
&lt;li&gt;Enable HTTPS: Netlify provides free SSL certificates via Let’s Encrypt. For secure access, ensure that HTTPS is enabled in your domain settings.
Step 7: Set Up Continuous Deployment&lt;/li&gt;
&lt;li&gt;Automatic Deployments: With Netlify connected to your Git repository, every time you push a commit to your main branch (or any branch you’ve specified), Netlify will automatically rebuild and deploy your site.
This continuous deployment setup ensures that your live site is always up-to-date with the latest changes.&lt;/li&gt;
&lt;li&gt;Branch Previews: Netlify allows you to deploy previews for pull requests and branches. This helps test changes before merging them into the main branch.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 8: Post-Deployment Checks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Test Your Live Site: After deployment, thoroughly test your live site to ensure everything functions correctly. This includes testing payment processing with Stripe, browsing product pages, using filters, and checking device responsiveness.&lt;/li&gt;
&lt;li&gt;Set Up Analytics and Monitoring: Integrate Google Analytics or another analytics tool to track user behavior on your site.
Enable Netlify’s built-in analytics for server-side metrics like page views, traffic sources, and performance data.&lt;/li&gt;
&lt;li&gt;Configure Redirects and Headers (Optional): You can create a &lt;code&gt;_redirects&lt;/code&gt; file to handle URL redirects or a &lt;code&gt;_headers&lt;/code&gt; file to manage HTTP headers (e.g., for security purposes).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 9: Monitor and Optimize
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Monitor Performance: Use Netlify’s performance monitoring tools or external tools like Lighthouse to ensure your site loads quickly and efficiently.
Regularly check for any new errors or issues that arise post-launch.&lt;/li&gt;
&lt;li&gt;Ongoing Improvements: Optimize and improve your site’s performance, design, and functionality based on analytics and user feedback.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By following these steps, you can successfully deploy any online store on Netlify, ensuring a smooth, reliable, and secure online shopping experience for your customers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AND&lt;/strong&gt; we’re at the end of part three of this guide about building a side hustle using &lt;strong&gt;Astro&lt;/strong&gt;, &lt;strong&gt;Crystallize&lt;/strong&gt;, and &lt;strong&gt;Stripe&lt;/strong&gt; for payment. Next, final testing and wrap-up.&lt;/p&gt;

&lt;p&gt;Next 👉 &lt;a href="https://dev.to/cookieduster_n/final-testing-going-live-and-summary-nerd-streetwear-online-store-part-iv-2dam"&gt;Final Testing, Going Live, and Summary&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¯_(ツ)_/¯&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you enjoyed reading this, please support my efforts by &lt;strong&gt;recommending and sharing&lt;/strong&gt; this page to help others find it! Let me know what you think.&lt;/p&gt;

&lt;p&gt;Please share your feedback and suggestions in the &lt;strong&gt;comment&lt;/strong&gt; section below.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>astro</category>
      <category>frontend</category>
      <category>commerce</category>
    </item>
    <item>
      <title>Building the Frontend with Astro and Integration with Stripe (Nerd Streetwear Online Store) Part II</title>
      <dc:creator>Nebojsa Radakovic</dc:creator>
      <pubDate>Mon, 16 Sep 2024 16:30:00 +0000</pubDate>
      <link>https://forem.com/cookieduster_n/building-the-frontend-with-astro-and-integration-with-stripe-nerd-streetwear-online-store-part-ii-2dd9</link>
      <guid>https://forem.com/cookieduster_n/building-the-frontend-with-astro-and-integration-with-stripe-nerd-streetwear-online-store-part-ii-2dd9</guid>
      <description>&lt;p&gt;From ideation to examples to step-by-step setup, the side hustle nerd t-shirt store built with &lt;strong&gt;Astro&lt;/strong&gt;, &lt;strong&gt;Crystallize&lt;/strong&gt;, and &lt;strong&gt;Stripe&lt;/strong&gt; for payment by &lt;strong&gt;ChatGPT&lt;/strong&gt; and proofread for accuracy.&lt;/p&gt;

&lt;p&gt;This is a four-piece article:&lt;br&gt;
1️⃣ &lt;a href="https://dev.to/cookieduster_n/built-with-astro-crystallize-and-stripe-nerd-streetwear-online-store-part-i-15a"&gt;Bringing Idea to Life and Setting Up the Backend&lt;/a&gt;&lt;br&gt;
2️⃣ &lt;strong&gt;Building the Frontend with Astro and Integration with Stripe&lt;/strong&gt;&lt;br&gt;
3️⃣ &lt;a href="https://dev.to/cookieduster_n/advance-features-and-deploying-the-project-nerd-streetwear-online-store-part-iii-3jmk"&gt;Advance Features and Deploying the Project&lt;/a&gt;&lt;br&gt;
4️⃣ &lt;a href="https://dev.to/cookieduster_n/final-testing-going-live-and-summary-nerd-streetwear-online-store-part-iv-2dam"&gt;Final Testing, Going Live, and Summary&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The backend is set, and the products are made. Let’s take care of the frontend and the payment.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Building the Frontend with Astro
&lt;/h2&gt;

&lt;p&gt;🚀&lt;a href="https://astro.build/" rel="noopener noreferrer"&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;/a&gt; is a modern framework that allows developers to create fast, optimized websites by leveraging the best parts of various frontend frameworks. Astro’s unique approach to building sites focuses on delivering minimal JavaScript to the client, translating to faster load times and better performance.&lt;/p&gt;
&lt;h4&gt;
  
  
  Key Features of Astro
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.astro.build/en/concepts/islands/" rel="noopener noreferrer"&gt;&lt;strong&gt;Component-Based Architecture&lt;/strong&gt;&lt;/a&gt;: Astro allows you to build pages using components from popular frameworks like React, Vue, Svelte, and others, all within the same project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero JavaScript by Default&lt;/strong&gt;: Astro delivers zero JavaScript to the client by default, but you can opt-in to use JavaScript where needed, ensuring only essential code is sent to the browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static Site Generation (SSG)&lt;/strong&gt;: Astro is &lt;a href="https://docs.astro.build/en/guides/cms/strapi/#static-site-generation" rel="noopener noreferrer"&gt;designed for static site generation&lt;/a&gt;, making it perfect for building fast and SEO-friendly e-commerce sites.&lt;/li&gt;
&lt;li&gt;Server-Side Rendering (SSR): Astro also supports SSR, which can be useful for dynamic content or personalized user experiences.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Astro’s flexibility and performance make it an excellent choice for building the frontend of my nerd streetwear online store.&lt;/p&gt;
&lt;h3&gt;
  
  
  Setting Up an Astro Project
&lt;/h3&gt;

&lt;p&gt;Setting up an Astro project is straightforward. Here’s how to get started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Install Node.js&lt;/strong&gt;: Make sure you have &lt;a href="https://nodejs.org/en/download/package-manager" rel="noopener noreferrer"&gt;Node.js installed&lt;/a&gt; on your machine. You can download it from Node.js.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create a New Astro Project&lt;/strong&gt;: Open your terminal and run the following command to create a new Astro project:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm create astro@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Navigate to Your Project Directory&lt;/strong&gt;: Follow the prompts to set up your project. You can name the project something like &lt;em&gt;"disbar-store."&lt;/em&gt; After the project is created, navigate to the project directory:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd disbar-store
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Install Dependencies&lt;/strong&gt;: Install all the necessary dependencies for your project:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;With your Astro project set up, you’re ready to start building the front end of your store.&lt;/p&gt;
&lt;h3&gt;
  
  
  Connecting Astro to Crystallize
&lt;/h3&gt;

&lt;p&gt;To build a dynamic e-commerce store, we need to connect our Astro frontend to the Crystallize backend. This connection lets us fetch product data, display content, and manage orders directly within our Astro site using &lt;a href="https://crystallize.com/learn/concepts/api/graphql" rel="noopener noreferrer"&gt;Crystallize's powerful GraphQL API&lt;/a&gt;. Check out the &lt;a href="https://docs.astro.build/en/guides/cms/crystallize/" rel="noopener noreferrer"&gt;example on Astro&lt;/a&gt;'s website.&lt;/p&gt;
&lt;h4&gt;
  
  
  Step-by-Step Guide to Integrating Crystallize with Astro
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Install Crystallize SDK&lt;/strong&gt;: Start by installing the Crystallize JavaScript SDK, which will help you interact with the Crystallize API.
In your Astro project directory, run the following command:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install @crystallize/js-api-client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create a Crystallize Client&lt;/strong&gt;: To interact with your Crystallize tenant, create a client instance in your Astro project.
Create a new file src/lib/crystallize.js and add the following code:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { createClient } from '@crystallize/js-api-client';

export const client = createClient({
  tenantIdentifier: 'your-tenant-identifier', // replace with your Crystallize tenant identifier
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Replace &lt;code&gt;your-tenant-identifier&lt;/code&gt; with the actual identifier of your Crystallize tenant.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fetch Data from Crystallize&lt;/strong&gt;: With the Crystallize client setup, you can fetch data from your backend.&lt;br&gt;
For example, to fetch all t-shirt products, create a new file &lt;code&gt;src/pages/products.astro&lt;/code&gt; and add the following code:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
import { client } from '../lib/crystallize';

const products = await client.catalogueAPI(
    #graphql`
      query ($language: String!, $path: String!, $version: VersionLabel) {
        catalogue(path: $path, language: $language, version: $version) {
          children {
            id
            name
            path
          }
        }
      }
    `,
     {
       Language: “en”,
       path: “/t-shirts”,
       version: version === 'draft' ? 'draft' : 'published',
     }
).catalogue;
---

&amp;lt;HTML&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Products&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Products&amp;lt;/h1&amp;gt;
    &amp;lt;ul&amp;gt;
      {products.map((product) =&amp;gt; (
        &amp;lt;li key={product.id}&amp;gt;
          &amp;lt;h2&amp;gt;{product.name}&amp;lt;/h2&amp;gt;
          &amp;lt;a href={product.path}&amp;gt;View product&amp;lt;/a&amp;gt;
        &amp;lt;/li&amp;gt;
      ))}
    &amp;lt;/ul&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This code fetches all products that match the "t-shirt" shape from your Crystallize catalog and displays them in a simple list.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use Astro Components for Rendering&lt;/strong&gt;: Astro’s strength lies in its ability to use components from various frameworks. For example, if you want to use React for parts of your page, create a React component in &lt;code&gt;src/components/ProductList.jsx&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react';

const ProductList = ({ products }) =&amp;gt; {
  return (
    &amp;lt;ul&amp;gt;
      {products.map((product) =&amp;gt; (
        &amp;lt;li key={product.id}&amp;gt;
          &amp;lt;h2&amp;gt;{product.name}&amp;lt;/h2&amp;gt;
          &amp;lt;a href={product.path}&amp;gt;View product&amp;lt;/a&amp;gt;
        &amp;lt;/li&amp;gt;
      ))}
    &amp;lt;/ul&amp;gt;
  );
};

export default ProductList;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then, import and use this component in your Astro page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
import { client } from '../lib/crystallize';
import ProductList from '../components/ProductList';

const products = await client.catalogueAPI(
    #graphql`
      query ($language: String!, $path: String!, $version: VersionLabel) {
        catalogue(path: $path, language: $language, version: $version) {
          children {
            id
            name
            path
          }
        }
      }
    `,
     {
       Language: “en”,
       path: “/t-shirts”,
       version: version === 'draft' ? 'draft' : 'published',
     }
).catalogue;
---

&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Products&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Products&amp;lt;/h1&amp;gt;
    &amp;lt;ProductList products={products} /&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This integration allows you to display product data dynamically fetched from Crystallize within your Astro frontend, providing a seamless connection between the backend and the user interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating Dynamic Routes
&lt;/h3&gt;

&lt;p&gt;Dynamic routing is essential for an e-commerce site. It allows you to generate product pages on the fly based on data from your Crystallize backend. In Astro, dynamic routes are created using parameterized filenames.&lt;/p&gt;

&lt;h4&gt;
  
  
  How to Create Dynamic Product Pages in Astro
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create a Dynamic Route&lt;/strong&gt;: To create dynamic routes in Astro, use square brackets in your filenames to denote a dynamic segment. 
For example, create a new folder &lt;code&gt;src/pages/products/&lt;/code&gt; and create a file named &lt;code&gt;[slug].astro&lt;/code&gt; inside it:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
import { client } from '../../lib/crystallize';

const { slug } = Astro.params;

const product = await client.catalogueAPI(
    #graphql`
      query ($language: String!, $path: String!, $version: VersionLabel) {
        catalogue(path: $path, language: $language, version: $version) {
          #your query based on shape
          name
          component(id: “description”){
            …on richTextContent {
               plantText
            }
          }
          …on Product {
             defaultVariant {
                price
                firstImage {
                   variants {
                     url
                   }
                }
             }
          }
        }
      }
    `,
     {
       Language: “en”,
       path: `/products/${slug}`,
       version: version === 'draft' ? 'draft' : 'published',
     }
).catalogue;

const { name, component, defaultVariant} = product.data;
---

&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;{name}&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;{name}&amp;lt;/h1&amp;gt;
    &amp;lt;img src={defaultVariant.firstImage[0].url} alt={name} /&amp;gt;
    &amp;lt;p&amp;gt;{component.description.plainText}&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;{defaultVariant.price} USD&amp;lt;/p&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;This file will generate a dynamic page for each product based on its slug (a unique identifier in the URL). Here is an example of fetching a product by its path from the Crystallize &lt;a href="https://github.com/CrystallizeAPI/dounut-astro/blob/main/src/use-cases/queries/product.ts" rel="noopener noreferrer"&gt;Dounut Astro boilerplate&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Link to Dynamic Pages&lt;/strong&gt;:&lt;br&gt;
Update your product list page to link to the dynamic product pages. Modify &lt;code&gt;src/pages/products.astro&lt;/code&gt; to include links to the individual product pages:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
import { client } from '../lib/crystallize';

const products = await client.catalogueAPI(
    #graphql`
      query ($language: String!, $path: String!, $version: VersionLabel) {
        catalogue(path: $path, language: $language, version: $version) {
          children {
            id
            name
            path
          }
        }
      }
    `,
     {
       Language: “en”,
       path: “/t-shirts”,
       version: version === 'draft' ? 'draft' : 'published',
     }
).catalogue;
---

&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Products&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Products&amp;lt;/h1&amp;gt;
    &amp;lt;ul&amp;gt;
      {products.map((product) =&amp;gt; (
        &amp;lt;li key={product.id}&amp;gt;
          &amp;lt;a href={`/products/${product.path}`}&amp;gt;
            &amp;lt;h2&amp;gt;{product.name}&amp;lt;/h2&amp;gt;
            &amp;lt;img src={product.image.url} alt={product.name} /&amp;gt;
            &amp;lt;p&amp;gt;{product.price} USD&amp;lt;/p&amp;gt;
          &amp;lt;/a&amp;gt;
        &amp;lt;/li&amp;gt;
      ))}
    &amp;lt;/ul&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Test Dynamic Routes&lt;/strong&gt;: Run your Astro project locally (&lt;code&gt;npm run dev&lt;/code&gt;) and navigate to the products page.
Click on a product link to ensure that it takes you to the dynamically generated product page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Following these steps, you’ll have a fully functional e-commerce frontend powered by Astro, with dynamic routing and content fetched from your Crystallize backend. This setup allows you to manage your online store efficiently, ensuring it is scalable and easy to maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Integrating with Stripe
&lt;/h2&gt;

&lt;p&gt;💰&lt;a href="https://stripe.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Stripe&lt;/strong&gt;&lt;/a&gt; is a leading online payment processing platform that provides businesses with the tools they need to accept payments over the Internet. It supports various payment methods, including credit cards, debit cards, digital wallets like Apple Pay and Google Pay, and even local payment methods.&lt;/p&gt;

&lt;h4&gt;
  
  
  Key Features of Stripe
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ease of Integration&lt;/strong&gt;: Stripe offers &lt;a href="https://docs.stripe.com/sdks" rel="noopener noreferrer"&gt;well-documented SDKs&lt;/a&gt; and APIs that make integrating with various web applications straightforward.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Stripe handles sensitive payment data securely, complying with PCI-DSS standards, which reduces the burden on developers to meet these stringent requirements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global Reach&lt;/strong&gt;: Stripe supports over 135 currencies and a variety of payment methods, allowing you to cater to a global customer base.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive Dashboard&lt;/strong&gt;: Stripe provides a powerful dashboard where you can manage payments, view analytics, and handle disputes and refunds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Given its powerful capabilities and ease of use, Stripe is an excellent choice for handling payments in your DisBar nerd streetwear online store.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integrating Stripe
&lt;/h3&gt;

&lt;p&gt;To accept payments on your e-commerce site, you must integrate &lt;strong&gt;Stripe&lt;/strong&gt; with your &lt;strong&gt;Astro&lt;/strong&gt; frontend and, optionally, with &lt;strong&gt;Crystallize&lt;/strong&gt; for order management (BTW, since Crystallize is headless, you can go with whatever payment gateway you want).&lt;/p&gt;

&lt;p&gt;There are a couple of ways to do it. One of the best guides I’ve found is &lt;a href="https://zellwk.com/blog/stripe-astro-recipe/" rel="noopener noreferrer"&gt;Collecting Payments with Stripe while using Astro&lt;/a&gt; guide. Alternatively, AI suggested a more generic React way that follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Set Up a Stripe Account&lt;/strong&gt;: Go to the Stripe website and sign up for a free account. Once your account is created, navigate to the Stripe Dashboard to obtain your API keys (&lt;em&gt;Publishable Key and Secret Key&lt;/em&gt;) from the Developers section.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Install Stripe SDK&lt;/strong&gt;: In your Astro project, install the Stripe SDK to handle payment processing:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install @stripe/stripe-js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create a Payment Form&lt;/strong&gt;: In your Astro project, create a simple payment form where users can enter their payment details. This can be done using Stripe Elements, which are pre-built UI components for collecting payment information.
Create a new file &lt;code&gt;src/components/PaymentForm.jsx&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState } from 'react';
import { loadStripe } from '@stripe/stripe-js';
import { Elements, CardElement, useStripe, useElements } from '@stripe/react-stripe-js';

const stripePromise = loadStripe('your-publishable-key'); // Replace with your Stripe publishable key

const PaymentForm = () =&amp;gt; {
  const stripe = useStripe();
  const elements = useElements();
  const [error, setError] = useState(null);
  const [success, setSuccess] = useState(false);

  const handleSubmit = async (event) =&amp;gt; {
    event.preventDefault();

    if (!stripe || !elements) {
      return;
    }

    const cardElement = elements.getElement(CardElement);
    const { error, paymentMethod } = await stripe.createPaymentMethod({
      type: 'card',
      card: cardElement,
    });

    if (error) {
      setError(error.message);
    } else {
      setError(null);
      setSuccess(true);
      // Send paymentMethod.id to your server to create a charge
    }
  };

  return (
    &amp;lt;form onSubmit={handleSubmit}&amp;gt;
      &amp;lt;CardElement /&amp;gt;
      &amp;lt;button type="submit" disabled={!stripe}&amp;gt;Pay&amp;lt;/button&amp;gt;
      {error &amp;amp;&amp;amp; &amp;lt;div&amp;gt;{error}&amp;lt;/div&amp;gt;}
      {success &amp;amp;&amp;amp; &amp;lt;div&amp;gt;Payment Successful!&amp;lt;/div&amp;gt;}
    &amp;lt;/form&amp;gt;
  );
};

const PaymentPage = () =&amp;gt; (
  &amp;lt;Elements stripe={stripePromise}&amp;gt;
    &amp;lt;PaymentForm /&amp;gt;
  &amp;lt;/Elements&amp;gt;
);

export default PaymentPage;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Handling Payment on the Server&lt;/strong&gt;: You must create a server-side endpoint to handle and confirm the payment intent. If you are using Node.js, create an endpoint in your backend (which could be part of a serverless function on platforms like &lt;strong&gt;Vercel&lt;/strong&gt; or &lt;strong&gt;Netlify&lt;/strong&gt;):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const express = require('express');
const Stripe = require('stripe');
const app = express();
const stripe = Stripe('your-secret-key'); // Replace with your Stripe secret key

app.post('/create-payment-intent', async (req, res) =&amp;gt; {
  const { amount } = req.body; // Amount should be in the smallest currency unit (e.g., cents)

  try {
    const paymentIntent = await stripe.paymentIntents.create({
      amount,
      currency: 'usd',
    });

    res.status(200).send({
      clientSecret: paymentIntent.client_secret,
    });
  } catch (error) {
    res.status(400).send({ error: error.message });
  }
});

app.listen(3000, () =&amp;gt; console.log('Server running on port 3000'));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first line above, you don't need an &lt;em&gt;express&lt;/em&gt; server because Astro takes care of it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Integrating Stripe with Crystallize&lt;/strong&gt; (Optional): After a successful transaction, you can send the &lt;a href="https://crystallize.com/learn/open-source/payment-gateways/stripe" rel="noopener noreferrer"&gt;payment confirmation to Crystallize to link Stripe payments&lt;/a&gt; with the company's order management.
Use Crystallize’s API to create an order and associate it with the payment details (keep in mind that to access the &lt;a href="https://crystallize.com/learn/developer-guides/order-api" rel="noopener noreferrer"&gt;Order API&lt;/a&gt;, you would need access tokens):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const { client } = require('@crystallize/js-api-client');

const crystallizeClient = client({
  tenantIdentifier: 'your-tenant-identifier',
  accessTokenId: ‘xXx’,
  accessTokenSecret: ‘xXx’
});

const createOrder = async (orderDetails) =&amp;gt; {
  const order = await apiClient.orderApi(
        `#graphql
      mutation($input: CreateOrderInput!) {
        orders {
          create(input: $input) {
            id
          }
        }
      }
    `,
        {
            input: orderInput,
        }
    );


  return order;
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By following these steps, you can securely process payments on your DisBar online store using Stripe, providing a smooth checkout experience for your customers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AND&lt;/strong&gt; we’re at the end of &lt;strong&gt;part two&lt;/strong&gt; of this guide about building a side hustle with &lt;strong&gt;Astro&lt;/strong&gt;, &lt;strong&gt;Crystallize&lt;/strong&gt;, and &lt;strong&gt;Stripe&lt;/strong&gt; for payment. Next, look at advanced features and ways to deploy the project.&lt;/p&gt;

&lt;p&gt;Next 👉 &lt;a href="https://dev.to/cookieduster_n/advance-features-and-deploying-the-project-nerd-streetwear-online-store-part-iii-3jmk"&gt;Advance Features and Deploying the Project&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¯_(ツ)_/¯&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you enjoyed reading this, please support my efforts by &lt;strong&gt;recommending and sharing&lt;/strong&gt; this page to help others find it! Let me know what you think.&lt;/p&gt;

&lt;p&gt;Please share your feedback and suggestions in the &lt;strong&gt;comment&lt;/strong&gt; section below.&lt;/p&gt;

</description>
      <category>astro</category>
      <category>frontend</category>
      <category>headless</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Built with Astro, Crystallize, and Stripe (Nerd Streetwear Online Store) Part I</title>
      <dc:creator>Nebojsa Radakovic</dc:creator>
      <pubDate>Mon, 16 Sep 2024 11:57:59 +0000</pubDate>
      <link>https://forem.com/cookieduster_n/built-with-astro-crystallize-and-stripe-nerd-streetwear-online-store-part-i-15a</link>
      <guid>https://forem.com/cookieduster_n/built-with-astro-crystallize-and-stripe-nerd-streetwear-online-store-part-i-15a</guid>
      <description>&lt;p&gt;Side hustle built with &lt;strong&gt;Astro&lt;/strong&gt;, &lt;strong&gt;Crystallize&lt;/strong&gt;, and &lt;strong&gt;Stripe&lt;/strong&gt; for payment. Aided by &lt;strong&gt;ChatGPT&lt;/strong&gt; trained assistant.&lt;/p&gt;

&lt;p&gt;This is a four-piece article:&lt;br&gt;
1️⃣ &lt;strong&gt;Bringing Idea to Life and Setting Up the Backend&lt;/strong&gt;&lt;br&gt;
2️⃣ &lt;a href="https://dev.to/cookieduster_n/building-the-frontend-with-astro-and-integration-with-stripe-nerd-streetwear-online-store-part-ii-2dd9"&gt;Building the Frontend with Astro and Integration with Stripe&lt;/a&gt;&lt;br&gt;
3️⃣ &lt;a href="https://dev.to/cookieduster_n/advance-features-and-deploying-the-project-nerd-streetwear-online-store-part-iii-3jmk"&gt;Advance Features and Deploying the Project&lt;/a&gt;&lt;br&gt;
4️⃣ &lt;a href="https://dev.to/cookieduster_n/final-testing-going-live-and-summary-nerd-streetwear-online-store-part-iv-2dam"&gt;Final Testing, Going Live, and Summary&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We live in exciting times.&lt;/strong&gt; AI is in the search, AI is in our phones, AI makes images, AI helps us code, and AI is soon to be our main learning source. So, I’ve wondered if AI can help me with a side hustle from beginning to end.&lt;/p&gt;

&lt;p&gt;I could have picked a consultancy or &lt;a href="https://dev.to/cookieduster_n/jamstack-for-dummies-moving-a-side-hustle-to-jamstack-1d31"&gt;newsletter&lt;/a&gt; (like I did 4 years ago) as a &lt;strong&gt;side hustle&lt;/strong&gt;, but I wanted to do something different. That’s how nerd streetwear t-shirt brand &lt;strong&gt;DisBar&lt;/strong&gt; came to life (nope, don’t ask me about the name). Think t-shirts featuring iconic tech, coding humor, and geek culture references.&lt;/p&gt;

&lt;p&gt;Ideas matter the most, right?&lt;/p&gt;

&lt;p&gt;Kind of🤔 Still, in today's competitive digital landscape, building a niche online store requires more than just having an idea and a platform. You must deliver a visually appealing, highly functional, and optimized-for-performance storefront.&lt;/p&gt;

&lt;p&gt;To make things interesting, this guide is built entirely with the help of &lt;strong&gt;ChatGPT&lt;/strong&gt;. From ideation to examples to step-by-step setup, it is all built by ChatGPT and proofread for accuracy.&lt;/p&gt;

&lt;p&gt;A couple of caveats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I’ve trained ChatGPT assistant on 🚀&lt;a href="https://astro.build/" rel="noopener noreferrer"&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;/a&gt;, 🛒&lt;a href="https://crystallize.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Crystallize&lt;/strong&gt;&lt;/a&gt;, and 💰&lt;a href="https://stripe.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Stripe&lt;/strong&gt;&lt;/a&gt; documentation, and a couple of &lt;strong&gt;🛠HOW-TO&lt;/strong&gt; guides I managed to get my hands on.&lt;/li&gt;
&lt;li&gt;Most prompts have been descriptive, with multiple takes on the topic or code requested. Hence, no prompts will be shared.&lt;/li&gt;
&lt;li&gt;Building stuff this way is about perfecting the prompts, but I haven't done much of those. Instead, I took prompts granularly instead of using a single one. Hence, &lt;em&gt;Easter eggs&lt;/em&gt; in images and code.&lt;/li&gt;
&lt;li&gt;I owe much gratitude to my good friend &lt;a href="https://x.com/deestoevsky" rel="noopener noreferrer"&gt;&lt;strong&gt;Dhairya&lt;/strong&gt;&lt;/a&gt;, who reviewed the process and the code for accuracy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next step is actually to build the store myself (this does not mean you can’t do it as well).&lt;/p&gt;

&lt;h3&gt;
  
  
  Before You Start
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Explore &lt;strong&gt;Astro&lt;/strong&gt;, &lt;strong&gt;Crystallize&lt;/strong&gt;, and &lt;strong&gt;Stripe&lt;/strong&gt; documentation to deepen your understanding and start building your e-commerce projects.&lt;/li&gt;
&lt;li&gt;Experiment with different integrations, design styles, and features to customize your store to meet the needs of your target audience.&lt;/li&gt;
&lt;li&gt;Share your project with the community, contribute to open-source, and continue learning as you develop your skills.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technologies Used
&lt;/h2&gt;

&lt;p&gt;To build a &lt;strong&gt;DisBar nerd streetwear online store&lt;/strong&gt;, I’ve selected three core technologies that integrate smoothly to create a modern, performant, and scalable e-commerce solution.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;🚀&lt;a href="https://astro.build/" rel="noopener noreferrer"&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;/a&gt; is a modern frontend framework designed to build fast, optimized websites with minimal JavaScript by default. Astro’s component-based architecture supports multiple frontend frameworks (like React, Svelte, and Vue), offering flexibility and power. It also enables server-side rendering (SSR) and static site generation (SSG), which are crucial for performance and scalability.&lt;/li&gt;
&lt;li&gt;🛒&lt;a href="https://crystallize.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Crystallize&lt;/strong&gt;&lt;/a&gt; is an API-first headless commerce platform that provides the backend infrastructure for my online store.&lt;/li&gt;
&lt;li&gt;💰&lt;a href="https://stripe.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Stripe&lt;/strong&gt;&lt;/a&gt; is a leading payment processing platform that handles online transactions securely and efficiently. Ease of integration, robust API, and comprehensive feature set make it the go-to choice for handling payments in e-commerce applications.
Together, these technologies form a powerful stack that enables the creation of a feature-rich, performant, and scalable online store tailored specifically for the nerd streetwear market.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  0. Bringing Idea to Life
&lt;/h2&gt;

&lt;p&gt;Confession time: I have ZERO designer skills but an eye for good things (as we all do). So, I just let AI take care of the entire design process, from creating logos and icons to elaborating on what and how to wireframe pages and suggest the design's implementation.&lt;/p&gt;

&lt;p&gt;Basically, I just talked with AI about what I want and how I want it (it is mind-boggling that this is possible already).&lt;/p&gt;

&lt;h3&gt;
  
  
  Designing Logos and Icons
&lt;/h3&gt;

&lt;p&gt;The logo is the face of your brand, and it should encapsulate the essence of DisBar—modern, edgy, and tailored to the nerd streetwear audience. Here's how the logo and app icon for DisBar were created using DALL-E:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Conceptualizing the Logo&lt;/strong&gt;. I suggested two things:

&lt;ul&gt;
&lt;li&gt;Typography: The logo should feature strong, sans-serif typography with clean lines. The bold and modern font conveys a sense of strength and simplicity, which resonates with streetwear aesthetics.&lt;/li&gt;
&lt;li&gt;Iconography: The icon integrates a stylized "D" and "B," representing DisBar's initials. The design is abstract yet recognizable, making it versatile enough to stand alone or complement the text.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Using DALL-E for Design&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Step 1: Provide DALL-E with a detailed description (the above one) of the desired logo attributes, including the typography style, iconography, and color scheme.&lt;/li&gt;
&lt;li&gt;Step 2: Generate multiple variations and select the most fitting design.&lt;/li&gt;
&lt;li&gt;Step 3: Refine the selected design by iterating on specific elements such as the shape or the font’s weight.&lt;/li&gt;
&lt;li&gt;Step 4: Test the logo on various backgrounds and scales to ensure it works well in different contexts, such as on t-shirts, business cards, and app icons.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What we ended up with after multiple iterations is not that bad, even though the text is screwed😎&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%2Fmc3256ki32d24p2gqyyw.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%2Fmc3256ki32d24p2gqyyw.jpg" alt="Nerd Streetwear Online Store Disbar Logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating T-Shirt Mockups
&lt;/h3&gt;

&lt;p&gt;The t-shirts are the core products of the DisBar brand, and the designs we aim at should reflect the themes of modern front-end development, such as HTML, JavaScript, and Astro.&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%2F0hauyihqjqcwk5lfyql8.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%2F0hauyihqjqcwk5lfyql8.jpg" alt="HTML, JS and React T-Shirt Mockups"&gt;&lt;/a&gt;&lt;br&gt;
All we had to start with was a tagline that should act as a design north star for t-shirt mockups:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;HTML: "The Backbone"&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Description: A stylized design featuring the iconic HTML5 logo, with elements like brackets and tags artistically integrated into the design.&lt;/li&gt;
&lt;li&gt;Colors: Primary colors of the HTML5 logo (orange and white) with black accents.&lt;/li&gt;
&lt;li&gt;Imagery: Abstract code snippets in the background, focusing on structure and backbone.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript: "The Wizardry"&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Description: A dynamic print showcasing the JavaScript logo with a playful twist, including code snippets and a wizard hat.&lt;/li&gt;
&lt;li&gt;Colors: Yellow and black, with neon accents to add a modern touch.&lt;/li&gt;
&lt;li&gt;Imagery: JavaScript code snippets highlight functions and variables, giving a feel of programming magic.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Astro: "Beyond the Stars"&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Description: Featuring the Astro logo set against a cosmic background, with stars and constellations forming the outlines of the logo.&lt;/li&gt;
&lt;li&gt;Colors: Dark blues and purples for the background, with white and light blue accents.&lt;/li&gt;
&lt;li&gt;Imagery: Space and galaxy themes, with shooting stars and planets, emphasizing the futuristic aspect of Astro.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React: "Reactive Energy"&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Description: A design emphasizing the React logo, surrounded by elements that signify speed and energy, like lightning bolts and gears.&lt;/li&gt;
&lt;li&gt;Colors: React's cyan and black, with electric blue highlights.&lt;/li&gt;
&lt;li&gt;Imagery: Components and hooks are illustrated dynamically, showing the reactive nature of the library.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Svelte: "Svelte and Sleek"&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Description: A sleek design featuring the Svelte logo, with smooth, flowing lines and a minimalist approach.&lt;/li&gt;
&lt;li&gt;Colors: Svelte's red and white, with subtle grey elements.&lt;/li&gt;
&lt;li&gt;Imagery: Simplified code snippets and smooth curves reflect Svelte's minimal and efficient nature.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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%2F3bxxg25tw8bppj99allm.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%2F3bxxg25tw8bppj99allm.jpg" alt="Astro, Svelte and brand name T-Shirt Mockups"&gt;&lt;/a&gt;&lt;br&gt;
While I aimed at a minimal approach while trying to emphasize the unique strengths and characteristics of the respective technologies, I ended up with these because DALL-E could not escape &lt;strong&gt;&lt;em&gt;modern&lt;/em&gt;&lt;/strong&gt; full-t-shirt images. Instead of pursuing the original idea, I just accepted it.&lt;/p&gt;

&lt;p&gt;I could have supplied DALL-E with solutions (images) of the t-shirts I like and had it work from those connected to our taglines. Maybe next time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The work from here on👉&lt;/strong&gt; a couple of high-res images of the t-shirts from different angles and, maybe, on a mannequin or something. I am sure the current AI solution can pull much more than this.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wireframing Pages
&lt;/h3&gt;

&lt;p&gt;Wireframing is an essential step in translating your design ideas into functional layouts. It helps visualize the structure of your website and guides the development process.&lt;br&gt;
Here are the final results.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Homepage Wireframe&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Hero Section: A full-width banner with a high-quality image of a featured t-shirt, a bold tagline, and a CTA button leading to the shop.&lt;/li&gt;
&lt;li&gt;Featured Products: A grid layout displaying top products with images, names, prices, and a "View More" button.&lt;/li&gt;
&lt;li&gt;About Us Section: A brief introduction to DisBar, highlighting the brand's mission and unique selling points.&lt;/li&gt;
&lt;li&gt;Newsletter Signup: A simple form encouraging visitors to subscribe for updates and promotions.&lt;/li&gt;
&lt;li&gt;Footer: Includes links to social media profiles, contact information, and additional resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product Page Wireframe&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Product Images: High-resolution images of the t-shirt from multiple angles, with an image zoom feature.&lt;/li&gt;
&lt;li&gt;Product Details: Product name, price, available sizes and colors, and a detailed description.&lt;/li&gt;
&lt;li&gt;Add to Cart: A prominent "Add to Cart" button with options to select quantity.&lt;/li&gt;
&lt;li&gt;Related Products: A section featuring similar products to encourage cross-selling.&lt;/li&gt;
&lt;li&gt;Customer Reviews: Display user reviews and ratings for social proof.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creating the Wireframes&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Use tools like Figma, Adobe XD, or Sketch to create detailed wireframes.
Ensure the layout is clean, intuitive, and optimized for desktop and mobile devices.
Examples:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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%2Fgfdujlsww7qa189z1q0j.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%2Fgfdujlsww7qa189z1q0j.jpg" alt="Disbar Online Store Wireframe Suggestions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The work from here on👉&lt;/strong&gt; writing the product descriptions and promo copy for the whole website.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementing the Designs
&lt;/h3&gt;

&lt;p&gt;Once your wireframes are ready, the next step is to translate these designs into actual pages using Astro components.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Setting Up the Layouts&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Create reusable layout components in Astro, such as &lt;code&gt;Header&lt;/code&gt;, &lt;code&gt;Footer&lt;/code&gt;, and &lt;code&gt;ProductCard&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Define the basic structure of the pages using these components.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Building the Home Page&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Implement the hero section, featured products, and other elements as per the wireframe.&lt;/li&gt;
&lt;li&gt;Use Astro's component-based architecture to keep the code organized and maintainable.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creating Product Pages&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Use the dynamic routes set up earlier to render product-specific pages.&lt;/li&gt;
&lt;li&gt;Ensure that the design elements like images, buttons, and text are styled consistently with the overall brand identity.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Apply CSS or a CSS framework like Tailwind CSS to style your pages.&lt;/li&gt;
&lt;li&gt;Ensure the design is responsive, with appropriate breakpoints for different screen sizes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The work from here on👉&lt;/strong&gt; doing the above.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Setting Up the Backend with Crystallize
&lt;/h2&gt;

&lt;p&gt;🛒&lt;strong&gt;Crystallize&lt;/strong&gt; is a &lt;a href="https://crystallize.com/headless-ecommerce" rel="noopener noreferrer"&gt;headless e-commerce platform&lt;/a&gt; designed to help developers easily build and manage modern online stores. Headless at the core, Crystallize offers a highly flexible, API-driven approach that allows you to create custom content models, manage products, and handle orders through a powerful GraphQL API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features of Crystallize:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API-First:&lt;/strong&gt; Crystallize is built with an API-first approach, providing a robust GraphQL API that allows developers to fetch and manipulate data precisely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Headless Commerce:&lt;/strong&gt; &lt;a href="https://crystallize.com/blog/headless-commerce" rel="noopener noreferrer"&gt;Headless means the front end is decoupled from the back end&lt;/a&gt;. This allows you to use any frontend technology, such as Astro, to build your storefront while relying on Crystallize for backend operations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible Content Modeling:&lt;/strong&gt; Crystallize offers flexible &lt;a href="https://crystallize.com/learn/best-practices/information-architecture/content-modeling" rel="noopener noreferrer"&gt;content modeling&lt;/a&gt;, allowing you to define custom shapes and properties for your products and other content types. This makes it ideal for creating unique and complex e-commerce experiences.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multichannel:&lt;/strong&gt; Crystallize supports multichannel commerce, enabling you to deliver content and products across various platforms, including web, mobile, and IoT devices.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Crystallize, you can design a store that perfectly fits your brand’s needs, whether you sell physical products, digital goods, or subscription services.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a Tenant
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://crystallize.com/learn/user-guides/getting-started" rel="noopener noreferrer"&gt;first step in setting up your e-commerce backend&lt;/a&gt; with Crystallize is to create a tenant. A tenant in Crystallize represents an independent instance of your store, complete with its products, content, and configurations. &lt;a href="https://youtu.be/66p6iPwopGE?si=zZfnRh1l0_Y4gN2D" rel="noopener noreferrer"&gt;Crystallize is a multi-tenant platform&lt;/a&gt; (link to a short ▶️&lt;strong&gt;YT video&lt;/strong&gt; about tenants), meaning you can have multiple stores with the same login.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step-by-Step Guide to Creating a Tenant:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sign Up and Log In&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Visit the Crystallize website and sign up for an account if you haven’t already done so.&lt;/li&gt;
&lt;li&gt;Once you have an account, log in to access the Crystallize dashboard.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a New Tenant&lt;/strong&gt;:
In the Crystallize dashboard, navigate to the &lt;code&gt;Tenants&lt;/code&gt; section.

&lt;ul&gt;
&lt;li&gt;Click on the &lt;code&gt;Create Tenant&lt;/code&gt; button.&lt;/li&gt;
&lt;li&gt;Fill in the details for your new tenant, such as the name (e.g., "DisBar Store") and other relevant information.&lt;/li&gt;
&lt;li&gt;Choose a subscription plan based on your needs and confirm the creation of your tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configure Basic Settings&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Once your tenant is created, you can access its dashboard to find various configuration options.&lt;/li&gt;
&lt;li&gt;Set up basic settings like the default language, currency, and other general preferences.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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%2F5s00t7ahz96xajtozrnr.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%2F5s00t7ahz96xajtozrnr.png" alt="Creating a Tenant in Crystallize"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that your tenant is set up, you can define roles, permissions, and content models.&lt;/p&gt;

&lt;h3&gt;
  
  
  Defining Roles and Permissions
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://youtu.be/567Br2aG18k?si=SZrN9LdgXQXnoGsg" rel="noopener noreferrer"&gt;Managing roles and permissions&lt;/a&gt; (link to a short ▶️&lt;strong&gt;YT video&lt;/strong&gt; about roles) ensures your team members access the store’s resources appropriately. You don’t want to have a single login for everyone on the team or have a couple of admins. Crystallize allows you to create custom roles with specific permissions, making it easy to control who can edit content, manage products, or access sensitive data.&lt;/p&gt;

&lt;h4&gt;
  
  
  How to Set Up Roles and Permissions
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Navigate to the Roles &amp;amp; Permissions Section&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;In your tenant’s dashboard, go to the &lt;code&gt;Settings&lt;/code&gt; section.
Click on "Roles &amp;amp; Permissions" to view the available roles.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create Custom Roles&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;To create a new role, click on &lt;code&gt;Add Role.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Name the role based on the function (e.g., "Developer" or "Content Writer").&lt;/li&gt;
&lt;li&gt;Assign permissions relevant to the role. For example,  &lt;strong&gt;Developer Role&lt;/strong&gt; allows access to schema editing, API management, and product catalog configuration; while &lt;strong&gt;Content Writer Role&lt;/strong&gt; allows access to content creation, product descriptions, and media management but restrict access to the schema and API settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assign Roles to Users&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Go to the &lt;code&gt;Users&lt;/code&gt; section of the dashboard.&lt;/li&gt;
&lt;li&gt;Invite your team members by entering their email addresses and assigning them the appropriate roles.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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%2Fo39o2p8g3jnz57jllnbm.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%2Fo39o2p8g3jnz57jllnbm.png" alt="Defining Roles and Permissions in Crystallize"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By setting up roles and permissions, you ensure that your team can work efficiently while maintaining the security and integrity of your e-commerce platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  Content Modeling
&lt;/h3&gt;

&lt;p&gt;Content modeling in Crystallize allows you to define the structure of your products, categories, and other content types. For a nerd streetwear store, you’ll need a custom content model that suits the unique attributes of your t-shirts, such as sizes, colors, and design themes.&lt;/p&gt;

&lt;p&gt;That’s not all. You can also use Crystallize as a blog, i.e., define article shape and connect it with your product. This way, you can have all your product information and marketing content in one place.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/playlist?list=PLiKqsi6CxPy54BHyxzv_uVwlFTCDIMWHJ" rel="noopener noreferrer"&gt;Content Modeling for the eCommerce livestream&lt;/a&gt; series is a good starting point to understand it in depth.&lt;/p&gt;

&lt;h4&gt;
  
  
  How to Create a Content Model for T-Shirt Products and the Home Page
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a Product Shape&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;In the Crystallize dashboard, go to the &lt;code&gt;Shapes&lt;/code&gt; section.&lt;/li&gt;
&lt;li&gt;Click &lt;code&gt;Add Shape&lt;/code&gt; and select &lt;code&gt;Product&lt;/code&gt; as the shape type.&lt;/li&gt;
&lt;li&gt;Name the shape &lt;code&gt;T-Shirt&lt;/code&gt; to represent your product model.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define Fields for the T-Shirt Shape&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Title: Add a text field for the product name (e.g., "JavaScript Wizardry Tee").&lt;/li&gt;
&lt;li&gt;Description: Add a rich text field for the product description.&lt;/li&gt;
&lt;li&gt;Images: Add an image field to upload multiple product images.&lt;/li&gt;
&lt;li&gt;What about size and color? Both are product attributes that can be defined on a product variant. And SKU? Every product variant has its own &lt;strong&gt;SKU&lt;/strong&gt; field by default; there is no need to define this separately, either. Finally, if you need &lt;strong&gt;TAGS&lt;/strong&gt;, define &lt;a href="https://crystallize.com/learn/user-guides/pim/topic-maps" rel="noopener noreferrer"&gt;topic maps&lt;/a&gt; in Crystallize.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a Home Page Shape&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Return to the &lt;code&gt;Shapes&lt;/code&gt; section and click &lt;code&gt;Add Shape.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Choose &lt;code&gt;Document&lt;/code&gt; as the shape type and name it &lt;code&gt;Home Page.&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define Fields for the Home Page Shape&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Hero Section: Add an image field for the banner and a text field for the tagline.&lt;/li&gt;
&lt;li&gt;Featured Products: Add a reference field to select and display featured products. Based on the layout, this can be a grid or item relations component.&lt;/li&gt;
&lt;li&gt;About Us: Add a rich text field for the About section.&lt;/li&gt;
&lt;li&gt;Newsletter Form: You can either have it on the front end or have a SingleLine field to add an embed URL for the form.&lt;/li&gt;
&lt;li&gt;Footer: Add text and link fields for social media and contact information.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With these shapes in place, you have a robust content model that supports your store’s unique products and page layouts.&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%2F78pzqm3z92aq5go1fv4z.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%2F78pzqm3z92aq5go1fv4z.png" alt="Content Modeling in Crystallize"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Populating Content
&lt;/h3&gt;

&lt;p&gt;Now that your product and home page content models are defined, it’s time to add actual products and set up the home page content.&lt;/p&gt;

&lt;h4&gt;
  
  
  How to Add Products and Set Up Home Page Content:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add Products&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Go to the &lt;code&gt;Catalogue&lt;/code&gt; section of the dashboard.&lt;/li&gt;
&lt;li&gt;Click on &lt;code&gt;Add Item&lt;/code&gt; and select &lt;code&gt;Product.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Choose the &lt;code&gt;T-shirt&lt;/code&gt; shape that you created earlier.&lt;/li&gt;
&lt;li&gt;Fill in the fields with the product details, such as the name, description, images, price, sizes, and colors.&lt;/li&gt;
&lt;li&gt;Repeat this process to add all your t-shirt products.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create the Home Page&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;In the &lt;code&gt;Catalogue&lt;/code&gt; section, click on &lt;code&gt;Add Item&lt;/code&gt; and select &lt;code&gt;Document.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Choose the &lt;code&gt;Home Page&lt;/code&gt; shape.&lt;/li&gt;
&lt;li&gt;Populate the hero section with a banner image and tagline.&lt;/li&gt;
&lt;li&gt;Select featured products using the reference field.&lt;/li&gt;
&lt;li&gt;Add content to the About Us section and configure the newsletter signup.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With your content added, your Crystallize backend is now ready to power the front end of your online store.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AND&lt;/strong&gt; we’re at the end of part one of this guide about building a side hustle with &lt;strong&gt;Astro&lt;/strong&gt;, &lt;strong&gt;Crystallize&lt;/strong&gt;, and &lt;strong&gt;Stripe&lt;/strong&gt; for payment. Next, we build the front end with Astro and integrate Stripe.&lt;/p&gt;

&lt;p&gt;Next 👉 &lt;a href="https://dev.to/cookieduster_n/building-the-frontend-with-astro-and-integration-with-stripe-nerd-streetwear-online-store-part-ii-2dd9"&gt;Building the Frontend with Astro and Integration with Stripe&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¯_(ツ)_/¯&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you enjoyed reading this, please support my efforts by &lt;strong&gt;recommending and sharing&lt;/strong&gt; this page to help others find it! Let me know what you think.&lt;/p&gt;

&lt;p&gt;Please share your feedback and suggestions in the &lt;strong&gt;comment&lt;/strong&gt; section below.&lt;/p&gt;

</description>
      <category>astro</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>headless</category>
    </item>
    <item>
      <title>React (conferences) In 2024🤘</title>
      <dc:creator>Nebojsa Radakovic</dc:creator>
      <pubDate>Thu, 08 Feb 2024 13:33:14 +0000</pubDate>
      <link>https://forem.com/cookieduster_n/react-conferences-in-2024-1nmd</link>
      <guid>https://forem.com/cookieduster_n/react-conferences-in-2024-1nmd</guid>
      <description>&lt;p&gt;As React continues to dominate the web development landscape, the year 2024 is set to bring an exciting lineup of React and React Native conferences with an exciting lineup of speakers as well.&lt;/p&gt;

&lt;p&gt;With a focus on the latest trends, techniques, and best practices in React development, these conferences are essential for developers looking to stay at the forefront of this ever-evolving technology. Many promise to offer unparalleled opportunities for learning, networking, and collaboration within the React community. But which ones are set to deliver this year? &lt;/p&gt;

&lt;p&gt;That sounded harsh. Most do deliver. But with so many to choose from and, let’s be real, limited budgets we all have, a bit of planning is required to get the most for your buck.&lt;/p&gt;

&lt;p&gt;Between working, planning my time, and my teammates (dev appearance) and (again) organizing &lt;a href="https://reactnorway.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;React Norway&lt;/strong&gt;&lt;/a&gt;, I wanted to check what our partners in React offer this year.&lt;/p&gt;

&lt;p&gt;Join me as I explore the top React conferences of 2024, where innovation meets expertise in web development.&lt;/p&gt;

&lt;p&gt;(that sounded marketing cool-ish, 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%2Fpeq8i5j3o2lj4sysceq2.gif" 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%2Fpeq8i5j3o2lj4sysceq2.gif" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsworldconference.com/" rel="noopener noreferrer"&gt;JSWorld 2024&lt;/a&gt; [ &lt;strong&gt;February 28 - March 1st, 2024&lt;/strong&gt;, Amsterdam ] - A 3-day JavaScript Celebration with 2500 JavaScript Developers flying in from 50+ countries. It looks like they have a lot of Vue and Frontend tech topics this year. Still, the list of speakers is truly awesome. And you should not limit yourself to just React.&lt;br&gt;
Tickets from: 1-day Ticket (valid 1 March) at RAI Amsterdam - €349 (ex VAT).&lt;/p&gt;

&lt;p&gt;🔥&lt;a href="https://react.paris/" rel="noopener noreferrer"&gt;React Paris&lt;/a&gt; [ &lt;strong&gt;March 22nd, 2024&lt;/strong&gt;, Paris ] - Expect talks about React Server Components, AI, Accessibility, Design, Suspense, Performance, State, Remix, Typescript, and more! A great lineup with Tejas Kumar, Atila Fassina, Aleksandra Sikora, Shaundai Person, and others promises a lot. Believe me, a few of them have been speaking at React Norway, a few are to speak this year, and a few I'd love to see in the near future at RN.&lt;br&gt;
Tickets from: Regular Bird Ticket €449.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.epicweb.dev/conf" rel="noopener noreferrer"&gt;Epic Web Conference 2024&lt;/a&gt; [ &lt;strong&gt;April 10-11, 2024&lt;/strong&gt;, Park City, Utah ] - The Full Stack Web Development Conference of Epic proportions. The mere presence of Remix guys is good enough for me. Workshops are a big plus. For me, a potential problem for US conferences is the cost of traveling. But I’m hopeful.&lt;br&gt;
Tickets from: Early bird $300.&lt;/p&gt;

&lt;p&gt;🔥&lt;a href="https://www.reactmiami.com/" rel="noopener noreferrer"&gt;React Miami&lt;/a&gt; [ &lt;strong&gt;April 19-20, 2024&lt;/strong&gt;, Miami, Florida ] - A React community-centered celebration created by developers for developers and easily one of the best React conferences on the other side of the Atlantic Ocean :-) Vercel, Mux, Wix, Stately (2022 Reatc Norway sponsors) people alongside Theo Browne the YouTuber, Swyx, Wes Bos, Kent C. Dodds, Angie Jones, Brian Douglas, and others.&lt;br&gt;
Tickets from: Early Bird All Access Ticket $399.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://conf.react.dev/" rel="noopener noreferrer"&gt;React Conf 2024&lt;/a&gt; [ &lt;strong&gt;May 15-16, 2024&lt;/strong&gt;, The Westin Lake Las Vegas Resort &amp;amp; Spa, Henderson, Nevada ] - Join Meta, Callstack, and the React team for the 7th React Conf. Hear from the React team.&lt;br&gt;
Tickets from: Ticket Lottery (limited availability).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://athens.cityjsconf.org/" rel="noopener noreferrer"&gt;CityJS Athens 2024&lt;/a&gt; [ &lt;strong&gt;June 6-8, 2024&lt;/strong&gt;, Athens Grece ] - Two days of warm-up Workshops and Meet-ups, followed by a One-day Javascript Conference. 25 speakers and six workshops.&lt;br&gt;
Ticket from: Early bird €108&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reactsummit.com/" rel="noopener noreferrer"&gt;React Summit&lt;/a&gt; [ &lt;strong&gt;June 14 - 18, 2024&lt;/strong&gt;, Amsterdam ] - Every year, they pull impressive numbers, and there's no difference this year as well. 60+&lt;br&gt;
Speakers sharing latest insights, 10K+ Devs from all over the globe. Really cool lineup building up as well. However, I'm scheduled for a better one on June 14th 😕&lt;br&gt;
Tickets from: Regular in-person Jun 14th and remote June 18th, €560.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reactnorway.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;🔥React Norway&lt;/strong&gt;&lt;/a&gt; [ &lt;strong&gt;June 14th, 2024, Farris Bad Hotel in Larvik, Norway&lt;/strong&gt; ] - RN is an exclusive (250 attendees only) annual React and frontend tech conference. The 2024 conference will be our 4th one, and with all the talks, brunost, and bikes flying around last year, it’s gonna be challenging to top last year’s event. Thankfully, we already have Aleksandra Sikora, Vinicius Dallacqua, Elian Van Cutsem, and Sébastien Morel (as Conference MC) in our speakers lineup and are planning something a bit different.&lt;br&gt;
Tickets from: Early Bird €399 / then €499.&lt;/p&gt;

&lt;p&gt;Honorable mentions / more to consider:&lt;br&gt;
&lt;a href="https://javascript-days.de/" rel="noopener noreferrer"&gt;JSDays.de&lt;/a&gt; [ March 18-21, 2024, München, Germany ]&lt;br&gt;
&lt;a href="https://www.webdayconf.it/" rel="noopener noreferrer"&gt;Web Day 2024&lt;/a&gt; [ March 27th, 2024, Milano, Italy ]&lt;br&gt;
&lt;a href="https://jsheroes.io/" rel="noopener noreferrer"&gt;JSHeros&lt;/a&gt; [ May 23-24th 2024, Cluj-Napoca, Romania ]&lt;br&gt;
&lt;a href="https://www.renderatl.com/" rel="noopener noreferrer"&gt;Render Alt 2024&lt;/a&gt; [June 12 – 14, 2024, Atlanta, Georgia ]&lt;br&gt;
&lt;a href="https://www.react-next.com/" rel="noopener noreferrer"&gt;React Next&lt;/a&gt; [ June 24th, 2024, Tel-Aviv, Israel ]&lt;/p&gt;

&lt;p&gt;Why did I stop in June? Vacation. Rest, recupe, and then start all over again in August. Look for the follow-up to this, then.&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>The Best Practices for Tech Writing</title>
      <dc:creator>Nebojsa Radakovic</dc:creator>
      <pubDate>Tue, 20 Dec 2022 11:32:55 +0000</pubDate>
      <link>https://forem.com/cookieduster_n/the-best-practices-for-tech-writing-2hgg</link>
      <guid>https://forem.com/cookieduster_n/the-best-practices-for-tech-writing-2hgg</guid>
      <description>&lt;p&gt;&lt;strong&gt;👊NOTE:&lt;/strong&gt; &lt;em&gt;Last week, &lt;a href="https://crystallize.com/" rel="noopener noreferrer"&gt;Crystallize&lt;/a&gt; had a team gathering in Portugal, and I was tasked to talk with our devs about tech writing, docs, and blog. What you see here is the gist of that talk turned into a blog post.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Devs, why don’t you write more? What’s stopping you? Language? Topics? Lack of interest. Impostor syndrome? You don’t have it in you? I can go on...but... I hope it is a combination of you've never thought about writing before, and you just need a little more motivation.&lt;/p&gt;

&lt;p&gt;Whatever the case may be, there are a couple of good reasons why you should start writing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Writing helps you grow as a person and developer.&lt;/strong&gt; You see, by outlining your ideas on a topic of interest, you actually delve further into the issue at hand and have a greater understanding of what you learned, what you could have improved upon, or what needs to be changed right away.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Writing helps you document your experience.&lt;/strong&gt; Since brain memory implants are not yet the standard for humans, writing down your experiences will help you in the long run. For example, when you need to address a similar issue on a new project, it’s easier to have it written down already than trying to remember the solution. Or, if you write for the public, sharing your experience might help you get feedback from the audience and learn a thing or two.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Writing is networking for introverts.&lt;/strong&gt; I generalize here, but I’ve found most devs to be introverts (hell, even I am an introvert, but I fake the extrovert part of me). Seriously, by sharing your writing, you grow your network of internet friends across channels ie writing makes your networking that much easier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recognition of your work and your expertise.&lt;/strong&gt; I’ll talk about it a bit later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can write for yourself, which is fine, and you should do it, but I am not really interested in your diary (unless you have nice pics to share with it). Or you can write just like &lt;a href="https://en.wikipedia.org/wiki/Franz_Kafka" rel="noopener noreferrer"&gt;Franz Kafka&lt;/a&gt; did for the better part of his life. But waiting for someone else to release your writing after your death won’t help us as a company (unless royalties go to us). So, I’m not interested in that either.&lt;/p&gt;

&lt;p&gt;However, I am interested in you writing docs and for our blog and in you covering dev topics for our growing dev audience.&lt;/p&gt;

&lt;h2&gt;
  
  
  That sounds great, but how do I start writing?
&lt;/h2&gt;

&lt;p&gt;There are a couple of things you should be aware of right from the start. Don’t be put off by them. I promise you the rewards you get (besides a beer from me) are spectacular. So...&lt;/p&gt;

&lt;h3&gt;
  
  
  Finding the time
&lt;/h3&gt;

&lt;p&gt;It takes a while to do proper research and write a post. It also takes knowing what you want to write about, your intended audience, and what problems you are solving for your audience with your writing.&lt;/p&gt;

&lt;p&gt;Now, there are three types of posts you guys can be involved with in company and plenty more at free options like Dev.to, Hashnode, Medium, etc. But let’s stick to our company blog. I’m open to talking about others. You can  DM me. So...our topics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Labor of love, i.e., topics you care about and you have an insight you’d like to share&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Topic/keyword posts, i.e., topics we as a company are interested in and would like to appear/rank for&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Case studies, i.e., posts/articles on things we do for our product and our clients&lt;br&gt;
Writing each one of these requires a bit of a different approach. But they also have a couple of common things you need to be aware of or tackle before starting writing.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Story and audience
&lt;/h3&gt;

&lt;p&gt;Whatever you want to write about, you need a story as to why you are writing about it in the first place. What solution/value would be reading the post bring to your audience? What problems have you faced, and how did you overcome them? What did you learn?&lt;/p&gt;

&lt;p&gt;I like to say that &lt;strong&gt;the best way to learn is from the experience of others and personal mistakes&lt;/strong&gt;. That really seems to be the case when it comes to content and the internet, and the B2B approach. People read more and relate more to posts that are written from experience. That seems to be more and more true for Google results as well, being that it is getting better at understanding the intent behind the searched keyword.&lt;/p&gt;

&lt;p&gt;So you’ll need to convey &lt;strong&gt;a story that would lure your audience and give them what they want, the way they want it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We'd all be writers if there is a recipe for the above. There is none. But some tips can help you get better at writing. And that might help you nail the above.&lt;/p&gt;

&lt;h3&gt;
  
  
  Writing steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Set goals. Know exactly how much time you have to finish writing. &lt;/li&gt;
&lt;li&gt;Set a timer. i.e., I'll start now.&lt;/li&gt;
&lt;li&gt;Find your external sources before you write. This is part of the research phase.&lt;/li&gt;
&lt;li&gt;Create an outline. Structure before writing.&lt;/li&gt;
&lt;li&gt;Force yourself to write straight through to the end. Don't self-edit as you go!&lt;/li&gt;
&lt;li&gt;Write the body of the article and THEN write the intro.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Writing tips
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Do proper research on the topic you are covering.&lt;/strong&gt; Go beyond the first ten spots in Google search for a couple of keywords. Read a couple of those annoying Readers also enjoyed links. Reddit for answers. Follow the rabbit hole just as you would while watching YouTube or TikTok videos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make sure you are reading credible sources.&lt;/strong&gt; Don’t look for sources that would only back up your claim. Look for sources that have merit to their word and would prove your claim is right. Or wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep your content organized.&lt;/strong&gt; That means you should have the beginning, the middle, and the end to your story. That also means you should organize your content by the HTML hierarchy. The  elements are there for a reason, and the most obvious one is to keep your writing in an organized structure so the readers (and search engines), if they want, can skim the content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For those interested in the black arts.&lt;/strong&gt; Use the inverted pyramid style of content writing used by true journalists. The top of the inverted pyramid summarizes the most important elements of a story in order to draw the reader in and get their full attention. The parts that follow go into detail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make the TITLE and the first paragraph that stands out.&lt;/strong&gt; You can write the best essay ever, but it would mean nothing if you fail to spark interest in your audience. In today’s world of TITLE skimming, having a catch TITLE and a first paragraph is all you have to spark an interest. The simple reason behind this, really. In today’s oversaturated digital world, the average human attention span is 8 seconds. Even goldfish (9 seconds) are better than humans.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Images and links draw attention.&lt;/strong&gt; One way to tackle the attention problem is with images/videos. They re-spark attention. Walls of words are dull, however interesting a topic might be. Words and images are powerful when making a point or allowing a break for your audience (btw you don’t have to use gifs all the time). Links to resources that inspired you or helped you understand something or back up your claim proves you’ve done proper research.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Video content&lt;/strong&gt; offers a more immediate experience with much more information served in a short time than a simple blog post. It triggers an emotional response much faster than simple blog posts, on which ENGAGEMENT can be, well, exploited. Engaged viewers are more likely to share the video with others. They spend more time on your website, thus allowing you to exploit them to gain exposure, increase your traffic, brand your product, or earn additional revenue with your video ads.&lt;/p&gt;

&lt;h3&gt;
  
  
  What about style/voice, grammar, and all that?
&lt;/h3&gt;

&lt;p&gt;Well, no one can tell you how to write. Your voice/style develops and changes over time, just like you do. &lt;strong&gt;People don’t say practice makes perfect for nothing.&lt;/strong&gt; I think your style is somewhere between the way you talk, dry tech documentation, the topic you are covering, and your target audience.&lt;/p&gt;

&lt;p&gt;As far as grammar is concerned, even native English speakers get it wrong sometimes. The best we can do is play it by ear (like I do), use what you’ve learned so far (like I do), learn more by reading in English (like I do), and cheat with Grammarly or some other tool (like I do).&lt;/p&gt;

&lt;h2&gt;
  
  
  Why should you write?
&lt;/h2&gt;

&lt;p&gt;You’ll make my job that much easier for one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://crystallize.com/blog/word-of-mouth-marketing" rel="noopener noreferrer"&gt;Word of mouth&lt;/a&gt;&lt;/strong&gt; is the most successful way of promoting a brand or a product. Modern-day businesses have that option online, mostly thanks to social media. I’m not talking about shares, likes, reviews, and comments. I’m talking about the employer and employee branding.&lt;/p&gt;

&lt;p&gt;Quickly, the overview of both.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is employer branding?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Employer branding&lt;/strong&gt; is a term associated with what a brand does to promote itself as a fantastic workplace. Today it is not nearly enough just to offer a good paycheck and the right conditions for a job opening. To get the best talent, companies need to stand out with their company culture and code of conduct that resonates with their candidates. And other perks (like annual retreats or beer money).&lt;/p&gt;

&lt;h3&gt;
  
  
  What is employee branding?
&lt;/h3&gt;

&lt;p&gt;On the other hand, &lt;strong&gt;employee branding&lt;/strong&gt; is usually associated with how to shape employees’ behavior so that they project the &lt;strong&gt;brand identity&lt;/strong&gt; through their everyday work behavior. Employee branding is about getting your employees on board with who you are, what you do, and what you as a company stand for. Then, through social sharing and word of mouth, convey those brand messages in the best possible light.&lt;/p&gt;

&lt;p&gt;Sounds fun, right?&lt;/p&gt;

&lt;p&gt;For companies, there are huge benefits to practicing both of these. But here, I'd like to talk about employee branding from a different perspective, i.e., &lt;em&gt;not what you can do for your brand but what your brand can do for you.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits of employee branding
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Promotion and building of your personal brand.&lt;/strong&gt; The stronger the brand you work for is, the stronger your personal brand is. Think of it this way, when you see someone is working for Google, Facebook or Crystallize, you immediately assume he/she's got the knowledge. For startups, brand strength is built with product quality, marketing efforts, and employee branding (think Netlify, think their dev advocates, and how they, with their name, give strength to the company just as the company gives strength to their names.).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credibility.&lt;/strong&gt; By telling/sharing brand stories, you add credibility to the brand, the story itself, and your part in it. For example, Ahrefs CMO frequently shares its internal scheduling and hiring processes. By being transparent about what they do and how they do it, they influence how the community of their interest, SEOs, perceive them. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authoritativeness.&lt;/strong&gt; Being a part of an authoritative source/brand pours some of that authority on you as well (remember what I mentioned for people that work for Google, well...that’s it). &lt;/p&gt;

&lt;p&gt;These three influence how people perceive you and your abilities. Are you someone that is in the know-how? Are you easy to work with? What are your main interests in a job? And by telling a story about your work, your company, and how you are telling it, you directly influence the brand you work for.&lt;/p&gt;

&lt;p&gt;And YES, writing is one thing that works amazingly well for both us as a company and you as a &lt;strong&gt;PERSONAL BRAND&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Side note
&lt;/h3&gt;

&lt;p&gt;Candidates who want to know more information about working for a certain company prefer talking to the employees of the company as opposed to talking to the employer. On the other side of the spectrum, HRs who want to know more about candidates prefer talking to previous employers.&lt;/p&gt;

&lt;p&gt;Like it or not, we live in the age of social media, and to some extent, if it does not appear on soc. media it did not happen. I've learned it the hard way because I never actually wanted to participate in any kind of employee branding. TBH at one time, this diminished my prospects of finding new ventures because I did not have actual proof of work.&lt;/p&gt;

&lt;p&gt;I opted out for a different approach i.e., provide value upfront when applying for work, which in my case worked, but I think it would have been so much easier for me if I had soc.media proof.&lt;/p&gt;

&lt;p&gt;Then again, I would not become such a sweet talker :-)&lt;/p&gt;

&lt;h2&gt;
  
  
  To wrap things up...
&lt;/h2&gt;

&lt;p&gt;Get active, get creative, and get going! Don’t be afraid of failure. You don’t think of it while coding, so why would you burden yourself with it when writing?&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
