The serverless paradigm, championed by giants like AWS Lambda, promised a revolution: run code without thinking about servers. It delivered on that promise, fundamentally changing how we build applications. But as with any powerful technology, a new layer of complexity emerged. We traded server provisioning for IAM roles, VPC configurations, and endless YAML files.
The core idea of serverless is brilliant, but the execution can often feel like death by a thousand paper cuts. You spend more time wrangling infrastructure-as-code than writing your actual business logic.
What if we could reclaim the original promise? What if serverless could be... simple?
This is the core philosophy behind function.do. It's not just another Function as a Service (FaaS) platform; it's a re-imagining of the developer experience, built on a foundation of radical simplicity. Let's compare the journey of deploying a function on AWS Lambda versus function.do.
AWS Lambda is an incredibly powerful and flexible tool. It gives you the "building blocks" to construct almost any backend imaginable. But with great power comes great responsibility—and a significant amount of configuration.
To create a simple, public-facing API with Lambda, your checklist looks something like this:
The actual code you wanted to write is a tiny fraction of this process. The rest is infrastructure management.
function.do takes a different approach. We believe that if your goal is to expose a piece of logic as an API, that should be the only thing you have to do.
Here’s that same "get a greeting" API, built on function.do:
import { Do, Fn } from '@do-are/sdk';
/**
* @description Generates a personalized greeting.
* @param { name: string } - The name to include in the greeting.
* @returns { message: string } - The personalized greeting message.
*/
export const getGreeting: Fn = async ({ name }) => {
if (!name) {
throw new Error('A name is required to generate a greeting.');
}
const message = `Hello, ${name}! Welcome to the platform.`;
// This object is returned as the JSON API response.
return { message };
};
// Deploying this creates a unique API endpoint:
// POST https://your-name.function.do/getGreeting
// BODY { "name": "World" }
You write this code, you deploy it, and you're done. That's it. The platform instantly generates a secure, scalable, and documented API for you. There is zero boilerplate and zero infrastructure to manage.
Notice what's missing?
You focus purely on the logic. We handle the rest.
This radical simplicity is enabled by two core concepts: atomic functions and composability.
An atomic function is a small, self-contained unit of code designed to perform one specific task perfectly. On the function.do platform, each function you export from a file becomes its own dedicated, scalable API endpoint. This enforces a clean, microservices-style architecture by design.
The benefits are immense:
Absolutely. Simplicity at the function level doesn't limit the complexity of what you can build. In fact, it enhances it. You can build sophisticated workflows by having your composable functions call each other.
Since every function is a standard HTTP API endpoint, you can orchestrate them using our SDK or any standard HTTP client. This allows you to build complex systems from simple, reusable, and independently scalable parts.
create-user can call send-welcome-email. process-payment can call generate-invoice and update-subscription-status. Each part remains simple, but together they form a powerful whole.
Feature / Aspect | AWS Lambda | function.do |
---|---|---|
Developer Focus | Infrastructure + Business Logic | Purely Business Logic |
API Creation | Manual (Requires API Gateway setup) | Automatic on deploy |
Configuration | High (IAM, VPC, API Gateway, etc.) | Minimal (Dependencies in package.json) |
Boilerplate | Required (Handler format, context) | Zero |
Deployment | Multi-step process (packaging, uploading) | Single-step deploy from CLI |
Core Unit | Flexible compute "block" | An atomic, composable function as a serverless API |
AWS Lambda is a foundational piece of the cloud, and it's not going anywhere. It’s the right choice when you need granular control over every aspect of the execution environment.
But for the vast majority of use cases—where the goal is to get your logic running behind a secure, scalable API as quickly as possible—there's a better way.
function.do isn't designed to replace Lambda; it's designed to elevate the developer experience. It’s for developers who want to move faster, eliminate undifferentiated heavy lifting, and focus on what truly matters: creating value.
Stop building boilerplate. Start building features.
Try function.do today and turn your code into a live API in minutes.