embisto
  1. Home
  2. FAQ

Frequently asked questions

Short answers to what people ask when they look for a way to show link previews.

What is a self-hosted alternative to Iframely?

embisto is an open-source (MIT) link preview service written in Go that you run in your own infrastructure. It answers /iframely and /oembed in the formats of Iframely's API, so an Iframely client switches by changing the base URL. Iframely itself also has an open-source, self-hostable edition in Node.js with a larger set of site plugins; embisto's case is a single static binary, a Go library, and image sizes on every card. See the comparison with Iframely.

One that returns image dimensions, so the app can reserve the picture's box before it loads and the feed does not jump. embisto returns width and height for the image and icon, measuring them from the first bytes of the file when the page does not state them, plus title, description, site name, author, date, video and embed HTML in one JSON object. Try it on the hosted API.

Is there an oEmbed proxy written in Go?

Yes: embisto discovers a page's oEmbed endpoint, ships the oembed.com provider list inside the binary, and answers GET /oembed?url= in oEmbed format. It also merges oEmbed with Open Graph, JSON-LD, Twitter Cards and plain HTML, so pages without oEmbed still get a full card. It runs as a server or as a Go library.

How do I unfurl URLs safely, without SSRF?

Check the resolved IP address at connect time, for every redirect, and refuse loopback, private, link-local (cloud metadata), CGNAT, multicast and reserved ranges; checking the hostname before the request is not enough, because DNS rebinding and redirects get past it. Cap the body size, the total time and the number of redirects, and ignore proxy environment variables. embisto's fetcher does all of this by default: 5 MiB bodies, 5 seconds per preview. Details are in the docs.

Can embisto proxy and resize preview images?

Yes: embisto makes thumbnails. With an image key set, every picture in a card comes with variants: signed URLs under the server's own /i/ path, resized to a 160×160 thumbnail, a 600-wide card and a 1200-wide large size. Clients then load small pictures from the embisto server instead of the original site, which never sees their address.

Does embisto need a database, Redis or Node.js?

No. It is one static binary: the cache lives in memory, and identical requests in flight share one fetch. Several instances can share one cache through EMBISTO_CACHE_URL, a Redis-compatible server, which stays optional.

Can I use embisto as a Go library instead of a server?

Yes. The server is a thin layer over the library's public API: embisto.New(embisto.Defaults()), then Extract(ctx, card.Request{URL: …}), which gives a card.Result: the preview and how long it may be kept. The cache package wraps the core in a cache, in memory or shared through Redis. Site providers and output formats are interfaces in the card package, so you can add your own.

Which sites does embisto support?

Any page with Open Graph, Twitter Cards, JSON-LD, oEmbed or plain HTML metadata, every provider on the oembed.com list, and X posts through X's oEmbed endpoint. Dedicated plugins for the most-shared sites are planned; Iframely has more of them today.

Does embisto render JavaScript-heavy pages?

Not yet. It reads the HTML a server returns, which covers sites with server-side rendering and those with oEmbed. An optional headless browser for the rest is planned.

Is embisto free?

Yes. The software is MIT-licensed, and the hosted API at api.embisto.com is free with 60 requests a minute per IP address, on a best-effort basis. For production, run your own server.

How do I move from Iframely or Embedly?

From Iframely's API: point the client at embisto's /iframely or /oembed. embisto has no keys and ignores Iframely's api_key and key parameters, so the client needs no other change. From Embedly or another service: call /v1/preview and map its fields, listed in the docs.