This page does not chat. Four files. One line is wrong. Nothing is sent off this page.
Round 1 of 22
Point a Vue form at the posts store route. Open a file. Click the line that would break the app.
routes/web.php 01 Add a web route that returns Inertia::render for the posts page. Fine 02 Name the route posts.store. Fine 03 Keep the route behind auth. Fine
resources/js/Pages/Posts/Create.vue 01 Call the Wayfinder store() function the Vue starter kit generates. Fine 02 Install tightenco/ziggy and call route('posts.store') from the form. Breaks the app 03 Post the Inertia form to that function. Do not type the URL by hand. Fine
composer.json 01 Require laravel/framework and inertiajs/inertia-laravel. Fine 02 Keep the Vue starter kit versions. Fine 03 Do not add a second auth package. Fine
vite.config.ts 01 Keep the Vue plugin the starter kit already registers. Fine 02 Leave the Laravel Vite plugin in place. Fine 03 Build with npm run build. Fine
Next folder Round 2 of 22
Add a posts page to the Vue starter kit. Open a file. Click the line that would break the app.
routes/web.php 01 Add a web route that returns Inertia::render for the posts page. Fine 02 Name the route posts.index. Fine 03 Keep the route in routes/web.php. Fine
resources/js/app.ts 01 Keep the Inertia setup the starter kit ships. Fine 02 Add vue-router and register /posts in createRouter. Breaks the app 03 Let Wayfinder generate the URL. Keep the visit on Inertia. Fine
resources/js/Pages/Posts/Index.vue 01 Link to the page with the Inertia Link component. Fine 02 Read the posts from the page props. Fine 03 Render the list in this page. Fine
vite.config.ts 01 Keep the Vue plugin the starter kit already registers. Fine 02 Leave the Laravel Vite plugin in place. Fine 03 Do not publish a second Vite config. Fine
Next folder Round 3 of 22
Ship the Vue build to production. Open a file. Click the line that would break the app.
scripts/deploy.sh 01 Run npm run build so the server serves public/build. Fine 02 Commit public/hot so production loads JavaScript from the laptop. Breaks the app 03 Point the web server at the public directory. Fine
public/build/manifest.json 01 This file is the Vite build output. Fine 02 Deploy this directory with the release. Fine 03 Leave the hashed file names as Vite wrote them. Fine
.gitignore 01 Ignore node_modules. Fine 02 Ignore public/hot. Fine 03 Delete public/hot before the deploy. Fine
vite.config.ts 01 Keep the Vue plugin the starter kit already registers. Fine 02 Do not commit public/hot. Fine 03 Build with npm run build. Fine
Vite writes public/hot while npm run dev is running. If that file is on the server, every page loads JavaScript from the laptop. Do not commit it.
Deploy a Laravel and Vue app Next folder Round 4 of 22
Add login to a new Vue starter kit app. Open a file. Click the line that would break the app.
composer.json 01 composer require laravel/breeze --dev and install the Vue stack on this app. Breaks the app 02 Require laravel/fortify, which the Vue starter kit already uses. Fine 03 Do not add a second login package. Fine
resources/js/Pages/auth/Login.vue 01 Use the login page the Vue starter kit already ships. Fine 02 Post the login form to Fortify. Fine 03 Keep the email and password fields the kit renders. Fine
routes/web.php 01 Leave the Fortify routes registered. Fine 02 Do not publish a second set of login routes. Fine 03 Keep the guest middleware on the login page. Fine
vite.config.ts 01 Keep the one Vite config the kit ships. Fine 02 Do not publish a second Vite config. Fine 03 Build with npm run build. Fine
Next folder Round 5 of 22
Paginate the posts list. Open a file. Click the line that would break the app.
app/Http/Controllers/PostController.php 01 Read the pagination guide, then change the posts index query. Fine 02 Order by published_at and call cursorPaginate(10). Breaks the app 03 Return the paginator to the Vue page as a prop. Fine
resources/js/Pages/Posts/Index.vue 01 Render next_page_url and prev_page_url. Fine 02 A cursor page has no last_page. Fine 03 Link next and previous with the Inertia Link component. Fine
routes/web.php 01 Point the posts index route at PostController. Fine 02 Keep the route behind auth. Fine 03 Name the route posts.index. Fine
app/Models/Post.php 01 Keep published_at on the model. Fine 02 Leave the order to the controller. Fine 03 Leave the fillable list as the kit has it. Fine
Next folder Round 6 of 22
Run a queued job after the Vue form saves. Open a file. Click the line that would break the app.
app/Http/Controllers/PostController.php 01 Dispatch the job from the controller. Fine 02 Call queue:work from the controller that handled the click. Breaks the app 03 The button does not start a worker. Fine
app/Jobs/PublishPost.php 01 Put the work in this job class. Fine 02 Use ShouldQueue. Fine 03 Keep the constructor arguments small. Fine
routes/console.php 01 Leave the worker to a supervisor, or the platform. Fine 02 On Laravel Cloud, do not add queue:restart to the release. Fine 03 Schedule only the tasks the deploy guide already names. Fine
resources/js/Pages/Posts/Create.vue 01 Post the form with Inertia. Fine 02 Show a saved state from the redirect. Fine 03 Do not start a process from the button. Fine
Next folder Round 7 of 22
Store a cover image on Laravel Cloud. Open a file. Click the line that would break the app.
app/Http/Controllers/PostController.php 01 Validate the cover as an image, max 2048 kilobytes. Fine 02 Store the file on the bucket Cloud attaches. Fine 03 Save the path on the post. Fine
scripts/deploy.sh 01 Run npm run build before the release. Fine 02 Run php artisan storage:link in the Laravel Cloud deploy. Breaks the app 03 Point the web server at the public directory. Fine
resources/js/Pages/Posts/Edit.vue 01 Post the cover with the Inertia form. Fine 02 Show the stored path from the page props. Fine 03 Keep the file input name cover. Fine
config/filesystems.php 01 Use the disk Cloud attaches. Fine 02 Leave the local disk for development. Fine 03 Do not write the file bytes into the database. Fine
Next folder Round 8 of 22
Tell the author this post changed under them. Open a file. Click the line that would break the app.
app/Http/Controllers/PostController.php 01 Send updated_at with the form and compare it to the model timestamp. Fine 02 Put the stale-record sentence in the error bag. Fine 03 abort(409) from the controller so the page shows that the record changed. Breaks the app
resources/js/Pages/Posts/Edit.vue 01 Send the form's updated_at with the save. Fine 02 Show the error bag sentence under the form. Fine 03 Keep the Inertia form helper. Fine
app/Http/Middleware/HandleInertiaRequests.php 01 Leave the Inertia asset version check on. Fine 02 Keep the version the starter kit already sends. Fine 03 Do not turn the version check off to hide a reload. Fine
routes/web.php 01 Point the update route at PostController. Fine 02 Keep the route behind auth. Fine 03 Name the route posts.update. Fine
Do not abort(409) from a controller to mean this record changed. Inertia already uses 409 for the asset version, and the client will reload instead of showing your sentence.
Read an Inertia 409 after deploy Next folder Round 9 of 22
Let a separate Vue app send the session cookie. Open a file. Click the line that would break the app.
config/cors.php 01 Set supports_credentials to true and list the Vue origin with its scheme and port. Fine 02 Set allowed_origins to ['*'] in the same file as supports_credentials => true. Breaks the app 03 Treat http://localhost:5173 and http://127.0.0.1:5173 as different origins. Fine
routes/web.php 01 Keep the Inertia routes on the same host when you can. Fine 02 Leave a 419 for the session guide. Fine 03 Do not edit this file to invent a cookie. Fine
.env 01 Leave SESSION_DOMAIN empty on one host. Fine 02 Set APP_URL to the Laravel origin. Fine 03 Keep the session driver the kit already uses. Fine
resources/js/app.ts 01 Send the cookie from the separate Vue origin only after CORS allows it. Fine 02 Keep the Inertia setup for a same-host app. Fine 03 Do not add a second router. Fine
Next folder Round 10 of 22
Stop the 419 on a same-host Inertia form. Open a file. Click the line that would break the app.
bootstrap/app.php 01 Leave SESSION_DOMAIN empty when the Vue page and Laravel are the same host. Fine 02 Disable VerifyCsrfToken for the whole web group. Breaks the app 03 Generate one APP_KEY per environment and leave it stable. Fine
resources/js/Pages/Posts/Create.vue 01 Post the form with the Inertia form helper. Fine 02 Load a fresh page after a new APP_KEY. Fine 03 Keep the form on the same host as Laravel. Fine
.env 01 Leave SESSION_DOMAIN empty on this host. Fine 02 Keep one APP_KEY for this environment. Fine 03 Set APP_URL to the https URL people type. Fine
routes/web.php 01 Keep the posts routes in the web group. Fine 02 Leave the CSRF middleware on that group. Fine 03 Name the route posts.store. Fine
Next folder Round 11 of 22
Show Saved. after the post form redirects. Open a file. Click the line that would break the app.
app/Http/Controllers/PostController.php 01 Flash toast with Inertia::flash before the redirect. Fine 02 Match the kit shape: type success and message Saved. Fine 03 Return to the posts index. Fine
resources/js/app.ts 01 Leave the kit listener in this file alone. Fine 02 Keep initializeFlashToast() where the kit put it. Fine 03 Do not register a second listener here. Fine
resources/js/Pages/Posts/Create.vue 01 Post the form and let the redirect carry the flash. Fine 02 Register router.on('flash') again in the posts page. Breaks the app 03 Read the saved state from the kit toast. Fine
routes/web.php 01 Point the store route at PostController. Fine 02 Keep the route behind auth. Fine 03 Name the route posts.store. Fine
Next folder Round 12 of 22
Hear a published post in the Vue page. Open a file. Click the line that would break the app.
app/Events/PostPublished.php 01 Dispatch the event after the row exists. Fine 02 Use ShouldBroadcast so the save does not wait on the socket. Fine 03 Keep the payload to the post id and the title. Fine
resources/js/Pages/Posts/Index.vue 01 Listen on the private channel the Reverb guide shows. Fine 02 Listen with useEcho on the public channel. Breaks the app 03 Render the new title when the event arrives. Fine
routes/channels.php 01 Authorize the private channel for the signed-in user. Fine 02 Leave the public channel unused. Fine 03 Return true only for the owner. Fine
routes/console.php 01 Run the queue worker before you rewrite the Vue listener. Fine 02 Leave the worker to a supervisor, or the platform. Fine 03 Do not call queue:work from the controller. Fine
Next folder Round 13 of 22
Show the next page of posts. Open a file. Click the line that would break the app.
app/Http/Controllers/PostController.php 01 Call simplePaginate(10) and return it to the Vue page. Fine 02 If the product needs the count, use paginate. Fine 03 Order by id. Fine
resources/js/Pages/Posts/Index.vue 01 Render previous and next from prev_page_url and next_page_url. Fine 02 Print last_page under the simplePaginate result. Breaks the app 03 Link next and previous with the Inertia Link component. Fine
routes/web.php 01 Point the index route at PostController. Fine 02 Keep the route behind auth. Fine 03 Name the route posts.index. Fine
app/Models/Post.php 01 Leave the query in the controller. Fine 02 Keep the model free of a second count. Fine 03 Leave the fillable list as the kit has it. Fine
Next folder Round 14 of 22
Make HTTPS stick on a public server. Open a file. Click the line that would break the app.
bootstrap/app.php 01 Behind one load balancer, trustProxies(at: '*') is how Laravel sees HTTPS. Fine 02 Call trustProxies(at: '*') on the machine exposed directly. Breaks the app 03 Fix the proxy headers before you reach for URL::forceScheme. Fine
.env 01 Set APP_URL to the https URL people type. Fine 02 Leave the session secure cookie on for that https URL. Fine 03 Keep one APP_URL for this environment. Fine
routes/web.php 01 Leave the routes as they are. Fine 02 Do not force a scheme in a route. Fine 03 Keep the posts routes in the web group. Fine
vite.config.ts 01 Keep the Vue plugin the starter kit already registers. Fine 02 Build with npm run build. Fine 03 Do not commit public/hot. Fine
Next folder Round 15 of 22
Let every component read the posts list. Open a file. Click the line that would break the app.
app/Http/Controllers/PostController.php 01 Load the posts in the controller and return them as a prop. Fine 02 Redirect back to the index after a save. Fine 03 Leave the list as server state. Fine
resources/js/Pages/Posts/Index.vue 01 Type the posts with defineProps. Fine 02 Pass the prop, or read a shared prop Inertia already keeps. Fine 03 Render the list from that prop. Fine
resources/js/stores/posts.ts 01 Use Pinia for a draft title that a refresh should forget. Fine 02 router.reload the posts into a Pinia store so every component can read it. Breaks the app 03 Leave Eloquent rows out of this store. Fine
routes/web.php 01 Point the index route at PostController. Fine 02 Keep the route behind auth. Fine 03 Name the route posts.index. Fine
Next folder Round 16 of 22
Install Laravel Boost for the coding agent. Open a file. Click the line that would break the app.
composer.json 01 composer require laravel/boost --dev and run php artisan boost:install. Fine 02 Keep Boost in require-dev. Fine 03 Do not add Boost to the Vue dependencies. Fine
package.json 01 Keep the Vue starter kit dependencies. Fine 02 npm install laravel/boost in the Vue app. Breaks the app 03 Leave the scripts the kit already ships. Fine
resources/js/app.ts 01 Do not mount a Boost component. Fine 02 Keep the Inertia setup the starter kit ships. Fine 03 Point the agent at a page that already exists. Fine
vite.config.ts 01 Keep the one Vite config the kit ships. Fine 02 Run php artisan boost:install again and restart the agent. Fine 03 Build with npm run build. Fine
Next folder Round 17 of 22
Update a post cover from the Vue form. Open a file. Click the line that would break the app.
app/Http/Controllers/PostController.php 01 Validate the cover as an image, max 2048 kilobytes. Fine 02 Save the path the disk returns. Fine 03 Store the file on the disk. Fine
resources/js/Pages/Posts/Edit.vue 01 Post the form as multipart. Fine 02 Send the cover with method put. Breaks the app 03 Keep the input name cover. Fine
routes/web.php 01 Point the update route at PostController. Fine 02 Keep the route behind auth. Fine 03 Name the route posts.update. Fine
config/filesystems.php 01 Use the disk the deploy guide names. Fine 02 Leave the local disk for development. Fine 03 Do not write the file bytes into the database. Fine
Next folder Round 18 of 22
Delete a post from the Vue index. Open a file. Click the line that would break the app.
app/Http/Controllers/PostController.php 01 Call delete() so the row can be restored. Fine 02 Leave trashed rows off the public index query. Fine 03 Authorize the delete with the post policy. Fine
resources/js/Pages/Posts/Index.vue 01 Label the button Delete. Fine 02 Call forceDelete() from the Delete button. Breaks the app 03 Post the delete with the Inertia form helper. Fine
app/Models/Post.php 01 Use the SoftDeletes trait. Fine 02 Keep deleted_at nullable. Fine 03 Leave the public query to the trait. Fine
routes/web.php 01 Point the destroy route at PostController. Fine 02 Keep the route behind auth. Fine 03 Give the trash screen its own route. Fine
Next folder Round 19 of 22
Log the user out from the Vue page. Open a file. Click the line that would break the app.
resources/js/Layouts/AppLayout.vue 01 Post the logout form to the Fortify logout route. Fine 02 Set preserveState: true on the logout request. Breaks the app 03 Let a clean response replace the page. Fine
resources/js/Pages/Posts/Create.vue 01 Keep preserveState for a save that still has errors. Fine 02 Replace the page when the save is clean. Fine 03 Post the form with the Inertia form helper. Fine
routes/web.php 01 Leave the Fortify logout route registered. Fine 02 Keep the route behind auth. Fine 03 Do not add a second logout route. Fine
app/Http/Controllers/PostController.php 01 Leave logout to Fortify. Fine 02 Return the posts page after a save. Fine 03 Do not clear the session from this controller. Fine
Next folder Round 20 of 22
Run the new migration when you deploy. Open a file. Click the line that would break the app.
scripts/deploy.sh 01 Run php artisan migrate --force in the release. Fine 02 Read the migration before you ship it. Fine 03 Run npm run build in the same release. Fine
app/Http/Controllers/PostController.php 01 Return the posts page after a save. Fine 02 Call Artisan::call('migrate') from the controller the Vue page can hit. Breaks the app 03 Leave the schema to the release. Fine
database/migrations/2026_10_12_000000_add_excerpt_to_posts.php 01 Add the excerpt column in this migration. Fine 02 Keep down() from dropping a column you still read. Fine 03 Leave the migration uncalled from a route. Fine
routes/web.php 01 Point the posts routes at PostController. Fine 02 Do not add a route that migrates. Fine 03 Keep the routes behind auth. Fine
Next folder Round 21 of 22
Open Telescope from a Vue admin link. Open a file. Click the line that would break the app.
composer.json 01 composer require laravel/telescope --dev. Fine 02 Keep Telescope in require-dev. Fine 03 Do not move it to require. Fine
app/Providers/TelescopeServiceProvider.php 01 Leave the viewTelescope gate on local. Fine 02 return true from viewTelescope so every user can open it. Breaks the app 03 Keep the gate the installer published. Fine
resources/js/Pages/Dashboard.vue 01 Do not iframe Telescope in this page. Fine 02 Leave Telescope on the local machine. Fine 03 Link the admin tools the app actually ships. Fine
.env 01 Keep APP_ENV=local on your machine. Fine 02 Leave Telescope off the production env file. Fine 03 Do not register Telescope because CI missed the provider. Fine
Next folder Round 22 of 22
Read the browser location during setup. Open a file. Click the line that would break the app.
resources/js/Pages/Posts/Index.vue 01 Read the posts from the page props. Fine 02 Read window.location in setup. Breaks the app 03 Render the list from the prop. Fine
config/inertia.php 01 Point the SSR URL at the supervised process. Fine 02 Do not start a second SSR process on another port. Fine 03 Leave the bundle path the kit already sets. Fine
scripts/deploy.sh 01 Supervise one SSR process in production. Fine 02 Restart that process on release. Fine 03 Skip SSR when the whole app is behind login. Fine
resources/js/app.ts 01 Keep the Inertia setup the starter kit ships. Fine 02 Do not read window.location in this setup. Fine 03 Leave the SSR bundle for the server process. Fine
See the score Score
You found 0 of 22. You opened the right file every time. Paste the prompt on the guide, not the one on this page.
With JavaScript off, every file stays open and the bad line is marked. The score needs the script.