NOVA Blogs Logo

How to Get a Free Custom Domain Using GitHub Student Pack, Cloudflare, and Render

Jonsnow
Jonsnow@Twitter

[Disclaimer]:

You don’t need to be an expert, but having a basic idea of how domains and DNS work (things like CNAME records, nameservers, and HTTPS) will help you understand why each step matters , not just what to click.

How it started:

I initially deployed my site on Render, which was accessible at:

https://jonsnow-l01g.onrender.com

To prevent Render’s inactivity timeout (15 mins), I used UptimeRobot to periodically ping the deployed endpoint, ensuring the service remains active.It worked fine but let’s be honest, that URL doesn’t exactly scream professional.

So I decided to get a custom domain, and thankfully, I still had my GitHub Student Developer Pack unclaimed :) . I immediately added my student email to GitHub, verified it, and waited.

Yes… waited.

It took almost 4 full days (≈72 hours) for GitHub to approve my student status.

Patience unlocked: free domain 🔓 . GitHub’s student pack offers a free .me domain via Namecheap, so that’s what I went with.

Claiming the Free Domain

  1. Log in to GitHub Education

    https://education.github.com/learner/learn

  2. Connect Namecheap from the Student Pack

    https://education.github.com/pack#namecheap

Purchasing the Domain (Namecheap):

  1. Get your desired domain name and click complete order.

    Screenshot From 2026-01-21 23-48-09

    Check GitHub Pages only if you want to host username.github.io on your domain (domain-name.me).Otherwise, leave it unchecked.Then enter your primary GitHub email (use your student email if it is set as primary) and click Finish up.

    Screenshot From 2026-01-21 23-48-55
  2. Then Go to your namecheap dashboard and check your purchased domain . Screenshot From 2026-01-21 23-50-04

Why I Switched to Cloudflare ?

Now , I thought of using cloudflare as my DNS provider instead of default Namecheap.This is because Cloudflare offers,

  1. Fast loading
  2. Free HTTPS on custom domain
  3. Attack protection (DDoS, bots)
  4. Render/Vercel/Netlify dynamic hosting ( Namecheap can’t)
  5. Hide hosting provider IP.

Now , login to your cloudflare account .

  1. Go to domain in the dashbaord

  2. Select onboard domain and enter your purchased .me domain name and click continue .

    Screenshot From 2026-01-21 23-50-59
  3. When you add the site, Cloudflare auto-imports Namecheap's default records , delete all those records to avoid conflicts . Especially delete any AAAA (IPv6) records ( Render is IPv4-only).

  4. Next cloudflare gives you two custom nameservers ( e.g 1-a.ns.cloudflare.com , 1-b.ns.cloudflare.com ) .

  5. Copy those nameservers , go to Namecheap dashbaord , Domain List → Manage domain → Nameservers section (dropdown) .

  6. Select Custom DNS, Paste Cloudflare's two nameservers.

    What happens next ?

    Namecheap tells the global .me registry:
    "From now on, don't ask me for DNS records anymore , ask Cloudflare's nameservers instead."
    This change is registered at the root zone level (the highest level of DNS hierarchy).
    After propagation (minutes to hours), every DNS resolver in the world starts asking Cloudflare directly.
    
  7. In the terminal use ,

    dig NS <domain.name.me> 
    

    to verify the DNS records of NS which was provided by cloudflare.

Connecting the Domain to Render

  1. Go to render dashboard → project → your-service → settings → custom domains

  2. Add your custom domain domain-name.me , the www.domain-name.me gets added by itself.

    Screenshot From 2026-01-21 23-53-32

    Your domain does not yet point to your service! Next, you'll configure DNS.

Configuring Cloudflare DNS

  1. Now go to cloudflare dashboard → DNS →Records → Add record

    Record 1:

    1. Type → CNAME
    2. Name →@ ( @ → targets the domain-name.me )
    3. Target → render / vercel deployed domain ( without www or https ) ( e.g jonsnow-l01g.onrender.com )
    Screenshot From 2026-01-21 23-54-15

    Similary Record 2:

    Type → CNAME

    Name → www

    Target → same as record 1

    and most importantly Set **Proxy status** to **DNS only** for both records. This ensures that requests go to Render instead of Cloudflare, so that we can verify the domain and issue a certificate. After cert issued , turn to proxy .

    What does this do ?

    When someone types domain-name.me:
    Their browser asks Cloudflare (via the nameservers).
    Cloudflare sees the CNAME → knows to forward traffic to Render.
    Because it’s proxied: Cloudflare gives visitors its own IP (not Render’s)
    
  2.  DNS changes might take a few minutes (5-20 mins) but may take longer in rare case to propagate . Once resolved, your domain will point to your Render service. You can verify certificate status in the Render Dashboard under Custom Domains.

    Screenshot From 2026-01-21 23-55-50
  3. Once Render shows 'Certificate Issued' (green), return to Cloudflare DNS → set both CNAMEs back to Proxied (orange cloud).

  4. Congrats! Your portfolio is now live at https://yourdomain.me — fast, secure, DDoS-protected, with hidden origin IP and free HTTPS.

Complete flow:

  1. User types domain-name.me in browser.
  2. Browser asks DNS, "Where is domain-name.me?"
  3. DNS resolver finds your nameservers (Cloudflare) → asks Cloudflare.
  4. Cloudflare looks up the CNAME record → sees it points to render-domain.onrender.com → forwards the request (proxied).
  5. Request hits Render’s servers.
  6. Render recognizes the hostname → serves your portfolio.
  7. Response goes back through Cloudflare → user sees fast, secure page .

You didn’t just buy a domain ,you wired yourself into the internet. Thanks for reading.Bye..

Reference:

https://render.com/docs/custom-domains