All projects

DOMShot

Live

DOMShot turns any element on a live webpage into a clean PNG. I use the same capture code in the Chrome extension, the preview editor, the command line, and the MCP server for coding agents.

DOMShot preview editor showing a selected launch notes card and styling controls
The editor lets the user adjust the background, spacing, radius, shadow, scale, and output size around the selected element.

A screenshot often creates more work than it should.

A useful UI component may already exist in the browser, but turning it into a clean image often means opening developer tools, cropping a screenshot, rebuilding spacing, adding a background, and checking the export again.

DOMShot uses the browser’s rendering instead. It captures the selected element and opens an editor for the final background, spacing, shadow, and size.

Select the real element. See the final composition. Export once.

Pick the element, adjust the image, and save it.

  1. Select an element

    The extension overlays the current page and makes the capture boundary visible.

  2. Capture the element

    DOMShot separates the selected content and keeps the way it looks in the browser.

  3. Adjust the image

    Presets and simple controls set the background, padding, shadow, corners, and scale.

  4. Export the PNG

    The preview becomes a local image at the chosen size and composition.

DOMShot element selector highlighting a browser dialer on a webpage
Selection mode shows the exact capture boundary before DOMShot creates an image.

I kept the editor quick without removing the controls people need.

Preview before saving

The editor shows the final composition before the user downloads it.

Local by default

DOMShot handles the selected content in the browser and does not upload it to a DOMShot server.

Transparent when possible

The capture path preserves transparency and has explicit fallbacks when a page cannot be rendered cleanly.

One capture path

The extension, Node API, CLI, and MCP server share the same capture logic.

How the extension, command line, and agent tools work together.

I made DOMShot available in three ways: a Chrome extension for people, Node and command-line tools for scripts, and an MCP server for coding agents. They all use the same capture path.

Chrome capture

The element picker, the browser capture, recent images, and the step that opens the editor.

Background and spacing controls

Presets and direct controls for preparing an image to share.

Node, command line, and MCP

The same capture steps packaged for scripts, coding agents, and local automation.

Website and documentation

Where people can install DOMShot, see examples, read the privacy details, and get help.

DOMShot editor previewing a styled dialer capture ready for PNG export
The preview matches the PNG that will be downloaded.
DOMShot editor with clean, floating, and studio presets and detailed appearance controls
The extension, CLI, and MCP server use the same capture logic.

The difficult parts

Every webpage behaves differently

Elements can contain transparent pixels, nested styles, unusual fonts, or page behavior that does not survive a basic crop.

Power can become clutter

An image editor can grow endlessly. DOMShot needs enough control to be useful without turning a quick capture into a design session.

Failed captures must look failed

The CLI and MCP tools need clear errors, fallbacks, and saved output so a failed capture cannot look successful.

What I’ve learned from building a small developer tool.

  • A small tool feels dependable when every screen makes the next step obvious.
  • Keeping the capture in the browser is better for privacy and makes the product simpler.
  • The automation works best when it follows the same steps that already work in the extension.

The extension is live. I’m still testing the agent tools.

I’ve released the Chrome extension and the public website. The Node API, command-line tool, and MCP server work locally, and I’m still testing them together as one package.

  • I’m fixing difficult capture cases and making the fallbacks clearer when transparency fails.
  • I’m adding more to the agent tools without making the browser extension harder to use.
  • I’m adding better examples and documentation for repeatable interface captures.