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_
← Back to Collection