Supabase and Vercel on the GitHub Student Pack
Neither Supabase nor Vercel is a GitHub Student Developer Pack partner. Here is what the pack actually covers for this stack, the full free-tier setup sequence, and the limits that bit me running it in production.
Table of contents
Neither Supabase nor Vercel is a GitHub Student Developer Pack partner. I checked the official pack page and GitHub Education's own partner repo on 6 September 2026. There is no Supabase student code and no Vercel student code to redeem. The good news is you do not need one: Supabase's Free plan and Vercel's Hobby plan already cover a real production site, and the one thing you would otherwise pay for — a domain — is in the pack.
This post is the setup sequence I actually use, plus the limits that bit me. I run this stack: Next.js 16, React 19, Supabase, Vercel, on my own domain.
What the pack really gives a Supabase + Vercel build
The pack is worth claiming, just not for the reasons the search results imply. Checked against the official partner list on 6 September 2026, these are the offers that touch this stack:
- —Namecheap — 1 year of a
.medomain plus 1 free SSL certificate for a year - —Name.com — 1 free year of domain registration plus a year of Advanced Security
- —Tech Domains — one standard
.TECHdomain free for 1 year - —Mailgun — 20,000 free emails and 100 email validations per month for up to 12 months
- —Stripe — waived transaction fees on the first $1,000 of revenue processed
- —Sentry — a student tier with 50K errors and Team features, 1 year, renewable
GitHub's own repo warns that offers "are subject to change at the request of the third party partner." I have seen blog posts confidently list Vercel and Supabase in the pack. They are wrong in a way that costs you an afternoon. Check the live page before you plan around an offer. Which pack offers are permanent versus disguised trials is its own question, covered in free vs trial in the Student Pack; the domain-plus-hosting combination is in the free domain and hosting stack.
The setup sequence, in the order that avoids rework
Order matters here for two reasons: DNS takes time to propagate, and half the environment variables do not exist until the Supabase project is created.
1. Claim the domain first
Redeem the Namecheap .me or the .TECH offer before you write any code. DNS changes are the slowest thing in this whole process and they are not blocked by anything else.
2. Create the Supabase project
Pick the region deliberately — it is set at project creation. Choose the region closest to your users, not to you. Then link the CLI so your schema lives in git rather than only in a web dashboard:
npm install -D supabase # dev dependency: global npm install is not supported
npx supabase login
npx supabase link --project-ref abcdefghijklmnopqrst
npx supabase db pull # live schema -> supabase/migrations/
npx supabase gen types typescript --linked > lib/database.types.ts
npx supabase db pull is the step most tutorials skip. Without it your schema exists only in the dashboard, and the day you need to recreate the project — which, on the Free plan, you will — you are reverse-engineering it from memory.
3. Connect Vercel to the repo
Here is a gotcha that has nothing to do with code. Vercel's docs state plainly that a project on a Hobby team cannot be connected to a Git repository owned by a GitHub organization. Personal repos only. If your coursework or club repo lives under an org, you either move it to your personal account or create a Vercel team.
4. Pull the environment variables down
npm i -g vercel
vercel login
vercel link
vercel env pull .env.local # NEXT_PUBLIC_SUPABASE_URL, anon key, etc.
Set SUPABASE_SERVICE_ROLE_KEY in the Vercel dashboard, never in NEXT_PUBLIC_*. Anything prefixed NEXT_PUBLIC_ ships to the browser. The service role key bypasses row-level security. I keep the service key out of any file the client bundle can reach, and structure admin access as its own guarded surface — the pattern is in how I structure a Supabase admin panel.
The limits that actually bite
Every figure below is from the vendors' own documentation, checked on 6 September 2026.
| Constraint | Supabase Free | Vercel Hobby | What it breaks |
|---|---|---|---|
| Database size | 500 MB | — | Analytics or log tables fill it first |
| Egress | 5 GB + 5 GB cached | Cap shown in dashboard Usage | Unoptimised images |
| File storage | 1 GB | — | User uploads |
| Active projects | 2 | 200 | Side projects compete for slots |
| Inactivity | Paused after 7 days | — | Your demo is dead on demo day |
| Backups | None | — | No download, no restore point |
| Log retention | 1 day | 1 hour of runtime logs | Debugging yesterday's bug |
| Compute ceiling | Edge Functions: 150s wall, 2s CPU, 256 MB | 1M invocations, 4 Active CPU hours, 360 GB-hrs memory | Long AI calls hit CPU, not wall clock |
| Scheduled jobs | — | Once per day, ±59 min | Anything wanting hourly |
| Images | — | 5K transformations, 300K cache reads/month | Image-heavy blogs |
| Commercial use | Allowed | Not allowed | Client work |
Five of those deserve their own explanation.
Free Supabase projects pause after a week of inactivity
Supabase's production checklist says it directly: projects on the Free plan that show low activity over a 7-day period may be paused. You restore from the dashboard, but restore is not instant, and the first person to notice is usually whoever you sent the link to.
The fix is a daily cron that touches the database. On Hobby you get one run per day, and Vercel may fire it anywhere inside the scheduled hour, so schedule it for a time you do not care about:
{
"$schema": "https://openapi.vercel.sh/vercel.json",
"crons": [{ "path": "/api/cron/keepalive", "schedule": "0 6 * * *" }],
"functions": { "app/api/**/*": { "maxDuration": 60 } }
}
// app/api/cron/keepalive/route.ts
import { createClient } from '@supabase/supabase-js';
export const maxDuration = 10;
export async function GET(request: Request) {
const secret = process.env.CRON_SECRET;
if (!secret || request.headers.get('authorization') !== `Bearer ${secret}`) {
return new Response('Unauthorized', { status: 401 });
}
const supabase = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.SUPABASE_SERVICE_ROLE_KEY!,
);
// head + count: a real query, no rows transferred.
const { count, error } = await supabase
.from('blog_posts')
.select('id', { count: 'exact', head: true });
if (error) {
return Response.json({ ok: false, error: error.message }, { status: 500 });
}
return Response.json({ ok: true, rows: count });
}
Set CRON_SECRET in the Vercel dashboard and Vercel sends it as an Authorization: Bearer header on every invocation. Without that check, your keep-alive endpoint is a public URL anyone can hammer against your invocation budget.
One more thing the docs are honest about and most tutorials are not: cron delivery is best effort, so a run can be missed or duplicated, and Vercel does not retry a failure. Write the handler so running it twice is harmless — the head: true count above is idempotent by construction.
Direct Postgres connections are IPv6-only on the Free plan
This cost me the most time and produces the least helpful error. A direct connection to db.[ref].supabase.co:5432 resolves over IPv6 by default; IPv4 is a paid add-on. Plenty of serverless and CI environments are IPv4-only, and what you see is a connection timeout, not a "you need IPv4" message.
The answer is Supavisor, the shared pooler, which is IPv4 on every tier:
| Mode | Port | Use it for |
|---|---|---|
| Direct | 5432 | Long-lived servers, IPv6 available |
| Supavisor session | 5432 (pooler host) | Persistent clients on IPv4-only networks |
| Supavisor transaction | 6543 (pooler host) | Serverless and edge functions |
Transaction mode is what Supabase recommends for serverless — it is built for many short-lived connections. The catch: transaction mode cannot support prepared statements, so ORMs that lean on them need configuring. If you are using @supabase/supabase-js over the REST API rather than a raw Postgres driver, none of this applies; the pooler question only appears the moment you reach for Prisma, Drizzle or pg.
The function timeout changed, and old advice is now wrong
Vercel's current duration table, with fluid compute (on by default):
| Plan | Default | Maximum |
|---|---|---|
| Hobby | 300s | 300s |
| Pro | 300s | 800s (1800s in beta) |
If your project was deployed before 23 April 2025 and is not using fluid compute, you are on the legacy limits: 10s default, 60s maximum on Hobby. Every "Vercel Hobby only gives you 10 seconds" post you find is describing that older regime. Check which one you are on before you architect around a timeout that no longer exists.
Note that Supabase Edge Functions bind on a different axis: 150s of wall clock but only 2 seconds of CPU time. Waiting on an external API is cheap; parsing a large payload in JS is not.
Hobby is non-commercial, in writing
Vercel's Hobby documentation points at the fair use guidelines and says the plan "restricts users to non-commercial, personal use only." Your portfolio is fine. A freelance client's site is not. I go through what that actually rules out in what the Vercel free tier covers for students.
Exceeding a Hobby usage limit is also not a bill — it is a lockout. The docs are blunt: in most cases you wait until 30 days have passed before you can use that feature again.
Cold starts: I could not find a published number
I went looking for an official cold-start figure and did not find one. Neither vendor publishes a committed cold-start latency for free-tier functions, and every number circulating in blog posts is someone's unrepeated benchmark on unknown hardware. So I will not quote one. Measure yours: a performance.now() at the top of the handler and a log line beats any third-hand figure.
What I run on this stack
My own site is Next.js 16 + React 19 + Supabase + Vercel, roughly 390 indexed URLs. In the 85 days to 3 September 2026 it drew 4,553 impressions and 22 clicks in Search Console. At that volume none of the quantitative ceilings above are anywhere close. Every limit that actually caused me work was structural: project pausing, IPv6, the once-per-day cron.
That last one shaped the architecture. I run an autonomous agent system here, and because Hobby cron fires once a day at an imprecise time, a tight polling loop was never an option. Agents write proposed actions into a pending_actions table for me to approve rather than writing to live tables — a better design for reasons beyond the cron limit, covered in why agents get an approval queue, not write access. A platform constraint pushed me toward a safer pattern more often than the tutorials admit.
FAQ
Is Supabase free with the GitHub Student Developer Pack?
No. Supabase is not a Student Developer Pack partner as of 6 September 2026 — it does not appear on the official pack page or in GitHub Education's partner list. Supabase's own Free plan is what you use: 500 MB database, 5 GB egress, 1 GB file storage, 50,000 monthly active users, 2 active projects.
Does Vercel give students a free Pro plan through GitHub Student?
No. Vercel is not in the pack either. The Hobby plan is free and includes 1 million function invocations, 4 Active CPU hours and 360 GB-hrs of provisioned memory per month, with a 300-second function maximum. Pro is $20 per developer per month if you need team features, per-minute crons or commercial use.
Can I host a client website on the Vercel Hobby plan?
Not within the terms. Vercel's Hobby documentation restricts the plan to non-commercial, personal use. Client work belongs on Pro.
Why did my Supabase project get paused?
Free-plan projects with low activity over a 7-day window may be paused to save server resources. Restore it from the dashboard, then add a daily cron that runs a real query so the project never goes quiet — the route handler above is the whole fix.
How do I connect to Supabase from Vercel if direct connections time out?
Use the Supavisor pooler rather than the direct db.[ref].supabase.co host. Free-plan direct connections are IPv6-only; the pooler is IPv4 on all tiers. Transaction mode on port 6543 is the one Supabase recommends for serverless functions.
Building your first real project on this stack and want a second pair of eyes before it goes live? I run the same setup in production and will tell you which limit you are about to hit. See my services or get in touch.
Sources, all checked 6 September 2026: GitHub Student Developer Pack · GitHub Education partner list · Supabase pricing · Supabase production checklist · Supabase connection methods · Supabase Edge Function limits · Vercel limits · Vercel Hobby plan · Vercel fair use guidelines · Vercel function duration · Vercel pricing · Vercel cron limits · Securing cron jobs
Get the AI Automation Playbook
The real architecture behind a 6-agent AI content team — what it saves, what it gets wrong, and the propose-then-approve pattern that makes it safe to trust.
Browse all free guides →Run this on your own numbers
Content ROI & Payback Calculator — free, no signup, runs in your browser.
Want to implement this with guidance?
Santosh helps founders turn insights like this into real systems.
External Resources
Further Reading & Tools
Make.com Blog
No-code automation tutorials, workflow templates, and integration guides
Zapier Learn
Automation best practices, productivity guides, and tool integrations
OpenAI Platform
API documentation for building AI-powered automation workflows
n8n Blog
Open-source workflow automation guides and integration examples