Ship Your Content in Every Language, and See What Every AI Run Costs
Two things landed in v2.5.0 that address the same underlying problem from opposite ends: you could not see what you had. You could not see which posts were missing a translation, and you could not see what an AI run actually cost you.
Multi-language content, with the gaps made visible
Publishing in a second language used to be the easy part. Knowing what still needed translating was the hard part — it meant manually comparing two lists.
Blog and changelog content now carry a language dimension end to end. The most useful part is the smallest: a Translations column.
Every post shows which languages it exists in. Languages it has are links. Languages it lacks show as +zh, and clicking one opens a new translation with the slug and target language already filled in.
That single column turns "which of our 40 posts aren't translated?" from an afternoon of cross-referencing into something you see at a glance.
Shared slugs, automatic hreflang
Translations deliberately reuse the source post's slug. That shared slug is what pairs them, and that pairing is what generates hreflang — the signal that tells search engines these are the same page in different languages, rather than duplicate content competing with each other.
So /blog/my-post and /blog/zh/my-post are understood as one post in two languages. You get the SEO benefit of localised content without the penalty of near-duplicates.
Publish translations over the API
Multi-language publishing is not admin-only. /client/v2/blog/publish accepts a lang field:
curl https://api.litestartup.com/client/v2/blog/publish \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"slug": "my-post",
"lang": "zh",
"title": "我的文章",
"content": "..."
}'
Same slug, different lang, and the two are paired. Publishing is idempotent per language, so re-running the same call updates rather than duplicates.
Language for Git-synced content is still determined by file path — blog/zh/my-post.md is the Chinese version. That stays the single source of truth, so the file layout and the database never disagree about what language something is.
A playground built around runs, not requests
The old AI Gateway Playground treated a generation as a request that returned some HTML. That works until you care about any of the things people actually care about.
You could not see what it cost. Now there is an estimate above the Run button before you submit, and the actual amount charged, latency and provider after it finishes.
We are deliberately conservative here: for pricing models where the cost genuinely cannot be known before submission — per-token pricing, where the token count doesn't exist yet — we show the pricing terms rather than inventing a number. A confidently wrong cost estimate is worse than no estimate.
You could not stop it. A video generation could run for minutes, already billing, with no way to abort. There is now a Cancel button.
You could not get it back. Close the tab after an expensive video run and the result was gone. Run history now keeps a thumbnail, status, duration and actual cost for each run. Click one to replay the result, or to refill its parameters and run a variation.
You could not reproduce it. Expand Request preview to see the exact JSON and cURL for the request you are about to send. It is generated by the same code that submits the request, so the snippet you copy is the call you just made — not a template that resembles it.
Chat transcripts are also kept per model now, so switching models or reloading no longer throws away the conversation.
Model limits come from the models
Parameter ranges used to be hardcoded in the frontend, which meant a model advertising larger output was capped by whatever the UI happened to believe. Those limits now come from each model's own definition, so models supporting dimensions up to 4096, or wider video duration ranges, work as soon as they are available.
AI usage is now measured in dollars
AI billing runs on two wallets:
| Wallet | Behaviour |
|---|---|
| Trial credit | $1 on signup, plus $5 on your first upgrade to Pro. One-time, never reset |
| Balance | Purchased credit, shared with email and storage overage |
A single call can draw from both — if $0.10 of trial credit remains and the call costs $0.30, it takes the $0.10 and $0.20 from balance. This replaces a mix of monthly credit counts and per-tool quotas that made it genuinely difficult to answer "how much AI can I still use?"
One more thing: low-volume senders
If you send small volumes, sending reputation thresholds may have been working against you. Bounce and complaint rates were evaluated from as few as 20 messages — so one bounce in 20 read as a 5% bounce rate, enough to suspend sending.
Rate-based thresholds now require a sample of at least 100 messages. Below that, a single bad address no longer looks like a deliverability problem.
Everything here is live for all LiteStartup users. See the full v2.5.0 changelog or get an API key →