<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[meadmin]]></title><description><![CDATA[meadmin]]></description><link>https://meadmin.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Sun, 01 Nov 2026 22:22:09 GMT</lastBuildDate><atom:link href="https://meadmin.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Solo dev stack: why I build admin systems with full-stack Node.js and a framework with fixed conventions]]></title><description><![CDATA[I build a lot of admin systems — client work and my own projects. They all share the same traits: tight deadlines, changing requirements, and usually just…]]></description><link>https://meadmin.hashnode.dev/solo-dev-stack-why-i-build-admin-systems-with-full-stack-node-js-and-a-framework-with-fixed-conventions</link><guid isPermaLink="true">https://meadmin.hashnode.dev/solo-dev-stack-why-i-build-admin-systems-with-full-stack-node-js-and-a-framework-with-fixed-conventions</guid><category><![CDATA[node]]></category><category><![CDATA[vue]]></category><category><![CDATA[TypeScript]]></category><category><![CDATA[webdev]]></category><dc:creator><![CDATA[yuntian001]]></dc:creator><pubDate>Thu, 29 Oct 2026 06:47:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ae2eb303e9c8a6d5116055a/33c8f708-246a-4e52-95ac-a35cd75de859.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Some context</h2>
<p>I build a lot of admin systems — client work and my own projects. They all share the same traits: <strong>tight deadlines, changing requirements, and usually just me on the keyboard.</strong></p>
<p>After years of trial and error, the setup that works best for me is <strong>full-stack Node.js + a framework with fixed conventions</strong>. Here's why, and what I built around it.</p>
<h2>The practical benefits of full-stack Node.js</h2>
<p>Not theory — things I actually feel day to day:</p>
<p><strong>One person can carry the whole project.</strong> Vue on the frontend, Node on the backend, one language. I write an endpoint and immediately wire up the page for it. No context switching between two languages.</p>
<p><strong>Shared types.</strong> With TypeScript on both ends, the API's field types are the same types the frontend uses. Backend changes a field, the frontend build fails and tells you where. No comparing against API docs by hand.</p>
<p><strong>No integration meetings.</strong> When you write both ends, you decide what the API looks like. Integration cost is basically zero — anyone who has done frontend/backend coordination knows how much time that saves.</p>
<p><strong>Hiring is easier.</strong> If the project grows, half the people who know Vue can pick up Node quickly.</p>
<h2>Full-stack alone isn't enough — you need fixed conventions</h2>
<p>Node full-stack solves the <em>language</em> problem. But there's another one: <strong>every project rebuilds the same plumbing</strong> — directory layout, permissions, list pages, menu config. It's roughly the same every time, yet you redesign it every time. It wastes time, and the designs drift, so your own old projects feel foreign six months later.</p>
<p>So I turned my own way of working into <strong>Me-Admin</strong> — the conventions and common features are already decided:</p>
<ul>
<li>Fixed directory structure and layering; every module looks identical</li>
<li>Built-in RBAC (menu / button / API levels), users, roles, menus — ready out of the box</li>
<li>The stuff admin panels always need — lists, search, pagination, forms, uploads — already has components and established patterns</li>
<li>Mainstream stack: Midway 3 + Sequelize + PostgreSQL on the backend, Vue 3 + Vite + Element Plus + vxeTable on the frontend</li>
</ul>
<p>The biggest time-saver: <strong>define an entity, run two commands, get a whole module.</strong></p>
<pre><code class="language-bash"># Sync the database schema
pnpm exec meadmin sync product

# Generate controller, API, frontend pages, menu permissions
pnpm exec meadmin crud product --menu
</code></pre>
<p>Refresh the admin panel and the module is in the menu — full CRUD working. The output is plain source code in your repo, no black boxes. Edit it directly.</p>
<p>{% github <a href="https://github.com/meadmin-cn/meadmin">https://github.com/meadmin-cn/meadmin</a> %}</p>
<h2>Works for agile sprints, works for AI coding too</h2>
<p>Two situations where this setup really pays off:</p>
<p><strong>Deadline-driven agile work.</strong> Requirement comes in → define the entity → run the commands → the basics are done. All remaining time goes to actual business logic. Requirement changes? Update the entity and regenerate, or just edit the generated code.</p>
<p><strong>AI-assisted coding.</strong> This is my biggest takeaway from the past year. Because the framework's conventions are fixed and every module has the same shape, <strong>AI writes noticeably more accurate code by copying existing modules</strong>. Even more direct: I have the AI write the entity definition (describe the table's fields), which it does fast and well, then the commands generate the module. The only AI output I need to review is that one entity file — a few dozen lines, checked at a glance. Everything else is identical generator output.</p>
<p>Simple truth: the more fixed the conventions, the smoother the work — whether a human or an AI is writing it.</p>
<h2>Try it</h2>
<pre><code class="language-bash">pnpm create meadminjs@latest
pnpm dev
</code></pre>
<p>Admin panel at <a href="http://127.0.0.1:7001/admin">http://127.0.0.1:7001/admin</a> (admin / meAdmin#202507!P). MIT licensed, use it for anything.</p>
<ul>
<li>GitHub: <a href="https://github.com/meadmin-cn/meadmin">https://github.com/meadmin-cn/meadmin</a></li>
<li>Website: <a href="https://www.meadmin.cn">https://www.meadmin.cn</a></li>
<li>Docs: <a href="https://www.meadmin.cn">https://www.meadmin.cn</a></li>
</ul>
<p>Questions → open an issue, I answer all of them: <a href="https://github.com/meadmin-cn/meadmin/issues">https://github.com/meadmin-cn/meadmin/issues</a></p>
<p>If it saves you time, a star means a lot: <a href="https://github.com/meadmin-cn/meadmin">https://github.com/meadmin-cn/meadmin</a></p>
]]></content:encoded></item></channel></rss>