json(['status' => 'ok', 'timestamp' => now()->toISOString()]); }); Route::view('/', 'welcome'); Route::get('dashboard', function () { // Redirect to first workspace or fall back to static view $user = auth()->user(); $workspace = $user->workspaces()->first(); if ($workspace) { return redirect()->route('w.dashboard', $workspace->ulid); } return view('dashboard'); })->middleware(['auth', 'verified'])->name('dashboard'); Route::get('profile', fn () => redirect()->route('profile.personal'))->middleware(['auth'])->name('profile'); Route::middleware(['auth'])->group(function () { Route::get('/profile/personal', PersonalInfo::class)->name('profile.personal'); Route::get('/profile/preferences', Preferences::class)->name('profile.preferences'); Route::get('/profile/security', Security::class)->name('profile.security'); }); // Workspace-scoped routes — placed before slug catch-all Route::middleware(['auth', 'verified', ResolveWorkspace::class]) ->prefix('w/{workspace}') ->name('w.') ->group(function () { Route::get('/', Overview::class)->name('dashboard'); Route::get('/links', Index::class)->name('links.index'); Route::get('/qr', App\Livewire\Pages\QrCodes\Index::class)->name('qr.index'); Route::get('/bio', App\Livewire\Pages\Bio\Index::class)->name('bio.index'); Route::get('/analytics', App\Livewire\Pages\Analytics\Index::class)->name('analytics.index'); Route::get('/domains', App\Livewire\Pages\Domains\Index::class)->name('domains.index'); Route::get('/settings', App\Livewire\Pages\Settings\Index::class)->name('settings.index'); Route::get('/settings/api-tokens', ApiTokens::class)->name('settings.api-tokens'); Route::get('/settings/webhooks', Webhooks::class)->name('settings.webhooks'); Route::get('/billing', App\Livewire\Pages\Billing\Index::class)->name('billing.index'); Route::get('/team', Members::class)->name('team.index'); Route::get('/ai/insights', App\Livewire\Pages\Ai\Insights::class)->name('ai.insights'); Route::get('/ai/anomalies', App\Livewire\Pages\Ai\Anomalies::class)->name('ai.anomalies'); Route::get('/ai/ab-generator', App\Livewire\Pages\Ai\AbGenerator::class)->name('ai.ab-generator'); }); // Bio page route — must be before the slug catch-all Route::get('/bio/{slug}', [BioPageController::class, 'show'])->name('bio.public'); require __DIR__.'/auth.php'; // Redirect service — catch-all, must be last Route::get('/{slug}', RedirectController::class) ->where('slug', '[a-zA-Z0-9_-]+') ->name('redirect');