Export Collection
Export "Nauman's Production Rails Stack" in different formats for sharing or LLM use.
Markdown Preview
# Nauman's Production Rails Stack
> A curated stack collection by [@builtonrails](https://builtonrails.com/@builtonrails)
Battle-tested gems from BuiltOnRails, InventList, and Shorttags. LLM-ready with detailed context for each tool.
## LLM Context
```markdown
# Nauman's Production Rails Stack
This is a curated collection of Ruby gems and tools used across three production Rails applications:
- **BuiltOnRails** - A directory of Rails applications (Rails 8.1)
- **InventList** - An inventory management SaaS (Rails 7.0)
- **Shorttags/SpotBZ** - A real-time analytics and notifications platform (Rails 8.0)
## Philosophy
This stack follows the **37signals/Basecamp** approach to Rails development:
- Rich domain models over service objects
- CRUD controllers over custom actions
- Database-backed everything (no Redis dependency in newer apps)
- Hotwire (Turbo + Stimulus) for interactivity
- Kamal for deployment
## When to Use This Stack
Use this collection when:
- Building a new Rails 7+ or Rails 8+ application
- You want production-tested, battle-proven gems
- You prefer the "vanilla Rails" philosophy
- You need to minimize external dependencies
## Key Patterns
1. **Authentication**: Passwordless magic links (no passwords) or Devise for traditional auth
2. **Background Jobs**: Solid Queue (database-backed) over Redis-based solutions
3. **Frontend**: Hotwire stack (Turbo + Stimulus + Tailwind)
4. **Payments**: Stripe via the `pay` gem or direct integration
5. **Search**: pg_search for PostgreSQL full-text search
6. **Deployment**: Kamal with Thruster for zero-downtime deploys
## Usage Instructions for LLMs
When using these gems in a new project:
1. Start with the core Framework + Database + Frontend gems
2. Add Background processing (Solid Queue for Rails 8+)
3. Add Auth based on needs (passwordless vs Devise)
4. Add Payments if needed (Stripe)
5. Add Monitoring/Security gems for production
Each gem below includes a note explaining its specific use case in these applications.
```
## Stacks
1. **Ruby on Rails** (Framework)
- The web framework. Rails 7+ for established apps, Rails 8+ for new apps. Use with Hotwire for modern interactivity without JavaScript frameworks.
2. **Propshaft** (Frontend)
- Modern asset pipeline for Rails 7+. Simpler than Sprockets, no compilation step. Use instead of Sprockets for new Rails 7/8 apps.
3. **Puma** (DevOps)
- Default Rails web server. Configure with threads matching CPU cores. Use with Thruster for HTTP caching in production.
4. **PostgreSQL** (Database)
- Primary database. Use for everything: data, caching (solid_cache), jobs (solid_queue), websockets (solid_cable). No need for Redis.
5. **Redis** (Database)
- In-memory store. Used in InventList for caching/sessions. For new apps, prefer Solid Cache (database-backed) instead.
6. **Turbo** (Frontend)
- SPA-like navigation without JavaScript. Use Turbo Frames for partial updates, Turbo Streams for real-time. Replace most JavaScript needs.
7. **Stimulus** (Frontend)
- Modest JavaScript framework. Use for DOM manipulation, form validation, UI interactions. One controller per behavior.
8. **Tailwind CSS** (Frontend)
- Utility-first CSS. Use tailwindcss-rails gem for zero-build setup with importmaps. Neo-brutalism style: bold borders, offset shadows.
9. **Importmap** (Frontend)
- JavaScript without bundling. Use for Rails 8+ apps. Import npm packages directly via CDN. No node_modules needed.
10. **ViewComponent** (Frontend)
- Encapsulated view components. Use for reusable UI pieces like cards, modals, forms. Better than partials for complex components.
11. **Solid Queue** (Background)
- Database-backed job queue for Rails 8+. No Redis needed. Use for all background jobs. Runs in Puma process with SOLID_QUEUE_IN_PUMA=true.
12. **Sidekiq** (Background)
- Redis-backed job queue. Used in older apps. For new Rails 8 apps, prefer Solid Queue instead.
13. **pg_search** (Search)
- PostgreSQL full-text search. Use for search without external services. Supports multisearch across models.
14. **Devise** (Auth)
- Full-featured authentication. Use for traditional username/password auth. Pairs with OmniAuth for social login.
15. **OmniAuth** (Auth)
- OAuth framework. Use for GitHub/Google/etc login. Configure strategies per provider.
16. **Pundit** (Auth)
- Authorization via policy objects. Use for role-based access control. One policy class per model.
17. **Stripe** (Payments)
- Payment processing. Use stripe gem directly or via Pay gem. Webhooks for subscription management.
18. **Pay** (Payments)
- Subscription billing abstraction. Wraps Stripe/Paddle/Braintree. Use for SaaS with recurring billing.
19. **Kamal** (DevOps)
- Container deployment to bare metal. Use for production deploys. Zero-downtime via rolling restarts. Configure in config/deploy.yml.
20. **Thruster** (DevOps)
- HTTP accelerator for Puma. Adds caching, compression, X-Sendfile. Use in production Dockerfile.
21. **AWS** (DevOps)
- Amazon Web Services. Use aws-sdk-s3 for file storage (S3/R2), aws-sdk-ses for email sending.
22. **Ahoy** (Analytics)
- Analytics tracking. Track visits and events. Use for product analytics without external services.
23. **Sentry** (Analytics)
- Error tracking. Use for production error monitoring. Configure via SENTRY_DSN env var.
24. **Minitest** (Testing)
- Default Rails testing. Use for unit and integration tests. Simpler than RSpec.
25. **Capybara** (Testing)
- Browser testing. Use for system tests. Configure with Selenium for JavaScript testing.
26. **Rack::Attack** (Security)
- Rate limiting middleware. Use for API throttling and brute force protection. Configure in config/initializers/rack_attack.rb.
27. **bundler-audit** (Security)
- Gem vulnerability scanner. Check for known CVEs in dependencies. Run regularly.
28. **letter_opener** (DevOps)
- Email preview in development. Opens emails in browser instead of sending. Essential for development.
29. **Pagy** (Framework)
- Fast pagination. Use instead of will_paginate/kaminari. Configure limit per page. Version 9.x for traditional API.
30. **FriendlyId** (Framework)
- Slugs for URLs. Use for SEO-friendly URLs like /products/my-product instead of /products/123.
31. **MetaTags** (Frontend)
- SEO meta tags helper. Use for dynamic title, description, OG tags. Configure defaults in application_helper.
32. **Chartkick** (Analytics)
- JavaScript charts. Use with Groupdate for time-series charts. Supports multiple chart libraries.
33. **Groupdate** (Analytics)
- Time-based grouping for charts. Use with Chartkick for daily/weekly/monthly analytics.
34. **SitemapGenerator** (DevOps)
- XML sitemap generation. Use for SEO. Configure in config/sitemap.rb.
35. **Redcarpet** (Frontend)
- Markdown rendering. Use for user-generated content, READMEs, documentation pages.
36. **Phlex** (Frontend)
- Ruby-first HTML views. Alternative to ERB. Use for component-driven UI with Ruby syntax.
## Machine-Readable Data
```json
{
"name": "Nauman's Production Rails Stack",
"slug": "naumans-production-rails-stack",
"description": "Battle-tested gems from BuiltOnRails, InventList, and Shorttags. LLM-ready with detailed context for each tool.",
"llm_prompt": "# Nauman's Production Rails Stack\n\nThis is a curated collection of Ruby gems and tools used across three production Rails applications:\n- **BuiltOnRails** - A directory of Rails applications (Rails 8.1)\n- **InventList** - An inventory management SaaS (Rails 7.0)\n- **Shorttags/SpotBZ** - A real-time analytics and notifications platform (Rails 8.0)\n\n## Philosophy\n\nThis stack follows the **37signals/Basecamp** approach to Rails development:\n- Rich domain models over service objects\n- CRUD controllers over custom actions\n- Database-backed everything (no Redis dependency in newer apps)\n- Hotwire (Turbo + Stimulus) for interactivity\n- Kamal for deployment\n\n## When to Use This Stack\n\nUse this collection when:\n- Building a new Rails 7+ or Rails 8+ application\n- You want production-tested, battle-proven gems\n- You prefer the \"vanilla Rails\" philosophy\n- You need to minimize external dependencies\n\n## Key Patterns\n\n1. **Authentication**: Passwordless magic links (no passwords) or Devise for traditional auth\n2. **Background Jobs**: Solid Queue (database-backed) over Redis-based solutions\n3. **Frontend**: Hotwire stack (Turbo + Stimulus + Tailwind)\n4. **Payments**: Stripe via the `pay` gem or direct integration\n5. **Search**: pg_search for PostgreSQL full-text search\n6. **Deployment**: Kamal with Thruster for zero-downtime deploys\n\n## Usage Instructions for LLMs\n\nWhen using these gems in a new project:\n1. Start with the core Framework + Database + Frontend gems\n2. Add Background processing (Solid Queue for Rails 8+)\n3. Add Auth based on needs (passwordless vs Devise)\n4. Add Payments if needed (Stripe)\n5. Add Monitoring/Security gems for production\n\nEach gem below includes a note explaining its specific use case in these applications.\n",
"visibility": "public",
"author": {
"username": "builtonrails",
"name": "BuiltOnRails"
},
"forked_from": null,
"stats": {
"likes": 0,
"forks": 0,
"views": 160
},
"stacks": [
{
"name": "Ruby on Rails",
"category": "Framework",
"position": 1,
"note": "The web framework. Rails 7+ for established apps, Rails 8+ for new apps. Use with Hotwire for modern interactivity without JavaScript frameworks."
},
{
"name": "Propshaft",
"category": "Frontend",
"position": 2,
"note": "Modern asset pipeline for Rails 7+. Simpler than Sprockets, no compilation step. Use instead of Sprockets for new Rails 7/8 apps."
},
{
"name": "Puma",
"category": "DevOps",
"position": 3,
"note": "Default Rails web server. Configure with threads matching CPU cores. Use with Thruster for HTTP caching in production."
},
{
"name": "PostgreSQL",
"category": "Database",
"position": 4,
"note": "Primary database. Use for everything: data, caching (solid_cache), jobs (solid_queue), websockets (solid_cable). No need for Redis."
},
{
"name": "Redis",
"category": "Database",
"position": 5,
"note": "In-memory store. Used in InventList for caching/sessions. For new apps, prefer Solid Cache (database-backed) instead."
},
{
"name": "Turbo",
"category": "Frontend",
"position": 6,
"note": "SPA-like navigation without JavaScript. Use Turbo Frames for partial updates, Turbo Streams for real-time. Replace most JavaScript needs."
},
{
"name": "Stimulus",
"category": "Frontend",
"position": 7,
"note": "Modest JavaScript framework. Use for DOM manipulation, form validation, UI interactions. One controller per behavior."
},
{
"name": "Tailwind CSS",
"category": "Frontend",
"position": 8,
"note": "Utility-first CSS. Use tailwindcss-rails gem for zero-build setup with importmaps. Neo-brutalism style: bold borders, offset shadows."
},
{
"name": "Importmap",
"category": "Frontend",
"position": 9,
"note": "JavaScript without bundling. Use for Rails 8+ apps. Import npm packages directly via CDN. No node_modules needed."
},
{
"name": "ViewComponent",
"category": "Frontend",
"position": 10,
"note": "Encapsulated view components. Use for reusable UI pieces like cards, modals, forms. Better than partials for complex components."
},
{
"name": "Solid Queue",
"category": "Background",
"position": 11,
"note": "Database-backed job queue for Rails 8+. No Redis needed. Use for all background jobs. Runs in Puma process with SOLID_QUEUE_IN_PUMA=true."
},
{
"name": "Sidekiq",
"category": "Background",
"position": 12,
"note": "Redis-backed job queue. Used in older apps. For new Rails 8 apps, prefer Solid Queue instead."
},
{
"name": "pg_search",
"category": "Search",
"position": 13,
"note": "PostgreSQL full-text search. Use for search without external services. Supports multisearch across models."
},
{
"name": "Devise",
"category": "Auth",
"position": 14,
"note": "Full-featured authentication. Use for traditional username/password auth. Pairs with OmniAuth for social login."
},
{
"name": "OmniAuth",
"category": "Auth",
"position": 15,
"note": "OAuth framework. Use for GitHub/Google/etc login. Configure strategies per provider."
},
{
"name": "Pundit",
"category": "Auth",
"position": 16,
"note": "Authorization via policy objects. Use for role-based access control. One policy class per model."
},
{
"name": "Stripe",
"category": "Payments",
"position": 17,
"note": "Payment processing. Use stripe gem directly or via Pay gem. Webhooks for subscription management."
},
{
"name": "Pay",
"category": "Payments",
"position": 18,
"note": "Subscription billing abstraction. Wraps Stripe/Paddle/Braintree. Use for SaaS with recurring billing."
},
{
"name": "Kamal",
"category": "DevOps",
"position": 19,
"note": "Container deployment to bare metal. Use for production deploys. Zero-downtime via rolling restarts. Configure in config/deploy.yml."
},
{
"name": "Thruster",
"category": "DevOps",
"position": 20,
"note": "HTTP accelerator for Puma. Adds caching, compression, X-Sendfile. Use in production Dockerfile."
},
{
"name": "AWS",
"category": "DevOps",
"position": 21,
"note": "Amazon Web Services. Use aws-sdk-s3 for file storage (S3/R2), aws-sdk-ses for email sending."
},
{
"name": "Ahoy",
"category": "Analytics",
"position": 22,
"note": "Analytics tracking. Track visits and events. Use for product analytics without external services."
},
{
"name": "Sentry",
"category": "Analytics",
"position": 23,
"note": "Error tracking. Use for production error monitoring. Configure via SENTRY_DSN env var."
},
{
"name": "Minitest",
"category": "Testing",
"position": 24,
"note": "Default Rails testing. Use for unit and integration tests. Simpler than RSpec."
},
{
"name": "Capybara",
"category": "Testing",
"position": 25,
"note": "Browser testing. Use for system tests. Configure with Selenium for JavaScript testing."
},
{
"name": "Rack::Attack",
"category": "Security",
"position": 26,
"note": "Rate limiting middleware. Use for API throttling and brute force protection. Configure in config/initializers/rack_attack.rb."
},
{
"name": "bundler-audit",
"category": "Security",
"position": 27,
"note": "Gem vulnerability scanner. Check for known CVEs in dependencies. Run regularly."
},
{
"name": "letter_opener",
"category": "DevOps",
"position": 28,
"note": "Email preview in development. Opens emails in browser instead of sending. Essential for development."
},
{
"name": "Pagy",
"category": "Framework",
"position": 29,
"note": "Fast pagination. Use instead of will_paginate/kaminari. Configure limit per page. Version 9.x for traditional API."
},
{
"name": "FriendlyId",
"category": "Framework",
"position": 30,
"note": "Slugs for URLs. Use for SEO-friendly URLs like /products/my-product instead of /products/123."
},
{
"name": "MetaTags",
"category": "Frontend",
"position": 31,
"note": "SEO meta tags helper. Use for dynamic title, description, OG tags. Configure defaults in application_helper."
},
{
"name": "Chartkick",
"category": "Analytics",
"position": 32,
"note": "JavaScript charts. Use with Groupdate for time-series charts. Supports multiple chart libraries."
},
{
"name": "Groupdate",
"category": "Analytics",
"position": 33,
"note": "Time-based grouping for charts. Use with Chartkick for daily/weekly/monthly analytics."
},
{
"name": "SitemapGenerator",
"category": "DevOps",
"position": 34,
"note": "XML sitemap generation. Use for SEO. Configure in config/sitemap.rb."
},
{
"name": "Redcarpet",
"category": "Frontend",
"position": 35,
"note": "Markdown rendering. Use for user-generated content, READMEs, documentation pages."
},
{
"name": "Phlex",
"category": "Frontend",
"position": 36,
"note": "Ruby-first HTML views. Alternative to ERB. Use for component-driven UI with Ruby syntax."
}
],
"created_at": "2026-01-22T03:26:36Z",
"updated_at": "2026-01-22T04:05:47Z",
"exported_at": "2026-09-20T06:17:33Z"
}
```
---
_Exported from [BuiltOnRails](https://builtonrails.com) on September 20, 2026_