> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Laravel Chisel — een bibliotheek voor post-installatiescripts van starter kits

> Een introductie van laravel/chisel: een pakket dat primitieven biedt voor post-installatiescripts om overbodige functies uit starter kits te verwijderen. Uitgebracht als v0.1 in mei 2026.

<Info>
  Dit artikel is gebaseerd op onderzoek van de broncode. Het is een pakket in een vroeg ontwikkelstadium dat net het v0.1-label heeft gekregen (stand: mei 2026).
</Info>

## Wat is Laravel Chisel?

[Laravel Chisel](https://github.com/laravel/chisel) is een pakket dat primitieven biedt voor het bouwen van **post-installatiescripts** waarmee je overbodige functies uit Laravel starter kits verwijdert.

Starter kits bevatten veel functionaliteit out of the box, maar afhankelijk van het project heb je een deel daarvan niet nodig. Chisel lost dit op met een mechanisme waarmee je na de installatie interactief "alleen de functies behoudt die je nodig hebt".

```mermaid theme={null}
graph TD
    A["Project aanmaken met laravel new"] --> B["Installatie van de starter kit"]
    B --> C["Uitvoeren van het chisel.php-script"]
    C --> D{"Vragen aan de gebruiker<br>(multiselect)"}
    D --> E["Op basis van de keuzes<br>overbodige bestanden verwijderen/bewerken"]
    E --> F["Uiteindelijke projectstructuur"]
```

## Waarom is dit nodig?

Laravel starter kits bundelen veel functionaliteit, maar niet elk project heeft alles nodig. Bijvoorbeeld:

* Projecten die geen e-mailverificatie nodig hebben
* Projecten die geen passkey-authenticatie gebruiken
* Configuraties waarin bepaalde Livewire-componenten overbodig zijn

Voorheen moest je overbodige functies handmatig verwijderen, maar met Chisel **rond je de aanpassingen af via interactieve prompts tijdens de installatie**.

## Het chisel.php-script definiëren

Een starter kit die Chisel gebruikt, plaatst een `chisel.php`-bestand in de projectroot. Dit bestand definieert welke functies optioneel zijn.

```php theme={null}
<?php

require getenv('LARAVEL_INSTALLER_AUTOLOADER');

use Laravel\Chisel\Chisel;
use Laravel\Chisel\Question;

return Chisel::script(dirname(__DIR__))
    ->questions([
        Question::multiselect(
            name: 'auth_features',
            label: 'Which authentication features would you like to enable?',
            options: [
                'email-verification' => 'Email verification',
            ],
            hint: 'Use space to select, enter to confirm.',
        ),
    ])
    ->selected('auth_features', 'email-verification',
        then: function (Chisel $c) {
            // Indien geselecteerd: sectiemarkeringen verwijderen en de code behouden
            $c->files(
                'resources/js/pages/settings/profile.tsx',
                'app/Providers/FortifyServiceProvider.php',
            )->removeSectionMarkers('email-verification');
        },
        else: function (Chisel $c) {
            // Indien niet geselecteerd: gerelateerde bestanden en functies verwijderen
            $c->php('app/Models/User.php')
                ->removeImport('Illuminate\Contracts\Auth\MustVerifyEmail')
                ->removeInterface('MustVerifyEmail');

            $c->file('config/fortify.php')->removeLinesContaining('Features::emailVerification()');

            $c->files(
                'app/Providers/FortifyServiceProvider.php',
                'resources/js/pages/settings/profile.tsx',
            )->removeSection('email-verification');

            $c->files(
                'resources/js/components/email-verification-notice.tsx',
                'resources/js/pages/auth/verify-email.tsx',
                'tests/Feature/Auth/EmailVerificationTest.php',
                'tests/Feature/Auth/VerificationNotificationTest.php',
            )->delete();
        },
    );
```

## Methoden voor scriptdefinitie

| Methode                                    | Beschrijving                                       |
| ------------------------------------------ | -------------------------------------------------- |
| `Chisel::script($directory)`               | Maakt een scriptdefinitie aan                      |
| `Question::multiselect(...)`               | Definieert een meerkeuzevraag                      |
| `questions([...])`                         | Stelt de vragen van het script in                  |
| `questions()`                              | Haalt de geregistreerde vragen op                  |
| `collectAnswers()`                         | Start het verzamelen van antwoorden op de vragen   |
| `apply($callback)`                         | Registreert een onvoorwaardelijke mutatiestap      |
| `selected($key, $value, then:, else:)`     | Vertakt op één geselecteerde waarde                |
| `selectedAny($key, $values, then:, else:)` | Vertakt wanneer een van de waarden is geselecteerd |
| `selectedAll($key, $values, then:, else:)` | Vertakt wanneer alle waarden zijn geselecteerd     |
| `chisel($answers)`                         | Voert de geregistreerde mutaties uit               |

## Interactief antwoorden verzamelen

`collectAnswers()` retourneert een antwoordverzamelaar. Alle methoden zijn fluent en kunnen in willekeurige volgorde worden aangeroepen. In niet-interactieve omgevingen worden automatisch de standaardwaarden gebruikt.

Een extern Artisan-commando toont de prompts met [Laravel Prompts](https://laravel.com/docs/prompts) en geeft de antwoorden door aan Chisel.

```php theme={null}
use Illuminate\Console\Command;
use Laravel\Chisel\Chisel;
use Laravel\Chisel\Question;
use RuntimeException;

use function Laravel\Prompts\multiselect;

class InstallFeatures extends Command
{
    protected $signature = 'install:features
        {--answers= : JSON string of answers to skip interactive prompts}';

    public function handle(): void
    {
        $script = require base_path('chisel.php');

        $providedAnswers = $this->option('answers') === null
            ? []
            : json_decode((string) $this->option('answers'), true, 512, JSON_THROW_ON_ERROR);

        $answers = $script
            ->collectAnswers()
            ->onQuestion(fn (Question $question) => match ($question->type) {
                'multiselect' => multiselect(
                    label: $question->label,
                    options: $question->options,
                    default: $question->default ?? [],
                    required: $question->required,
                    hint: $question->hint,
                ),
                default => throw new RuntimeException("Unsupported question type [{$question->type}]."),
            })
            ->interactive($this->input->isInteractive())
            ->withAnswers($providedAnswers);

        $script->chisel($answers);

        $chisel = Chisel::in(base_path());

        $chisel->npm()->install();
        $chisel->npm()->run('build');
    }
}
```

| Methode                     | Beschrijving                                                  |
| --------------------------- | ------------------------------------------------------------- |
| `onQuestion($callback)`     | Stelt de handler voor de vraagprompt in                       |
| `interactive($interactive)` | Stelt de interactieve modus in                                |
| `withAnswers($answers)`     | Levert vooraf verzamelde antwoorden aan en slaat prompts over |

## Bestandsmutaties

Met `file($path)` richt je je op één bestand, met `files(...$paths)` op meerdere bestanden.

| Methode                           | Beschrijving                                          |
| --------------------------------- | ----------------------------------------------------- |
| `replace($search, $replace)`      | Vervangt een string                                   |
| `removeLinesContaining($content)` | Verwijdert regels die de opgegeven string bevatten    |
| `removeSectionMarkers($tag)`      | Verwijdert de sectiemarkeringen en behoudt de inhoud  |
| `removeSection($tag)`             | Verwijdert de sectiemarkeringen én de inhoud ertussen |
| `delete()`                        | Verwijdert het doelbestand                            |

## Bewerken op basis van de PHP-AST

`php($path)` biedt bewerkingen via de PHP-AST. De wijzigingen worden automatisch opgeslagen wanneer het object wordt vernietigd.

De basis van de PHP-AST (abstract syntax tree) en het gebruik van `nikic/php-parser` worden [hier](/nl/advanced/php-ast) uitgelegd.

| Methode                       | Beschrijving                                        |
| ----------------------------- | --------------------------------------------------- |
| `removeImport($class)`        | Verwijdert een `use`-statement                      |
| `removeTrait($trait)`         | Verwijdert het gebruik van een trait uit een klasse |
| `removeInterface($interface)` | Verwijdert een geïmplementeerde interface           |

## Section markers

Je omsluit optionele code met een paar commentaren.

```php theme={null}
/* @chisel-passkeys */
Fortify::authenticateUsingPasskeys();
/* @end-chisel-passkeys */
```

In JSX-bestanden gebruik je blokcommentaren met accolades (`{}`).

```tsx theme={null}
{
    /* @chisel-passkeys */
}
<PasskeyButton />;
{
    /* @end-chisel-passkeys */
}
```

* `removeSectionMarkers('passkeys')` — verwijdert de markeringen, de code blijft staan
* `removeSection('passkeys')` — verwijdert zowel de markeringen als de code

De prefix `chisel-` wordt automatisch toegevoegd.

```mermaid theme={null}
graph LR
    A["/* @chisel-feature */<br>code<br>/* @end-chisel-feature */"] --> B{"Selecteert de gebruiker<br>feature?"}
    B -->|removeSectionMarkers| C["Alleen de code behouden<br>(markeringen verwijderen)"]
    B -->|removeSection| D["Markeringen én code<br>allemaal verwijderen"]
```

## npm-ondersteuning

| Methode                              | Beschrijving                                                  |
| ------------------------------------ | ------------------------------------------------------------- |
| `npm()->install()`                   | Installeert dependencies met de gedetecteerde pakketbeheerder |
| `npm()->run($script, ...$arguments)` | Voert een script van de pakketbeheerder uit                   |
| `npm()->remove(...$packages)`        | Verwijdert pakketten met de gedetecteerde pakketbeheerder     |

De methode `npm()` detecteert automatisch npm, yarn, pnpm en bun.

## Huidige ontwikkelstatus

* **GitHub-repository**: [laravel/chisel](https://github.com/laravel/chisel)
* **Release**: v0.1 (uitgebracht in mei 2026)
* **Ontwikkelperiode**: gepubliceerd na drie maanden besloten ontwikkeling

Chisel is geen pakket dat eindgebruikers rechtstreeks in hun Laravel-app installeren, maar **een bibliotheek die starter kits intern gebruiken**. De verwachting is dat de officiële Laravel starter kits in de toekomst post-installatiescripts op basis van Chisel gaan aanbieden.

<Card title="laravel/chisel repository" icon="github" href="https://github.com/laravel/chisel">
  De broncode en de nieuwste API-referentie vind je hier.
</Card>

<Card title="Officiële documentatie van Laravel starter kits" icon="book-open" href="https://laravel.com/docs/starter-kits">
  Raadpleeg de officiële documentatie voor het gebruik van de starter kits zelf.
</Card>


## Related topics

- [Een Laravel starter kit maken](/nl/advanced/starter-kit-creation.md)
- [Starter kits](/nl/starter-kits.md)
- [Laravel Maestro — de orchestrator voor starter kit-ontwikkeling](/nl/blog/maestro-introduction.md)
- [Laravel Fortify en de starter kits](/nl/advanced/fortify.md)
- [Laravel Console Starter](/nl/packages/laravel-console-starter/index.md)
