I can recall countless late nights as a student spent building out ideas that felt like breakthroughs. My own thesis had significant costs associated with the tools and computational resources I needed. The reality for students is that turning ideas into working applications often requires production-grade tools, and having to pay for them can stop a great project before it even starts. We don’t think that cost should stand in the way of building out your ideas.
Cloudflare’s Developer Platform already makes it easy for anyone to go from idea to launch. It gives you all the tools you need in one place to work on that class project, build out your portfolio, and create full-stack applications. We want students to be able to use these tools without worrying about the cost, so starting today, students at least 18 years old in the United States with a verified .edu email can receive 12 months of free access to Cloudflare’s developer features. This is the first step for Cloudflare for Students, and we plan to continue expanding our support for the next generation of builders.
12 months of our paid developer features plan at no upfront cost
Eligible student accounts will receive increased usage allotments for our developer features compared to our free plan. That includes Workers, Pages Functions, KV, Containers, Vectorize, Hyperdrive, Durable Objects, Workers Logpush, and Queues. With these, you can build everything from APIs and full-stack apps to data pipelines and websites.
After 12 months, you can easily renew your subscription by upgrading to our Workers Paid plan. If you choose not to, your account will automatically revert to the free plan, and you won't be charged.
Here’s a look at the increased usage allotments students can receive today. Above those free allotments, our standard usage rates will apply.
| Free Plan | Student Accounts (Paid developer features) |
---|
Workers | 100,000 requests/day
| 10 million requests/month + $.30 per additional million requests |
Workers KV | 100,000 read operations/day 1,000 write, delete, list operations per day | 10 million read operations/month 1 million write, delete, and list operations per month |
Hyperdrive | 100,000 database queries/day | Unlimited database queries / day |
Durable Objects | 100,000 requests/day | 1 million requests / day + $0.15 / per additional million requests |
Workers Logs | 200,000 log events / day 3 Days of retention | 20 million log events / month 7 Days of retention +$0.60 per additional million events |
Workers Logpush | Not Included | 10 million log events / month +$0.05 per additional million log events |
Queues | Not Included | 1 million operations/month included +$0.40 per additional million operations |
You’ll also have access to a dedicated Discord channel just for students. We want to see what you’re building! This is a place to connect with peers, get support, and share ideas in a community of student developers.
Curious about what’s possible with Cloudflare’s developer features? Here are some projects from our community:
by Daniel Foldi
Adventure is a text-based adventure game running on Cloudflare Workers that uses Workers AI to generate the stories with the @cf/google/gemma-3-12b-it model.
The project’s developer chose Workers AI with the OpenNext adapter because it made deployment simple and handled scaling automatically. It uses the Workers Paid plan mainly to enable Workers Logpush and get access to detailed logs for better monitoring and analysis.
When a new game starts, the server gives the AI a custom prompt to set the scene and explain how the adventure should work. From there, each time the player makes a choice, their story history is sent back to the server, which asks the AI to continue the narrative, allowing the story to evolve dynamically based on the player’s choices.
The code below shows how this logic is implemented:
"use server";
import { getCloudflareContext } from "@opennextjs/cloudflare";
async function prime(env: CloudflareEnv) {
const id = Math.floor(Math.random() * 1000000);//unique ID for each game run
const messages = [
{
role: "user",
content:
`The user is playing a text-based adventure game. Each game is different, this is game ${id}. Your first job is to create a short background story in 3-4 sentences. Scenarios may include interesting locations such as jungles, deserts, caves.
After the first message, each of your messages will be responses to the user interaction. State three short options (A, B, C). The user responses will be the chosen action. Your responses should end by asking the user about their choice.
Your message will be shown to the user directly, so avoid "Certainly", "Great", "Let's get started", and other filler content, and avoid bringing up technical details such as "this is game #id".
The games should have a win condition that is actually feasible given the story, and if the player loses, the message should end with "Try again.".
`,
},
];
//Call Workers AI to generate the first response (story intro)
const { response } = await env.AI.run("@cf/google/gemma-3-12b-it", { messages });
return [
...messages,
{ role: "assistant", content: response }
];
}
/**
* Main server action for the adventure game.
* If no input yet, it primes the game with the opening story
* If there is input, it continues the story based on the full history
* Uses getCloudflareContext from @opennextjs/cloudflare to access env.
*/
export async function adventureAction(input: any[]) {
let { env } = await getCloudflareContext({ async: true });
return input.length === 0
? await prime(env)
: [...input,
{ role: "assistant", content: (await env.AI.run("@cf/google/gemma-3-12b-it", { messages: input })).response }
];
}
by Matt Cowley
DNS over Discord is a bot that lets you run DNS lookups right inside Discord. Instead of switching to a terminal or online tool, you can use simple slash commands to check records like A, AAAA, MX, TXT, and more.
The developer behind the project chose Cloudflare Workers because it’s a great platform for running small JavaScript apps that handle requests, which made it a good fit for Discord’s slash commands. Since every command translates into a request and the bot sees a lot of traffic, the free tier wasn’t enough, so it now runs on Workers Paid to keep up reliably without hitting request limits.
In this project, the Worker checks if the request is a Discord interaction, and if so, it sends it to the right command (e.g., /dig, /multi-dig, etc.), using a handler that calls out to a custom framework for Discord slash commands. If it’s not from Discord, it can also serve routes like the privacy page or terms of service.
Here’s what that looks like in code:
export default {
// Process all requests to the Worker
fetch: async (request, env, ctx) => {
try {
// Include the env in the context we pass to the handler
ctx.env = env;
// Check if it's a Discord interaction (or a health check)
const resp = await handler(request, ctx);
if (resp) return resp;
// Otherwise, process the request
const url = new URL(request.url);
if (request.method === 'GET' && url.pathname === '/privacy')
return new textResponse(Privacy);
if (request.method === 'GET' && url.pathname === '/terms')
return new textResponse(Terms);
// Fallback if nothing matches
return new textResponse(null, { status: 404 });
} catch (err) {
// Log any errors
captureException(err);
// Re-throw the error
throw err;
}
},
};
by James Ross
placeholders.dev
is a service that generates placeholder images, making it easy for developers to prototype and scaffold websites without dealing with hosting or asset management. Users can generate placeholders instantly with a simple URL, such as: https://images.placeholders.dev/350x150
Since placeholders are typically used in early development, speed and consistency matter, and images need to load instantly so the workflow isn’t interrupted. Running on Cloudflare Workers makes the service fast and consistent no matter where developers are.
This project uses the Workers Paid plan because it regularly exceeds the free-tier limits on requests and compute time. The Worker below shows the core of how the service works. When a request comes in, it looks at the URL path (like /300x150
) to determine the size of the placeholder, applies some defaults for style, and then returns an SVG image on the fly.
export default {
async fetch(request: Request, env: Env, ctx: ExecutionContext) {
try {
const url = new URL(request.url);
const cache = caches.default;
// Handle requests for the placeholder API
if (url.host === 'images.placeholders.dev' || url.pathname.startsWith('/api')) {
// Try edge cache first
const cached = await cache.match(url, { ignoreMethod: true });
if (cached) return cached;
// Default placeholder options
const imageOptions: Options = {
dataUri: false, // always return an unencoded SVG source
width: 300,
height: 150,
fontFamily: 'sans-serif',
fontWeight: 'bold',
bgColor: '#ddd',
textColor: 'rgba(0,0,0,0.5)',
};
// Parse sizes from path (e.g. /350 or /350x150)
const sizeParts = url.pathname.replace('/api', '').replace('/', '').split('x');
if (sizeParts[0]) {
const width = sanitizeNumber(parseInt(sizeParts[0], 10));
const height = sizeParts[1] ? sanitizeNumber(parseInt(sizeParts[1], 10)) : width;
imageOptions.width = width;
imageOptions.height = height;
}
// Generate SVG placeholder
const response = new Response(simpleSvgPlaceholder(imageOptions), {
headers: { 'content-type': 'image/svg+xml; charset=utf-8' },
});
// Cache result
response.headers.set('Cache-Control', 'public, max-age=' + cacheTtl);
ctx.waitUntil(cache.put(url, response.clone()));
return response;
}
return new Response('Not Found', { status: 404 });
} catch (err) {
console.error(err);
return new Response('Internal Error', { status: 500 });
}
},
};
Check out Built With Workers to see what other developers are building with our developer platform.
This offering is available to United States students at least 18 years old with a verified .edu billing email address.
Based on when your account was created, you can redeem this offer either by signing up for a free Cloudflare account with your .edu email or by filling out a form to request access for your existing .edu account. Just make sure your verified .edu email address is your billing email address.
| New .edu accounts | Existing .edu accounts |
---|
Creation Date | Created on/after September 22, 2025 | Created prior to September 22, 2025 |
How to Redeem | Sign up for a free Cloudflare account, add your credit card and ensure your verified .edu email address is added to your billing details. | Ensure your verified .edu email address is added to your billing details. Fill out our form and a member of our team will help you get access |
Note: in order to receive the credit, your verified .edu email address needs to be your billing email address
Expanding Cloudflare for Students coverage
While our first offering is primarily for institutions in the US, we’re working on expanding support for our students in other countries and plan to add additional higher education domain names after launch. If you’re at an educational institution outside of the United States, please reach out to us and apply for your educational/academic domain to be added. We’ll let you know as soon as it becomes available in your region. Check our Cloudflare for Students page for updates and keep an eye out for emails if you have an account with a newly supported domain.
Whether you're gearing up for your first hackathon, launching a side project, or looking to build the next big thing, you can get started today with free access and join a global developer community already building on Cloudflare.
Get started by signing up or requesting access today.