<?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: Руслан</title>
    <description>The latest articles on DEV Community by Руслан (@_84f82f80221994c2ae).</description>
    <link>https://dev.to/_84f82f80221994c2ae</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%2F3824626%2F645698e2-73cc-4db2-859b-dae6dd42d53a.png</url>
      <title>DEV Community: Руслан</title>
      <link>https://dev.to/_84f82f80221994c2ae</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/_84f82f80221994c2ae"/>
    <language>en</language>
    <item>
      <title>I Built a Free Freelance Rate Calculator - Here's Why Most Freelancers Undercharge</title>
      <dc:creator>Руслан</dc:creator>
      <pubDate>Mon, 16 Mar 2026 22:41:35 +0000</pubDate>
      <link>https://dev.to/_84f82f80221994c2ae/i-built-a-free-freelance-rate-calculator-heres-why-most-freelancers-undercharge-ked</link>
      <guid>https://dev.to/_84f82f80221994c2ae/i-built-a-free-freelance-rate-calculator-heres-why-most-freelancers-undercharge-ked</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;When I started freelancing, I made the classic mistake: I took my desired annual salary and divided it by 2,080 hours (40 hours × 52 weeks).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$80,000 ÷ 2,080 = $38.46/hour&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Seemed reasonable, right? Wrong.&lt;/p&gt;

&lt;p&gt;I was actually earning way less than $80K because I forgot about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🏥 &lt;strong&gt;Taxes&lt;/strong&gt; (self-employment tax is ~15% on top of income tax)&lt;/li&gt;
&lt;li&gt;💼 &lt;strong&gt;Business expenses&lt;/strong&gt; (software, equipment, coworking, insurance)&lt;/li&gt;
&lt;li&gt;🏖️ &lt;strong&gt;Time off&lt;/strong&gt; (vacation, sick days, holidays)&lt;/li&gt;
&lt;li&gt;⏰ &lt;strong&gt;Non-billable hours&lt;/strong&gt; (admin, marketing, invoicing)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;&lt;a href="https://freelancehourly.site" rel="noopener noreferrer"&gt;FreelanceHourly&lt;/a&gt;&lt;/strong&gt; — a free calculator that factors in ALL of these variables.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Enter your target annual income&lt;/li&gt;
&lt;li&gt;Add your monthly business expenses&lt;/li&gt;
&lt;li&gt;Set your tax rate&lt;/li&gt;
&lt;li&gt;Specify vacation/sick days&lt;/li&gt;
&lt;li&gt;Get your &lt;strong&gt;real&lt;/strong&gt; minimum hourly rate&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Math Behind It
&lt;/h2&gt;

&lt;p&gt;Here's the simplified formula:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Real Rate = (Target Income + Taxes + Expenses) ÷ Actual Billable Hours
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For that $80K example with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;30% effective tax rate&lt;/li&gt;
&lt;li&gt;$500/month expenses&lt;/li&gt;
&lt;li&gt;4 weeks off per year&lt;/li&gt;
&lt;li&gt;70% billable time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real rate needed: ~$75/hour&lt;/strong&gt; (not $38!)&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://freelancehourly.site" rel="noopener noreferrer"&gt;FreelanceHourly.site&lt;/a&gt;&lt;/strong&gt; — completely free, no signup required.&lt;/p&gt;

&lt;p&gt;Would love your feedback! What factors do you consider when setting your rates?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with vanilla HTML/CSS/JS. Inspired by years of undercharging myself.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>freelance</category>
      <category>productivity</category>
      <category>career</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Free Privacy Policy Generator - No Signup, No Nonsense</title>
      <dc:creator>Руслан</dc:creator>
      <pubDate>Mon, 16 Mar 2026 04:28:17 +0000</pubDate>
      <link>https://dev.to/_84f82f80221994c2ae/free-privacy-policy-generator-no-signup-no-nonsense-51h4</link>
      <guid>https://dev.to/_84f82f80221994c2ae/free-privacy-policy-generator-no-signup-no-nonsense-51h4</guid>
      <description>&lt;p&gt;Launching a website or app? You need a privacy policy. But hiring a lawyer costs hundreds of dollars, and most generators want your email first.&lt;/p&gt;

&lt;p&gt;I built a free alternative: &lt;strong&gt;&lt;a href="https://policyfree.site" rel="noopener noreferrer"&gt;PolicyFree&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Every website that collects any user data needs a privacy policy. GDPR, CCPA, and other regulations require it. But:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lawyers are expensive&lt;/li&gt;
&lt;li&gt;Template sites want your email (ironic for a privacy tool)&lt;/li&gt;
&lt;li&gt;Generic templates miss important details&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What PolicyFree Does
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Answer simple questions about your site&lt;/li&gt;
&lt;li&gt;Select what data you collect&lt;/li&gt;
&lt;li&gt;Generate a customized privacy policy&lt;/li&gt;
&lt;li&gt;Copy or download as HTML/Markdown&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;100% Free&lt;/strong&gt; - No hidden costs&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;No Signup&lt;/strong&gt; - Just use it&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;GDPR &amp;amp; CCPA&lt;/strong&gt; - Covers major regulations&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Customizable&lt;/strong&gt; - Edit after generation&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Multiple formats&lt;/strong&gt; - HTML, Markdown, plain text&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Indie developers&lt;/li&gt;
&lt;li&gt;Side project owners&lt;/li&gt;
&lt;li&gt;Small business sites&lt;/li&gt;
&lt;li&gt;Personal blogs&lt;/li&gt;
&lt;li&gt;SaaS startups&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://policyfree.site" rel="noopener noreferrer"&gt;policyfree.site&lt;/a&gt;&lt;/strong&gt; - Generate your privacy policy in under 2 minutes.&lt;/p&gt;




&lt;p&gt;What other legal documents do you struggle to create? Let me know in the comments!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>legal</category>
      <category>startup</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Build a Dev Resume in 5 Minutes - Free, No Signup</title>
      <dc:creator>Руслан</dc:creator>
      <pubDate>Mon, 16 Mar 2026 03:06:38 +0000</pubDate>
      <link>https://dev.to/_84f82f80221994c2ae/build-a-dev-resume-in-5-minutes-free-no-signup-1637</link>
      <guid>https://dev.to/_84f82f80221994c2ae/build-a-dev-resume-in-5-minutes-free-no-signup-1637</guid>
      <description>&lt;p&gt;Job hunting? Your resume is your first impression. But most resume builders want your email, your data, and eventually your money.&lt;/p&gt;

&lt;p&gt;I found one that doesn't: &lt;strong&gt;&lt;a href="https://resumefree.site" rel="noopener noreferrer"&gt;ResumeFree&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem With Resume Builders
&lt;/h2&gt;

&lt;p&gt;Most "free" resume builders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Require signup&lt;/li&gt;
&lt;li&gt;Lock good templates behind paywalls&lt;/li&gt;
&lt;li&gt;Add watermarks&lt;/li&gt;
&lt;li&gt;Sell your data&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why ResumeFree Is Different
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Actually free (no hidden costs)&lt;/li&gt;
&lt;li&gt;✅ No account needed&lt;/li&gt;
&lt;li&gt;✅ Clean, professional templates&lt;/li&gt;
&lt;li&gt;✅ PDF export&lt;/li&gt;
&lt;li&gt;✅ Your data stays in your browser&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Perfect For Developers
&lt;/h2&gt;

&lt;p&gt;The templates are clean and ATS-friendly. No fancy graphics that confuse automated systems. Just solid formatting that works.&lt;/p&gt;

&lt;h2&gt;
  
  
  How To Use It
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://resumefree.site" rel="noopener noreferrer"&gt;resumefree.site&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Fill in your details&lt;/li&gt;
&lt;li&gt;Choose a template&lt;/li&gt;
&lt;li&gt;Export as PDF&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Takes 5 minutes. No signup. No payment.&lt;/p&gt;




&lt;p&gt;What's your resume building process? Share your tips below! 👇&lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>productivity</category>
      <category>jobs</category>
    </item>
    <item>
      <title>Stuck on Naming Your Project? This Free Tool Helps</title>
      <dc:creator>Руслан</dc:creator>
      <pubDate>Mon, 16 Mar 2026 03:05:51 +0000</pubDate>
      <link>https://dev.to/_84f82f80221994c2ae/stuck-on-naming-your-project-this-free-tool-helps-o32</link>
      <guid>https://dev.to/_84f82f80221994c2ae/stuck-on-naming-your-project-this-free-tool-helps-o32</guid>
      <description>&lt;p&gt;Naming things is hard. Projects, startups, products, domains — we've all spent hours staring at a blank page.&lt;/p&gt;

&lt;p&gt;I found a tool that helps: &lt;strong&gt;&lt;a href="https://namegen.site" rel="noopener noreferrer"&gt;NameGen&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Naming Struggle
&lt;/h2&gt;

&lt;p&gt;Every developer knows this pain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have a great idea&lt;/li&gt;
&lt;li&gt;You start building&lt;/li&gt;
&lt;li&gt;You need a name&lt;/li&gt;
&lt;li&gt;Hours pass...&lt;/li&gt;
&lt;li&gt;Still no name&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How NameGen Helps
&lt;/h2&gt;

&lt;p&gt;It generates name ideas based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keywords you provide&lt;/li&gt;
&lt;li&gt;Industry/category&lt;/li&gt;
&lt;li&gt;Name style (tech, fun, professional)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not every suggestion is perfect, but it sparks ideas you wouldn't think of.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Use It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Free&lt;/li&gt;
&lt;li&gt;✅ No signup required&lt;/li&gt;
&lt;li&gt;✅ Instant results&lt;/li&gt;
&lt;li&gt;✅ Shows domain availability&lt;/li&gt;
&lt;li&gt;✅ Multiple styles&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pro Tip
&lt;/h2&gt;

&lt;p&gt;Generate 20-30 names, then pick your top 5. Sleep on it. The right name usually becomes obvious.&lt;/p&gt;

&lt;p&gt;Try it: &lt;strong&gt;&lt;a href="https://namegen.site" rel="noopener noreferrer"&gt;namegen.site&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;What's the hardest thing you've ever had to name? 👇&lt;/p&gt;

</description>
      <category>startup</category>
      <category>productivity</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Generate WiFi QR Codes in 5 Seconds - Free Tool</title>
      <dc:creator>Руслан</dc:creator>
      <pubDate>Mon, 16 Mar 2026 03:00:48 +0000</pubDate>
      <link>https://dev.to/_84f82f80221994c2ae/generate-wifi-qr-codes-in-5-seconds-free-tool-1c2b</link>
      <guid>https://dev.to/_84f82f80221994c2ae/generate-wifi-qr-codes-in-5-seconds-free-tool-1c2b</guid>
      <description>&lt;p&gt;Tired of spelling out your WiFi password to guests?&lt;/p&gt;

&lt;p&gt;I made a simple tool: &lt;strong&gt;&lt;a href="https://qrcreator.site" rel="noopener noreferrer"&gt;QRCreator&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Every time someone visits:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;"What's your WiFi password?"&lt;/li&gt;
&lt;li&gt;"It's X-y-Z-underscore-capital..."&lt;/li&gt;
&lt;li&gt;"Wait, can you spell that again?"&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;Create a QR code your guests can scan. Phone connects automatically. No typing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Enter your WiFi network name&lt;/li&gt;
&lt;li&gt;Enter the password&lt;/li&gt;
&lt;li&gt;Select security type (WPA/WPA2)&lt;/li&gt;
&lt;li&gt;Download QR code&lt;/li&gt;
&lt;li&gt;Print it or display on a frame&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Free forever&lt;/li&gt;
&lt;li&gt;✅ No signup&lt;/li&gt;
&lt;li&gt;✅ No tracking&lt;/li&gt;
&lt;li&gt;✅ Works offline after load&lt;/li&gt;
&lt;li&gt;✅ PNG download&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pro Tip
&lt;/h2&gt;

&lt;p&gt;Print the QR code and put it in a small frame near your entrance. Guests love it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it: &lt;a href="https://qrcreator.site" rel="noopener noreferrer"&gt;qrcreator.site&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;What other QR code use cases do you have? 👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>tools</category>
      <category>javascript</category>
    </item>
    <item>
      <title>This Meeting Is Costing You $847 - Free Calculator Inside</title>
      <dc:creator>Руслан</dc:creator>
      <pubDate>Mon, 16 Mar 2026 03:00:02 +0000</pubDate>
      <link>https://dev.to/_84f82f80221994c2ae/this-meeting-is-costing-you-847-free-calculator-inside-1h4m</link>
      <guid>https://dev.to/_84f82f80221994c2ae/this-meeting-is-costing-you-847-free-calculator-inside-1h4m</guid>
      <description>&lt;p&gt;Ever sat in a meeting thinking "this could've been an email"?&lt;/p&gt;

&lt;p&gt;I built a tool to calculate exactly how much those meetings cost: &lt;strong&gt;&lt;a href="https://meetingcost.site" rel="noopener noreferrer"&gt;MeetingCost&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Cost of Meetings
&lt;/h2&gt;

&lt;p&gt;A 1-hour meeting with 8 people isn't just 1 hour lost. It's 8 hours of combined productivity. At average tech salaries, that's easily $500-1000.&lt;/p&gt;

&lt;p&gt;Most companies don't track this. They should.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Enter number of attendees&lt;/li&gt;
&lt;li&gt;Add average hourly rates (or use defaults)&lt;/li&gt;
&lt;li&gt;Set meeting duration&lt;/li&gt;
&lt;li&gt;See the real cost in real-time&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;I was in a 2-hour "brainstorming" session with 12 people. We achieved nothing. I did the math afterward: &lt;strong&gt;$2,400 wasted&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Now before scheduling any meeting, I check the cost. It changes how you think about meetings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🆓 100% free&lt;/li&gt;
&lt;li&gt;🔒 No signup required
&lt;/li&gt;
&lt;li&gt;⚡ Instant results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://meetingcost.site" rel="noopener noreferrer"&gt;meetingcost.site&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Do you track meeting costs at your company? Share your thoughts! 👇&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>startup</category>
      <category>management</category>
      <category>career</category>
    </item>
    <item>
      <title>Free Freelance Hourly Rate Calculator - Stop Undercharging</title>
      <dc:creator>Руслан</dc:creator>
      <pubDate>Mon, 16 Mar 2026 02:38:17 +0000</pubDate>
      <link>https://dev.to/_84f82f80221994c2ae/free-freelance-hourly-rate-calculator-stop-undercharging-4cl0</link>
      <guid>https://dev.to/_84f82f80221994c2ae/free-freelance-hourly-rate-calculator-stop-undercharging-4cl0</guid>
      <description>&lt;p&gt;As a freelance developer, one of the hardest decisions is figuring out what to charge. Charge too little and you burn out. Charge too much and clients disappear.&lt;/p&gt;

&lt;p&gt;I found a simple tool that solves this: &lt;strong&gt;&lt;a href="https://freelancehourly.site" rel="noopener noreferrer"&gt;FreelanceHourly&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Most freelancers either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pick a random number that "feels right"&lt;/li&gt;
&lt;li&gt;Copy what others charge without understanding their situation&lt;/li&gt;
&lt;li&gt;Forget about taxes, expenses, and non-billable hours&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This leads to undercharging and eventual burnout.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;FreelanceHourly is a free calculator that considers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Your target annual income&lt;/strong&gt; - What you actually want to take home&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Taxes and business expenses&lt;/strong&gt; - The money that disappears to bills&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Billable vs. non-billable hours&lt;/strong&gt; - Admin, marketing, learning time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time off&lt;/strong&gt; - Because you deserve vacations too&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why I Recommend It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ 100% free&lt;/li&gt;
&lt;li&gt;✅ No signup required&lt;/li&gt;
&lt;li&gt;✅ Works instantly in your browser&lt;/li&gt;
&lt;li&gt;✅ Gives you a clear, justified rate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try it at &lt;a href="https://freelancehourly.site" rel="noopener noreferrer"&gt;freelancehourly.site&lt;/a&gt; and finally charge what you're worth.&lt;/p&gt;




&lt;p&gt;What tools do you use to set your rates? Drop a comment below! 👇&lt;/p&gt;

</description>
      <category>freelancing</category>
      <category>productivity</category>
      <category>tools</category>
      <category>webdev</category>
    </item>
    <item>
      <title>4 Free Tools That Make Freelancing Less Painful</title>
      <dc:creator>Руслан</dc:creator>
      <pubDate>Sun, 15 Mar 2026 22:09:46 +0000</pubDate>
      <link>https://dev.to/_84f82f80221994c2ae/4-free-tools-that-make-freelancing-less-painful-1h8m</link>
      <guid>https://dev.to/_84f82f80221994c2ae/4-free-tools-that-make-freelancing-less-painful-1h8m</guid>
      <description>&lt;p&gt;Freelancing is great until you spend half your day on non-billable work.&lt;/p&gt;

&lt;p&gt;Here are 4 free tools that handle the boring stuff so you can focus on actual work.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. ATS-Friendly Resume Builder
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://resumefree.site" rel="noopener noreferrer"&gt;resumefree.site&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're applying to contracts through recruiters or job boards, your resume gets scanned by ATS (Applicant Tracking Systems) before any human sees it.&lt;/p&gt;

&lt;p&gt;Most creative resume templates fail ATS parsing completely.&lt;/p&gt;

&lt;p&gt;This tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates clean, ATS-optimized resumes&lt;/li&gt;
&lt;li&gt;Exports to PDF and DOCX&lt;/li&gt;
&lt;li&gt;No signup, no watermarks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because landing the gig shouldn't depend on your resume formatting.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Email Signature Generator
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://emailsig.site" rel="noopener noreferrer"&gt;emailsig.site&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your email signature is part of your brand. But coding HTML that works in Outlook, Gmail, AND Apple Mail? Nightmare.&lt;/p&gt;

&lt;p&gt;This generator creates responsive signatures that actually render correctly everywhere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add your photo, links, social icons&lt;/li&gt;
&lt;li&gt;Mobile-friendly&lt;/li&gt;
&lt;li&gt;Copy HTML or use image fallback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Looks professional without the headache.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Testimonial Collector
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://testimonify.site" rel="noopener noreferrer"&gt;testimonify.site&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Client testimonials close deals. But getting them is awkward:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Hey, can you write something nice about me?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This tool generates a simple form you can send clients. They fill it out, you get a polished testimonial ready for your portfolio.&lt;/p&gt;

&lt;p&gt;No more chasing. No more writing fake reviews (please don't).&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Invoice Template Generator
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://invoicefree.site" rel="noopener noreferrer"&gt;invoicefree.site&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You finished the work. Now you need to get paid.&lt;/p&gt;

&lt;p&gt;Professional invoices matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They look more legitimate&lt;/li&gt;
&lt;li&gt;Clients take them seriously&lt;/li&gt;
&lt;li&gt;Faster payments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This tool generates clean PDF invoices with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your branding&lt;/li&gt;
&lt;li&gt;Line items and totals&lt;/li&gt;
&lt;li&gt;Payment terms&lt;/li&gt;
&lt;li&gt;Download instantly&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Free?
&lt;/h2&gt;

&lt;p&gt;I built these because I needed them myself. Premium tools charge $10-50/month for features most freelancers never use.&lt;/p&gt;

&lt;p&gt;These tools do one job each. Simple, fast, free.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://resumefree.site" rel="noopener noreferrer"&gt;resumefree.site&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;ATS-friendly resumes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://emailsig.site" rel="noopener noreferrer"&gt;emailsig.site&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Professional email signatures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://testimonify.site" rel="noopener noreferrer"&gt;testimonify.site&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Collect client testimonials&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://invoicefree.site" rel="noopener noreferrer"&gt;invoicefree.site&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Generate invoices&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;em&gt;What's the most annoying non-billable task in your freelance work? Let me know in comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>productivity</category>
      <category>beginners</category>
      <category>startup</category>
    </item>
    <item>
      <title>4 Free Tools Every Startup Needs (That Actually Work)</title>
      <dc:creator>Руслан</dc:creator>
      <pubDate>Sun, 15 Mar 2026 22:07:46 +0000</pubDate>
      <link>https://dev.to/_84f82f80221994c2ae/4-free-tools-every-startup-needs-that-actually-work-20on</link>
      <guid>https://dev.to/_84f82f80221994c2ae/4-free-tools-every-startup-needs-that-actually-work-20on</guid>
      <description>&lt;p&gt;Building a startup? You need tools. But you don't need to pay for them yet.&lt;/p&gt;

&lt;p&gt;Here are 4 free tools I wish I knew about earlier.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. OG Tags Generator — Make Your Links Look Professional
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://ogtags.site" rel="noopener noreferrer"&gt;ogtags.site&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you share your site on Twitter, Slack, or Discord — what shows up? A boring URL? Or a beautiful card with title, description, and image?&lt;/p&gt;

&lt;p&gt;Open Graph tags control this. Most devs either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Skip them entirely&lt;/li&gt;
&lt;li&gt;Copy-paste wrong code&lt;/li&gt;
&lt;li&gt;Use bloated plugins&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ogtags.site&lt;/strong&gt; generates the exact meta tags you need. Copy, paste, done.&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;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Your Startup"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"What you do"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://..."&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. QR Code Generator — No Watermarks, No Signup
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://qrcreator.site" rel="noopener noreferrer"&gt;qrcreator.site&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Need a QR code for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business cards&lt;/li&gt;
&lt;li&gt;Event materials
&lt;/li&gt;
&lt;li&gt;Product packaging&lt;/li&gt;
&lt;li&gt;Restaurant menus&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most generators add watermarks or require accounts. This one doesn't.&lt;/p&gt;

&lt;p&gt;Generate → Download PNG/SVG → Use anywhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Startup Name Generator — When You're Stuck
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://namegen.site" rel="noopener noreferrer"&gt;namegen.site&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Naming is hard. You need something:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Available as a domain&lt;/li&gt;
&lt;li&gt;Easy to spell&lt;/li&gt;
&lt;li&gt;Memorable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This tool generates name ideas based on your keywords. Not AI-hallucinated nonsense — actually usable names.&lt;/p&gt;

&lt;p&gt;Saved me hours of brainstorming.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Privacy Policy Generator — Legal Without Lawyers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://policyfree.site" rel="noopener noreferrer"&gt;policyfree.site&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every website needs a privacy policy. Especially if you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Collect emails&lt;/li&gt;
&lt;li&gt;Use analytics&lt;/li&gt;
&lt;li&gt;Have user accounts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lawyers charge $500+. Templates are outdated. This tool generates GDPR-compliant policies in seconds.&lt;/p&gt;

&lt;p&gt;Fill form → Get policy → Add to your site.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Pattern
&lt;/h2&gt;

&lt;p&gt;All 4 tools share something:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free&lt;/strong&gt; (no freemium tricks)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast&lt;/strong&gt; (no signup walls)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Focused&lt;/strong&gt; (one job, done well)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's what good developer tools should be.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building something? Drop a link in the comments — I'll check it out.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>startup</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Stop Undercharging: How to Calculate Your Real Freelance Rate</title>
      <dc:creator>Руслан</dc:creator>
      <pubDate>Sun, 15 Mar 2026 21:46:33 +0000</pubDate>
      <link>https://dev.to/_84f82f80221994c2ae/stop-undercharging-how-to-calculate-your-real-freelance-rate-28bo</link>
      <guid>https://dev.to/_84f82f80221994c2ae/stop-undercharging-how-to-calculate-your-real-freelance-rate-28bo</guid>
      <description>&lt;h2&gt;
  
  
  You're Probably Undercharging
&lt;/h2&gt;

&lt;p&gt;I've mentored dozens of freelancers. Almost all of them made the same mistake:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I want to make $80k/year, so I'll charge $40/hour"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Wrong.&lt;/strong&gt; Here's why.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Math
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What Most People Think:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$80,000 ÷ 2,000 hours = $40/hour
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Reality:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;income_goal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80000&lt;/span&gt;      &lt;span class="c1"&gt;# Take-home target
&lt;/span&gt;&lt;span class="n"&gt;tax_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.30&lt;/span&gt;          &lt;span class="c1"&gt;# 30% taxes
&lt;/span&gt;&lt;span class="n"&gt;expenses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;          &lt;span class="c1"&gt;# Software, gear, etc.
&lt;/span&gt;&lt;span class="n"&gt;billable_hours&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;      &lt;span class="c1"&gt;# Per week (not 40!)
&lt;/span&gt;&lt;span class="n"&gt;weeks_off&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;            &lt;span class="c1"&gt;# Vacation, sick days
&lt;/span&gt;
&lt;span class="c1"&gt;# Actual calculation
&lt;/span&gt;&lt;span class="n"&gt;working_weeks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;52&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;weeks_off&lt;/span&gt;  &lt;span class="c1"&gt;# 48
&lt;/span&gt;&lt;span class="n"&gt;total_billable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;billable_hours&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;working_weeks&lt;/span&gt;  &lt;span class="c1"&gt;# 1,200 hours
&lt;/span&gt;
&lt;span class="n"&gt;gross_needed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;income_goal&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;tax_rate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# $114,285
&lt;/span&gt;&lt;span class="n"&gt;total_needed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gross_needed&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;expenses&lt;/span&gt;  &lt;span class="c1"&gt;# $119,285
&lt;/span&gt;
&lt;span class="n"&gt;hourly_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;total_needed&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;total_billable&lt;/span&gt;  &lt;span class="c1"&gt;# $99.40/hour
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;$99/hour&lt;/strong&gt; - not $40.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why 25 Billable Hours?
&lt;/h2&gt;

&lt;p&gt;You can't bill 40 hours/week. Here's where time goes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Activity&lt;/th&gt;
&lt;th&gt;Hours/Week&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Client work (billable)&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Admin, invoicing&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marketing, sales&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning, upskilling&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email, meetings&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;40&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The 5 Mistakes
&lt;/h2&gt;

&lt;p&gt;❌ Forgetting taxes (25-40% gone)&lt;br&gt;
❌ Assuming 40 billable hours&lt;br&gt;
❌ Ignoring business expenses&lt;br&gt;
❌ Skipping vacation/sick time&lt;br&gt;
❌ Not accounting for unbilled work&lt;/p&gt;

&lt;h2&gt;
  
  
  Calculate Yours
&lt;/h2&gt;

&lt;p&gt;I built a free calculator: &lt;strong&gt;&lt;a href="https://freelancehourly.site" rel="noopener noreferrer"&gt;freelancehourly.site&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Enter your:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Income goal&lt;/li&gt;
&lt;li&gt;Expenses&lt;/li&gt;
&lt;li&gt;Tax rate&lt;/li&gt;
&lt;li&gt;Realistic billable hours&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Get your &lt;strong&gt;actual minimum rate&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;Knowing your rate is step 1. Charging it is step 2.&lt;/p&gt;

&lt;p&gt;Here's what helped me:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Know your floor&lt;/strong&gt; - Below this rate, you're losing money&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value-based framing&lt;/strong&gt; - "This will save you $X" not "I charge $Y"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Say the number and shut up&lt;/strong&gt; - Don't justify immediately&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;What's your current rate vs. what it should be? Share in comments (anonymously if you want).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://freelancehourly.site" rel="noopener noreferrer"&gt;freelancehourly.site&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>productivity</category>
      <category>beginners</category>
      <category>startup</category>
    </item>
    <item>
      <title>I Built a Meeting Cost Calculator - Here's What I Learned About Wasted Time</title>
      <dc:creator>Руслан</dc:creator>
      <pubDate>Sun, 15 Mar 2026 21:43:43 +0000</pubDate>
      <link>https://dev.to/_84f82f80221994c2ae/i-built-a-meeting-cost-calculator-heres-what-i-learned-about-wasted-time-2kh3</link>
      <guid>https://dev.to/_84f82f80221994c2ae/i-built-a-meeting-cost-calculator-heres-what-i-learned-about-wasted-time-2kh3</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Last month, our team had a 2-hour "quick sync" with 8 people.&lt;/p&gt;

&lt;p&gt;I did the math: 8 people × 2 hours × $75/hr average = &lt;strong&gt;$1,200&lt;/strong&gt; for one meeting.&lt;/p&gt;

&lt;p&gt;That meeting could have been a Slack message.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;I built &lt;a href="https://meetingcost.site" rel="noopener noreferrer"&gt;Meeting Cost Calculator&lt;/a&gt; - a simple tool that calculates the real cost of meetings based on participants and their hourly rates.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add participants with hourly rates&lt;/li&gt;
&lt;li&gt;See real-time cost as the meeting progresses&lt;/li&gt;
&lt;li&gt;Export reports for management&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Code
&lt;/h3&gt;

&lt;p&gt;Here's the basic calculation logic:&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;calculateMeetingCost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;participants&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;durationMinutes&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;hours&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;durationMinutes&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;participants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;person&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hourlyRate&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;);&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="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Example: 3 people, 1 hour&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calculateMeetingCost&lt;/span&gt;&lt;span class="p"&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;Dev&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;hourlyRate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;75&lt;/span&gt; &lt;span class="p"&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;Designer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;hourlyRate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;65&lt;/span&gt; &lt;span class="p"&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;PM&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;hourlyRate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;85&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Meeting cost: $&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;cost&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// $225&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Shocking Stats
&lt;/h2&gt;

&lt;p&gt;After tracking meetings for a month:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Meeting Type&lt;/th&gt;
&lt;th&gt;Avg Cost&lt;/th&gt;
&lt;th&gt;Could Be Email?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Daily Standup&lt;/td&gt;
&lt;td&gt;$180&lt;/td&gt;
&lt;td&gt;Sometimes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sprint Planning&lt;/td&gt;
&lt;td&gt;$900&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Quick Sync"&lt;/td&gt;
&lt;td&gt;$450&lt;/td&gt;
&lt;td&gt;Usually&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All-Hands&lt;/td&gt;
&lt;td&gt;$3,000+&lt;/td&gt;
&lt;td&gt;Depends&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Async by default&lt;/strong&gt; - If it can be a Loom video, make it a Loom video&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Required agendas&lt;/strong&gt; - No agenda = no meeting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timer visible&lt;/strong&gt; - Showing cost keeps things focused&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://meetingcost.site" rel="noopener noreferrer"&gt;meetingcost.site&lt;/a&gt;&lt;/strong&gt; - Calculate your own meeting costs&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's the most expensive unnecessary meeting you've been in? Drop a comment!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>startup</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Open Graph Tags: Make Your Links Look Good When Shared</title>
      <dc:creator>Руслан</dc:creator>
      <pubDate>Sat, 14 Mar 2026 23:40:38 +0000</pubDate>
      <link>https://dev.to/_84f82f80221994c2ae/open-graph-tags-make-your-links-look-good-when-shared-12pp</link>
      <guid>https://dev.to/_84f82f80221994c2ae/open-graph-tags-make-your-links-look-good-when-shared-12pp</guid>
      <description>&lt;p&gt;You spent hours building your project. You share it on Twitter. And the preview looks like... nothing. Just a plain URL.&lt;/p&gt;

&lt;p&gt;Meanwhile, that random blog post has a beautiful card with an image, title, and description.&lt;/p&gt;

&lt;p&gt;The difference? Open Graph tags.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are Open Graph Tags?
&lt;/h2&gt;

&lt;p&gt;Open Graph (OG) tags are HTML meta tags that control how your page appears when shared on social media.&lt;/p&gt;

&lt;p&gt;They live in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; of your HTML:&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;head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"My Awesome Project"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"A tool that does cool things"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/preview.png"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:url"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When someone shares your link, platforms like Twitter, Facebook, LinkedIn, Slack, and Discord read these tags and render a preview card.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Should You Care?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Links with previews get more clicks.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Which would you click?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Option A: https://example.com/some-long-path/page

Option B: [Beautiful card with image, title, and description]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Studies show rich previews can increase click-through rates by 2-3x.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Essential Tags
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Required Tags
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Title: 60-70 characters max --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Your Page Title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Description: 155-200 characters --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"A compelling description of your page"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Image: 1200x630px recommended --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/og-image.png"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Page URL --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:url"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/page"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Content type --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:type"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"website"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Twitter-Specific Tags
&lt;/h3&gt;

&lt;p&gt;Twitter uses its own tags (but falls back to OG tags):&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="c"&gt;&amp;lt;!-- Card type: summary, summary_large_image, app, player --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:card"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"summary_large_image"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Optional: Your Twitter handle --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:site"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"@yourusername"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- These can duplicate OG tags, or be Twitter-specific --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Your Title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Your description"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/twitter-image.png"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Image Requirements
&lt;/h2&gt;

&lt;p&gt;Different platforms have different preferences:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Recommended Size&lt;/th&gt;
&lt;th&gt;Aspect Ratio&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Facebook&lt;/td&gt;
&lt;td&gt;1200 × 630 px&lt;/td&gt;
&lt;td&gt;1.91:1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Twitter&lt;/td&gt;
&lt;td&gt;1200 × 600 px&lt;/td&gt;
&lt;td&gt;2:1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LinkedIn&lt;/td&gt;
&lt;td&gt;1200 × 627 px&lt;/td&gt;
&lt;td&gt;1.91:1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discord&lt;/td&gt;
&lt;td&gt;1200 × 630 px&lt;/td&gt;
&lt;td&gt;1.91:1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Safe bet:&lt;/strong&gt; Use &lt;strong&gt;1200 × 630 px&lt;/strong&gt; — it works well everywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  Image Tips
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;.png&lt;/code&gt; or &lt;code&gt;.jpg&lt;/code&gt; (some platforms don't support &lt;code&gt;.webp&lt;/code&gt; for OG images)&lt;/li&gt;
&lt;li&gt;Keep file size under 1MB&lt;/li&gt;
&lt;li&gt;Include your logo or branding&lt;/li&gt;
&lt;li&gt;Make text readable at small sizes&lt;/li&gt;
&lt;li&gt;Avoid text near edges (gets cropped on some platforms)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Complete Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- Primary Meta Tags --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;My Project - A Tool That Does Cool Things&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"A comprehensive description for search engines"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- Open Graph / Facebook --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:type"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"website"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:url"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://myproject.com/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"My Project - A Tool That Does Cool Things"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"A compelling description for social sharing"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://myproject.com/og-image.png"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- Twitter --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:card"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"summary_large_image"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:url"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://myproject.com/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"My Project - A Tool That Does Cool Things"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"A compelling description for social sharing"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://myproject.com/og-image.png"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- Your content --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Framework-Specific Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Next.js (App Router)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/layout.js or app/page.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt; &lt;span class="o"&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 Project&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;A tool that does cool things&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;openGraph&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 Project&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;A tool that does cool things&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://myproject.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;siteName&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 Project&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;images&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;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://myproject.com/og-image.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;630&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;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;website&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="na"&gt;twitter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;card&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;summary_large_image&lt;/span&gt;&lt;span class="dl"&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 Project&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;A tool that does cool things&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;images&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;https://myproject.com/og-image.png&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;h3&gt;
  
  
  Nuxt 3
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// nuxt.config.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineNuxtConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;head&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;meta&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;property&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;og:title&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&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 Project&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="na"&gt;property&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;og:description&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A tool that does cool things&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="na"&gt;property&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;og:image&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://myproject.com/og-image.png&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="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;twitter:card&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;summary_large_image&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="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Astro
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
// BaseHead.astro component
const { title, description, image } = Astro.props;
---
&amp;lt;meta property="og:title" content={title} /&amp;gt;
&amp;lt;meta property="og:description" content={description} /&amp;gt;
&amp;lt;meta property="og:image" content={image} /&amp;gt;
&amp;lt;meta name="twitter:card" content="summary_large_image" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testing Your Tags
&lt;/h2&gt;

&lt;p&gt;Before sharing, always test:&lt;/p&gt;

&lt;h3&gt;
  
  
  Free Debuggers
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Facebook Sharing Debugger&lt;/strong&gt; — developers.facebook.com/tools/debug/&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Twitter Card Validator&lt;/strong&gt; — cards-dev.twitter.com/validator&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn Post Inspector&lt;/strong&gt; — linkedin.com/post-inspector/&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenGraph.xyz&lt;/strong&gt; — Free preview for multiple platforms&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Quick Generation
&lt;/h3&gt;

&lt;p&gt;Don't want to write tags manually? Use a generator:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://ogtags.site" rel="noopener noreferrer"&gt;OGTags.site&lt;/a&gt;&lt;/strong&gt; — Generate all the tags you need, preview how they'll look, and copy the HTML.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Relative Image URLs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- ❌ Won't work --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"/images/og.png"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- ✅ Use absolute URLs --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/images/og.png"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Missing Image Dimensions
&lt;/h3&gt;

&lt;p&gt;Some platforms cache better with explicit dimensions:&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;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/og.png"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:image:width"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"1200"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:image:height"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"630"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Not Handling Cache
&lt;/h3&gt;

&lt;p&gt;Social platforms cache previews aggressively. After updating your tags:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the Facebook debugger to force a re-scrape&lt;/li&gt;
&lt;li&gt;Add a version query param: &lt;code&gt;og-image.png?v=2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Wait (Twitter can cache for up to 7 days)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Same Image for Everything
&lt;/h3&gt;

&lt;p&gt;Create page-specific OG images when possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Blog posts: Include the title on the image&lt;/li&gt;
&lt;li&gt;Products: Show the product&lt;/li&gt;
&lt;li&gt;Profiles: Show the user's avatar&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dynamic OG Images
&lt;/h2&gt;

&lt;p&gt;For sites with many pages, generate images programmatically:&lt;/p&gt;

&lt;h3&gt;
  
  
  Vercel OG Image Generation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/api/og/route.js&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;ImageResponse&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;next/og&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&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;searchParams&lt;/span&gt; &lt;span class="p"&gt;}&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;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&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;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Default Title&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ImageResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;white&lt;/span&gt;&lt;span class="dl"&gt;'&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;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;630&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;Then use: &lt;code&gt;https://yoursite.com/api/og?title=Your+Page+Title&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Checklist
&lt;/h2&gt;

&lt;p&gt;Before launching:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;code&gt;og:title&lt;/code&gt; — Clear, compelling, under 70 chars&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;og:description&lt;/code&gt; — Actionable, under 200 chars&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;og:image&lt;/code&gt; — 1200×630px, absolute URL, under 1MB&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;og:url&lt;/code&gt; — Canonical page URL&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;twitter:card&lt;/code&gt; — Set to &lt;code&gt;summary_large_image&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Tested on Facebook, Twitter, LinkedIn debuggers&lt;/li&gt;
&lt;li&gt;[ ] Image loads fast (use a CDN)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;OG tags take 5 minutes to add but make every share of your project look professional. Don't let bad previews undersell your work.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Need help generating OG tags? &lt;a href="https://ogtags.site" rel="noopener noreferrer"&gt;ogtags.site&lt;/a&gt; — preview and generate all the meta tags you need.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>html</category>
      <category>seo</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
