Skip to content

v0.1.3 — Standalone binaries, and four .env bugs fixed

Latest

Choose a tag to compare

@nimblemo nimblemo released this 11 Sep 09:01

v0.1.3 — Standalone binaries, and four .env bugs fixed

This release adds prebuilt, self-bootstrapping binaries for six platforms,
published straight to this GitHub Releases page — so insta-boards no longer
requires a Python toolchain to install. It also fixes four real bugs in
.env handling
that silently ignored your configuration, including on
plain PyPI installs.


Prebuilt binaries — no Python required

Every release now ships six archives, built and smoke-tested in CI:

Platform Archive
Linux x86_64 insta-boards-x86_64-unknown-linux-gnu.tar.gz
Linux aarch64 insta-boards-aarch64-unknown-linux-gnu.tar.gz
macOS Intel insta-boards-x86_64-apple-darwin.tar.gz
macOS Apple Silicon insta-boards-aarch64-apple-darwin.tar.gz
Windows x86_64 insta-boards-x86_64-pc-windows-msvc.zip
Windows ARM64 insta-boards-aarch64-pc-windows-msvc.zip

The binaries are built with uvbox,
which produces a small launcher rather than a frozen Python. On first run
the launcher bootstraps uv, fetches a Python interpreter and installs the
package; subsequent runs are fast and offline.

First run needs network access. This is not an offline bundle — the
interpreter is downloaded on demand. After that the tool runs as a normal
Python process and inherits your working directory, so data/, secrets/
and .env resolve relative to where you invoke it.

Generated binaries also expose a small self-management CLI:

insta-boards self update   # upgrade to the latest published version
insta-boards self remove   # uninstall
insta-boards self path     # print the install root
insta-boards self cache    # print the cache dir
insta-boards self uv       # print the bundled uv path

Four .env bugs fixed

These affected every install method, not just the new binaries — the
packaging audit is what surfaced them.

Bug Symptom Fix
Eager constants IG_DOWNLOAD_TIMEOUT, IG_DOWNLOAD_DELAY, IG_DOWNLOAD_RETRIES, IG_DOWNLOAD_BACKOFF were read at import time, before load_env() ran — values from .env were silently ignored. Replaced with lazy accessors, evaluated at call time.
IG_STATE_PATH in sync The state path was computed before load_env(), so a custom path in .env had no effect. load_env() now runs first in main(), and --workdir is applied before dispatch.
IG_DOWNLOAD_POOL_REUSE Parsed but never passed anywhere — a dead knob. Now wired through to DownloadPool; exposed as DownloadPool.reuse_pool.
Empty value masking An empty assignment (KEY=) in a higher-priority .env counted as set and shadowed a real value in a lower-priority .env. load_env() switched to dotenv_values() with manual application: an empty value means "not set".

More deterministic data root

repo_root() no longer guesses. Resolution order is now:

  1. IG_REPO_ROOT (absolute path or ~-prefixed), if set;
  2. otherwise the nearest ancestor that is a real checkout — it must contain
    both pyproject.toml and src/paths.py;
  3. otherwise the current working directory.

This stops an unrelated pyproject.toml higher up the tree from hijacking
where data/ is written — which matters now that the binary runs from
wherever you happen to be.


Docs and tests

  • README.md — new Prebuilt binaries section, a Where configuration is
    read from
    subsection, and the IG_REPO_ROOT variable.
  • docs/uvbox-packaging-audit.md — the full .env audit report.
  • 18 regression tests covering the lazy accessors, .env precedence and
    repo_root() resolution.

Upgrading

# PyPI
uv tool upgrade insta-boards

# or a prebuilt binary
insta-boards self update

Existing installs need no migration — the .env fixes make previously
ignored settings take effect, so double-check IG_DOWNLOAD_* and
IG_STATE_PATH if you were setting them and seeing no change.