Wynglet
The dynamic companion for your static site: a self-hosted toolkit that brings dynamic capabilities to static websites without depending on paid third-party services.
Static site generators are great at producing fast, secure, cheap-to-host websites. But they have one inherent limitation: theyāre static. Features like social preview images, QR codes, and rating widgets traditionally each require a separate paid SaaS subscription: each with its own account, pricing model, and data silo.
Wynglet bundles all of these into a single containerized open-source binary:
-
OpenGraph Link Previews: Auto-generate OpenGraph social preview images for every page, using your own HTML/CSS templates.
-
QR Codes: Generate and cache QR codes for any authorized URL.
-
Rating Widget: Embed a š/š or ā rating widget on any page via a lightweight
<iframe>.
One instance serves many sites. A single Wynglet deployment can power all your static sites simultaneously. Every tool is gated by a domain allowlist: only explicitly authorized domains can embed or use your instance, preventing unauthorized use.
Self-hosted. Your data stays on your own infrastructure. You can host Wynglet on a cheap VPS from any provider (hereās $200 in credits with a DigitalOcean referral code). No vendor lock-in, no per-request billing, no privacy trade-offs.
Open source. Apache 2.0 licensed, free forever.
Open Graph Link Previews
Wynglet is a quick way to auto-generate OpenGraph link preview images in bulk for all your sites, without the use of a separate template editor or API integration at no cost. The source of truth for the image data & design remains within your primary website, so you can use tools you are already familiar with & assets that
To prevent abuse and to conserve resources, Wynglet blocks all domains by default, until you explicitly authorize each domain you care about.
Use the Default Template
Just one step: Paste the Wynglet <meta> tag into the original page, and youāre done!
<meta property="og:image" content="https://wynglet.your-server.com/link-previews/v1?url=your-site.com/some/page">
Use your Own Templates
-
Create a new hidden element inside your existing Web page, using whatever framework or template engine you use today. E.g.
<div id="link-preview" style="display: none; width: 1200px;"> <h1>Wynglet</h1> <p>Self-hosted OpenGraph / social link preview image generation tool. Fully customizable, yet works out of the box with zero configuration.</p> </div> -
Use Wynglet to craft a URL, and paste the
<meta>tag into the original page.<meta property="og:image" content="https://wynglet.your-server.com/link-previews/v1?url=your-site.com/some/page">If you canāt use the default selector (
#link-preview) for any reason, you can provide an alternate one using the&sel=parameter. -
There is no step 3.
How itās rendered

Test your Wynglet installation by posting your original page URL to any social platform.
How it works
Wynglet fetches the URL you provide to it, using a Chrome Headless instance, runs JavaScript to un-hide the hidden element, takes a screenshot of it, and serves it (while also caching & compressing it).
Wynglet works well with static sites (using any static site generator) as well as dynamically-generated sites (using any CMS or platform).
Can I useā¦
- Images? Yes.
- SVG backgrounds? Also, yes.
- Flexbox? Grid? Yes, of course.
- Custom fonts? Proprietary fonts? Absolutely.
Why limit yourself to the customization possible in a random WYSIWYG editor, when you have the entire Web platform available to you!
Anything you can design for the Web, you can use to create a link preview image. The infinite is possible at Zombocom. The unattainable is unknown at Zombocom.
QR Codes
Wynglet generates QR Codes for your authorized URLs that you can embed on your site wherever appropriate.
Use this URL format:
<img src="https://wynglet.your-server.com/qrcode/v1?url=your-site.com/some/page">
Rating Widget
Wynglet includes an embeddable rating widget that your visitors can use to rate any page on your site. Ratings are not public, but are visible on your Wynglet Dashboard. It provides a lightweight mechanism to monitor the quality of content, e.g. for Help Articles. It supports two UI styles:
- Thumbs (
ui=thumbs): š / š buttons (default) - Stars (
ui=stars): ā 1ā5 star rating
Embed the widget on your page using an <iframe>:
<iframe
src="https://wynglet.your-server.com/rating/v1?ui=thumbs&url=https://your-site.com/some/page"
style="border:none; width:200px; height:50px;">
</iframe>
Ratings are validated against the authorized domains allowlist. To prevent abuse, a single IP is limited to submitting one rating for a URL per 24 hours, and 10 ratings across all URLs per hour).
Use the Dashboardās Ratings section to view collected ratings and generate the correct <iframe> embed code for any authorized URL.
CLI Utilities
Wynglet ships with a couple of built-in command-line helpers:
-
Generate a bcrypt password hash (for use in
wynglet.yml):Enter your desired password when prompted. The output hash can be pasted directly into the
dashboard.passwordfield.wynglet --bcrypt -
Health check (useful for container health checks):
Pings the running service and exits
0on success or1on failure.wynglet --healthcheck
Install & Deploy
-
We strongly recommend deploying using the official container image, which includes Chrome Headless for convenience.
- Thanks to the chromedp project for making this possible!
-
Wynglet is designed to be used behind a TLS reverse proxy for SSL termination (among other things).
- We recommend Caddy; see sample Caddyfile below.
- If you expect a lot of traffic, consider putting a CDN in front.
Sample compose.yml (for Docker and Podman)
services:
wynglet:
container_name: wynglet
image: ghcr.io/chimbori/wynglet:latest
volumes:
- $PWD/wynglet-data:/data
restart: unless-stopped
depends_on:
- wynglet-db
wynglet-db:
container_name: wynglet-db
image: postgres:18-alpine
environment:
POSTGRES_DB: wynglet
POSTGRES_USER: chimbori
POSTGRES_PASSWORD: chimbori
volumes:
- $PWD/wynglet-db-data:/var/lib/postgresql
restart: unless-stopped
volumes:
wynglet-data:
wynglet-db-data:
If you prefer to install using the Go binary on raw metal, use go install
go install wynglet.chimbori.dev@latest
Sample wynglet.yml
Wynglet requires basic configuration to be provided via a config file.
-
PostgreSQL Database URL (required)
database: url: postgresql://chimbori:chimbori@wynglet-db:5432/wynglet -
Dashboard credentials (encrypted via
bcrypt) (required)dashboard: username: admin password: "$2a$10$a8LnUkK1UiB.9yQrUp3wyuGsH1AAHhlHVy1cjIaaIUVAwCtGvaX7q" # "test" -
Web config (optional)
Assuming thereās a reverse proxy in front of Wynglet, there should be no need to change the port here; just configure the reverse proxy to forward requests to port 9999.
web: port: 9999 -
Link Previews config (optional)
Configure Cache TTL if needed for testing (e.g. set to a low value like
1m).link-previews: screenshot: timeout: 20s sitemap: concurrent_urls: 4 # Number of URLs processed in parallel during sitemap import max_urls: 1000 # Maximum URLs fetched from a sitemap cache: ttl: 720h0m0s max_size_bytes: 1073741824 -
QR Codes config (optional)
Configure Cache TTL if needed for testing (e.g. set to a low value like
1m).qr-codes: cache: ttl: 720h0m0s max_size_bytes: 1073741824 -
Ratings config (optional)
ratings: retention: 8760h # How long to keep rating data (default: 365 days) -
Logs config (optional)
logs: retention: 720h # How long to keep error logs (default: 30 days) pagination: limit: 10 -
Dashboard pagination (optional)
dashboard: pagination: limit: 10 -
Debug Mode (optional)
Turn on additional logging in Debug Mode. Debug mode can also be toggled per-domain from within the Dashboard UI.
debug: true
Sample Caddyfile
wynglet.your-server.com {
reverse_proxy wynglet:9999
encode zstd gzip
}
Dashboard UI
You can manage Wynglet from the Dashboard UI at https://wynglet.your-server.com/dashboard.
The Dashboard is available as an installable PWA (Progressive Web Application) that can be “installed” locally using any modern browser.
The Dashboard includes the following sections:
-
Link Previews: Browse all generated link preview images, delete individual ones, view access statistics, and inspect a breakdown of user agents (social platforms, bots, etc.) that have requested them.
- Sitemap Import: Bulk pre-generate link previews for an entire site by importing a sitemap URL. The import runs concurrently in the background; you can monitor progress or cancel it at any time.
-
QR Codes: Browse and delete generated QR codes.
-
Ratings: View collected ratings for any authorized URL. Use the built-in embed builder to generate ready-to-paste
<iframe>code for your pages. -
Domains: Manage the authorized domains allowlist. Add or remove domains and toggle per-domain debug mode.
-
Logs: View recent error-level log entries.
License
This project is licensed under the Apache License 2.0.
Comparison with Alternatives
There are a lot of paid SaaS tools in this space.
- BannerBear
- RenderForm
- Templated.io
- Imejis.io
- Pablle
- Orshot
- Abyssale
They all work roughly the same way: you design a template using their custom tools, then provide them your data (title, description, etc.), and pay them per-request (or per-render) to create & serve those images for you.
This model works great if you do not have access to the source of the page, or have no influence over the developers who build your website.
But now,
- Youāve got to learn a whole new tool.
- That tool exposes a certain amount of design expressiveness, but nowhere near what the Web platform offers natively.
- Anytime you need to change the preview image, you have to visit a completely separate website.
- Anytime your own webpage changes, you have to remember to update the templates to match the theme.
- Thereās no way to share themes between your website & these third-party tools: colors, gradients, logos must be copy/pasted manually.
- You have to rely on these companies being around long enough, and not disappearing completely after running out of money or being bought over by a VC.
- And you have to pay, based on volume.
Wynglet is none of those things. All you need is the ability to write some HTML/CSS (no JavaScript necessary!) to design your preview image. And itās free in perpetuity.