{
 "releases": [
  {
   "kind": "brain",
   "version": "2026.11.5",
   "commit": "7ef6158",
   "date": 1793866680,
   "notes": [
    "Batch: a dropped device shows Disconnected instead of Shell exited",
    "Dashboard: a fresh browser opening a device's #services or #docker lands there, not on the Overview (app.js re-routes once the device's features arrive)",
    "Demo brain: everything on the dashboard works in the demo",
    "Demo brain for recording: --demo / BANANANA_DEMO=1 runs a separate brain on made-up data (Juniper Lane Studio: four Linux servers, a Mac, a Windows PC) beside a real one, with stable bananana.<screen>"
   ]
  },
  {
   "kind": "agent",
   "version": "2026.11.5",
   "commit": "7ef6158",
   "date": 1793866643,
   "notes": [
    "Batch: a dropped device shows Disconnected instead of Shell exited"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.4.18",
   "commit": "e42fdfe",
   "date": 1793865096,
   "notes": [
    "Maintenance and small fixes."
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.4.17",
   "commit": "e42fdfe",
   "date": 1793865070,
   "notes": [
    "The brain's link to a device, after a review of Noise and the admin pages",
    "The relay can stop seeing dashboards. bananana-edge (edge/) forwards <name>.bananana.dev by TLS server name, with no keys of its own",
    "A bananana.dev account alone can't act on a brain",
    "Noise link, relay and enrollment hardening"
   ]
  },
  {
   "kind": "agent",
   "version": "2026.11.4.3",
   "commit": "9e4c8b8",
   "date": 1793864757,
   "notes": [
    "The relay can stop seeing dashboards. bananana-edge (edge/) forwards <name>.bananana.dev by TLS server name, with no keys of its own",
    "Noise link, relay and enrollment hardening"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.4.16",
   "commit": "ba67345",
   "date": 1793864197,
   "notes": [
    "OS updates and rollouts, after a review. An update could only run 10 minutes: agents take 3600 seconds at most and use 600 for anything above, so the 3 hours asked for became 10 minutes and a long upd"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.4.15",
   "commit": "15ca070",
   "date": 1793862558,
   "notes": [
    "Who can reach what, tested on every deploy: portal/test_access.py tries every route and action on the brain as every role, as a role with one permission, as someone scoped to one group and signed out,"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.4.14",
   "commit": "a64d5ff",
   "date": 1793861570,
   "notes": [
    "Security review, second round. The relay no longer holds every brain to 25 connections, which turned away device 26 even on paid plans (Pro allows 100, Business 300): it allows 2000 per brain, limits"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.4.13",
   "commit": "7deb42e",
   "date": 1793848400,
   "notes": [
    "Maintenance and small fixes."
   ]
  },
  {
   "kind": "agent",
   "version": "2026.11.4.2",
   "commit": "7deb42e",
   "date": 1793848149,
   "notes": [
    "Maintenance and small fixes."
   ]
  },
  {
   "kind": "agent",
   "version": "2026.11.4",
   "commit": "6f615a5",
   "date": 1793847882,
   "notes": [
    "Maintenance and small fixes."
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.4.12",
   "commit": "6f615a5",
   "date": 1793847740,
   "notes": [
    "Security fixes from the penetration review"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.4.11",
   "commit": "ebe99e7",
   "date": 1793847443,
   "notes": [
    "Automatic OS updates: weekly, Sunday 02:00 to 05:00 brain time, through the rings"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.4.10",
   "commit": "66a060f",
   "date": 1793845430,
   "notes": [
    "Dashboard v2 on bananana.dev/admin: a sidebar at full width, built from modules (admin.MODULES, each joining with add()"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.4.9",
   "commit": "fd51379",
   "date": 1793833289,
   "notes": [
    "Brains report their real version: brainconf.VERSION read portal/VERSION, a hand-written file last changed on 28 Oct, so every brain told bananana.dev 2026.10.28"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.4.8",
   "commit": "d5a713d",
   "date": 1793832846,
   "notes": [
    "One authenticator for a brain and bananana.dev: a new Owner's is shared at first run (POST /v1/brains/totp, brain key plus Owner's email)"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.4.7",
   "commit": "90b6263",
   "date": 1793830901,
   "notes": [
    "Branded emails; customers and Roman get different ones; portal cancellations noticed"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.4.6",
   "commit": "91014ad",
   "date": 1793827521,
   "notes": [
    "Real logos for devices: Windows, Apple, Linux and the common distros"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.4.5",
   "commit": "4db0d73",
   "date": 1793827267,
   "notes": [
    "Paid plans: Stripe billing on bananana.dev, built and switched off"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.4.4",
   "commit": "bd1ad5c",
   "date": 1793826288,
   "notes": [
    "Maintenance and small fixes."
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.4.3",
   "commit": "5319318",
   "date": 1793826269,
   "notes": [
    "Compliance: a Windows device with one drive no longer takes the whole page down (its agent sends a lone drive outside a list)",
    "Take romanvaxman.com out of the product: contact email and retired dashboard address",
    "AI model page: a connection dropped during the sign-in tool's download fails with a message instead of hanging",
    "AI model page: ChatGPT and Claude plans now work on every brain"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.4.2",
   "commit": "9d75b1b",
   "date": 1793825213,
   "notes": [
    "Unraid and TrueNAS onboarding: /start asks \"Where will you run your brain?\" with Unraid and TrueNAS beside Docker and shows only the bst_ token with where to paste it"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.4",
   "commit": "591d11a",
   "date": 1793824283,
   "notes": [
    "AI model page: the sign-in no longer disappears after saving a plan, and the page is reworked"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.3.6",
   "commit": "923247e",
   "date": 1793767261,
   "notes": [
    "Live Defender and firewall events on Windows: the agent subscribes to their event logs (no commands run) and tells the brain within seconds"
   ]
  },
  {
   "kind": "agent",
   "version": "2026.11.3",
   "commit": "923247e",
   "date": 1793767222,
   "notes": [
    "Live Defender and firewall events on Windows: the agent subscribes to their event logs (no commands run) and tells the brain within seconds",
    "ClamAV: help page, privacy policy, third-party notices, plan",
    "Native Mac brain: install-brain.sh hands Macs to install-brain-mac.sh (bundled Python, launchd, the hidden _bananana user, awake on power, the Mac joins as This computer)"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.3.5",
   "commit": "dcea2fb",
   "date": 1793766597,
   "notes": [
    "ClamAV is for macOS and Linux only: on Windows, Microsoft Defender protects better and is managed from the Security tab"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.3.4",
   "commit": "02a0ace",
   "date": 1793766091,
   "notes": [
    "ClamAV: removing it stops a running clamscan too"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.3.3",
   "commit": "a86c604",
   "date": 1793766037,
   "notes": [
    "ClamAV can be removed while a scan runs; a status job that was waiting doesn't bring a removed device back; plan: what was tested",
    "ClamAV: help page, privacy policy, third-party notices, plan"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.3.2",
   "commit": "f7f6efe",
   "date": 1793763955,
   "notes": [
    "ClamAV: scans start without nohup (macOS refuses it under a service) and the job confirms the scan is running"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.3",
   "commit": "216abb1",
   "date": 1793763153,
   "notes": [
    "Free malware scanning with ClamAV: turn it on per device or for every device"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.22",
   "commit": "56ce10b",
   "date": 1793689502,
   "notes": [
    "Mac brain: the not-connected message fits a Mac"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.21",
   "commit": "16e02da",
   "date": 1793689329,
   "notes": [
    "Native Mac brain: install-brain.sh hands Macs to install-brain-mac.sh (bundled Python, launchd, the hidden _bananana user, awake on power, the Mac joins as This computer)"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.20",
   "commit": "9532c90",
   "date": 1793688446,
   "notes": [
    "Nightly brain updates wait (up to 4 hours) while someone has a device's screen or terminal open",
    "Fix agents stuck reconnecting for minutes (jobs timed out): the relay sends the brain's frames to a device's newest connection, not a half-open replaced one"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.19",
   "commit": "9dd4968",
   "date": 1793687236,
   "notes": [
    "Screen viewer reconnects by itself after a dropped link (1, 2, 3, 5, then every 10 s, for two minutes)"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.18",
   "commit": "48c452f",
   "date": 1793686646,
   "notes": [
    "Logs page: wider time column"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.17",
   "commit": "fe3ba18",
   "date": 1793686554,
   "notes": [
    "Logs page: event text wraps too"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.16",
   "commit": "2dde9f3",
   "date": 1793686449,
   "notes": [
    "Logs page: long entries wrap instead of widening the table"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.15",
   "commit": "215f419",
   "date": 1793686350,
   "notes": [
    "Logs page: checkboxes and fields sized for the filter grid"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.14",
   "commit": "d487273",
   "date": 1793686187,
   "notes": [
    "Logs page: the reports module no longer clashes with do_GET's own 'reports' variable"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.13",
   "commit": "fe01931",
   "date": 1793686077,
   "notes": [
    "Logs page: everything the brain records in one list (admin actions, connections, jobs, brain updates, notifications, service output) with filters and ready-made reports to Excel or PDF"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.12",
   "commit": "f580f4a",
   "date": 1793684880,
   "notes": [
    "Updates page checks bananana.dev for agent releases when opened (at most once a minute) instead of waiting for the hourly check"
   ]
  },
  {
   "kind": "agent",
   "version": "2026.11.2.9",
   "commit": "6a679f8",
   "date": 1793684773,
   "notes": [
    "Maintenance and small fixes."
   ]
  },
  {
   "kind": "agent",
   "version": "2026.11.2.8",
   "commit": "6a679f8",
   "date": 1793684474,
   "notes": [
    "Agent: disable bunch also stops the tailscaled the previous agent started (its state stays for enable)"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.11",
   "commit": "1611e0c",
   "date": 1793682942,
   "notes": [
    "Clicking Update retries an agent update that failed within the day (only automatic retries wait a day)"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.10",
   "commit": "7395f49",
   "date": 1793682695,
   "notes": [
    "Bunch relay limit per plan (item 11): Free 10 GB a month per organization through derp1, refused past it until the 1st"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.9",
   "commit": "2b966e7",
   "date": 1793674156,
   "notes": [
    "Bunch relayed traffic (plan item 11, brain side): per-device direct and relayed bytes, a day-relayed alert, \"Relayed\" on the device card, relayed bytes per brain in the heartbeat and /admin"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.8",
   "commit": "3fd1735",
   "date": 1793670726,
   "notes": [
    "Android build 5 (1.2): a lapsed brain session signs in again through bananana.dev"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.7",
   "commit": "46736e5",
   "date": 1793669242,
   "notes": [
    "bunch's programs stay current: agents and brains replace tailscaled and Headscale when new builds are published (item 17)"
   ]
  },
  {
   "kind": "agent",
   "version": "2026.11.2.7",
   "commit": "46736e5",
   "date": 1793669211,
   "notes": [
    "bunch's programs stay current: agents and brains replace tailscaled and Headscale when new builds are published (item 17)"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.6",
   "commit": "e80090d",
   "date": 1793668661,
   "notes": [
    "bunch steps aside where Tailscale already runs (item 15)",
    "bunch item 7: coordination traffic already runs over the direct link (item 2)"
   ]
  },
  {
   "kind": "agent",
   "version": "2026.11.2.6",
   "commit": "e80090d",
   "date": 1793668630,
   "notes": [
    "bunch steps aside where Tailscale already runs (item 15)"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.5",
   "commit": "06cba3a",
   "date": 1793667388,
   "notes": [
    "bunch: falls back in half a minute, comes back sooner, shows its path, and works in plain containers"
   ]
  },
  {
   "kind": "agent",
   "version": "2026.11.2.5",
   "commit": "06cba3a",
   "date": 1793667358,
   "notes": [
    "bunch: falls back in half a minute, comes back sooner, shows its path, and works in plain containers",
    "bunch: <device>.bunch names resolve on devices"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.4",
   "commit": "174812c",
   "date": 1793666805,
   "notes": [
    "bunch: <device>.bunch names resolve on devices",
    "bunch: derp1 relays only for bananana devices (docs/BUNCH.md item 8), not deployed yet",
    "bunch: derp1's region is San Francisco (DigitalOcean SFO3), not New York"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.3",
   "commit": "6977350",
   "date": 1793665062,
   "notes": [
    "bunch rules: by default devices reach only the brain"
   ]
  },
  {
   "kind": "agent",
   "version": "2026.11.2.4",
   "commit": "6977350",
   "date": 1793665033,
   "notes": [
    "bunch rules: by default devices reach only the brain"
   ]
  },
  {
   "kind": "brain",
   "version": "2026.11.2.2",
   "commit": "b5e8f7e",
   "date": 1793662697,
   "notes": [
    "Update guard and change log: the brain never updates itself and its agents at once, and the Updates page says what changed",
    "Date-based version numbers, and \"Third-party licenses\" (bananana.dev is proprietary, not open source)",
    "Updates page: when Update now hasn't started the updater after two minutes, say why and what to run",
    "Updates page: the brain's update step by step with a progress bar, and every device's agent",
    "Nodes page: each card shows its agent version, in the warning colour when a newer one is out",
    "Connection history on the brain and connection events on the relay, so a dropped device can be explained",
    "bunch on Windows brains: Headscale on Windows (our own build), and agent 0.3.22 fixes bunch on Windows agents",
    "bunch on by default: brains turn it on, devices join by themselves",
    "bunch: devices talk to the brain directly over bunch, with the relay as fallback (agent 0.3.21)",
    "bunch: the brain's own machine joins the mesh as brain.bunch",
    "Paperwork: open-source licenses, cookie policy, privacy and terms brought up to date",
    "Agent 0.3.20: bunch on Windows, and no log uploads to Tailscale",
    "brain: Update now no longer depends on bananana-update.path alone"
   ]
  },
  {
   "kind": "agent",
   "version": "2026.11.2.3",
   "commit": "b5e8f7e2",
   "date": 1793662696,
   "notes": [
    "Agent: the version line points at third-party licenses, not \"open-source notices\" (bananana.dev itself is proprietary)",
    "Date-based version numbers, and \"Third-party licenses\" (bananana.dev is proprietary, not open source)",
    "Connection history on the brain and connection events on the relay, so a dropped device can be explained",
    "Agent 0.3.23: stop waiting for the brain after two minutes and reconnect",
    "bunch on Windows brains: Headscale on Windows (our own build), and agent 0.3.22 fixes bunch on Windows agents",
    "bunch: devices talk to the brain directly over bunch, with the relay as fallback (agent 0.3.21)",
    "Paperwork: open-source licenses, cookie policy, privacy and terms brought up to date",
    "Agent 0.3.20: bunch on Windows, and no log uploads to Tailscale",
    "Agent 0.3.19 (bunch); publish-agent-mac.sh publishes only the signed macOS agents; the site serves bunch's downloads",
    "bunch phase 1 (not published): real interfaces under the agent's root service, downloads checked against SHA256SUMS, status, leave and resume after restarts",
    "bunch phase 0: a node joins a private mesh with only its Noise link",
    "Client Docker image for Unraid, TrueNAS and Synology (romanvaxman/bananana-node, not pushed yet): agent 0.3.18 runs in a container started with --privileged --pid=host --net=host --uts=host, reads the",
    "Windows: the brain and the agent appear in Settings > Apps > Installed apps (publisher CTF Designs, LLC) with an Uninstall that asks for admin rights itself",
    "\"Built by CTF Designs\" everywhere it matters: dashboard sidebar and sign-in page, help docs footer, every email, the Android app's More screen, and agent 0.3.16 (version output, and Company and Copyri",
    "Agent 0.3.15: add the tray autostart when it's missing"
   ]
  }
 ]
}