My opinionated ruby on rails template
1# frozen_string_literal: true
2
3say '🚃 boxcar - Rails starter kit', :cyan
4say ''
5
6# ═══════════════════════════════════════════════════════════════════════════════
7# Template Configuration
8# ═══════════════════════════════════════════════════════════════════════════════
9
10TEMPLATE_ROOT = if __FILE__.start_with?('http')
11 File.dirname(__FILE__)
12 else
13 __dir__
14 end
15
16@post_install_tasks = []
17
18def apply_module(name, tasks = [])
19 apply File.join(TEMPLATE_ROOT, 'modules', "#{name}.rb")
20 @post_install_tasks.concat(tasks)
21end
22
23# ═══════════════════════════════════════════════════════════════════════════════
24# Remove Rails 8 defaults we'll replace
25# ═══════════════════════════════════════════════════════════════════════════════
26
27remove_file 'config/initializers/content_security_policy.rb'
28
29# ═══════════════════════════════════════════════════════════════════════════════
30# Base Setup
31# ═══════════════════════════════════════════════════════════════════════════════
32
33apply_module('base_gems')
34apply_module('credentials')
35apply_module('development_tools')
36apply_module('github')
37apply_module('logging')
38
39# ═══════════════════════════════════════════════════════════════════════════════
40# Database & Infrastructure
41# ═══════════════════════════════════════════════════════════════════════════════
42
43apply_module('database')
44apply_module('redis')
45apply_module('caching')
46
47# ═══════════════════════════════════════════════════════════════════════════════
48# Security
49# ═══════════════════════════════════════════════════════════════════════════════
50
51apply_module('security')
52
53# ═══════════════════════════════════════════════════════════════════════════════
54# Authentication & Authorization
55# ═══════════════════════════════════════════════════════════════════════════════
56
57apply_module('public_identifiable')
58apply_module('auth', ['run `rails db:migrate`'])
59apply_module('pundit')
60
61# ═══════════════════════════════════════════════════════════════════════════════
62# Frontend & SEO
63# ═══════════════════════════════════════════════════════════════════════════════
64
65gem 'tailwindcss-rails'
66apply_module('tailwind')
67apply_module('seo')
68
69# ═══════════════════════════════════════════════════════════════════════════════
70# Background Jobs & Feature Flags
71# ═══════════════════════════════════════════════════════════════════════════════
72
73apply_module('good_job')
74apply_module('flipper')
75
76# ═══════════════════════════════════════════════════════════════════════════════
77# Admin Dashboards
78# ═══════════════════════════════════════════════════════════════════════════════
79
80apply_module('blazer')
81apply_module('rails_performance')
82apply_module('console1984')
83apply_module('pghero')
84
85# ═══════════════════════════════════════════════════════════════════════════════
86# Monitoring & Analytics
87# ═══════════════════════════════════════════════════════════════════════════════
88
89apply_module('health_checks')
90apply_module('analytics')
91apply_module('metrics')
92
93# ═══════════════════════════════════════════════════════════════════════════════
94# Data Management
95# ═══════════════════════════════════════════════════════════════════════════════
96
97apply_module('paper_trail')
98apply_module('soft_delete')
99apply_module('friendly_id')
100apply_module('pg_search')
101apply_module('aasm')
102
103# ═══════════════════════════════════════════════════════════════════════════════
104# Email & Pagination
105# ═══════════════════════════════════════════════════════════════════════════════
106
107apply_module('kaminari')
108apply_module('mailkick')
109apply_module('email')
110
111# ═══════════════════════════════════════════════════════════════════════════════
112# Admin Routes (must be last - depends on all admin modules)
113# ═══════════════════════════════════════════════════════════════════════════════
114
115apply_module('admin_routes')
116
117# ═══════════════════════════════════════════════════════════════════════════════
118# Finish
119# ═══════════════════════════════════════════════════════════════════════════════
120
121say ''
122say ''
123say '✅ boxcar setup complete!', :green
124say ''
125
126if @post_install_tasks.any?
127 say 'Next steps:', :yellow
128 @post_install_tasks.uniq.each { |task| say " - #{task}", :yellow }
129 say ''
130end
131
132say 'Run `cd #{app_name} && bin/dev` to start your app', :cyan
133say ''