Quick wins for a faster PC:
Repair Windows errors before they cause bigger problemsFix Now →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Generate an Open Graph image in Express by creating a route that renders an image from validated request data and sends the resulting bytes with an image content type. Express handles the HTTP endpoint; a renderer such as @vercel/og or a pipeline built with sharp creates the pixels. A 1200 × 630 PNG is a documented Open Graph image size for ImageResponse.
How the Express endpoint works
A social crawler fetches the URL in your page’s og:image metadata independently of a user’s browser. Your Express endpoint must therefore be publicly reachable and return an actual image response—not HTML, JSON, or a redirect to a private asset.
- Read and validate supported query parameters, such as a title or theme key.
- Pass those values to an image renderer to create a 1200 × 630 composition.
- Convert the renderer’s result to bytes if needed.
- Set the response content type to PNG and send the bytes.
- Put the absolute, publicly accessible endpoint URL in the page’s
og:imagemetadata.
Express provides the route and response handling. The renderer provides the image. Keeping those jobs separate makes it easier to change the design or output pipeline without changing how your page exposes the image.
Generate a PNG with @vercel/og
@vercel/og uses Satori and Resvg to convert HTML and CSS into PNG, according to Vercel’s Open Graph image generation documentation, updated December 19, 2025. Its layout model supports a constrained CSS subset; use flexbox rather than relying on CSS grid. Check the API reference and runtime support for the version installed in your project because the exact integration syntax can vary.
#1 Best Overall
- Read Before You Buy — No Video Output: These adapters support charging and USB 2.0 data transfer, but cannot transmit video signals. Except for standard USB webcams (which use USB data only), they are not compatible with HDMI/DisplayPort cables, video-capable USB-C hubs, or docking stations with video output.
- Convert USB-A Ports to USB-C: Designed to connect USB-C earphones, cables, flash drives, card readers, and other USB-C accessories to standard USB-A ports. Plug-and-play with no drivers or software required.
- Aluminum Alloy Housing: Built with a sturdy aluminum alloy shell that aids in heat dissipation and protects against daily wear and scratches. Designed to maintain a stable and secure connection.
- Compact & Travel-Friendly: The ultra-compact design allows the adapter to stay plugged into your device without blocking adjacent ports or adding bulk, reducing wear and tear on your original USB ports.
- 12-Month Warranty: Backed by a 12-month manufacturer warranty for peace of mind. Designed to meet strict quality control standards for reliable everyday performance.
The following example uses a JSX element, the shape used in the official examples. Save it in a project configured for JSX and ESM, install compatible versions of Express and @vercel/og, then run it in a supported Node.js runtime:
import express from 'express';
import { ImageResponse } from '@vercel/og';
const app = express();
app.get('/og', async (req, res, next) => {
try {
const rawTitle = req.query.title;
const title = typeof rawTitle === 'string'
? rawTitle.slice(0, 100)
: 'Default title';
const image = new ImageResponse(
(
<div
style={{
display: 'flex',
width: '100%',
height: '100%',
alignItems: 'center',
justifyContent: 'center',
backgroundColor: '#111',
color: '#fff',
fontSize: 60,
padding: 48,
textAlign: 'center',
}}
>
{title}
</div>
),
{ width: 1200, height: 630 }
);
const png = Buffer.from(await image.arrayBuffer());
res.type('png').send(png);
} catch (err) {
next(err);
}
});
app.listen(3000);
The length limit prevents an unbounded title from overflowing the design, but it is not a substitute for validation. If titles can contain user-submitted text, consider whether to reject or normalize unexpected input and how it should be displayed. Add only fields the design needs, and map a theme key to a fixed set of styles rather than accepting arbitrary CSS.
The explicit Buffer.from(await image.arrayBuffer()) conversion makes the image bytes suitable for an Express response. Express’s response API documents that a response body can be a Buffer; res.type('png').send(png) sets an image content type and sends the binary body. Do not serialize the Buffer as JSON.
Set the page’s Open Graph metadata
On each HTML page that should have a preview, include an absolute public URL for the image route. Encode query values when constructing the URL:
Rank #2
- 5-in-1 USB-C Hub: Experience comprehensive connectivity featuring a Power Delivery input, two USB-A 2.0 ports, a USB-A 3.0 port, and an HDMI port. (Note: The USB-C power delivery input port is only for connecting an external wall charger to power your laptop and cannot power peripheral devices.)
- 90W Pass-Through Charging: Achieve optimal charging with 90W pass-through power to your laptop, supported by a total input of 100W, with the hub reserving 10W for operational efficiency. (Note: Wall charger not included.)
- Quick Data Transfers: Accelerate your productivity with rapid data transfers using a high-speed 5Gbps USB 3.0 port and two 480Mbps USB 2.0 ports.
- 4K HDMI Display: Enhance your visual experience with a hub capable of delivering 4K resolution at 30Hz in both mirror and extend modes. Please note that this hub is compatible with MacBook (macOS 12 and newer), Windows 10 and 11, ChromeOS, and laptops equipped with DP Alt Mode and Power Delivery. Note: This device is not compatible with Linux.
- What You Get: Anker USB-C Hub (5-in-1, 4K HDMI), welcome guide, 18-month warranty, and our friendly customer service.
<meta property="og:image" content="https://example.com/og?title=Shipping%20updates">
If you generate metadata in application code, use a URL builder rather than concatenating unescaped input. Keep the endpoint accessible to social crawlers: it should not require a logged-in session or depend on a browser cookie. Confirm the deployed response has Content-Type: image/png.
A stable image URL can be cached as the same image. If the design changes while the URL stays the same, add a version parameter or otherwise change the URL so caches do not continue serving an old composition.
Choose a renderer for the design
Use @vercel/og for HTML-like layouts
Choose @vercel/og when its Satori layout model can express your design and the target runtime supports the installed package. It is suited to compositions made from text, shapes, and a supported subset of CSS. Flexbox is the safer layout choice than CSS grid.
Vercel documents a 500 KB maximum bundle size for @vercel/og. Custom fonts must use supported formats and count toward that limit, so keep font assets lean. Confirm font loading in the deployed runtime rather than assuming a font available on your development machine will be present in production.
The Tool Desk
Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Rank #3
- Sleek 7-in-1 USB-C Hub: Features an HDMI port, two USB-A 3.0 ports, and a USB-C data port, each providing 5Gbps transfer speeds. It also includes a USB-C PD input port for charging up to 100W and dual SD and TF card slots, all in a compact design.
- Flawless 4K@60Hz Video with HDMI: Delivers exceptional clarity and smoothness with its 4K@60Hz HDMI port, making it ideal for high-definition presentations and entertainment. (Note: Only the HDMI port supports video projection; the USB-C port is for data transfer only.)
- Double Up on Efficiency: The two USB-A 3.0 ports and a USB-C port support a fast 5Gbps data rate, significantly boosting your transfer speeds and improving productivity.
- Fast and Reliable 85W Charging: Offers high-capacity, speedy charging for laptops up to 85W, so you spend less time tethered to an outlet and more time being productive.
- What You Get: Anker USB-C Hub (7-in-1), welcome guide, 18-month warranty, and our friendly customer service.
Use sharp for raster operations
For a renderer-independent pipeline, generate an SVG or another intermediate representation, then use sharp for resizing, compositing, format conversion, or Buffer output. Its documented formats include PNG, JPEG, WebP, GIF, and AVIF, and it can return the result with toBuffer(). Add sharp when you need raster manipulation or output conversion; it does not replace the need to create the image composition itself.
Compare the practical constraints
| Consideration | @vercel/og | sharp pipeline |
|---|---|---|
| Runtime and renderer | Uses Satori and Resvg; verify compatibility with the deployed runtime and installed version. | Use a runtime where sharp and its native dependencies are supported. |
| Layout | HTML-like elements with a constrained CSS subset; flexbox is safer than grid. | Depends on the intermediate image or SVG you provide and the transformations you apply. |
| Fonts | Supply supported font formats; custom fonts count toward the documented 500 KB bundle limit. | Font rendering depends on how the source artwork is produced. |
| External images | Confirm the installed version’s handling and runtime access for any external assets. | Load or provide source assets in your pipeline; avoid accepting arbitrary user-provided URLs. |
| Dimensions and format | Set dimensions in ImageResponse; 1200 × 630 is the documented recommended OG-image size. |
Resize and convert to the formats supported by sharp, including PNG, JPEG, and WebP. |
| Bundle and startup | Vercel documents a 500 KB maximum bundle size. Cold-start behavior depends on the deployment environment. | Bundle size and startup behavior depend on the application and deployment environment. |
| Cache controls | Documented ImageResponse cache headers are publicly cacheable and immutable for one year by default. |
Set response caching in your application to match URL stability. |
For a generated image whose content changes with query parameters, do not assume a long-lived immutable cache is appropriate. Vercel documents a default max-age of 31536000 seconds—one year—in ImageResponse cache-control headers. Make the URL versioned when the output should be treated as immutable, or configure caching for the actual update behavior you need.
Secure and operate the route
Validate input and control asset fetching
- Allow only known query parameters, and bound text length before rendering.
- Use a fixed set of themes or layouts instead of passing user input through as styles or markup.
- Avoid fetching arbitrary URLs from query parameters. If images must be fetched, use an allowlist and enforce appropriate size and timeout limits.
- Return a deliberate error for invalid input rather than silently generating a misleading preview.
Keep output and caching predictable
Fix the intended dimensions at 1200 × 630 for the standard composition, and verify the actual deployed response rather than assuming a successful HTTP status means a valid image. Check the content type and open the returned file. For stable output, a stable URL can be cached; when the composition changes, version the URL or adjust cache headers. Avoid publicly immutable caching for a URL whose image is expected to change.
Account for rendering work
Image generation adds CPU and possibly asset-loading work to a request. Keep layouts and fonts focused, avoid unnecessary remote assets, and measure latency and memory use in the runtime where the route will run. Cold-start behavior is deployment-specific; the cited documentation does not establish one universal response time. If requests are expensive or traffic is bursty, use caching where URL semantics permit it and consider generating images asynchronously rather than doing all work on every request.
Free tools Windows power users keep installed
One-click scans. No signup required.
Rank #4
- Dual Converters, Infinite Potential:Includes 2× USB C male to USB A female adapters and 2× USB A male to USB C female adapters. Perfect for a wide range of uses—tablets with Bluetooth keyboards, expand USB ports on macbook, and more. Two different converters for all your daily needs
- Next-Level 10Gbps & 3A Charging: No more slow 480Mbps, this usb to usb c adapter has a transfer speed of up to 10Gbps, allowing you to do more transferring in less time. This usb adapter fits both USB A and USB C charger, supporting up to 3A fast charging
- Upgraded Exquisite Craftsmanship: With an aluminum alloy housing and metal connector, the usbc to usb adapter is extremely durable and sturdy. Rigorously tested to withstand more than 10,000 times of plugging and unplugging, ensuring long-lasting performance
- Broad Compatible: The usb c to usb adapter widely supports all USB C/ USB A devices like laptops, tablets, cellphones, car chargers, and phone chargers. Such as compatible with MacBook Pro/Air 2023/2022, Thunderbolt 4/3 Devices,Apple MagSafe Watch 9/8/7/SE/Ultra, iPad Pro 2022/2021, Samsung Galaxy S23/S20/S10, and iPhone 17/16/15 Pro. Plug and play
- Please Note: To reach 10Gbps speed, keep the cable under 3.3 ft. For USB A Male to USB C adapters, try flipping the USB C connector. USB C Male to USB A adapters support bidirectional 10Gbps transfer within 3.3 ft
Troubleshoot common failures
The route returns an error instead of an image
Check the server logs for renderer exceptions, confirm that the installed @vercel/og version supports the runtime and JSX integration in use, and verify fonts or other assets load in production. Pass failures to Express error handling instead of returning a partial or malformed response.
The response downloads as a file or is treated as text
Inspect the response headers. Use res.type('png').send(png) and send a Buffer containing the PNG bytes. Do not call res.json() for the image body.
The social preview is missing or stale
Check that og:image contains an absolute URL, the route is reachable without a user session, and the endpoint returns an image rather than a login page or application HTML. If a design change is not appearing, use a new versioned URL so an old cached image is not reused.
Text clips or layout looks different than expected
Long titles can exceed the available space. Bound title length, test representative long strings, and use CSS features supported by Satori. Prefer flexbox over grid and verify custom fonts are loaded using supported formats.
Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Fix the driver behind crashes, sound loss and screen glitches3Repair Windows errors before they cause bigger problemsBest Value
- 5-in-1 Connectivity: Equipped with a 4K HDMI port, a 5 Gbps USB-C data port, two 5 Gbps USB-A ports, and a USB C 100W PD-IN port. Note: The USB C 100W PD-IN port supports only charging and does not support data transfer devices such as headphones or speakers.
- Powerful Pass-Through Charging: Supports up to 85W pass-through charging so you can power up your laptop while you use the hub. Note: Pass-through charging requires a charger (not included). Note: To achieve full power for iPad, we recommend using a 45W wall charger.
- Transfer Files in Seconds: Move files to and from your laptop at speeds of up to 5 Gbps via the USB-C and USB-A data ports. Note: The USB C 5Gbps Data port does not support video output.
- HD Display: Connect to the HDMI port to stream or mirror content to an external monitor in resolutions of up to 4K@30Hz. Note: The USB-C ports do not support video output.
- What You Get: Anker 332 USB-C Hub (5-in-1), welcome guide, our worry-free 18-month warranty, and friendly customer service.
The deployed build exceeds its size limit
Review the assets and dependencies included with @vercel/og; Vercel documents a 500 KB maximum bundle size, including custom fonts. Reduce font and asset weight or use a different pipeline if the design cannot fit within the limit.
Or skip the browser setup
If your actual need is to capture a rendered webpage rather than design a custom OG composition, ScreenshotNeo is a website screenshot API and MCP server. A GET request returns a screenshot or PDF, while Express image generation gives you control over a designed card.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
See the ScreenshotNeo API documentation for request options. Cookie and consent banners are accepted before capture, and more than 60 known consent platforms, newsletter popups, and chat widgets can be removed; each step can be turned off. Bot checks, blank pages, failed loads, timeouts, and cache hits are not billed, with verdict and billing information in response headers. An MCP server provides take_screenshot, get_page_info, and capture_pdf for AI agents. The free plan includes 1,000 screenshots a month with no card; paid plans start at $5 for 3,000.
Sign up for 1,000 free screenshots a month, with no card required.
Recommended Free Tools
Frequently Asked Questions
Does Express itself generate the Open Graph image?
No. Express serves the route and response; a renderer such as @vercel/og or a sharp-based pipeline creates the image.
Can a social crawler fetch an image that requires a login?
No. The crawler fetches the og:image URL independently, so the endpoint must be publicly reachable without a browser session.
Can I return JPEG or WebP instead of PNG?
Yes, with a pipeline that produces that format, such as sharp; set the response content type to match the bytes you send.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

