> For the complete documentation index, see [llms.txt](https://mango-5m.gitbook.io/mango5m-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mango-5m.gitbook.io/mango5m-docs/free-resources/mango-notify/updates.md).

# Updates

Release notes for Mango Notify.

{% updates format="full" %}
{% update date="2026-08-14" tags="optional-update" %}

## v1.2.0

**Interactive prompts.** Notification cards the player answers with a keybind — accept/decline flows without a menu, a cursor, or any loss of control.

### Added

* **`prompt` export** — show a card with keybind actions and get the answer in a callback. Full guide: [Interactive Prompts](/mango5m-docs/free-resources/mango-notify/developer-guide/interactive-prompts.md).

```lua
exports.mango_notify:prompt({
    title       = 'Trade Request',
    description = 'John Doe wants to trade with you',
    icon        = 'handshake',
    duration    = 15000,
    actions = {
        { key = 'E', label = 'Accept',  style = 'success', value = 'accept'  },
        { key = 'X', label = 'Decline', style = 'danger',  value = 'decline' },
    },
}, function(result)
    -- 'accept', 'decline', or nil on timeout
end)
```

* **`promptAwait`** — the same thing inside a coroutine, returning the result directly instead of taking a callback.
* **`promptServer`** — the whole round trip from a server script. It shows the prompt on that player's screen and calls your server-side callback with the answer, so calling resources no longer need their own client file and reply event.
* **`cancelPrompt`**, **`cancelPrompts`** and **`IsPromptActive`** for managing open prompts.
* **`Config.Prompt`** — answer window, how many prompts can stack, the rebindable key slots, action colours, and death handling. See [Prompts](/mango5m-docs/free-resources/mango-notify/configuration/prompts.md).
* **`Config.Types.prompt`** — prompts take their icon, accent and sound from the type table like every other notification, so they theme with the rest of your setup.
* **`/promptrest`** test command — a two-action prompt, `/promptrest stack` for three at once, and `/promptrest await` for the coroutine version. Gated behind `Config.EnableTestCommand` like `/mnotify`.

### How prompts behave

* **No NUI focus, ever.** No cursor and no input capture — players keep driving, running and shooting while a prompt is up. The keys are read client-side.
* **The callback always fires, exactly once** — on a keypress, on timeout, on cancel, on death, and on resource stop. A prompt rejected for bad input calls back with `nil` too, so a calling script is never left waiting on something that was never shown.
* **One prompt owns the keys.** The newest is active; older ones stay visible with their keys greyed out and hand the keys back down the stack as they resolve.
* **The answer is acknowledged.** The key chip the player hit flashes and the actions they did not take fade back before the card leaves, so answering looks different from letting it lapse. Tunable with `Config.Prompt.PressFlash`.
* **Players can rebind the keys.** `E` and `X` are registered as real FiveM key bindings, so anyone whose `E` is already spoken for can move it under **Settings → Key Bindings → FiveM**. The card shows their binding, not a hardcoded letter.
* **Idle cost is unchanged at `0.00ms`.** The key loop is created when the first prompt opens and stops itself when the last one closes — there is no always-running thread.

### Changed

* The notification cap (`Config.MaxNotifications`) now counts ordinary notifications only. Prompts have their own cap in `Config.Prompt.MaxActive`, are never held in the queue behind toasts, and are never pushed off screen by `QueueMode = 'replace'` — a question the player is still answering should not vanish because a pickup message arrived.
* Duplicate prevention skips prompts. Two prompts with the same wording are two separate questions, not a repeat.

### Updating from 1.1.x

Replace the resource files and restart. Every export, event and config value from 1.1.x behaves exactly as before, and nothing that was working stops working.

**You can keep your existing `config.lua`.** Prompts fall back to built-in defaults when the `Config.Prompt` block is missing — the same values shipped in the new config, so `E`/`X`/`G`/`H`, a 15 second window, and up to three at a time. Everything keeps working, you simply cannot retune it.

To tune the key slots, the answer window, the press flash or the action colours, copy the `Config.Prompt` block and the `prompt` line from `Config.Types` out of the new `config.lua` into yours. Both are additive — nothing else in your file needs to change.

{% hint style="info" %}
This becomes a **mandatory** update the moment you install a resource that calls the prompt exports. On 1.1.x those exports do not exist, so the calling script errors.
{% endhint %}
{% endupdate %}
{% endupdates %}
