Domain, DNS, SSL, and go-live in one sitting.
The final mile from deployed app to shareable URL. Custom domain, HTTPS, loading speed, social previews, and the monitoring you need before you post on Product Hunt.
Your app lives at a random *.vercel.app address. Give it a real name before you share the link.
Buy a domain from Namecheap, Cloudflare Registrar, or Google Domains. Pick a .com if you can. .co, .io, and .dev are solid alternatives. Avoid obscure endings like .biz and .xyz — spam filters flag them and users trust them less.
Your hosting platform (Vercel, Netlify, Railway) gives you one or two DNS records to add at your domain registrar. Copy the values they show, paste them into the DNS settings at your registrar, save. DNS propagation usually completes in under 10 minutes.
Modern hosting platforms provision an SSL certificate automatically the moment you add a domain — it usually takes a minute or two. Open https://yourapp.com (with the `s`) and confirm the connection is secure. If you hit a "Not Secure" warning, give it another few minutes; if it persists past half an hour, double-check your DNS records.
Decide whether your canonical URL is yourapp.com or www.yourapp.com. The other version should redirect to your chosen one. Most hosting platforms set this up automatically when you add both. Confirm by opening each version — they should land on the same URL.
Fast apps convert better. These are the easy wins before your first real user.
A single unoptimized hero image can add 3 seconds to your load time. Use the Next.js Image component (it handles resizing and modern formats like WebP automatically), or convert your assets to WebP/AVIF by hand. Only the images visible on first paint need to load immediately — everything else can defer until the user scrolls.
Lighthouse is the performance auditor built into Chrome. Open your site in Chrome, right-click → Inspect → Lighthouse tab → Generate report. Aim for 80+ on Performance and Best Practices. The top three fixes are almost always oversized images and render-blocking third-party scripts.
AI tools skip loading states by default. Users click a button, see a blank screen, assume the app is broken. Add skeleton loaders or spinners while data fetches, and a global error boundary that shows a "Something went wrong" fallback instead of a white screen.
Make your app look sharp when someone shares the link on Twitter, Slack, or Discord — and when it shows up in Google.
The preview image that appears when your URL is pasted into Twitter, Slack, or Discord. Design it in Figma or Canva, or generate one programmatically with vercel.com/og. Dark background, product wordmark, and a single-line tagline is a reliable template. Save the result as `og-image.png` in `public/`.
Drop `favicon.ico` into your `public/` folder for the browser tab icon. Add `apple-touch-icon.png` (180×180) for iOS home-screen icons, and a 512×512 PNG if you ever plan to ship a PWA manifest. Generators like realfavicongenerator.net produce the full set from a single source image.
The final sanity checks before you post the link. Do these in order.
Open an incognito window. Sign up with a fresh email. Confirm the verification email arrives. Click the link. Complete onboarding. Use your core feature end to end. Anything that breaks here breaks for every new user — fix it before you ship the link.
Open your app on your actual device — not the responsive preview in DevTools. Real phones surface bugs the preview misses: tap targets too small, layout overflow, buttons hidden behind the bottom bar. Walk through signup, navigation, and your core flow.
Point BetterStack, UptimeRobot, or Checkly (all free for basic use) at the `/api/health` endpoint from the prototype-to-production guide. They'll ping it every minute and alert you — email, Slack, or SMS — the moment your app stops responding.
Your app lives at a random *.vercel.app address. Give it a real name before you share the link.
Buy a domain from Namecheap, Cloudflare Registrar, or Google Domains. Pick a .com if you can. .co, .io, and .dev are solid alternatives. Avoid obscure endings like .biz and .xyz — spam filters flag them and users trust them less.
A *.vercel.app URL reads "side project." A custom domain reads "real product." It also matters for email deliverability and for showing up in Google results.
Your hosting platform (Vercel, Netlify, Railway) gives you one or two DNS records to add at your domain registrar. Copy the values they show, paste them into the DNS settings at your registrar, save. DNS propagation usually completes in under 10 minutes.
Modern hosting platforms provision an SSL certificate automatically the moment you add a domain — it usually takes a minute or two. Open https://yourapp.com (with the `s`) and confirm the connection is secure. If you hit a "Not Secure" warning, give it another few minutes; if it persists past half an hour, double-check your DNS records.
# Quick sanity check — should return HTTP/2 200:
curl -sI https://yourapp.com | head -1
# Certificate issues almost always resolve by waiting a few minutes.
# Vercel, Netlify, and Railway all provision certificates for free.Decide whether your canonical URL is yourapp.com or www.yourapp.com. The other version should redirect to your chosen one. Most hosting platforms set this up automatically when you add both. Confirm by opening each version — they should land on the same URL.
Fast apps convert better. These are the easy wins before your first real user.
A single unoptimized hero image can add 3 seconds to your load time. Use the Next.js Image component (it handles resizing and modern formats like WebP automatically), or convert your assets to WebP/AVIF by hand. Only the images visible on first paint need to load immediately — everything else can defer until the user scrolls.
// Next.js — the Image component auto-optimizes and lazy-loads.
import Image from 'next/image';
// Above the fold — preload it.
<Image
src="/hero.png"
alt="Hero image"
width={1200}
height={630}
priority
/>
// Below the fold — lazy-loaded by default. No extra config.
<Image
src="/feature.png"
alt="Feature screenshot"
width={800}
height={400}
/>Lighthouse is the performance auditor built into Chrome. Open your site in Chrome, right-click → Inspect → Lighthouse tab → Generate report. Aim for 80+ on Performance and Best Practices. The top three fixes are almost always oversized images and render-blocking third-party scripts.
A checklist tells you what to do. A scan proves you did it. Paste your URL and verify everything in minutes.
AI tools skip loading states by default. Users click a button, see a blank screen, assume the app is broken. Add skeleton loaders or spinners while data fetches, and a global error boundary that shows a "Something went wrong" fallback instead of a white screen.
// app/layout.tsx — Global error boundary
'use client';
export default function GlobalError({ error, reset }: {
error: Error; reset: () => void;
}) {
return (
<div className="flex min-h-screen items-center justify-center">
<div className="text-center">
<h2 className="text-xl font-bold">Something went wrong</h2>
<button onClick={reset} className="mt-4 rounded bg-blue-500 px-4 py-2 text-white">
Try again
</button>
</div>
</div>
);
}Make your app look sharp when someone shares the link on Twitter, Slack, or Discord — and when it shows up in Google.
These are the three things that decide whether anyone clicks your link — in search results and in every social preview. Write a short title (under 60 characters), a one-sentence description (under 155), and point to a 1200×630 preview image. In Next.js, define them in the metadata export of your root layout.
// app/layout.tsx (Next.js)
export const metadata = {
title: 'YourApp — one-line description',
description: 'What your app does, in 155 characters or less.',
openGraph: {
title: 'YourApp — one-line description',
description: 'What your app does, in 155 characters or less.',
url: 'https://yourapp.com',
siteName: 'YourApp',
images: [{ url: '/og-image.png', width: 1200, height: 630 }],
type: 'website',
},
twitter: {
card: 'summary_large_image',
title: 'YourApp',
description: 'What your app does.',
images: ['/og-image.png'],
},
};The preview image that appears when your URL is pasted into Twitter, Slack, or Discord. Design it in Figma or Canva, or generate one programmatically with vercel.com/og. Dark background, product wordmark, and a single-line tagline is a reliable template. Save the result as `og-image.png` in `public/`.
Drop `favicon.ico` into your `public/` folder for the browser tab icon. Add `apple-touch-icon.png` (180×180) for iOS home-screen icons, and a 512×512 PNG if you ever plan to ship a PWA manifest. Generators like realfavicongenerator.net produce the full set from a single source image.
The final sanity checks before you post the link. Do these in order.
Open an incognito window. Sign up with a fresh email. Confirm the verification email arrives. Click the link. Complete onboarding. Use your core feature end to end. Anything that breaks here breaks for every new user — fix it before you ship the link.
Open your app on your actual device — not the responsive preview in DevTools. Real phones surface bugs the preview misses: tap targets too small, layout overflow, buttons hidden behind the bottom bar. Walk through signup, navigation, and your core flow.
Point BetterStack, UptimeRobot, or Checkly (all free for basic use) at the `/api/health` endpoint from the prototype-to-production guide. They'll ping it every minute and alert you — email, Slack, or SMS — the moment your app stops responding.
# After your /api/health endpoint is live:
# 1. betterstack.com or uptimerobot.com → new monitor
# 2. URL: https://yourapp.com/api/health
# Interval: 60 seconds
# Alert: email, Slack, or SMSPaste your URL into a Slack DM to yourself, a private Discord channel, or the Twitter compose box. The preview image, title, and description should all render cleanly. If anything looks off, fix it now — not after the Product Hunt post goes live.