<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="237524" data-post-id="237524">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="iangreenleaf" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/iangreenleaf/120/17581_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  iangreenleaf
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I’ve spent a fair amount of my professional life building and/or maintaining one-person apps in production (or two-to-four-person apps, which is not as catchy of a name but has many similarities). I don’t think you should focus too much on the idea of a literal single person, but rather, on the ability to maintain an application with a very modest input of developer resources. IMO both Rails and Phoenix are both best in class in this category.</p>
<p>What DHH mentions in passing is that there was a golden era in which Rails really did make it possible for a single person with mid-level experience to maintain a complex web application and even enjoy doing so! The rapidly escalating demands and complexity of the frontend have dashed that possibility for many web applications. These days, rich UI experiences are a baseline expectation for many apps, and rich UI experiences are very hard to build without committing to a heavy frontend framework, which these days is typically React. Not only is React a different language, it’s a completely different paradigm with almost entirely novel conceptual models, performance concerns, development tooling, etc. It’s a lot for even a very senior dev to keep a handle on while simultaneously maintaining a backend. To make matters worse, the huge amount of churn in Javascript packages means you are perpetually on the hook for breaking updates, abandoned modules, etc. Adding React to a non-toy project introduces a <strong>huge</strong> maintenance liability and puts you on a swift track out of one-person-app land.</p>
<p>To me, one of the biggest value propositions of LiveView is that it greatly expands the scope of which projects can avoid introducing React and incurring all this liability. LiveView makes it possible to build UIs that are rich and performant enough to satisfy the needs of many modern web apps, and it is powerful enough to remain in one-person-framework land while doing that. A lot of Rails apps have React dependencies even though they’re not doing anything especially fancy, simply because Rails hasn’t historically had a good answer for what to do when you need more than “a sprinkle” of JS but less than the whole enchilada. I haven’t used Rails 7 yet but it will be interesting to see if it makes headway in this area.</p>
<p>To answer the original question about when I would choose one versus the other, here’s how I would look at it in the current moment:</p>
<ul>
<li>If my app needs <em>very little</em> rich UI, I can write a little bit of vanilla JS, skip React, and use Rails or Phoenix. Either one is good.</li>
<li>If my app needs <em>a lot</em> of rich UI, I can suck it up and use React, and the backend can be Rails or Phoenix. Either one is good.</li>
<li>If my app needs <em>some</em> rich UI, I can use Phoenix+LiveView and skip React. Phoenix is the clear winner at the moment.</li>
</ul> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="237524" data-batch-url="/posts/batch_likers">
                        20
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/rails-and-phoenix-as-one-person-frameworks/44779/12">Post #11</a>
	                </div>
	            </div>
              <div id="likers-container-237524" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="237524"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-most-liked cat-most-liked" title="One of the top 3 liked posts in this thread!"></div>
  </section>
</div>
    <div class="postbit" id="237578" data-post-id="237578">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="derek-zhou" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/derek-zhou/120/19943_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  derek-zhou
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="iangreenleaf" data-post="12" data-topic="44779">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/iangreenleaf/48/17581_2.png" class="avatar"> iangreenleaf:</div>
<blockquote>
<p>What DHH mentions in passing is that there was a golden era in which Rails really did make it possible for a single person with mid-level experience to maintain a complex web application and even enjoy doing so!</p>
</blockquote>
</aside>
<p>Frontend complexity aside, I think Rail is no longer the best for for one person projects. Phoenix is. Rail is probably better than Phoenix for a smallish team project.</p>
<p>With Rail you can whip up an application with many gems in a short time, but the many dependencies will give you maintenance headache later on and will take the fun out of it for the solo developer. With Phoenix, you tend to write a lot of peripheral code yourself because of package availability or your whim. It is harder to get started, but the fun of doing it stay with you.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="237578" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/rails-and-phoenix-as-one-person-frameworks/44779/13">Post #12</a>
	                </div>
	            </div>
              <div id="likers-container-237578" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="237578"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #12"></div>
  </section>
</div>
    <div class="postbit" id="237615" data-post-id="237615">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="dimitarvp" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/dimitarvp/120/38664_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  dimitarvp
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="derek-zhou" data-post="13" data-topic="44779">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/derek-zhou/48/19943_2.png" class="avatar"> derek-zhou:</div>
<blockquote>
<p>Frontend complexity aside, I think Rail is no longer the best for for one person projects. Phoenix is. Rail is probably better than Phoenix for a smallish team project.</p>
</blockquote>
</aside>
<p>I agree. I think the selling point of Ruby on Rails was and likely always will be “get a prototype out the door super quickly”. I’ve eaten a lot of flak for this statement but I worked for 6.5 years with Rails and I’ve only seen it excel at that and nothing else. Every Rails project I co-wrote, or consulted for, or coached on, or co-architected, always spirals to a near-unmaintainable mess some 2-3 months after the MVP is out and the order comes from above “OK, now make it a full-blown product”, despite the best efforts of me and dozens of others who are much better programmers and architects than myself.</p>
<p>People just pile gems on top of gems and monkey patches on top of other monkey patches and even with super strict and stringent process you’re always just one minor version upgrade away from breaking 15% of your test suite (which is likely at least 5_000 tests). It got to a point where bureaucracy stalled almost all progress and by that time you gotta ask yourself “what’s the point of all this fancy tech if we can’t deliver a new checkbox in a form in the next 3 weeks?”.</p>
<hr>
<p>But to not make anyone think I am just crapping on Rails (I am not), it is indeed a very good framework for a one person to whip up a business idea and very quickly iterate on it and check its viability. I always liked Rails for that but then again this is not how I live and work – namely producing tons of new projects, throwing them at the wall and seeing what sticks. That, plus its scaling problems – you very quickly get to the point of not being able to service some meager 300-400 requests per second! not cool! – eventually turned me off of it and made me look for alternatives… which eventually led me to Elixir / Phoenix at the beginning of 2016.</p>
<hr>
<p>Phoenix <em>can</em> be a good one-person framework but as others pointed out <strong>very accurately</strong>, the frontend part is the real productivity killer. I am excited to try Tailwind and <code>esbuild</code> and not have <code>webpack</code> and React et. al. in a hobby project. But (as also pointed out by other people) many projects will not be able to benefit from this simplicity so they’re stuck with having to manage a ton of extra complexity without the backend framework mattering much.</p>
<p>So all in all, Phoenix too is a good one-person framework but for it, PHP Laravel, Ruby on Rails and a few others, the true blocker is the frontend stack really. I’ve participated in and authored both Plug and Phoenix projects that are only API servers / gateways and they absolutely kill it there. Not to mention data gatherers and scrapers, event buses, message queue routers and what-have-you.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="237615" data-batch-url="/posts/batch_likers">
                        15
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/rails-and-phoenix-as-one-person-frameworks/44779/14">Post #13</a>
	                </div>
	            </div>
              <div id="likers-container-237615" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="237615"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #13"></div>
  </section>
</div>
    <div class="postbit" id="237662" data-post-id="237662">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="crispinb" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/crispinb/120/22642_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  crispinb
                      <span class="op-star" title="Thread Starter">
                        <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                      </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thanks everyone for your interesting thoughts. I don’t have anything useful to add (never having used Rails, and being an elixir/phoenix neophyte). It’s necessarily a very hypothetical question, as the relevant ceteris paribus caveats (exactly equivalent skills in both frameworks,  project requirements etc) never really hold true. Every software project really is its own special snowflake. I wouldn’t have it any other way.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="237662" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/rails-and-phoenix-as-one-person-frameworks/44779/15">Post #14</a>
	                </div>
	            </div>
              <div id="likers-container-237662" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="237662"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-last-post cat-last-post" title="Last post!"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <span class="all-loaded">— All posts loaded —</span>
</div></template></turbo-stream>