← Back
btahir

btahir/shotcandy

Free, open-source screenshot beautifier that runs in your browser. Backgrounds, device frames, batch export, multi-screen mockups, code images, App Store sets and screen recordings. Nothing uploaded.

View on GitHub ↗https://shotcandy.app ↗
app-store-screenshotsbrowser-mockupcarbon-alternativecode-screenshotcode-to-imagedesign-toolsdevice-mockupimage-editormockup-generatornextjsog-image-generatorprivacyscreen-recordingscreenshotscreenshot-beautifierscreenshot-editorscreenshot-toolsocial-media-imageswebcodecsxnapper-alternative
Stars
34
Forks
2
Watchers
34
Open issues
0
Contributors
1
Language
TypeScript
License
MIT License
Default branch
main
Created Sep 26, 2026Updated Oct 1, 2026

Star growth

Today—
This week—
This month—

Star history will appear here once this repo has been tracked for a couple of days.

README

Shotcandy logo

Shotcandy

A free, open-source screenshot beautifier and mockup maker that runs in your browser.

Shotcandy turns a plain screenshot or screen recording into a share-ready image or video in seconds.
Style one screenshot or a hundred, or put several in one mockup. No account, no upload, no watermark.

Open the editor · Batch · Multi-screen · Code images · App Store sets

Try it at shotcandy.app

MIT license Runs 100% in your browser No account needed No watermark

A plain dashboard screenshot blooms into a styled image, then shuffles through Grape Isometric, Strawberry Satin, Midnight Spotlight, Tangerine Tilt, Caramel Laptop, Grape Aurora and Retro Pop

Before and after

Every "after" below is a real export from Shotcandy's engine, one click from the plain screenshot on the left.

Before: a flat analytics dashboard screenshot. After: the same screenshot tilted on a tangerine gradient with a soft shadow Before: a dark notes app screenshot. After: the same screenshot glowing on the Ember Night wallpaper Before: a plain phone screenshot. After: the screenshot inside a drawn phone frame rising from a pink gradient

Why Shotcandy

  • Instant. Press ⌘ V. Your screenshot lands already styled, and every style thumbnail previews your image, not a sample.
  • Private. Nothing leaves your browser. There is no server to upload to.
  • Free, for real. No account, no paywall, no locked styles, no watermark. MIT licensed.
  • Made for sharing. Exports are sized and compressed for the place you are posting, and they can move.

It's a free, no-upload alternative to Xnapper, Pika, Shots.so and Carbon that works on any system with a browser. There's an honest comparison at shotcandy.app/alternatives.

Features

Styles

42 one-click styles in eight families (from your shot, fruity, pastel, paper, minimal, deep, wallpaper and device). The Minimal family keeps it quiet: plain white, soft grey, outline, graphite and a design-canvas look. Hover to preview, press G for the whole Candy Jar, or press S for Candy Shuffle, which re-rolls background, tilt and frame together. Styles that suit your screenshot come first, and "From your shot" builds a palette from the image itself. Save your own tweaks as presets.

The Candy Jar: every style rendered with the user's own screenshot

Backgrounds cover solid colours, linear, radial and mesh gradients with an editor, 12 original wallpapers and your own images. Layout controls have named stops for padding, corners and shadow, plus borders, an inset plate, 3D tilt and position.

Many screenshots at once

Drop, paste or add several screenshots, or a whole folder, and style them together: up to 100 on a computer, 30 on a phone. They share one style, and the All / This image switch lets you change one image without touching the rest. Export them all as a ZIP, straight into a folder in Chrome or Edge on a computer, or to the share sheet on a phone. Every file keeps its original name. Batches work in Screenshot mode.

The editor with eight screenshots in the Images list on the left and the first one styled with Sea Glass Stack

Multi-screen designs

Put 2 to 6 screenshots in one design with six layouts: Side by side, Overlap, Hero, Cascade, Fan and Grid. Every style works with them. In a batch, select 2 to 6 images and choose Combine into one design. Screen recordings, code and post cards stay single.

Three screenshots in the Hero layout on a red satin wallpaper: a dashboard in front, a project board and a landing page behind it

Caption card

Turn a landscape screenshot into a tall post in one step. Pick a 9:16 story, a 4:5 portrait or any tall size and Shotcandy adds a headline and subhead above your screenshot, set in the brand's display type with ink or white picked to suit the background. Click the text on the canvas to edit it in place.

A landscape dashboard screenshot on a 1080 by 1920 Instagram story with the headline Your week at a glance above it

Frames

A macOS window, a browser (light or dark), drawn phone, tablet and laptop frames, and a design canvas frame that shows your shot the way a design tool shows a selected frame: its name above, blue selection handles, and its pixel size below. All vector, all drawn by us, no vendor artwork.

A landing page screenshot inside a browser frame, with the frame picker open

Annotations

Text, arrows (straight or curved), highlight boxes, and blur, pixelate or a solid box for anything private. Annotations can stick to the screenshot or to the canvas, and every one is editable after the fact.

A dashboard screenshot with a highlight box, a curved arrow, a text label and a blurred email address

Motion

Eight motion presets (zoom in, focus, scroll, 3D sweep, float, drift, draw on, flip in) that loop seamlessly. Export MP4, WebM or GIF at up to 4K, rendered frame by frame by the same engine that draws your stills.

The motion tray with the Float preset selected and a playback scrubber An animated export: a project board on the Strawberry Satin wallpaper zooming in

Screen recordings

Drop in an MP4, MOV or WebM screen recording and it gets the same treatment as a screenshot: background, frame, tilt, shadow, caption and blur boxes. Trim it, keep or drop the sound, add a motion on top, and export MP4, WebM or GIF. Everything happens in your browser, and the recording is never uploaded. Recordings up to 10 minutes and 1 GB open. Your browser must be able to play the recording: HEVC files open in Safari, or you can re-save them as H.264.

Code images

Paste code, pick one of 8 themes with a matching background, highlight lines and set a filename. Syntax highlighting by Shiki across 26 languages, with auto-detect. Add a motion to export it as MP4 or GIF.

A TypeScript snippet in the Midnight Candy theme with two highlighted lines

Post and testimonial cards

Type or paste a post or a quote and get a polished card: name, handle, avatar, stats or star rating, in light, cream, candy, dark or midnight. No third-party API involved.

A five-star testimonial card on a midnight background

App Store sets

Build a 3 to 10 slide set with headlines at Apple's exact sizes (iPhone 6.9", 6.5", 6.3", 5.5" and iPad), restyle every slide at once, and export the whole set as a ZIP.

Five App Store slides for a habit tracker, each with a headline above a framed phone screenshot

Export by destination

Tell Shotcandy where the image is going (X, LinkedIn, Instagram, Product Hunt, a README, Slack and docs) and it picks the size, format and quality, then checks the file fits that platform's limit. Or choose any preset yourself: Open Graph 1200×630, X, LinkedIn, Instagram post and story, Product Hunt, App Store and free aspect ratios. PNG, JPEG or WebP at 1× to 4×, copy to the clipboard, or download with your own filename pattern.

The export popover with X selected, showing the output size and a green check that the file fits

Keyboard shortcuts

Everything has a key. Press ? in the app for the full sheet.

Action Keys
Paste a screenshot ⌘ V
Copy the image ⌘ C
Download / export options ⌘ S / ⌘ ⇧ S
Candy Shuffle S
Candy Jar (all styles) G
Previous / next style [ ]
Cycle frames / padding F / P
Text, arrow, highlight, blur T A R B
Play or pause motion M
Size menu K
The keyboard shortcuts sheet

Privacy

Shotcandy is a static site. Your screenshots are decoded, rendered and encoded on your own device, in your browser, and are never uploaded anywhere. There are no accounts, no analytics and no server-side code. Recent designs, presets and uploaded backgrounds are kept in your browser's IndexedDB, and you can export any design as a .shotcandy project file to back it up or move it to another machine. After the page loads, the only network requests are for fonts.

Run it locally

You need Node 20.9 or newer and pnpm.

pnpm i && pnpm dev

Then open http://localhost:3000.

Self-host

Shotcandy is a static site, so you can host your own copy anywhere that serves files. The production build is plain files. There is nothing to configure: no environment variables, no database, no API routes.

pnpm build        # writes a fully static site to out/
pnpm serve        # optional: preview out/ with the zero-dependency static server

Upload out/ to any static host: GitHub Pages, Netlify, Vercel, Cloudflare Pages, an S3 bucket or a plain nginx folder. URLs use trailing slashes, so no rewrite rules are needed.

How it works

The heart of Shotcandy is a small, deterministic rendering engine in src/engine, written in plain TypeScript with no React dependency. The same scene plus the same input always produces the same pixels, which is what makes previews, exports and animation frames agree exactly.

flowchart LR
  A[Paste / drop / pick] --> B[Scene model<br>plain JSON]
  P[Styles & presets] --> B
  B --> C[Layout<br>sizes, fit, frames]
  C --> D[Canvas renderer<br>layers to pixels]
  D --> E[Live stage preview]
  D --> F[Export worker<br>PNG · JPEG · WebP]
  D --> G[Animation worker<br>frame by frame]
  G --> H[MP4 · WebM · GIF]
  B --> I[IndexedDB & .shotcandy files]
Loading
  • Scene model (engine/scene): a JSON description of canvas, background, card, frame, annotations and optional animation. Undo, presets, project files and the UI all read and write it.
  • Layout and render (engine/layout, engine/render, engine/frames): layers drawn onto an HTML canvas, including our own vector frames and shadows.
  • Export (engine/export): renders off the main thread in a worker, with size presets, scale factors and per-destination size limits.
  • Animation (engine/animation): motion presets are functions of time over the same scene, encoded with WebCodecs plus mp4-muxer / webm-muxer, or gifenc for GIFs.
  • Screen recordings (engine/video): a recording is a screenshot whose pixels change over time. Each output frame is the normal renderer drawing the scene with the recording's frame in place of the screenshot. Mediabunny reads the file, decodes the trimmed clip at the output frame rate, and copies the sound across (or re-encodes it when the container needs to).
  • Batches (engine/batch): a batch is one shared style plus each image's own changes. Export renders the images one at a time and streams them into a ZIP with fflate, or writes them into a new Shotcandy folder inside one you pick.
  • Modes (engine/code, engine/post, engine/appstore): code images, post cards and App Store sets build ordinary scenes, so they get every style, frame and export for free.
  • UI (src/components, src/state): a Next.js static export with Tailwind. The editor store drives the engine; the engine never knows about React.

Testing

pnpm test            # Vitest: engine unit tests and headless render tests
pnpm test:e2e        # Playwright: visual regression against committed baselines,
                     # export sizes, and app flows in Chromium, Firefox and WebKit
pnpm bench           # export performance (budget: a 4K export in under 1.5 s)
pnpm typecheck && pnpm lint

To see every style on every sample screenshot at once, render the contact sheet:

CONTACT=1 pnpm vitest run tests/render/contact-sheet.test.ts

Contributing

Issues and pull requests are welcome. See CONTRIBUTING.md for the short version, CHANGELOG.md for what changed, and SECURITY.md to report a security problem.

  • Keep the engine pure: no DOM or React imports in src/engine, and no clocks or unseeded randomness in anything that renders.
  • Add tests alongside changes. Visual changes should update the Playwright baselines on purpose (pnpm test:e2e:update) and say so in the PR.
  • Use the fictional samples in brand/samples for demos and tests. Please don't add real product screenshots, logos or vendor device art.
  • Run pnpm typecheck && pnpm lint && pnpm test before opening a PR.

Credits

  • Fonts: Bricolage Grotesque, Figtree and Geist Mono, all under the SIL Open Font License 1.1, bundled via Fontsource.
  • Shiki (MIT) for syntax highlighting.
  • Mediabunny (MPL-2.0, used unmodified) for reading and converting screen recordings.
  • mp4-muxer and webm-muxer (MIT), gifenc (MIT), fflate (MIT) and idb (ISC).
  • Built with Next.js, React and Tailwind CSS (all MIT).
  • The logo, wallpapers, frames, sample screenshots and launch media are original work, released under this project's MIT license. The sample apps and people in them are made up.

Support

Shotcandy is free and always will be. If it saves you time, you can support the project with a one-off tip or a small monthly contribution.

License

MIT © 2026 Bilal Tahir


Try it at shotcandy.app, no sign-up needed.