
encore-go-service
โ 25by encoredev ยท part of encoredev/skills
Plan how to split an Encore Go application into services and lay out its directory structure. Architecture and decomposition, not first-time CLI install (that's `encore-go-getting-started`).
This is the playbook your agent receives when the skill activates โ you don't need to read it to use the skill, but it's here to audit before installing.
Encore Go Service Structure
Instructions
In Encore Go, each package with an API endpoint is automatically a service. No special configuration needed.
Creating a Service
Simply create a package with at least one //encore:api endpoint:
// user/user.go
package user
import "context"
type User struct {
ID string `json:"id"`
Email string `json:"email"`
Name string `json:"name"`
}
//encore:api public method=GET path=/users/:id
func GetUser(ctx context.Context, params *GetUserParams) (*User, error) {
// This makes "user" a service
}Minimal Service Structure
user/
โโโ user.go # API endpoints
โโโ db.go # Database (if needed)
โโโ migrations/ # SQL migrations
โโโ 1_create_users.up.sqlApplication Patterns
Single Service (Recommended Start)
Best for new projects - start simple, split later if needed:
my-app/
โโโ encore.app
โโโ go.mod
โโโ api.go # All endpoints
โโโ db.go # Database
โโโ migrations/
โโโ 1_initial.up.sqlMulti-Service
For distributed systems with clear domain boundaries:
my-app/
โโโ encore.app
โโโ go.mod
โโโ user/
โ โโโ user.go
โ โโโ db.go
โ โโโ migrations/
โโโ order/
โ โโโ order.go
โ โโโ db.go
โ โโโ migrations/
โโโ notification/
โโโ notification.goLarge Application (System-based)
Group related services into systems:
my-app/
โโโ encore.app
โโโ go.mod
โโโ commerce/
โ โโโ order/
โ โ โโโ order.go
โ โโโ cart/
โ โ โโโ cart.go
โ โโโ payment/
โ โโโ payment.go
โโโ identity/
โ โโโ user/
โ โ โโโ user.go
โ โโโ auth/
โ โโโ auth.go
โโโ comms/
โโโ email/
โ โโโ email.go
โโโ push/
โโโ push.goService-to-Service Calls
Just import and call the function directly - Encore handles the RPC:
package order
import (
"context"
"myapp/user" // Import the user service
)
//encore:api auth method=GET path=/orders/:id
func GetOrderWithUser(ctx context.Context, params *GetOrderParams) (*OrderWithUser, error) {
order, err := getOrder(ctx, params.ID)
if err != nil {
return nil, err
}
// This becomes an RPC call - Encore handles it
orderUser, err := user.GetUser(ctx, &user.GetUserParams{ID: order.UserID})
if err != nil {
return nil, err
}
return &OrderWithUser{Order: order, User: orderUser}, nil
}When to Split Services
Split when you have:
| Signal | Action |
|---|---|
| Different scaling needs | Split (e.g., auth vs analytics) |
| Different deployment cycles | Split |
| Clear domain boundaries | Split |
| Shared database tables | Keep together |
| Tightly coupled logic | Keep together |
| Just organizing code | Use sub-packages, not services |
Internal Helpers (Non-Service Packages)
Create packages without //encore:api endpoints for shared code:
my-app/
โโโ user/
โ โโโ user.go # Service (has API)
โโโ order/
โ โโโ order.go # Service (has API)
โโโ internal/
โโโ util/
โ โโโ util.go # Not a service (no API)
โโโ validation/
โโโ validate.goGuidelines
- A package becomes a service when it has
//encore:apiendpoints - Services cannot be nested within other services
- Start with one service, split when there's a clear reason
- Cross-service calls look like regular function calls
- Each service can have its own database
- Package names should be lowercase, descriptive
- Don't create services just for code organization - use sub-packages instead
npx skills add https://github.com/encoredev/skills --skill encore-go-serviceRun this in your project โ your agent picks the skill up automatically.
No common issues documented yet. If you hit a problem, the repository's GitHub Issues page is the best place to look.
Licensed under Apache-2.0โ you can use, modify, and redistribute it under that license's terms.
View the full license file on GitHub โ