
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.