Releases: jetomev/bitlaforge
BitlaForge v0.1.3 - First AUR release (Forge suite complete)
BitlaForge v0.1.3 — First AUR release. Forge suite complete.
With this release, the complete KognogOS Forge suite — grubForge, 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 bitlaforgePulls 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_rendershadowing 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.1man page — full keybindings, safety section, dependency listing, files, authors with co-developer credit.
🛡 PKGBUILD discipline
- Hardened
check()runs the headless mount smoke under Textual'srun_test()— catches CSS-parse andon_mountfailures at build time, not just import breaks. PYTHONDONTWRITEBYTECODE=1+ defensive__pycache__cleanup so we never ship the.pycinstall-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,
_rendershadowing, 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-plotexttime-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
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 tosocket.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_argsjoins the sanitizedminer_nameto the wallet aswallet.workernamewhen 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 withnice -n Nwhen 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.pyTo actually mine, also install minerd via the AUR (Setup screen has the install commands):
yay -S cpuminerVerified
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
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_execwith 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_statsand the Dashboard repaints with real numbers. - Stop is
SIGTERMwith a 3-second grace,SIGKILLfallback.
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 providers —
cpuminer(recommended, pooler's original),cpuminer-multi,cpuminer-opt— each with a copy-pasteableyay -Scommand. - Paths — config file + binary location.
- T action — runs
minerd --versionto 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-mountcheck()) 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.pyThen press 4 for the install guide on getting minerd itself (AUR-only), or just:
yay -S cpuminerVerified
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)
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 +
ContentSwitcherrouting, with refresh-on-show via a silenton_showhook andDEFAULT_FOCUSso screen bindings fire on the first keypress without a panel click. StatusMixinfor unified status-line + toast feedback, withpopup=Falsefor passive mount hints so the app launches quietly.- Toggleable
HelpScreenmodal (Esc / q / ? all dismiss;qshadows app-quit while help is up). ConfirmDialogwithescape→ 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.1 —
minerdsubprocess (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-mountcheck(), 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.pyAUR 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.