# Handing Work to a Client Who Will Never Run npm install

Canonical: https://commareports.com/for/freelance-developers
Published: 2026-09-11

> The client can't open a zip, doesn't have a GitHub account, and replies to your build report with 'it won't open'. Send a URL that works on their phone, and collect the feedback on the page.

# The client can't open the zip

You are not shipping to engineers. You are shipping to a person who checks
email on a phone, has never used GitHub, and whose entire interaction with
your work is whether a link opens.

So the three habits that are normal between developers all fail:

- **Email the file.** The attachment gets stripped, or it arrives and opens
  blank because you sent `index.html` without its `assets/` folder.
- **Send a localhost URL.** It resolves on exactly one machine —
  [why that never works for others](/fix/localhost-link-doesnt-work-for-others).
- **Send a repo link.** They see raw HTML, or a login wall, or both.

## Send a URL instead

Drag the build output in, or publish it from your terminal. The client gets an
`https://` address that opens in whatever browser they already have — desktop,
phone, tablet — with no account, no install, no extension, no "allow this
file" dialog.

If the deliverable is a built site rather than one page — a
[static export](/share-nextjs-static-export), an
[Astro](/share-astro-site), [Eleventy](/share-eleventy-site),
[Hugo](/share-hugo-site), [Gatsby](/share-gatsby-site),
[Jekyll](/share-jekyll-site), [Nuxt](/share-nuxt-static-site) or
[Zola](/share-zola-site) build, or a
[Storybook](/share-storybook-static) — publish the
[whole folder](/share-html-folder). Relative links and assets resolve, which
is what stops the "it looks broken" email.

## Get feedback you can act on

Client feedback is famously unactionable because it arrives detached from the
thing it describes: _"the header is a bit much"_, sent as a voice note, about a
page with three headers.

A comment link fixes the geometry. They highlight the header and type next to
it. The note stays anchored there, you see exactly what they meant, and the
whole round trip is one link instead of a meeting. See
[commenting on HTML](/comment-on-html).

When you've made the change, publish a **revision at the same URL**. The
client refreshes the link they already have — no "v2" email, no confusion
about which version they're looking at, and the earlier version stays in the
history if they change their mind back.

## The boring commercial parts

- **Taking it down.** Set visibility to private when the engagement ends or the
  invoice clears; the link stops working immediately. Expiring links are an
  Enterprise feature.
- **Client accounts.** They never need one, and they are never billed. Pricing
  is per publisher.
- **Your branding.** The HTML is yours — logo, fonts, the lot. Serving it from
  your own domain with no "Published on Comma" mark is Enterprise.
- **A record of what you delivered.** Revision history plus comment threads is
  a better answer to "this isn't what we agreed" than a search through
  WhatsApp.

## Worth knowing

- **Start private if it contains anything real.** A staging build often has
  test customer data in it — see [sharing & access control](/docs/sharing).
- **Big files.** Entry HTML 5 MB; assets 25 MB per file, 250 MB and 500 files
  per report. If you were about to email 40 MB, see
  [HTML file too big to email](/fix/html-file-too-big-to-email).
- **Interactive prototypes stay interactive.** Scripts run in a sandboxed
  iframe, so a clickable prototype is still clickable.

## Try it

Comma is free — unlimited reports, unlimited commenters, unlimited revision
history. Clients never need an account.

**[Start free →](/login)**

### Related

- [For consultants](/for/consultants) · [For agencies](/for/agencies)
- [Share an HTML file with a client](/share-html-file-with-client) ·
  [Upload an HTML file and get a link](/upload-html-file-get-link)
- [Open an HTML file on iPhone](/open-html-file-on-iphone) ·
  [Host an HTML file](/host-html-file)
