Localhost, meet the world.
A public address for the app on your machine. Share your work, catch real webhooks, and test from anywhere—without a deployment.
localhost:3000demo.outray.appHTTPS, ready to sharenpx outray 3000Every request. As it arrives.
npx outray 3000
Connecting to OutRay...
Linked to your local port 3000
Tunnel ready: https://demo.outray.app
Keep this running to keep your tunnel active.
| Method | Path | Status | Time |
|---|---|---|---|
| GET | /api/users | 200 | 12ms |
| POST | /api/webhooks | 201 | 45ms |
| GET | /favicon.ico | 200 | 2ms |
| GET | /api/health | 200 | 5ms |
| POST | /auth/login | 200 | 89ms |
| GET | /dashboard | 200 | 150ms |
| GET | /api/settings | 304 | 8ms |
| POST | /api/upload | 201 | 230ms |
First-class developer experience
Less setup. More building. OutRay fits right into the tools you already use.
Online in one line
Start your app. Point OutRay at its port. Get a public address without deploying a thing.
npx outray 3000Fits into your workflow
Prefer your usual dev command? Let a framework plugin open the tunnel when your server starts.
import { defineConfig } from "vite";
import outray from "@outray/vite";
export default defineConfig({
plugins: [outray({
apiKey: process.env.OUTRAY_API_KEY,
})],
});import withOutray from "@outray/next";
export default withOutray(
{},
{
apiKey: process.env.OUTRAY_API_KEY,
},
);import express from "express";
import outray from "@outray/express";
const app = express();
outray(app, {
apiKey: process.env.OUTRAY_API_KEY,
});
app.listen(3000);Inspect every request
Follow HTTP traffic through your tunnel. Enable request capture to look closer at headers and supported payloads.
POST /webhooks/paymentResponse- Status
- 201 Created
- Duration
- 58 ms
- Content type
- application/json
{
"received": true,
"event": "payment.completed"
}It just works.
Your app stays on your machine. OutRay connects it to the world.
No port forwarding. No deployment. Just a connection.
Localhost
Secure tunnel
OutRay Edge
Public Internet
Bring your
own domain.
Connect your own domain and get automatic HTTPS.
- Automatic SSL/TLS certificates
- Simple CNAME configuration
- The same address when you reconnect
preview.example.comYour domain, connected.
Public address → localhost:3000- CNAMERoute visitors
preview.example.comWorkspace-provided target- TXTVerify ownership
_outray-challenge.preview.example.comYour domain’s ownership token
outray 3000 --domain preview.example.comUnlimited .local domains
Test on any device in your network. Just add --local and your app is instantly accessible at a memorable .local domain.
mDNS Discovery
Auto-discovered by all devices via Bonjour/Avahi
Trusted HTTPS
Automatic certificates with mkcert - no browser warnings
Zero Config
No port forwarding, no firewall rules, no DNS setup
outray 3000 --localTunnel: https://my-app.outray.app
Local: https://my-app.local
Any protocol.
One command away.
HTTP, TCP, and UDP. One CLI for any local service.
HTTP/HTTPS
Secure URLs for local web servers, webhooks, and APIs.
outray http 3000TCP Tunnels
Expose databases, SSH, RDP, and other TCP services.
outray tcp 5432UDP Tunnels
Connect game servers, streaming, and real-time apps.
outray udp 5000Keep building locally.
Let the world in.
A webhook, a teammate, a phone on your network.
Give your app a way to be reached.