Why does a `file://` link open only for me? The real HTML sharing problem
Learn why file URLs and localhost do not open for other people, then turn local HTML into a temporary HTTPS link that works outside your computer.

file:///Users/name/Desktop/report.html and http://localhost:3000 do not open
on another person’s computer. Both point inside the computer that opens the
address, not to a server on the internet. Other people need an https:// URL
served by a host they can reach.
Think of the three addresses as postal directions
file:// means “the third drawer in my house”
It is precise on your computer. On another computer, the same sentence tells that machine to look for the path on its own disk. The file is not there, so it cannot open.
MDN’s URI scheme
reference
describes file as a scheme for host-specific file names. A message sends only
the text file://..., not the file itself.
localhost means “my office in this building”
localhost always means the computer that opens the address. In a developer’s
browser, localhost:3000 reaches their development server. When the recipient
opens the same address, it looks for port 3000 on the recipient’s computer.
Changing the port to 5173 or 8080 does not help. The host is still localhost.
https:// is an address on the internet
According to MDN’s explanation of a URL, the scheme tells the browser which protocol retrieves a resource, and the domain names the server to request. A public HTTPS address reaches the same server from different devices.
| Address | Actual location | Share directly with another person |
|---|---|---|
file:///.../report.html |
Disk of the current computer | No |
http://localhost:3000 |
Local server on the computer opening the address | No |
https://example.com/report |
Server reachable on the internet | Yes |
Diagnose the cause from the recipient’s error
| Screen or error | Likely cause |
|---|---|
| The address is not clickable | The messenger does not allow file:// links. |
ERR_FILE_NOT_FOUND |
The file does not exist on the recipient’s disk. |
ERR_CONNECTION_REFUSED |
No server is listening on that port on the recipient’s computer. |
| Connection timeout | Private IP address, firewall, or network isolation |
| The body appears, but images and fonts break | Local asset paths remain in the HTML. |
The last case means that the HTML file arrived but the files around it did not.
Why only the images and CSS break
<link rel="stylesheet" href="./styles.css">
<img src="./images/chart.png" alt="Quarterly change chart">
Both paths are resolved relative to the folder containing the HTML. The files
exist on your computer, but publishing only the HTML does not include
styles.css or chart.png.
fetch(), web fonts, and module scripts can also fail under file://. MDN’s
CORS explanation
notes that many browsers treat local files as separate opaque origins and can
block local resource requests.
Build the first review copy this way:
- put CSS inside
<style>; - put small JavaScript inside
<script>; - use inline SVG for simple graphics;
- use a public HTTPS URL for an external image; and
- remove local paths such as
C:\,/Users/, and./assets.
You can give an AI tool these exact constraints:
Create a complete, shareable, self-contained HTML document.
- Include everything from <!doctype html> through </html>.
- Put CSS and JavaScript inline in the document.
- Do not depend on separate files, external CDNs, or web fonts.
- Do not use local paths such as C:\, /Users/, or ./assets.
- Keep it readable at a 360px mobile width.
- Do not include API keys, personal information, or customer data.
Turn local HTML into an HTTPS link in three steps
1. Prepare one file
Prepare a .html, .htm, .md, or .markdown file and search for local asset
paths and secrets.
grep -nE '(src|href)="(file:|\./|/Users/|[A-Za-z]:\\)' report.html
grep -nEi 'api[_-]?key|secret|token|password|bearer' report.html
Also inspect personal information and customer data that the regular expressions cannot find.
2. Publish with HTML2WEB
Upload the file or paste the code into the HTML-to-URL tool. The free, sign-in-free path accepts up to 1MB. Choose 30-minute, one-hour, or 24-hour expiration; the default is one hour.
3. Check and send the result
Open the generated HTTPS URL in a private window and at mobile width. Confirm that every link and image works, then send the URL with its expiration time.
What noindex and a password protect
The default noindex asks search engines not to index shared output. It does
not block someone who knows the link.
A password adds one access step, but it cannot stop a recipient from saving the screen or forwarding the contents. Remove API keys, tokens, personal information, and customer data before publication.
Can I run a local server on the same Wi-Fi?
You can use python3 -m http.server and a private IP address in some limited
environments. You must then manage the firewall, client isolation, IP changes,
unencrypted HTTP, and the exposure of the folder from which the server runs.
It can suit a quick developer test with someone nearby, but it is a poor default
for a client or external colleague. Stop the server with Ctrl+C when the work
ends.
Temporary links versus production deployments
A temporary link is enough for a mockup, bug reproduction, meeting draft, or one-page report. Choose a maintained deployment when the address must still work in two months, or when you need search visibility, user input, a custom domain, and monitoring.
Frequently asked questions
Is there any way for the recipient to open my file:// link?
The same file would need to exist at the same path on the recipient’s disk. It is not a practical web-sharing method.
Can I attach the file itself?
Yes, but mobile users must download it, and separate images and CSS can still break. A link is simpler for review.
Can I share Markdown the same way?
Yes. HTML2WEB supports both Markdown files and pasted Markdown.
Can an expired link be recovered?
You can create a new link from the source file. Use maintained hosting when the same address must remain available.