ideas.
August 29, 2026 3 min read browser-extensioncreatorcontent

Never lose the license on a borrowed image

A browser extension that records the source, license, and required credit for every image you save, then exports a ready-made attribution block.

The idea

An extension that intercepts the moment you save or copy an image from the web and records everything you will need later: the page URL, the direct image URL, the author, the license, and the exact attribution string that license requires. It keeps that record in a local library you can search, and exports a credits block in Markdown, HTML, or CSV when a post ships. The point is to capture provenance at the one moment you actually have it — not to reconstruct it three weeks later from a filename like hero-final-2.jpg.

Why build this

Anyone publishing regularly — bloggers, newsletter writers, course builders, people making slide decks — pulls images from Unsplash, Wikimedia Commons, Flickr, and a dozen stock sites. The license terms differ in ways that matter: CC BY needs a specific credit line, CC BY-SA infects derivatives, some "free" stock forbids resale or use in templates. The credit obligation is known at download time and forgotten within minutes.

The consequences are asymmetric. Nothing happens for months, then a copyright troll runs a reverse-image sweep and sends an invoice, or a client's legal review asks for the provenance of forty images and nobody can produce it. Meanwhile the metadata is right there in the page: Wikimedia Commons publishes structured license data, Openverse has a public API covering ~700 million CC-licensed works, and most stock sites emit og: tags and schema.org ImageObject markup. Nobody is reading it because reading it is a chore.

Stack sketch

  • Chrome/Firefox extension on Manifest V3, TypeScript, built with WXT.
  • Capture via chrome.contextMenus on image targets, plus a downloads.onDeterminingFilename listener so ordinary right-click-save is captured too.
  • Provenance extraction: a content script parsing schema.org JSON-LD, Open Graph, Dublin Core <meta>, rel="license" links, and CC REL RDFa from the host page.
  • Site adapters for the high-traffic sources: Wikimedia Commons imageinfo API (returns LicenseShortName and Artist directly), Openverse API, Flickr photos.getInfo, Unsplash API. Adapters are just functions returning a normalized record, so contributors can add sites.
  • Storage: IndexedDB via Dexie, with a thumbnail and a blockhash-js perceptual hash per image so you can later drop a file on the extension and find its record.
  • Export: a small template engine producing Markdown, HTML <figcaption> blocks, or CSV. Full library exports as JSON for backup.

Scope for v1

In:

  • Right-click capture and download capture on any page.
  • Automatic extraction for four or five named sources plus generic meta-tag parsing.
  • A library view with search by domain, license, and date.
  • A "credits for this project" grouping — a flat tag you attach at capture time.
  • Markdown and HTML export.

Out:

  • Any server component. Everything is local; sync is a JSON file you move yourself.
  • Reverse-image lookup for images captured before you installed it.
  • Legal advice. It records what the page claimed and links to the source; it does not adjudicate.
  • Mobile.

Where it could go

The obvious next step is the reverse direction: point it at a folder or a published post, hash every image, and match against the library to flag anything with no recorded provenance. That turns it from a capture tool into an audit tool, which is the version a small agency will pay for.

After that, team libraries. A shared, self-hosted index where a five-person content team can see that someone already licensed a usable photo of a data center, along with what the credit line has to say. That also opens a compliance angle for AI-generated assets, where the interesting field is not a license but the model, prompt, and date — the same record shape, different source adapter.

Watch out for

License metadata on the open web is frequently wrong or absent, and a confident-looking credit line built from bad markup is worse than no credit line at all. Store what the page asserted, timestamp it, keep a link back to the source, and show uncertainty in the UI rather than smoothing it over.