{
  "schema": 1,
  "product": "miblo",
  "version": "1.27.0",
  "date": "2026-10-09",
  "notes": "# Miblo 1.27.0\n\n## Gráficos ao vivo, fluidos de verdade\n\n- A chart that changes all the time (CPU, audio, a sensor, a speed) now has **two modes**. **Near real time** is what every card already does: the value comes with each card and the item's `fx` animates the change on the gadget. **Fluid animations** (`live` on a `spark`, `ring` or `bar`, with an `id` and a `range`): the program pushes samples at any rate with `screen.push(id, value)` and the Miblo plays them back on its own clock at up to 30 fps.\n- **The screen stream:** everything visual an app does now reaches the Miblo through one persistent, encrypted connection from the paired computer (port 8081, a handshake proving the pairing, every frame sealed with ChaCha20-Poly1305 and a strict counter); everything else stays HTTP. Live samples flow continuously with a small ~0.4 s buffer. When the stream is not available (older firmware, a weak network) the bridge falls back to batches of 3 s: **that buffer is necessary and it costs a delay of 3 s, which is compensated because the next batch is loaded behind the scenes while the current one is being shown.**\n- **The computer draws, the Miblo only paints:** for live sparklines and bars over the stream, the bridge renders the next frames with the Miblo's own drawing code and sends only the pixels that change, stamped with the moment they must appear; the Miblo paints them on time. A heartbeat chart went from 32–76 ms of drawing per frame to under 1 ms.\n- Limits: 2 live items per card, `hz` 1–30, `seconds` 1–5, a finite `range`; nothing is written to the flash. `miblo screen status` shows the stream (\"Stream: ligado (8081) · RTT 8 ms\") and each live chart (\"Ao vivo: cpu · 30 fps real · 6 ms\").\n\n## O Miblo cuida do que importa primeiro\n\n- **One app at a time:** only the app whose turn it is gets anything on the Miblo; the next one's files and card go when its turn comes, after the previous one is stopped.\n- **AI sessions and alerts first:** the sessions screen and every alert jump ahead of app traffic, and an animation or live chart gives its memory and processor back the moment one arrives.\n- **Faster when an app shows:** the processor goes to 160 MHz half a second before an app's screen comes in and back to 80 MHz after it leaves; text over an animation is composed once instead of redrawn every frame.\n- **Smaller firmware:** 40 KB less, with the same screens and the same accents.\n\n## Apps só de alertas e webhooks\n\n- **Alert-only apps:** an app may have no screen at all and only send alerts (`screen: false` and its alert types). `miblo.alerts` in both SDKs: send with a type and a dedupe key, `test()`, `status()` (why an alert would not show: off, quiet hours, rate limit). In the Miblo app: one switch per alert type, \"Testar alerta\", the history of the last 50, quiet hours. A new alert type starts off until you turn it on.\n- **Webhooks (Miblo+):** a private URL per hook at miblo.ai; GitHub, Stripe, Vercel, Sentry or any service that sends webhooks becomes an alert on your desk. The payload crosses our servers only in transit, sealed to your computer; the mapping runs on your computer, never on ours: presets, a **from → to** editor with `{{ field }}` templates and JS expressions, or a script, in a sandbox. Watch deliveries arrive, test and replay in the Miblo app.\n\n## Para quem cria apps\n\n- `miblo apps new <nome> [--alerts]`, `miblo apps dev` (a 240×240 simulator in the browser drawn by the Miblo's own code, reloading on every save, with the app's settings, alerts and logs) and `miblo apps check` (the store's checks, locally). A starter kit without the plugin at miblo.ai/dl.\n- SDK 1.3.0 (`@miblo/status`, `miblo-status`): `screen.push`, `live`, `miblo.alerts`. The guide gets **Gráficos ao vivo: dois modos** and **Apps só de alertas**.\n\n## Apps\n\n- **Demo ao vivo** (18 in the store): both modes side by side in five scenes, with the fps the Miblo measures.\n- **Meu computador:** the CPU as a live ring and sparkline.\n- **Radar:** city search like Clima, a slow radar sweep with a phosphor trail.\n- **\"Usar minha localização\"** on every city setting (asks the computer's location; an approximate one by IP only after saying so).\n- **Jogo do time:** smaller crests centred on the time; \"int.\" at half-time.\n- Settings are never free text any more: Notificações picks from the apps that actually notified on this Mac; quiet hours are two time fields. Dates in every app follow the app's language.\n\n## Celular e app Miblo\n\n- The phone chat shows your own messages (\"enviando…\", \"enviada\", \"não entregue\" with retry) and keeps them in the history. You verify once per unlock instead of on every message (up to 30 min, ends on lock or panic); \"Pedir verificação a cada mensagem\" stays as an option.\n- App 1.9.0: alert types and history, webhooks, \"Usar minha localização\", removing an app works again, disabling an app takes its screen off at once.\n\n## Correções\n\n- \"Limites indisponíveis\" no longer appears while limits are still valid: a failing source keeps the last good value until its reset, Claude and Codex never blank each other, and `miblo limits --why` tells exactly why a value is missing.\n- A disabled app's screen no longer stays on the Miblo; the App screen falls back to the Overview when the last app leaves.\n- The settings page at miblo.local always opens, even while an app animates.\n- Security review of everything above: no high findings; mediums fixed (stream takeover from the LAN, sandbox memory cap, quiet hours by an AI agent, webhook room routing).",
  "assets": [
    {
      "name": "miblo-geekmagic_ultra-1.27.0.bin",
      "kind": "firmware",
      "board": "geekmagic_ultra",
      "path": "firmware/1.27.0/miblo-geekmagic_ultra-1.27.0.bin",
      "size": 962624,
      "sha256": "e282316b284c9b3e1aff8f3ae9ac42910ac9db4902b36d3ce7c266d964587004"
    },
    {
      "name": "miblo-loader-geekmagic_ultra-1.27.0.bin",
      "kind": "loader",
      "board": "geekmagic_ultra",
      "path": "firmware/1.27.0/miblo-loader-geekmagic_ultra-1.27.0.bin",
      "size": 313184,
      "sha256": "8347a677d8a0edfd562db5c24b795c6df214893b759026f9297a1a117463a925"
    },
    {
      "name": "miblo-plugin-1.27.0.zip",
      "kind": "plugin",
      "path": "plugin/miblo-plugin-1.27.0.zip",
      "size": 1286413,
      "sha256": "4b10d634a818283f01987057e558f6dbe484c627413e5de544c8a1f2466e1f8b"
    },
    {
      "name": "Install-Miblo-macOS.zip",
      "kind": "installer",
      "path": "installers/1.27.0/Install-Miblo-macOS.zip",
      "size": 20277,
      "sha256": "b92768d9393aa22111bbc34fb5bf69e9786a0976d247a7c514c10ed9e7f81a0c"
    },
    {
      "name": "install.ps1",
      "kind": "installer",
      "path": "installers/1.27.0/install.ps1",
      "size": 69303,
      "sha256": "b00f0f39b8cc06fa880e524e44198309f17c34087898f05699038ee5c59fcac8"
    },
    {
      "name": "install.sh",
      "kind": "installer",
      "path": "installers/1.27.0/install.sh",
      "size": 64586,
      "sha256": "f67ef6555a36661a9a46947ea1cb0f8c21c1ade89965ed51a24e60da185717e7"
    }
  ]
}
