freshcrate
Skin:/
Home > Frameworks > rage

rage

A modern Ruby framework designed for non-blocking I/O and simpler infrastructure

Why this rank:Strong adoptionRecent releaseHealthy release cadence

Description

A modern Ruby framework designed for non-blocking I/O and simpler infrastructure

README

Rage

Gem Version Tests Ruby Requirement

Rage is an API-first Ruby framework with a modern, fiber-based runtime that enables transparent, non-blocking concurrency while preserving familiar developer ergonomics. It focuses on capability and operational simplicity, letting teams build production-grade systems in a single, coherent runtime.

Rage uses Rails compatibility as a foundation and provides backend primitives optimized for a single-runtime model: background jobs that run in-process, WebSockets without external dependencies, object-oriented domain events, and automatic API documentation.

Why Rage

Modern backends are more than request/response cycles. They require:

  • Asynchronous execution
  • Background jobs
  • Real-time communication
  • Observability and telemetry
  • Clear domain boundaries

In the Ruby ecosystem, these concerns typically mean more infrastructure: Redis, Sidekiq, separate worker processes, custom logging solutions, and multiple deployment units.

Rage takes a different approach: collapse backend concerns into a single runtime by embracing Ruby's fiber-based concurrency model. This reduces operational complexity while keeping familiar Ruby ergonomics.

Unified Runtime in Action

Here's what single runtime looks like in practice:

class OrdersController < RageController::API
  def create
    order = Order.create!(order_params)

    # Schedule background job - runs in-process, no Redis needed
    SendOrderConfirmation.enqueue(order.id)

    # Publish domain event - subscribers execute immediately or async
    Rage::Events.publish(OrderPlaced.new(order: order))

    # Broadcast to WebSocket subscribers - no Action Cable/Redis needed
    Rage::Cable.broadcast("orders", { status: "created", order_id: order.id })

    render json: order, status: :created
  end
end

# Background job - runs in the same process, persisted to disk
class SendOrderConfirmation
  include Rage::Deferred::Task

  def perform(order_id)
    order = Order.find(order_id)
    OrderMailer.confirmation(order).deliver
  end
end

# Domain event - typed, object-oriented
OrderPlaced = Data.define(:order)

# Event subscriber
class UpdateInventory
  include Rage::Events::Subscriber
  subscribe_to OrderPlaced

  def call(event)
    Inventory.decrement(event.order.items.length)
  end
end

This all runs in a single process. No external queues, no separate worker dynos, no Redis for pub/sub.

Coming from Rails?

Rage keeps the parts of Rails that work - controllers, routing, Active Record compatibility, and conventions - but rethinks how backend systems are run.

Instead of adding separate job queues, Redis, and multiple deployment units as your app grows, Rage uses Ruby's fiber-based concurrency to run APIs, background jobs, WebSockets, and domain events in the same process.

You write familiar synchronous Ruby code. Rage handles the concurrency.

What changes:

  • One deployment unit instead of API servers + worker processes
  • No Redis required for jobs or broadcasts
  • Domain events as objects, not string-based notifications
  • OpenAPI specs generated automatically from your code

What stays the same:

  • Controller conventions and routing DSL
  • Active Record integration
  • Incremental adoption for existing Rails apps

Think of Rage as Rails ergonomics with a runtime designed for modern API systems, where operational simplicity is a first-class concern.

Core Ideas

1. Unified Backend Runtime

Rage runs HTTP APIs, background jobs, and WebSockets in the same process by default:

  • No separate worker processes
  • No Redis required for jobs or broadcasts
  • One deployment unit for most applications

This simplifies both local development and production setup.

For high-scale scenarios, Rage supports multi-process deployments and allows Rage processes to communicate directly when needed.

2. API-First, Rails-Compatible

Rage provides a familiar Rails-like programming model with API-focused improvements:

  • Controllers and routing that feel like Rails
  • Active Record compatibility
  • Incremental adoption for existing Rails applications
  • OpenAPI specs auto-generated from your code

Rails compatibility is the foundation. Rage builds on top of that foundation with new primitives designed for high-concurrency, API-first architectures.

3. Built-in Asynchronous Execution

Rage ships with fiber-based, in-process background jobs:

  • Zero setup - no Redis, no configuration
  • Jobs persist across restarts
  • Scheduled and executed within the same runtime using fibers for concurrency

For teams that need distributed job processing, Rage works with existing solutions. But most applications can start simple and stay simple.

4. Structured Domain Events

Rage includes a built‑in event bus designed for object‑oriented domain events:

  • Events are classes with explicit attributes, not hashes or strings
  • Subscribers listen to event classes or mixins
  • Type-safe and refactorable

This encourages clear domain modeling and avoids the brittleness of string-based notification systems.

5. Observability by Design

Observability is not an afterthought:

  • Structured logging by default
  • Dedicated observability interface for HTTP, background, and real-time features
  • OpenAPI specifications generated automatically from the running application

API contracts stay in sync with code by default - no separate documentation pipelines.

6. Performance That Enables Simplicity

Rage's fiber-based concurrency delivers strong performance for I/O-heavy workloads, but performance is a means to an end: operational simplicity.

By handling concurrency efficiently, Rage lets you:

  • Run fewer servers
  • Deploy fewer services
  • Reduce infrastructure by handling workloads that traditionally required separate microservices

The goal is to let teams write maintainable Ruby code while natively handling massive concurrency, eliminating the need for premature optimization or infrastructure sprawl.

Philosophy

Rage is intentionally conservative about change.

The framework prioritizes:

  • Stable public APIs
  • Long deprecation cycles
  • Minimal external dependencies

The goal is to let teams build systems that age well - without constant rewrites or growing infrastructure complexity.

Our aspiration: the task "Upgrade Rage" never appears in your ticketing system. Most updates should be as simple as bundle update.

What Rage Is (and Isn't)

Rage is:

  • Focused on backend APIs
  • Opinionated about operational simplicity
  • Designed for long-term stability
  • Rails-compatible but architecturally independent

Rage is not:

  • A full-stack framework - no view layer, no asset pipeline
  • A Rails clone - compatibility is a bridge, not the destination
  • Trying to do everything - deliberate scope boundaries

Who Rage Is For

Rage is a good fit if you:

  • Build API-only backends in Ruby
  • Care about operational simplicity over maximum flexibility
  • Want fewer moving parts in production
  • Prefer explicit, object-oriented design
  • Value long-term stability over cutting-edge features

Learn More

Contributions and thoughtful feedback are welcome.

License

The gem is available as open source under the terms of the MIT License.

Code of Conduct

Everyone interacting in the Rage project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.

Release History

VersionChangesUrgencyDate
v1.25.0## v1.25.0 **Fiber Scheduler Improvements** - **Fiber Interrupt Support** - Implements `FiberScheduler#fiber_interrupt` with generation tracking to prevent stale fiber resumes. - **Background Worker Pool** - Adds `FiberScheduler#blocking_operation_wait` to offload blocking native operations to background threads, preventing them from stalling the main server thread. **Security Hardening** - **HTTP Token Authentication** - Reject malformed or empty `Authorization` headers that lack tHigh6/3/2026
v1.24.0# v1.24.0 ## Highlights **Periodic Task Scheduling** by @Abishekcs - Schedule recurring background tasks with `config.deferred.schedule`. Includes automatic leader election across worker processes. **Customizable Retry Logic** by @anuj-pal27 - Control retry behavior per task with `max_retries` and override `retry_interval` to customize backoff per exception type. **Centralized Error Reporting** by @Digvijay-x1 - Exceptions from controllers, deferred tasks, Cable, SSE, and more are now fHigh5/12/2026
v1.23.0This release introduces two major features: **unbounded SSE streams** and **custom renderers**. ### Unbounded SSE Streams SSE streams can now stay open indefinitely and receive broadcasts from anywhere in your application: ```ruby class NotificationsController < RageController::API def subscribe render sse: Rage::SSE.stream("notifications") end end # broadcast from anywhere in your app Rage::SSE.broadcast("notifications", { message: "New order received" }) ``` ### CHigh4/15/2026
v1.22.0This release adds support for Server-Sent Events, allowing you to stream data to clients: ```ruby stream = Enumerator.new do |y| "Hello, world!".each_char do |ch| sleep 1 y << ch end end render sse: stream ``` Check out the https://github.com/rage-rb/datastar-example for an example integration with Datastar. ## Also In This Release * Shared Components in the @auth tag by @Piyush-Goenka in https://github.com/rage-rb/rage/pull/221 * [Cable] Add `stop_stream_frMedium3/12/2026
v1.21.0## What's Changed Your coding agent doesn't know Rage yet. **v1.21.0** fixes that. Run `rage skills install` to give your agent an official skill set for working with Rage applications. It's the fastest way to get started. Other changes in this release: **Added:** - RSpec test helpers for Cable apps - Support for `stream_for`/`broadcast_to` in Cable apps - Inline context supLow2/25/2026
v1.20.0Rage v1.20 continues its observability journey and introduces `Rage::Telemetry` - a built-in telemetry system that lets developers observe and measure what's happening inside the application. The first user of `Rage::Telemetry` is the [official OpenTelemetry integration](https://github.com/rage-rb/opentelemetry-instrumentation) to be released and available in the following weeks. Other changes include: * Add `Response#status` method for direct status code access * Expose metadata inside Low1/20/2026
v1.19.0Rage v1.19 brings the first wave of observability improvements, starting with enhanced logging capabilities: * **Global Log Context** - Add dynamic data to all log entries in a centralized way * **External Loggers** - Connect `Rage.logger` directly to external observability platforms * **Enhanced Deferred Logging** - Deferred tasks now have access to complete log context, not just request IDs Learn more: https://rage-rb.dev/docs/logging **Full Changelog**: https://github.com/rage-rb/rLow12/3/2025
v1.18.0## What's Changed ### Added Rage now includes a lightweight [pub/sub event system](https://rage-rb.dev/docs/event-system) for building decoupled, event-driven applications. Key Features: - Define events using Ruby's Data class - Subscribe to parent classes or modules to handle multiple related events - Run subscribers in the background with automatic retries - Visualize event-subscriber relationships https://rage-rb.dev/docs/event-system ### Fixed Fixed `Fiber.await` to cLow10/29/2025
v1.17.0Rage v1.17 introduces `Rage::Deferred`, an in-process background job queue that offloads long-running tasks from the request pipeline, improving client response times. Key features include: * **Data Durability:** A disk-based write-ahead log ensures task replay after server restarts or crashes. * **Automatic Retries:** Tasks are retried up to 5 times with exponential backoff on failure. * **Backpressure:** Prevents uncontrolled queue growth by blocking new tasks when the queue exceeds a limLow8/20/2025
v1.16.0## What's Changed Rage v1.16 introduces a new WebSocket protocol - [RawWebSocketJson](https://rage-rb.pages.dev/Rage/Cable/Protocols/RawWebSocketJson). This protocol enables you to interact with `Rage::Cable` applications using the native `WebSocket` object, eliminating the need for the `@rails/actioncable` dependency. Other changes: * Feature: Added the `after_initialize` hook by @serhii-sadovskyi in https://github.com/rage-rb/rage/pull/149 * [OpenAPI] Correctly handle the `key` optioLow5/20/2025
v1.15.0## What's Changed With v1.15, Rage introduces [OpenAPI Explorer](https://openapi-explorer.rage-rb.dev) - a tool that allows you to experiment with `Rage::OpenAPI` without the need to set up a project. You can try out different tags and serializer combinations to see the documentation generated by `Rage::OpenAPI`. Additionally, the release includes some new functionality and numerous bug fixes. ### Added * Enhance the `Rage::Request` class by @aaoafk * [OpenAPI] Support the `@param` Low4/2/2025
v1.14.0## What's Changed * Update app template to include all app rake tasks by @pjb3 in https://github.com/rage-rb/rage/pull/130 * Reload code in development based on filesystem updates by @rsamoilov in https://github.com/rage-rb/rage/pull/132 ## New Contributors * @pjb3 made their first contribution in https://github.com/rage-rb/rage/pull/130 **Full Changelog**: https://github.com/rage-rb/rage/compare/v1.13.0...v1.14.0Low3/10/2025
v1.13.0## What's Changed * [CLI] Support the PORT ENV variable by @TheBlackArroVV in https://github.com/rage-rb/rage/pull/124 * Add the [RequestId](https://rage-rb.pages.dev/Rage/RequestId) middleware in https://github.com/rage-rb/rage/pull/127 * Correctly handle persistent HTTP connections in https://github.com/rage-rb/rage/pull/128 * [Cable] Improve the time to connect in https://github.com/rage-rb/rage/pull/129 ## Shoutouts Special thanks to @p8 for tackling the [Ruby 3.4 + Rage](https://bLow2/12/2025
v1.12.0## What's Changed * **[Cable]** Added Redis adapter, which now allows you to scale `Rage::Cable` applications to more than one server. The adapter is based on Redis Streams, which means clients do not lose messages during network disruptions. As before, an adapter is not needed if you only use one server. This means that even if Redis is down due to an outage, clients connected to the same server as the broadcaster will still receive broadcasts. * **[API]** Added long-awaited `around_action`Low1/21/2025
v1.11.0## What's Changed If you still haven’t had enough reasons to use Rage, here’s one more - v1.11 now lets you build OpenAPI specifications for your applications! We’ve worked hard on implementing this feature and even harder on scoping it out. And with features like automatic security scheme application based on `before_action` callbacks and integration with the awesome [Alba](https://github.com/okuramasafumi/alba), we couldn’t be happier with the result! So, check out the [guide](https:/Low12/18/2024
v1.10.0## What's Changed v1.10.0 focuses on the database and brings two major changes: * Rage's own Connection Pool is now enabled by default. We've implemented lots of improvements and stability fixes to it while preserving excellent performance. Active Record versions starting with 6.0 are supported. * You can now use the `-d` option with the `rage new` command to preconfigure the app for the selected database. Thanks to [standalone_migrations](https://github.com/thuss/standalone-migrations), Low9/16/2024
v1.9.0## What's Changed * Allow to serve static files from the `public` directory in https://github.com/rage-rb/rage/pull/100 * Add request methods to the Rage::Request class by @cuneyter in https://github.com/rage-rb/rage/pull/97 * Correctly set Rails env in https://github.com/rage-rb/rage/pull/102 * Rails 7.2 compatibility in https://github.com/rage-rb/rage/pull/101 **Full Changelog**: https://github.com/rage-rb/rage/compare/v1.8.0...v1.9.0Low8/24/2024
v1.8.0## What's Changed v1.8.0 adds support for WebSockets! Head out to the [WebSockets](https://github.com/rage-rb/rage/wiki/WebSockets-guide) page to see it in action. Make sure to check the benchmarks! On the note of benchmarks, Rage is now part of the [TechEmpower](https://github.com/TechEmpower/FrameworkBenchmarks) benchmark project! And we all look forward to seeing the official results 😬🤩 **Full Changelog**: https://github.com/rage-rb/rage/compare/v1.7.0...v1.8.0Low8/6/2024
v1.7.0## What's Changed * Controller parameters wrapping feature by @alex-rogachev in https://github.com/rage-rb/rage/pull/89 * Unknown Environment Error Handling by @cuneyter in https://github.com/rage-rb/rage/pull/95 * Allow rescue_from handlers to not accept arguments in https://github.com/rage-rb/rage/pull/93 ## New Contributors * @cuneyter made their first contribution in https://github.com/rage-rb/rage/pull/95 **Full Changelog**: https://github.com/rage-rb/rage/compare/v1.6.0...v1.7.0Low7/30/2024
v1.6.0## What's Changed * Improve `Rage.multi_application`. * Rage now correctly handles internal Rails routes, e.g. `/rails/action_mailbox/relay/inbound_emails`. * Support legacy root helpers. * Rage now supports legacy root helpers, e.g. `get "/photos/:id" => "photos#show"` or `get "search" => :index`. **Full Changelog**: https://github.com/rage-rb/rage/compare/v1.5.1...v1.6.0Low7/15/2024
v1.0.0The first production-ready release of Rage is out! 🎉 We have implemented a lot of exciting features, and there is still more to come! Thank you to all the contributors and folks who provided extremely valuable feedback! Unfortunately, I can’t thank my wife as she beats me with her little fists every time I try to work on this project. But, hopefully, we will figure it out before v2 is out.Low3/13/2024

Dependencies & License Audit

Loading dependencies...

Similar Packages

pocketrbPocket-sized Ruby AI agent framework / LLM assistant with multi-LLM supportmaster@2026-06-03
PocketFlow-Zig🚀 Build LLM-powered workflows with PocketFlow-Zig, a lightweight framework leveraging Zig's features for efficient, type-safe programming.main@2026-06-06
claudekit🛠️ Accelerate your Python and JavaScript development with Claude Kit's toolkit, featuring specialized agents, slash commands, and advanced context management.main@2026-06-06
deer-flowAn open-source long-horizon SuperAgent harness that researches, codes, and creates. With the help of sandboxes, memories, tools, skill, subagents and message gateway, it handles different levels of tamain@2026-06-06
ai-dev-assistant-frameworkA plug-and-play framework for AI-assisted software development, enhancing context-aware collaboration in complex codebases. Perfect for tools like GitHub Copilot. 🐙✨main@2026-06-06

More in Frameworks

langchainThe agent engineering platform
deer-flowAn open-source long-horizon SuperAgent harness that researches, codes, and creates. With the help of sandboxes, memories, tools, skill, subagents and message gateway, it handles different levels of ta
tqdmFast, Extensible Progress Meter
simBuild, deploy, and orchestrate AI agents. Sim is the central intelligence layer for your AI workforce.