Tijdens het ontwikkelen van een Laravel API voor een recente klant kwam ik tegen een typisch probleem: de externe betalingsservice had een webhook nodig, maar mijn API draaide alleen lokaal. Stripe wilde callbacks sturen naar mijn applicatie, maar localhost:8000 is natuurlijk niet bereikbaar vanaf het internet. Vroeger zou ik dan snel een staging server opzetten, maar tegenwoordig gebruik ik expose.dev voor dit soort situaties. Deze service creëert een tunnel tussen mijn lokale machine en het internet, waardoor externe services gewoon kunnen communiceren met mijn development environment.
Wat ik vooral handig vind aan expose.dev is dat het niet alleen HTTP ondersteunt. WebSocket-verbindingen werken ook prima, wat cruciaal was toen ik vorig jaar een real-time chat applicatie bouwde met Laravel Broadcasting. De tunnel blijft stabiel, zelfs bij langere development sessies, en ik hoef me geen zorgen te maken over complexe netwerkconfiguraties of firewall-instellingen.
Het opzetten van een expose.dev-tunnel
Na het aanmaken van een account op expose.dev krijg je toegang tot hun command-line tool. Installatie is straightforward: je download de CLI, voert je authenticatietoken in, en bent klaar om te tunnelen. Voor een standaard Laravel applicatie die op poort 8000 draait, start ik de tunnel zo:
expose dev --port 8000
Binnen enkele seconden krijg je een publieke URL terug, bijvoorbeeld https://abc123.expose.dev. Deze URL stuurt alle verkeer door naar je lokale applicatie. Ik kopieer deze URL meestal direct naar mijn .env bestand als APP_URL, zodat Laravel de juiste URLs genereert voor routes en assets.
De tunnel blijft actief zolang het commando draait. Als je de terminal sluit, verdwijnt ook de tunnel. Voor langere development sessies draai ik het commando vaak in een aparte terminal tab, of gebruik ik een process manager zoals PM2 om de tunnel op de achtergrond te houden. Expose.dev genereert standaard telkens een nieuwe subdomain, maar met een betaald account kun je ook custom subdomains reserveren.
Geavanceerde configuratie voor complexere setups
Sommige projecten draaien op meerdere poorten tegelijk. Laatst werkte ik aan een applicatie met een Laravel backend op 8000 en een Vue.js frontend development server op 3000. Expose.dev kan beide poorten tegelijk tunnelen:
expose dev --port 8000 --port 3000
Dit creëert twee aparte tunnels met verschillende subdomains. Handig als je een gedistribueerde architectuur test waarbij frontend en backend apart communiceren. Voor productieachtige testing gebruik ik soms ook HTTPS-certificaten. Expose.dev ondersteunt custom certificaten:
expose dev --cert mijn-certificaat.pem
Hoewel de gratis tunnels al HTTPS ondersteunen met automatische certificaten, geeft een eigen certificaat meer controle over de SSL-configuratie. Vooral nuttig als je test met services die specifieke certificate requirements hebben.
De configuratie-opties strekken zich verder uit dan alleen poorten en certificaten. Je kunt ook custom headers instellen, specifieke HTTP methods blokkeren of allowlisten, en zelfs basic authentication toevoegen aan je tunnel. Voor publieke demo's gebruik ik die laatste functie regelmatig om ongewenste bezoekers te weren.
Integratie met bestaande Laravel projecten
Bij Laravel projecten pas ik meestal twee dingen aan wanneer ik expose.dev gebruik. Ten eerste update ik de APP_URL in mijn .env bestand naar de tunnel URL. Ten tweede controleer ik of SANCTUM_STATEFUL_DOMAINS correct is ingesteld als ik Laravel Sanctum gebruik voor API authenticatie.
use Illuminate\Http\Request;
Route::get('/api/mijneindpunt', function (Request $request) {
// Code om mijn endpoint te verwerken
});
Voor webhook testing werkt expose.dev perfect. Stripe webhooks komen gewoon binnen op https://mijn-tunnel.expose.dev/webhook/stripe, alsof de applicatie echt online staat. Ik kan dan in realtime debuggen wat er binnenkomt, zonder ingewikkelde log-bestanden te hoeven doorzoeken op een remote server.
Bij Node.js projecten is de workflow vergelijkbaar. Express servers, Next.js development servers, het maakt niet uit. Start je applicatie lokaal, start de expose tunnel, en externe services kunnen je applicatie bereiken. Voor API testing met Postman vervang ik gewoon localhost:8000 door de tunnel URL in mijn request collections.
Debugging wordt ook makkelijker met expose.dev. Alle requests die via de tunnel binnenkomen, verschijnen gewoon in je normale development console. Source maps werken, breakpoints functioneren normaal, en hot reloading blijft actief. Het voelt alsof je nog steeds volledig lokaal werkt, maar met internet-toegankelijkheid.
Performance is over het algemeen prima, hoewel er natuurlijk wat latency bijkomt door de tunnel. Voor development doeleinden merk ik daar weinig van, maar voor load testing zou ik alsnog een echte staging omgeving opzetten. De gratis tier heeft ook enkele beperkingen qua bandbreedte en gelijktijdige verbindingen, maar voor dagelijks development werk kom ik die limieten zelden tegen.
Het mooie van expose.dev is dat het mijn development workflow heeft vereenvoudigd zonder dat ik hoefde te investeren in complexe infrastructure. Geen Docker containers die ik moet onderhouden, geen reverse proxy configuraties, geen SSL-certificaat management. Gewoon een commando typen en binnen seconden kan de buitenwereld bij mijn lokale code.