embisto

Open source · MIT · written in Go

Every link your users paste, shown as a card.

Before

Messengers show a card like this under a link. If you build a chat, a feed or a CMS, embisto makes those cards for your app, on your own server, so the links your users share stay private: no outside service sees them.

See the card your app would draw

Paste a link. This page asks a real embisto server and draws its one answer in the layouts an app would build from it.

The live demo runs in the browser. Without it, ask the API directly: curl 'https://api.embisto.com/v1/preview?url=https://github.com'

Why embisto

Link previews are table stakes in a chat or a feed. Renting them from a cloud service should not be.

Self-hosted

Runs in your own cluster. The links your users share never pass through a third-party preview service.

One binary

A static Go binary or a distroless image. The cache lives in memory: no database, no Node, no browser to babysit.

Also a Go library

The server is a thin wrapper over the public API. Import the same extractor into your own service and skip the network hop.

Iframely-compatible

/iframely and /oembed answer in Iframely's format, so clients move over by changing one address. How close it is.

Made for mobile cards

Every image comes with its width and height. Your app reserves the space up front and the feed never jumps.

Safe by default

It fetches links strangers paste, so SSRF protection and size and time limits are built in, not bolted on. How.

URL in, card out

embisto reads every source a page offers and merges them by a fixed priority, so a card is complete even when a site gets one format wrong.

title, description
from oEmbed, Open Graph, JSON-LD, Twitter Cards or plain HTML
image
URL with width and height, read from the first bytes of the file when the page does not say, and thumbnails embisto resizes and serves itself
icon, site_name
how the site names and draws itself
video, embed
the player and the provider's oEmbed HTML, when it offers one
author, published_at
the byline, for articles and posts
links, sources
every resource found, and which sources filled the card

Quickstart

Start the image, ask for a card. Configuration is a handful of environment variables; nothing else needs to run beside it.

API reference
  • GET /v1/preview?url=the card, as JSON or plain text
  • GET /iframely?url=Iframely's format
  • GET /oembed?url=oEmbed's format
  • GET /healthz, /readyzprobes for Kubernetes
  • GET :9090/metricsPrometheus
docker run -p 8080:8080 ghcr.io/pantafive/embisto:latest

curl 'localhost:8080/v1/preview?url=https://github.com'

Try the hosted API

The same API answers at api.embisto.com, free and without a key, so you can try it before you deploy, with 60 requests a minute per IP address; it runs on a best-effort basis, with no uptime promise. For production, run your own. Every route is in the API reference.

curl 'https://api.embisto.com/v1/preview?url=https%3A%2F%2Fgithub.com'

Compared with the others

Iframely, Embedly, Microlink and OpenGraph.io do more out of the box in places. Each comparison says where.