Stow
Store, enrich, and search image and video libraries from one developer-first platform. Built for creative products, visual workflows, and agents.
Try it
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
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
The other half
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
Describe what you're looking for in plain language. No mandatory tags, no filenames, no folder structures.
Click to search yourself
Visual search
Drop any image and find every visually similar image in the collection. No words needed — the image is the query.
Anchors
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
Images that look alike end up close together in vector space. One query surfaces every visual neighbour, ranked by similarity.
Classified
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 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%
No colour matches
Colour search
Every image's palette is indexed. Pick a colour and find every image that contains it — no tags needed.
Content box
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
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









Taste profiles
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
API
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
Every primitive compounds. Combine embeddings, clusters, signals, and anchors into capabilities that would take months to build from scratch.
For you
A user views three images. Stow builds a taste vector, clusters their affinity, and returns a feed ranked by relevance — across any bucket.
const feed = await stow.search.similar({
profileId: "user_4821",
limit: 20,
});


Collections
Stow clusters your library by visual similarity, names each group from its dominant themes, and picks a cover image — no manual curation.
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
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.
const gaps = await stow.anchors.coverage("decor");
// → [{ label: "lifestyle with people", score: 0.12 }]Mood boards
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.
const board = await stow.moodBoards.create({
anchors: ["Scandinavian minimalism", "natural light"],
seeds: ["img_042.jpg"],
});







Agent-ready
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
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
Resize, crop, and reformat on the edge. No build step, no image pipeline. Just query parameters.
Source image
Presets

GET duqs2b9h8sy1t.jpg?w=600&fit=cover&gravity=auto&f=webp
API
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.
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,
});