Releases: niveknow/Reef-IQ
Release list
v0.16.3 — Native Google Gemini support for Nemo
v0.16.3 — Native Google Gemini Support
Nemo can now use Google Gemini as a first-class AI provider.
What changed
- 🤖 New
googleprovider — native Gemini API integration viaGeminiAdapter - 🔄 Format translator — converts OpenAI message format to Gemini's
contents/partsformat and back - 📡 SSE stream adapter — parses Gemini's streaming format into standard SSE for the frontend
- 🛠️ Tool calling — Gemini
functionDeclarationsmapped to Nemo'squery_influxdbtool - 📋 Config —
googleadded to.env.exampleanddocker-compose.ymlprovider docs
How to use
Set in .env:
AI_PROVIDER=google
AI_API_KEY=your-google-api-key
AI_MODEL=gemini-2.0-flash
Also supports: gemini-2.5-flash, gemini-2.0-pro
Backward Compatible
All existing providers (DeepSeek, OpenAI, Groq, xAI, OpenRouter) unchanged.
v0.16.2 — Housekeeping: script archive, docs, TrueNAS migration guide
v0.16.2 — Housekeeping
Cleaned up the codebase for TrueNAS readiness.
Changes
- 🗂️ Archived 26 orphaned scripts — moved one-off fix/maintenance scripts to
scripts/archive/ - 📝 Added
APEX_PORTto.env.example - 📘 Created
TRUEAS_MIGRATION.md— full TrueNAS Scale deployment guide with dataset setup, port reference, and troubleshooting - 🧹 Active
scripts/directory cleaned from 42 files to 16 essential files
v0.16.1 — TrueNAS Readiness: healthchecks, ports, secure defaults
v0.16.1 — TrueNAS Readiness
Hardened docker-compose.yml for TrueNAS Scale deployment.
Changes
- 🩺 Healthchecks — InfluxDB health endpoint with
service_healthyconditions on all dependents - 🔐 Secure defaults — Removed
changemepasswords, all secrets use:?required vars - 🎯 Required vars —
APEX_HOSTandBACKUP_PATHare now explicitly required - 🚪 Configurable ports —
INFLUX_PORT,GRAFANA_PORT,NEMO_PORTenv vars with defaults - 👤 User IDs — All services have
user:directives for TrueNAS dataset permissions - 📦 Backup path —
BACKUP_PATHmust point to a persistent TrueNAS dataset - 📋 .env.example — Added TrueNAS-specific configuration section
v0.15.9
v0.15.9 — Dashboard Enhancements: Annotations, Time Picker, Log Stream
New
- 🗑️ Removed old backup dashboard file
- 🔧 Fixed Nemo iframe URL placeholder
- 🔴 Probe Dropout annotations (30-day view)
- 🟠 ±4σ Anomaly annotations (30-day view)
- 🔵 Tank Events annotations (30-day view)
- 📅 Custom time picker with 30d/90d presets
- 📋 Log Viewer converted to stable log stream panel with custom date format
- 🧹 Cleaned up duplicate dashboards in Grafana
v0.15.8
v0.15.8 — Grafana Dashboard Modernization
6 dashboard enhancements:
- Consolidated to single source-of-truth dashboard file
- Fixed Nemo iframe URL placeholder
- Added 30-day Probe Dropout / ±4σ Anomaly / Tank Events annotations
- Added custom time picker (30d/90d presets)
- Converted Log Viewer to log stream panel with custom date format
- Cleaned up duplicate dashboards in Grafana
v0.16.0 — Full Rebrand: ReefMind → Reef-IQ
v0.16.0 — Full Rebrand: ReefMind → Reef-IQ
Complete product rebrand across all on-prem files.
Changes
- 🏷️ Rebranded product name from ReefMind to Reef-IQ across 47 files
- 📄 All documentation updated (README, ARCHITECTURE, CHANGELOG, etc.)
- ⚙️ Config files renamed (.env.example, reef_config.yaml)
- 🐍 Python scripts updated (loggers, identifiers, constants)
- 🐳 Docker infrastructure updated (comments, env vars)
- 🤖 Nemo provider references updated
- 🐙 GitHub repo renamed from
niveknow/ReefMind→niveknow/Reef-IQ - 🌐 Auto-redirect maintained from old URL
v0.15.7 — Community Readiness: Tests, CI, All Backlog Closed
v0.15.7 — The Community Readiness Release
All 15 backlog issues from the initial code quality audit are now closed. The project is ready for public consumption.
Fixes
#1 — Device Power Draw panel fails for >12 month timeframe
Changed fixed aggregateWindow(every: 30m) to Grafana's dynamic v.windowPeriod so the query adapts to any time range automatically.
#10 — Zero test coverage
- Created
tests/directory with 12 pytest tests forreef_core.py(config loading, env overrides, deep merge, retry logic) - Added
.github/workflows/ci.yml— runs on every push and PR
#11 — Old Playwright archive scripts
Added archive/scripts/README.md documenting every archived script with its purpose and how to restore if needed.
#12 — Inconsistent InfluxDB client creation
Standardized apex_mlog_sync.py to use make_influx_client(cfg) — all scripts now use the shared helper.
#13 — Inline traceback imports
Replaced import traceback; traceback.print_exc() with log.exception() in both places it appeared. Cleaner, auto-includes the stack trace.
#14 — crontab.apex Docker paths documented
Added prominent header explaining paths are Docker-internal and alternatives for manual use.
#15 — Power backfill tag (moot)
Backfill script was archived in v0.15.6 — no action needed.
Documentation
- README version badge → v0.15.7
- Project structure updated to include
tests/,archive/,.github/workflows/ - Troubleshooting table now covers
docker composenot found
Files Changed
- 9 files changed, 4 new (ci.yml, archive README, pytest.ini, test file)
- 278 insertions, 12 deletions
⚠️ CI Workflow
The .github/workflows/ci.yml was created but had to be removed from this commit because the fine-grained PAT lacks workflow scope permission. To enable CI:
- Go to https://github.com/settings/tokens → edit your fine-grained PAT
- Under Repository Permissions, add Workflows: Read and write
- Re-create the file: restore it from git history or the issue comments
Until then, tests need to be run manually: pip install pytest && python3 -m pytest tests/ -v
v0.15.6 — Bugfix: Dead Code, Missing Probes, Path Hacks
Fixes
🟠 #5 — One-time Backfill Scripts Moved to Archive
All four one-time data migration scripts moved from scripts/ to archive/scripts/:
apex_outlet_backfill.py,apex_controller_backfill.py,apex_power_backfill.py,apex_fusion_log_backfill.py
These were polluting the active codebase and confusing new readers. Git preserved the history.
🟠 #6 — Dead collect() Removed, Daemon Loop Deduplicated
ApexCollector.collect()was returning[]— removed.- Extracted the daemon loop from
apex_unified_scraper.pyinto a reusablerun_daemon()function. ApexCollector.run()now delegates torun_daemon()instead of duplicating 60 lines of signal-handling + sleep-loop logic.
🟠 #7 — Broken InfluxDB Delete Predicate Fixed
The outlet backfill's delete phase tried to match missing tags with device_group='' which silently failed in InfluxDB. Fixed to delete all records in the time range (they're rewritten with device_group by the backfill points).
🟠 #8 — Missing ORP Probe Added to ILog Sync
DID_MAP in apex_fusion_ilog_sync.py was missing base_ORP. Historical ORP data from Fusion was being silently dropped. Added with proper probe_name/probe_type/unit tags matching the real-time scraper's schema.
🟠 #9 — Sys.Path Hacks Consolidated
- Added
ensure_scripts_path()helper toreef_core.py— single source of truth for path management. - Updated
collector.pyandapex_csv_import.pyto use it instead of inlinesys.path.insert(0, ...).
Docker Fix
- Removed
COPY scripts/apex_fusion_log_backfill.pyfromDockerfile.cron(file moved to archive). - If you built v0.15.6 images: rebuild
apex-cronto pick up the Dockerfile change.
v0.15.5 — Bugfix: Security, Config Dedup, Code Dedup
Fixes
🔴 #2 — Security: eval() in CSV Import
Replaced eval() with ast.literal_eval() in apex_csv_import.py. The old code could execute arbitrary Python from CSV column headers — a potential code injection vector.
🔴 #3 — Duplicate Config Files
apex-config.yamlnow officially deprecated with banner pointing toreef_config.yaml- Log warning added when legacy config is loaded at runtime
- Default InfluxDB
orgsynced:"apex"→"my_reef"inreef_core.py - All docs updated to reference
reef_config.yaml
🔴 #4 — Massive Code Duplication
Extracted NOTE_TYPES, REASON_TITLES, and note_to_points() into a shared scripts/apex_notes.py module. Removed ~260 lines of duplicated constants and functions from 3 files.
Files Changed
- 10 files modified, 1 new (scripts/apex_notes.py)
- -261 lines removed, +169 lines added
- Net codebase reduction: 92 lines
Docker Fix (post-release)
- Cron container was missing
requestsandcurl— Fusion login fell through to thecurlsubprocess fallback and crashed withFileNotFoundError. Tank notes were never syncing. Fixed by adding both toDockerfile.cron. - The
collectorcontainer was unaffected (uses stdliburllib). - If you built v0.15.5 images before this fix: rebuild
apex-cronand recreate the container. Existing users withrequestsalready installed from other deps may not hit this.
v0.15.4 — Fix: Fusion ilog API days cap
Summary: The /ilog endpoint caps at 7 days server-side — days=180 always returned a 400 error with an HTML page, making the weekly reconciliation cron silently fail.
Changes
- Fix: Fusion ilog days cap — Changed
BACKFILL_DAYSfrom180to7andget_ilog()default from180to7. Fusion's/ilogendpoint rejects values >= 10 with an HTML error page (SPA shell). The weekly cron now fetches the last 7 days of probe data on each run — InfluxDB dedup handles overlapping writes.
Full Changelog: v0.15.3...v0.15.4