SpineA framework that doesn't hide the request process
Spine reveals how a request is interpreted, in what order it executes, when business logic is invoked, and how the response is finalized through an explicit execution pipeline. Controllers express only use-cases, and the runtime is responsible for all execution decisions.
If you are a Spring or NestJS developer, start right away. Controller → Service → Repository layered architecture with constructor injection and interceptor chains. Borrowing the familiar enterprise structure, but execution is handled by Spine's explicit pipeline.
You can inject logic at pre-request / post-request / completion points. Place cross-cutting concerns like authentication, transactions, and logging separated from business code into the execution flow.
It provides a user experience similar to Spring's HandlerInterceptor, but the execution order is explicitly controlled by Spine's pipeline.
// main.gofunc main() { app := spine.New() // ✅ Dependencies automatically resolved just by registering constructors // ✅ Can be registered in any order app.Constructor(NewUserRepository, NewUserService, NewUserController) routes.RegisterUserRoutes(app) app.Run(":8080")}
// routes.gofunc RegisterUserRoutes(app spine.App) { // ✅ Explicit connection between route and handler // ✅ Identify which method is for which path at a glance app.Route("GET", "/users", (*UserController).GetUser) app.Route("POST", "/users", (*UserController).CreateUser)}
// user.module.ts// ⚠️ Must be registered in module for every controller and service// ⚠️ Runtime error if missed@Module({ controllers: [UserController], providers: [UserService, UserRepository],})export class UserModule {}
// controller.ts// ⚠️ Doesn't work without decorators// ⚠️ Route info distributed across class/methods@Controller('users')export class UserController { constructor(private readonly svc: UserService) {} // ⚠️ Decorators needed for each parameter like @Query, @Body @Get() getUser(@Query('id') id: string) { return this.svc.get(+id); }}
// Application.java@SpringBootApplication // ⚠️ Hard to know what happens insidepublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}
// Controller.java@RestController // ⚠️ Doesn't work without annotation@RequestMapping("/users") // ⚠️ Route info is scatteredpublic class UserController { @Autowired private UserService svc; @GetMapping // ⚠️ Annotation needed for each method public UserResponse getUser(@RequestParam Long id) { // ⚠️ Annotation for each parameter return svc.get(id); }}