<?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: deltacraft</title>
    <description>The latest articles on Forem by deltacraft (@deltacraft).</description>
    <link>https://forem.com/deltacraft</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%2F3818392%2F12dcd238-4fe6-43a0-9d48-1eccb63ec49e.png</url>
      <title>Forem: deltacraft</title>
      <link>https://forem.com/deltacraft</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/deltacraft"/>
    <language>en</language>
    <item>
      <title>I built a 3D audio visualizer and monetized it with Lemon Squeezy in a week</title>
      <dc:creator>deltacraft</dc:creator>
      <pubDate>Wed, 18 Mar 2026 03:55:34 +0000</pubDate>
      <link>https://forem.com/deltacraft/-i-built-a-3d-audio-visualizer-and-monetized-it-with-lemon-squeezy-in-a-week-2d69</link>
      <guid>https://forem.com/deltacraft/-i-built-a-3d-audio-visualizer-and-monetized-it-with-lemon-squeezy-in-a-week-2d69</guid>
      <description>&lt;p&gt;&lt;em&gt;If you’ve ever wanted to turn music into a visual — and get paid for it — here’s how I built and shipped exactly that in a week.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A week ago, I had a working Three.js audio visualizer sitting on my local machine with no monetization plan. Today, it’s live on Netlify, approved by Lemon Squeezy, and accepting paid subscribers at $9/month.&lt;/p&gt;

&lt;p&gt;Here’s exactly how I did it — including the pivot I had to make halfway through.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;3D Audio Visualizer Pro&lt;/strong&gt; is a browser-based app that takes audio input (microphone or file upload) and renders it as real-time 3D visuals using Three.js and the Web Audio API. It also lets you export the visuals as a video file (WebM/MP4) — which turned out to be the key to monetization.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://resilient-blini-664b4c.netlify.app" rel="noopener noreferrer"&gt;Live demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Three scenes are included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sphere&lt;/strong&gt; — expands and rotates with volume&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bars&lt;/strong&gt; — 32 rainbow frequency bars&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Particles&lt;/strong&gt; — 500 particles that accelerate with the beat&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The pivot: Chrome Extension → Web App (first)
&lt;/h2&gt;

&lt;p&gt;I originally built this as a Chrome extension — and I’m still working on that version in parallel. But halfway through, I realized the real monetization opportunity wasn’t in the extension itself. It was in &lt;strong&gt;video export&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Musicians and content creators need visualizer videos for YouTube, TikTok, and Instagram. That’s a recurring need, which means recurring revenue. A web app makes that much easier to deliver — so I decided to ship the web app first and validate the monetization model before going further with the extension.&lt;/p&gt;

&lt;p&gt;Switching only required replacing &lt;code&gt;chrome.tabCapture&lt;/code&gt; with &lt;code&gt;getUserMedia()&lt;/code&gt;. The entire Three.js rendering code carried over untouched. The pivot took less than a day.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Vanilla JS + Three.js r128 (CDN) — single &lt;code&gt;index.html&lt;/code&gt; file, no build step&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audio:&lt;/strong&gt; Web Audio API (&lt;code&gt;getUserMedia&lt;/code&gt; for mic, &lt;code&gt;createObjectURL&lt;/code&gt; for file input)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video export:&lt;/strong&gt; MediaRecorder API at 30fps, outputs WebM/MP4&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting:&lt;/strong&gt; Netlify free plan (commercial use allowed — Vercel Hobby is not)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payments:&lt;/strong&gt; Lemon Squeezy ($9/month, 7-day free trial, license key generation included)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No backend. No database. Just one HTML file deployed to Netlify.&lt;/p&gt;




&lt;h2&gt;
  
  
  The freemium model
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Free&lt;/th&gt;
&lt;th&gt;Pro ($9/month)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Visual scenes&lt;/td&gt;
&lt;td&gt;3 scenes (watermarked)&lt;/td&gt;
&lt;td&gt;All scenes, no watermark&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audio input&lt;/td&gt;
&lt;td&gt;Microphone only&lt;/td&gt;
&lt;td&gt;Mic + file upload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Video export&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ MP4 export&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The video export gate is the core of the monetization strategy. Casual users get a free visualizer to play with. Musicians who need clean, exportable content for their socials have a clear reason to upgrade.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Lemon Squeezy
&lt;/h2&gt;

&lt;p&gt;I compared several payment options:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Fee&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lemon Squeezy&lt;/td&gt;
&lt;td&gt;5% + $0.50&lt;/td&gt;
&lt;td&gt;Tax handling + license keys included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gumroad&lt;/td&gt;
&lt;td&gt;10% + $0.50&lt;/td&gt;
&lt;td&gt;Good for one-off digital products&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stripe direct&lt;/td&gt;
&lt;td&gt;2.9% + $0.30&lt;/td&gt;
&lt;td&gt;Cheapest, but needs a backend&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a solo developer shipping a SaaS MVP with zero infrastructure, Lemon Squeezy was the clear winner. They handle VAT/tax compliance across regions, which would otherwise be a legal headache. License key generation is built in, which I use to gate Pro features.&lt;/p&gt;

&lt;p&gt;The KYB/KYC review process took about 10 days from first application to approval. They asked for a live demo URL, product details, and SNS links — nothing unreasonable.&lt;/p&gt;

&lt;p&gt;At $10/sale, here’s what you actually take home: Stripe direct → $9.41, Lemon Squeezy → $9.00, Gumroad → $8.50. Once you’re past $2,000/month, Stripe direct starts making more sense — but until then, Lemon Squeezy’s tax handling and license key generation more than make up for the fee difference.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Firefox AMO&lt;/strong&gt; — porting the extension as a supplementary channel (1–3 days, free)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;itch.io listing&lt;/strong&gt; — reaching the creative coding / VJ community&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YouTube / TikTok demo videos&lt;/strong&gt; — the visualizer reacting to music is inherently shareable content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product Hunt launch&lt;/strong&gt; — once I’ve built more of an audience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Revenue target: $100/month within 1–2 months, $1,000/month within 3–6 months.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ship the MVP first.&lt;/strong&gt; I almost delayed launch to add more scenes. Don’t.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The export feature IS the product.&lt;/strong&gt; Nobody pays for a pretty visualizer. They pay for a tool that saves them time making content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Netlify free plan is genuinely good&lt;/strong&gt; for this kind of project. No cold starts, commercial use allowed, instant deploys from Git.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lemon Squeezy’s review takes time.&lt;/strong&gt; Submit early, keep your demo URL live during review, and respond to KYB requests as quickly as you can.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code changed the game for solo developers.&lt;/strong&gt; No engineering background. No build tooling expertise. Just describing what I wanted and iterating. The Three.js implementation would have taken me weeks without it.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;If you’re building something similar or have questions about the Three.js / Web Audio API implementation, drop a comment — happy to share more details.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://dev.to/deltacraft"&gt;deltacraft&lt;/a&gt; — solo dev, building in public.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>threejs</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>React Three Fiber vs Three.js: Which Should You Learn First?</title>
      <dc:creator>deltacraft</dc:creator>
      <pubDate>Thu, 12 Mar 2026 15:12:04 +0000</pubDate>
      <link>https://forem.com/deltacraft/-react-three-fiber-vs-threejsdotirawoxian-nixue-bubekika-2585</link>
      <guid>https://forem.com/deltacraft/-react-three-fiber-vs-threejsdotirawoxian-nixue-bubekika-2585</guid>
      <description>&lt;p&gt;If you’re getting into 3D on the web, you’ve probably hit this question fast: &lt;strong&gt;should I learn Three.js or React Three Fiber?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The short answer: it depends on where you’re starting from. Here’s how to decide.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s the Difference?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Three.js&lt;/strong&gt; is the foundation. It’s a JavaScript library that sits on top of WebGL and lets you build 3D scenes without writing raw GPU code. It’s framework-agnostic — works with vanilla JS, Vue, Svelte, whatever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;React Three Fiber (R3F)&lt;/strong&gt; is a React renderer for Three.js. It doesn’t replace Three.js — it wraps it. Under the hood, R3F is still Three.js. The difference is &lt;em&gt;how&lt;/em&gt; you write it.&lt;/p&gt;

&lt;p&gt;Here’s the same rotating cube in both:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three.js (imperative):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;geometry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;THREE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;BoxGeometry&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;material&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;THREE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;MeshStandardMaterial&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#c8ff00&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;cube&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;THREE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Mesh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;material&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cube&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;animate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;requestAnimationFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;animate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;cube&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rotation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mf"&gt;0.01&lt;/span&gt;
  &lt;span class="nx"&gt;renderer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;camera&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;animate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;React Three Fiber (declarative):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&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;useFrame&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;@react-three/fiber&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useRef&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;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Cube&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;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nf"&gt;useFrame&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rotation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mf"&gt;0.01&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;mesh&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;boxGeometry&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meshStandardMaterial&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#c8ff00"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;mesh&lt;/span&gt;&lt;span class="p"&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;p&gt;Same result. Very different mental model.&lt;/p&gt;




&lt;h2&gt;
  
  
  Learn Three.js First If…
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;You’re new to 3D entirely.&lt;/strong&gt;&lt;br&gt;
Three.js forces you to understand the fundamentals: scenes, cameras, renderers, geometries, materials, lights. These concepts exist in R3F too, but they’re abstracted. Learning Three.js first means you actually know what’s happening under the hood.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You’re not using React.&lt;/strong&gt;&lt;br&gt;
R3F only makes sense in a React project. If you’re working with vanilla JS, Vue, or any other stack, Three.js is your answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You want maximum control.&lt;/strong&gt;&lt;br&gt;
Three.js gives you direct access to every WebGL primitive. For highly optimized or unusual rendering requirements, that control matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  Learn React Three Fiber First If…
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;You already know React.&lt;/strong&gt;&lt;br&gt;
If hooks, components, and JSX are second nature to you, R3F will feel immediately intuitive. You can focus on learning 3D concepts without also learning a new imperative programming style.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You’re building a React app.&lt;/strong&gt;&lt;br&gt;
R3F integrates seamlessly with React state, routing, and the rest of your component tree. Managing 3D objects as React components is genuinely ergonomic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You want to move fast.&lt;/strong&gt;&lt;br&gt;
The R3F ecosystem — especially &lt;code&gt;@react-three/drei&lt;/code&gt; — gives you ready-made components for cameras, controls, environments, and effects. Things that take 50 lines in vanilla Three.js take 2 lines in R3F.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Honest Take
&lt;/h2&gt;

&lt;p&gt;Most working developers who use R3F learned Three.js first — even briefly. Understanding what a &lt;code&gt;Scene&lt;/code&gt;, &lt;code&gt;Camera&lt;/code&gt;, and &lt;code&gt;Renderer&lt;/code&gt; actually &lt;em&gt;are&lt;/em&gt; makes R3F much less magical and much more controllable.&lt;/p&gt;

&lt;p&gt;That said, if you’re a React developer who wants to add 3D to a project &lt;em&gt;now&lt;/em&gt;, starting with R3F is completely valid. You’ll pick up the Three.js concepts along the way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The recommended path:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Spend a weekend with raw Three.js — build a scene, add lights, move a camera&lt;/li&gt;
&lt;li&gt;Switch to R3F for everything after that&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Quick Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Three.js&lt;/th&gt;
&lt;th&gt;React Three Fiber&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Style&lt;/td&gt;
&lt;td&gt;Imperative&lt;/td&gt;
&lt;td&gt;Declarative (JSX)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Framework&lt;/td&gt;
&lt;td&gt;Agnostic&lt;/td&gt;
&lt;td&gt;React only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning curve&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Lower (if you know React)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Equivalent — components render outside React, no overhead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ecosystem&lt;/td&gt;
&lt;td&gt;Mature&lt;/td&gt;
&lt;td&gt;Growing fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Control&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;td&gt;Full (it’s still Three.js)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Any stack, deep control&lt;/td&gt;
&lt;td&gt;React projects, fast iteration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Want a Head Start?
&lt;/h2&gt;

&lt;p&gt;If you’ve decided to go the R3F route and want to skip the boilerplate, I put together a cheat sheet with the patterns I use most — hooks, camera setup, lighting, performance tips, and common &lt;code&gt;drei&lt;/code&gt; components:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://deltacraft.gumroad.com/l/kgmoo?layout=profile" rel="noopener noreferrer"&gt;R3F Cheat Sheet on Gumroad&lt;/a&gt; — $7&lt;/p&gt;

&lt;p&gt;It’s the reference I wish I had when I started.&lt;/p&gt;




&lt;p&gt;Which did you start with — Three.js or R3F? Drop a comment below.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>webdev</category>
      <category>threejs</category>
    </item>
    <item>
      <title>What is Three.js? And Why Every Developer Should Know It</title>
      <dc:creator>deltacraft</dc:creator>
      <pubDate>Thu, 12 Mar 2026 14:58:00 +0000</pubDate>
      <link>https://forem.com/deltacraft/-threejstohahe-kasositenazesubetenokai-fa-zhe-gazhi-rubekinanoka-2hl4</link>
      <guid>https://forem.com/deltacraft/-threejstohahe-kasositenazesubetenokai-fa-zhe-gazhi-rubekinanoka-2hl4</guid>
      <description>&lt;p&gt;If you’ve ever seen a website with a rotating 3D globe, an animated particle field, or a product you can spin around with your mouse — that was probably Three.js.&lt;/p&gt;

&lt;p&gt;But what &lt;em&gt;is&lt;/em&gt; it, exactly? And why should you care?&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem with Flat Websites
&lt;/h2&gt;

&lt;p&gt;Most websites are 2D. HTML and CSS are powerful, but they’re fundamentally flat — boxes, text, images stacked on a canvas.&lt;/p&gt;

&lt;p&gt;The browser, however, is capable of rendering full 3D graphics using something called &lt;strong&gt;WebGL&lt;/strong&gt;. The problem? Raw WebGL is brutal to write. Hundreds of lines of low-level code just to draw a single triangle.&lt;/p&gt;

&lt;p&gt;That’s where Three.js comes in.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three.js in One Sentence
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Three.js is a JavaScript library that makes 3D graphics in the browser actually possible for regular developers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It wraps the complexity of WebGL into an intuitive API. Instead of writing shader programs and buffer arrays, you write things like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;geometry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;THREE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;BoxGeometry&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;material&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;THREE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;MeshStandardMaterial&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#c8ff00&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;cube&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;THREE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Mesh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;material&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cube&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s a 3D cube. Four lines.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Can You Actually Build With It?
&lt;/h2&gt;

&lt;p&gt;Here are real things developers build with Three.js:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Portfolio hero sections&lt;/td&gt;
&lt;td&gt;Animated particle fields, floating 3D objects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product configurators&lt;/td&gt;
&lt;td&gt;Rotate and customize a product in 3D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data visualizations&lt;/td&gt;
&lt;td&gt;3D globe with live data points&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Games&lt;/td&gt;
&lt;td&gt;Browser-based 3D games&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Immersive landing pages&lt;/td&gt;
&lt;td&gt;Scroll-driven 3D animations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Google’s Data Arts Team — where Three.js creator Ricardo Cabello himself worked — has used it for interactive web experiences. But you don’t need a big team or a famous employer — individual developers build stunning things with it too.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three.js vs React Three Fiber
&lt;/h2&gt;

&lt;p&gt;If you’re a React developer, you’ll want to know about &lt;strong&gt;React Three Fiber (R3F)&lt;/strong&gt; — a React renderer for Three.js.&lt;/p&gt;

&lt;p&gt;Instead of imperative Three.js code, you write declarative JSX:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;mesh&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;boxGeometry&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meshStandardMaterial&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#c8ff00"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;mesh&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same result, but it fits naturally into your React component tree. State, hooks, context — all of it works exactly as you’d expect.&lt;/p&gt;

&lt;p&gt;R3F is now the standard way to use Three.js in React projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Should &lt;em&gt;You&lt;/em&gt; Learn It?
&lt;/h2&gt;

&lt;p&gt;Three reasons:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Your portfolio will stand out.&lt;/strong&gt;&lt;br&gt;
Most developer portfolios look identical. A 3D hero section immediately signals that you’re a developer who goes beyond the basics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The job market rewards it.&lt;/strong&gt;&lt;br&gt;
Three.js and WebGL skills are in demand for creative agencies, product companies, and startups building immersive experiences. It’s a genuine differentiator on a resume.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. It’s more accessible than you think.&lt;/strong&gt;&lt;br&gt;
You don’t need to understand the math behind 3D rendering. Three.js (and especially R3F) abstracts all of that. If you know JavaScript and React, you can start building 3D in an afternoon.&lt;/p&gt;


&lt;h2&gt;
  
  
  Getting Started in 5 Minutes
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm create vite@latest my-3d-app &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--template&lt;/span&gt; react
&lt;span class="nb"&gt;cd &lt;/span&gt;my-3d-app
npm &lt;span class="nb"&gt;install &lt;/span&gt;three @react-three/fiber @react-three/drei
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then drop this into a component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&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;Canvas&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;@react-three/fiber&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;OrbitControls&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;@react-three/drei&lt;/span&gt;&lt;span class="dl"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Scene&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Canvas&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ambientLight&lt;/span&gt; &lt;span class="na"&gt;intensity&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pointLight&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;mesh&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;boxGeometry&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meshStandardMaterial&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#c8ff00"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;mesh&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;OrbitControls&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Canvas&lt;/span&gt;&lt;span class="p"&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;p&gt;You now have a 3D cube you can rotate with your mouse. That’s your starting point.&lt;/p&gt;




&lt;h2&gt;
  
  
  Want to Skip the Setup?
&lt;/h2&gt;

&lt;p&gt;If you want to go straight to a production-ready 3D portfolio — with particle fields, scroll animations, and 5 different scene types — I built a starter kit that handles all of it:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://deltacraft.gumroad.com/l/bycly?layout=profile" rel="noopener noreferrer"&gt;Performance Cheat Sheet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Drop in your info, run &lt;code&gt;npm install&lt;/code&gt;, and you have a portfolio that actually stands out.&lt;/p&gt;




&lt;p&gt;What’s stopping you from adding 3D to your next project? Drop a comment — I read every one.&lt;/p&gt;




</description>
      <category>threejs</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I Built a 3D Developer Portfolio That Actually Stands Out (with React Three Fiber)Three Fiber (Step-by-Step)</title>
      <dc:creator>deltacraft</dc:creator>
      <pubDate>Wed, 11 Mar 2026 11:36:45 +0000</pubDate>
      <link>https://forem.com/deltacraft/build-a-stunning-3d-portfolio-with-react-three-fiber-step-by-step-59jk</link>
      <guid>https://forem.com/deltacraft/build-a-stunning-3d-portfolio-with-react-three-fiber-step-by-step-59jk</guid>
      <description>&lt;p&gt;Most developer portfolios look the same. A hero section, a projects grid, a contact form. Yours deserves better.&lt;/p&gt;

&lt;p&gt;In this post, I’ll show you how to build a portfolio with an animated particle system background, 5 different 3D scene types for your project cards, and scroll-based animations — all without deep Three.js knowledge.&lt;/p&gt;

&lt;p&gt;Here’s what the final result includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Floating particle field with dynamic connection lines in the hero section&lt;/li&gt;
&lt;li&gt;5 interchangeable 3D scenes: particles, orbit, wave, helix, sphere&lt;/li&gt;
&lt;li&gt;Framer Motion scroll reveals&lt;/li&gt;
&lt;li&gt;A single &lt;code&gt;config.js&lt;/code&gt; file to customize everything — no Three.js needed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;React 18 + Vite&lt;/li&gt;
&lt;li&gt;React Three Fiber&lt;/li&gt;
&lt;li&gt;@react-three/drei&lt;/li&gt;
&lt;li&gt;Framer Motion&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Core Idea: A Config-Driven Portfolio
&lt;/h2&gt;

&lt;p&gt;The key architectural decision is a single &lt;code&gt;config.js&lt;/code&gt; that controls everything — your name, bio, projects, colors, and even 3D scene settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Jane Doe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Creative Developer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headline&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;I Build&lt;/span&gt;&lt;span class="dl"&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;Digital&lt;/span&gt;&lt;span class="dl"&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;Experiences&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello@yourname.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="na"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;heroParticleCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;heroParticleSpeed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;accentColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#c8ff00&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No digging through components. Change one file, the whole site updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hero: Particle Field with Connection Lines
&lt;/h2&gt;

&lt;p&gt;The most visually striking part is the hero background — 800 particles floating in 3D space, drawing lines between particles that get close enough to each other.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ParticleField&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;connectionDistance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#c8ff00&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pointsRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="nf"&gt;useFrame&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;clock&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pointsRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;array&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;clock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElapsedTime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;i3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
      &lt;span class="nx"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.001&lt;/span&gt;
      &lt;span class="nx"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i3&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.001&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;pointsRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;needsUpdate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;points&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;pointsRef&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;bufferGeometry&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;bufferAttribute&lt;/span&gt; &lt;span class="na"&gt;attach&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"attributes-position"&lt;/span&gt; &lt;span class="na"&gt;array&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;positions&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;itemSize&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;bufferGeometry&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pointsMaterial&lt;/span&gt;
        &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mf"&gt;0.03&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;transparent&lt;/span&gt;
        &lt;span class="na"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;blending&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;THREE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AdditiveBlending&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;depthWrite&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;points&lt;/span&gt;&lt;span class="p"&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;p&gt;The &lt;code&gt;AdditiveBlending&lt;/code&gt; is what gives it that glowing neon feel.&lt;/p&gt;

&lt;h2&gt;
  
  
  5 Scene Types for Project Cards
&lt;/h2&gt;

&lt;p&gt;Each project card in the Projects section gets its own 3D scene. You pick which one per project in &lt;code&gt;config.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;projects&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="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;My SaaS App&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;Real-time analytics dashboard.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;tags&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;React&lt;/span&gt;&lt;span class="dl"&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;Node.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;sceneType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;orbit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// orbit | wave | helix | sphere | particles&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The scenes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scene&lt;/th&gt;
&lt;th&gt;Visual&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;particles&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Floating dots with connection lines&lt;/td&gt;
&lt;td&gt;Hero, general&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;orbit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Particles orbiting a glowing center&lt;/td&gt;
&lt;td&gt;Data/analytics projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wave&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Undulating grid of points&lt;/td&gt;
&lt;td&gt;Creative/design projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;helix&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DNA-style double helix&lt;/td&gt;
&lt;td&gt;Science/tech projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sphere&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pulsing particle sphere&lt;/td&gt;
&lt;td&gt;3D/WebGL showcases&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Animating Content with Framer Motion
&lt;/h2&gt;

&lt;p&gt;The text content fades up on load using Framer Motion variants:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fadeUp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;visible&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.2&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="c1"&gt;// Usage&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;motion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="na"&gt;custom&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;initial&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"hidden"&lt;/span&gt; &lt;span class="na"&gt;animate&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"visible"&lt;/span&gt; &lt;span class="na"&gt;variants&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;fadeUp&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headline&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headline&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;motion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;custom&lt;/code&gt; prop staggers each element — role tag first, then headline, then bio, then buttons.&lt;/p&gt;

&lt;h2&gt;
  
  
  Customizing Colors
&lt;/h2&gt;

&lt;p&gt;The accent color runs through both the 3D scenes and CSS. Update it in one place:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;accentColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#c8ff00&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Change this&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;accent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#c8ff00&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// And this&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Popular alternatives: &lt;code&gt;#00d4ff&lt;/code&gt; (electric blue), &lt;code&gt;#ff3366&lt;/code&gt; (hot pink), &lt;code&gt;#a855f7&lt;/code&gt; (purple glow).&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploying to Vercel
&lt;/h2&gt;



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

&lt;/div&gt;



&lt;p&gt;Done. Free hosting, automatic HTTPS.&lt;/p&gt;




&lt;h2&gt;
  
  
  Want the Full Setup Without Starting from Scratch?
&lt;/h2&gt;

&lt;p&gt;Building all of this from scratch takes a while to tune — getting the particle physics right, the connection line performance optimized, the Framer Motion timing dialed in.&lt;/p&gt;

&lt;p&gt;I packaged the complete, production-ready version into a starter kit: &lt;a href="https://deltacraft.gumroad.com/l/r3f-portfolio-starter" rel="noopener noreferrer"&gt;R3F 3D Portfolio Starter Kit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It includes all 5 scene types, the full page structure (Hero, Projects, About, Contact, Footer), and the config-driven setup described above. Drop in your info, run &lt;code&gt;npm install&lt;/code&gt;, done.&lt;/p&gt;




&lt;p&gt;What 3D effects are you using in your portfolio? Drop a comment — I read every one.&lt;/p&gt;

</description>
      <category>react</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>threejs</category>
    </item>
  </channel>
</rss>
