Choose between four painted Sun Salutation characters in Customize. Your choice is saved and appears in the practice, pose previews, and guide.
Changed
Replaced the previous Sun Salutation character with the four banner-inspired designs. The men wear distinct rust-and-charcoal and indigo-and-sand outfits.
Mini mode provides a compact practice window without changing your saved window or navigation settings.
Habits now have separate overview, statistics, and edit pages, with a dialog for recording daily counts and clearer week and month calendars.
Changed
Prebuilt FreeBSD packages are temporarily unavailable.
Sun Salutation now uses a painted character with smooth movement through all twelve poses, consistent proportions, and clean transitions without crossfading.
Practice customization and guides use the full screen, and Sun Salutation shows a simple seconds counter without the distracting progress bar.
Improved phone performance, touch responsiveness, text sizing, and Japanese and Chinese text wrapping.
Refined Settings, Profile, Lists, habit cards, session controls, and mood check-in buttons. Desktop users can zoom with Ctrl and the mouse wheel.
Fixed
Music keeps playing when you switch tabs inside the app or leave practice customization.
Restored sound and music playback in the web app.
Appearance dropdown menus stay above the Layout card and other settings, keeping every option visible and selectable.
Practice Customize and How-to actions now open the correct pages, and carousel swipes reliably change practices.
Animated screens keep their controls visible, and navigation transitions finish before accepting the next action.
Habit statistics no longer crash, and saved habit counts and imported records are retained correctly.
Opening a habit card keeps your place in the list instead of scrolling back to the top.
Habit day counts sit centered inside each circle, in a color that stays readable on every habit color.
Deleted sync records stay deleted across devices, and restoring an account preserves local changes waiting to sync.
Web and browser add-on text stays sharp at different text sizes, display scales, and zoom levels with the Canvas renderer.
Cancel reliably closes the exit-session dialog without interrupting the practice.
Selected app color themes now keep their backgrounds, cards, and text visible. Theme catalogs are included in every build, and an unavailable palette falls back to readable built-in colors.
Session details now show the practice name, time, and round count above clearly separated round rows with larger hold times and easier-to-tap edit and delete actions. Editing a round highlights its value and provides a labeled number pad with separate Cancel and Save actions.
Added cat, sea turtle, and crescent moon profile pictures in place of three similar tree choices.
Added the new peaceful meditation logo and made it the default app icon, with app icon selection available from Appearance.
Updated Kryon controls, navigation, styling, and text editing throughout the app.
Material is now the default style. Choose Material, TK, or Lightfield in Appearance, with color themes available within each style.
Navigation customization has cleaner spacing and smoother reorder handles.
Desktop development runs keep their settings and sync account separate from the installed app.
Completed list items now move behind a Show Completed toggle instead of staying mixed into the active list.
Practice controls sit closer to the bottom navigation while preserving the image fade.
Session results now show a clearer round chart and a compact summary for single-round practices.
About now uses proper Discord, Telegram, and GitHub icons, and the support dialog has cleaner donation address previews.
Removed the Vanilla style and the startup style-selection screen.
Fixed
Existing Android installations now move their private data to the consistent Inner Breeze location while preserving habits, sessions, settings, and sync details.
Desktop, web, and Windows installations now use the same Inner Breeze data location, moving existing data there on first launch instead of leaving it behind.
Backups exported by earlier releases import again, including archives named after the previous app identity.
Restored profile pictures in Settings and Profile. The picture picker now displays its full grid and uses standard scrolling and selection.
Settings row labels and icons now share the same vertical alignment.
Settings now uses one consistent modern screen instead of switching between duplicate layouts.
Sidebar switching is stable at responsive breakpoints instead of jittering between navigation modes.
Guide and modal panels remain visible with Material styling instead of showing text over the underlying screen.
Guide screens and practice previews are placed correctly across phone and desktop sizes.
Guide cards now have a clear heading, and tapping outside a focused control dismisses its focus.
Scrollable Settings pages leave comfortable space above the bottom navigation at larger text scales.
An unnamed local profile now has a neutral label in the navigation card.
Settings navigation opens the Settings overview, with improved bottom navigation and click handling.
Older navigation layouts now place Lists before Habits, Practice, and Settings.
Lightfield buttons and glow settings now update with the selected style, and glow is scoped to styles that support it.
Material sliders keep labels and values readable instead of floating too high or drawing white text on pale slider fills.
Android masked app icons use a gentle blue background instead of black.
Web loading screens and browser icons now show the current meditation logo.
Emptying a list no longer restores the initial sample data.
Improved text selection, keyboard focus, and composition handling when editing text.
Connecting to sync runs in the background so network requests do not block the interface.
Sync retries temporary connection failures automatically without losing queued changes.
Automatic friend-list retries stop when account details need attention, and retry delays recover safely from invalid saved counts.
Profile shows actionable sync status instead of internal repair messages.
Restoring an account key now starts synchronization and retrieves the account alias and existing friendships. Friend lists remain available when leaderboard loading fails.
Restoring a profile now reliably recovers habit history and session data alongside the alias and friends, including on Android.
Sync no longer asks you to upgrade just because the server supports a newer sync protocol.
Sync connection and account errors now display readable, translated messages.
Desktop update links now use the current Inner Breeze release location.
Replaced the legacy pixel UI icons with a cohesive MingCute-based icon set, packed into efficient embedded spritesheets with separate full-color assets for profiles, platforms, payments, languages, and logos.
Changed
Navigation and practice controls now use larger, clearer icons.
Volume controls now show distinct muted, low, medium, and maximum-volume states.
Updated the bundled Kryon runtime with smoother antialiasing, tear-free presentation, improved text editing, and more reliable desktop menus.
Fixed
Pressing Escape now closes stack/sidebar navigation before applying the normal screen-level Escape action.
Fixed a Windows build collision between Kryon and the Win32 `DrawIcon` API.
Every practice now includes a guided How-to with clear steps, swipe navigation, and labeled controls.
Changed
The Wim Hof guide now uses four focused pages with a prominent safety warning, breathing previews, progress indicators, and direct access to practice settings.
How-to controls now provide consistent hover, focus, keyboard, and touch feedback across supported devices.
Fixed
Exiting a practice started from How-to now returns to the normal Practice screen instead of reopening the guide.
On Windows, the title-bar close button and Alt+F4 now honor the selected close behavior, including showing the Keep running or Quit prompt.
Sync now uses the protocol v4 secure data format when the account has been migrated, while keeping the transition path compatible with existing synced data.
Fixed
Secure data migration now appears only for connected accounts that still need migration, and shows progress while the update is running.
Sync migration no longer leaves stale queued changes after all local data has been uploaded in the secure format.
Profile and sync account text can be selected by double-clicking.
Desktop startup no longer fails when the single-instance lock is unavailable.
Android landscape layouts now respect system bars and display cutouts.
Android releases now include the expected per-ABI APK downloads alongside the universal APK.
Practice screens now show only the practices that are currently available.
Desktop tray status now shows the active practice and phase in the tooltip where supported, and in the tray menu as a reliable fallback.
Fixed
Sync now runs only after an account is connected to a saved sync server.
Existing synced accounts keep their connected state after upgrading, while disconnected accounts no longer start background sync, social refreshes or websocket listeners.
Profile Data now distinguishes disconnected sync accounts from missing accounts.
Android practice notifications now keep showing the current phase and timer while a practice is running.
The practice screen now always shows all four practices: Wim Hof, Pattern Breathing, Meditation and Sun Salutation.
Android installs now fail with clear device, ABI and signing diagnostics instead of stalling or choosing the wrong target silently.
Pattern Breathing now plays the inhale and exhale cues in the correct direction.
Pattern Breathing keeps the phase text readable against bright breathing circles and shows the cycle and session timer at the top of the session screen.
Desktop break reminders now include a Habits action beside the practice launch buttons, so habits can be managed directly from a break window.
Changed
Store screenshots now focus on Android-relevant practice and habit screens, including Pattern Breathing, Meditation, Sun Salutation and multiple Material color themes.
Fastlane screenshot exports now use compressed PNG files consistently for Google Play and F-Droid metadata.
Regenerated Google Play and F-Droid screenshots with the corrected practice artwork, Pattern Breathing, Habits, Wim Hof how-to and Cobalt dark screens.
Fixed
Screenshot scene setup now opens the intended Habits overview, Habits statistics, Meditation and Sun Salutation screens.
Native screenshot capture now exits cleanly and writes valid PNG rows for downstream image tooling.
Practice banner images now resolve from the embedded asset table on Android/native builds, preventing missing or faded-looking artwork in packaged releases.
Donation wallet buttons now open Bitcoin and Monero URI intents through Kryon and show a clear toast when no wallet app is installed.
Monero and Bitcoin donation links now use minimal address-plus-amount wallet URIs for better compatibility with Cake Wallet and other wallet apps.
Web and browser-extension builds are available again after fixing secure donation-link handling.
The desktop GUI now checks for new releases and can update itself: AppImage builds download the checksum-verified update and restart straight into it, while tarball and Debian package installs get a link to the release page.
Donation reminders now wait until 30 completed practices, repeat only after another 30 practices, and offer Donate, Skip, or Dismiss forever without a separate remind-later option.
Fixed
Web builds now fall back to the Canvas renderer automatically when WebGL is unavailable, instead of stopping on a WebGL-disabled message.
Canvas hover cursors now update consistently while using the Canvas renderer.
Break reminders and break settings stay desktop-only and no longer appear in the Web settings sidebar.
Desktop break timer windows now stay visible when switching workspaces.
Desktop update notifications: the app checks once a day for a new release and shows a toast plus a row in Settings → About. AppImage and Windows users can download and install the update from there — the download is checksum-verified and, with one click on "Restart to update", replaces the app in place. Linux package, Snap and Flatpak installs are left to the system's own updater, and AppImage builds now also carry AppImageUpdate delta-update information.
Windows releases now also ship a classic installer (inbe-windows-setup) beside the portable zip, and a winget manifest is submitted on each release, so Windows 10/11 users can install and auto-update Inner Breeze through winget.
A gentle monthly donation reminder can now be postponed, skipped for the month, dismissed forever, or opened directly in a wallet on native builds.
Copy passwords through a built-in pure-Go X11 clipboard on Linux, with no external clipboard tool required; other systems keep using wl-copy, xclip, xsel, pbcopy, or clip.exe.
Clear copied passwords automatically after a delay with `--clear-after`; by default they stay until another application takes the clipboard.
Read the master password from an OpenSSL-encrypted vault with `--vault`; the vault passphrase is asked for on the terminal or read from piped input, so the master password never appears in argv or the environment.
Save named profiles (a login plus default settings) in an optional configuration file and generate with `--profile`.
Print the current clipboard contents with `--read-clipboard`.
Install the binary as `pass` to use the compact `pass PROFILE SITE` form, which copies without printing.
Breaks render in their own centered always-on-top OS window (desktop): the main window - even hidden to tray - is no longer taken over; Postpone/Skip/Rest-now are clickable in it and right-click opens Break settings.
The timer HUD is drag-and-drop movable anywhere on screen, remembers its position across restarts, hides disabled timers entirely, and right-clicking it opens Break settings; it stays visible during a break showing the remaining rest time.
Single-instance: launching replaces an existing instance by default (graceful SIGTERM handover via a PID lock; screenshot mode is exempt).
Changed
Micro breaks open their window the moment they are due - the invisible toast-prompt phase is gone (rest/daily keep their prompts).
Breaks are just the countdown, controls and practice launch actions; the old Exercises settings row and tray entry are gone.
Idle memory: source fonts now rasterize once each at the DPI-scaled base size (plus one lazily built tier for large text) instead of caching up to eight per-size rasterizations, and a burst of new glyphs re-rasterizes at most once per frame per font; language-picker fallback fonts seed ASCII only and grow on demand (kryon `ui_text` change).
The process no longer links GTK: the system theme reads the desktop's real palette from the theme's gtk.css (kryon `system_theme`), file dialogs shell out to zenity/kdialog/yad (kryon's default backend order), and the GTK tray backend resolves libgtk-3 through kryon's runtime loader only when the tray actually starts. `INBE_NO_TRAY=1` skips the tray entirely (idle RSS drops from ~132 MB to ~103 MB; with the tray it is ~126 MB).
glibc malloc arenas are capped at four (the app runs ~19 threads; the default ceiling let per-thread arenas inflate idle RSS).
`KRYON_MEM_DEBUG=1` prints RSS/arena snapshots at startup and steady state (`KryonMemReport`), plus per-font rasterization stats (`UIFontMemoryReport`).
Android updates can once again be delivered through F-Droid.
Restored 32-bit Windows downloads.
Clicks on extra OS windows (HUD, break window) register correctly: the X11 `Time` field in the event stand-in had the wrong width, shifting button/position reads (right-click and buttons appeared dead).
Extra OS windows no longer corrupt the heap when two windows of different sizes alternate (per-window XImage buffers).
The Breaks entry shows in the settings sidebar on desktop again (`#if DESKTOP` resolved against an undefined constant, compiling the mobile branch everywhere).
Break reminders, Workrave-style: micro, rest and daily break timers with statistics and a desktop timer HUD that lives as a real OS window next to the app (desktop only, off by default, with its own settings tab).
A dedicated Notifications settings tab. Push delivery uses UnifiedPush (no Google services): "Set up push" opens an in-app picker that lists installed distributor apps with their name and icon and registers with the one you pick; the status line reports the real registration state.
Reminders are an editable list: add as many as you want, each with a practice dropdown (Wim Hof, Meditation, Sun Salutation), a [-] time [+] stepper, an on/off toggle and delete. Ships with one enabled Wim-Hof 08:00 reminder.
A notification when new friend requests arrive over social sync (toggleable, on by default).
Screenshot scenes for the first-run guide and the notifications settings, for regression coverage.
Changed
The app is built through the Kir-only k2c pipeline end to end; the legacy kc path and the orphaned wasm4/uxn experimental backends are gone.
The 2,400-line app.c is split into focused modules (app_audio, app_fonts, app_web_bridge) and the simple screen dispatch is table-driven.
Material theme is the default everywhere.
The mobile nav sidebar no longer lists the desktop-only Breaks entry, and its scroll area is sized to the real content height so every entry is reachable on small screens.
In-practice completion notifications are always on; the redundant "session complete" setting was removed.
Vendored Kryon bumped through the notification, UIWindow and guide fixes.
Fixed
Settings silently stopped persisting across reloads on web (and could drop settings on any platform once enough keys existed): the settings load cache was a fixed 192-entry array that silently discarded entries past the cap, and the notification-era keys pushed the setting count over it. The cache now grows dynamically and logs if its allocation ever fails.
First-run guide misalignment on small screens: the highlight anchors now come from the rectangles the draw code actually renders, the practice home reserves the exact space below its card (so it no longer flips into scroll mode when everything fits), the guide never starts on the welcome screen, the Android back key closes it, and its progress persists so it does not return after quitting mid-tour.
"Set up push" did nothing: the UnifiedPush configuration ran via JNI on the native render thread, which has no Looper, and the resulting exception aborted registration before it started. It now runs on the UI thread.
The reminder time is exactly centered between the - and + buttons and vertically aligned with them.
Fresh installs now load the default reminder list (the "no saved list" sentinel was being clamped to an empty list).
Android, web and CI build breaks from the Kryon bumps (ui_window NULL on Android, physics exclusion for web, Firefox smoke test under software GL).
Properly fixed accented characters (ä ö ü ß é ñ č etc.) typed into text fields rendering in a different, broken font. The active UI font is now dynamic in kryon and renders every glyph its file contains in its own typeface, instead of the brittle per-locale codepoint set that missed any character not present in the current locale's file. (1.8.20 only regenerated the font subset; this is the root-cause fix in kryon.)
Changed
Bumped the vendored Kryon pointer, and excluded Kryon's 2D physics (Box2D) sources from the Android build (inbe is UI-only) so the APK builds cleanly after the bump.
Fixed a ghost-click bug when closing the sidebar by swiping left on mobile: the pointer release bled through to the newly-shown screen, triggering a stray click on whatever nav item or button was under the release point (e.g. opening About). The release is now consumed before the screen switch.
Fixed sidebar navigation returning to the wrong screen: closing the sidebar now remembers and returns to the screen it was opened from, and the return-on-back flag is properly cleared on re-open so it can't loop.
Fixed text corruption and overflow at high UI scale: font-shrink loops in the habits weekly view and WHM progressive-speed editor stepped or compared against scaled pixel values instead of logical font sizes, causing text to shrink too fast or never shrink. Title bars, toasts, and empty text fields now use the scaled line height for vertical centering and container sizing.
Fixed Android default scaling being too small by using the best available DPI estimate (maximum of viewport ratio, device density, and window scale) instead of device density alone, which under-scaled on tall screens.
Regenerated the Latin font subset to include accented characters (ä ö ü ß é ñ č etc.) so German, French, Spanish, Czech and other Latin-script languages no longer fall back to a visually different system font.
Removed per-frame DPI scale log spam from the embed draw path.
Fixed the CI release build by upstreaming the SetUIDeviceDensity hook and other kryon fixes that were only present as uncommitted vendor working-tree edits.
Added a user-facing Scale factor control in Appearance settings, with a slider plus minus/plus steppers, that rescales the whole UI live on top of the device DPI. Shows the effective scale (e.g. 2.0x) and supports shrinking below the default.
Changed
Bumped practice screen metadata/subtitle, statistics metric labels, and About version text to the regular font tier so they stay readable at high scale.
Made the per-practice music track setting keys data-driven so future practices persist automatically, and derived the practice music enable mask from the track selection to prevent drift.
Updated Kryon Slider widget to allow a caller-supplied value text (e.g. "1.8x") and bumped the vendored Kryon pointer.
Fixed Android audio/music import failing with "unsupported audio format": the file picker now preserves the original filename and a correct extension derived from the picked file's MIME type, instead of copying to an extension-less cache path.
Fixed long custom music titles overlapping the play/pause and remove buttons in Audio settings by fitting them with an ellipsis.
Moved background music selection out of per-practice customization and into Audio settings, with one track dropdown per practice (Wim Hof, Meditation, Sun Salutation), each defaulting to "None" except Meditation.
Added a download/redownload button and progress indicator for the bundled meditation music pack directly in Audio settings.
Showed the "Music by Elijah_K." attribution under a practice's track dropdown only when a bundled track requiring attribution is selected.
Split cue and music volume controls so short practice cues stay on `sound_volume` while streamed meditation music uses the new persisted `music_volume` setting.
Added an optional WHM retention 30-second marker, defaulting off, with controls in the WHM practice session settings.
Moved background playback into Device settings and removed the standalone global Session settings tab.
Updated practice music/settings UI and importable settings to include the new audio preferences, including a cue-volume test button.
Fixed the Wim Hof between-round countdown: round 0 always counts down from 3 (the intentional 3-2-1), and rounds 1+ now honor the user's configured "Pause after round" setting. The breath engine now owns the full session state machine, so auto-play and manual round-advance share one path and final-round results are always persisted.
Added desktop keyboard shortcuts for quitting the app: `Ctrl+Q` quits from any screen, and `Esc` quits when idle on the home screen (deeper screens keep their existing Esc behavior). On tray-enabled builds these go through the keep-running/quit prompt; without a tray they exit immediately, matching the window close button.
Enabled WAL mode for app storage to improve database concurrency and read/write throughput.
Migrated `src/storage/import.c` to Kry (`import.kry`, transpiled to `import_impl.c`), following the established `db.kry` pattern; the hand-written `import.h` remains the public contract.
Bumped the Kryon vendor to `22afa31` plus a one-line fix (`c26b7ec` on the `fix/platform-thread-stddef` branch) adding `#include <stddef.h>` to `platform_thread.c` so the web build can resolve `NULL`. The bump brings persistent text-input focus, a minimal Kry language (sugar verbs removed), and the new `WidgetButton` UI widget used by the practice screen.
Fixed the web/emscripten build: `src/storage/sync_account.kry` now imports `<emscripten.h>` for its `#intrinsic "web"` declaration (which expands to `EM_ASM_INT`), matching the other two files using that intrinsic. This had broken the web build since the original Kry migration.
Reworked the desktop close behavior: raylib's built-in ESC-to-exit is now disabled on native/desktop (ESC is handled per-screen, and close goes through our own keep-running/quit prompt when a tray is present); without a tray the window close button quits immediately.
Habits editor: added description scroll state so long descriptions scroll correctly.
Renamed a shadowed `text` parameter in `copy_text_checked` to `input` for clarity (meditation music path).
Various screen and settings UI refinements across habits edit, pet, practice, profile, language, manual, and settings screens.
Added `.zcode` to `.gitignore`.
Note
Meditation audio asset refresh is held back from this release (requires `git-lfs` to be installed locally before committing); will ship in a follow-up.
Results page layout improvements: - Consistent side padding (32px) across all pages - Increased spacing between average time and round times - Left-aligned round times for better readability - Fixed scrollbar appearing prematurely (corrected height calculations) - Accurate content height measurements for better scroll behavior
Dropdown menu hover highlighting no longer clipped at bottom edge
Text layout height calculation now matches actual rendered height
Tutorial page content height calculations fixed (no more premature scrollbars)
Icon button fallback system - buttons now render with procedural graphics when asset images fail to load (prevents empty buttons on devices with asset loading issues)
Added UIIconType system for icon identification and fallback rendering
Updated all icon button functions to support fallback graphics (ui_draw_icon_btn, ui_draw_icon_btn_padded, ui_draw_icon_link, ui_draw_nav_button, ui_draw_nav_button_expand)
An everyday journey into data privacy: what our devices reveal, who we trust with our information, and practical alternatives for operating systems, browsers, messages, photos, and passwords.
A relationship becomes a house built on hope, damaged by mistrust, and repeatedly repaired. This essay follows the comfort of reconciliation, the limits of promises and forgiveness, and the search for steadier ground when that shared home finally gives way.
A small story about a tree that wants every season to feel like summer. It becomes a way to think about attachment in relationships: how care can turn into a demand for certainty, and how love can leave room for change.