SVG Background Generator: Waves, Blobs and Mesh Gradients

Twelve presets and three generators, one plain SVG. Waves stack a sine curve into bands, blobs wrap a wobbling radius into closed shapes, and the mesh lays a grid of radial gradients under a single blur. Every slider re-renders the markup itself — no canvas, no raster step — so the file you download is exactly what the preview shows, usually a few kilobytes. When something downstream cannot take a vector, export the same design as a PNG at 1× or 2×.

12 presetsWaves / blobs / meshSVG + PNG 1×/2×Seeded & shareable

Preview

—
PNG export rasterises the current canvas in the browser: 1× is 1600×900, 2× is 3200×1800.
The CSS button copies a background-image data URI of the current design.

Settings

live
Type
Palette
Colours
Size×
Seed
Complexity6
Wave height5
Softness3
Saturation5

Presets

12 starting points
A preset writes all nine parameters at once — type, palette, seed, complexity, spread, softness, saturation and the two size fields. Touch a slider afterwards and you are off the preset but still on the same seed.

An SVG background is the one image on a page that never needs to be a bitmap: it is soft, it is behind everything, and it is the thing most likely to be asked to fill a screen it was not drawn for. The same design as stacked paths costs 5.1 KB; rasterised at 1600×900 it is 588 KB, and it goes soft the moment the viewport changes shape. The vector scales to any size because it is made of coordinates.

What each generator actually emits

TypeMarkupElements at default settingsBytesBest for
WavesOne closed <path> per band, sampled from two sine terms9 paths5.1 KBSection dividers, hero bands, headers that need a horizon
BlobsClosed curves built from a radius that wobbles as a function of angle9 shapes9.5 KBSoft shapes behind a card, an avatar frame, a poster corner
MeshA grid of radial gradient circles over a base fill, under one blur filter36 gradients4.6 KBThe modern blurred-gradient look, without a PNG

Every number in that table is read from the file this page produces at 1600×900, not estimated. The mesh is the heaviest of the three because each node needs its own <radialGradient>; it is still an order of magnitude lighter than a PNG of the same appearance at the same size.

The three generator modes side by side: layered waves, organic blobs and a blurred mesh gradient, with the byte size of each SVG underneath
The same palette and the same seed in all three modes: 5.1 KB of paths, 9.5 KB of curves, 4.6 KB of gradients. · swipe to see it all

Twelve presets, and what each one is for

A preset is a complete set of the nine parameters this page keeps — type, palette, seed, complexity, spread, softness, saturation and the two size fields — not a theme layered on top of them. Click one and every control moves to that value, which is why the sliders keep working normally afterwards instead of fighting an override. The chips are rendered from the same constants the generator uses, so the swatch you click is the palette you get.

PresetTypePaletteBuilt for
AuroraMeshIndigo, cyan, near-blackDark hero sections, product launches, the default look of this page
MidnightMeshDeep navy, indigo, slateDashboards and docs where the background must stay quiet
SunsetWavesAmber, coral, plumWarm landing pages, event pages, newsletter headers
Mint fogBlobsMint, teal, off-whiteHealth, wellness and finance pages that need air
PaperWavesWarm greys, boneText-heavy pages — a horizon you can barely see
CitrusBlobsLemon, orange, creamConsumer apps and anything aimed at a young audience
Deep seaWavesNavy, teal, aquaTechnical and maritime products, section dividers
BlushMeshRose, peach, ivoryWeddings, beauty, editorial headers
ForestMeshMoss, pine, sandSustainability and outdoor brands
SlateWavesSlate, steel, whiteCorporate decks and print-adjacent layouts
Neon nightBlobsMagenta, cyan, blackGaming, music and developer tools with a dark UI
SandMeshBeige, tan, clayPrint-like pages, portfolios, anything with serif type

Two of them — Paper and Slate — exist because a background that competes with body copy is a defect, not a style. Both keep saturation low enough that 15 px text stays legible on top without an overlay.

The twelve presets in the generator, with the Aurora and Sunset renders shown beside the same mesh design exported as a 4.6 KB SVG, a 587.8 KB PNG at 1x and a 1459.9 KB PNG at 2x
Aurora and Sunset as this page renders them, the other ten by palette, and what one mesh design weighs as a vector and as a PNG. · swipe to see it all

Waves: a sine curve, sampled, stacked

Each band is one path: the top edge is y = base + A·sin(2πf₁x/W + φ₁) + 0.45A·sin(2πf₂x/W + φ₂) sampled at 48 points, then closed along the bottom of the canvas. Two frequencies instead of one is what stops it looking like a graph: the second term bends the crests at a different rate, so no two waves in the stack are parallel.

Wave height scales the amplitude, Complexity sets how many bands are stacked, and Softness adds a blur which is the only reason the bands read as mist rather than as paper cut-outs. The bands are painted back to front with a slight opacity, so the palette reads as a gradient even though every layer is a flat fill.

Blobs: a radius that is a function of angle

A blob is a closed curve in polar coordinates: r(θ) = R·(1 + w·sin(k₁θ + φ₁) + 0.3w·sin(k₂θ + φ₂)), sampled 48 times around the circle and joined with quadratic segments through the midpoints. Two to four lobes on the first harmonic is the range where a shape reads as organic; go higher and it turns into a gear.

The trick that makes it usable rather than a novelty is that the path is small — a hundred bytes of curve data per blob — so you can stack five of them, blur the group, and still ship less than a single photographic JPEG thumbnail. Wobble (the Spread slider in this mode) is the amplitude of the radial distortion.

Mesh gradients, and the element SVG does not have

SVG 1.1 has linear and radial gradients. It has no mesh gradient, and the mesh proposal that was discussed for SVG 2 was never implemented in any browser, so every "mesh gradient SVG" you have seen is an imitation. The imitation that works: paint a base colour, then draw a circle at each node of a coarse grid, fill it with a radial gradient that goes from the node colour at the centre to the same colour at zero opacity at the rim, and put a single gaussian blur over the group. Overlap makes the colours mix; the blur hides the seams.

Two consequences worth knowing. First, the node colours come from a smooth field over the palette, not from independent random picks — random picks give confetti, and a field gives the drifting look a mesh is supposed to have. Second, the blur radius and the node spacing are coupled: raise the grid density without lowering the blur and the design flattens into a single colour. That is what Complexity and Softness do together, and why both exist.

Using the file

The download is a standalone SVG with a viewBox and matching width/height. Three ways to put it on a page, in order of preference:

A background should not compete with text, so keep the contrast low and check it: the same design that looks elegant behind a headline can make 15 px body copy unreadable. If you need to soften it further, an overlay linear-gradient in CSS is cheaper than regenerating the SVG.

Seeds, and why the link is short

Every random value — band positions, frequencies, phases, blob centres, node colours — comes from a seeded PRNG, so the seed plus the settings determine the artwork exactly. The share link carries those parameters in the URL fragment and nothing else: no storage, no server, no id to look up. Open the link and the page regenerates the identical file, byte for byte, which is also how you can hand a design to someone else and get the same result back.

When you find a composition worth keeping, write the seed down. Shuffling gives you a new one, and 1207 is not more special than 8412 — it is just the one you decided to keep.

Exporting a PNG at 1× and 2×

The PNG buttons rasterise the current design in the browser. 1× writes the canvas exactly as the size fields say — 1600×900 by default; 2× writes twice the width and twice the height, 3200×1800, which is the version to use on a retina screen or when the PNG will be cropped later. The number under the buttons is the byte size of the last PNG you actually exported, not an estimate.

At the default mesh that is 588 KB at 1× and 1460 KB at 2×, against 4.6 KB for the same design as SVG. The ratio is the point: a PNG stores every pixel, so the 1× file is about a hundred and thirty times heavier than the paths it was rendered from, and it stops scaling the moment it is written. Export a PNG for a slide, a screenshot, a social card or a platform that refuses SVG — not for a web page you control.

Two mechanics worth knowing. The rasteriser is the browser's own canvas, fed a blob URL of the SVG string, so the filter, the gradients and the opacities come out exactly as the preview draws them; and because the page never loads an external image, the canvas is never tainted, which is what makes toBlob possible at all. Very large canvases are capped by the browser — Chrome starts to struggle above roughly 16 million pixels — so 2× on a 2560×2560 canvas is the practical ceiling.

When a bitmap is the better answer

If the background is a photograph, or has grain, or needs to be animated frame by frame, a raster is the honest choice: use the PNG 2× button here, or the dedicated SVG to PNG converter if you want 3× or 4× and a transparent or tinted backdrop. The same tool is the answer when a platform refuses SVG uploads — some CMS media libraries still do.

Once the file exists, the usual neighbours apply: SVG Compressor to cut the decimals in the path data, SVG Color Changer to move the whole palette at once, and SVG Editor if you would rather nudge one node by hand than shuffle the seed.

Frequently asked questions

Is the output a real vector, or a raster wrapped in an SVG?

A real vector. Waves are one closed path per band, blobs are closed curves, the mesh is a grid of radial gradient circles under one blur filter. There is no image element and no base64 bitmap in the file, which is why a 1920×1080 background lands in single digit kilobytes.

How do I put the result on a page?

Save the file and use background-image with background-size:cover, which is cacheable. Inline the markup if you want to save a request. Use the Copy CSS button for a data URI when you need a single self-contained snippet, and keep that one small.

Why is the mesh gradient built from blurred circles?

SVG has no mesh gradient element. SVG 1.1 has linear and radial gradients only. A grid of radial gradients fading to transparent, over a base fill, under one gaussian blur, is visually indistinguishable at background scale and stays a vector.

What does the seed do?

It fixes the random numbers, so the same seed and settings always produce the same SVG byte for byte. That is what the share link relies on: it carries parameters, not artwork.

Will a blurred filter slow my page down?

A full-screen gaussian blur costs something on the compositor, but it rasterises once and caches while the element is static, which a background is. If you need to animate it, drop the filter and add nodes instead.

What is the difference between the SVG and the PNG export?

The SVG is a few kilobytes and stays sharp at any size, so it is the right file for a web page. The PNG is rasterised in the browser: 1× is exactly the canvas size, 2× is twice the width and height, which is what you want for a retina screenshot, a slide deck or a platform that refuses SVG. At 1600×900 the default mesh is 4.6 KB as SVG and 588 KB as a 1× PNG, 1460 KB at 2× — so export a PNG only when something downstream cannot take the vector.

Do I have to start from scratch, or are there presets?

There are twelve presets, each one a full set of parameters: type, palette, complexity, spread, softness, saturation, a seed and the two size fields. Clicking a preset writes all of them into the same controls, so the sliders afterwards move away from the preset rather than fighting it, and the share link still carries only those nine fields. Aurora, Midnight, Sunset and the rest are starting points, not locked themes.

Related SVG workflows

More free SVG tools