{"id":691,"date":"2025-09-18T07:16:28","date_gmt":"2025-09-18T07:16:28","guid":{"rendered":"https:\/\/1v0.net\/blog\/?p=691"},"modified":"2025-09-20T17:00:22","modified_gmt":"2025-09-20T17:00:22","slug":"laravel-jetstream-a-powerful-starter-kit-for-modern-applications","status":"publish","type":"post","link":"https:\/\/1v0.net\/blog\/laravel-jetstream-a-powerful-starter-kit-for-modern-applications\/","title":{"rendered":"Laravel Jetstream: A Powerful Starter Kit for Modern Applications"},"content":{"rendered":"\n<p><strong>Laravel Jetstream<\/strong> is the official Laravel starter kit designed for developers who want more than just basic authentication. It provides a robust foundation with features like two-factor authentication, API tokens, teams, and profile management. Jetstream is ideal for building modern applications that require advanced user management out of the box.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">What Is Laravel Jetstream?<\/h3>\n\n\n\n<p>Jetstream builds on Laravel Fortify by providing not just backend services, but also fully styled front-end scaffolding. It supports both <strong>Livewire + Blade<\/strong> and <strong>Inertia + Vue\/React<\/strong>, giving developers flexibility to choose between a traditional or modern SPA-like experience.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Authentication (login, registration, password reset, email verification)<\/li>\n\n\n\n<li>Two-factor authentication (2FA)<\/li>\n\n\n\n<li>Profile photo and account management<\/li>\n\n\n\n<li>API support with Laravel Sanctum<\/li>\n\n\n\n<li>Team and multi-user support<\/li>\n<\/ul>\n\n\n\n<p>(see comparison of\u00a0<a href=\"https:\/\/1v0.net\/blog\/best-laravel-starter-kits-breeze-jetstream-spark-nova-22-more\/\">Laravel Starter Kits<\/a>)<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Installing Jetstream<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">composer <span class=\"hljs-keyword\">require<\/span> laravel\/jetstream\n\nphp artisan jetstream:install livewire\n<span class=\"hljs-comment\"># or<\/span>\nphp artisan jetstream:install inertia\n\nnpm install &amp;&amp; npm run dev\nphp artisan migrate<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>These commands install Jetstream, scaffold the chosen front-end stack (Livewire or Inertia), compile assets, and prepare database migrations for advanced user features like teams and two-factor authentication.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Protecting Routes<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/\/ routes\/web.php<\/span>\n\nRoute::middleware(&#91;<span class=\"hljs-string\">'auth:sanctum'<\/span>, <span class=\"hljs-string\">'verified'<\/span>])\n    -&gt;get(<span class=\"hljs-string\">'\/dashboard'<\/span>, <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-params\">()<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> view(<span class=\"hljs-string\">'dashboard'<\/span>);\n    })\n    -&gt;name(<span class=\"hljs-string\">'dashboard'<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This ensures only authenticated and email-verified users can access the dashboard. Jetstream uses Sanctum for API authentication, making it secure for SPA and mobile integrations.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Controller Example with Teams<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/\/ app\/Http\/Controllers\/ProjectController.php<\/span>\n\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Controllers<\/span>;\n\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Request<\/span>;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ProjectController<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Controller<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">__construct<\/span><span class=\"hljs-params\">()<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">$this<\/span>-&gt;middleware(&#91;<span class=\"hljs-string\">'auth'<\/span>, <span class=\"hljs-string\">'verified'<\/span>]);\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">index<\/span><span class=\"hljs-params\">()<\/span>\n    <\/span>{\n        <span class=\"hljs-comment\">\/\/ Example: Only allow projects from the current team<\/span>\n        $projects = auth()-&gt;user()-&gt;currentTeam-&gt;projects;\n        <span class=\"hljs-keyword\">return<\/span> view(<span class=\"hljs-string\">'projects.index'<\/span>, compact(<span class=\"hljs-string\">'projects'<\/span>));\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This controller applies middleware for authentication and verification. Inside the <code>index<\/code> method, it fetches projects only for the logged-in user\u2019s current team \u2014 showcasing Jetstream\u2019s built-in team support.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Blade Example: Team Switcher<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-comment\">&lt;!-- resources\/views\/navigation-menu.blade.php --&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"mt-3 space-y-1\"<\/span>&gt;<\/span>\n    @foreach (Auth::user()-&gt;allTeams() as $team)\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">x-jet-switchable-team<\/span> <span class=\"hljs-attr\">:team<\/span>=<span class=\"hljs-string\">\"$team\"<\/span> \/&gt;<\/span>\n    @endforeach\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This Blade snippet renders a team switcher in the navigation menu. Users can seamlessly switch between multiple teams, a feature built directly into Jetstream.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Inertia + Vue Example<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">\/\/ resources\/js\/Pages\/Dashboard.vue\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">template<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"text-2xl font-bold\"<\/span>&gt;<\/span>Welcome, {{ $page.props.auth.user.name }}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"mt-2\"<\/span>&gt;<\/span>You are part of team: {{ $page.props.auth.user.current_team.name }}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Link<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"\/logout\"<\/span> <span class=\"hljs-attr\">method<\/span>=<span class=\"hljs-string\">\"post\"<\/span> <span class=\"hljs-attr\">as<\/span>=<span class=\"hljs-string\">\"button\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"mt-4 px-4 py-2 bg-red-500 text-white rounded\"<\/span>&gt;<\/span>\n      Logout\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">Link<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">template<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span> <span class=\"hljs-attr\">setup<\/span>&gt;<\/span><span class=\"javascript\">\n<span class=\"hljs-keyword\">import<\/span> { Link } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'@inertiajs\/vue3'<\/span>\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This Inertia + Vue component shows the logged-in user\u2019s name and current team. The <code>$page.props.auth.user<\/code> object comes directly from Jetstream\u2019s authentication layer. The <code>Link<\/code> component handles logout via POST request, keeping the SPA flow seamless without a full page reload.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Comparison: Jetstream vs Breeze vs Fortify<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Feature<\/th><th>Breeze<\/th><th>Jetstream<\/th><th>Fortify<\/th><\/tr><\/thead><tbody><tr><td><strong>Purpose<\/strong><\/td><td>Minimal starter kit with basic auth<\/td><td>Advanced starter kit with teams, API, and 2FA<\/td><td>Backend-only auth services<\/td><\/tr><tr><td><strong>Front-end<\/strong><\/td><td>Blade + Tailwind (Inertia optional)<\/td><td>Livewire + Blade or Inertia + Vue\/React<\/td><td>None (UI must be built manually)<\/td><\/tr><tr><td><strong>Teams<\/strong><\/td><td>No<\/td><td>Yes<\/td><td>No<\/td><\/tr><tr><td><strong>2FA<\/strong><\/td><td>No<\/td><td>Yes<\/td><td>Yes (backend only)<\/td><\/tr><tr><td><strong>Best Use Case<\/strong><\/td><td>Small\/medium apps, MVPs<\/td><td>SaaS apps, team-based apps<\/td><td>Custom UI projects<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Laravel Jetstream<\/strong> goes far beyond basic authentication. It equips your Laravel app with modern, production-ready features like two-factor authentication, API tokens, and team management. If you\u2019re building SaaS applications or team-based platforms, Jetstream is the ideal choice compared to Breeze (minimal) or Fortify (backend-only).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Laravel Jetstream is the official Laravel starter kit designed for developers who want more than just basic authentication. It provides a robust foundation with features like two-factor authentication, API tokens, teams, and profile management. Jetstream is ideal for building modern applications that require advanced user management out of the box. What Is Laravel Jetstream? Jetstream [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":695,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[12,158,162,100],"class_list":["post-691","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel","tag-authentication","tag-jetstream","tag-laravel-starter-kits","tag-starter-kits"],"_links":{"self":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts\/691","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/comments?post=691"}],"version-history":[{"count":1,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts\/691\/revisions"}],"predecessor-version":[{"id":694,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts\/691\/revisions\/694"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/media\/695"}],"wp:attachment":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/media?parent=691"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/categories?post=691"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/tags?post=691"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}