03/26/26

Encore: framework backend com infraestrutura automática

APIs com tipagem segura, banco de dados, Pub/Sub, cache, cron jobs e deploy na AWS e GCP, tudo declarado em TypeScript.

10 Min Read

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.

Deploy with Encore

Quer ir direto ao código? Clone o encurtador de URLs e faça deploy na sua cloud para acompanhar o artigo.

Deploy

O problema

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.

Funcionalidades

APIs com tipagem segura (type-safe)

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:

Service Catalog do Encore mostrando endpoints e dependências entre serviços

Infraestrutura declarativa

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.

Multi-cloud: AWS e 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:

PrimitivaAWSGCP
Banco de dadosRDS (PostgreSQL)Cloud SQL
Pub/SubSNS + SQSGCP Pub/Sub
CacheElastiCacheMemorystore
Armazenamento de objetosS3Cloud Storage
CronCloudWatch EventsCloud 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:

Dashboard de infraestrutura do Encore mostrando recursos provisionados na cloud

Visibilidade e controle para o time de infraestrutura

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:

Fluxo de deploy com aprovação de mudanças de infraestrutura

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.

Ambiente local

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:

Dashboard do Encore Cloud 2.0

Diagramas de arquitetura

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:

Diagrama de arquitetura gerado automaticamente

Rastreamento distribuído e métricas

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.

Rastreamento distribuído do Encore mostrando o fluxo de um request

O mesmo tracing funciona tanto localmente quanto em produção. Métricas de cada serviço também são coletadas automaticamente:

Métricas do Encore Cloud

Integração com IA

O Encore inclui ferramentas para desenvolvimento assistido por IA:

  • AI Instructions que agentes como Cursor, Claude Code e GitHub Copilot usam para entender o framework
  • MCP Server que expõe serviços, APIs, schemas de banco, traces e topologia de Pub/Sub para agentes via Model Context Protocol

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 com infraestrutura real

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 e Encore Cloud

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.

Criar app com Encore

Quem usa o Encore

O Encore foi criado por engenheiros do Spotify e do Google. Alguns dos times usando em produção:

  • Toolzz plataforma brasileira de educação corporativa e agentes de IA
  • Pave Bank construiu um banco digital licenciado em 9 meses
  • Groupon usa Encore para serviços de backend
  • Startups e scaleups em fintech, e-commerce, SaaS e plataformas B2B

O framework tem mais de 12.000 stars no GitHub e uma comunidade ativa no Discord.

Tutorial: encurtador de URLs com PostgreSQL

Deploy with Encore

Quer pular direto para uma aplicação rodando? Clone este starter e faça deploy na sua própria cloud.

Deploy

1. Instalar o Encore CLI

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

2. Criar a aplicação

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.

3. Criar o serviço de URLs

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");

4. Adicionar o banco de dados

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 );

5. Criar os endpoints

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.

6. Rodar e testar

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.

7. Adicionar um teste

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

8. Deploy

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

Próximos passos

Deploy with Encore

Crie sua conta e faça deploy deste encurtador de URLs na AWS ou GCP em minutos.

Deploy

Para ver o Encore funcionando com a stack da sua equipe, agende uma conversa.

Ready to escape the maze of complexity?

Encore Cloud is the development platform for building robust type-safe distributed systems with declarative infrastructure.