Skip to content

Releases: jetomev/bitlaforge

BitlaForge v0.1.3 - First AUR release (Forge suite complete)

07 Jun 02:24

Choose a tag to compare

BitlaForge v0.1.3 — First AUR release. Forge suite complete.

With this release, the complete KognogOS Forge suitegrubForge, alacrittyForge, nogForge, and BitlaForge — is now installable on Arch via a single yay -S <name>. The Forge thesis (visible, careful, well-documented human + AI collaboration on real end-user software) now has four AUR-published demonstrations.

No code-feature changes vs. v0.1.2 — pure release machinery + packaging, plus the two v0.1.2 hotfixes folded forward.

What v0.1.3 ships

📦 First AUR submission

yay -S bitlaforge

Pulls from AUR, builds, runs the check() headless mount smoke, installs. optdepends prompts for one of the three minerd providers — cpuminer (pooler's original, recommended), cpuminer-multi, or cpuminer-opt. (minerd is itself AUR-only so it can't be a hard depends=; runtime detection handles the missing case with a Dashboard banner + install guidance.)

📜 Release machinery

  • testing/RELEASE-CHECKLIST.md — pre-dogfood snapshot recipe, async-worker audit, the _render shadowing audit (BitlaForge-specific footgun caught twice in earlier cycles), version sync gate, co-author credit gate, full release-day flow.
  • testing/20260529 - Test Matrix for BitlaForge v0-1-3.md — covers the full v0.1.0 → v0.1.3 surface in 8 sections (install + nav + persistence + Setup + mining lifecycle + Stratum worker name + niceness behaviour validation + regression/packaging).
  • bitlaforge.1 man page — full keybindings, safety section, dependency listing, files, authors with co-developer credit.

🛡 PKGBUILD discipline

  • Hardened check() runs the headless mount smoke under Textual's run_test() — catches CSS-parse and on_mount failures at build time, not just import breaks.
  • PYTHONDONTWRITEBYTECODE=1 + defensive __pycache__ cleanup so we never ship the .pyc install-conflict class that bit grubForge v1.0.2.
  • Co-developer line preserved in PKGBUILD header.

🔧 v0.1.2 hotfixes folded forward

Two post-release fixes from the v0.1.2 dogfood are now in the first tagged release that contains them:

  • cfe1010 — Dashboard minerd CPU display reads "N / total cores (P%)" instead of "1590%".
  • e3e3091 — Hashrate parser accepts integer kh/s (not just decimals), aggregates per-thread rates into the rig total, and auto-scales to Mh/s / Gh/s.

Verified

  • All RELEASE-CHECKLIST audit gates green (worker pattern, _render shadowing, version triple-sync).
  • Headless mount smoke clean on Python 3.14 + Textual 8.2.7.
  • Real-hardware mining (cpuminer on AMD Ryzen 7 7700 against solo.ckpool.org) — 159.15 Mh/s aggregate across 16 threads, Dashboard fields populating live, niceness=19 visibly yielding under load.

What's next

  • v0.1.4 — quality / robustness: wallet format validation, pool reachability probe with a "Test connection" action, persistent log archive across launches, per-session lifetime totals.
  • v0.2.0 — visual identity: hashrate sparkline under the value, system load sparkline on Setup, per-thread mini-bars, optional textual-plotext time-series charts (btop-style).

Co-developed by Javier (@jetomev) and Claude (Anthropic). Fourth tool in the KognogOS Forge suite — public projects demonstrating AI as a serious software collaborator.

BitlaForge v0.1.2 - Resource awareness + live Dashboard

30 May 01:02

Choose a tag to compare

BitlaForge v0.1.2 — Resource awareness + live Dashboard.

v0.1.1 made BitlaForge actually mine; v0.1.2 makes it feel alive while doing it, and gives you the knobs to leave the system usable.

What v0.1.2 ships (5 per-group commits)

🖥️ G1 — System info on Setup

New bitlaforge/system_info.py reads /proc/cpuinfo, /proc/meminfo, os.getloadavg(), and os.cpu_count() into a SystemInfo dataclass. The Setup screen gains a block above the minerd status showing:

  • CPU model + logical/physical cores (parses unique (physical id, core id) pairs)
  • Memory total + available with % used
  • Load avg colour-graded: green when load_1 < cores × 0.5, yellow up to 0.9 × cores, red above

Stdlib only. Refreshes on R.

⚙ G2 — Config: miner name + niceness + threads-available hint

Two new fields in ~/.config/bitlaforge/config.toml:

  • miner_name — defaults to socket.gethostname(). Local label and pool worker name.
  • niceness — 0–19, default 19 (lowest priority; lets your system stay responsive).

The Thread count label dynamically shows "of N available" sourced from os.cpu_count(). A v0.1.1 TOML loads cleanly with the new defaults silently applied — no migration required.

🏷 G3 — miner_runner: Stratum worker name + nice wrapper

  • _build_args joins the sanitized miner_name to the wallet as wallet.workername when set — pools show per-rig stats on their dashboards via Stratum's standard convention. Sanitization: alphanumeric + - + _, lowercased (so "Laptop" and "laptop" don't become two workers).
  • start() wraps the spawn with nice -n N when niceness > 0. niceness ≤ 0 spawns directly with no overhead.

⏱ G4 — Dashboard live tick + name in header

App installs a 1-second set_interval timer when the miner starts, cancels on stop (and when the parser sees the process end on its own). Each tick re-renders the Dashboard so uptime advances smoothly between minerd hashmeter dumps — no more frozen counter when the pool is quiet. The Dashboard title now shows the miner name in mauve: ⚡ BitlaForge — Miner Overview — workstation-rig.

📊 G5 — Live minerd CPU% / RAM from /proc/<pid>/

New bitlaforge/process_stats.py parses /proc/<pid>/stat (utime + stime ticks) and /proc/<pid>/status (VmRSS) — stdlib only, no psutil. The tick captures a baseline at miner start, computes deltas on each interval, and writes cpu_pct (htop-style: 100% = one logical core) + mem_mb into MinerStats. Dashboard shows them in the Performance section.

This is the validation knob for niceness: with niceness=19, you can watch minerd's CPU% drop the moment any other process needs cycles.

What did not ship in v0.1.2 (next cycle)

The original v0.1.2 plan included pool/wallet validation, persistent log archive, and per-session totals — those are now v0.1.3. The Forge release machinery + AUR submission becomes v0.1.4.

Install (v0.1.2, from source)

sudo pacman -S python-textual python-rich python-tomli-w
git clone https://github.com/jetomev/bitlaforge.git
cd bitlaforge
python main.py

To actually mine, also install minerd via the AUR (Setup screen has the install commands):

yay -S cpuminer

Verified

Textual Pilot tests across all five groups: system info parsing on a real Ryzen 7 7700 (16L/8P, 31GB total, load color-grading), 6-field TOML round-trip, sanitized worker name in -u, nice -n N actually wrapping the exec, uptime advancing smoothly across multiple tick intervals without new stats events, live CPU% reading 98.8% for a single-core busy loop with a clean baseline + delta.


Co-developed by Javier (@jetomev) and Claude (Anthropic). Fourth tool in the KognogOS Forge suite.

BitlaForge v0.1.1 - Make it actually mine

29 May 01:41

Choose a tag to compare

BitlaForge v0.1.1 — Make it actually mine.

v0.1.0 shipped the Forge-style TUI skeleton with sidebar nav, three screens, the help modal, and a confirm dialog — but minerd integration was a stub: pressing M just flipped a state flag. v0.1.1 turns the skeleton into a working tool.

What v0.1.1 ships (4 per-group commits)

🔒 G1 — Config persistence

New config_manager.py (tomllib for read + tomli_w for write) saves pool / wallet / algorithm / threads to ~/.config/bitlaforge/config.toml. Values survive across launches; the Config screen loads them on __init__. Schema is intentionally flat so future cycles can add [ui] / [log] sections without breaking the miner section.

⚙ G2 — Real minerd subprocess

New miner_runner.py with a MinerRunner class:

  • Spawns minerd via asyncio.create_subprocess_exec with pooler-cpuminer-compatible args (-a algo, -o pool, -u wallet, -p x, -t threads).
  • Streams stdout (merged with stderr — cpuminer logs to both) line-by-line via a background asyncio.Task.
  • Each line: forwarded to the Log screen's 5,000-line bounded buffer.
  • Each parsed hashrate / accepted / rejected / thread update: pushed into app.miner_stats and the Dashboard repaints with real numbers.
  • Stop is SIGTERM with a 3-second grace, SIGKILL fallback.

The Dashboard goes from placeholders to live state: pool host / port / wallet (with mid-ellipsis on long Bitcoin addresses) / algorithm / threads / hashrate (kh/s) / uptime (HH MM SS) / shares.

🛡 G3 — Runtime check + Dashboard banner + friendly guards

shutil.which("minerd") runs at launch and on every M press. When the binary is missing:

  • The Dashboard shows a persistent red ⚠ minerd not detected banner with install hint at the top.
  • Pressing M produces a friendly toast: "install one of: cpuminer / cpuminer-multi / cpuminer-opt from AUR (e.g. yay -S cpuminer)" — instead of the raw "binary not found" error.

🛠 G4 — Setup screen (4th nav)

New screen at 4 — a permanent home for the install guidance:

  • Status block — ✓ installed at <path> or ✗ not installed.
  • About minerd — what it is and why it's AUR-only.
  • AUR providerscpuminer (recommended, pooler's original), cpuminer-multi, cpuminer-opt — each with a copy-pasteable yay -S command.
  • Paths — config file + binary location.
  • T action — runs minerd --version to verify the install actually works (5s timeout).

What did not ship in v0.1.1 (yet)

  • AUR submission — still v0.1.3 per the roadmap. The Forge release machinery (testing/ + Test Matrix + man page + PKGBUILD with hardened headless-mount check()) lands then.
  • Pool reachability probe, wallet format validation — v0.1.2.
  • Persistent log archive across launches — v0.1.2.

Install (v0.1.1, from source)

sudo pacman -S python-textual python-rich python-tomli-w
git clone https://github.com/jetomev/bitlaforge.git
cd bitlaforge
python main.py

Then press 4 for the install guide on getting minerd itself (AUR-only), or just:

yay -S cpuminer

Verified

Textual Pilot tests across all four groups: config persistence across two app instances; minerd parser correctness on real cpuminer-format lines; full runner lifecycle with a fake minerd shell script (start → stream → parse → stop); the friendly install-guidance toast triggered when minerd is missing; the Dashboard banner shown / hidden as minerd's PATH presence flips; Setup screen renders both states and the T action runs the binary with a 5s timeout.


Co-developed by Javier (@jetomev) and Claude (Anthropic). Fourth tool in the KognogOS Forge suite.

BitlaForge v0.1.0 - Pivot to Textual TUI (Forge era)

29 May 00:16

Choose a tag to compare

BitlaForge v0.1.0 — Pivot from Qt6/Widgets to Textual TUI; first Forge-era release.

This repo used to be BitLA, a Qt6/Widgets desktop scaffold pushed in November 2025 with simulation-driven UI and no real minerd integration. Untouched for ~6 months. On 2026-05-28 it pivoted to a Textual TUI under the KognogOS Forge suite — solo Bitcoin mining is fundamentally a streaming-stdout activity on long-running headless rigs, which a TUI fits better than a Qt GUI (it runs cleanly over SSH; the same audience that runs solo miners is the audience that loves TUIs).

The Qt prototype is preserved permanently as the v0.1.0-qt-archived git tag. main is the Textual TUI from this point on.

What ships in v0.1.0

A Forge-style TUI skeleton, built on patterns proven in grubForge v1.0.3 and alacrittyForge v0.1.1:

  • Three screens — Dashboard (read-only miner overview), Log (streaming view with 5,000-line bounded buffer + search filter + auto-scroll), Config (pool / wallet / algorithm / threads).
  • Sidebar nav + ContentSwitcher routing, with refresh-on-show via a silent on_show hook and DEFAULT_FOCUS so screen bindings fire on the first keypress without a panel click.
  • StatusMixin for unified status-line + toast feedback, with popup=False for passive mount hints so the app launches quietly.
  • Toggleable HelpScreen modal (Esc / q / ? all dismiss; q shadows app-quit while help is up).
  • ConfirmDialog with escape → cancel, enter → confirm.
  • Catppuccin Mocha styling, consistent with the rest of the Forge suite.

What does NOT yet work

Real minerd integration is not wired. Dashboard fields show placeholders, the log buffer is empty, the M key just flips a state flag and notifies. Wiring asyncio.create_subprocess_exec to spawn minerd, parse its stdout, and stream into the Log screen is the headline work for the next cycle (v0.1.1).

Roadmap

  • v0.1.1minerd subprocess (spawn / parse / stop); real Dashboard fields; log streaming.
  • v0.1.2 — Config persistence (~/.config/bitlaforge/config.toml); start-miner pre-flight; error handling.
  • v0.1.3 — Forge release machinery: testing/ + Test Matrix, man page, PKGBUILD with hardened headless-mount check(), first AUR submission.

Install (v0.1.0)

sudo pacman -S python-textual python-rich
git clone https://github.com/jetomev/bitlaforge.git
cd bitlaforge
python main.py

AUR submission lands with v0.1.3, once there's real behavior to verify.


Co-developed by Javier (@jetomev) and Claude (Anthropic). Same recognition thesis as the rest of the Forge suite — public projects demonstrating AI as a serious software collaborator.