itteco/iframely: Self-Hosted URL Metadata and Embed Engine
The URL engine behind Iframely. Self-hosted parsers that turn links into metadata, previews and embeds.
At a glance
- What is it?
- Iframely is a JavaScript URL engine for turning links into metadata, previews, and provider-specific embeds. It fits teams that need self-hosted parsing with domain plugins, generic metadata parsers, and an HTTP API.
- Who is it for?
- Adopt itteco/iframely when you need a controllable URL parsing service and can operate Node.js, Docker, plugins, and an allowlist. Do not treat it as the complete Iframely cloud product, because hosted iframe rendering and several cloud-only options are absent.
- Can I use it commercially?
- Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
- Is it still maintained?
- Yes. The repository last received commits 3 days ago.
- What is it written in?
- Mainly JavaScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 7, 2026, and from our analysis. They are not legal advice.
Star history
- itteco/iframely1,655 ★ · +4
| Repository | 2026-10-16 | 2026-11-07 |
|---|---|---|
| itteco/iframely | 1.7k | 1.7k |
4 Stars in the last 22 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
What Iframely URL parsing solves
Iframely accepts a URL and returns structured information about the linked page. The documented fields include title, description, thumbnails, author, and canonical URL. Depending on the provider and the engine configuration, the response may also include embed HTML for videos, posts, maps, and slideshows. That makes it useful for link previews in publishing systems, messaging interfaces, content management products, and applications that need a normalized representation of web links.
The repository is the engine behind the Iframely service, not the complete cloud platform. Its intended audience is operators who want to self-host URL processing rather than send link analysis requests to the hosted service. The README describes the engine as having powered Iframely in production since 2013, but it does not document a hosted service-level agreement, throughput guarantee, or deployment SLA for this repository. Those are separate operational questions.
The engine is primarily written in JavaScript and requires Node.js 20.19.3 or later according to the getting-started instructions. The repository includes an Express server, parser libraries, plugin directories, a Dockerfile, and a docker-compose.yml file. It also exposes a visual debugger at `/debug`, which is useful when a provider returns unexpected metadata or when deciding whether a custom plugin is needed.
Domain plugins and generic metadata parsers
Iframely uses two parser categories. Provider-specific domain plugins live in `/plugins/domains`. The README names YouTube and Google Maps as examples of providers handled by these plugins. A domain plugin can produce richer provider-specific results because it knows how that service structures its pages or responses.
Generic parsers handle standards-based page metadata, including oEmbed, Open Graph, Twitter Cards, and JSON-LD. These parsers are useful when no dedicated domain plugin covers a URL. However, the engine places a boundary around rich media embeds. According to the README, generic parsers return rich media embeds only for providers on the allowlist. Other URLs can still return metadata and thumbnails when those values are available.
That allowlist is maintained for both open-source and cloud versions and is synced to an instance by default. Operators can replace it with their own allowlist using the format documented by the Iframely site. This is an important design choice for a self-hosted deployment. A provider may be readable for basic metadata while still being excluded from generated rich media embeds, so an apparently successful URL lookup does not guarantee an embed response.
The cloud service has private plugins that are not included in this repository. The open-source engine also allows operators to write additional plugins. That creates an extension path, but it also means provider coverage is partly an operational responsibility.
Iframely API and oEmbed endpoints
The engine exposes two HTTP endpoints. Both accept a `url` query parameter and return JSON. The main endpoint is `{your.server}/iframely?url=`, which returns the Iframely format. The README describes that format as resembling the `<head>` of a page, with a `meta` object for data and a `links` object for media.
The second endpoint is `{your.server}/oembed?url=`. It returns a simplified oEmbed representation of the same parsed data. The README calls this an adapter, so both endpoints are backed by the same parsing work rather than separate extraction pipelines. This is useful for clients already expecting oEmbed, while the native format exposes more of Iframely's metadata and link relationships.
The response can contain metadata even when an embed is unavailable. For example, a URL outside the generic parser allowlist may still yield a title, description, or thumbnail. Clients should therefore distinguish between successful metadata extraction and successful media embed generation. The documentation links to separate pages for link relationships and meta semantics, which are the appropriate references when designing a client around the response shape.
The repository also includes a debugger route at `{your.server}/debug`. The README does not document authentication, rate limits, caching controls, request size limits, or the full set of configuration keys, so those details should be checked in the hosting documentation before exposing the service.
Installing the Docker deployment
The repository includes a Docker Compose service named `api`, builds from the repository `Dockerfile`, and publishes container port 8061 on host port 8061. The Dockerfile uses `node:22-alpine`, enables Corepack, copies the package metadata and patches, installs production dependencies with pnpm, and then runs the application as a non-root user.
The README directs new operators to the install and configuration guide at `https://iframely.com/docs/host`. The repository also provides `config.local.js.SAMPLE`. The Docker build creates `config.local.js` if it does not exist, and the Compose container is named `iframely`. Because the README does not include a complete local configuration tutorial, the following is the reproducible container build command available in the repository's Makefile:
docker \
build \
--pull \
--rm --tag=iframely .This command builds the local image with the tag `iframely`. The Makefile's `run` target expects a local `config.local.js` mounted at `/iframely/config.local.js`, so configuration is part of deployment rather than an optional afterthought. The Compose file exposes port `8061`, while the Makefile uses the same port for container and host publication.
The repository does not document a one-command first API request. Once the server is running and configured, the first use is to send a target URL to `{your.server}/iframely?url=` or `{your.server}/oembed?url=`. The `/debug` page provides a visual route for inspecting the result.
Cloud features absent from the self-hosted engine
The open-source engine and the Iframely cloud Preview APIs use the same parsers and the same allowlist, according to the README. With the default allowlist, the documentation says coverage is almost the same, apart from private plugins. That makes the repository a plausible choice when the goal is to retain control over URL parsing and keep the processing service self-hosted.
The cloud adds hosted iframe rendering in the `html` field, including preview cards, GIF support, player events, and AMP. It also adds per-URL options, predictive sizing to reduce layout shift, lazy loading, and media allowlists by type. The Data API adds entities, excerpts, and full text where the provider permits it. These are not equivalent features of the open-source repository, so a migration from cloud expectations should account for the missing hosted rendering and data extraction layers.
The repository's `package.json` declares dependencies for HTML parsing, HTTP retrieval, image sizing, caches, Redis, Memcached, clustering, and Markdown processing. Those dependencies indicate several possible deployment concerns, including outbound URL fetching, caching, and media metadata. The README does not specify which services are mandatory for a minimal installation, so an operator should follow the host configuration guide rather than infer a complete production topology from the Compose file alone.
Operational limits and provider failure cases
The clearest limitation is the difference between metadata and embeds. Generic parsers can return useful page data without being allowed to return rich media HTML. If a provider is not represented by a domain plugin and is not covered by the relevant allowlist, an embed-oriented client may receive an incomplete result. A client that assumes every URL has an `html` field will therefore fail or render an empty preview.
Provider pages also change over time. Domain plugins depend on provider behavior, while generic parsers depend on published metadata conventions. The README does not claim that every provider is permanently supported, and it does not document a compatibility matrix for individual domains. Private cloud plugins cannot be inspected from this repository, so exact cloud coverage cannot be inferred from the open-source directory.
Deployment adds another set of boundaries. Outbound fetching can be affected by network access, provider availability, redirects, and page restrictions. The README does not document retry policy, timeout defaults, SSRF protections, caching policy, or how failed provider requests appear in JSON. Those implementation and security properties must be verified in the source and hosting documentation before Internet-facing deployment.
A real alternative is to use a provider's own oEmbed endpoint or a smaller metadata extraction service. That approach may be simpler for one or two known providers and can avoid maintaining custom plugins. Iframely is more appropriate when one application must normalize many providers and needs a shared domain-plus-generic parser model.
Maintenance, upgrades, and licensing
The repository is not archived, and its last push was on 2026-10-14. The listed recent release is `v2.4.3`, dated 2024-07-31. The repository's default branch is `dev`, while the README says contributions should target `develop` and that changes land there before `master`. That branch naming difference is worth checking before preparing a local fork or deployment branch.
The package metadata identifies version `2.6.0` and declares the package as ES modules through `"type": "module"`. Upgrades therefore involve more than changing an application setting. A self-hosted operator needs to review Node.js compatibility, pnpm lockfile changes, Docker base-image changes, plugin changes, configuration changes, and migration notes. The README links to migration steps for versions before 2.0.0, but it does not provide an upgrade procedure for the current release line.
The README states that contributions are under the MIT license, and `package.json` declares `"license": "MIT"`. The repository also contains a `LICENSE` file. Operators should read that file and account for provider-specific terms, third-party media rights, and the legal implications of displaying returned embeds. This review concerns project licensing only, not the permissions granted by individual content providers.
Editorial conclusion
Adopt itteco/iframely when you need a controllable URL parsing service and can operate Node.js, Docker, plugins, and an allowlist. Do not treat it as the complete Iframely cloud product, because hosted iframe rendering and several cloud-only options are absent. Verify first that your target providers have the required domain plugin or publish metadata that the generic parsers understand.
Frequently asked questions
What does itteco/iframely do?
Itteco/iframely is a self-hosted URL engine that turns links into metadata, previews, and, where permitted, embed HTML. It uses provider-specific domain plugins plus generic parsers for standards such as oEmbed, Open Graph, Twitter Cards, and JSON-LD.
How do I install itteco/iframely?
The README requires Node.js 20.19.3 or later and directs operators to the Iframely host configuration guide. The repository also includes a Dockerfile and docker-compose.yml, with the service exposing port 8061.
Does itteco/iframely include the Iframely cloud features?
No. The open-source engine does not include the cloud-only hosted iframe rendering, per-URL options, predictive sizing, lazy loading, Data API, or private plugins described in the README.
Can itteco/iframely create an embed for every URL?
No. Generic parsers return rich media embeds only for providers on the allowlist. Other URLs can still return metadata and thumbnails when available.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/itteco-iframely)Star history chart for your README
[](https://hysenlabs.com/projects/itteco-iframely)Was this useful?