railsmaker-core 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +169 -0
  3. data/bin/railsmaker +344 -0
  4. data/lib/railsmaker/generators/app_generator.rb +157 -0
  5. data/lib/railsmaker/generators/auth_generator.rb +97 -0
  6. data/lib/railsmaker/generators/base_generator.rb +39 -0
  7. data/lib/railsmaker/generators/concerns/gsub_validation.rb +24 -0
  8. data/lib/railsmaker/generators/litestream_generator.rb +89 -0
  9. data/lib/railsmaker/generators/mailjet_generator.rb +68 -0
  10. data/lib/railsmaker/generators/opentelemetry_generator.rb +79 -0
  11. data/lib/railsmaker/generators/plausible_generator.rb +33 -0
  12. data/lib/railsmaker/generators/plausible_instrumentation_generator.rb +28 -0
  13. data/lib/railsmaker/generators/sentry_generator.rb +46 -0
  14. data/lib/railsmaker/generators/server_command_generator.rb +178 -0
  15. data/lib/railsmaker/generators/signoz_generator.rb +33 -0
  16. data/lib/railsmaker/generators/signoz_opentelemetry_generator.rb +37 -0
  17. data/lib/railsmaker/generators/templates/app/credentials.example.yml +14 -0
  18. data/lib/railsmaker/generators/templates/app/main_index.html.erb +71 -0
  19. data/lib/railsmaker/generators/templates/auth/app/controllers/omniauth_callbacks_controller.rb +18 -0
  20. data/lib/railsmaker/generators/templates/litestream/litestream.yml.erb +32 -0
  21. data/lib/railsmaker/generators/templates/opentelemetry/lograge.rb.erb +9 -0
  22. data/lib/railsmaker/generators/templates/shell_scripts/plausible.sh.erb +51 -0
  23. data/lib/railsmaker/generators/templates/shell_scripts/signoz.sh.erb +38 -0
  24. data/lib/railsmaker/generators/templates/shell_scripts/signoz_opentelemetry.sh.erb +49 -0
  25. data/lib/railsmaker/generators/templates/ui/app/assets/images/og-image.webp +0 -0
  26. data/lib/railsmaker/generators/templates/ui/app/assets/images/plausible-screenshot.png +0 -0
  27. data/lib/railsmaker/generators/templates/ui/app/assets/images/signoz-screenshot.png +0 -0
  28. data/lib/railsmaker/generators/templates/ui/app/controllers/demo_controller.rb +7 -0
  29. data/lib/railsmaker/generators/templates/ui/app/controllers/pages_controller.rb +4 -0
  30. data/lib/railsmaker/generators/templates/ui/app/helpers/seo_helper.rb +39 -0
  31. data/lib/railsmaker/generators/templates/ui/app/javascript/controllers/flash_controller.js +14 -0
  32. data/lib/railsmaker/generators/templates/ui/app/javascript/controllers/index.js +11 -0
  33. data/lib/railsmaker/generators/templates/ui/app/javascript/controllers/scroll_fade_controller.js +27 -0
  34. data/lib/railsmaker/generators/templates/ui/app/views/clearance_mailer/change_password.html.erb +8 -0
  35. data/lib/railsmaker/generators/templates/ui/app/views/clearance_mailer/change_password.text.erb +5 -0
  36. data/lib/railsmaker/generators/templates/ui/app/views/demo/analytics.html.erb +214 -0
  37. data/lib/railsmaker/generators/templates/ui/app/views/demo/index.html.erb +312 -0
  38. data/lib/railsmaker/generators/templates/ui/app/views/demo/support.html.erb +147 -0
  39. data/lib/railsmaker/generators/templates/ui/app/views/layouts/_navbar.html.erb +193 -0
  40. data/lib/railsmaker/generators/templates/ui/app/views/layouts/application.html.erb +62 -0
  41. data/lib/railsmaker/generators/templates/ui/app/views/main/index.html.erb +320 -0
  42. data/lib/railsmaker/generators/templates/ui/app/views/pages/privacy.html.erb +63 -0
  43. data/lib/railsmaker/generators/templates/ui/app/views/pages/terms.html.erb +54 -0
  44. data/lib/railsmaker/generators/templates/ui/app/views/passwords/create.html.erb +9 -0
  45. data/lib/railsmaker/generators/templates/ui/app/views/passwords/edit.html.erb +21 -0
  46. data/lib/railsmaker/generators/templates/ui/app/views/passwords/new.html.erb +26 -0
  47. data/lib/railsmaker/generators/templates/ui/app/views/sessions/new.html.erb +49 -0
  48. data/lib/railsmaker/generators/templates/ui/app/views/shared/_auth_layout.html.erb +24 -0
  49. data/lib/railsmaker/generators/templates/ui/app/views/shared/_flash.html.erb +19 -0
  50. data/lib/railsmaker/generators/templates/ui/app/views/shared/_footer.html.erb +52 -0
  51. data/lib/railsmaker/generators/templates/ui/app/views/shared/_structured_data.html.erb +20 -0
  52. data/lib/railsmaker/generators/templates/ui/app/views/users/new.html.erb +49 -0
  53. data/lib/railsmaker/generators/templates/ui/config/sitemap.rb +33 -0
  54. data/lib/railsmaker/generators/templates/ui/public/icon.png +0 -0
  55. data/lib/railsmaker/generators/templates/ui/public/icon.svg +5 -0
  56. data/lib/railsmaker/generators/templates/ui/public/robots.txt +8 -0
  57. data/lib/railsmaker/generators/ui_generator.rb +68 -0
  58. data/lib/railsmaker.rb +29 -0
  59. metadata +359 -0
@@ -0,0 +1,320 @@
1
+ <div class="min-h-screen bg-base-300">
2
+ <!-- Hero Section with Logo -->
3
+ <div class="hero bg-base-100 min-h-screen">
4
+ <div class="hero-content flex-col xl:flex-row-reverse gap-8 max-w-7xl px-4 py-24 xl:py-0">
5
+ <div class="relative w-full xl:w-2/5 max-w-2xl lg:max-w-4xl xl:max-w-none mx-auto order-last xl:order-first">
6
+ <iframe class="w-full rounded-lg shadow-lg h-[300px]" src="https://www.youtube-nocookie.com/embed/Py3Gm1JD9cM?si=1tA-l4k2YZi2DYyk&amp;controls=1" title="Build your app in 15 minutes" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
7
+ </div>
8
+ <div class="w-full xl:w-3/5 text-center xl:text-left order-first xl:order-last">
9
+ <div class="flex items-center justify-center xl:justify-start gap-4 mb-8">
10
+ <div class="p-3 bg-primary rounded-lg">
11
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-8 text-base-100" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
12
+ <path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"></path>
13
+ <path d="M3.3 7l8.7 5 8.7-5"></path>
14
+ <path d="M12 22V12"></path>
15
+ </svg>
16
+ </div>
17
+ <span class="text-2xl font-bold">
18
+ Rails<span class="text-primary ml-1">Maker</span>
19
+ </span>
20
+ </div>
21
+ <h1 class="text-4xl xl:text-5xl font-bold">
22
+ Ship this app
23
+ <span class="relative inline-block mt-4 md:mt-0">
24
+ <span class="relative bg-base-100 px-4 py-1 rounded border-2 border-secondary text-secondary">in 15 minutes</span>
25
+ </span>
26
+ </h1>
27
+ <p class="py-6 text-lg xl:text-xl">
28
+ A modern <strong>all-in-one</strong> Rails template — perfect for
29
+ indie hackers craving full control, low operational hassle and quick iteration.
30
+ <span class="block mt-2">Save <span class="text-success font-semibold">$120+ per month</span> in infrastructure costs and <span class="text-success font-semibold">20+ hours</span> of development time.</span>
31
+ </p>
32
+ <div class="flex flex-col sm:flex-row gap-4 justify-center xl:justify-start">
33
+ <%= link_to sign_in_path, class: "btn btn-primary gap-2" do %>
34
+ Demo
35
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
36
+ <path d="M14 5l7 7m0 0l-7 7m7-7H3"/>
37
+ </svg>
38
+ <% end %>
39
+ <a href="https://buymeacoffee.com/sgerov" target="_blank" class="btn btn-secondary gap-2">
40
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
41
+ <path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/>
42
+ </svg>
43
+ Pay what you want
44
+ </a>
45
+ </div>
46
+ <div class="mt-8 flex items-center gap-4 justify-center xl:justify-start">
47
+ <div class="flex -space-x-2">
48
+ <div class="w-8 h-8 rounded-full border-2 border-base-100 bg-primary/20 flex items-center justify-center">
49
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-4 text-primary" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
50
+ <path d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z" />
51
+ </svg>
52
+ </div>
53
+ <div class="w-8 h-8 rounded-full border-2 border-base-100 bg-secondary/20 flex items-center justify-center">
54
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-4 text-secondary" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
55
+ <path d="M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4" />
56
+ </svg>
57
+ </div>
58
+ <div class="w-8 h-8 rounded-full border-2 border-base-100 bg-accent/20 flex items-center justify-center">
59
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-4 text-accent" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
60
+ <path d="M22 12h-6l-2 3h-4l-2-3H2" />
61
+ <path d="M5.45 5.11L2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z" />
62
+ </svg>
63
+ </div>
64
+ </div>
65
+ <span class="text-sm opacity-75">From idea to product in no time</span>
66
+ </div>
67
+ </div>
68
+ </div>
69
+ <!-- Add the bouncing arrow -->
70
+ <div class="hidden md:block fixed md:absolute bottom-8 left-1/2 transform -translate-x-1/2 animate-bounce transition-opacity duration-300 opacity-100"
71
+ data-controller="scroll-fade"
72
+ data-scroll-fade-offset-value="100">
73
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-8 opacity-50" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
74
+ <path d="M7 13l5 5 5-5"/>
75
+ <path d="M7 6l5 5 5-5"/>
76
+ </svg>
77
+ </div>
78
+ </div>
79
+
80
+ <!-- Feature Grid -->
81
+ <div class="py-16 lg:py-24 px-4 bg-base-200">
82
+ <div class="text-center max-w-3xl mx-auto mb-16">
83
+ <h2 class="text-3xl lg:text-4xl font-bold mb-4">Everything you need for quick iteration</h2>
84
+ <p class="text-lg opacity-75">A production-ready Rails stack that respects conventions and puts you in control</p>
85
+ </div>
86
+
87
+ <div class="max-w-7xl mx-auto grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
88
+ <!-- Development -->
89
+ <div class="card bg-base-100 shadow-xl md:col-span-1">
90
+ <div class="card-body">
91
+ <div class="flex items-center gap-3 mb-6">
92
+ <div class="p-2 bg-primary/10 rounded-lg">
93
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-6 text-primary" fill="none" viewBox="0 0 24 24" stroke="currentColor">
94
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z" />
95
+ </svg>
96
+ </div>
97
+ <h3 class="text-xl font-bold">Quick Setup</h3>
98
+ </div>
99
+ <ul class="space-y-3">
100
+ <li class="flex items-start gap-2">
101
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5 text-success flex-shrink-0 mt-1" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
102
+ <polyline points="20 6 9 17 4 12"></polyline>
103
+ </svg>
104
+ <span>Adjustable template generated in minutes</span>
105
+ </li>
106
+ <li class="flex items-start gap-2">
107
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5 text-success flex-shrink-0 mt-1" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
108
+ <polyline points="20 6 9 17 4 12"></polyline>
109
+ </svg>
110
+ <span>Server-side scripts included</span>
111
+ </li>
112
+ <li class="flex items-start gap-2">
113
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5 text-success flex-shrink-0 mt-1" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
114
+ <polyline points="20 6 9 17 4 12"></polyline>
115
+ </svg>
116
+ <span>Tested on Mac M4 & Ubuntu 24.04</span>
117
+ </li>
118
+ </ul>
119
+ </div>
120
+ </div>
121
+
122
+ <!-- Core Features -->
123
+ <div class="card bg-base-100 shadow-xl md:col-span-1">
124
+ <div class="card-body">
125
+ <div class="flex items-center gap-3 mb-6">
126
+ <div class="p-2 bg-primary/10 rounded-lg">
127
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-6 text-primary" fill="none" viewBox="0 0 24 24" stroke="currentColor">
128
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z" />
129
+ </svg>
130
+ </div>
131
+ <h3 class="text-xl font-bold">Modern Stack</h3>
132
+ </div>
133
+ <ul class="space-y-3">
134
+ <li class="flex items-start gap-2">
135
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5 text-success flex-shrink-0 mt-1" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
136
+ <polyline points="20 6 9 17 4 12"></polyline>
137
+ </svg>
138
+ <span>Rails 8 with Tailwind 4 & DaisyUI 5</span>
139
+ </li>
140
+ <li class="flex items-start gap-2">
141
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5 text-success flex-shrink-0 mt-1" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
142
+ <polyline points="20 6 9 17 4 12"></polyline>
143
+ </svg>
144
+ <span>SQLite with S3 backups</span>
145
+ </li>
146
+ <li class="flex items-start gap-2">
147
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5 text-success flex-shrink-0 mt-1" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
148
+ <polyline points="20 6 9 17 4 12"></polyline>
149
+ </svg>
150
+ <span>SEO-ready and mobile-first</span>
151
+ </li>
152
+ </ul>
153
+ </div>
154
+ </div>
155
+
156
+ <!-- Infrastructure -->
157
+ <div class="card bg-base-100 shadow-xl md:col-span-2 lg:col-span-1">
158
+ <div class="card-body">
159
+ <div class="flex items-center gap-3 mb-6">
160
+ <div class="p-2 bg-primary/10 rounded-lg">
161
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-6 text-primary" fill="none" viewBox="0 0 24 24" stroke="currentColor">
162
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" />
163
+ </svg>
164
+ </div>
165
+ <h3 class="text-xl font-bold">No overhead</h3>
166
+ </div>
167
+ <ul class="space-y-3">
168
+ <li class="flex items-start gap-2">
169
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5 text-success flex-shrink-0 mt-1" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
170
+ <polyline points="20 6 9 17 4 12"></polyline>
171
+ </svg>
172
+ <span>Multiple apps per server with Thruster</span>
173
+ </li>
174
+ <li class="flex items-start gap-2">
175
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5 text-success flex-shrink-0 mt-1" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
176
+ <polyline points="20 6 9 17 4 12"></polyline>
177
+ </svg>
178
+ <span>Authentication and OAuth2</span>
179
+ </li>
180
+ <li class="flex items-start gap-2">
181
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5 text-success flex-shrink-0 mt-1" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
182
+ <polyline points="20 6 9 17 4 12"></polyline>
183
+ </svg>
184
+ <span>6000 free emails/mo with Mailjet</span>
185
+ </li>
186
+ </ul>
187
+ </div>
188
+ </div>
189
+
190
+ <!-- Monitoring & Analytics -->
191
+ <div class="card bg-base-100 shadow-xl col-span-full">
192
+ <div class="card-body">
193
+ <div class="flex items-center gap-3 mb-6">
194
+ <div class="p-2 bg-primary/10 rounded-lg">
195
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-6 text-primary" fill="none" viewBox="0 0 24 24" stroke="currentColor">
196
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z" />
197
+ </svg>
198
+ </div>
199
+ <h3 class="text-xl font-bold">Complete Observability Suite</h3>
200
+ </div>
201
+
202
+ <div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
203
+ <!-- Plausible Analytics Preview -->
204
+ <div class="mockup-browser border bg-base-300">
205
+ <div class="mockup-browser-toolbar">
206
+ <div class="input">analytics.yourapp.com</div>
207
+ </div>
208
+ <div class="bg-base-100 p-4">
209
+ <%= image_tag "plausible-screenshot.png", class: "w-full rounded-lg shadow-lg", alt: "Plausible Analytics Dashboard" %>
210
+ </div>
211
+ </div>
212
+
213
+ <!-- SigNoz Preview -->
214
+ <div class="mockup-browser border bg-base-300">
215
+ <div class="mockup-browser-toolbar">
216
+ <div class="input">metrics.yourapp.com</div>
217
+ </div>
218
+ <div class="bg-base-100 p-4">
219
+ <%= image_tag "signoz-screenshot.png", class: "w-full rounded-lg shadow-lg", alt: "SigNoz Dashboard" %>
220
+ </div>
221
+ </div>
222
+ </div>
223
+
224
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-8 mt-8">
225
+ <div class="space-y-2">
226
+ <h4 class="font-bold">Self-hosted</h4>
227
+ <ul class="space-y-3">
228
+ <li class="flex items-start gap-2">
229
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5 text-success flex-shrink-0 mt-1" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
230
+ <polyline points="20 6 9 17 4 12"></polyline>
231
+ </svg>
232
+ <span>Metrics, traces and structured logs with SigNoz</span>
233
+ </li>
234
+ <li class="flex items-start gap-2">
235
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5 text-success flex-shrink-0 mt-1" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
236
+ <polyline points="20 6 9 17 4 12"></polyline>
237
+ </svg>
238
+ <span>Plausible analytics</span>
239
+ </li>
240
+ </ul>
241
+ </div>
242
+ <div class="space-y-2">
243
+ <h4 class="font-bold">3rd Party</h4>
244
+ <ul class="space-y-3">
245
+ <li class="flex items-start gap-2">
246
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5 text-success flex-shrink-0 mt-1" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
247
+ <polyline points="20 6 9 17 4 12"></polyline>
248
+ </svg>
249
+ <span>Error tracking with Sentry</span>
250
+ </li>
251
+ <li class="flex items-start gap-2">
252
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5 text-success flex-shrink-0 mt-1" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
253
+ <polyline points="20 6 9 17 4 12"></polyline>
254
+ </svg>
255
+ <span>Free alerting with the Opsgenie integration</span>
256
+ </li>
257
+ </ul>
258
+ </div>
259
+ </div>
260
+ </div>
261
+ </div>
262
+ </div>
263
+ </div>
264
+
265
+ <!-- Social Proof Section -->
266
+ <div class="bg-base-100 py-16">
267
+ <div class="max-w-7xl mx-auto px-4">
268
+ <div class="flex flex-wrap justify-center gap-8">
269
+ <div class="stats stats-vertical sm:stats-horizontal shadow">
270
+ <div class="stat">
271
+ <div class="stat-title">Setup Time</div>
272
+ <div class="stat-value text-primary">15min</div>
273
+ <div class="stat-desc">From zero to prod</div>
274
+ </div>
275
+
276
+ <div class="stat">
277
+ <div class="stat-title">Servers Costs</div>
278
+ <div class="stat-value">from $5/mo</div>
279
+ <div class="stat-desc">Depends on your provider</div>
280
+ </div>
281
+
282
+ <div class="stat">
283
+ <div class="stat-title">Features</div>
284
+ <div class="stat-value text-secondary">20+</div>
285
+ <div class="stat-desc">Production-ready</div>
286
+ </div>
287
+ </div>
288
+ </div>
289
+ </div>
290
+ </div>
291
+
292
+ <!-- CTA Section -->
293
+ <div class="py-24 bg-base-300">
294
+ <div class="max-w-3xl mx-auto text-center px-4">
295
+ <h2 class="text-3xl lg:text-4xl font-bold mb-6">Launch in one command 🚀</h2>
296
+ <div class="mockup-code w-full text-left">
297
+ <pre data-prefix="$"><code>gem install railsmaker-core</code></pre>
298
+ <pre data-prefix=">" class="text-success"><code>1 gem installed</code></pre>
299
+ <pre data-prefix="$"><code>railsmaker new:wizard</code></pre>
300
+ <pre data-prefix=">" class="text-success"><code>Successfully generated RailsMaker template 🎉</code></pre>
301
+ <pre data-prefix="$"><code>kamal setup</code></pre>
302
+ <pre data-prefix=">" class="text-success"><code>Deployed 🚀</code></pre>
303
+ </div>
304
+ <div class="flex flex-col sm:flex-row gap-4 justify-center mt-16">
305
+ <a href="https://buymeacoffee.com/sgerov" class="btn btn-secondary btn-lg gap-2" target="_blank">
306
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
307
+ <path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/>
308
+ </svg>
309
+ Pay what you want
310
+ </a>
311
+ <a href="https://github.com/sgerov/railsmaker" class="btn btn-outline btn-lg gap-2" target="_blank">
312
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
313
+ <path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"/>
314
+ </svg>
315
+ View on GitHub
316
+ </a>
317
+ </div>
318
+ </div>
319
+ </div>
320
+ </div>
@@ -0,0 +1,63 @@
1
+ <div class="container mx-auto px-4 py-8 mt-16 pb-24 md:pb-8">
2
+ <!-- Page Header -->
3
+ <div class="flex items-center gap-3 mb-8">
4
+ <div class="size-12 rounded-lg bg-primary/10 flex items-center justify-center">
5
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-6 text-primary" fill="none" viewBox="0 0 24 24" stroke="currentColor">
6
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" />
7
+ </svg>
8
+ </div>
9
+ <div>
10
+ <h2 class="text-2xl font-bold">Privacy Policy</h2>
11
+ <p class="text-base-content/60">Last updated: <%= Time.current.strftime("%B %d, %Y") %></p>
12
+ </div>
13
+ </div>
14
+
15
+ <!-- Main Content -->
16
+ <div class="card bg-base-100 shadow-xl">
17
+ <div class="card-body prose max-w-none">
18
+ <h3 class="!mt-0">1. Information We Collect</h3>
19
+ <p>We collect information you provide directly to us when you:</p>
20
+ <ul>
21
+ <li>Create an account</li>
22
+ <li>Use our services</li>
23
+ <li>Contact us for support</li>
24
+ <li>Subscribe to our newsletters</li>
25
+ </ul>
26
+
27
+ <h3>2. How We Use Your Information</h3>
28
+ <p>We use the information we collect to:</p>
29
+ <ul>
30
+ <li>Provide, maintain, and improve our services</li>
31
+ <li>Process your transactions</li>
32
+ <li>Send you technical notices and support messages</li>
33
+ <li>Communicate with you about products, services, and events</li>
34
+ <li>Protect against fraudulent or illegal activity</li>
35
+ </ul>
36
+
37
+ <h3>3. Information Sharing</h3>
38
+ <p>We do not sell or rent your personal information to third parties. We may share your information with:</p>
39
+ <ul>
40
+ <li>Service providers who assist in our operations</li>
41
+ <li>Professional advisers</li>
42
+ <li>Law enforcement when required by law</li>
43
+ </ul>
44
+
45
+ <h3>4. Data Security</h3>
46
+ <p>We implement appropriate technical and organizational measures to protect your personal information against unauthorized access, alteration, disclosure, or destruction.</p>
47
+
48
+ <h3>5. Your Rights</h3>
49
+ <p>You have the right to:</p>
50
+ <ul>
51
+ <li>Access your personal information</li>
52
+ <li>Correct inaccurate data</li>
53
+ <li>Request deletion of your data</li>
54
+ <li>Object to our processing of your data</li>
55
+ <li>Export your data</li>
56
+ </ul>
57
+
58
+ <h3 class="!mb-2">6. Contact Us</h3>
59
+ <p class="!mt-0">If you have questions about this Privacy Policy, please contact us at:</p>
60
+ <p class="!mt-0">Email: privacy@railsmaker.com</p>
61
+ </div>
62
+ </div>
63
+ </div>
@@ -0,0 +1,54 @@
1
+ <div class="container mx-auto px-4 py-8 mt-16 pb-24 md:pb-8">
2
+ <!-- Page Header -->
3
+ <div class="flex items-center gap-3 mb-8">
4
+ <div class="size-12 rounded-lg bg-primary/10 flex items-center justify-center">
5
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-6 text-primary" fill="none" viewBox="0 0 24 24" stroke="currentColor">
6
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
7
+ </svg>
8
+ </div>
9
+ <div>
10
+ <h2 class="text-2xl font-bold">Terms and Conditions</h2>
11
+ <p class="text-base-content/60">Last updated: <%= Time.current.strftime("%B %d, %Y") %></p>
12
+ </div>
13
+ </div>
14
+
15
+ <!-- Main Content -->
16
+ <div class="card bg-base-100 shadow-xl">
17
+ <div class="card-body prose max-w-none">
18
+ <h3 class="!mt-0">1. Agreement to Terms</h3>
19
+ <p>By accessing or using RailsMaker, you agree to be bound by these Terms and Conditions and our Privacy Policy. If you disagree with any part of the terms, you do not have permission to access the service.</p>
20
+
21
+ <h3>2. Use License</h3>
22
+ <p>We grant you a limited, non-exclusive, non-transferable, and revocable license to use our service for your personal or business use, subject to these Terms and any separate agreements with us.</p>
23
+
24
+ <h3>3. User Accounts</h3>
25
+ <p>When you create an account with us, you must provide accurate, complete, and current information. You are responsible for safeguarding your account credentials and for any activities under your account.</p>
26
+
27
+ <h3>4. Acceptable Use</h3>
28
+ <p>You agree not to:</p>
29
+ <ul>
30
+ <li>Use the service for any illegal purpose</li>
31
+ <li>Violate any laws in your jurisdiction</li>
32
+ <li>Infringe upon any intellectual property rights</li>
33
+ <li>Transmit harmful code or materials</li>
34
+ <li>Attempt to gain unauthorized access to our systems</li>
35
+ </ul>
36
+
37
+ <h3>5. Intellectual Property</h3>
38
+ <p>The service and its original content, features, and functionality are owned by RailsMaker and are protected by international copyright, trademark, and other intellectual property laws.</p>
39
+
40
+ <h3>6. Termination</h3>
41
+ <p>We may terminate or suspend your account and access to the service immediately, without prior notice, for conduct that we believe violates these Terms or is harmful to other users, us, or third parties, or for any other reason.</p>
42
+
43
+ <h3>7. Limitation of Liability</h3>
44
+ <p>In no event shall RailsMaker, its directors, employees, partners, agents, suppliers, or affiliates be liable for any indirect, incidental, special, consequential, or punitive damages, including without limitation, loss of profits, data, use, goodwill, or other intangible losses.</p>
45
+
46
+ <h3>8. Changes to Terms</h3>
47
+ <p>We reserve the right to modify or replace these Terms at any time. If a revision is material, we will provide at least 30 days' notice prior to any new terms taking effect.</p>
48
+
49
+ <h3 class="!mb-2">9. Contact Us</h3>
50
+ <p class="!mt-0">If you have any questions about these Terms, please contact us at:</p>
51
+ <p class="!mt-0">Email: legal@railsmaker.com</p>
52
+ </div>
53
+ </div>
54
+ </div>
@@ -0,0 +1,9 @@
1
+ <div class="hero flex-1">
2
+ <div class="hero-content flex-col">
3
+ <div class="text-center">
4
+ <h1 class="text-5xl font-bold"><%= t(".title", default: "Reset Password") %></h1>
5
+ <p class="py-6"><%= t(".description") %></p>
6
+ <%= link_to t("layouts.application.sign_in"), sign_in_path, class: "btn btn-primary" %>
7
+ </div>
8
+ </div>
9
+ </div>
@@ -0,0 +1,21 @@
1
+ <% content_for :auth_header do %>
2
+ <h2 class="mt-6 text-3xl font-bold tracking-tight">Set new password</h2>
3
+ <p class="mt-2 text-sm opacity-75">
4
+ Please choose a strong password for your account
5
+ </p>
6
+ <% end %>
7
+
8
+ <%= render layout: 'shared/auth_layout' do %>
9
+ <%= form_for :password_reset,
10
+ url: [@user, :password, token: @user.confirmation_token],
11
+ html: { method: :put, class: "space-y-6" } do |form| %>
12
+ <div class="form-control">
13
+ <%= form.label :password, class: "label font-medium" %>
14
+ <%= form.password_field :password, class: "input input-bordered w-full" %>
15
+ </div>
16
+
17
+ <div class="form-control mt-8">
18
+ <%= form.submit "Update password", class: "btn btn-primary w-full" %>
19
+ </div>
20
+ <% end %>
21
+ <% end %>
@@ -0,0 +1,26 @@
1
+ <% content_for :auth_header do %>
2
+ <h2 class="mt-6 text-3xl font-bold tracking-tight">Reset your password</h2>
3
+ <p class="mt-2 text-sm opacity-75">
4
+ Enter your email address and we'll send you instructions
5
+ </p>
6
+ <% end %>
7
+
8
+ <%= render layout: 'shared/auth_layout' do %>
9
+ <%= form_for :password, url: passwords_path, class: "space-y-6" do |form| %>
10
+ <div class="form-control">
11
+ <%= form.label :email, class: "label font-medium" %>
12
+ <%= form.email_field :email, class: "input input-bordered w-full", placeholder: "you@example.com" %>
13
+ </div>
14
+
15
+ <div class="form-control mt-8">
16
+ <%= form.submit "Send reset instructions", class: "btn btn-primary w-full" %>
17
+ </div>
18
+ <% end %>
19
+
20
+ <div class="mt-6 text-center">
21
+ <p class="text-sm">
22
+ Remember your password?
23
+ <%= link_to "Back to sign in", sign_in_path, class: "link link-hover font-medium" %>
24
+ </p>
25
+ </div>
26
+ <% end %>
@@ -0,0 +1,49 @@
1
+ <% content_for :auth_header do %>
2
+ <h2 class="mt-6 text-3xl font-bold tracking-tight">Welcome back!</h2>
3
+ <p class="mt-2 text-sm opacity-75">
4
+ This is a demo app. Sign in to continue
5
+ </p>
6
+ <% end %>
7
+
8
+ <%= render layout: 'shared/auth_layout' do %>
9
+ <%= form_for :session, url: session_path, class: "space-y-6" do |form| %>
10
+ <div class="form-control">
11
+ <%= form.email_field :email, class: "input input-lg input-bordered w-full", placeholder: "you@example.com" %>
12
+ </div>
13
+
14
+ <div class="form-control">
15
+ <%= form.password_field :password, class: "input input-lg input-bordered w-full", placeholder: "Password" %>
16
+ </div>
17
+
18
+ <div class="alert alert-info bg-info/10 text-info text-xs mt-6">
19
+ <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 24 24" fill="none" stroke="currentColor">
20
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
21
+ </svg>
22
+ <span>Demo account: test@test.com / 123123123</span>
23
+ </div>
24
+
25
+ <div class="form-control mt-8">
26
+ <%= form.submit t(".submit", default: "Sign in"), class: "btn btn-primary w-full" %>
27
+ </div>
28
+
29
+ <div class="divider text-xs uppercase">or</div>
30
+
31
+ <div class="form-control">
32
+ <%= link_to '/auth/google_oauth2', data: { turbo: false }, class: "btn btn-outline w-full" do %>
33
+ <svg class="w-5 h-5 mr-2" viewBox="0 0 24 24">
34
+ <path fill="currentColor" d="M21.35,11.1H12.18V13.83H18.69C18.36,17.64 15.19,19.27 12.19,19.27C8.36,19.27 5,16.25 5,12C5,7.9 8.2,4.73 12.2,4.73C15.29,4.73 17.1,6.7 17.1,6.7L19,4.72C19,4.72 16.56,2 12.1,2C6.42,2 2.03,6.8 2.03,12C2.03,17.05 6.16,22 12.25,22C17.6,22 21.5,18.33 21.5,12.91C21.5,11.76 21.35,11.1 21.35,11.1V11.1Z" />
35
+ </svg>
36
+ Sign in with Google
37
+ <% end %>
38
+ </div>
39
+ <% end %>
40
+
41
+ <div class="mt-6 flex items-center justify-between">
42
+ <% if Clearance.configuration.allow_sign_up? %>
43
+ <%= link_to t(".sign_up"), sign_up_path, class: "text-sm link link-hover" %>
44
+ <% end %>
45
+ <% if Clearance.configuration.allow_password_reset? %>
46
+ <%= link_to t(".forgot_password"), new_password_path, class: "text-sm link link-hover" %>
47
+ <% end %>
48
+ </div>
49
+ <% end %>
@@ -0,0 +1,24 @@
1
+ <div class="container mx-auto px-4 py-8 mt-16 pb-24 md:pb-8 flex items-center justify-center">
2
+ <div class="w-full max-w-md space-y-8">
3
+ <div class="text-center">
4
+ <%= link_to root_path, class: "inline-block" do %>
5
+ <div class="p-3 bg-primary rounded-lg">
6
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-8 text-base-100" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
7
+ <path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"></path>
8
+ <path d="M3.3 7l8.7 5 8.7-5"></path>
9
+ <path d="M12 22V12"></path>
10
+ </svg>
11
+ </div>
12
+ <% end %>
13
+ <%= yield :auth_header %>
14
+ </div>
15
+
16
+ <div class="card bg-base-100 shadow-2xl">
17
+ <div class="card-body">
18
+ <%= yield %>
19
+ </div>
20
+ </div>
21
+
22
+ <%= yield :auth_footer %>
23
+ </div>
24
+ </div>
@@ -0,0 +1,19 @@
1
+ <div id="flash" class="fixed inset-x-0 top-20 mx-auto w-full max-w-md px-4">
2
+ <% flash.each do |type, message| %>
3
+ <div role="alert"
4
+ class="alert <%= type == 'notice' ? 'alert-info' : 'alert-warning' %> alert-soft sm:alert-horizontal"
5
+ data-controller="flash">
6
+ <% if type == 'notice' %>
7
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="h-6 w-6 shrink-0 stroke-current">
8
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
9
+ </svg>
10
+ <% else %>
11
+ <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 shrink-0 stroke-current" fill="none" viewBox="0 0 24 24">
12
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
13
+ </svg>
14
+ <% end %>
15
+ <span><%= message %></span>
16
+ <button data-action="flash#dismiss" class="btn btn-sm btn-ghost">&times;</button>
17
+ </div>
18
+ <% end %>
19
+ </div>