Skip to content
runonweb

Alt: Image captioning

Describe any image in one sentence, in English, Spanish, Portuguese, French, German, Arabic, Chinese, Japanese or Korean. Useful for alt text, search indexing and accessibility. Generated on-device, no image ever leaves the page.

Try Alt

Runs in this tab · nothing uploaded

Pick a sample or drop an image. It runs right away
Try with

Drop an image here

or click · PNG JPG WEBP

What it does

One sentence for any image, in nine languages.

  • LFM2.5-VL-450M (Liquid AI, Nov 2025). A small vision-language model, prompted for captions, not a dedicated captioner.
  • Pass language (en, es, pt, fr, de, ar, zh, ja, ko) to caption in that language. Other languages are best-effort.
  • Pass detail: "detailed" or "more" for longer captions. Default is short alt text. onPartial streams the text as it is generated.
  • License: LFM Open License v1.0. Free for individuals and companies under USD 10M annual revenue. Above that, Liquid AI requires a commercial license. Not OSI-approved.
  • WebGPU is the fast path (fp16 vision + q4f16 decoder, about a second per caption). GPUs without shader-f16 load fp32 vision + q4 decoder (~909 MB). WASM works but takes ~30 s per caption.
  • It is a generative model: captions can hallucinate details. Review before publishing.

Specifications

Package
runonweb/caption
License
LFM Open License v1.0 (free < USD 10M revenue)
Download
~548 MB / ~508 MB
Quantization
fp16+q4f16 on WebGPUfp16+q8+q4 on WASM
Backend
WebGPUWASM fallback
Input
Image

Get started with runonweb/caption

pnpm add runonweb
runonweb/captionts
import { ImageCaptioner } from 'runonweb/caption'

const captioner = new ImageCaptioner({ language: 'es', detail: 'short' })
await captioner.load()

const { text } = await captioner.caption(imageFile)
// "Un gato sentado sobre una mesa de madera."

// Per call overrides, streamed
await captioner.caption(imageFile, {
  language: 'en',
  detail: 'detailed',
  onPartial: (partial) => console.log(partial),
})

captioner.dispose()

Same shape everywhere: construct, load(), run, dispose(). Pass onProgressto show download progress on first use.

Questions about Alt

Does Alt run on device?

Yes. Weights download once and stay in the browser. Nothing is sent to a server.

Which model does Alt use?

LFM2.5-VL-450M by Liquid AI, under LFM Open License v1.0 (free < USD 10M revenue). runonweb loads the onnx-community/LFM2.5-VL-450M-ONNX weights and runs fp16+q4f16 on WebGPU · fp16+q8+q4 on WASM.

How big is the Alt download?

~548 MB / ~508 MB, fetched once on first use. The browser caches the weights, so later loads skip the network and keep working offline.

What does Alt cost?

Nothing. runonweb is free and MIT-licensed, with no device limits, tokens or sign-in. The weights keep their own license: LFM Open License v1.0 (free < USD 10M revenue).

Which browsers support Alt?

Chromium browsers use WebGPU. Firefox and Safari fall back to WebAssembly automatically, slower but identical output.

Can I use a different model with runonweb/caption?

Yes. See each module’s docs for the options it accepts (model, size, language…). Check the license and test both backends before shipping.