Stream Framework is a production-ready Go service template combining Fiber's speed, OpenTelemetry tracing, Sentry error monitoring, and a clean module-based architecture.
A complete service foundation so your team can focus on business logic, not boilerplate.
Built on FastHTTP — one of the fastest HTTP engines in Go. Express-style routing with composable middleware.
Run REST and gRPC servers simultaneously. Protobuf definitions with auto-generated Go stubs included.
Distributed tracing out of the box. Send spans to Jaeger, Tempo, or any OTLP endpoint.
First-class Sentry integration for exception tracking and performance monitoring in production.
Pluggable queue drivers — PostgreSQL (SKIP LOCKED) or RabbitMQ. Includes a worker binary and failed-job CLI.
Scaffold a full CRUD module — controller, service, repository, routes, DTOs, resources — with a single command.
GORM with auto table prefix, BaseModel and BaseAuditorModel, golang-migrate for schema versioning.
JWT authentication with Redis-backed session management, role/permission authorization, and single-device mode.
Zap-based structured logger with Graylog, S3, GCP, and file output targets, configurable via LOG_MODE.
Every feature lives in its own module following a strict Module → Controller → Service → Repository pattern. Generate a complete CRUD module with one command and focus on your business logic.
./gen module product
# Creates:
# src/modules/product_module/
# product_module.go
# product_controller.go
# product_service.go
# product_repository.go
# product_route.go
# product_error.go
# dtos/dtos.go
# resource/product_resource.go
# responses/
src/routes/http.go
WithXxxRepositoryFactory
for unit testing
package product_module
import (
"github.com/gofiber/fiber/v2"
"innovationstream.app/stream-framework/src/middlewares"
)
func (m module) Routes(
route fiber.Router,
mw *middlewares.Middleware,
) {
c := m.Controller()
products := route.Group("products")
// Public routes
products.Get("/", c.GetProducts)
products.Get("/:id", c.GetProduct)
// Protected routes
products.Use(mw.JwtAuthProtected())
products.Post("/", c.CreateProduct)
products.Put("/:id", c.UpdateProduct)
products.Delete("/:id", c.DeleteProduct)
}
func (c Controller) GetProduct(f *fiber.Ctx) error {
ctx, span := c.m.tracer.TraceStart(
f.Context(), "GetProductController",
)
defer c.m.tracer.TraceEnd(span)
id := f.Params("id")
result, err := c.service().GetProductByID(ctx, id)
if err != nil {
return exception.HttpErrorResponseMapping(
f, fiber.StatusNotFound,
ProductNotFoundError, err,
)
}
return f.JSON(fiber.Map{"data": result})
}
A built-in monitor dashboard ships with every service — live CPU, memory, connection and load metrics, a request inspector with a Jaeger-style trace timeline, and a live log stream, straight from your browser.
Four steps to get your first Stream service running locally.
# Install the CLI once (private module — set GOPRIVATE)
export GOPRIVATE=innovationstream.app/*
go install innovationstream.app/stream-framework/cmd/stream-go@latest
# Make sure go-installed binaries are on PATH, otherwise the shell
# reports "command not found: stream-go". Add this to ~/.zshrc or ~/.bashrc:
export PATH="$PATH:$(go env GOPATH)/bin"
# Scaffold a new project with the interactive wizard
stream-go create myapp
cd myapp
# — or clone manually —
# git clone https://gitlab.innovationstream.app/stream/stream-framework.git myapp && cd myapp && go mod tidy
cp .env.example .env.dev
# Edit .env.dev — set DB_HOST, DB_NAME, REDIS_HOST, etc.
# ENV=local or development → loads .env.dev automatically
migrate -path database/migrations \
-database "$DATABASE_URL" up
air # with live reload (recommended)
# or
go run . # without live reload
# [App] HTTP service is running at port 8000