How It Works

klenua bundles three tools — build, check, and rename — and build and rename both follow the same three rules, every time, on every project type they support. This page explains each rule, what each tool actually does, and exactly what gets read and written for Flutter, Android, and iOS/macOS.

The three tools

Build reads the current version and build number, computes the new ones, and writes them across every project file that needs them.

Check reads the same fields as build, but never writes anything. It reports whether Flutter, Android, and iOS/macOS all agree — and if they don't, which file is out of step. Because it's read-only, the preview and backup rules below don't apply to it: there's nothing to preview or back up when nothing is ever written.

Rename reads and writes your app's display name, bundle ID / application ID, and package name, the same way build reads and writes version numbers — across the same project files, with the same preview and backup promise.

The three rules

Preview. Every change is computed and shown as a diff before anything touches disk. klenua reads your source files, identifies the specific fields a build or rename affects, and builds the replacement values in memory. It does not do a global find-and-replace on a version string or identifier anywhere in the project.

Backup. The original file is saved before it's modified, mirroring your project's own folder structure. If a change looks wrong after applying it, restore the backup and you're back to exactly where you started.

Only what's announced. If a field wasn't shown in the preview, it doesn't change. No incidental edits, no touching unrelated files, no silent side effects.

Per-project-type behavior

Flutter

pubspec.yaml is the source of truth. Build reads and updates its version: field (MAJOR.MINOR.PATCH+BUILD) and leaves Flutter-derived native values (the Android versionCode / versionName Flutter generates at build time, for example) alone — changing those directly would just be overwritten on the next Flutter build anyway. Rename reads and updates the name: field the same way.

Android

build.gradle or build.gradle.kts — only direct, static versionCode, versionName, and applicationId declarations are read and updated. A dynamically calculated value (computed from a script, an environment variable, or a local.properties lookup, for example) is left alone and flagged for manual review rather than guessed at.

iOS / macOS (Xcode)

project.pbxproj and Info.plist — MARKETING_VERSION, CURRENT_PROJECT_VERSION, CFBundleDisplayName, and the bundle identifier are updated only when they're static values. Anything containing a build variable, like $(CURRENT_PROJECT_VERSION), is deliberately left alone rather than modified.

What it doesn't do

  • No network access unless you explicitly sign in to sync a project — every tool works fully offline.
  • No scanning your filesystem beyond the project folder you open.
  • No modifying any file that wasn't shown in the preview.

Where to go next

  • Getting Started — install klenua and make your first change.
  • API Reference — the sync endpoints, if you're scripting against them directly.

Couldn't find the desktop app

If it's already installed, this can happen the first time your browser asks for permission to open it — try the button again. Otherwise, download it below and Get will open plugins directly from then on.

Download for macOS