···4444Each origin is added to a hardcoded server-side allowlist with the collection
4545NSID prefixes it may write. v0 ships with:
46464747-| Origin | Allowed collection prefixes |
4848-| ------------------- | ----------------------------- |
4949-| `https://atmo.rsvp` | `community.lexicon.calendar.` |
4747+| Origin | Allowed collections |
4848+| ------------------- | ---------------------------------------------------- |
4949+| `https://atmo.rsvp` | `community.lexicon.calendar.*`, `app.bsky.feed.post` |
5050+5151+Prefix entries ending with `.` match anything under that namespace
5252+(`community.lexicon.calendar.event`, `community.lexicon.calendar.rsvp`, …).
5353+Entries without a trailing dot match the exact NSID only.
50545155Adding a new origin or collection requires:
5256···196200Calling `promptLogin()` while the user is already signed in is a no-op from
197201the iframe's perspective; the parent may still display the modal.
198202203203+### `Blento.notify(name: string, payload?: unknown): void`
204204+205205+Generic iframe → parent signal for app-defined events. Names are not
206206+validated by Blento — they're a contract between your embed and the Blento
207207+surface that hosts it. Fire-and-forget; no response.
208208+209209+Typical uses: tell the parent to close a modal after a successful create,
210210+nudge the parent to refresh a sibling counter, surface an "edit cancelled"
211211+intent.
212212+213213+```js
214214+// in the iframe
215215+await Blento.createRecord({ ... });
216216+Blento.notify('event-created', { uri });
217217+218218+// in Blento, on the host component
219219+<AtmoEmbed
220220+ origin="https://atmo.rsvp"
221221+ path="/embed/create"
222222+ allowedCollectionPrefixes={['community.lexicon.calendar.']}
223223+ onnotify={(name, payload) => {
224224+ if (name === 'event-created') closeModal();
225225+ if (name === 'cancel') closeModal();
226226+ }}
227227+/>
228228+```
229229+230230+Prefer `notify()` over `notifyNavigate()` when the parent wants to react
231231+locally (close a modal, show a toast, refresh a count) without changing the
232232+top-level URL.
233233+199234## Errors
200235201236All write rejections are `BlentoError` instances with a stable `.code`:
···237272{ v: 0, type: 'blento:resize', heightPx } // unsolicited
238273{ v: 0, type: 'blento:navigate', url } // unsolicited
239274{ v: 0, type: 'blento:promptLogin' } // unsolicited
275275+{ v: 0, type: 'blento:notify', name, payload? } // unsolicited
240276```
241277242278`id` is any unique string you generate — the parent echoes it on the response.