
O Encore é um framework open source para construir backends em TypeScript (e Go). Você declara APIs, bancos de dados, Pub/Sub, cron jobs, cache e armazenamento de objetos como objetos TypeScript, e o framework provisiona tudo automaticamente, tanto local quanto em produção na AWS ou GCP.
O código da aplicação é a única fonte de verdade para a infraestrutura.
Quer ir direto ao código? Clone o encurtador de URLs e faça deploy na sua cloud para acompanhar o artigo.
Frameworks como Express, Fastify e NestJS cuidam do roteamento HTTP, mas banco de dados, filas de mensagens, cache, observabilidade e deploy ficam por sua conta. Na prática, você acaba combinando Docker Compose, Terraform, GitHub Actions e Datadog, e gasta tempo mantendo tudo sincronizado.
O Encore integra tudo isso no framework. Como ele entende a estrutura completa da aplicação em tempo de compilação, ele consegue provisionar infraestrutura, gerar documentação, criar diagramas de arquitetura e instrumentar rastreamento distribuído automaticamente.
Times como o da Groupon reportam 3x mais velocidade de desenvolvimento e 90% de redução no tempo de entrega de projetos depois de adotar o Encore. A Pave Bank construiu um banco digital licenciado do zero em 9 meses, com o dobro da velocidade que o time anterior levou para construir o Monzo.
Cada endpoint é uma função TypeScript com tipos explícitos. O framework cuida de roteamento, validação e serialização:
import { api } from "encore.dev/api";
interface CreateOrderRequest {
customerId: string;
total: number;
}
interface Order {
id: string;
customerId: string;
total: number;
}
export const createOrder = api(
{ expose: true, method: "POST", path: "/orders" },
async (req: CreateOrderRequest): Promise<Order> => {
// sua lógica aqui
}
);
Chamadas entre serviços também são type-safe, com autocomplete na IDE e validação automática dos tipos.
O Service Catalog mostra todos os endpoints, tipos e dependências entre serviços, gerado automaticamente a partir do código:
Bancos de dados, Pub/Sub, cron jobs, cache e armazenamento de objetos são declarados como objetos TypeScript:
import { SQLDatabase } from "encore.dev/storage/sqldb";
import { Topic } from "encore.dev/pubsub";
import { CronJob } from "encore.dev/cron";
// PostgreSQL, provisionado automaticamente
const db = new SQLDatabase("orders", { migrations: "./migrations" });
// Pub/Sub: SNS+SQS na AWS, Pub/Sub no GCP
const orderCreated = new Topic<OrderEvent>("order-created", {
deliveryGuarantee: "at-least-once",
});
// Cron job que roda todo dia às 8h
const dailyReport = new CronJob("daily-report", {
title: "Gerar relatório diário",
schedule: "0 8 * * *",
endpoint: reports.generate,
});
Localmente, o framework provisiona PostgreSQL real e roda Pub/Sub com semântica equivalente. Em produção, os mesmos objetos mapeiam para serviços gerenciados da AWS ou GCP.
A mesma aplicação roda em qualquer cloud sem mudanças no código. O Encore mapeia cada primitiva para o serviço nativo do provedor:
| Primitiva | AWS | GCP |
|---|---|---|
| Banco de dados | RDS (PostgreSQL) | Cloud SQL |
| Pub/Sub | SNS + SQS | GCP Pub/Sub |
| Cache | ElastiCache | Memorystore |
| Armazenamento de objetos | S3 | Cloud Storage |
| Cron | CloudWatch Events | Cloud Scheduler |
Você pode ter staging na GCP e produção na AWS, ou migrar entre clouds, usando o mesmo código. O dashboard de infraestrutura mostra tudo que está provisionado em cada ambiente, com acesso direto aos recursos na sua conta:
Quando um deploy inclui mudanças de infraestrutura (um novo banco de dados, um tópico de Pub/Sub, etc.), o Encore mostra exatamente o que vai ser provisionado antes de executar. O time de plataforma ou DevOps pode revisar e aprovar ou rejeitar cada mudança:
O time de infraestrutura configura as políticas do ambiente uma vez (tipo de instância, backups, criptografia, IAM com privilégio mínimo) e mantém visibilidade total sobre o que está rodando na cloud. Os desenvolvedores fazem deploy normalmente, e as mudanças de infraestrutura passam pelo fluxo de aprovação antes de serem provisionadas.
Toda a infraestrutura roda na sua própria conta AWS/GCP. Você tem acesso total ao console e pode inspecionar ou modificar qualquer recurso diretamente.
encore run provisiona toda a infraestrutura local (PostgreSQL, Pub/Sub, cache) e abre o Development Dashboard em localhost:9400.
O dashboard inclui um API Explorer para testar endpoints, um Database Explorer para consultar bancos, e documentação gerada automaticamente de todos os serviços:
O Encore gera diagramas interativos da arquitetura da aplicação que atualizam em tempo real conforme o código muda. Você vê serviços, APIs, bancos de dados, tópicos de Pub/Sub e as dependências entre eles:
Cada request gera um rastreamento distribuído (distributed trace) com timing de cada operação, request/response bodies, chamadas entre serviços e erros com stack traces completos. O tracing é automático e já vem configurado.
O mesmo tracing funciona tanto localmente quanto em produção. Métricas de cada serviço também são coletadas automaticamente:
O Encore inclui ferramentas para desenvolvimento assistido por IA:
Quando você pede pro agente "adicionar um endpoint que busca pedidos do banco", ele já sabe quais serviços existem, qual o schema do banco e quais padrões o projeto segue.
Testes rodam contra infraestrutura real. Cada teste recebe seu próprio banco de dados isolado:
import { describe, expect, test } from "vitest";
import { createOrder, getOrder } from "./orders";
describe("orders", () => {
test("criar e buscar pedido", async () => {
const order = await createOrder({
customerId: "cust_123",
total: 9990,
});
const fetched = await getOrder({ id: order.id });
expect(fetched.total).toBe(9990);
});
});
encore test roda tudo. Os testes usam bancos de dados reais provisionados automaticamente pelo framework.
Self-hosting: encore build docker gera uma imagem Docker que roda em qualquer lugar (Kubernetes, ECS, Cloud Run, fly.io).
Encore Cloud (opcional): automatiza deploy na sua conta AWS ou GCP. Provisiona infraestrutura com IAM com privilégio mínimo, configura CI/CD, cria ambientes de preview por PR e mostra custos e recursos. Um git push faz o deploy completo.
O Encore foi criado por engenheiros do Spotify e do Google. Alguns dos times usando em produção:
O framework tem mais de 12.000 stars no GitHub e uma comunidade ativa no Discord.
Quer pular direto para uma aplicação rodando? Clone este starter e faça deploy na sua própria cloud.
Instale o CLI para o seu sistema operacional. Ele inclui tudo que você precisa para criar, rodar e fazer deploy de aplicações Encore:
# macOS
brew install encoredev/tap/encore
# Linux
curl -L https://encore.dev/install.sh | bash
# Windows
iwr https://encore.dev/install.ps1 | iex
O comando encore app create cria um novo projeto a partir de um template. Vamos começar com o Hello World e adicionar funcionalidade em cima:
encore app create meu-app --example=ts/hello-world
cd meu-app
Rode encore run e abra http://localhost:9400. O dashboard já está funcionando com um endpoint Hello World. Você pode testar o endpoint direto no API Explorer e ver o trace da requisição.
No Encore, cada serviço é uma pasta com um arquivo encore.service.ts. Vamos criar o serviço que vai cuidar das URLs encurtadas:
mkdir url
url/encore.service.ts:
import { Service } from "encore.dev/service";
export default new Service("url");
Aqui é onde o Encore se diferencia. Para adicionar um banco PostgreSQL, você declara um SQLDatabase no código e cria uma migration SQL. O framework provisiona o banco automaticamente quando você rodar a aplicação.
mkdir url/migrations
url/migrations/001_create_tables.up.sql:
CREATE TABLE url (
id TEXT PRIMARY KEY,
original_url TEXT NOT NULL
);
Agora vamos criar os endpoints da API. Cada endpoint é uma função TypeScript com tipos explícitos para request e response. O Encore gera a documentação automaticamente no Service Catalog, e os endpoints já aparecem no API Explorer para teste.
url/url.ts:
import { api, APIError } from "encore.dev/api";
import { SQLDatabase } from "encore.dev/storage/sqldb";
import { randomBytes } from "node:crypto";
// Declara o banco de dados e aponta para as migrations
const db = new SQLDatabase("url", { migrations: "./migrations" });
interface URL {
id: string;
url: string;
}
// POST /url — recebe uma URL e retorna um ID curto
export const shorten = api(
{ method: "POST", path: "/url", expose: true },
async ({ url }: { url: string }): Promise<URL> => {
const id = randomBytes(6).toString("base64url");
await db.exec`
INSERT INTO url (id, original_url)
VALUES (${id}, ${url})
`;
return { id, url };
}
);
// GET /url/:id — busca a URL original pelo ID
export const get = api(
{ method: "GET", path: "/url/:id", expose: true },
async ({ id }: { id: string }): Promise<URL> => {
const row = await db.queryRow`
SELECT original_url FROM url WHERE id = ${id}
`;
if (!row) throw APIError.notFound("url não encontrada");
return { id, url: row.original_url };
}
);
Repare que a declaração do banco (new SQLDatabase) e as queries (db.exec, db.queryRow) estão no mesmo arquivo dos endpoints. O Encore usa isso para entender quais recursos cada serviço precisa e provisiona tudo automaticamente.
encore run
O Encore detecta a declaração do SQLDatabase, provisiona um PostgreSQL local, roda a migration, e sobe a aplicação. Tudo automático. (Quando você faz deploy com Encore Cloud, o mesmo processo provisiona um RDS na AWS ou Cloud SQL no GCP.)
# Encurtar uma URL
curl http://localhost:4000/url -d '{"url": "https://encore.dev"}'
# Buscar a URL original
curl http://localhost:4000/url/<id-retornado>
Abra http://localhost:9400 para ver o rastreamento distribuído de cada request, incluindo o tempo da query no banco, o request/response body, e o status de cada operação.
Os testes chamam os endpoints como funções TypeScript normais. O Encore provisiona um banco de dados isolado para cada execução de teste, então você testa contra infraestrutura real.
url/url.test.ts:
import { describe, expect, test } from "vitest";
import { shorten, get } from "./url";
describe("url shortener", () => {
test("encurtar e buscar retorna a url original", async () => {
const shortened = await shorten({ url: "https://example.com" });
const result = await get({ id: shortened.id });
expect(result.url).toBe("https://example.com");
});
});
encore test
Para self-hosting, gere uma imagem Docker e faça deploy onde quiser (Kubernetes, ECS, Cloud Run, etc.):
encore build docker url-shortener:v1.0
Com Encore Cloud, um git push faz o deploy completo, incluindo provisionamento de banco de dados e infraestrutura na sua conta AWS ou GCP:
git add -A . && git commit -m "URL shortener"
git push encore
Crie sua conta e faça deploy deste encurtador de URLs na AWS ou GCP em minutos.
Para ver o Encore funcionando com a stack da sua equipe, agende uma conversa.
Automated infrastructure for humans and agents
Let agents build and validate features with real infrastructure in the dev loop. Encore automatically provisions infrastructure, from local dev to production in your cloud on AWS/GCP.