PHPackages                             smwks/tallium - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. smwks/tallium

ActiveProject[Framework](/categories/framework)

smwks/tallium
=============

A TALL stack starter kit, focus on livewire single file components. AI coding friendly.

13.x-dev(4mo ago)014MITBladePHP ^8.2CI failing

Since Mar 5Pushed 1mo agoCompare

[ Source](https://github.com/smwks/tallium)[ Packagist](https://packagist.org/packages/smwks/tallium)[ RSS](/packages/smwks-tallium/feed)WikiDiscussions master Synced today

READMEChangelogDependencies (13)Versions (6)Used By (0)

TALLium
=======

[](#tallium)

A streamlined [TALL stack](https://tallstack.dev) starter kit for Laravel, built on Livewire single-file components. Forked from the official [Laravel Livewire starter kit](https://github.com/laravel/livewire-starter-kit) and refined for clarity -- especially when working with AI coding agents.

What's Included
---------------

[](#whats-included)

- **Laravel 13** with [Fortify](https://laravel.com/docs/fortify) authentication (login, registration, password reset, email verification, two-factor auth)
- **Livewire 4** with single-file page components (`Route::livewire()`)
- **[Flux UI](https://fluxui.dev)** component library
- **Tailwind CSS 4** with dark mode
- **TypeScript** and **Vite**

What Changed From the Official Starter Kit
------------------------------------------

[](#what-changed-from-the-official-starter-kit)

TALLium consolidates the official starter kit to reduce pattern variability and improve AI coding clarity:

- **Single layout per context** -- one `app.blade.php` (authenticated), one `auth.blade.php` (auth forms), one `guest.blade.php` (public). No layout variants (sidebar/header, card/simple/split).
- **Layouts are self-contained** -- each layout is a complete HTML document. No scattered partials to trace through.
- **Pages live in `resources/views/pages/`** -- routed via `Route::livewire()` or `Route::view()`. Consistent, predictable file locations.
- **Routes consolidated into `routes/web.php`** -- no separate `routes/settings.php`.
- **Dynamic brand logo** -- generates a monogram from `config('app.name')` instead of a hardcoded SVG.
- **Removed `app/Livewire/Actions/`** -- logout is handled inline. Less indirection.

Getting Started
---------------

[](#getting-started)

```
# Clone and install
laravel new my-app --using=smwks/tallium
```

The `composer setup` script handles: dependency installation, `.env` creation, key generation, database migration, npm install, and asset build.

### Development Server

[](#development-server)

```
composer dev
```

Starts the Laravel dev server, queue worker, log tail (Pail), and Vite in parallel.

Default test credentials (from seeder):

- **Email:**
- **Password:** password

### Other Commands

[](#other-commands)

```
composer lint          # Fix code style with Pint
composer lint:check    # Check code style without fixing
composer test          # Run linter + test suite
```

Project Structure
-----------------

[](#project-structure)

```
routes/web.php                              # All routes
resources/views/
  layouts/
    app.blade.php                           # Authenticated layout (sidebar nav)
    auth.blade.php                          # Auth form layout (login, register, etc.)
    guest.blade.php                         # Public/guest layout
    partials/head.blade.php                 # Shared  content
  pages/
    welcome.blade.php                       # Landing page
    dashboard.blade.php                     # Dashboard
    settings/
      profile.blade.php                     # Profile settings (Livewire)
      security.blade.php                    # Security settings (password + 2FA)
      appearance.blade.php                  # Appearance settings (Livewire)
      container.blade.php                   # Settings layout wrapper
      delete-user-form.blade.php            # Account deletion form
      partials/heading.blade.php            # Settings page header
  components/
    app-logo.blade.php                      # Sidebar brand component
    app-logo-icon.blade.php                 # Dynamic monogram icon
    desktop-user-menu.blade.php             # User dropdown menu

```

License
-------

[](#license)

MIT

---

Building TALLium from the Official Starter Kit
----------------------------------------------

[](#building-tallium-from-the-official-starter-kit)

This section describes every change needed to transform the official [Laravel Livewire starter kit](https://github.com/laravel/livewire-starter-kit) into TALLium. Apply these steps in order to a fresh clone of the upstream kit.

**Goal:** Consolidate layout variants, enforce a single layout per context, move all pages under `resources/views/pages/`, consolidate routes into `routes/web.php`, replace the hardcoded brand SVG with a dynamic monogram, and remove indirection (Logout action class, multiple layout shims).

### Overview of changes

[](#overview-of-changes)

KindCountSummaryDelete7Logout action, 2 app layout variants, 3 auth layout variants, settings route fileRename5head partial, dashboard, settings layout→container, settings heading, welcomeModify9.gitignore, composer.json, seeder, 2 components, 2 layouts, 3 settings pages, routes/web.phpCreate1`layouts/guest.blade.php`---

### Step 1 — Delete files

[](#step-1--delete-files)

Remove these files entirely (they are replaced by inlined or consolidated alternatives):

```
app/Livewire/Actions/Logout.php
resources/views/layouts/app/header.blade.php
resources/views/layouts/app/sidebar.blade.php
resources/views/layouts/auth/card.blade.php
resources/views/layouts/auth/simple.blade.php
resources/views/layouts/auth/split.blade.php
routes/settings.php

```

```
git rm app/Livewire/Actions/Logout.php
git rm resources/views/layouts/app/header.blade.php
git rm resources/views/layouts/app/sidebar.blade.php
git rm resources/views/layouts/auth/card.blade.php
git rm resources/views/layouts/auth/simple.blade.php
git rm resources/views/layouts/auth/split.blade.php
git rm routes/settings.php
```

**Why:** The `Logout` action class is replaced by an inline form in the layout. The three auth layout variants (card/simple/split) are collapsed into a single `auth.blade.php`. The two app layout variants (header/sidebar) are collapsed into a single `app.blade.php`. Settings routes are merged into `routes/web.php`.

**After deleting `Logout.php`**, update `resources/views/pages/settings/delete-user-modal.blade.php`to inline the logout logic — the upstream file injects `Logout` via Livewire method injection (`deleteUser(Logout $logout)`), which breaks once the class is gone. Replace with:

```
-use App\Livewire\Actions\Logout;
 use Illuminate\Support\Facades\Auth;

-    public function deleteUser(Logout $logout): void
+    public function deleteUser(): void
     {
         $this->validate(['password' => $this->currentPasswordRules()]);

-        tap(Auth::user(), $logout(...))->delete();
+        tap(Auth::user(), function ($user) {
+            Auth::logout();
+            $user->delete();
+        });
+
+        request()->session()->invalidate();
+        request()->session()->regenerateToken();

         $this->redirect('/', navigate: true);
     }
```

> **Keep:** `rename_livewire_files.php` and `laravel/chisel` are **not** deleted. Chisel provides optional feature toggling (passkeys, 2FA confirmation) and the rename script adds the `⚡` prefix to Livewire component files on first `composer create-project`. Both are upstream features that belong in the skeleton.

---

### Step 2 — Rename files (preserving git history)

[](#step-2--rename-files-preserving-git-history)

First create the destination directories:

```
mkdir -p resources/views/layouts/partials
mkdir -p resources/views/pages/settings/partials
```

Then rename:

```
git mv resources/views/partials/head.blade.php \
       resources/views/layouts/partials/head.blade.php

git mv resources/views/dashboard.blade.php \
       resources/views/pages/dashboard.blade.php

git mv resources/views/pages/settings/layout.blade.php \
       resources/views/pages/settings/container.blade.php

git mv resources/views/partials/settings-heading.blade.php \
       resources/views/pages/settings/partials/heading.blade.php

git mv resources/views/welcome.blade.php \
       resources/views/pages/welcome.blade.php
```

The last rename (welcome) also requires content changes — covered in Step 5.

---

### Step 3 — Modify small files

[](#step-3--modify-small-files)

#### `.gitignore`

[](#gitignore)

Add one line at the end:

```
+/.claude
```

#### `composer.json`

[](#composerjson)

```
-    "name": "laravel/livewire-starter-kit",
+    "name": "smwks/tallium",
     "type": "project",
-    "description": "The official Laravel starter kit for Livewire.",
+    "description": "A TALL stack starter kit, focus on livewire single file components. AI coding friendly.",
```

```
-        "livewire/livewire": "^4.1"
+        "livewire/livewire": "^4.2"
```

```
     "require-dev": {
         "fakerphp/faker": "^1.24",
+        "laravel/boost": "^2",
         "laravel/pail": "^1.2.5",
         "laravel/pint": "^1.27",
-        "laravel/sail": "^1.53",
         "mockery/mockery": "^1.6",
```

> `laravel/chisel` in `require` and `rename_livewire_files.php` in `post-create-project-cmd`/ `post-update-cmd` scripts are **kept as-is** from upstream.

#### `database/seeders/DatabaseSeeder.php`

[](#databaseseedersdatabaseseederphp)

Add an explicit password so the dev seeder produces a known credential:

```
         User::factory()->create([
             'name' => 'Test User',
             'email' => 'test@example.com',
+            'password' => bcrypt('password'),
         ]);
```

#### `resources/views/components/app-logo-icon.blade.php`

[](#resourcesviewscomponentsapp-logo-iconbladephp)

Replace the hardcoded brand SVG with a dynamic two-letter monogram generated from `config('app.name')`:

```
-
-
-
+
+
+
+    {{ $letters }}
+
```

#### `resources/views/components/app-logo.blade.php`

[](#resourcesviewscomponentsapp-logobladephp)

Remove the `@props`/`@if` toggle. The component is always used in sidebar context now, so always renders `flux:sidebar.brand`. Name comes from `config('app.name')` rather than hardcoded:

```
-@props([
-    'sidebar' => false,
-])
-
-@if($sidebar)
-
-
-
-
-
-@else
-
-
-
-
-
-@endif
+
+
+
+
+
```

#### `resources/views/pages/settings/appearance.blade.php`

[](#resourcesviewspagessettingsappearancebladephp)

Two substitutions — updated include path and component name:

```
-    @include('partials.settings-heading')
+    @include('pages.settings.partials.heading')

     {{ __('Appearance settings') }}

-
+
         ...
-
+
```

#### `resources/views/pages/settings/profile.blade.php`

[](#resourcesviewspagessettingsprofilebladephp)

Same two substitutions:

```
-    @include('partials.settings-heading')
+    @include('pages.settings.partials.heading')

     {{ __('Profile settings') }}

-
+
         ...
-
+
```

#### `resources/views/pages/settings/security.blade.php`

[](#resourcesviewspagessettingssecuritybladephp)

Same two substitutions:

```
-    @include('partials.settings-heading')
+    @include('pages.settings.partials.heading')

     {{ __('Security settings') }}

-
+
         ...
-
+
```

---

### Step 4 — Replace layout files

[](#step-4--replace-layout-files)

#### `resources/views/layouts/auth.blade.php`

[](#resourcesviewslayoutsauthbladephp)

The old file was a one-line shim delegating to a vendor component (`x-layouts::auth.simple`). Replace it with a self-contained HTML document:

```
-
-    {{ $slot }}
-
```

Full replacement content:

```

    @include('layouts.partials.head')

            {{ config('app.name', 'Laravel') }}

            {{ $slot }}

@fluxScripts

```

Note: `@include('layouts.partials.head')` resolves to `resources/views/layouts/partials/head.blade.php`(the renamed partial from Step 2).

#### `resources/views/layouts/app.blade.php`

[](#resourcesviewslayoutsappbladephp)

The old file was a one-line shim delegating to `x-layouts::app.sidebar`. Replace it with a self-contained HTML document. Key additions vs the old vendor sidebar layout:

- `@include('layouts.partials.head')` instead of `@include('partials.head')`
- Lower nav section (commented out placeholder)
- Mobile user dropdown uses inline logout form (no `Logout` action class)
- `@persist('toast')` block with `` so Flux toast notifications work

```
-
-
-        {{ $slot }}
-
-
```

Full replacement content:

```

    @include('layouts.partials.head')

                {{ __('Dashboard') }}

        {{--

            {{ __('Lower Navigation Item') }}

        --}}

                            {{ auth()->user()->name }}
                            {{ auth()->user()->email }}

                    {{ __('Settings') }}

                @csrf

                    {{ __('Log Out') }}

    {{ $slot }}

@persist('toast')

@endpersist

@fluxScripts

```

---

### Step 5 — Modify `resources/views/pages/welcome.blade.php`

[](#step-5--modify-resourcesviewspageswelcomebladephp)

> This file was renamed from `resources/views/welcome.blade.php` in Step 2.

The original file is a self-contained HTML document (DOCTYPE through ``). After the rename, strip the entire HTML wrapper — everything from `` down through and including the `` opening tag — and replace it with ``. Similarly replace the closing `\n` with ``.

The body content (header nav, main SVG artwork, footer) is **unchanged**.

```
-
-
-
-        ...fonts, favicon, inline  block...
-
-
+

             ...

             ...

         @if (Route::has('login'))

         @endif
-
-
+
```

Scripted transformation (Python):

```
with open('resources/views/pages/welcome.blade.php', 'r') as f:
    content = f.read()

body_start = content.find('\n', body_start) + 2
content = '\n' + content[body_end:]
content = content.replace('    \n\n', '\n')

with open('resources/views/pages/welcome.blade.php', 'w') as f:
    f.write(content)
```

---

### Step 6 — Create `resources/views/layouts/guest.blade.php`

[](#step-6--create-resourcesviewslayoutsguestbladephp)

Extract the HTML wrapper that was removed from `welcome.blade.php` (Step 5) and use it as the new guest layout. The wrapper is the HTML document structure including the pre-built inline CSS that the welcome page ships with — it does **not** use `@vite` because the welcome page CSS is pre-built and bundled inline for zero-dependency serving.

```
with open('resources/views/welcome.blade.php', 'r') as f:
    content = f.read()

body_start = content.find('\n', body_start) + 2
header = content[:body_end]

with open('resources/views/layouts/guest.blade.php', 'w') as f:
    f.write(header + '    {{ $slot }}\n\n\n')
```

> **Order matters:** run the script for `guest.blade.php` **before** running the script for `welcome.blade.php`, or keep a copy of the original file. Once the wrapper is stripped from `welcome.blade.php` the source for the inline styles is gone.

The resulting `guest.blade.php` has this shape (CSS block abbreviated):

```

        {{ __('Welcome') }} - {{ config('app.name', 'Laravel') }}

            /* pre-built inline Tailwind CSS — copied verbatim from original welcome.blade.php */

    {{ $slot }}

```

---

### Step 7 — Replace `routes/web.php`

[](#step-7--replace-routeswebphp)

The old file required `routes/settings.php` (deleted in Step 1) and used bare view names. Replace entirely with the consolidated version that uses `pages.*` view names and inlines all settings routes:

```
