On this page
Overview
Puma is a multithreaded web server for Ruby/Rack applications. It combines a single-process thread pool with optional clustered workers and production features such as preloading, SSL, and rolling restarts. Main currently declares version 8.0.2.
Features and best fit
Based on official documentation; not hands-on tested · Content checked:
Key features
Combine a thread pool with clustered workers to serve Rack applications concurrently
Each request is handled by a thread, while cluster mode forks multiple worker processes and gives each worker its own thread pool. Production features include preload copy-on-write, SSL, rolling restarts, and UNIX or TCP socket bindings.
Sources: [2]
Puma 8 can absorb explicitly IO-bound requests beyond the normal thread-pool ceiling
Version 8.0 added env["puma.mark_as_io_bound"] and max_io_threads so mixed workloads can let IO-waiting requests exceed the normal thread-pool maximum. It also added APIs for changing thread-pool bounds at runtime.
Sources: [4]
Best fit
Fits Rails and Sinatra deployments from a single development process to multi-worker production
Puma suits Ruby backends that want the same Rack server across development and production while tuning worker count, thread count, preloading, and restart behavior. It is also the default server for Rails.
Sources: [2]
Before adoption
Size MRI threads with the GVL, database pools, fork lifecycle, and PROX-protocol security in mind
On MRI, the GVL prevents CPU-bound Ruby code from scaling linearly with additional threads. Database pools must match the worker/thread topology, and preload/fork deployments need hooks to reconnect sockets and background threads. Main declares 8.0.2 and the gemspec requires Ruby 3.0 or newer; 8.0.2 also hardens PROXY protocol v1 parsing against injection and spoofing.
Official sources
- [1]puma/puma — GitHub repository(2026-10-06)
- [2]Puma — README(2026-10-06)
- [3]Puma — puma.gemspec(2026-10-06)
- [4]Puma — History(2026-10-06)
- [5]Puma — BSD-3-Clause License(2026-10-06)
Supplemental curator note
Puma gives Ruby/Rack applications explicit control over thread and worker topology from development through production. On MRI, the GVL means CPU-bound code does not scale simply by adding threads, so capacity planning should also account for database connection pools and fork-time socket/background-thread reinitialization.
Try it in 3 steps
- 1
Get the source
git clone --depth 1 https://github.com/puma/puma.git - 2
Enter the repository
cd puma - 3
Check the official steps
Continue with the commands in the README Installation, Quick Start, or Getting Started section.
find . -maxdepth 1 -iname 'README*' -exec sed -n '1,220p' {} \; -quit
Growth
Growth trends · Last 30 days
7,915 Stars
Trend data is still being collected.
Development activity
Last 90 days · weekly
- Commits (last 30 days)
- 22
- Open PRs
- 25
Development activity is still being collected.
Built with
Categories and tags
Categories
GitHub data
GitHub dataView detailed GitHub data
GitHub Topics
- ruby
- server
- multithreading
- rack
- Stars
- 7,915
- Forks
- 1,502
- Watchers
- 172
- Open issues
- 62
- Contributors
- 403
- Owner type
- Organization
- Primary language
- Ruby
- License
- BSD-3-Clause
- Repository last updated
- Oct 3, 2026
Related information
Write a related articleShare a guide or use case for this OSS in Markdown. Articles are published after administrator approval.
Explore next
- Rack5,131 Stars
2 shared tag(s) · 2 shared category(s) · Same language
Connect Ruby web servers and frameworks through a minimal request/response contract and reusable middleware
Ruby - Faraday5,951 Stars
2 shared tag(s) · 1 shared category(s) · Same language
Use one Ruby HTTP API while composing adapters and middleware for each client workload
Ruby - HTTParty5,901 Stars
2 shared tag(s) · 1 shared category(s) · Same language
Call HTTP APIs concisely from Ruby and work with response bodies, status codes, and headers
Ruby - WebMock4,049 Stars
2 shared tag(s) · 1 shared category(s) · Same language
stub Ruby HTTP requests without real network calls and verify expectations against methods, URIs, headers, and bodies
Ruby - aiohttp16,569 Stars
2 shared tag(s) · 1 shared category(s)
build asyncio HTTP clients, servers, and WebSockets with one Python framework
Python - Hyper16,351 Stars
2 shared tag(s) · 1 shared category(s)
build HTTP/1 and HTTP/2 clients and servers with a low-level Rust library
Rust
Report incorrect information
Tell us if any listing information is incorrect or outdated.