About encore-service
A skill for structuring services in Encore applications, from a single service to multi-service and system-based layouts. It also explains how to call other services through Encore clients.
Key features
- 01Define services with encore.service.ts
- 02Organize single- and multi-service apps
- 03Group related services into systems
- 04Call services through ~encore/clients
- 05Allow each service its own database
Use cases
- 01Create a new Encore service
- 02Choose a layout for a growing application
- 03Group commerce services by system
- 04Make typed calls between services
Install
Copy the command and run it in a terminal.
$
npx skills add https:/ / github.com/ encoredev/ skills --skill encore-serviceAfter installing, type/encore-servicein Claude Code to confirm it loaded.
Details
From the project READMEEncore Service Structure
Instructions
Creating a Service
Every Encore service needs an encore.service.ts file:
// encore.service.ts
import { Service } from "encore.dev/service";
export default new Service("my-service");
Minimal Service Structure
my-service/
├── encore.service.ts # Service definition (required)
├── api.ts # API endpoints
└── db.ts # Database (if needed)
Application Patterns
Single Service
A service can be defined at the application root:
my-app/
├── package.json
├── encore.app
├── encore.service.ts
├── api.ts
├── db.ts
└── migrations/
└── 001_initial.up.sql
Multi-Service
Each service lives in its own directory:
my-app/
├── encore.app
├── package.json
├── user/
│ ├── encore.service.ts
│ ├── api.ts
│ └── db.ts
├── order/
│ ├── encore.service.ts
│ ├── api.ts
│ └── db.ts
└── notification/
├── encore.service.ts
└── api.ts
Large Application (System-based)
Group related services into systems:
my-app/
├── encore.app
├── commerce/
│ ├── order/
│ │ └── encore.service.ts
│ ├── cart/
│ │ └── encore.service.ts
│ └── payment/
│ └── encore.service.ts
├── identity/
│ ├── user/
│ │ └── encore.service.ts
│ └── auth/
│ └── encore.service.ts
└── comms/
├── email/
│ └── encore.service.ts
└── push/
└── encore.service.ts
Service-to-Service Calls
Import other services from ~encore/clients:
import { user } from "~encore/clients";
export const getOrderWithUser = api(
{ method: "GET", path: "/orders/:id", expose: true },
async ({ id }): Promise<OrderWithUser> => {
const order = await getOrder(id);
const orderUser = await user.get({ id: order.userId });
return { ...order, user: orderUser };
}
);
Guidelines
- Services cannot be nested within other services
- Use
~encore/clientsfor cross-service calls (never direct imports) - Each service can have its own database
- Service names should be lowercase, descriptive
- Don't create services just for code organization - use folders instead
- Use
encore-architecturewhen the service boundaries have not been decided
Comments
Markdown supported