<?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: blackstonemotions2026</title>
    <description>The latest articles on DEV Community by blackstonemotions2026 (@blackstonemotion).</description>
    <link>https://dev.to/blackstonemotion</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%2F3971955%2F5cddd493-9065-44a4-b9e8-f46aa7554b4f.jpg</url>
      <title>DEV Community: blackstonemotions2026</title>
      <link>https://dev.to/blackstonemotion</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/blackstonemotion"/>
    <language>en</language>
    <item>
      <title>Why we still hand-code marketing sites in 2026 (GSAP, no page builder)</title>
      <dc:creator>blackstonemotions2026</dc:creator>
      <pubDate>Sun, 07 Jun 2026 01:13:22 +0000</pubDate>
      <link>https://dev.to/blackstonemotion/why-we-still-hand-code-marketing-sites-in-2026-gsap-no-page-builder-5f59</link>
      <guid>https://dev.to/blackstonemotion/why-we-still-hand-code-marketing-sites-in-2026-gsap-no-page-builder-5f59</guid>
      <description>&lt;p&gt;Page builders won. Wix, Squarespace, Webflow, and Framer cover most small business needs in an afternoon. So why would anyone still hand-code a marketing site in 2026?&lt;/p&gt;

&lt;p&gt;We run &lt;a href="https://blackstone-motion.vercel.app" rel="noopener noreferrer"&gt;Blackstone Motion&lt;/a&gt;, a motion-first web studio. We build custom sites for service businesses, hospitality, and local brands that outgrew their template but do not need a full product engineering team. This is when hand-coded HTML, CSS, JavaScript, and &lt;a href="https://greensock.com/gsap/" rel="noopener noreferrer"&gt;GSAP&lt;/a&gt; still make sense, and when they do not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Templates optimize for launch, not for your funnel
&lt;/h2&gt;

&lt;p&gt;Most template sites solve one problem: &lt;strong&gt;existence&lt;/strong&gt;. You get a domain, hours, a contact page, and something that looks acceptable on a phone.&lt;/p&gt;

&lt;p&gt;They rarely solve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One clear action&lt;/strong&gt; repeated on every scroll depth (call, book, order)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile hierarchy&lt;/strong&gt; that matches how people actually decide (trust, offer, proof, action)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt; once you stack widgets, chat bubbles, pop-ups, and third-party embeds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brand specificity&lt;/strong&gt; beyond font and color swaps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a solo operator testing an idea, templates are fine. For a business where the site is the primary salesperson, the template becomes a ceiling.&lt;/p&gt;

&lt;h2&gt;
  
  
  What hand-coding buys you
&lt;/h2&gt;

&lt;p&gt;Hand-coded does not mean reinventing React for a bakery site. It means you control the document, the layout, and the motion layer without fighting a builder export.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Semantic structure you can reason about
&lt;/h3&gt;

&lt;p&gt;You choose the heading order, landmarks, and link text. That helps accessibility, SEO basics, and future refactors. Builders often output nested div soup that is hard to tune without breaking the editor.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Motion that serves content, not decoration
&lt;/h3&gt;

&lt;p&gt;We use GSAP with ScrollTrigger for entrances, pinned sections, and scrubbed reveals. The goal is to &lt;strong&gt;guide attention&lt;/strong&gt;, not to animate everything because we can.&lt;/p&gt;

&lt;p&gt;A typical pattern for a service homepage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hero: short timeline on load (headline, subcopy, CTA)&lt;/li&gt;
&lt;li&gt;One pinned or scrubbed section that explains the offer&lt;/li&gt;
&lt;li&gt;Light section entrances elsewhere&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;prefers-reduced-motion&lt;/code&gt; respected throughout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is hard to do well in a generic builder without heavy embeds or brittle custom code blocks.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Performance you can actually measure
&lt;/h3&gt;

&lt;p&gt;Transform and opacity animations, lazy-loaded media, no unused framework bundle for a four-page marketing site. A hand-coded marketing build can stay lean in a way that full-stack SPA or bloated theme stacks often do not.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Design that cannot be mistaken for the neighbor's site
&lt;/h3&gt;

&lt;p&gt;Templates cluster by vertical. Two dentists in the same zip code can have the same Wix skin. Custom layout, type rhythm, and photography treatment are how a local brand looks &lt;strong&gt;intentional&lt;/strong&gt; instead of &lt;strong&gt;placeholder&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A minimal GSAP pattern (scroll section)
&lt;/h2&gt;

&lt;p&gt;This is simplified from how we structure client builds. It is not drop-in for every project, but it shows the idea: one ScrollTrigger section, scrubbed progress, reduced motion fallback.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'story-pin'&lt;/span&gt; &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;'How we work'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'story-pin__track'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'story-pin__panel story-pin__panel--one'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Discovery&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'story-pin__panel story-pin__panel--two'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Design&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'story-pin__panel story-pin__panel--three'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Build&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.story-pin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;relative&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;min-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100vh&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.story-pin__track&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.story-pin__panel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#222&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;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;gsap&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;gsap&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ScrollTrigger&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;gsap/ScrollTrigger&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;gsap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerPlugin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ScrollTrigger&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;prefersReduced&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;matchMedia&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;(prefers-reduced-motion: reduce)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;matches&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;prefersReduced&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;panels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;gsap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;utils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.story-pin__panel&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;gsap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timeline&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;scrollTrigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.story-pin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;top top&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;+=120%&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;scrub&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.6&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;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;panels&lt;/span&gt;&lt;span class="p"&gt;,&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;40&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;stagger&lt;/span&gt;&lt;span class="p"&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="na"&gt;duration&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On client projects we split modules, scope with &lt;code&gt;gsap.context()&lt;/code&gt;, and refresh ScrollTrigger after fonts and images load. The point is: &lt;strong&gt;the motion is code you own&lt;/strong&gt;, not a plugin slot fighting the rest of the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  When a page builder is the right call
&lt;/h2&gt;

&lt;p&gt;Be honest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tight budget, need live this week:&lt;/strong&gt; use a builder or a solid theme&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Owner will edit copy weekly:&lt;/strong&gt; Webflow or similar may beat custom if they need visual editing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No brand assets yet:&lt;/strong&gt; design and content work matter more than custom code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal tool or MVP:&lt;/strong&gt; ship the stack your team already knows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We turn down or defer projects that fit better as a $500 template job. Hand-coded motion work starts where &lt;strong&gt;clarity, craft, and conversion&lt;/strong&gt; matter more than time-to-publish.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a custom marketing build usually includes
&lt;/h2&gt;

&lt;p&gt;For a typical 3 to 5 page service site at our studio:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Written brief (goals, pages, references, timeline, budget range)&lt;/li&gt;
&lt;li&gt;Figma frames for key breakpoints&lt;/li&gt;
&lt;li&gt;Hand-coded responsive build&lt;/li&gt;
&lt;li&gt;GSAP tier matched to scope (light entrances vs pinned storytelling)&lt;/li&gt;
&lt;li&gt;Staging URL, two async revision rounds, launch handoff&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We work &lt;strong&gt;async by email&lt;/strong&gt;. No calls. Decisions stay in writing so nothing gets lost between a Zoom and a random text message.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you are comparing options for your business
&lt;/h2&gt;

&lt;p&gt;Ask any developer or studio:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Who owns the code after launch?&lt;/li&gt;
&lt;li&gt;What happens to performance if we add a chat widget and a booking embed?&lt;/li&gt;
&lt;li&gt;How is motion scoped so it does not hurt mobile load?&lt;/li&gt;
&lt;li&gt;What is included in revisions?&lt;/li&gt;
&lt;li&gt;Can you show a live preview on a staging URL before we pay the balance?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If they cannot answer in plain language, that is a signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  See the approach live
&lt;/h2&gt;

&lt;p&gt;Our portfolio is hand-coded with the same patterns we use on client work:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://blackstone-motion.vercel.app" rel="noopener noreferrer"&gt;https://blackstone-motion.vercel.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you are planning a rebuild from Wix, GoDaddy, or a dated WordPress theme and want a motion-first marketing site, send a one-paragraph brief through the &lt;a href="https://blackstone-motion.vercel.app/contact.html" rel="noopener noreferrer"&gt;contact form&lt;/a&gt; or email &lt;strong&gt;&lt;a href="mailto:xzavian.suarez2012@gmail.com"&gt;xzavian.suarez2012@gmail.com&lt;/a&gt;&lt;/strong&gt; with pages, timeline, and rough budget range. We reply in writing with next steps.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Blackstone Motion is a motion-first web studio based in New England, US. We build custom sites with GSAP, semantic HTML, and modern CSS. Remote clients welcome.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>gsap</category>
      <category>frontend</category>
      <category>css</category>
    </item>
  </channel>
</rss>
