Documentation for Jetty

Laravel Integration Guide

Overview

Jetty is the perfect companion for Laravel development, designed specifically with PHP developers in mind. Share your local Laravel app with teammates, test webhooks from services like Stripe or GitHub, or demo work-in-progress features to clients—all without deploying to staging.

Why Jetty + Laravel?

  • Auto-detection: Jetty automatically discovers your Laravel installation and artisan command
  • Zero configuration: Works out-of-the-box with Valet, Herd, Sail, and standard Laravel setups
  • Native PHP: Built with PHP, integrates seamlessly with Composer workflows
  • Persistent URLs: Reserve subdomains for stable webhook endpoints across sessions
  • Request inspection: View every incoming request in real-time through the dashboard

Prerequisites

Before you begin, ensure you have:

  • Laravel 8+ (works with 9, 10, 11)
  • PHP 8.0+ installed locally
  • Composer for package management
  • Jetty CLI installed (see installation below)
  • API token from usejetty.online

Quick Start

Get your Laravel app online in under 2 minutes:

1. Install Jetty CLI

# Global Composer installation (recommended)
composer global require jetty/client

# Or install via curl
curl -fsSL https://usejetty.online/install/jetty.sh | bash

2. Authenticate

# Set your API token from the dashboard
jetty auth YOUR_API_TOKEN_HERE

3. Share Your Laravel App

# From your Laravel project directory
cd ~/projects/my-laravel-app

# Start sharing (auto-detects Laravel)
jetty share

# Or specify the local site explicitly
jetty share --site=my-app.test

That's it! Your app is now accessible at a public URL like https://eager-otter.tunnels.usejetty.online.

Auto-Detection

Jetty intelligently detects Laravel applications and configures itself automatically.

What Jetty detects:

  1. Laravel installation: Checks for artisan file in project root
  2. Adjacent artisan: Walks up directory tree to find Laravel root
  3. Local server: Detects Valet/Herd domains or localhost ports
  4. Working directory: Uses JETTY_SHARE_INVOCATION_CWD for context-aware detection

Detection examples:

# From Laravel root - auto-detects everything
cd ~/sites/my-laravel-app
jetty share

# From subdirectory - finds Laravel root automatically
cd ~/sites/my-laravel-app/app/Http/Controllers
jetty share  # Still works! Walks up to find artisan

# Explicit site override
jetty share --site=localhost:8000

Manual override when needed:

# Specify exact local URL
jetty share --site=my-app.test

# Use custom port
jetty share --site=localhost:8080

# Docker/Sail setup
jetty share --site=localhost:80

Common Workflows

Local Development

With Laravel Valet:

# Link your app in Valet
cd ~/sites/my-laravel-app
valet link my-app

# Share it with Jetty (port 443 for HTTPS)
jetty share --site=my-app.test

# Or let Jetty detect Valet domain
jetty share

With Laravel Herd:

# Herd automatically serves apps from ~/Herd
cd ~/Herd/my-laravel-app

# Share via Jetty
jetty share --site=my-laravel-app.test

With php artisan serve:

# Start Laravel's built-in server
php artisan serve --port=8000

# In another terminal, share it
jetty share --site=localhost:8000

Webhook Testing

Stripe Webhooks (Laravel Cashier)

Perfect for testing subscription webhooks locally:

# 1. Start your Laravel app
cd ~/sites/laravel-saas
jetty share --subdomain=laravel-saas-dev

# 2. Copy the public URL
# Example: https://laravel-saas-dev.tunnels.usejetty.online

# 3. Configure Stripe webhook endpoint
# Dashboard: https://dashboard.stripe.com/webhooks
# Endpoint URL: https://laravel-saas-dev.tunnels.usejetty.online/stripe/webhook

# 4. Test locally
stripe trigger payment_intent.succeeded

Update your .env:

STRIPE_WEBHOOK_SECRET=whsec_your_signing_secret_here
APP_URL=https://laravel-saas-dev.tunnels.usejetty.online

GitHub Webhooks

Test CI/CD webhooks locally:

# Share with reserved subdomain
jetty share --subdomain=laravel-ci-dev

# Configure GitHub webhook
# Repo → Settings → Webhooks → Add webhook
# URL: https://laravel-ci-dev.tunnels.usejetty.online/webhooks/github
# Content type: application/json
# Events: Push, Pull Request

# Your Laravel controller will receive webhooks

Laravel route:

// routes/web.php
Route::post('/webhooks/github', [WebhookController::class, 'github']);

Twilio Webhooks (SMS Apps)

Test SMS/voice webhooks:

# Share with stable subdomain
jetty share --subdomain=laravel-sms

# Configure Twilio phone number
# Phone Numbers → Active Numbers → Select number
# Voice: https://laravel-sms.tunnels.usejetty.online/twilio/voice
# Messaging: https://laravel-sms.tunnels.usejetty.online/twilio/sms

Team Development

Share your local Laravel app with remote teammates:

# Developer A shares feature branch
cd ~/sites/my-laravel-app
git checkout feature/new-ui
jetty share --subdomain=team-new-ui

# Share URL with team: https://team-new-ui.tunnels.usejetty.online
# Teammates can test the feature without deploying

Pro tip: Use descriptive subdomains for different features:

jetty share --subdomain=team-admin-panel
jetty share --subdomain=team-api-v2
jetty share --subdomain=team-checkout-flow

API Development

Share your Laravel API with frontend developers or mobile apps:

# Start API with reserved subdomain
cd ~/sites/laravel-api
jetty share --subdomain=api-dev

# Frontend devs use: https://api-dev.tunnels.usejetty.online/api
# Mobile apps point to same URL during development

Update API configuration:

APP_URL=https://api-dev.tunnels.usejetty.online
SANCTUM_STATEFUL_DOMAINS=api-dev.tunnels.usejetty.online
SESSION_DOMAIN=.tunnels.usejetty.online

Valet / Herd Integration

Laravel Valet and Herd serve sites over HTTPS (port 443) with self-signed certificates. Jetty handles this automatically.

Valet Setup

# 1. Park or link your Laravel app
cd ~/sites
valet park

# Or link individual app
cd ~/sites/my-laravel-app
valet link my-app

# 2. Verify Valet is serving the site
valet links
curl https://my-app.test  # Should work

# 3. Share via Jetty
jetty share --site=my-app.test

# Jetty automatically skips SSL verification for port 443

Herd Setup

# 1. Apps in ~/Herd are automatically served
cd ~/Herd/my-laravel-app

# 2. Verify Herd domain
open https://my-laravel-app.test

# 3. Share via Jetty
jetty share --site=my-laravel-app.test

# Or let auto-detection handle it
jetty share

HTTPS Considerations

Jetty automatically disables SSL verification when forwarding to localhost:443 or .test:443 domains because local development uses self-signed certificates. This is intentional and secure for local tunneling.

What happens under the hood:

  • Public internet → Jetty Edge (valid SSL)
  • Jetty Edge → Your machine (WebSocket, encrypted)
  • Jetty CLI → Local Laravel (skips SSL verification for self-signed certs)

Laravel Sail Integration

Laravel Sail runs your app in Docker containers. Jetty can tunnel to Dockerized apps.

Basic Sail Setup

# 1. Start Sail
cd ~/sites/my-laravel-app
./vendor/bin/sail up -d

# 2. Share the Docker container's port
jetty share --site=localhost:80

# Jetty forwards to port 80 where Sail's nginx listens

Using host.docker.internal

For more complex setups, you might need to access services from within containers:

# Share your local Laravel app
jetty share --subdomain=laravel-sail

# Inside Sail container, services can reach your tunnel at:
# https://laravel-sail.tunnels.usejetty.online

Sail with Custom Ports

If Sail is configured for non-standard ports:

# Check docker-compose.yml for APP_PORT
# Example: APP_PORT=8080

# Share custom port
jetty share --site=localhost:8080

Multiple Sail Projects

Run multiple Laravel Sail projects simultaneously:

# Project A on default port 80
cd ~/sites/project-a
./vendor/bin/sail up -d
jetty share --site=localhost:80 --subdomain=project-a

# Project B on custom port 8081
cd ~/sites/project-b
APP_PORT=8081 ./vendor/bin/sail up -d
jetty share --site=localhost:8081 --subdomain=project-b

Environment Configuration

Best practices for configuring Laravel's .env when using Jetty.

Essential Settings

# Set APP_URL to your tunnel URL
APP_URL=https://your-subdomain.tunnels.usejetty.online

# Update session domain for cross-subdomain cookies (if needed)
SESSION_DOMAIN=.tunnels.usejetty.online

# Sanctum stateful domains (for API auth)
SANCTUM_STATEFUL_DOMAINS=your-subdomain.tunnels.usejetty.online

# Asset URL (usually matches APP_URL)
ASSET_URL=https://your-subdomain.tunnels.usejetty.online

Dynamic Configuration

For flexibility, use a separate .env.jetty or conditional logic:

// config/app.php
'url' => env('APP_URL', 'http://localhost'),

// Or dynamically detect tunnel
'url' => isset($_SERVER['HTTP_X_FORWARDED_HOST']) 
    ? 'https://' . $_SERVER['HTTP_X_FORWARDED_HOST']
    : env('APP_URL', 'http://localhost'),

Trusted Proxies

Configure Laravel to trust Jetty's forwarded headers:

// app/Http/Middleware/TrustProxies.php
protected $proxies = '*';  // Trust all proxies for tunnel traffic

protected $headers = 
    Request::HEADER_X_FORWARDED_FOR |
    Request::HEADER_X_FORWARDED_HOST |
    Request::HEADER_X_FORWARDED_PORT |
    Request::HEADER_X_FORWARDED_PROTO;

Jetty automatically adds X-Forwarded-* headers so Laravel knows the original request details.

CSRF Protection

CSRF tokens work seamlessly with Jetty tunnels. No special configuration needed if APP_URL is set correctly.

If you encounter CSRF issues:

// app/Http/Middleware/VerifyCsrfToken.php
protected $except = [
    'webhooks/*',  // Exclude webhook routes
];

Queue Workers

Running Queues with Tunnels

Queue workers run in the background and are not affected by Jetty tunnels. However, queued jobs that generate URLs need proper configuration:

// Queue job generating a URL
use Illuminate\Support\Facades\URL;

class SendWelcomeEmail {
    public function handle() {
        $url = URL::to('/welcome');
        // Will use APP_URL from .env
    }
}

Ensure APP_URL is set:

APP_URL=https://your-subdomain.tunnels.usejetty.online

Horizon Dashboard

Share Horizon dashboard with your team:

# Start Horizon
php artisan horizon

# Share your app
jetty share --subdomain=laravel-horizon

# Access Horizon at: https://laravel-horizon.tunnels.usejetty.online/horizon

Testing Queue-Based Webhooks

Many webhooks trigger jobs that process asynchronously:

// Webhook controller
public function stripeWebhook(Request $request) {
    ProcessStripeWebhook::dispatch($request->all());
    return response('Webhook received', 200);
}

// Job
class ProcessStripeWebhook {
    public function handle() {
        // Processes webhook data
        // Can make callbacks to external services via tunnel
    }
}

Testing External Services

Stripe Integration

Complete workflow for testing Stripe in Laravel Cashier apps:

# 1. Share your app with reserved subdomain
jetty share --subdomain=laravel-cashier-dev

# 2. Configure Stripe CLI (optional, for local testing)
stripe listen --forward-to localhost:8000/stripe/webhook

Configure webhook in Stripe Dashboard:

URL: https://laravel-cashier-dev.tunnels.usejetty.online/stripe/webhook
Events: customer.subscription.created, customer.subscription.updated, invoice.payment_succeeded

Test subscription flow:

  1. Create subscription via your Laravel app
  2. Stripe sends webhook to tunnel
  3. Monitor requests in Jetty dashboard
  4. Debug webhook handling in real-time

OAuth Providers

Test OAuth callbacks (GitHub, Google, Facebook) locally:

# Share with stable subdomain
jetty share --subdomain=laravel-oauth-dev

# Configure OAuth provider
# Callback URL: https://laravel-oauth-dev.tunnels.usejetty.online/auth/callback/github

Laravel Socialite configuration:

GITHUB_CLIENT_ID=your_client_id
GITHUB_CLIENT_SECRET=your_client_secret
GITHUB_REDIRECT=https://laravel-oauth-dev.tunnels.usejetty.online/auth/callback/github

Email Webhooks

Test inbound email webhooks from SendGrid, Mailgun, Postmark:

SendGrid Inbound Parse:

# Share with subdomain
jetty share --subdomain=laravel-email

# Configure SendGrid Inbound Parse
# Hostname: laravel-email.tunnels.usejetty.online
# URL: https://laravel-email.tunnels.usejetty.online/webhooks/inbound-email

Laravel route:

Route::post('/webhooks/inbound-email', function (Request $request) {
    Log::info('Inbound email', $request->all());
    // Process email data
});

Mailgun Inbound Routes:

Priority: 0
Filter: match_recipient(".*@laravel-email.tunnels.usejetty.online")
Action: forward("https://laravel-email.tunnels.usejetty.online/webhooks/mailgun")

Reserved Subdomains for Environments

Reserve subdomains for stable, long-term tunnel endpoints:

Development Environment

# Create reserved subdomain via dashboard or CLI
jetty share --subdomain=laravel-dev

# Use this URL in .env
APP_URL=https://laravel-dev.tunnels.usejetty.online

# Configure webhooks to point here
# Now "jetty share --subdomain=laravel-dev" always gives same URL

Staging Mirror

# Share staging-like environment
jetty share --subdomain=laravel-staging

# Update .env.staging
APP_URL=https://laravel-staging.tunnels.usejetty.online

Feature Branches

# Feature-specific tunnels
jetty share --subdomain=laravel-feature-checkout
jetty share --subdomain=laravel-feature-admin
jetty share --subdomain=laravel-feature-api-v2

Team Member Subdomains

# Personal development tunnels
jetty share --subdomain=laravel-tom
jetty share --subdomain=laravel-sarah
jetty share --subdomain=laravel-mike

Custom Domains

Point your own domain to Jetty tunnels for branded URLs.

Setup Process

  1. Reserve a subdomain in Jetty dashboard
  2. Add custom domain in dashboard settings
  3. Create CNAME record pointing to tunnel

Example:

Reserve subdomain: laravel-prod
Custom domain: dev.mycompany.com
CNAME: dev.mycompany.com → laravel-prod.tunnels.usejetty.online

Laravel Configuration

# Use custom domain in .env
APP_URL=https://dev.mycompany.com
SESSION_DOMAIN=.mycompany.com

SSL Certificates

Jetty automatically provisions Let's Encrypt SSL certificates for custom domains. No manual certificate management required.

Security Considerations

APP_URL Configuration

Always set APP_URL to your tunnel URL to ensure:

  • Correct URL generation in emails and queued jobs
  • Proper asset URLs
  • Accurate redirect URLs
APP_URL=https://your-subdomain.tunnels.usejetty.online

Trusted Proxies

Configure Laravel to trust Jetty's proxy headers:

// app/Http/Middleware/TrustProxies.php
namespace App\Http\Middleware;

use Illuminate\Http\Middleware\TrustProxies as Middleware;
use Illuminate\Http\Request;

class TrustProxies extends Middleware
{
    protected $proxies = '*';
    
    protected $headers = 
        Request::HEADER_X_FORWARDED_FOR |
        Request::HEADER_X_FORWARDED_HOST |
        Request::HEADER_X_FORWARDED_PORT |
        Request::HEADER_X_FORWARDED_PROTO;
}

CSRF Tokens

CSRF protection works normally with tunnels. Ensure:

  1. APP_URL is set correctly
  2. Session cookies are configured properly
  3. Exclude webhook routes from CSRF if needed
// app/Http/Middleware/VerifyCsrfToken.php
protected $except = [
    'webhooks/*',
    'stripe/webhook',
];

Session Configuration

For cross-subdomain session sharing:

SESSION_DOMAIN=.tunnels.usejetty.online
SESSION_SECURE_COOKIE=true
SESSION_SAME_SITE=lax

Rate Limiting

Jetty respects Laravel's rate limiting. Configure per-route limits:

Route::middleware('throttle:60,1')->group(function () {
    Route::post('/api/webhook', [WebhookController::class, 'handle']);
});

Environment Separation

Never share production credentials through tunnels:

#  Don't do this
DB_HOST=production-db.example.com
DB_PASSWORD=production_password

#  Use local/development credentials
DB_HOST=localhost
DB_PASSWORD=local_dev_password

CI/CD Integration

Laravel Forge

Use Jetty to test deployments before pushing to Forge:

# Test locally before deploying
jetty share --subdomain=laravel-forge-preview

# Deploy to Forge when ready
forge deploy production

GitHub Actions

Test webhooks in CI pipeline:

# .github/workflows/test.yml
name: Test Laravel

on: [push]

jobs:
  test:
    runs-on: ubuntu-latest
    
    steps:
      - uses: actions/checkout@v2
      
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.2'
      
      - name: Install dependencies
        run: composer install
      
      - name: Run tests
        run: php artisan test
        
      - name: Install Jetty CLI
        run: composer global require jetty/client
        
      - name: Share for webhook testing
        run: jetty share --subdomain=laravel-ci-${{ github.run_id }}
        env:
          JETTY_TOKEN: ${{ secrets.JETTY_TOKEN }}

Laravel Vapor

Jetty complements Vapor for local webhook testing before deploying serverless:

# Test webhooks locally with Jetty
jetty share --subdomain=laravel-vapor-local

# Deploy to Vapor when ready
vapor deploy production

Troubleshooting

Issue: "Could not connect to local site"

Symptoms: Jetty CLI reports connection errors to local Laravel app.

Solutions:

# 1. Verify local app is running
curl http://localhost:8000
curl https://my-app.test

# 2. Check Valet/Herd status
valet status
herd status

# 3. Specify site explicitly
jetty share --site=localhost:8000

# 4. Check port availability
lsof -i :80
lsof -i :443

# 5. Restart Valet/Herd
valet restart
herd restart

Issue: Assets not loading (CSS/JS)

Symptoms: Public tunnel shows unstyled Laravel app.

Cause: Vite dev server not running or APP_URL misconfigured.

Solutions:

# Option 1: Use compiled assets
npm run build
rm public/hot  # Remove Vite dev server indicator

# Option 2: Ensure Vite dev server is running
npm run dev

# Option 3: Set APP_URL
# .env
APP_URL=https://your-subdomain.tunnels.usejetty.online

# Clear config cache
php artisan config:clear

Issue: CSRF token mismatch

Symptoms: Forms fail with "419 Page Expired" error.

Solutions:

// 1. Trust proxies (app/Http/Middleware/TrustProxies.php)
protected $proxies = '*';

// 2. Set APP_URL
APP_URL=https://your-subdomain.tunnels.usejetty.online

// 3. Clear config cache
php artisan config:clear

// 4. Exclude webhook routes from CSRF
protected $except = ['webhooks/*'];

Issue: "Tunnel unavailable" errors

Symptoms: Public URL shows "tunnel unavailable" intermittently.

Cause: Multiple jetty share processes running for same tunnel (since v0.1.19, prevented by lockfile).

Solutions:

# 1. Check for duplicate processes
ps aux | grep "jetty share"

# 2. Kill duplicate processes
killall jetty

# 3. Restart single process
jetty share --subdomain=your-subdomain

# 4. Use --force to override lockfile (not recommended)
jetty share --subdomain=your-subdomain --force

Issue: Slow request forwarding

Symptoms: Requests through tunnel are significantly slower than direct access.

Solutions:

# 1. Use regional edge for lower latency
export JETTY_REGION=us-west
jetty share

# 2. Check local network
ping usejetty.online

# 3. Verify local app performance
time curl http://localhost:8000

# 4. Check queue workers (slow jobs block requests)
php artisan queue:restart

Issue: OAuth callback fails

Symptoms: OAuth providers redirect to tunnel but callback fails.

Solutions:

# 1. Update OAuth provider callback URL
GITHUB_REDIRECT=https://your-subdomain.tunnels.usejetty.online/auth/callback/github

# 2. Set APP_URL
APP_URL=https://your-subdomain.tunnels.usejetty.online

# 3. Clear config cache
php artisan config:clear

# 4. Verify callback route exists
php artisan route:list | grep callback

Issue: Webhooks not received

Symptoms: External service sends webhooks but Laravel doesn't receive them.

Solutions:

# 1. Verify route exists and is POST
php artisan route:list | grep webhook

# 2. Check Jetty dashboard for incoming requests

# 3. Disable CSRF for webhook route
# app/Http/Middleware/VerifyCsrfToken.php
protected $except = ['webhooks/*'];

# 4. Check webhook URL in external service
# Must be: https://your-subdomain.tunnels.usejetty.online/webhook-path

# 5. Test with curl
curl -X POST https://your-subdomain.tunnels.usejetty.online/webhooks/test \
  -H "Content-Type: application/json" \
  -d '{"test": true}'

Tips & Tricks

Shell Aliases

Add these to ~/.zshrc or ~/.bashrc for faster workflow:

# Jetty aliases
alias jshare='jetty share'
alias jstatus='jetty status'
alias jstop='jetty stop'

# Laravel + Jetty combined
alias lshare='php artisan config:clear && jetty share'
alias ldev='npm run dev & jetty share --subdomain=dev'

# Quick webhook testing
alias jstripe='jetty share --subdomain=stripe-dev'
alias jgithub='jetty share --subdomain=github-dev'

# Multiple projects
alias jproject1='cd ~/sites/project1 && jetty share --subdomain=project1'
alias jproject2='cd ~/sites/project2 && jetty share --subdomain=project2'

Combining with Artisan Commands

Run commands while tunnel is active (in separate terminals):

# Terminal 1: Share app
jetty share --subdomain=laravel-dev

# Terminal 2: Watch logs
tail -f storage/logs/laravel.log

# Terminal 3: Run queue worker
php artisan queue:work --verbose

# Terminal 4: Monitor Horizon
php artisan horizon

One-Liner Workflow

Start everything in one command:

# Start Vite, queue worker, and Jetty tunnel
npm run dev & php artisan queue:work & jetty share --subdomain=dev

Or use Laravel Foreman/Honcho:

# Procfile
web: php artisan serve
worker: php artisan queue:work
tunnel: jetty share --subdomain=dev
assets: npm run dev
foreman start

Multi-Project Switching

Quickly switch between multiple Laravel projects:

# Create script: ~/bin/jetty-switch
#!/bin/bash

case $1 in
  api)
    cd ~/sites/laravel-api && jetty share --subdomain=api-dev
    ;;
  web)
    cd ~/sites/laravel-web && jetty share --subdomain=web-dev
    ;;
  admin)
    cd ~/sites/laravel-admin && jetty share --subdomain=admin-dev
    ;;
  *)
    echo "Usage: jetty-switch {api|web|admin}"
    ;;
esac
chmod +x ~/bin/jetty-switch
jetty-switch api

Testing Multiple Webhooks

Set up multiple webhook endpoints:

// routes/web.php
Route::prefix('webhooks')->group(function () {
    Route::post('stripe', [WebhookController::class, 'stripe']);
    Route::post('github', [WebhookController::class, 'github']);
    Route::post('twilio', [WebhookController::class, 'twilio']);
    Route::post('sendgrid', [WebhookController::class, 'sendgrid']);
});

Share once, configure all services:

jetty share --subdomain=laravel-webhooks

# Configure all services to:
# https://laravel-webhooks.tunnels.usejetty.online/webhooks/{service}

Request Logging

Log all tunnel requests for debugging:

// app/Http/Middleware/LogTunnelRequests.php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

class LogTunnelRequests
{
    public function handle(Request $request, Closure $next)
    {
        if ($request->header('X-Forwarded-Host')) {
            Log::channel('tunnel')->info('Tunnel request', [
                'method' => $request->method(),
                'url' => $request->fullUrl(),
                'headers' => $request->headers->all(),
                'ip' => $request->ip(),
            ]);
        }
        
        return $next($request);
    }
}

Tail Laravel Logs While Sharing

# Terminal 1
jetty share --subdomain=dev

# Terminal 2
tail -f storage/logs/laravel.log | grep -i "tunnel\|webhook\|error"

Quick Debug Route

Add a debug route to verify tunnel configuration:

// routes/web.php (only in development!)
if (app()->environment('local')) {
    Route::get('/jetty-debug', function () {
        return response()->json([
            'app_url' => config('app.url'),
            'request_url' => request()->url(),
            'headers' => request()->headers->all(),
            'ip' => request()->ip(),
            'forwarded_for' => request()->header('X-Forwarded-For'),
            'forwarded_host' => request()->header('X-Forwarded-Host'),
        ]);
    });
}

Visit https://your-subdomain.tunnels.usejetty.online/jetty-debug to see configuration.

VS Code Integration

Create VS Code tasks (.vscode/tasks.json):

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Jetty: Share",
      "type": "shell",
      "command": "jetty share --subdomain=dev",
      "problemMatcher": []
    },
    {
      "label": "Jetty: Share (random)",
      "type": "shell",
      "command": "jetty share",
      "problemMatcher": []
    },
    {
      "label": "Laravel: Serve + Jetty",
      "type": "shell",
      "command": "php artisan serve & jetty share --site=localhost:8000",
      "problemMatcher": []
    }
  ]
}

Run via Command Palette: Tasks: Run TaskJetty: Share


Next Steps

  • Explore the Dashboard: Monitor requests in real-time at usejetty.online
  • Reserve Subdomains: Create stable URLs for long-term webhook endpoints
  • Check Documentation: Getting Started Guide
  • Join Community: Share tips and get help from other Laravel developers

Send feedback

Found an issue or have a suggestion? Let us know.