# Share your local app from OpenAI Codex

> Install the qURL plugin or skill for Codex, then ask it to share your app privately from your machine. You choose who can open it. No deploy.

Source: https://layerv.ai/guides/share-localhost-from-codex/

---

[← All guides](https://layerv.ai/guides/) 

# Share your local app from OpenAI Codex

Checked against the qURL™ CLI 3.4.1 source and documentation on October 14, 2026. Link and session behaviour is [tested separately](https://layerv.ai/research/qurl-behaviour/).

Content updated October 18, 2026. The verification date above records the original review; later behaviour checks are dated in the guide.

## How do I get Codex to share the app I’m building?

Install the qURL plugin (codex plugin marketplace add layervai/codex-plugins, then codex plugin add qurl@layerv), or save the qURL skill to \~/.agents/skills/qurl/SKILL.md, then ask Codex to share the app. Codex runs with network access off by default, so it asks before installing the qurl CLI and publishing. It publishes the app as a private resource and gives you an address to send, with nothing deployed and no account.

## What you need

- Codex CLI or the Codex IDE extension, in the project whose app is running
- The app running on this machine
- No account or API key

## Steps

1. ### Add the qURL plugin marketplace  
Run this in your own terminal. The plugin keeps the qURL skill on disk and adds $qurl:share, $qurl:approve and $qurl:access. Together they share an app by email invitation, email sign-in, review, approved passkeys or contract, and let you decide who gets in. No account or API key.  
```  
codex plugin marketplace add layervai/codex-plugins
```
2. ### Install the plugin  
Then this one.  
```  
codex plugin add qurl@layerv
```
3. ### Or install the skill yourself  
Skip this if you installed the plugin. Codex reads user skills from \~/.agents/skills and repo skills from .agents/skills. Install the file from your own terminal: Codex starts with network access off, so asking it to read the skill’s URL is not reliable.  
```  
mkdir -p ~/.agents/skills/qurl && curl -fsSL https://layerv.ai/skills/qurl/SKILL.md -o ~/.agents/skills/qurl/SKILL.md
```
4. ### Check Codex sees it  
Codex detects skill changes automatically; restart it if qurl doesn’t appear. Run /skills, or type $ to mention a skill.  
```  
/skills
```
5. ### Ask Codex to share the app  
With the plugin, type $qurl:share or just ask; with a skill you saved yourself, mention $qurl as shown. Installing the CLI and publishing both need the network, so Codex asks for approval before running them. Approve both; the skill gives the address to you and sends invitation emails only to recipients you authorize.  
```  
$qurl share the app I'm running
```
6. ### Choose who can open the app  
The agent applies the private access rules you choose. For named recipients, give it their email addresses so it can send invitations. Recipients verify their email in the browser and save a passkey; they never send you their email verification code. The agent checks policy support before sharing and keeps the app private if the deployment cannot support it. For existing legacy resources only, pass on a six-digit access code when it came from the person you mean to let in, over a channel where you know it is them. Ask for a one-time link when that meets your needs; the link is a secret.

## What the recipient sees

A person opens the emailed invitation or the address in a browser and sees who published the app, marked Not verified: today LayerV has verified only its own account. The private policy controls access. Named recipients verify their email there and save a passkey; their email verification code stays in that flow. A person with a one-time link lands on your app directly. Either way, the session admits the network address the opener connects from.

## Which tool should Codex use to share the app?

| Option                                                                                  | Choose it when                                                                                                                    | Trade-off                                                                                                                                 |
| --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| [qURL](https://layerv.ai/cli/)                                                          | qURL fits when you want particular people to open the app running on your machine, with no account and no public URL.             | With qURL your computer and the app must stay running, and each person needs a link or an invitation from you.                            |
| [ngrok](https://layerv.ai/compare/qurl-vs-ngrok/)                                       | ngrok fits when you need a stable public URL, for example for webhooks, or want ngrok’s OAuth or IP rules in front of the app.    | ngrok needs an account and authtoken first, the URL is public, and free-plan browser visitors see a warning page.                         |
| [Cloudflare Quick Tunnels](https://layerv.ai/compare/qurl-vs-cloudflare-quick-tunnels/) | A Cloudflare Quick Tunnel fits when you want a throwaway URL with no account, optionally behind an email PIN with --allowed-mail. | A Cloudflare Quick Tunnel is public unless you set --allowed-mail, gets a new hostname each run, and does not support Server-Sent Events. |
| [Tailscale Funnel](https://layerv.ai/compare/qurl-vs-tailscale-funnel/)                 | Tailscale Funnel fits when the machine is already on a tailnet and you want a stable public HTTPS name for it.                    | Tailscale Funnel needs a tailnet, makes the app public on a ts.net hostname, and puts no access control on Funnel traffic.                |

## Troubleshooting

| If you see                                                                                                                 | Do this                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Codex can’t read https://layerv.ai/skills/qurl/SKILL.md                                                                    | Network access is off by default and web search returns cached results. Install the skill file yourself with the command in step 1.                                                                                                                                                                                                                                                                                                                           |
| qurl publish fails with a network error                                                                                    | The command ran in the sandbox without network access. Approve it when Codex asks, or run qurl publish yourself.                                                                                                                                                                                                                                                                                                                                              |
| The private-policy commands are unavailable or consumer access is disabled                                                 | Ask the agent to follow the access-policy support check in the qURL skill. It updates an older CLI when needed. If the deployment cannot support the requested policy, stop sharing and keep the app private; do not fall back to legacy access requests.                                                                                                                                                                                                     |
| For an existing legacy resource, the agent cannot turn on access requests, or publishes with no Access: line in the output | The CLI is older than 3.4.1\. Ask the agent to update it; the skill’s install step always installs the latest release. qurl --version should then print 3.4.1 or later.                                                                                                                                                                                                                                                                                       |
| qurl publish says the local app is not accepting TCP connections                                                           | Start the app first and check that curl works on the same address. qurl publish connects to localhost as 127.0.0.1, so if your app listens only on IPv6 (on macOS or Linux, lsof -iTCP -sTCP:LISTEN -nP shows \[::1\]), publish 'http://\[::1\]:PORT' instead. Keep the quotes: zsh treats the brackets as a pattern.                                                                                                                                         |
| The recipient sees “Access link invalid”                                                                                   | The link was already used or has expired. Run qurl share again and send the new link.                                                                                                                                                                                                                                                                                                                                                                         |
| The recipient sees “Resource not found”                                                                                    | The resource was deleted after the link was made. Publish the app again, then run qurl share and send the new link.                                                                                                                                                                                                                                                                                                                                           |
| publish rejects http://127.0.0.1 with “only HTTPS URLs are allowed”, or asks you to log in                                 | You have a CLI older than 3.0\. On macOS run brew update, then brew upgrade qurl; elsewhere install the latest release again. After updating, qurl --version should print 3.4.1 or later.                                                                                                                                                                                                                                                                     |
| publish prints no Access: line, or the Access: line says public and you did not ask for public                             | With no Access: line, the CLI is older than 3.4.1: on macOS run brew update, then brew upgrade qurl; elsewhere install the latest release again. A resource that an older CLI published is public unless you published it with --private, and anyone who has the CRID of a public resource can open it. To make a public resource private, run qurl delete <CRID> and publish again with qurl 3.4.1 or later. The new resource is private and has a new CRID. |
| publish says this Linux session “can’t reach a systemd user manager”                                                       | You are in a container or sandbox without a user service manager. Run qurl publish with --foreground; sharing lasts as long as that process runs.                                                                                                                                                                                                                                                                                                             |
| publish says “Quota Exceeded” with “protected resource limit reached”, or “Your qURL account has reached a plan limit”     | You can see this without an account: a device with no account can keep up to 3 active resources, with links that last up to 24 hours. Run qurl list --status active, then qurl delete <CRID> for any you no longer need (it asks you to confirm; --yes skips that). qurl stop keeps the resource, so it does not free a slot.                                                                                                                                 |

## Frequently Asked Questions

Can I use AGENTS.md instead of a skill? 

You can point AGENTS.md at the skill, but Codex supports skills directly and loads one only when the task needs it. AGENTS.md is read at the start of every run.

Will the agent send the address or a link to other people? 

It gives the address or link to you, and you decide who receives it. It sends invitation emails only to recipients you authorize. For legacy resources, it approves only a code you pass on, never the name on a request.

Do I need a LayerV account or API key? 

No. Publishing from the CLI needs no account; the first publish creates an identity for this computer. Recipients verify their email and save a passkey in their browser when the private policy requires it. Without an account you can keep up to 3 active resources, with links that last up to 24 hours.

Who else can reach my app while the link is open? 

Opening the link admits the network address it was opened from for the session, which lasts 1 hour by default. Other devices that share that public IP address, such as people on the same office or café network or VPN, can reach the app until the session ends. By default a link admits whoever opens it; access rules set through the API, such as IP allow and deny lists, can restrict that. Keep your app’s own sign-in for anything sensitive.

## Related Resources

[Vibe coding: share your app in one prompt →](https://layerv.ai/vibe-coding/) [The qURL skill →](https://layerv.ai/skills/qurl/SKILL.md) [Guide: Give an AI agent access to a local app →](https://layerv.ai/guides/give-an-ai-agent-access-to-a-local-app/) [ngrok alternatives →](https://layerv.ai/compare/ngrok-alternatives/) [Share from Claude Code →](https://layerv.ai/guides/share-localhost-from-claude-code/) [Share from Cursor →](https://layerv.ai/guides/share-localhost-from-cursor/) [Share from Windsurf →](https://layerv.ai/guides/share-localhost-from-windsurf/) [Share from VS Code (Copilot) →](https://layerv.ai/guides/share-localhost-from-vs-code-copilot/) [Share from Gemini CLI →](https://layerv.ai/guides/share-localhost-from-gemini-cli/) [Codex docs: Skills ↗](https://learn.chatgpt.com/docs/build-skills)

## Share it from Codex

With the plugin installed, ask Codex to share the app. Without it, paste this prompt in the project whose app is running: Codex reads the qURL skill, publishes the app privately, and you choose who can open it.

[Or use the CLI ↗](https://layerv.ai/cli/)



---

*This markdown version is auto-generated from [https://layerv.ai/guides/share-localhost-from-codex/](https://layerv.ai/guides/share-localhost-from-codex/) for AI agents. Curated agent resources: [llms.txt](https://layerv.ai/llms.txt). For the full interactive experience, visit the HTML version.*

