Skip to content

Obinot v2.0

Choose a tag to compare

@LexicoON LexicoON released this 20 Sep 02:48
· 22 commits to main since this release
7135839

Obinot v2.0 — Changelog

Version: 2.0.0 (versionCode 1)

🚀 This is the release where Obinot becomes its own app. New package (com.obinot.app), new repo, new icon, new strings. The internal format and data portability are preserved, but from now on Obinot ships and updates independently from the original Binot.


For Everyone

✨ Highlights

  • Obinot is now its own app. New package com.obinot.app, new launcher icon, brand-new adaptive icon set, and appId distinct from Binot so both apps coexist side-by-side without collisions in the launcher, file associations, or future distributions (Play Store, F-Droid, etc.).
  • Full backup format (.obinotbak) — v2. Your backup now includes notes, audio, labels (with their colors), and your preferences (everything except API keys, which never leave the device). One file, complete restore.
  • Legacy backup (.binotbak) — Binot 1.x compatible. A second export option in Settings writes the exact format the original Binot expects. Useful if you need to roll back or share with someone still on Binot 1.x.
  • In-app language picker. English + Spanish out of the box, with a per-app locale on Android 13+. The system language is respected by default — pick yours in Settings → General.
  • Adaptive layouts for tablets and landscape. The History grid now uses 3 columns in landscape (was 2), and the Record screen layout reflows to make better use of wide displays.

🆕 New Features

  • Auto-process toggle. New switch in Settings → AI to disable automatic processing of every transcription. Useful when you just want to capture audio and decide later which notes to process.
  • Full-text search (FTS4). Instant prefix matching across every field of every note — title, transcript, summary, highlights. Replaces the old label-only filter for finding content.
  • Reading font preference. Pick between Sans (default), Serif, or Mono for the Markdown reader in Settings → Reading.
  • Math inline rendering. Write $E = mc^2$ in your notes and see it rendered as proper math next to your text, not just a code block. Display math with $$...$$ still works as before.
  • Crash screen with shareable log. If the app ever crashes, a dedicated screen catches it, lets you copy or share the stack trace, and exits cleanly. No more silent kills.
  • Color privacy & data-safety docs. New privacy_policy.md and data_safety.md in the repo for anyone planning to distribute.

🐛 Bug Fixes

  • Fixed a WebView memory leak in the Markdown reader — every opened/closed note used to leave ~2–5 MB behind. WebViews are now properly torn down on release.
  • Fixed inline math overflow that was scaling formulas down too aggressively; only formulas that genuinely overflow the line now get scaled.
  • Fixed first-paint jank when opening a note with diagrams or math — the WebView init (~500 ms) no longer blocks the entrance animation.
  • Fixed the getLatestRelease API endpoint pointing at the renamed repo (LexicoON/Binot-fix → LexicoON/Obinot) so in-app update checks work again.
  • Fixed backup restore on first install by detecting .obinotbak (v2) vs .binotbak (legacy) automatically — both formats restore correctly without user input.

For Developers

  • New package namespace com.example → com.obinot.app across all 34 Kotlin files. Application ID switched from com.aistudio.binot.xrztp to com.obinot.app. versionCode reset to 1, versionName to 2.0.0 (independent app lifecycle).
  • NoteFtsEntity + MIGRATION_8_9 — Room FTS4 virtual table mirroring the notes columns for full-text search. New DAO queries: searchNotes(query, limit) with prefix matching.
  • SettingsRepository gained: appLanguageFlow, autoProcessFlow, readingFontFlow, all persisted via DataStore with first-class setters.
  • ImportExportHelper rewritten around two ZIP formats:
    • .obinotbak v2 — notes.json, audio/*, labels.json (name + colorHex), settings.json (no API keys), obinot_backup_meta.json.
    • .binotbak legacy — notes.json, audio/* only. Exact Binot 1.x format for cross-restore.
    • .binot v2 single-note export — added obinot_meta.json to carry label colors across apps.
  • ZIP helpers extracted to SettingsViewModel: writeBytesToZip (DEFLATED for JSON) and writeStoredFileToZip (STORED for audio, with CRC32 + size precomputed; reads ≤5 MB into RAM, streams larger files through a temp file).
  • Crash handler pipeline — CrashHandler registers a Thread.UncaughtExceptionHandler that writes the trace to a file and launches CrashActivity in a separate process (android:process=":crash") so a crash inside the crash handler can't recurse.
  • Per-app locale via AppCompatDelegate — MainActivity now extends AppCompatActivity and applies the persisted app_language preference before setContent(). locales_config.xml declared in the manifest for Android 13+ system-level locale support.
  • Inline math parser — splitInlineMath() splits a Markdown line on $...$ and $$...$$ with regex validation against false positives (prices like $100 are preserved as text).
  • WebView deferred mount — MarkdownText waits 200 ms after composition before mounting KaTeX/Mermaid WebViews, replacing them with shimmer skeletons during the delay to keep the entrance animation smooth.
  • Adaptive icon resources — generated ic_launcher_background.png, _foreground.png, and _monochrome.png for every density; the old ic_launcher_round.webp removed.
  • Release workflow — .github/workflows/release.yml now renames the built APK to Obinot-${TAG}.apk before uploading as an artifact and attaching to the GitHub release.
  • ProGuard rules — extended to keep the CrashHandler entry points and the new com.obinot.app model classes reachable in release builds.
  • Version: 2.0.0 / 1.

A quick word on how we got here

Obinot started life as Binot-fix, a community patch for the original Binot by @DENSLnetion, back when the AI providers retired the hardcoded model names and the app quietly stopped working. From there: a v1.1.x series that added Material 3 Expressive, colored labels, auto-compression, Mermaid + KaTeX offline, multi-provider AI, Mix Mode routing, and a hundred-and-thirty patches of polish — all while keeping the .binot format and database schema cross-compatible so nobody's notes ever got stranded.

This 2.0 is the release where we stop pretending otherwise: Obinot is its own app now, with its own identity, its own package, its own icon, and its own future. The format still opens in Binot 1.x, Binot 1.x backups still restore into Obinot, and the original Binot keeps living where it always has — we're a respectful fork, not a hostile takeover.


Thank you

A release like this doesn't happen alone, and this one was genuinely harder than it had any right to be — namespace migrations across 34 files, parallel format versions, crash-handler edge cases, and a full UI copy in two languages, all in one cycle. There were days it felt like the kind of refactor that breaks more than it fixes.

So a few honest thank-yous:

  • To @DENSLnetion, the original creator of Binot, for releasing it under MIT in the first place. Without that, none of this exists. Please go star the original repo — that's where the project truly lives.
  • To everyone who downloaded Binot-fix, opened an issue, sent a screenshot, or just said "hey, this worked for me" — small words, but they kept the project alive when the easy move would've been to drop it.

Here's to 2.0. Onwards.

— LexicoON