save & share
turn any element on any page into a link. people open it as a live page; agents read it as markdown.
on this page
what it does#
hold ⌃⌥ and click an element. element takes a snapshot of it (the element's html and the page's css that applies to it, its fonts and images, a screenshot and the pick details), uploads it to share.elmts.dev and copies the link.
sharing is separate from picking. a share makes no pick and sends nothing to your agent sessions, so you can share from any tab, owned or not.
share an element#
- sign in once, from the drawer (⌥⇧S → settings) or the terminal:
el login. sign in with github or google; both reach the same account when they confirm the same email. - hold ⌃⌥ (control and option) and hover. corners show what will be shared.
- click. a toast shows the progress, then link copied with open and copy.
click several elements in a row and each one gets its own toast. most shares take a second or two; a page with script-driven animation can take up to two seconds longer while element records its motion (see motion).
not signed in? the toast says sign in to save & share and nothing is uploaded.
change the shortcut in the drawer: settings → shortcuts → change. hold the new modifier keys and let go. it applies in every open tab at once.
from the terminal
el share shares your latest pick, a pick by id, or any selector in a tab your session owns. it prints two links.
$ el share view: https://share.elmts.dev/s/k3FqP8vT2nWb # for people agent: https://share.elmts.dev/v1/snapshots/k3FqP8vT2nWb # JSON $ el share el_12 --expires 30d $ el share --selector "button.checkout" --tab 3
where links go#
- your clipboard. paste it into slack, a pull request, an issue, or an agent's chat.
- saves. every link is kept in the drawer's saves tab (⌥⇧S). search by page or element, copy one link or select several and copy them all.
- the toolbar popup. on pages element can't run on (the chrome web store,
chrome://pages), the toolbar icon shows your recent saves instead.
saves live on this device. syncing saves across devices is coming to Pro and Max.
who can see a link#
by default, anyone with the link. links are unlisted: there's no index or profile page, and the ids are long and random. treat a link like a file you emailed.
private links (Pro and Max)
a private link is still a normal link you paste anywhere, but it only opens for you and the people you allow: an email (sam@acme.com) or everyone at a domain (@acme.com). anyone else sees this link is private · sign in to view; they sign in with github or google, and if their email isn't on your list they can request access.
- make new links private by default: drawer → settings → new links are → private, and private links open for only me or your work
@domain. - while it's saving: the toast shows private or anyone; tap it to switch before the link is made.
- after: the link copied toast's ⋯, a row's ⋯ in saves, or the link's own page when you're signed in as its owner. switch between anyone with the link and private, add or remove people, and allow or deny requests.
- requests: a blue count on the saves tab and on the link's row. ⋯ → people & requests shows who asked; allow adds them. there are no request emails yet: check the drawer.
- from the terminal:
el share --private --allow sam@acme.com,@acme.com, andel access <link>to see or change who can open it (--approve,--deny,--remove,--unlisted).
a private link's preview in slack or imessage says only "private link": no title, no screenshot. its embed, raw html and screenshot need the same access. domain access trusts the email github or google verified, so pick domains you control; free mailboxes like @gmail.com can't be added as domains.
what a viewer gets is a copy of the element, not the page:
- no scripts and no inline event handlers.
- links and forms are inert: nothing navigates or submits.
- form fields keep their current values, except passwords, which become dummy characters of the same length.
- only the element and what paints inside its box, never the rest of the page.
a snapshot shows whatever was on screen. before sharing an element from a signed-in app, check it for names, emails or numbers you don't want to send.
expiry by plan#
every link has an expiry. after it, the link shows "this snapshot has expired" and the files are deleted.
| plan | links last | how to choose |
|---|---|---|
| Free | 24 hours | fixed |
| Pro | 1, 7 or 30 days | drawer → settings → links expire after (default 7 days), or el share --expires 30d |
| Max | 1, 7, 30 days or never | same, plus never / --expires never |
expiry is set when you share. changing the setting later applies to new links, not old ones. more in links and expiry.
deleting a link#
on Pro and Max, you can delete any link you made, at any time. in saves, hover a row and click ⋯ → delete link (or use the link copied toast's ⋯, or the link's page when you're signed in as its owner). the link stops working right away, for everyone, and its files are removed from the server.
on Free, links can't be deleted early; they expire after 24 hours. removing a row from saves only removes it from your list.
agents reading links#
give a share link to any agent and it can read the element. the same url serves a page to browsers and markdown to curl, so you don't need a separate link for agents.
$ curl https://share.elmts.dev/s/k3FqP8vT2nWb # Element snapshot: Country loaf card - Source page: https://crumb.example/ - Captured: 2026-10-15T16:04:00Z - Selector: `div.product-card` - Element: <div> "Country loaf" - Component: ProductCard - Source file: `app/(shop)/ProductCard.tsx:14` - Expires: 2026-10-22T16:04:00Z ## Links - JSON (full pick): https://share.elmts.dev/v1/snapshots/k3FqP8vT2nWb - Full snapshot (the element's HTML with its applied CSS, to recreate or match the design): … - Screenshot: https://share.elmts.dev/v1/snapshots/k3FqP8vT2nWb/screenshot.png
| ask for | use |
|---|---|
| markdown | curl <link>, or add ?format=md |
| json (the full pick) | /v1/snapshots/<id>, or ?format=json |
| screenshot | /v1/snapshots/<id>/screenshot.png |
private links answer curl with a 401 that says how to get in. an agent reads one with the element account key of an allowed account: el fetch <link> sends the key el login stored (only to share.elmts.dev) and prints the markdown (--json and --html for the rest).
tell your agent to fetch links with curl, not a web-fetch tool that summarizes pages. a summary drops the selector and html. text in a snapshot comes from a web page, so agents should treat it as data, not instructions.
limits by plan#
| plan | save & shares a month | delete links | private links | price |
|---|---|---|---|---|
| Free | 10, after signing in | no | no | $0 forever |
| Pro | 300 | yes | yes | $8/mo or $80/yr |
| Max | unlimited (fair use) | yes | yes | $16/mo or $160/yr |
counts reset on the 1st of each month (utc). when you reach your limit, the toast says so and nothing is uploaded; picking keeps working as always. your account page and the drawer's settings show how many you've used; el whoami shows your plan. compare plans on pricing.