# Year in review images: a personal recap card for every user, in every size

> Give every user their own year-in-review image, Wrapped-style: the template's fields, story and square sizes, signed URLs or a batch, timing and privacy.

Published 2026-11-08 · https://shareglint.com/en/guides/year-in-review-images

Every December, apps send their users a "your year with us" recap: the number that matters, a few stats, a top three. The format works because people share it, and it is shared as an image — to stories, to feeds, in group chats. Making one picture for millions of users is a data job plus one image per user. This page shows that image part with our year-in-review template, the sizes and render times we measured, and the delivery options, with a note on what not to put in it.

**How we measured.** On 2026-11-08 we rendered the `year-in-review` template through our API on our development stack for one example user ("Ada Example", 12,480 images rendered — example numbers) in three sizes and two formats, and checked the pictures by eye.

## The card

```bash
curl -X POST "https://shareglint.com/v1/images?wait=true" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"template": "year-in-review", "size": "story", "modifications": {
        "headline_value": "12,480",
        "headline_label": "images rendered",
        "period": "2026",
        "user_name": "Ada Example",
        "stats": "Templates used|14; Busiest month|October; Longest streak|23 days; Formats|PNG, WebP, MP4",
        "top_1": "blog-og", "top_2": "quote-og", "top_3": "event-ticket",
        "app_name": "Northwind"}}'
```

The fields:

- `headline_value` and `headline_label`: the one big number and what it counts.
- `period`: the year, set on its side in the accent band (across the top on tall sizes).
- `stats`: up to **four** capsules, written `Label|value` and separated by semicolons or new lines. We sent five; the fifth was left out.
- `top_1`–`top_3` with `top_1_image`–`top_3_image`: a numbered top three. Only named items are drawn, and an item without a picture gets a tile with its first letter.
- `user_name`, `app_name`, `logo`, and the shared `accent` colour for your brand.

## Sizes and times

| Request | Picture | Time | File |
|---|---|---|---|
| `"size": "story"` | 2160×3840 | 2.31 s | 984 KB PNG |
| `"size": "square"` | 2160×2160 | 2.31 s | 868 KB PNG |
| Default (1200×630 at 2×) | 2400×1260 | 1.89 s | 485 KB PNG |
| Default, `"format": "jpeg"` | 2400×1260 | 1.78 s | 147 KB JPEG |

One template covers the three places a recap goes: the story (where most sharing happens), a square for feed posts, and the wide card for link previews and emails. On the tall story frame the year band moves from the left edge to the top. JPEG was a third of the PNG's size for the same picture; use it for email.

## Delivering one card per user

**In the app, on demand: a signed URL.** Put the user's fields into a signed `/i/` URL on your server and show it in the recap screen. The first view renders the card; later views, and the platforms that fetch it when the user shares the link, get the stored file ([signed image URLs](https://shareglint.com/en/guides/signed-image-urls)). Nothing is rendered for users who never open the recap.

**Before a campaign: a batch.** For an email to everyone, render all cards ahead with `POST /v1/batches`: one template, a row per user (JSON, a CSV file or a Google Sheets link), and the sizes you want; the result is the image URLs per row and a ZIP. Rows per batch by plan: Free 50, Starter 500, Pro 1,000, Scale 2,000, Business 5,000. Then put each user's URL into your mailing tool's contact field ([Mailchimp step by step](https://shareglint.com/en/guides/mailchimp-personalized-images)).

**Share buttons.** On mobile, the system share sheet lets the user post the story image directly to the app of their choice. On the web that is the [Web Share API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Share_API): fetch the story image, wrap it in a `File`, and pass it to `navigator.share({ files: [file] })`. Check first with [`navigator.canShare()`](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/canShare), which "returns true if the equivalent call to navigator.share() would succeed" — desktop browsers often cannot share files, so keep a download button as the fallback. Native apps have their own share sheets. Give the story size to the share sheet, and the wide card as the link preview of the user's recap page.

**Alt text.** A recap image is all text and numbers. Wherever you show it, put the same facts in its `alt` ("Ada Example's 2026: 12,480 images rendered, 14 templates, busiest month October"), so screen-reader users get the recap too and so it still makes sense when images are blocked in email.

## Timing

Many of the best-known recaps appear in early December, so yours competes with them for attention. Work backwards: data frozen at the end of November, cards rendered in a batch in the first days of December, emails and in-app banners after that. Rendering on first view spreads the load by itself; a batch puts it where you choose. Each card is one render of the quota per size; the same fields again come from cache without a new render ([pricing](https://shareglint.com/en/pricing)).

## Privacy: what goes into the card

A recap is meant to be shared, so design it as something the user would post: activity counts, favourites, streaks. Leave out anything they might not want public — balances, health data, locations, other people's names without their consent. Two technical points:

- **Signed URLs are readable.** The signature stops anyone from changing the fields, but the fields are in the URL in plain text. Anyone the link reaches — and logs on the way — can read them. For anything sensitive, render server-side and hand the user the finished image only.
- **The image URL is public.** A rendered file sits behind a long, unguessable address, but anyone who has that address can open it. Treat it like a share link.

## Other templates for the same job

- `app-share-achievement`: one activity with a few metrics and a streak — a monthly recap or a milestone ("100 days in a row").
- `metrics-grid`: four numbers with their deltas, for a team's or a company's year rather than a person's.

For the email side of a recap (one image per contact, merge tags, testing), see [personalized email images](https://shareglint.com/en/use-cases/personalized-email-images); for story sizes per network, [Instagram stories](https://shareglint.com/en/use-cases/instagram-stories) and [social media image sizes](https://shareglint.com/en/social-media-image-sizes).

## FAQ

### How do I make a personalized year in review image for each user?

Fill one template with each user's numbers. Our year-in-review template takes a big headline number, up to four stats, the user's name, the year and a top three; send the fields per user through the API, a batch, or a signed URL in your app, and every user gets their own card in the sizes you need.

### What size should a year in review image be?

Recaps are shared mostly to stories, so make a 1080×1920 story version first (2160×3840 at 2×), then a square one for feeds and a 1200×630 one for link previews and emails. One template renders all three; the layout turns the year band from the side to the top on tall frames.

### Is it safe to put user stats in an image URL?

Only stats the user would share anyway. A signed URL carries the fields in plain text, so anyone with the link — and any log on the way — can read them. Keep private data out of the URL, or render server-side and only give the user the finished image when they choose to share it.
