<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Web Artisan</title>
    <description>The latest articles on DEV Community by Web Artisan (@k2sodev).</description>
    <link>https://dev.to/k2sodev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1230142%2F8bb36754-c196-4a17-ac7f-dad44902219a.jpg</url>
      <title>DEV Community: Web Artisan</title>
      <link>https://dev.to/k2sodev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/k2sodev"/>
    <language>en</language>
    <item>
      <title>I almost replaced Lovable with a $5 VPS, Dokploy and one MCP gateway</title>
      <dc:creator>Web Artisan</dc:creator>
      <pubDate>Fri, 18 Sep 2026 13:07:06 +0000</pubDate>
      <link>https://dev.to/k2sodev/i-almost-replaced-lovable-with-a-5-vps-dokploy-and-one-mcp-gateway-3mn9</link>
      <guid>https://dev.to/k2sodev/i-almost-replaced-lovable-with-a-5-vps-dokploy-and-one-mcp-gateway-3mn9</guid>
      <description>&lt;p&gt;Lovable is nice. You describe a site, an agent writes it, you click publish. It also costs $25–50 a month for the tiers that are actually usable, the code lives on their side, and the agent only knows how to do one thing.&lt;/p&gt;

&lt;p&gt;I already pay for Claude. I already have a VPS with Dokploy on it. The missing piece was a way for the agent to deploy, and gateways for that already exist — MetaMCP, IBM’s ContextForge, a few others. None of them gave me the combination I wanted: multiple runtimes, one container, an OAuth server of its own, and a UI I don’t mind looking at. So I wrote one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;any $5 VPS. 1 GB of RAM is enough for the gateway, Dokploy itself wants 2 GB&lt;/li&gt;
&lt;li&gt;Dokploy, which I was already using&lt;/li&gt;
&lt;li&gt;Junctio, an MCP gateway I wrote, one container next to Dokploy&lt;/li&gt;
&lt;li&gt;the official &lt;code&gt;@dokploy/mcp&lt;/code&gt; server, running inside Junctio as a stdio process&lt;/li&gt;
&lt;li&gt;AI Agent: Claude (Desktop/Code), ChatGPT, Codex, Cursor, whatever you have&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The client talks to one URL. Junctio runs the Dokploy MCP server, keeps the Dokploy API key, and exposes the tools over Streamable HTTP with OAuth.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Schema
AI Agent App --OAuth--&amp;gt; Junctio --stdio--&amp;gt; @dokploy/mcp --&amp;gt; Dokploy API
                        (API key lives here)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What happens
&lt;/h2&gt;

&lt;p&gt;The prompt is something like: “Build a landing page for X, push it to my GitHub, deploy it on Dokploy under x.example.com”. The agent writes the page, creates the app in Dokploy, points it at the repo, adds the domain and triggers the build. A few minutes end to end, most of it the Docker build.&lt;/p&gt;

&lt;p&gt;Every tool call goes through the gateway and lands in the request log: method, tool, upstream, status, timing. Bodies are not stored: arguments and results can carry anything your agent touched, and a log full of that is a leak waiting to happen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvgmsza1vcjzai4ijnxcf.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvgmsza1vcjzai4ijnxcf.jpeg" alt="Junctio: Request log" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a gateway and not just &lt;code&gt;npx @dokploy/mcp&lt;/code&gt; in the client
&lt;/h2&gt;

&lt;p&gt;claude.ai has no stdio. Claude Desktop and Claude Code will happily spawn a local stdio server; claude.ai in the browser and ChatGPT connectors will not, and they can’t send an API key header either. A custom connector means a remote MCP server with a real OAuth authorization server behind it: RFC 8414 metadata, dynamic client registration, PKCE, a consent screen. Junctio has that built in. Add the connector URL, approve at the consent screen with the admin password, done. No Cloudflare Worker wrapper, no separate auth service.&lt;/p&gt;

&lt;p&gt;~600 tools is too many. The official Dokploy MCP server exposes the whole API, upwards of 600 tools at the moment.. That’s a lot of context, and the agent picks the wrong application-* call half the time. In Junctio I put the server in a namespace and hid everything except about 20: create project, create application, set source, set domain, deploy, read logs. Plus a short instruction block on the namespace (“never delete, ask before creating databases”). The client only sees the small set.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcxcnm2x59osb5d3rqyiu.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcxcnm2x59osb5d3rqyiu.jpeg" alt="Junctio: Servers (upstream)" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The key stays on the server. With the stdio setup every client machine has the Dokploy API key in a mcp.json. With the gateway there is one key, in one place, encrypted at rest. Each client gets its own OAuth client or API key and I can revoke it from the UI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcn2q39io0iutc4ey4z8y.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcn2q39io0iutc4ey4z8y.jpeg" alt="Junctio: Endpoints" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Compose
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;junctio&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghcr.io/k2so-dev/junctio:latest&lt;/span&gt;
    &lt;span class="na"&gt;pull_policy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;JUNCTIO_SECRET&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${JUNCTIO_SECRET:?set JUNCTIO_SECRET, e.g. openssl rand -hex 32}&lt;/span&gt;
      &lt;span class="na"&gt;JUNCTIO_BASE_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${JUNCTIO_BASE_URL:?set JUNCTIO_BASE_URL, e.g. https://mcp.example.com}&lt;/span&gt;
      &lt;span class="na"&gt;JUNCTIO_TRUST_PROXY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true"&lt;/span&gt;
      &lt;span class="na"&gt;JUNCTIO_ADMIN_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${JUNCTIO_ADMIN_TOKEN:-}&lt;/span&gt;
      &lt;span class="na"&gt;LOG_LEVEL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${LOG_LEVEL:-info}&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;junctio-data:/data&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;junctio-cache:/cache&lt;/span&gt;
    &lt;span class="na"&gt;tmpfs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/tmp&lt;/span&gt;
    &lt;span class="na"&gt;read_only&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;dokploy-network&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;dokploy-network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;junctio-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;junctio-cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add it in Dokploy as a Compose service with the Raw provider. No published ports: Dokploy routes through its own Traefik, so the service joins dokploy-network and gets its domain on the Domains tab, pointed at container port 3000 with Let’s Encrypt on. junctio-cache holds the npx and uvx package caches — throwaway, but without it every cold start is slow. Outside Dokploy, put Caddy in front instead; either way OAuth needs TLS, while an API-key endpoint works fine over plain http on localhost.&lt;/p&gt;

&lt;p&gt;Then in the UI: add server &amp;gt; runtime npx (or bunx) &amp;gt; package &lt;code&gt;@dokploy/mcp&lt;/code&gt; &amp;gt; env &lt;code&gt;DOKPLOY_URL&lt;/code&gt;, &lt;code&gt;DOKPLOY_API_KEY&lt;/code&gt;. Create a namespace, hide tools, create an endpoint with OAuth on. Paste the URL into your agent app as a custom connector.&lt;/p&gt;

&lt;p&gt;Full walkthrough: &lt;a href="https://junctio.pages.dev/use-cases/claude-ai-connector/" rel="noopener noreferrer"&gt;https://junctio.pages.dev/use-cases/claude-ai-connector/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;p&gt;It is not Lovable. No live preview, no visual editor, no “click this button and change its color”. You get a chat and a deploy. If you want to iterate on UI visually, this is worse.&lt;/p&gt;

&lt;p&gt;It is also not safer by default. You are giving an agent write access to your deployment platform. I hid the destructive tools and the agent still once tried to redeploy the wrong app because two had similar names. Keep a namespace per project, keep the tool set small, read the logs. Junctio can also run a scheduled vulnerability check on the servers it launches through npx, bunx, node or uvx, which matters when you install packages from npm with one click. It’s off by default, it’s advisory data rather than analysis, and container images, custom commands and remote servers are marked “not audited” because the gateway can’t tell what’s inside them:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh4izzwh8uc674wkdpamr.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh4izzwh8uc674wkdpamr.jpeg" alt="Junctio: Security" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost
&lt;/h2&gt;

&lt;p&gt;VPS $5 a month. Dokploy free. Junctio free, MIT. AI subscription I already had.&lt;/p&gt;

&lt;p&gt;Memory: Junctio idles at about 60 MB. A running stdio server adds its own footprint, &lt;code&gt;@dokploy/mcp&lt;/code&gt; is another 60 MB or so. Idle servers get stopped after a timeout and restarted on the next call, so most of the time you’re back at 60 MB. It’s TypeScript on Bun, not Go, and I’m fine with that. I can maintain it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What else this unlocks
&lt;/h2&gt;

&lt;p&gt;The same trick works with anything that has an OpenAPI spec: run an OpenAPI-to-MCP server inside the gateway, hide the tools you don’t want, write instructions for the rest, and the agent can manage your shop, your DNS, your VPN panel. The gateway also browses the public MCP registry, so adding the next server is a click:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx67o8v4j6ug0bsl85fzo.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx67o8v4j6ug0bsl85fzo.jpeg" alt="Junctio: Explore" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fewd7dqofhghqx0f41g2u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fewd7dqofhghqx0f41g2u.png" alt="Junctio: Explore other sources" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/k2so-dev/junctio" rel="noopener noreferrer"&gt;https://github.com/k2so-dev/junctio&lt;/a&gt;&lt;br&gt;
Docs: &lt;a href="https://junctio.pages.dev/docs/" rel="noopener noreferrer"&gt;https://junctio.pages.dev/docs/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>opensource</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Starter template for Laravel + Nuxt.js development</title>
      <dc:creator>Web Artisan</dc:creator>
      <pubDate>Sun, 10 Dec 2023 12:37:06 +0000</pubDate>
      <link>https://dev.to/k2sodev/starter-template-for-laravel-nuxtjs-development-1bbp</link>
      <guid>https://dev.to/k2sodev/starter-template-for-laravel-nuxtjs-development-1bbp</guid>
      <description>&lt;p&gt;The goal of the project is to create a template for development on Laravel and Nuxt with maximum API performance, ready-made authorization methods, image uploading with optimization and ready-made user roles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://laravel.com/docs/10.x" rel="noopener noreferrer"&gt;&lt;strong&gt;Laravel 10&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://nuxt.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Nuxt 3&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://laravel.com/docs/10.x/octane" rel="noopener noreferrer"&gt;&lt;strong&gt;Laravel Octane&lt;/strong&gt;&lt;/a&gt; supercharges your application's performance by serving your application using high-powered application servers.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://laravel.com/docs/10.x/telescope" rel="noopener noreferrer"&gt;&lt;strong&gt;Laravel Telescope&lt;/strong&gt;&lt;/a&gt; provides insight into the requests coming into your application, exceptions, log entries, database queries, queued jobs, mail, notifications, cache operations, scheduled tasks, variable dumps, and more.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://laravel.com/docs/10.x/sanctum" rel="noopener noreferrer"&gt;&lt;strong&gt;Laravel Sanctum&lt;/strong&gt;&lt;/a&gt; Token-based authorization is compatible with &lt;strong&gt;SSR&lt;/strong&gt; and &lt;strong&gt;CSR&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://laravel.com/docs/10.x/socialite" rel="noopener noreferrer"&gt;&lt;strong&gt;Laravel Socialite&lt;/strong&gt;&lt;/a&gt; OAuth providers&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://spatie.be/docs/laravel-permission/v6/introduction" rel="noopener noreferrer"&gt;&lt;strong&gt;Spatie Laravel Permissions&lt;/strong&gt;&lt;/a&gt; This package allows you to manage user permissions and roles in a database.&lt;/li&gt;
&lt;li&gt;UI library &lt;a href="https://ui.nuxt.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Nuxt UI&lt;/strong&gt;&lt;/a&gt; based on &lt;a href="https://tailwindui.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;TailwindCSS&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://headlessui.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;HeadlessUI&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pinia.vuejs.org/ssr/nuxt.html" rel="noopener noreferrer"&gt;&lt;strong&gt;Pinia&lt;/strong&gt;&lt;/a&gt; The intuitive store for Vue.js&lt;/li&gt;
&lt;li&gt;Integrated pages: login, registration, password recovery, email confirmation, account information update, password change.&lt;/li&gt;
&lt;li&gt;Temporary uploads with cropping and optimization of images.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/unjs/ofetch" rel="noopener noreferrer"&gt;&lt;strong&gt;ofetch&lt;/strong&gt;&lt;/a&gt; preset for working with Laravel API, which makes it possible
use $&lt;strong&gt;fetch&lt;/strong&gt; without having to resort to custom $&lt;strong&gt;fetch&lt;/strong&gt; wrappers.&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/k2so-dev" rel="noopener noreferrer"&gt;
        k2so-dev
      &lt;/a&gt; / &lt;a href="https://github.com/k2so-dev/laravel-nuxt" rel="noopener noreferrer"&gt;
        laravel-nuxt
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      ⚡ Laravel and Nuxt.js boilerplate designed for development with maximum API performance, ready-made authorization methods, image uploading with optimization, user roles, device management
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/15279423/567610104-2704bbc3-5d4f-4a65-b861-ab24f648d517.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODk3MzgzNTksIm5iZiI6MTc4OTczODA1OSwicGF0aCI6Ii8xNTI3OTQyMy81Njc2MTAxMDQtMjcwNGJiYzMtNWQ0Zi00YTY1LWI4NjEtYWIyNGY2NDhkNTE3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA5MTglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwOTE4VDEzMjczOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWY5NzgxOTI1NTVlMmI0YWEwNzEwNjk1OGFmZTEzMzY0MTJiNDViMGQwMTM4NTIxZGM3YjVlMGUwYzAwZTQzZTUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.ytYIcVDXPJbaPE38lu1R765CZXnN9_LK5cle8A1_-k8"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F15279423%2F567610104-2704bbc3-5d4f-4a65-b861-ab24f648d517.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODk3MzgzNTksIm5iZiI6MTc4OTczODA1OSwicGF0aCI6Ii8xNTI3OTQyMy81Njc2MTAxMDQtMjcwNGJiYzMtNWQ0Zi00YTY1LWI4NjEtYWIyNGY2NDhkNTE3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA5MTglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwOTE4VDEzMjczOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWY5NzgxOTI1NTVlMmI0YWEwNzEwNjk1OGFmZTEzMzY0MTJiNDViMGQwMTM4NTIxZGM3YjVlMGUwYzAwZTQzZTUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.ytYIcVDXPJbaPE38lu1R765CZXnN9_LK5cle8A1_-k8" alt="preview"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;⚡ Laravel Nuxt Boilerplate&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://laravel.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8e81f9e041d0eaf948f5d2de0a390792b27fbf38578042a1f787988689dcc111/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c61726176656c2d7631332d6666326532312e737667" alt=""&gt;&lt;/a&gt;
&lt;a href="https://nuxt.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fa825643671fd07344c1e001f41b34d3c27b31144d120ec5f3108def4ff84c3e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6e7578742e6a732d76342d3034433639302e737667" alt=""&gt;&lt;/a&gt;
&lt;a href="https://app.fossa.com/projects/git%2Bgithub.com%2Fk2so-dev%2Flaravel-nuxt?ref=badge_shield" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/af7ca8b95ab11af67ad7a5f099bd42022bdb26a5126f654fc11aa19acfc83d62/68747470733a2f2f6170702e666f7373612e636f6d2f6170692f70726f6a656374732f6769742532426769746875622e636f6d2532466b32736f2d6465762532466c61726176656c2d6e7578742e7376673f747970653d736869656c64" alt="FOSSA Status"&gt;&lt;/a&gt;
&lt;a href="https://github.com/k2so-dev/laravel-nuxt/actions/workflows/laravel.yml" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/17f189eb45e2dca58d5efc0aeb7ec13b075e38ec3c609621de7faf2e76b5c3e1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f6b32736f2d6465762f6c61726176656c2d6e7578742f6c61726176656c2e796d6c" alt="GitHub Workflow Status"&gt;&lt;/a&gt;
&lt;a href="https://github.com/k2so-dev/laravel-nuxt/actions/workflows/github-code-scanning/codeql" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/k2so-dev/laravel-nuxt/actions/workflows/github-code-scanning/codeql/badge.svg" alt="CodeQL"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The goal of the project is to create a template for development on Laravel and Nuxt with maximum API performance, ready-made authorization methods, image uploading with optimization and ready-made user roles.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/k2so-dev/laravel-nuxt#features" rel="noopener noreferrer"&gt;Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/k2so-dev/laravel-nuxt#requirements" rel="noopener noreferrer"&gt;Requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/k2so-dev/laravel-nuxt#installation" rel="noopener noreferrer"&gt;Installation&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/k2so-dev/laravel-nuxt#standalone" rel="noopener noreferrer"&gt;Standalone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/k2so-dev/laravel-nuxt#docker" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/k2so-dev/laravel-nuxt#usage" rel="noopener noreferrer"&gt;Usage&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/k2so-dev/laravel-nuxt#fetch-wrapper" rel="noopener noreferrer"&gt;Fetch wrapper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/k2so-dev/laravel-nuxt#authentication" rel="noopener noreferrer"&gt;Authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/k2so-dev/laravel-nuxt#nuxt-middleware" rel="noopener noreferrer"&gt;Nuxt Middleware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/k2so-dev/laravel-nuxt#laravel-middleware" rel="noopener noreferrer"&gt;Laravel Middleware&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/k2so-dev/laravel-nuxt#examples" rel="noopener noreferrer"&gt;Examples&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/k2so-dev/laravel-nuxt#route-list" rel="noopener noreferrer"&gt;Route list&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/k2so-dev/laravel-nuxt#demo" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/k2so-dev/laravel-nuxt#links" rel="noopener noreferrer"&gt;Links&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/k2so-dev/laravel-nuxt#license" rel="noopener noreferrer"&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://laravel.com/docs/13.x" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Laravel 13&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://nuxt.com/" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Nuxt 4&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://laravel.com/docs/13.x/octane" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Laravel Octane&lt;/strong&gt;&lt;/a&gt; supercharges your application's performance by serving your application using high-powered application servers.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://laravel.com/docs/13.x/socialite" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Laravel Socialite&lt;/strong&gt;&lt;/a&gt; OAuth providers&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://laravel.com/docs/13.x/sail" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Laravel Sail&lt;/strong&gt;&lt;/a&gt; Light-weight command-line interface for interacting with Laravel's default Docker development environment.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://spatie.be/docs/laravel-permission/v6/introduction" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Spatie Laravel Permissions&lt;/strong&gt;&lt;/a&gt; This package allows you to manage user permissions and roles in a database.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pestphp.com/" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Pest&lt;/strong&gt;&lt;/a&gt; Elegant testing framework with expressive syntax and zero-config Laravel integration.&lt;/li&gt;
&lt;li&gt;UI library &lt;a href="https://ui.nuxt.com/" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Nuxt UI 4&lt;/strong&gt;&lt;/a&gt; based on &lt;a href="https://tailwindcss.com/" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;TailwindCSS 4&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://reka-ui.com/" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Reka UI&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pinia.vuejs.org/ssr/nuxt.html" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Pinia&lt;/strong&gt;&lt;/a&gt; The intuitive store for Vue.js&lt;/li&gt;
&lt;li&gt;Integrated pages: login, registration, password recovery, email confirmation, account information update, password change.&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/k2so-dev/laravel-nuxt" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;PHP 8.2 / Node 20+&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redis&lt;/strong&gt; is required for the &lt;a href="https://laravel.com/docs/10.x/routing#throttling-with-redis" rel="noopener noreferrer"&gt;&lt;strong&gt;Throttling with Redis&lt;/strong&gt;&lt;/a&gt; feature&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://laravel.com/docs/10.x/octane" rel="noopener noreferrer"&gt;&lt;strong&gt;Laravel Octane&lt;/strong&gt;&lt;/a&gt; supports 2 operating modes: Swoole (php extension) or Roadrunner&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;clone repository&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer install&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cp .env.example .env &amp;amp;&amp;amp; php artisan key:generate &amp;amp;&amp;amp; php artisan storage:link&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;php artisan migrate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;php artisan db:seed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;php artisan octane:install&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;php artisan octane:start --watch --port=8000 --host=127.0.0.1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;yarn install&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;yarn dev&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Nuxt port is set in package.json scripts via &lt;strong&gt;cross-env&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>opensource</category>
      <category>nuxt</category>
      <category>laravel</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
