Skip to content

Getting Started

Keel combines:

  • ss-keel-core: HTTP framework in Go built on Fiber, with OpenAPI, logging, validation, and lifecycle.
  • keel CLI: scaffolding, component generation, and script automation.
  • Go 1.25+
  • Git
  • (Optional) Air for hot reload

Install the CLI with Homebrew:

Terminal window
brew install slice-soft/tap/keel

Or with Go:

Terminal window
go install github.com/slice-soft/keel@latest

Then scaffold your project:

Terminal window
keel new myapp
cd myapp

Run in development:

Terminal window
keel run dev

Generate your first module:

Terminal window
keel generate module users

A typical CLI-generated project looks like this:

myapp/
├── cmd/
│ └── main.go
├── internal/
│ └── modules/
│ └── starter/ # optional
├── go.mod
├── keel.toml
├── application.properties
├── .env
├── .env.example
└── .air.toml

With the server running:

EndpointDescription
GET /helloStarter route (if you included the starter module)
GET /healthHealth check
GET /docsSwagger UI
GET /docs/openapi.jsonOpenAPI 3.0 spec

/docs and /docs/openapi.json are mounted when Env != "production".

If you prefer not to use the CLI, you can start manually:

Terminal window
mkdir myapp && cd myapp
go mod init github.com/your-org/myapp
go get github.com/slice-soft/ss-keel-core@latest

Minimal cmd/main.go:

package main
import (
"github.com/slice-soft/ss-keel-core/config"
"github.com/slice-soft/ss-keel-core/core"
"github.com/slice-soft/ss-keel-core/logger"
)
func main() {
appLogger := logger.NewLogger(config.GetEnvOrDefault("APP_ENV", "development") == "production")
app := core.New(core.KConfig{
Port: config.GetEnvIntOrDefault("PORT", 7331),
ServiceName: config.GetEnvOrDefault("SERVICE_NAME", "myapp"),
Env: config.GetEnvOrDefault("APP_ENV", "development"),
Docs: core.DocsConfig{
Title: "myapp API",
Version: "1.0.0",
},
})
if err := app.Listen(); err != nil {
appLogger.Error("failed to start app: %v", err)
}
}

Run:

Terminal window
go run ./cmd/main.go