# Neblla — Changelog

Developer-facing changelog: what changed in Neblla that affects you as a developer.
Newest first.

---

## Unreleased
- **Easier for AI agents to find and use Neblla.** New `/docs` (the whole guide as web pages), `/openapi.json` (the public HTTP API), `/.well-known/mcp.json` (MCP server card with the live tool list and OAuth details), `robots.txt` and `sitemap.xml`; unknown `/api/*` routes answer JSON instead of an HTML page.
- **Neblla is in alpha.** A small, closable banner on the site, the dashboard and the gallery says so: things may still change or break, so don't rely on it for anything critical yet — and feedback (hello@neblla.com) is very welcome.
- **GitHub: sign in, pick a repo, push to deploy.** Sign in with GitHub on the dashboard, pick one of your repositories and choose auto sync: Neblla registers the webhook for you and every push to the branch goes live (only the files that changed are downloaded). Add a **test branch** and you get a private copy of the app (`<appId>_test`, same settings, never in the gallery) that follows it. While an app follows a repo its files are read-only in Neblla — edit in the repo and push. Also available through MCP (`neblla_git`).
- **`neblla.buy()` is more reliable.** It opens the checkout window inside the click (no popup blocker), and rejects with the real reason (`login_required`, `feature_disabled`…) instead of a generic error. It resolves when the window opens — the purchase itself still arrives as the `purchase` event.
- **MCP first: everything from the developer dashboard, from your AI.** New MCP tools for rooms and moderators, player bans and purchases, gallery reviews and replies, snapshots and drafts, git sync, bring-your-own-database, your payout account and your profile; `neblla_update_app` now takes every app setting the dashboard has (server mode, rooms policy, P2P, theme…) and `neblla_get_app` returns one app with all its URLs. See `llms/mcp.txt`.
- **Community: list and revoke your share links.** `neblla.community.links({ entryId? })` lists the signed-in user's links (uses left, expiry); `neblla.community.revokeLink(id)` kills one. Expired and spent links are now cleaned up automatically, together with their throwaway entries.
- **Choose the length of room codes.** `neblla.bookRoom({ length: 3 })` (and the legacy `createRoom({ length })`) return a code with that many characters, 3–12 (default 5). Handy when your UI has a fixed number of code boxes.
- **Community (beta): user-published content, no database required.** A new `neblla.community` namespace lets your signed-in users publish *entries* (any JSON payload you define, plus indexed title/summary/category/tags/contentType) and lets everyone list, search, facet and read them. Three moderation modes (`open`, `review`, `closed`), a moderation queue in the backoffice and via MCP, a new per-user "mute community" state, threads via `parentId`, and a dedicated storage cap per app (20 MB free / 200 MB Pro) separate from user saves. Opt-in: turn on **Community** in Settings → Features. Guide: `llms/comunidad.txt`.
- **Community: share privately by link.** Publish an entry with `visibility: 'private'` (never listed) and mint a link with `neblla.community.shareLink(id, { uses, expiresInDays, deleteEntry })`; the recipient opens it signed in with `neblla.community.openLink(token)`. Single-use by default, 256-bit tokens, only the hash is stored in your database.
- **Community: favorites, ratings, reviews and reports.** Signed-in users can favorite, rate (1–5) and review entries with `neblla.community.relate()`, list their favorites and read public reviews; entries carry the aggregates and `sort: 'popular' | 'top'` uses them. `neblla.community.report()` lets users flag an entry (one report each); at the app's threshold (3 by default) it goes back to review automatically. MCP: `neblla_publish_community_entry` seeds your community as yourself.

## Build 29 — 2026-05-31
- **File transfers are now integrity-checked.** `sendFile` sends the file's SHA-256 in the header and the receiver verifies it against the reassembled blob before delivering. If it doesn't match (a truncated or corrupted transfer, or a wrong declared size) you now get a `fileError` event (`{reason: 'checksum_mismatch' | 'size_mismatch'}`) instead of a silently broken file. Documented in `llms.txt`.

## Build 28 — 2026-05-31
- **Developer portal login fixed.** Register, forgot-password, password-reset and resend-confirmation on the developer portal's login modal were hitting a route that wasn't mounted and failing — they now work.
- **Mid-day quota packs apply instantly.** Buying an extra-quota pack while your app is already at its daily limit now lifts the ceiling immediately, instead of staying blocked until the next daily reset.
- **Board role can't become the server.** A `board` (screen/scoreboard) participant is now excluded from server-peer selection in peer-JS mode, with a fallback if every member is a board.
- **App config changes apply immediately.** Updating your app (server mode, room policy, moderators, feature switches) now takes effect right away instead of waiting ~10s for the config cache to expire.
- **File transfer size limit enforced on send.** `sendFile` now rejects files larger than 100MB at the sender (previously only the receiver checked), and file IDs use a more robust generator.
- **Paid products stay hidden until you can get paid.** Without an active payouts account (Stripe Connect), paid products can be created but are kept out of the catalog until you connect — previously they could be published and the buy button would fail at payment. The API response now includes `connectRequired`.

## Build 27 — 2026-05-30
- **Backoffice user sorting fixed.** Ordering users in your backoffice by number of flags or by ban status now works correctly (it was silently ignoring the chosen order).
- **Moderator removal now takes effect immediately.** Removing a moderator now revokes their permissions right away, instead of leaving them active until the next config reload.
- **OAuth loopback redirects on IPv6 fixed.** Registered `http://[::1]:<port>/…` redirect URIs are now accepted during the OAuth/MCP flow (they were being wrongly rejected).

## Build 24 — 2026-05-30
- **Google sign-in fixed.** Signing in with Google on the developer portal and the gallery now works again (it was failing with a server error).

## Build 23 — 2026-05-30
- **Pro now raises your daily quota.** An active Pro subscription lifts the app's daily SDK credit ceiling (free 100 → Pro 2000 credits/day), on top of the existing higher communications and AI caps.
- **Extra quota packs work.** A purchased extra-quota pack now actually raises your ceiling. It's a one-time buffer for spikes — consumed as you use it, and not refilled on the daily reset.
- **Clear "quota exceeded" signal.** When an app runs out of daily quota the SDK now fires a catchable `error` event (code `quota_exceeded`) and logs a console warning, instead of events silently going dead.
- **Session-expiry signal.** The SDK now emits `sessionExpired` when a logged-in user's 30-day SSO session lapses, not only on a short-session reconnect failure.
