<?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: Michael Wang</title>
    <description>The latest articles on DEV Community by Michael Wang (@wangmander).</description>
    <link>https://dev.to/wangmander</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%2F3832721%2F2034197f-c335-451c-98ef-378bdec8160e.jpeg</url>
      <title>DEV Community: Michael Wang</title>
      <link>https://dev.to/wangmander</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wangmander"/>
    <language>en</language>
    <item>
      <title>How 6 Theme Families Replaced 1,000 Random Outputs</title>
      <dc:creator>Michael Wang</dc:creator>
      <pubDate>Sun, 22 Mar 2026 17:57:00 +0000</pubDate>
      <link>https://dev.to/wangmander/how-6-theme-families-replaced-1000-random-outputs-kp0</link>
      <guid>https://dev.to/wangmander/how-6-theme-families-replaced-1000-random-outputs-kp0</guid>
      <description>&lt;p&gt;Every AI website generator has the same problem: the output looks random. You prompt for a bakery site and get something that could be a SaaS landing page with a different color. The architecture underneath doesn't actually understand &lt;em&gt;type&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I spent two weeks rebuilding how &lt;a href="https://capsuleweb.site/?utm_source=devto&amp;amp;utm_medium=blog&amp;amp;utm_campaign=one-dollar-price" rel="noopener noreferrer"&gt;CapsuleWeb&lt;/a&gt; resolves visual identity, and the core decision was replacing open-ended style generation with six curated theme families.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Six Families
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;clean-editorial&lt;/strong&gt; — whitespace-forward, type-heavy, minimal color&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;modern-product&lt;/strong&gt; — sharp contrast, geometric, tech-native&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;soft-playful&lt;/strong&gt; — rounded corners, warm palette, approachable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;boutique-warm&lt;/strong&gt; — textured, earthy, small-business feel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;utility-local&lt;/strong&gt; — dense, information-first, no-nonsense&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;elegant-dark&lt;/strong&gt; — dark backgrounds, refined type, high contrast&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each family defines font pairings (Outfit, Fraunces, and others properly wired through the renderer), color logic, spacing ratios, and component behavior. When a user types a prompt, the system runs &lt;code&gt;resolveThemeFamily(archetype + vibe + color)&lt;/code&gt; to match intent to family before any layout generation starts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters Technically
&lt;/h2&gt;

&lt;p&gt;Before this, the 586-line monolithic renderer tried to handle every visual decision inline. I broke it into 11 focused components, each aware of which theme family it's operating under. A button in &lt;code&gt;boutique-warm&lt;/code&gt; has different padding, border-radius, and hover behavior than the same button in &lt;code&gt;utility-local&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This isn't cosmetic. It's structural. The theme family constrains the decision space so the AI generates &lt;em&gt;coherent&lt;/em&gt; pages instead of statistically average ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Gradient Problem
&lt;/h2&gt;

&lt;p&gt;One specific fix: I killed gradient sludge across all outputs. Earlier generations loved throwing muddy linear gradients on hero sections regardless of context. Now gradient use is family-gated — &lt;code&gt;elegant-dark&lt;/code&gt; gets subtle gradients, &lt;code&gt;clean-editorial&lt;/code&gt; gets none, &lt;code&gt;soft-playful&lt;/code&gt; gets them only on accent elements.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Changed in Output Quality
&lt;/h2&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%2Fn4k85jn8ztzy7ndux4qh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4k85jn8ztzy7ndux4qh.png" alt=" " width="800" height="320"&gt;&lt;/a&gt;&lt;br&gt;
A restaurant prompt now reliably lands in &lt;code&gt;boutique-warm&lt;/code&gt; or &lt;code&gt;utility-local&lt;/code&gt; depending on the vibe words used. A portfolio prompt resolves to &lt;code&gt;clean-editorial&lt;/code&gt; or &lt;code&gt;modern-product&lt;/code&gt;. The outputs feel like they belong to a category instead of floating in generic AI space.&lt;/p&gt;

&lt;p&gt;The whole generation still takes about 30 seconds and costs $1 with no account required. But the visual coherence gap between this and what shipped a month ago is significant.&lt;/p&gt;

&lt;p&gt;Constraining the design system made the AI better at its job. Fewer choices, better pages.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>design</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Deployment Latency Is a Solved Problem — Here's the Proof</title>
      <dc:creator>Michael Wang</dc:creator>
      <pubDate>Thu, 19 Mar 2026 17:53:45 +0000</pubDate>
      <link>https://dev.to/wangmander/deployment-latency-is-a-solved-problem-heres-the-proof-4aoh</link>
      <guid>https://dev.to/wangmander/deployment-latency-is-a-solved-problem-heres-the-proof-4aoh</guid>
      <description>&lt;h2&gt;
  
  
  The Experiment
&lt;/h2&gt;

&lt;p&gt;I wanted to answer a simple question: what is the actual minimum time between a user deciding they need a website and that website being live on the internet?&lt;/p&gt;

&lt;p&gt;Not the theoretical minimum. The real, measured, production minimum.&lt;/p&gt;

&lt;p&gt;The answer: &lt;strong&gt;27 seconds.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the Time Actually Goes
&lt;/h2&gt;

&lt;p&gt;I audited the deployment flow of every major website builder. Here's where time accumulates:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Average Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Account creation&lt;/td&gt;
&lt;td&gt;47s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email verification&lt;/td&gt;
&lt;td&gt;30s–5min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Template browsing&lt;/td&gt;
&lt;td&gt;2–8min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Template customization&lt;/td&gt;
&lt;td&gt;5–30min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain/subdomain config&lt;/td&gt;
&lt;td&gt;1–3min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publish + DNS propagation&lt;/td&gt;
&lt;td&gt;10s–48hrs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The actual compute — generating markup, writing files, configuring a subdomain, deploying to a CDN — takes under 10 seconds on modern infrastructure. Everything else is ceremony.&lt;/p&gt;

&lt;h2&gt;
  
  
  Removing the Ceremony
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://capsuleweb.site/?utm_source=devto&amp;amp;utm_medium=blog&amp;amp;utm_campaign=30-second-speed" rel="noopener noreferrer"&gt;CapsuleWeb&lt;/a&gt; was my testbed for this thesis. The entire user flow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write one sentence describing what you need&lt;/li&gt;
&lt;li&gt;Pay $1&lt;/li&gt;
&lt;li&gt;Receive a live URL on a &lt;code&gt;capsuleweb.site&lt;/code&gt; subdomain&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No account. No template picker. No editor. No DNS configuration.&lt;/p&gt;

&lt;p&gt;The architecture decisions that make this possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No accounts&lt;/strong&gt; — eliminates auth, verification, session management, and the entire "returning user" state machine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subdomain-only deployment&lt;/strong&gt; — no DNS propagation delay, no domain verification, instant routing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single prompt input&lt;/strong&gt; — no multi-step form, no configuration choices, no decision fatigue&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pre-warmed generation pipeline&lt;/strong&gt; — the LLM context and deployment infrastructure are always ready&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Tradeoff
&lt;/h2&gt;

&lt;p&gt;The obvious cost: no editing. Once your site is generated and deployed, that's it. There's no dashboard to return to, no account to log into.&lt;/p&gt;

&lt;p&gt;This is a deliberate constraint, not a missing feature. The target use case is people who need a page live &lt;em&gt;right now&lt;/em&gt; — an event page, a quick business listing, a resume link, a product landing page. For those cases, 27 seconds to live beats 27 minutes to perfect every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Proved
&lt;/h2&gt;

&lt;p&gt;Deployment latency was never a compute problem. It was always a product design problem. Every step in a traditional builder exists because someone decided to put it there, not because the user required it.&lt;/p&gt;

&lt;p&gt;Strip the steps that serve the platform instead of the user, and you discover that the internet already had the infrastructure for instant deployment. We just buried it under forms.&lt;/p&gt;




&lt;p&gt;The site is live at &lt;a href="https://capsuleweb.site/?utm_source=devto&amp;amp;utm_medium=blog&amp;amp;utm_campaign=30-second-speed" rel="noopener noreferrer"&gt;capsuleweb.site&lt;/a&gt;. One prompt, one dollar, one live URL. I'm curious what the dev community thinks about the no-account tradeoff — is it a dealbreaker or a feature?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>buildinpublic</category>
      <category>sideprojects</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
