<?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: vanxxx</title>
    <description>The latest articles on Forem by vanxxx (@_d1b19162445525f552c0e).</description>
    <link>https://forem.com/_d1b19162445525f552c0e</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%2F3730161%2F8cedfb5c-f5be-43ae-b342-8c4cf6bb803c.jpg</url>
      <title>Forem: vanxxx</title>
      <link>https://forem.com/_d1b19162445525f552c0e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/_d1b19162445525f552c0e"/>
    <language>en</language>
    <item>
      <title>I built a "Single Source of Truth" for OpenClaw: Docs, Troubleshooting, and a Skills Leaderboard</title>
      <dc:creator>vanxxx</dc:creator>
      <pubDate>Tue, 10 Feb 2026 15:47:16 +0000</pubDate>
      <link>https://forem.com/_d1b19162445525f552c0e/i-built-a-single-source-of-truth-for-openclaw-docs-troubleshooting-and-a-skills-leaderboard-2c5b</link>
      <guid>https://forem.com/_d1b19162445525f552c0e/i-built-a-single-source-of-truth-for-openclaw-docs-troubleshooting-and-a-skills-leaderboard-2c5b</guid>
      <description>&lt;p&gt;If you’ve ever tried to onboard a tool from scattered docs, random issues, and community snippets, you know how much time gets lost.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;OpenClaw Guide&lt;/strong&gt; to solve that pain for OpenClaw users:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://open-claw.online" rel="noopener noreferrer"&gt;https://open-claw.online&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The site currently includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Step-by-step setup docs (Windows + VPS)&lt;/li&gt;
&lt;li&gt;Channel integration guides (Telegram / WhatsApp / Feishu)&lt;/li&gt;
&lt;li&gt;Troubleshooting playbooks&lt;/li&gt;
&lt;li&gt;A skills leaderboard with periodic data refresh&lt;/li&gt;
&lt;li&gt;Multilingual support (EN + ZH)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I made it
&lt;/h2&gt;

&lt;p&gt;I wanted one place that is practical, searchable, and operations-focused — not just feature descriptions.&lt;/p&gt;

&lt;p&gt;The goal is simple: reduce setup friction and make debugging faster for real users.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I’d love feedback on
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Which missing guides would help most?&lt;/li&gt;
&lt;li&gt;What parts are unclear or too long?&lt;/li&gt;
&lt;li&gt;What would make troubleshooting pages more actionable?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have 2 minutes, I’d really appreciate your feedback:&lt;br&gt;
&lt;a href="https://open-claw.online" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>openclaw</category>
      <category>showdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I built a home generator cost calculator with Next.js 14 and Dynamic Routing</title>
      <dc:creator>vanxxx</dc:creator>
      <pubDate>Sat, 24 Jan 2026 13:07:12 +0000</pubDate>
      <link>https://forem.com/_d1b19162445525f552c0e/i-built-a-home-generator-cost-calculator-with-nextjs-14-and-dynamic-routing-1akh</link>
      <guid>https://forem.com/_d1b19162445525f552c0e/i-built-a-home-generator-cost-calculator-with-nextjs-14-and-dynamic-routing-1akh</guid>
      <description>&lt;p&gt;Hello Dev.to community! &lt;/p&gt;

&lt;p&gt;I've recently been working on a side project to solve a specific problem: pricing transparency in the home services market.&lt;/p&gt;

&lt;p&gt;Most "cost calculators" online are just static forms that spit out a random range. I wanted to build an engineering-grade calculator that takes real variables into account—like trenching distance, load shedding, and local labor rates.&lt;/p&gt;

&lt;p&gt;Here is how I built HomeGenGuide using Next.js 14 (App Router), TypeScript, and Tailwind CSS.&lt;/p&gt;

&lt;p&gt;🛠️ The Tech Stack&lt;br&gt;
Framework: Next.js 14 (App Router)&lt;/p&gt;

&lt;p&gt;Language: TypeScript&lt;/p&gt;

&lt;p&gt;Styling: Tailwind CSS&lt;/p&gt;

&lt;p&gt;Deployment: Vercel&lt;/p&gt;

&lt;p&gt;I chose the App Router specifically for its Server Components capabilities, which are crucial for the SEO architecture I planned (more on that below).&lt;/p&gt;

&lt;p&gt;💡 Challenge 1: The Logic (It's not just A + B)&lt;br&gt;
The core feature is the calculator. I moved away from simple arithmetic and implemented a logic layer that mimics how a contractor actually quotes a job.&lt;/p&gt;

&lt;p&gt;I created a utility function calculateQuote that handles edge cases. For example, if the generator is too far from the gas meter, we need to account for trenching costs per foot.&lt;/p&gt;

&lt;p&gt;Here is a snippet of the logic in lib/calculator.ts:&lt;/p&gt;

&lt;p&gt;TypeScript&lt;br&gt;
export function calculateQuote(inputs: CalculatorInputs, laborFactor: number = 1.0) {&lt;br&gt;
  // 1. Base Equipment Cost (MSRP)&lt;br&gt;
  let equipCost = inputs.size === 'large' ? 6500 : 4500;&lt;/p&gt;

&lt;p&gt;// 2. Base Labor (Adjusted by local city factor)&lt;br&gt;
  let laborCost = 3500 * laborFactor; &lt;/p&gt;

&lt;p&gt;// 3. Distance Correction (Trenching costs)&lt;br&gt;
  // If distance &amp;gt; 50ft, add $15/ft for digging&lt;br&gt;
  if (inputs.distance &amp;gt; 50) {&lt;br&gt;
      laborCost += (inputs.distance - 50) * 15; &lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;// 4. Load Management&lt;br&gt;
  if (inputs.acUnits &amp;gt;= 2) equipCost += 350; // Needs load shedding module&lt;/p&gt;

&lt;p&gt;const total = equipCost + laborCost;&lt;/p&gt;

&lt;p&gt;return {&lt;br&gt;
    min: Math.floor(total * 0.95),&lt;br&gt;
    max: Math.ceil(total * 1.15),&lt;br&gt;
  };&lt;br&gt;
}&lt;br&gt;
By keeping this logic pure, I can easily test it and reuse it across different components.&lt;/p&gt;

&lt;p&gt;🌍 Challenge 2: Scaling to 300+ Cities (Dynamic Routing)&lt;br&gt;
One of my goals was to provide localized data (e.g., installation costs in Houston vs. New York are very different). Instead of manually creating pages, I leveraged Next.js Dynamic Routes.&lt;/p&gt;

&lt;p&gt;I structured my data in a JSON file to act as a lightweight database:&lt;/p&gt;

&lt;p&gt;TypeScript&lt;br&gt;
// data/locations.json&lt;br&gt;
type CityData = {&lt;br&gt;
  slug: string;        // e.g., "houston"&lt;br&gt;
  stateSlug: string;   // e.g., "texas"&lt;br&gt;
  laborFactor: number; // Used to adjust the calculator&lt;br&gt;
  climateRisk: string; // e.g., "Hurricanes"&lt;br&gt;
};&lt;br&gt;
Then, using the [state]/[city]/page.tsx structure, I can generate pages that are context-aware. The page knows that "Houston" has a higher risk of hurricanes and a specific labor rate, passing that laborFactor directly into the Calculator component.&lt;/p&gt;

&lt;p&gt;TypeScript&lt;br&gt;
// app/locations/[state]/[city]/page.tsx&lt;br&gt;
export async function generateStaticParams() {&lt;br&gt;
  // Generates static paths for all 300+ cities at build time&lt;br&gt;
  return cities.map((city) =&amp;gt; ({&lt;br&gt;
    state: city.stateSlug,&lt;br&gt;
    city: city.slug,&lt;br&gt;
  }));&lt;br&gt;
}&lt;br&gt;
This approach allows the site to be incredibly performant because most of the heavy lifting happens at build time on Vercel.&lt;/p&gt;

&lt;p&gt;🎨 UI/UX: The "Wizard" Pattern&lt;br&gt;
To avoid overwhelming users with complex engineering questions, I built the UI as a multi-step wizard.&lt;/p&gt;

&lt;p&gt;I used local state to track progress and give real-time feedback. One thing I learned: always give immediate feedback. As soon as a user toggles "Propane" vs "Natural Gas," the estimated price range updates instantly without a page reload. It makes the tool feel "alive."&lt;/p&gt;

&lt;p&gt;🚀 What's Next?&lt;br&gt;
I'm currently working on refining the Schema Markup to ensure Google understands that this is a Service/Tool application. I'm also planning to add a "Compare" feature to visualize the difference between brands like Generac and Kohler.&lt;/p&gt;

&lt;p&gt;🔗 Live Demo&lt;br&gt;
This has been a fun project to practice the new Next.js 14 features. If you are interested in the code structure or want to see the calculator in action, check it out here:&lt;/p&gt;

&lt;p&gt;👉 Live Site: &lt;a href="https://www.home-generator-installation.com" rel="noopener noreferrer"&gt;https://www.home-generator-installation.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear your feedback on the UX or the calculation logic!&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
