Stow

Visual Media
Infrastructure

Store, enrich, and search image and video libraries from one developer-first platform. Built for creative products, visual workflows, and agents.

Try it

Drop an image.
Watch it be understood.

Upload any image and watch Stow analyse it in real time — title, description, colours, embeddings, similar images, and taxonomy classification, all streaming as they complete.

Enrichment results will stream here

dimensions · title · description · tags · colours · embedding · similar · taxonomy

Described

Text and tagging is only
half the story.

Every image gets a title, description, alt text, and semantic tags — generated in seconds. Useful for search, accessibility, and cataloguing. But the real magic starts when you understand what an image means.

title, description, tags

Untitled

The other half

Every image, placed
in a shared space of meaning.

Each image is converted into a 1,024-dimension vector embedding — a numerical fingerprint of what it looks like, not just what it’s called. Images with similar content end up near each other, which unlocks similarity search, clustering, and classification across your entire collection.

Search

Search by meaning,
not metadata.

Describe what you're looking for in plain language. No mandatory tags, no filenames, no folder structures.

Click to search yourself

Visual search

Search by dropping
an image.

Drop any image and find every visually similar image in the collection. No words needed — the image is the query.

Anchors

Pin meaning
into your library.

Define the concepts that matter to you in plain language. Stow embeds them into your vector space as permanent reference points — searchable, reusable, and always ready.

Clean lines, light wood, white walls, natural light, functional simplicity

No similar images found

Similarity

Find every image
like this one.

Images that look alike end up close together in vector space. One query surfaces every visual neighbour, ranked by similarity.

Classified

16,927 terms across
27 vocabularies.

Rich taxonomies act as waymarkers for understanding. Every image is matched against structured vocabularies like Getty AAT, Library of Congress, and Iconclass to anchor visual content to a shared language of meaning.

0 terms across 0 vocabularies · click image to shuffle

0 terms across 0 vocabularies · click image to shuffle

0 terms across 0 vocabularies · click image to shuffle

Colour

Every colour,
indexed.

Every image's palette extracted and named. Search your library by colour family, find images with matching palettes, or filter by mood and temperature — all automatic.

Mood

dark

Temperature

Neutral

Vibrancy

21%

Brightness

21%

bright deep pink69%
bright deep red11%
bright deep orange10%
black2%
bright dark pink2%
bright deep yellow1%
bright deep orange1%
bright dark pink1%
deep orange1%
dark pink1%

No colour matches

Colour search

Search
by colour.

Every image's palette is indexed. Pick a colour and find every image that contains it — no tags needed.

Mid-Century Walnut Armchair
content box

Content box

Every image,
smart cropped.

Stow detects the content bounding box of every image at ingest — automatically separating the subject from borders, whitespace, and background. One query parameter for perfect crops, no manual intervention.

// Every image gets a content box at ingest
const file = await stow.getFile("product.jpg");

file.metadata.content_box
// → { x: 48, y: 45, width: 1104, height: 806 }

file.metadata.content_ratio  // → 0.828
file.metadata.is_isolated    // → true

// Smart crop via CDN — zero processing
const url = "https://cdn.stow.sh/product.jpg?trim=border";

Segmented

Every object,
identified and extracted.

Text-prompted instance segmentation identifies and isolates every object in an image — extracting each as an independent layer.

8 objects segmented in 0.8s

instance segmentation

Interior designer's material moodboard
Ceramic bowl
Ceramic bowl95%
Linen fabric
Linen fabric84%
Walnut timber
Walnut timber80%
Olive green tile
Olive green tile57%
Brass pull
Brass pull78%
Sandstone brick
Sandstone brick78%
Walnut timber
Walnut timber84%
Pampas grass
Pampas grass87%

Taste profiles

Signals in,
taste out.

Send behavioural signals — views, likes, saves, purchases — and Stow builds a taste profile. Images cluster by affinity. The more signals, the sharper the clusters.

Signal feed

Signals0
Clusters

API

Three calls to
personalised feeds.

Create a profile, send signals from your app, then query by taste. Stow computes the vector, decomposes clusters, and names them — you just read the results.

// 1. Create a profile
const profile = await stow.profiles.create({
  name: "User 4821",
});

// 2. Send behavioural signals
await stow.profiles.signal(profile.id, [
  { fileKey: "img_001.jpg", type: "view" },
  { fileKey: "img_042.jpg", type: "like" },
  { fileKey: "img_042.jpg", type: "save" },
  { fileKey: "img_107.jpg", type: "purchase" },
]);

// 3. Search by taste
const feed = await stow.search.similar({
  profileId: profile.id,
  limit: 20,
});

What you build

From understanding
to action.

Every primitive compounds. Combine embeddings, clusters, signals, and anchors into capabilities that would take months to build from scratch.

For you

Personalised feeds from first signal.

A user views three images. Stow builds a taste vector, clusters their affinity, and returns a feed ranked by relevance — across any bucket.

Built fromtaste profilessimilarity searchclusters
const feed = await stow.search.similar({
  profileId: "user_4821",
  limit: 20,
});
DH
for you
0.94
0.91
0.87

Collections

Upload ten thousand. Get fifteen galleries.

Stow clusters your library by visual similarity, names each group from its dominant themes, and picks a cover image — no manual curation.

Built fromclustersembeddingsAI enrichment
const { clusters } = await stow.buckets.clusters("decor");
// → [{ name: "warm rustic", count: 842, cover: "img_001.jpg" }]

geometric shapes · organic forms

42 images

warm rustic · handmade

128 images

horses · galloping

31 images

minimalist · shadows

67 images

Gaps

See what's missing before the shoot.

Define your target concepts with anchors. Stow scores how well your library covers each one and surfaces the gaps — turning intuition into a data-driven brief.

Built fromanchorssimilarity searchcoverage scoring
const gaps = await stow.anchors.coverage("decor");
// → [{ label: "lifestyle with people", score: 0.12 }]
Scandinavian minimalism94%
Warm rustic78%
Product close-ups31%
Lifestyle with people8%
gap
Brutalist concrete62%

Mood boards

Collections that search, not store.

Pin a few anchors and seed images. The mood board doesn't just hold files — it actively searches your library for matches, evolving as you refine your intent.

Built fromanchorstaste profilessimilarity searchcolor
const board = await stow.moodBoards.create({
  anchors: ["Scandinavian minimalism", "natural light"],
  seeds: ["img_042.jpg"],
});
natural light
Scandinavian minimalism
warmth

Agent-ready

Built for agents,
not just humans.

Every API, every tool, every protocol an agent needs to work with images. OpenAPI spec, MCP server, CLI, webhooks — the full stack for autonomous visual workflows.

300+

Cities

<50ms

p95 latency

99.99%

Uptime

Infrastructure

Cloudflare’s global
network.

R2 object storage. Edge image transforms. 300+ cities. No origin round-trip. Your images are served from the node closest to whoever requests them.

Transforms

Every format,
every size.

Resize, crop, and reformat on the edge. No build step, no image pipeline. Just query parameters.

Source image

Aspect
Fit
Gravity
Format

Presets

Interior with Original transform

GET duqs2b9h8sy1t.jpg?w=600&fit=cover&gravity=auto&f=webp

API

Every surface
covered.

First-party packages for Node.js and Next.js. S3-compatible endpoint for any existing client. Full REST API with webhooks and batch operations. Every surface you need.

@howells/stow-server@howells/stow-next@howells/stow-client
import { StowServer } from "@howells/stow-server";

const stow = new StowServer(process.env.STOW_API_KEY!);

// Upload a file
const file = await stow.uploadFile(buffer, "hero.jpg", {
  bucket: "products",
});

// Search by meaning
const results = await stow.search.text({
  query: "warm minimalist interior",
  limit: 10,
});

Start with one image.
See what Stow finds.

Coming soonRead the docs