{
  "schema": 1,
  "product": "miblo",
  "version": "1.28.0",
  "date": "2026-10-10",
  "notes": "# Miblo 1.28.0\n\n## Os apps ganham vida\n\n- Every official app now animates on the Miblo, with scenes drawn by our own code and kept in the flash (uploaded once, replayed for free) and short **moments** when something happens:\n- **Jogo do time:** your team scores → the crest alone fills the screen and pulses with rays, then **\"GOOOOOOOL do <time>\"** with the scorer and the minute; the opponent scores → a sad cloud rains on your drooping crest, then who scored; the final whistle → fireworks, the two crests side by side, or rain.\n- **Clima:** the weather of now behind the temperature: rain, snow, sun, drifting clouds, lightning, moon and stars; an umbrella moment when rain comes within the hour.\n- **Cripto, Dólar e Euro, Bolsa:** a rocket on +5 %, a falling coin on −5 %, a line crossing your threshold (\"Avisar ao cruzar\"), the sun rising and setting with the market.\n- **Repositório, Docker, Status, Serviços, Hacker News:** the CI pipeline moving (a siren when it fails, confetti when it is green again), a whale and its containers (one falls when it dies), a heartbeat that turns into a siren when a service goes down and a check when it is back, upvotes rising.\n- **Tocando agora:** a turntable with the album cover and a live progress ring. **Notificações:** a letter in the app's colour flies into a mailbox. **Meu computador:** a fan that spins with the CPU, heat, a charging battery.\n- **Fusos:** the first city's sky and a spinning globe. **Radar:** a plane crosses when one flies close. **Agenda:** pulsing rings five minutes before a meeting, a coffee on a free afternoon, confetti when the day's meetings are over.\n- No animation ever covers the text: every scene and moment is checked against the card's layout.\n\n## O carrossel do jeito certo\n\n- **\"No rodízio, sempre\"** is now a real carousel: sessions → app A → sessions → app B…; the sessions never stay out for longer than one app's turn, and a session that starts, needs you or finishes takes the screen at once.\n- **Each app has its own time on screen** (5–120 s), and so do the sessions (\"Quanto tempo cada um fica na tela\").\n- **\"Mostrar a tela no Miblo\"** and **\"Permitir alertas\"** are separate: an app can run only for its alerts (your team's goal) without entering the rotation.\n- **\"Mostrar agora\"** shows that app's screen for 10 s. An old pin no longer holds the App screen forever.\n- The animation follows the app's turn: every app animates in its turn, with no extra writes to the flash; moments share a common space and every app keeps its own scene.\n\n## Para quem cria apps\n\n- SDK 1.4.0: a card may have no items while your animation plays (the title stays in the header); `status()` says whether your animation is playing now or waiting for its turn, and whether your screen is allowed at all.\n- The animation kit used by the official apps (`apps/lib/anim-kit.js`) is documented for app authors.\n\n## Uma confirmação por hora\n\n- Messages from the phone or the web app to your computer ask for one confirmation per hour, not one per message: the grant now survives the app locking and reloading (on iOS the home-screen app reloads after a while in the background, which asked again every time). The message field says \"Confirmado por mais N min · Travar agora\"; \"Trancar agora\" in the settings ends it too.\n- \"Controle avançado (Miblo+)\" in the Miblo app: one confirmation on the phone allows the next changes from that computer for an hour (`miblo plus confirm lock` ends it; panic, `remote off`, revoking the phone or restarting the bridge end it too). Admitting a second phone still asks on its own, and the CLI still refuses AI agents.\n\n## App Miblo 1.10.0\n\n- The Apps tab looks right again (quiet hours as a proper card, consistent spacing), the per-app screen time, the screen and alerts switches, \"Mostrar agora\" that works.\n\n## Correções\n\n- The App screen no longer blinks while an animation plays: when the Miblo lends the animation's memory to a request for a moment (a card, a live batch, a status poll), the picture stays on the panel and, on the return, only the items drawn meanwhile are put back; nothing is cleared and nothing is drawn twice.\n- A scene whose memory is short at the instant it is asked for is tried again a quarter of a second later, where it was, instead of five seconds later from its first step: scenes now show from the first frame of an app's turn.\n- Scenes are taken at the first attempt even when the heap is busy right after the card (no more \"busy\" storms between the bridge and the Miblo), and the carousel keeps going through quiet spells.\n- `miblo screen status` (GET /api/screen) says why an animation is not loaded (not shown, a request pending, the hold, the heap, a file) and how often its memory was lent.\n- The fleet installer updates the \"Smart Weather Clock\" look-alike unattended.\n- Dates in every app follow the app's language.",
  "assets": [
    {
      "name": "miblo-geekmagic_ultra-1.28.0.bin",
      "kind": "firmware",
      "board": "geekmagic_ultra",
      "path": "firmware/1.28.0/miblo-geekmagic_ultra-1.28.0.bin",
      "size": 969008,
      "sha256": "2b327d1f944d3b916f8656b57cefd745597c0ee8dcb0a881edecc0ef6dcf8f41"
    },
    {
      "name": "miblo-loader-geekmagic_ultra-1.28.0.bin",
      "kind": "loader",
      "board": "geekmagic_ultra",
      "path": "firmware/1.28.0/miblo-loader-geekmagic_ultra-1.28.0.bin",
      "size": 313184,
      "sha256": "ad10d453e1abe189197392b7ca8180853ca3b282f3ee1c9019ca33d96c8d6ea8"
    },
    {
      "name": "miblo-plugin-1.28.0.zip",
      "kind": "plugin",
      "path": "plugin/miblo-plugin-1.28.0.zip",
      "size": 1360303,
      "sha256": "a540f2c080e709261f49462b5240fa4de6472dc83c01090bbf8bf19983093d6d"
    },
    {
      "name": "Install-Miblo-macOS.zip",
      "kind": "installer",
      "path": "installers/1.28.0/Install-Miblo-macOS.zip",
      "size": 20277,
      "sha256": "3f2a96d715c591725bab294698606150731d0dc05d26b76d7b2f9a20372d9964"
    },
    {
      "name": "install.ps1",
      "kind": "installer",
      "path": "installers/1.28.0/install.ps1",
      "size": 69303,
      "sha256": "b00f0f39b8cc06fa880e524e44198309f17c34087898f05699038ee5c59fcac8"
    },
    {
      "name": "install.sh",
      "kind": "installer",
      "path": "installers/1.28.0/install.sh",
      "size": 64586,
      "sha256": "f67ef6555a36661a9a46947ea1cb0f8c21c1ade89965ed51a24e60da185717e7"
    }
  ]
}
