Snaphaul:拍照生成 eBay / Etsy / Poshmark / Mercari 商品刊登
aranlucas/snaphaul
Snaphaul 可将 1-5 张商品照片生成适配 eBay、Etsy、Poshmark 或 Mercari 的刊登内容,自动识别物品并给出标题、描述、商品属性、标签及带区间的价格建议。目前为免费公开测试版,每个浏览器会话可匿名生成 10 次、无需账号,基于 cookie 的额度仅为提示性限制。它只生成文本和结构化字段,不会直接发布刊登、不保留历史记录,也不提供保证性估价。
Snaphaul 📸 · Snap a photo. Get a listing that sells.
Snaphaul turns one to five item photos into a marketplace-ready listing for eBay, Etsy, Poshmark, or Mercari. It identifies the item, writes a marketplace-specific title and description, suggests item specifics and tags, and returns a price suggestion with a range. It is built for the reseller whose inventory grows faster than they can write the 47th listing of the day.
The quick reseller loop: drop in a few photos, choose a marketplace, add the flaw or measurement the camera cannot know, and copy the suggested title, details, and price range into your listing. You stay the editor; Snaphaul clears the blank page.
The public beta offers ten anonymous generations per browser session and does not require an account. This cookie-based allowance is advisory: clearing or changing cookies resets it, and concurrent requests can share a count. It is not an enforceable per-person quota or abuse-protection mechanism. A hard budget requires atomic server-owned persistence and an identity/renewal policy. Treat the generated copy, category, condition, and price as suggestions: the seller remains responsible for accuracy and each marketplace's rules.
Run locally
pnpm install pnpm dev
Open http://localhost:3000. Build for production with
pnpm build.
The API route needs a server-side OpenRouter key. Copy it into your local environment before generating a listing:
OPENROUTER_API_KEY=... pnpm dev
Supported settings:
| Variable | Required | Purpose |
|---|---|---|
OPENROUTER_API_KEY |
yes | Vision model access for listing generation. |
OPENROUTER_MODEL |
no | Override the rotating free-model fallback list. |
EBAY_CLIENT_ID / EBAY_CLIENT_SECRET |
no | Enables live eBay Browse API asking-price comps. |
APP_URL |
no | Metadata base URL; defaults to the deployed app URL. |
Without eBay credentials the UI still shows the model's estimate. When enabled, comps are asking prices from live listings, not sold-price evidence.
Request flow
flowchart LR Seller[Photos + seller details] --> UI[app/app/page.tsx] UI --> API[app/api/generate/route.ts] API --> Model[OpenRouter vision model] API -. optional .-> Ebay[eBay Browse API] Model --> Result[Structured listing JSON] Ebay -. asking-price comps .-> Result Result --> UI
Loading
The browser compresses images before sending them as data URLs. The route
passes requests through lib/generate-listing.ts, which bounds the JSON body to
8 MiB, validates the marketplace/details and one-to-five-image limit, and checks
base64 encoding, MIME type, file signature, and a 1 MiB decoded limit per image.
JPEG, PNG, WebP, and GIF are supported; SVG and other media are rejected. File
signature checks are not a full pixel decode or malware scan. Invalid requests
return 400 (or 413 for oversized bodies) before any model call, without echoing
photo data. The module tries the configured model or free fallback models and
preserves a valid listing if optional comparisons fail. The route sets an HTTP-only
anonymous counter cookie. Photos and typed details are sent to OpenRouter for
generation; the application does not persist them. See the built-in
privacy policy and terms for the
beta boundary.
Source map
app/page.tsx— public landing page and product explanation.app/app/page.tsx— uploader, marketplace selector, result cards, and copy actions.app/api/generate/route.ts— OpenRouter adapter, advisory allowance, cookies, and HTTP response mapping.lib/generate-listing.ts— bounded request/image validation, model fallback, optional comparisons, and typed generation outcomes.lib/marketplaces.ts— marketplace-specific title limits and prompt rules.lib/ebay.ts— optional eBay OAuth token cache and asking-price percentile calculation.public/og.png— the product's checked-in social preview image.
Status and limits
Snaphaul is a free beta. It currently generates text and structured listing fields; it does not publish listings to marketplaces, retain a listing history, or provide guaranteed valuations. Free-model availability, image quality, marketplace policy changes, and anonymous cookie clearing can all affect the result.
Offline checks
pnpm test compiles and runs the Node test suite with synthetic image data and
local model/comparison adapters. It makes no OpenRouter or eBay requests. CI also
runs these regressions. Run pnpm typecheck, pnpm lint, and pnpm build for the
remaining checks. Failed generation or invalid input does not update the cookie
allowance; only a successfully generated listing is counted.
来源:GitHub · github.com
