<?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: Satty</title>
    <description>The latest articles on DEV Community by Satty (@i_am_satty).</description>
    <link>https://dev.to/i_am_satty</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%2F3333699%2F2b307654-4d12-4485-a177-cbdcc584fc27.jpg</url>
      <title>DEV Community: Satty</title>
      <link>https://dev.to/i_am_satty</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/i_am_satty"/>
    <language>en</language>
    <item>
      <title>🚀 How to Deploy Your Next.js Portfolio Site for Free Using GitHub &amp; Vercel</title>
      <dc:creator>Satty</dc:creator>
      <pubDate>Thu, 24 Jul 2025 04:24:14 +0000</pubDate>
      <link>https://dev.to/i_am_satty/how-to-deploy-your-nextjs-portfolio-site-for-free-using-github-vercel-368a</link>
      <guid>https://dev.to/i_am_satty/how-to-deploy-your-nextjs-portfolio-site-for-free-using-github-vercel-368a</guid>
      <description>&lt;p&gt;Hello! I recently built a portfolio site with Next.js and published it for free using GitHub and Vercel. In this article, I’ll walk you through the steps, making it easy for beginners to follow.&lt;/p&gt;

&lt;p&gt;💡 You can check the actual portfolio site we’re going to create and deploy in this article here👉 &lt;a href="https://satty-portfolio.vercel.app/" rel="noopener noreferrer"&gt;satty-portfolio.vercel.app&lt;/a&gt;.&lt;br&gt;
Feel free to use it as a reference for design and functionality!&lt;/p&gt;




&lt;h1&gt;
  
  
  1. Prerequisites
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;GitHub account&lt;/li&gt;
&lt;li&gt;Vercel account&lt;/li&gt;
&lt;li&gt;Next.js project&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Create a Next.js Project (If you haven't already)
&lt;/h3&gt;



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

&lt;/div&gt;






&lt;h1&gt;
  
  
  2. Create a GitHub Repository &amp;amp; Upload Your Code
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Create a new repository on &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; (for example, my-portfolio).&lt;/li&gt;
&lt;li&gt;Open your terminal, navigate to your Next.js project directory, and initialize Git, commit, and push your code.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/your-username/my-portfolio.git
git push -u origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  3. Set Up Deployment on Vercel
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Log in to Vercel
&lt;/h3&gt;

&lt;p&gt;Go to &lt;a href="https://vercel.com/" rel="noopener noreferrer"&gt;Vercel&lt;/a&gt; and &lt;strong&gt;sign in with your GitHub account&lt;/strong&gt; (“Continue with GitHub”).&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a New Project
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;"New Project"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select the repository you just pushed to GitHub&lt;/li&gt;
&lt;li&gt;Default settings are fine for Next.js projects&lt;/li&gt;
&lt;li&gt;Click "Deploy"&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  4. Confirm Automatic Deployment
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Once deployed, Vercel will give you a live URL, such as &lt;a href="https://my-portfolio.vercel.app" rel="noopener noreferrer"&gt;https://my-portfolio.vercel.app&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;From now on, &lt;strong&gt;every time you push to GitHub, Vercel will automatically deploy the latest version.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;👀 My own portfolio site is live here using this setup.&lt;br&gt;
Take a look at the design and features for inspiration!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  5. (Optional) Set Up Environment Variables
&lt;/h1&gt;

&lt;p&gt;If you need to use &lt;strong&gt;environment variables&lt;/strong&gt; (for example, API keys or CMS integration):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to your project settings in Vercel &amp;gt; "Environment Variables" and add any required variables.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example (for NEWT CMS):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: NEWT_API_TOKEN&lt;/li&gt;
&lt;li&gt;Value: xxxxxxxxxxxxxxxxxxxxxxx&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  6. (Optional) Set Up a Custom Domain
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Go to Project &amp;gt; Settings &amp;gt; Domains in Vercel to add your custom domain.&lt;/li&gt;
&lt;li&gt;Update your DNS provider’s CNAME or A record as instructed by Vercel.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  7. Summary
&lt;/h1&gt;

&lt;p&gt;That's it! Now you can &lt;strong&gt;easily publish your Next.js portfolio site using GitHub and Vercel&lt;/strong&gt;.&lt;br&gt;
From now on, your workflow is simple: Develop locally → Push to GitHub → Vercel auto-deploys your updates.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ The portfolio site I published by following these steps is here👉 &lt;a href="https://satty-portfolio.vercel.app/" rel="noopener noreferrer"&gt;satty-portfolio.vercel.app&lt;/a&gt;.&lt;br&gt;
If you’re curious about the implementation or want to see a live example, feel free to check it out!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>nextjs</category>
      <category>vercel</category>
      <category>github</category>
      <category>portfolio</category>
    </item>
    <item>
      <title>📨 The Easiest Way to Add a Contact Form to Your Site (Using Google Forms)</title>
      <dc:creator>Satty</dc:creator>
      <pubDate>Wed, 09 Jul 2025 02:04:35 +0000</pubDate>
      <link>https://dev.to/i_am_satty/the-easiest-way-to-add-a-contact-form-to-your-site-using-google-forms-40p</link>
      <guid>https://dev.to/i_am_satty/the-easiest-way-to-add-a-contact-form-to-your-site-using-google-forms-40p</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Want to add a contact form to your site without spinning up a backend?&lt;br&gt;&lt;br&gt;
Looking for something quick, free, and serverless?  &lt;/p&gt;

&lt;p&gt;In this article, I’ll show you &lt;strong&gt;two practical ways to embed Google Forms into your Next.js site&lt;/strong&gt;, with clean UI and no server-side headaches.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;See the working version on my portfolio:&lt;br&gt;
👉 &lt;a href="https://satty-portfolio.vercel.app/" rel="noopener noreferrer"&gt;https://satty-portfolio.vercel.app/&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  ✅ What You’ll Learn
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ How to &lt;strong&gt;embed Google Forms using an iframe&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ How to &lt;strong&gt;customize your own UI and POST to Google Forms&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ The pros and cons of both approaches&lt;/li&gt;
&lt;li&gt;✅ Code examples using &lt;strong&gt;Next.js (App Router) + MUI&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ Live example from my own &lt;a href="https://satty-portfolio.vercel.app/" rel="noopener noreferrer"&gt;portfolio site&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🎯 Who Is This For?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Developers who want a &lt;strong&gt;simple contact form&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Those looking for a &lt;strong&gt;serverless solution&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next.js + MUI&lt;/strong&gt; users who want better design flexibility&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🛠 Tech Stack (My Portfolio Site)
&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;Stack&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Framework&lt;/td&gt;
&lt;td&gt;Next.js (App Router + TypeScript)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI Library&lt;/td&gt;
&lt;td&gt;MUI (Material UI)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Form Submission&lt;/td&gt;
&lt;td&gt;Google Forms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  🧩 Option 1: Embed Google Form with &lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt; (Easiest Way)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🔧 Steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create your form at &lt;a href="https://docs.google.com/forms/u/0/" rel="noopener noreferrer"&gt;Google Forms&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Send&lt;/strong&gt; → &lt;strong&gt;&amp;lt;&amp;gt; Embed icon&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Copy the iframe code&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  🧪 Example
&lt;/h3&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;iframe&lt;/span&gt;
  &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://docs.google.com/forms/d/e/xxxxxxxx/viewform?embedded=true"&lt;/span&gt;
  &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"100%"&lt;/span&gt;
  &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"800"&lt;/span&gt;
  &lt;span class="na"&gt;frameborder=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;
  &lt;span class="na"&gt;marginheight=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;
  &lt;span class="na"&gt;marginwidth=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Loading…
&lt;span class="nt"&gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  ✅ Pros &amp;amp; Cons
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Cons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Super fast setup&lt;/td&gt;
&lt;td&gt;Limited styling/customization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Sheets support&lt;/td&gt;
&lt;td&gt;May not feel "native" to your site&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works out of the box&lt;/td&gt;
&lt;td&gt;Not great for brand consistency&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  🎨 Option 2: Create a Custom Form and POST to Google Forms
&lt;/h2&gt;

&lt;p&gt;Google Forms has a hidden endpoint (formResponse) that lets you POST data directly. This allows full UI freedom while keeping your form submission serverless.&lt;/p&gt;
&lt;h3&gt;
  
  
  ✨ What You’ll Need
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The form’s action URL (formResponse)&lt;/li&gt;
&lt;li&gt;Each field’s name attribute (entry.XXXXXXX)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🔍 How to Get the Form Action URL and Field Names
&lt;/h3&gt;

&lt;p&gt;1.Get the action URL&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open your Google Form&lt;/li&gt;
&lt;li&gt;Right-click → “View Page Source”&lt;/li&gt;
&lt;li&gt;Look for:
&lt;/li&gt;
&lt;/ul&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;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"https://docs.google.com/forms/d/e/xxxxxx/formResponse"&lt;/span&gt; &lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;2.Get the field names&lt;br&gt;
Search the source code for:&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;input&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"entry.123456789"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"entry.987654321"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"entry.192837465"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use these entry.XXXXXXX values in your code.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧪 Simplified Code Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use client&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;useState&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="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;FORM_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://docs.google.com/forms/d/e/xxxxxxxx/formResponse&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="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ContactForm&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setForm&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&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="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="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;submitted&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setSubmitted&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&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;handleChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&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="nf"&gt;setForm&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&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;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&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;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&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;formData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;entry.123456789&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;entry.987654321&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;entry.192837465&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&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="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="nx"&gt;FORM_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;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;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;no-cors&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="nf"&gt;setSubmitted&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="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="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Something went wrong. Please try again.&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;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;submitted&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;📨 Thanks! Your message has been sent.&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;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;form&lt;/span&gt; &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&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;input&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Your Name"&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleChange&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;required&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;input&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Your Email"&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleChange&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;required&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;textarea&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Your Message"&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleChange&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;required&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;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Send&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&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;form&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;h2&gt;
  
  
  ⚖️ Which Method Should You Use?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Want something super quick&lt;/td&gt;
&lt;td&gt;✅ Use  method&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need full control over styling&lt;/td&gt;
&lt;td&gt;✅ Use POST method&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Want to track events in Google Analytics&lt;/td&gt;
&lt;td&gt;✅ Use POST + GA4 event&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔗 Live Example
&lt;/h2&gt;

&lt;p&gt;See the working version on my portfolio:&lt;br&gt;
👉 &lt;a href="https://satty-portfolio.vercel.app/" rel="noopener noreferrer"&gt;https://satty-portfolio.vercel.app/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Google Form Integration&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free and easy&lt;/td&gt;
&lt;td&gt;✅ No server required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embed or customize&lt;/td&gt;
&lt;td&gt;✅ Two flexible methods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integrates with MUI/Next&lt;/td&gt;
&lt;td&gt;✅ Works in any frontend project&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Whether you're launching a portfolio or MVP, Google Forms is a rock-solid, free, and fast option. Start simple, scale smart.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>googleform</category>
      <category>serverless</category>
      <category>contactform</category>
      <category>react</category>
    </item>
    <item>
      <title>😎✨ My UX Portfolio: The Real Me, Unfiltered!</title>
      <dc:creator>Satty</dc:creator>
      <pubDate>Tue, 08 Jul 2025 07:28:32 +0000</pubDate>
      <link>https://dev.to/i_am_satty/my-ux-portfolio-the-real-me-unfiltered-31f8</link>
      <guid>https://dev.to/i_am_satty/my-ux-portfolio-the-real-me-unfiltered-31f8</guid>
      <description>&lt;p&gt;Hi DEV Community! 👋&lt;br&gt;&lt;br&gt;
I'm &lt;strong&gt;Satty&lt;/strong&gt;, a &lt;strong&gt;UX Engineer&lt;/strong&gt; from Japan.&lt;/p&gt;

&lt;p&gt;As someone who works at the intersection of &lt;strong&gt;UI/UX design&lt;/strong&gt; and &lt;strong&gt;engineering&lt;/strong&gt;, I often find that resumes alone don’t fully communicate my thinking process or design intent.&lt;/p&gt;

&lt;p&gt;So, I decided to create a &lt;strong&gt;portfolio site&lt;/strong&gt; — not just to show what I’ve built, but to share the &lt;em&gt;why&lt;/em&gt; behind it.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎉 Here’s My Portfolio!
&lt;/h2&gt;

&lt;p&gt;👉 &lt;a href="https://satty-portfolio.vercel.app" rel="noopener noreferrer"&gt;satty-portfolio.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s mobile-friendly, lightweight, and yes — it’s in English, as I hope to connect with people around the world!&lt;/p&gt;




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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Framework&lt;/td&gt;
&lt;td&gt;Next.js (App Router + TypeScript)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI Library&lt;/td&gt;
&lt;td&gt;MUI (Material UI)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;Vercel (GitHub integrated)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contact Form&lt;/td&gt;
&lt;td&gt;Google Forms (serverless setup)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analytics&lt;/td&gt;
&lt;td&gt;GA4 (Google Analytics 4)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The goal was to keep the structure lightweight and easy to maintain.&lt;br&gt;&lt;br&gt;
By using Google Forms, I created a functional contact form &lt;strong&gt;without needing a custom backend&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Highlights &amp;amp; Design Choices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 UX-first Structure
&lt;/h3&gt;

&lt;p&gt;Before writing any code, I mapped out the goals:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Who&lt;/strong&gt; will visit this site? &lt;strong&gt;What&lt;/strong&gt; do I want them to know?&lt;br&gt;&lt;br&gt;
Whether you're a hiring manager, a fellow developer, or someone looking for UX ideas — the site is structured to guide you smoothly.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 UI Consistency &amp;amp; Mobile-first
&lt;/h3&gt;

&lt;p&gt;The entire site is styled using &lt;strong&gt;customized MUI themes&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
From typography to spacing and color palette, everything follows a consistent logic. It’s also fully responsive, with a mobile-first hamburger menu.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 GA4 Integration
&lt;/h3&gt;

&lt;p&gt;I implemented &lt;strong&gt;Google Analytics 4&lt;/strong&gt; to track key user actions:&lt;br&gt;&lt;br&gt;
page transitions, scroll depth, form submissions, and more — so I can continue improving based on actual behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 Adding a Bit of Fun
&lt;/h3&gt;

&lt;p&gt;While keeping things clear and functional, I also wanted the site to feel fun — not overly formal. You’ll find little bits of humor scattered throughout.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 What’s Next?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I plan to write articles sharing my UX decisions and implementation tips&lt;/li&gt;
&lt;li&gt;I’ll be experimenting with UI tweaks based on user behavior&lt;/li&gt;
&lt;li&gt;Eventually, I hope to turn this into a mini UX case study series&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💬 Feedback is Welcome!
&lt;/h2&gt;

&lt;p&gt;Thanks so much for reading.&lt;br&gt;&lt;br&gt;
The site is still evolving, so if you have feedback, suggestions, or even just reactions — I’d love to hear them.&lt;/p&gt;

&lt;p&gt;Feel free to reach out via the site’s contact form or drop a comment here!&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://satty-portfolio.vercel.app" rel="noopener noreferrer"&gt;satty-portfolio.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s keep making the web more thoughtful, one experience at a time.&lt;/p&gt;

&lt;p&gt;— Satty&lt;/p&gt;

</description>
      <category>portfolio</category>
      <category>uxdesign</category>
      <category>nextjs</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
