<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: wuki</title>
    <description>The latest articles on DEV Community by wuki (@wuki).</description>
    <link>https://dev.to/wuki</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2529637%2F35b9969b-be00-4b22-a967-93a36b8ae0ed.jpeg</url>
      <title>DEV Community: wuki</title>
      <link>https://dev.to/wuki</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wuki"/>
    <language>en</language>
    <item>
      <title>Skyrocket B2B Reply Rates with Autonomous AI Outreach</title>
      <dc:creator>wuki</dc:creator>
      <pubDate>Fri, 27 Mar 2026 16:23:11 +0000</pubDate>
      <link>https://dev.to/wuki/skyrocket-b2b-reply-rates-with-autonomous-ai-outreach-56h7</link>
      <guid>https://dev.to/wuki/skyrocket-b2b-reply-rates-with-autonomous-ai-outreach-56h7</guid>
      <description>&lt;p&gt;&lt;strong&gt;Skyrocket B2B Reply Rates with Autonomous AI Outreach&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cold emails used to be a numbers game. Send thousands of generic messages and hope a few replies trickle in. But times have changed. Today, B2B buyers ignore anything that smells like a template. If you want consistent replies, you need personalization at scale without spending all day researching prospects.&lt;/p&gt;

&lt;p&gt;Autonomous AI outreach changes that equation completely. Instead of manually hunting for leads and writing every email yourself, smart systems now handle the entire process from discovery to follow-up. The result? Higher reply rates, less time wasted, and more qualified conversations.&lt;/p&gt;

&lt;p&gt;In this post, you'll discover exactly how autonomous AI outreach works, why it's outperforming traditional cold email methods, and the practical steps you can take to improve your own B2B reply rates dramatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Traditional Cold Outreach Falls Short
&lt;/h2&gt;

&lt;p&gt;Most B2B companies still rely on outdated outreach tactics. Sales teams build lead lists in spreadsheets, scrape LinkedIn manually, and send templated emails that look identical to hundreds of others.&lt;/p&gt;

&lt;p&gt;The numbers tell the story. Average cold email reply rates hover between 1% and 5% for most businesses. Many campaigns perform even worse. Yet the time investment remains massive. Researching prospects, writing sequences, tracking replies, and following up consistently eats up dozens of hours every week.&lt;/p&gt;

&lt;p&gt;Furthermore, buyers have grown skeptical. They receive dozens of sales emails daily. Generic approaches that don't reference specific pain points or recent company activity get ignored or marked as spam.&lt;/p&gt;

&lt;p&gt;On the other hand, when someone receives an email that feels truly relevant, response rates jump. The challenge has always been achieving that level of relevance without burning through your entire work week.&lt;/p&gt;

&lt;p&gt;This is precisely where autonomous AI outreach makes a difference. These systems combine lead discovery and hyper-personalized messaging in one continuous workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Autonomous AI Outreach Actually Works
&lt;/h2&gt;

&lt;p&gt;Autonomous AI outreach goes far beyond basic email automation. The best platforms don't just send messages on a schedule. They handle the full cycle: finding prospects, understanding their needs, crafting relevant emails, and managing follow-ups intelligently.&lt;/p&gt;

&lt;p&gt;First, you describe your ideal customer and what you offer. The AI then searches the web and social platforms to identify companies and individuals who match those criteria. It looks at recent funding news, hiring patterns, technology stacks, and other buying signals.&lt;/p&gt;

&lt;p&gt;Next, it researches each prospect individually. Instead of surface-level data like job title and company name, the system pulls context that actually matters: recent announcements, challenges the company faces, and specific ways your solution could help.&lt;/p&gt;

&lt;p&gt;Then comes the personalization phase. The AI writes every email from scratch based on that research. These aren't templated messages with first names swapped in. They're original emails that reference real details about the recipient's business.&lt;/p&gt;

&lt;p&gt;Meanwhile, the system manages timing intelligently. It sends follow-ups based on engagement signals rather than rigid schedules. If someone opens an email but doesn't reply, it adjusts the next message accordingly.&lt;/p&gt;

&lt;p&gt;Finally, everything feeds into a clear analytics dashboard. You can see open rates, reply rates, and which messages work best. This data helps the AI improve future campaigns automatically.&lt;/p&gt;

&lt;p&gt;ClientHunter takes this approach further by making the entire process hands-off after initial setup. Users connect their email account, describe their offering and target audience, and the platform handles everything else autonomously.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Benefits of Using AI for Cold Outreach
&lt;/h2&gt;

&lt;p&gt;Businesses that adopt autonomous AI outreach see improvements across several important areas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time savings stand out first.&lt;/strong&gt; Traditional outreach requires constant manual work. With autonomous systems, that effort drops dramatically. Many users report saving 80% or more of the time they previously spent on lead generation. This frees founders and sales teams to focus on closing deals and improving their product instead of grinding through inboxes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Higher reply rates follow naturally.&lt;/strong&gt; Because each email draws from real research about the recipient, the messages feel relevant. Instead of broadcasting the same pitch to everyone, the AI crafts communications that speak directly to individual situations. Early users of platforms like ClientHunter have reported reply rates 4x higher than their previous manual campaigns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better qualified leads emerge too.&lt;/strong&gt; Autonomous systems don't just find email addresses. They qualify prospects based on clear signals that indicate buying intent. This means fewer conversations with people who will never become customers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost efficiency improves significantly.&lt;/strong&gt; Hiring an outreach agency often costs thousands per month. Building an in-house team takes even more. AI-powered platforms deliver similar or better results at a fraction of the cost. ClientHunter's plans start at $29 per month, making sophisticated outreach accessible even for early-stage companies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consistency becomes possible.&lt;/strong&gt; Humans get busy. We forget follow-ups or lose momentum during hectic weeks. Autonomous AI never forgets. It keeps campaigns running in the background, sending messages and following up at optimal times even when you're focused on other priorities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compliance and reputation protection matter more than ever.&lt;/strong&gt; Modern platforms include built-in safeguards against spam complaints, automatic unsubscribe handling, and tools to maintain healthy sender scores. This protects your domain reputation over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Results from Autonomous AI Outreach
&lt;/h2&gt;

&lt;p&gt;The proof appears in actual campaign outcomes rather than marketing claims.&lt;/p&gt;

&lt;p&gt;One SaaS founder using ClientHunter booked 47 demos in a single month after previously struggling to get consistent replies. Another reported that the system now generates qualified leads and paying customers with almost no ongoing intervention.&lt;/p&gt;

&lt;p&gt;Across the platform, users collectively send over 10,000 emails daily. The average improvement in reply rates sits around 4.2x compared to previous methods, while users save roughly 87% of the time they used to spend on manual outreach.&lt;/p&gt;

&lt;p&gt;These aren't isolated success stories. Multiple founders mention the same pattern: they set up their first campaign in about five minutes, connect their email provider, and then watch as the system continuously works in the background.&lt;/p&gt;

&lt;p&gt;The emails don't sound robotic. Because the AI understands context and buying signals, the messages read as if a skilled researcher wrote them specifically for that prospect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started with Autonomous AI Outreach
&lt;/h2&gt;

&lt;p&gt;Ready to improve your B2B reply rates? The process is simpler than you might expect.&lt;/p&gt;

&lt;p&gt;Begin by clarifying your ideal customer profile. The more specific you can be about who you're targeting and why they need your solution, the better results you'll see. Vague targets lead to generic outreach, even with AI.&lt;/p&gt;

&lt;p&gt;Next, choose an email provider that integrates smoothly. ClientHunter works with Gmail, custom SMTP/IMAP setups, Resend, AgentMail, and most other services. Using a dedicated sending domain helps protect your main company email reputation.&lt;/p&gt;

&lt;p&gt;Then, set clear campaign goals. Are you looking for demo bookings, initial conversations, or content downloads? Different objectives require different email strategies and follow-up sequences.&lt;/p&gt;

&lt;p&gt;Start small while you test. Even though the system can scale quickly, running a few smaller campaigns first lets you see what messaging resonates with your audience. The analytics dashboard shows exactly which approaches generate replies.&lt;/p&gt;

&lt;p&gt;Pay attention to compliance from day one. Good platforms handle unsubscribe links, spam prevention, and GDPR requirements automatically. Still, review your content to ensure it provides genuine value rather than pure sales pressure.&lt;/p&gt;

&lt;p&gt;Monitor results regularly but resist the urge to micromanage every message. The strength of autonomous systems comes from letting the AI learn and improve based on real engagement data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing the Right AI Outreach Platform
&lt;/h2&gt;

&lt;p&gt;Not all AI outreach tools deliver the same results. Several factors separate basic automation from truly autonomous systems.&lt;/p&gt;

&lt;p&gt;Look for genuine lead discovery rather than just email sending. Many tools still require you to upload your own lead lists. The best platforms, including ClientHunter, find and qualify prospects autonomously based on your criteria.&lt;/p&gt;

&lt;p&gt;Personalization depth makes a huge difference. Surface-level name insertion barely moves the needle anymore. Effective systems analyze company news, technology choices, recent announcements, and other signals to create truly relevant messages.&lt;/p&gt;

&lt;p&gt;Campaign management flexibility matters too. You should be able to pause campaigns, adjust parameters, or modify targeting in real time without starting over.&lt;/p&gt;

&lt;p&gt;Analytics transparency helps you understand what's working. A good dashboard shows not just vanity metrics but actionable insights about message performance and reply quality.&lt;/p&gt;

&lt;p&gt;Finally, consider the support and compliance features. Strong platforms offer clear documentation, responsive support, and built-in safeguards that protect your sender reputation.&lt;/p&gt;

&lt;p&gt;ClientHunter combines these elements in one platform. Users set up projects in minutes, and the AI agents handle lead discovery, personalization, sending, and follow-up with minimal ongoing input.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Questions About AI Cold Outreach
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does this still count as cold email?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, but it feels much warmer. The messages reference specific details about the recipient's business, making them relevant rather than random.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will my emails get marked as spam?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When done correctly with proper personalization and compliance tools, spam rates stay low. Built-in features in modern platforms help maintain good sender scores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much setup time does it require?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most users complete initial setup in under 10 minutes. After that, the system runs autonomously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I still control the messaging tone?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Absolutely. Good platforms let you provide guidelines about your brand voice and preferred approach. The AI follows these instructions while still creating original copy for each prospect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What about data privacy?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Reputable platforms maintain GDPR compliance and clear data handling policies. They focus on publicly available business information rather than personal data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Taking Action on B2B Reply Rates
&lt;/h2&gt;

&lt;p&gt;Improving reply rates doesn't require hiring a large sales team or spending thousands on agencies. Autonomous AI outreach gives you sophisticated capabilities at reasonable cost.&lt;/p&gt;

&lt;p&gt;The businesses seeing the biggest gains combine smart technology with clear targeting and valuable offers. They don't just automate sending emails. They automate relevant, research-based communication that respects the recipient's time.&lt;/p&gt;

&lt;p&gt;ClientHunter was built specifically for this reality. It removes the repetitive research and writing work while delivering personalized outreach at scale. The platform handles lead discovery, email generation, follow-ups, and analytics in one streamlined system.&lt;/p&gt;

&lt;p&gt;Whether you're a solo founder bootstrapping customer acquisition or part of an established team looking to improve efficiency, autonomous AI outreach can dramatically change your results.&lt;/p&gt;

&lt;p&gt;Start with a clear understanding of your ideal customers. Test the approach on a focused segment. Measure what works and refine from there.&lt;/p&gt;

&lt;p&gt;The gap between average reply rates and exceptional ones isn't usually about having better offers. It's about reaching the right people with truly relevant messages at the right time.&lt;/p&gt;

&lt;p&gt;Autonomous AI makes that possible without consuming your entire schedule.&lt;/p&gt;

&lt;p&gt;Ready to see what consistent, high-quality replies could do for your business? ClientHunter offers a 7-day free trial with no credit card required. You can explore the platform, run your first campaign, and measure the results before committing to anything.&lt;/p&gt;

&lt;p&gt;Many users find that once they experience autonomous outreach, returning to manual methods feels impossible. The time savings and improved reply rates quickly become essential parts of their growth strategy.&lt;/p&gt;

&lt;p&gt;Your next qualified lead could be one well-researched email away. The difference now is that the research and writing don't have to come from you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try ClientHunter free for 7 days&lt;/strong&gt; and discover how autonomous AI outreach can transform your B2B lead generation.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Build an AI-powered blog for your NextJS app</title>
      <dc:creator>wuki</dc:creator>
      <pubDate>Sat, 05 Jul 2025 15:02:20 +0000</pubDate>
      <link>https://dev.to/wuki/build-an-ai-powered-blog-for-your-nextjs-app-3mo8</link>
      <guid>https://dev.to/wuki/build-an-ai-powered-blog-for-your-nextjs-app-3mo8</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Want to add a blog to your Next.js app, but don’t want to write every post by hand? Here’s how I plugged in NextBlog to automate content, keep things SEO-friendly, and let the robots do the heavy lifting—so I can focus on shipping features, not writing articles.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Automated My Blog
&lt;/h2&gt;

&lt;p&gt;I love building products, but writing blog posts? Not so much. I wanted my app to have a blog (for SEO, for users, for the “we’re alive!” signal), but I didn’t want to spend hours writing or wrangling guest posts.&lt;/p&gt;

&lt;p&gt;That’s when I found &lt;a href="https://nextblog.ai" rel="noopener noreferrer"&gt;NextBlog&lt;/a&gt;. It’s a tool that uses AI to generate blog content, and it has a dead-simple API. I figured: why not let it handle the writing, and just wire it up to my Next.js app?&lt;/p&gt;

&lt;p&gt;Here’s how I did it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Set Up NextJS and dependencies
&lt;/h2&gt;

&lt;p&gt;Create your NextJs project if you haven't already.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-next-app@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install react-markdown. We’ll use this to render the markdown content from NextBlog&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;react-markdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: Set Up NextBlog
&lt;/h2&gt;

&lt;p&gt;Nextblog is sick. You can use it for free to manage your blog and create unlimited posts.&lt;/p&gt;

&lt;p&gt;You also have the option to automatically generate and publish blogs daily as well with AI. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sign up at &lt;a href="https://nextblog.ai" rel="noopener noreferrer"&gt;nextblog.ai&lt;/a&gt; (free trial, no credit card needed).&lt;/li&gt;
&lt;li&gt;Create a project, fill in what your app does, who it’s for, and what kind of content you want.&lt;/li&gt;
&lt;li&gt;Grab your API key from the dashboard. (Don’t share this key—treat it like a secret.)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 3: Add Your API Key to Next.js
&lt;/h2&gt;

&lt;p&gt;In your Next.js project, add these to &lt;code&gt;.env.local&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;NEXTBLOG_API_KEY=your_api_key_here
NEXTBLOG_PROJECT_ID=your_project_id_here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart your dev server so Next.js picks up the new env vars.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Fetch and Render Blog Posts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Blog List Page (&lt;code&gt;app/blog/page.js&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/link&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Blog&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Latest posts and updates.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getBlogPosts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXTBLOG_API_KEY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;projectId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXTBLOG_PROJECT_ID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://nextblog.ai/api/blog/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;projectId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;revalidate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Failed to fetch blog posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;blogs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error fetching blog posts:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;BlogList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blogs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getBlogPosts&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Blog&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;blogs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;          &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cover_image_url&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cover_image_url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`/blog/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Read&lt;/span&gt; &lt;span class="nx"&gt;more&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/article&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="p"&gt;))}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Single Blog Post Page (&lt;code&gt;app/blog/[slug]/page.js&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;notFound&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/navigation&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ReactMarkdown&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-markdown&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getBlogPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXTBLOG_API_KEY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;projectId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXTBLOG_PROJECT_ID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://nextblog.ai/api/blog/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;projectId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;revalidate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Failed to fetch blog post&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error fetching blog post:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateMetadata&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getBlogPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Blog Post&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;openGraph&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;cover_image_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;BlogPost&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getBlogPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;notFound&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toLocaleDateString&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/time&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ReactMarkdown&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ReactMarkdown&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/article&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 5: That’s It—Let the Robots Write
&lt;/h2&gt;

&lt;p&gt;Now, whenever NextBlog generates a new post for your project, it’ll show up in your app automatically. No rebuilds, no copy-pasting, no “I’ll write that post tomorrow” guilt.&lt;/p&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: Is this good for SEO?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: Yep. NextBlog’s posts are optimized for search engines, and you can tweak the project description to steer the AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Can I edit posts?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: You can sync with Notion and edit there, or just use the API to fetch whatever you want.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Is it free?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: There’s a free trial. After that, it’s paid—but honestly, it’s cheaper than hiring a writer.&lt;/p&gt;




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

&lt;p&gt;I built this because I wanted to focus on shipping features, not writing blog posts. If you’re an indie hacker or solo dev, and you want a blog that updates itself, give NextBlog a try. It’s one less thing to worry about.&lt;/p&gt;

&lt;p&gt;If you have questions or want to see more advanced stuff (like caching, custom templates, or analytics), let me know in the comments!&lt;/p&gt;




&lt;p&gt;Happy shipping 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>nextjs</category>
      <category>react</category>
    </item>
    <item>
      <title>Roast My Landing Page – Any Feedback is Welcome!</title>
      <dc:creator>wuki</dc:creator>
      <pubDate>Thu, 05 Dec 2024 17:09:21 +0000</pubDate>
      <link>https://dev.to/wuki/roast-my-landing-page-any-feedback-is-welcome-5562</link>
      <guid>https://dev.to/wuki/roast-my-landing-page-any-feedback-is-welcome-5562</guid>
      <description>&lt;p&gt;Hey everyone,&lt;/p&gt;

&lt;p&gt;I recently revamped my landing page for a project I’ve been working on, and I’d love to get some honest feedback on it. The goal of the site is to attract users and clearly communicate the product’s value, but I feel like I might be missing something.&lt;/p&gt;

&lt;p&gt;Here’s the site: &lt;a href="https://xbeast.io" rel="noopener noreferrer"&gt;xbeast.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some specific things I’m curious about:&lt;/p&gt;

&lt;p&gt;• Is the value proposition clear right away?&lt;/p&gt;

&lt;p&gt;• Do the visuals and design feel professional and trustworthy?&lt;/p&gt;

&lt;p&gt;• Anything confusing or off-putting?&lt;/p&gt;

&lt;p&gt;I’m open to all critiques, so please don’t hold back!&lt;/p&gt;

&lt;p&gt;Thanks in advance for taking the time to check it out. I appreciate this community’s insights!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ui</category>
      <category>design</category>
    </item>
  </channel>
</rss>
