v0.9.9 - nself-org/cli GitHub Wiki
Release Date: March 15, 2026 Type: Bug Fix & Stability Release Status: Release Candidate โ
v0.9.9 is the final stabilization release before v1.0 LTS. It ships with no new features โ only targeted bug fixes across the CLI, the Pro plugin ecosystem, and the nclaw showcase apps.
nself status โ service detail lookup failure
show_service_detail built container names with hyphens (e.g. nself_node-exporter) but Docker Compose converts hyphens to underscores when naming containers (nself_node_exporter). The lookup always failed for hyphenated service names. Fixed by converting hyphens with ${service_name//-/_}.
nself logs โ crash when PROJECT_NAME is not set
format_service_name used bare ${PROJECT_NAME} in prefix-strip patterns. With set -u active, referencing this variable before export caused an immediate crash. Fixed with ${PROJECT_NAME:-nself} defaults.
nself status โ shows 0/N running for non-default project names
When a project was started with a custom COMPOSE_PROJECT_NAME, the status command reported all services as stopped because the container name prefix didn't match. Both issues above contributed to this symptom.
nself ssl delegation โ nself ssl now correctly delegates to nself auth ssl.
All nine nclaw Rust plugins (notify, cron, google, mux, ai, claw, voice, browser, livekit) compile clean under SQLX_OFFLINE=true with zero errors.
nself-ai โ sqlx::query! macros in usage.rs had stale .sqlx/ cache hashes that diverged after query updates. Converted both record_fallback and monthly_spend to runtime sqlx::query() to remove the CI dependency on regenerated cache files.
nself-google โ AccountInfo struct was missing #[derive(serde::Serialize)], causing an into_response() compile error in the account info endpoint. Derive added.
nself-mux โ CalendarSync and DonorAction variants were added to RuleAction in rules.rs but the match arm in gmail_history.rs was not updated, producing a non-exhaustive match compile error. Both arms added.
nself-voice โ Claw health check now has a 3-second timeout to prevent indefinite blocking at startup. Session and recording data is now written to the database on call completion. Migration adds call_sid UNIQUE, from_number, and status columns.
nself-browser โ Session records are written to np_browser_sessions after each screenshot, scrape, and pdf operation. Columns: url, operation, status, error, duration_ms, source_account_id.
nself-cron โ Schedule validation runs before INSERT (invalid cron expressions return HTTP 400 instead of writing a broken job). list_jobs_for_account returns only jobs owned by the requesting account. source_account_id stored on all job records.
Coverage workflow schema mismatch โ the psql schema setup step in coverage.yml was creating tables with outdated column definitions. Updated to match live migration output:
-
np_jobs: addedsource_account_id TEXT NOT NULL DEFAULT 'default' -
np_voice_sessions: addedcall_sid TEXT UNIQUE,from_number TEXT,status TEXT NOT NULL DEFAULT 'active' -
np_browser_sessions: columns replaced to match new migration schema
Calendar recurrence โ day-of-week timezone bug โ check.getDay() returns the day of week in the local timezone. ISO date strings parsed with new Date('YYYY-MM-DD') are UTC midnight, which shifts to the prior calendar day in UTCโ4/โ5. Fixed with getUTCDay() throughout the weekly recurrence check.
Key rotation โ DST boundary โ US Daylight Saving Time (March 8, 2026) caused a 30-day key age check to return false on day 30 because the raw millisecond difference was ~29.96 days. Fixed by truncating both timestamps to UTC midnight before computing the day delta.
nself update
# or reinstall from scratch:
curl -fsSL https://install.nself.org | bashIf the plugin registry returns an empty list after updating, clear the local cache:
rm -f ~/.nself/cache/plugin-registry.json
nself plugin refresh
nself plugin listPro plugins use short IDs, not the Rust crate names:
nself license set <your-license-key>
nself plugin install notify cron google mux ai claw
# Max tier only:
nself plugin install voice browserv1.0.0 is the stable, long-term-support release. It follows v0.9.9 once the release candidate has been validated in production for at least two weeks with no critical issues.