RapidlyBuilt

RapidlyBuilt is an open foundation for building consoles to operate, observe, and manage your application.

It provides a unified, extensible Console that brings together modules into a single, coherent interface.

The Model

RapidlyBuilt is structured around three core concepts:

Console

The Console is a structured container that:

  • Provides a shared layout
  • Integrates modules

Module

A self-contained feature component.

Modules may be:

  • Native Rails namespaces within your app
  • Rails engines
  • Open source gems
  • Commercially licensed add-ons

Integration

The mechanism that connects the module to the console by exposing:

  • Search terms
  • Console layout customizations

The Console doesn’t "know” about implementation details — it simply integrates modules
that conform to the integration contract.

Why RapidlyBuilt?

Modern web apps accumulate operational needs:

  • Error monitoring
  • Analytics
  • Background job inspection
  • Data exploration
  • CRM tooling
  • Marketing systems
  • Internal dashboards

Most teams rent these as disconnected SaaS tools.

RapidlyBuilt gives you a different path:

  • Centralized operational interface
  • Open source core
  • Optional licensed extensions
  • Self-hosted by default
  • Fully extensible

You control the stack. You control the data. You control the surface area.

Installation

Add this line to your application's Gemfile:

gem "rapidly_built"

Then mount your console:

# config/routes.rb
console :admin do
  # internal routes defined by your application
  # under the "Admin" namespace
  root to: "dashboard#show"

  # admin contact management
  resources :contacts
end

Define your console:

# app/view_components/admin_console.rb
class AdminConsole < RapidlyBuilt::Console::Base
  def build
    integrate CustomerRelations
    integrate RapidlyBuilt::ErrorTracking
  end
end

Define your integration:

module CustomerRelations
  class CustomerRelations::Integration < RapidlyBuilt::Integration::Base
    def call
      # static search results never are always available,
      # allowing almost immediate type-ahead results.
      search.index.add_result(
        title: "Contacts",
        url: helpers.contacts_path,
        description: "Manage current and potential customers"
      )

      # dynamically searches the database for contacts
      search.middleware.use ContactsSearch

      # ran before every request to this console
      request.middleware.use RequestMiddleware
    end
  end
end

Define what you just integrated:

module CustomerRelations
  class CustomerRelations::ContactsSearch < RapidlyBuilt::Search::Middleware::Entry
    def call
      # search the database and add any contact matches
      Contact.search(query_string).find_each do |contact|
        add_result(
          title: contact.full_name,
          url: helpers.admin_contact_path(contact),
          description: "#{contact.company_name} - #{contact.email}"
        )
      end
    end
  end
end
module CustomerRelations
  class RequestMiddleware < RapidlyBuilt::Request::Middleware::Base
    def call
      # add a "Customers" link to the header
      layout.header.right.text_link("Customers", helpers.admin_contacts_path)
    end
  end
end

Contributing

Contribution directions go here.

License

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