The VACUUM INTO snapshot import pulled dart:ffi via package:sqlite3, which
does not compile on web. Isolate it behind a conditional import (native impl
+ web stub); the migration is native-only and never runs on web.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The DB directory came from getApplicationSupportDirectory(), which on Windows
is derived from the executable's Company/Product version metadata. Two builds
with different metadata (or a future rebrand) resolved DIFFERENT %APPDATA%
folders and read DIFFERENT databases, so a user's history appeared to vanish
when they ran a different build.
Pin the desktop DB to a constant path (Windows: %APPDATA%\Offband MeshCore;
Linux pinned too, its support dir derives from the exe name). On first run at
the pinned location, migrate an existing DB in via SQLite VACUUM INTO (a
consistent snapshot that is safe even under a concurrent writer), choosing the
DB from the known canonical locations first and falling back to a bounded
scan of the app-data roots (no name blocklist) so a DB under an unknown
folder is still found. On any snapshot failure it aborts cleanly, leaving the
source intact and opening a fresh DB - never a raw file copy of a live WAL DB.
Adds sqlite3 as a direct dependency (pinned to drift 2.34.2's resolved 3.5.0).
Tests cover source selection, the folder-agnostic scan, and the snapshot
happy + abort paths.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Owner's call: 'a few of you asked how to chip in, so I put up a page'
reads as responsive/humble and implies traction, vs. asking for money.
Community-request framing fits Discord (talking to the folks who asked);
release-notes donation line stays broader-audience.
Part of #160. Agent: SapphireCompass (session 8d755b5e)
Owner's call: include the live web URLs and sequence the main promotion
(which deploys offband.app) BEFORE the release tag, so offband.app is up
and verified before the notes go public. Avoids a pointless second push
just to add URLs.
Restored offband.app in the platform list, changelog, and Discord link.
Part of #160. Agent: SapphireCompass (session 8d755b5e)
- Release notes: added a Support Offband donate section (offband.org/donate,
verified live), framed toward funding iOS.
- Discord: fully rewritten, richer per-feature copy + real links (download/
release, project site, donate). Was thin and link-less.
- Web handling: offband.app is NOT deployed (404) and untested, so pulled the
live web claim from the platform list, changelog, and Discord; replaced with
'browser version coming soon'. dev.offband.app works but is not a release URL.
Gate passes; no em-dashes in the new copy.
Part of #160. Agent: SapphireCompass (session 8d755b5e)
Hero image (SHA-pinned raw URL, resolves now + at release) at the top;
removed the pinned-rail and FEM-LNA placeholders per Ben (one deliberate
hero, no empty slots).
Agent: SapphireCompass (session 8d755b5e)
Reordered + marketed per direction: platforms-first (Android/Windows/
Linux/Web now shipped every release), then the interface redesign as the
headline (left rail, pinned rail, in-place channel nav), storage, GIFs
(cross-client tap-to-view + Tenor render), a big FEM/LNA callout, deeper
diagnostics (persisted rxTime, honest path units), and performance.
Added <!-- SCREENSHOT: ... --> placeholders at the hero, pinned-rail,
and FEM-LNA spots for Ben to drop captures into the GitHub release
editor (real screenshots must be captured from the running app; not
faking them).
No em-dashes.
Part of #160. Agent: SapphireCompass (session 8d755b5e)
Marketing version 1.2.0 (Ben's call: minor bump for a storage-engine
migration + nav overhaul, not a patch). versionCode 61 (next after 60,
current on Play).
- pubspec 1.1.2-rc.3+60 -> 1.2.0+61
- CHANGELOG [1.2.0] section
- release-notes/1.2.0.md (GitHub release body)
- play/1.2.0.txt (498/500 chars)
- discord/1.2.0.md
Release-gate passes (all four texts present, play within limit). No
em-dashes in the new copy. Headlines: drift/SQLite storage migration
(auto-migrates existing data), new nav shell, cross-client GIF links.
First release cut end-to-end through the #312 pipeline.
Part of Play epic #160. Agent: SapphireCompass (session 8d755b5e)
16 hours ago
11 changed files with 684 additions and 80 deletions
🚀 **Offband Meshcore 1.2.0 is here, and it's our biggest release yet.**
A ground-up interface redesign, a real database under the hood, GIFs that work across every MeshCore client, and hands-on control of your radio's RF front end. This is also the first Offband release built, signed, and shipped to every platform automatically.
🎨 **A brand-new interface.** The headline feature. There's a new **left rail** you open from the hamburger button and can **pin open**, so it lives right alongside your chat instead of covering it. Your channels live in the rail and switch **in place**, so you never lose your spot. Map toggles, Disconnect, and Settings all found sensible new homes, and the back button finally behaves.
🗄️ **Your data on solid ground.** Messages, contacts, and channels now live in a real **SQLite database** instead of scattered preference files. Your existing data migrates automatically on first launch, nothing is thrown away, and full message history is preserved. On desktop it no longer fights with OneDrive/Documents sync.
🎞️ **GIFs everyone can see.** GIFs now send as a **Giphy link** instead of an Offband-only code, so people on **stock MeshCore and other clients can tap and watch them** too. Pasted **Giphy and Tenor** links render inline.
📡 **Take command of your radio's front end.** On supported hardware, you can now toggle **FEM / LNA** right from Radio Settings, and Device Info reads out your radio's Offband capabilities.
⚡ Plus a **snappier app** from the new storage engine, **desktop window position** remembered between launches, contact settings from the long-press menu, deeper mesh diagnostics, and you can't accidentally block your own node anymore.
**📥 Download for your platform:** https://github.com/OffbandMesh/meshcore-client/releases/tag/v1.2.0
🌐 **Or run it right in your browser, no install:** https://offband.app
🔗 Project home: https://offband.org
📝 Full changelog is in the release notes at the link above.
❤️ **A few of you have asked how to chip in, so I've put up a donation page:** https://offband.org/donate. Offband is free and open source and always will be. Anything there just helps keep the project going, and helps cover getting it onto the iOS App Store. Thank you all for being part of this.
Our biggest release yet. A ground-up interface redesign, a real database under the
hood, GIFs that work across every MeshCore client, and hands-on control of your
radio's RF front end. This is also the first Offband release built, signed, and
shipped to every platform automatically.

### One app, every platform
From this release on, every Offband build ships everywhere at once, signed with
the same key so updates just work:
- **Android**: install from Google Play or sideload the signed APK
- **Windows**: desktop build
- **Linux**: desktop build
- **Web**: run it right in your browser, no install, at [offband.app](https://offband.app)
Pick your platform below.
### A brand-new interface
The headline feature. Offband has been rebuilt around a modern navigation shell
that finally gets out of your way.
- A **left rail** you open from the hamburger button, and can **pin open** so it
lives right alongside your conversation instead of covering it.
- Your **channels live in the rail** and switch **in place**, so jumping between
channels never loses your spot or your scroll position.
- Map layer toggles, Disconnect, and Settings all found sensible new homes in the
panel, and the back button finally behaves the way it should: it backgrounds
the app instead of killing it, and never knocks you off a connected radio.
### Your data, on solid ground
Under the surface, Offband now keeps your messages, contacts, and channels in a
real SQLite database instead of a pile of loose preference files.
- Your **existing data migrates automatically** the first time you open this
version. Nothing is thrown away, and your **full message history is preserved**.
- Storage problems that used to fail silently now surface, so nothing goes wrong
in the dark.
- On desktop, your data no longer gets swept into OneDrive/Documents sync.
### GIFs everyone can see
GIFs are no longer an Offband-only party trick.
- Send a GIF and it goes out as a **plain Giphy link**, so people on **stock
MeshCore and other clients can tap it and watch it** too, not just Offband
users.
- Paste a **Giphy or Tenor** link and it renders inline, behind a trusted-host
safety allowlist.
### Take command of your radio's front end
Power users, this one's for you. On supported hardware, Offband now gives you
direct control of your radio's **FEM / LNA** (the front-end module and low-noise
amplifier that shape receive sensitivity and transmit path).
- Toggle **FEM LNA** right from Radio Settings.
- Device Info now reads out your radio's Offband capabilities, so you can see at a
glance what your hardware supports.
Both are gated on firmware capability, so they appear only where the radio
actually supports them.
### Deeper diagnostics
More signal, less guesswork when you need to see what your mesh is doing.
- Message **arrival time is now logged and persisted** separately from the claimed
send time, so you can tell when a message really reached you versus when the
sender says it left (#285).
- Path diagnostics report **honest, width-aware units** instead of mislabeled hop
counts, and path lengths decode exactly per the firmware contract.
### Faster across the board
The new storage engine and a round of under-the-hood work add up to a noticeably
snappier app.
- Connecting no longer rewrites your entire preferences file for every channel, so
connect time is quicker and lighter on storage.
- Bulk reads and writes go through the database now, which scales far better as
your message and contact history grows.
### And a few more
- Desktop remembers your window size and position between launches.
- Reach a contact's settings straight from its long-press menu.
- You can no longer accidentally block your own node.
---
See the full, itemized changelog in the repository.
### Support Offband
Offband is free and open source, built by a very small team. If it is useful to
you, please consider chipping in at
[offband.org/donate](https://offband.org/donate). Donations go directly toward
keeping the project going and toward getting Offband onto the iOS App Store, which
carries its own ongoing Apple costs. Thank you for being part of it.