Digital Stealth Care · features
Everything DSC does today
170 features are live across 15 areas, from VPD climate control and crop steering to a 3D twin of your room. Every line below comes from the code on the main branch and runs on the reference rig, and every line is labelled: live, experimental or planned. What we are building next is at the bottom, labelled just as plainly.
features live today
areas, climate to cure jars
brands of gear it works with
things in the works
Features by area
175 features across 15 areas
Open any card for the complete list of that area's features.
Climate control
14 live · 1 experimental
Air and leaf VPD, an 11-stage target rail, and a fan-first escalation ladder that lives in the hub firmware, so the room stays in range even with the Pi switched off.
- Air VPD and leaf VPD, plus dew point
- Stage-based targets, germination to final flush
- Over-temp failsafe and sensor watchdog on the hub itself
Lighting
11 live · 1 experimental
One photoperiod source of truth for every tent, DLI and PPFD estimated from the maker's own map, and schedule changes that wait for your approval.
- Sunrise and sunset on the hub's clock
- DLI / PPFD from the fixture's published map
- Approve-only schedule shifts and stage flips
Root zone
12 live · 1 planned
A 7-in-1 probe per pot, runoff trays that tell you when a plant is sitting in water, and crop steering with a dryback chart instead of a guess.
- Moisture, soil temp, EC, pH, N, P, K per pot
- Runoff tray leak and EC/pH trend alerts
- Crop-steering phases P0–P3 with dryback targets
Plants and grow cycle
11 live
Strain profiles from CannaLib, harvest windows from the flip date, and dry and cure tracked down to the humidity puck in each jar.
- Strain profile with a 3-tier lookup, cached offline
- Harvest window estimate with its basis disclosed
- Dry run and cure jar tracking, plus a run report
Sensors and device integrations
17 live
Four local lanes, no cloud in any of them: ESPHome native API, an ESP-NOW mesh, Zigbee2MQTT and Tuya over the LAN. Paired devices are matched to library products automatically.
- ESPHome native + ESP-NOW hub ⇄ panel ⇄ pots
- Zigbee2MQTT and Tuya local-LAN lanes
- Auto-match a paired device to a DSC-KitLib product
Cameras
15 live
USB webcams, RTSP, MJPEG, HTTP snapshots or a spare Pi running motionEye. Frames stay on the kit, timelapses assemble themselves, and canopy cover gets measured.
- USB, RTSP, MJPEG, snapshot and motionEye sources
- Daily and weekly timelapse, split on a bumped camera
- Plant regions with canopy cover and real cm²
Journals
11 live
Plant, room and facility journals. Every entry can freeze a sensor snapshot, so a note is evidence, and reminders are anchored to what you actually logged.
- Plant journal that follows the plant for life
- Typed actions that freeze a sensor snapshot
- Reminders and SOP checklists driven by the journal
3D digital twin
19 live · 1 planned
A measured room with every fan, lamp, duct and probe placed by drag-and-drop. Eight lenses, replay of any moment, and a scenario runner to preview tonight before you commit.
- Measured room shell and drag-and-drop placements
- Eight lenses: kit, climate, air, light, root, power, plants, alerts
- Replay history and run what-if scenarios
Alerts and safety
11 live · 1 planned
Sensitivity presets, quiet hours that never silence the failsafe, and a rules engine that fails closed. Acknowledge once and it holds on every screen.
- Alert presets and quiet hours
- Trigger → action rules with debounce and hysteresis
- Acks that hold across every device until a reboot
Energy and power
6 live
Per-device wattage, a local energy estimate with tariff bands, and runtime-hours history. It suggests when to slide a schedule and tells you what it costs.
- Per-device wattage and runtime hours
- Local energy estimate, no cloud meter
- Tariff bands and slide suggestions
Product libraries
8 live
DSC-KitLib for equipment, DSC-NuteLib for nutrients and CannaLib for strains. Kept on the Pi, updated when you say so, never invented.
- DSC-KitLib equipment catalog with maker presets
- DSC-NuteLib feed charts by stage and week
- CannaLib strain profiles, cached on the kit
Settings and setup
15 live
Commission a kit, back it up, flash it over USB or OTA, and read a settings manifest that describes itself. A transparency page shows what the brain is doing and why.
- Kit commissioning and setup profile export
- USB kit flash, ESPHome OTA and toolchain
- Backup, restore, factory reset and update checks
Local AI
3 live
Optional narrative advice from a local model over Ollama and a soft-calibration wizard. Runs on your hardware, or not at all.
- Ollama narrative for calibration and climate advice
- SoftCal soft-calibration wizard
- Nothing leaves the LAN
Public demo / simulator
6 live
A software room simulator with synthetic history, the same brain you would run, and a public demo you can click through right now. Demo mode never touches a camera.
- Software room simulator with backfilled history
- Public demo of the real dashboard
- Never captures cameras in demo mode
Platform
11 live
Raspberry Pi and Docker Compose, an installable web app, an SD image you flash once, and a Pi-native path that no longer needs Home Assistant.
- One SD image: brain, dashboard and kit firmware
- Installable PWA on your phone
- Home Assistant optional, not required
The complete list
Every feature, one line each
Status is as of the build date. Experimental means it is present but still proving itself; planned means designed and not built.
Climate control 15
- LiveVPD calculation (air + leaf) Computes air VPD from dry-bulb temp/RH and a separate leaf VPD from an IR leaf-temperature sensor, so the grower sees the number that actually predicts transpiration/mould risk, not just a room-air proxy.
- LiveDew point / absolute humidity Derives dew point (Magnus form) and related humidity metrics from temp/RH for condensation-risk awareness.
- LiveVPD-vs-band deficit Shows the signed distance from live VPD to the nearest edge of the plant's Want band, so "too dry/too wet" is a number, not a guess.
- LiveStage-based target rail (11 stages) A brain-owned, editable table of temp/VPD/RH/light-hours targets per growth stage (Germination → Final Flush, plus Dry/cool-dry variants), written to the hub when a stage changes.
- LiveClimate Mode taxonomy Canonical 2×4 policy select — Follow 4×8 / Follow Plants / Custom / Off — with legacy-mode migration, shared by SPA and firmware.
- LiveZone → placement → position sensor model Resolves which physical T/RH sensor answers for a zone (indoors/outdoors, per-zone deltas like canopy-vs-exhaust), shared by every climate consumer.
- LiveFull Auto escalation ladder (hub firmware) The ESP32 hub runs a fan-speed + appliance escalation ladder with priority-tent arbitration, stage-set targets, and a "panic hold" that only Full Auto/Manual clears.
- LiveEmergency over-temp failsafe Hard-coded firmware safety: >35 °C forces exhaust 100%, room fan 0%, intakes 100%, cuts heat demand and forces AC on — overrides every other mode including Manual Takeover.
- LiveSensor watchdog Hub-side watchdog that safes the ladder/compressor if a climate sensor goes stale, independent of the Pi brain.
- LiveHeater / heat-mat / humidifier / dehumidifier / AC appliance seats Each appliance type is its own ESPHome device package (Sonoff-relay driven) with its own API key and demand switch, bound into the ladder.
- LiveSonoff appliance driver (Pi path) Mirrors hub demand to Sonoff relays every 2 s and forces every relay OFF if the hub goes dark — the Pi-native replacement for the old ETH01 bridge.
- LiveFan-as-rows airflow model + CFM roster Treats each fan (exhaust out, recirc, intake main, intake 2×4, plus any added fans) as a row with a nameplate/calibrated CFM, feeding one shared roster used by Climate, the twin and recipes.
- LiveFan CFM calibration Per-fan calibration curve (nameplate vs measured CFM) recorded and superseding the maker nameplate in the airflow model.
- LiveTent pressure / airflow paths Twin-side model of duct runs and airflow paths for added fans, so pressure/airflow is drawn against the real ducting rather than a guess.
- ExperimentalBrain-owned demand proposals (shadow mode) The decision loop computes Want-vs-Got and proposes hub demand changes, but currently only *logs* them — the hub's own ladder still drives the *_demand switches until a firmware "brain-owned demand" mode ships.
Lighting 12
- LivePhotoperiod single source of truth One module resolves main (4×8) and clone (2×4) light-on time/hours, clone-follows-main mode, and short-flower on state.
- LiveStage-driven light hours Light hours are part of the firmware-owned stage rail (18 h veg → 12 h flower → 0 h dry), applied on stage change.
- LivePhotoperiod conflict banners Flags dark-window violations and cross-tent conflicts (never auto-corrects), writing a system journal entry.
- LiveApprove-only schedule shift/flip Lets the operator plan a photoperiod slide (ramp) or a stage flip request that must be explicitly approved — never silently mutates the schedule.
- LiveDLI / PPFD estimate from maker map Estimates canopy PPFD and DLI from a bound fixture's published PPFD-by-height-and-dim% map, height-scaled by a fitted power law (or inverse-square with one data layer), always labelled as an estimate.
- LivePPFD map card (Map/3D/Spectrum/Bands) Per-fixture light card reading the CannaLib lights store, showing the maker's PPFD map, 3D surface, spectrum and DLI target bands.
- LiveLight plug drive (Tuya) Drives a tent lamp that lives on a bound Tuya smart plug directly from the hub's photoperiod window, for lamps with no native ESPHome relay.
- ExperimentalLight hours vs plug disclosure Explicitly surfaces that the plug's own state can drift from the tracked light hours (the plug is switched, but the main_fixture record can be unbound), rather than hiding the gap.
- LiveLight catch-up hold / release A held (paused) photoperiod catch-up turns the lamp back ON on release; cancelling a catch-up requires a hub flash rather than a soft toggle.
- LiveDimming / dim-% aware PPFD The DLI/PPFD estimate factors the fixture's current dim % into the maker map lookup.
- LiveLight lens (3D twin) A twin overlay lens that renders modelled light coverage/intensity across the canopy.
- LiveCanopy field layer Interpolated canopy-level field (light/thermal) drawn across the measured room from capture-grid readings.
Root zone 13
- Live7-in-1 NPK RS-485 soil probe Reads a JXCT-style Modbus soil probe per pot: moisture %, soil temp, EC, pH, N, P, K.
- LiveSoil channel calibration Per-channel offset/scale calibration (moisture, EC, pH) with provenance (manual / peer-median / lab-buffer method + timestamp) stored on the ESP and mirrored to entities.
- LiveMobile soil probe tests Confirmed-snapshot workflow for a hand-carried soil probe reading vs. the "idle thereabouts" baseline, with a wizard UI.
- LivePlant ↔ probe assignment Source-of-truth binding of a physical probe to a plant for its life, surviving plant moves/rehomes.
- LiveIrrigAct — brain-commanded irrigation shots Fires irrigation shots via a bound Zigbee pump plug, with an "honest OOS" (out-of-service) state and a rule that a shot never rounds to zero (which would leave the pump stuck on).
- LiveRunoff-tray leak sensors One leak sensor per pot's runoff dish: notifies wet-tray, flags a pot "sitting" in runoff too long, and estimates time-to-runoff per watering as a per-plant water-use signal.
- LiveRunoff EC/pH trend & alert Tracks how a plant's runoff EC/pH shifts across a run and alerts on the operator's own threshold.
- LiveReservoir Mix verifier A nutrient-mix panel that *verifies* a tank mix (measured EC vs Want band, vs the operator's own prior mixes at the same strength, vs draw-down rate) instead of predicting EC from label claims — doses/actuates nothing.
- LiveNuteLib feed-chart integration Binds a nutrient slot to a DSC-NuteLib product; fills dose from the maker's stage dosing row; a tent can follow a maker feed chart by week (flower/veg week from flip/sprout date); predicts mix EC as an advisory number only.
- LiveCrop-steering phase (P0–P3) Bar-3 crop-steering source of truth: resolves the dryback phase (P0 generative → P3 late-flower) from probe dryback % and photoperiod, feeding VWC/dryback targets.
- LiveDryback chart Visualises measured dryback % against the P1–P3 dryback limits for root steering.
- LiveSensor trust for root readings Flags a stuck pot reading (near-zero rate of change for 45 min), a pot diverging from peers (MAD), or a DHT/soil disagreement, so root data quality is visible before it drives a decision.
- PlannedRoot steering pump calibration Planned calibration step for the fertigation pump's dose-per-second, blocked on hardware not yet built.
Plants and grow cycle 11
- LiveStage-from-age model Derives a plant's growth stage from its age against curated Want-band thresholds, porting the retired HA template pack's logic to the Pi.
- LiveStrain profile (3-tier lookup) One normalised strain record per cultivar, resolved from (1) the remote CannaLib API, (2) an on-Pi CannaLib SQLite corpus, or (3) curated YAML — cached so a network outage never blanks the record, and no tier ever invents a value.
- LiveWant band resolution Resolves a plant's target band (pH, EC, moisture, temp, RH) from catalog → operator custom → stage default, in that priority order.
- LiveHarvest window estimate Estimates the expected harvest date range from the strain's flowering time and the flip date (operator-entered, journalled, or calendar-inferred — basis always disclosed).
- LiveFollow Plants clone mode Pi-owned clone-tent target resolution that takes the strictest intersection of all occupant plants' Want bands, so a shared 2×4 never satisfies one plant at another's expense.
- LiveDry run tracking On flip to a Dry zone, records which plants entered and their wet weight, then tracks weight loss toward ~75%, stem-snap check timing, and mould risk against the chosen dry strategy (fast/balanced/slow).
- LiveCure jar tracking Tracks each cure jar (Zigbee humidity puck) as its own climate, turning RH plus burp/jar-up journal entries into settle/burp/too-dry advice; alerts if a jar's puck goes silent.
- LiveCooler dry / cure stage presets Adds "Balanced dry" and "Slow dry" stage-rail rows (cooler than the hub's native Dry Mode) selectable per zone's dry strategy.
- LiveRun report (yield vs evidence) At harvest, computes yield per m²/W/kWh/mol beside the run's recorded evidence (VPD time-in-band, DLI days in target, dryback held, probe fault minutes), so a low-yield claim is checked against the record.
- LiveA tent's run (open/close) A "run" is the zone's occupancy episode from plant-in to harvest-close, the anchor run_report evaluates against.
- LiveCatalog-in-the-grow report Reports what each catalog tier (CannaLib/KitLib/NuteLib) actually contributed to a given plant and fixture, for transparency on where a number came from.
Sensors and device integrations 17
- LiveESPHome Native API ingest Native-API ingest of the hub, all four pot ESPs and the Sonoff relay seats, one persistent session per host (serialised — these are single-client devices).
- LiveESP-NOW mesh (hub ⇄ panel ⇄ pots) Direct ESP-NOW link between the hub, the CYD touch panel and the pot ESPs for vitals/config/commands that keeps working with the Pi/HA down; the panel can never bypass hub-side failsafes.
- LiveFleet self-heal / lateral ledgers Firmware package tracking VPD/mister duty ledgers, a settings-coherence receipt, and RF self-heal orchestration (REJOIN / FLEET_JUMP) across the ESP-NOW fleet.
- LiveZigbee2MQTT lane Ingests Zigbee canopy sensors and extra plugs via a Zigbee2MQTT ↔ Mosquitto bridge (SkyConnect coordinator), normalised into shared datapoint rows.
- LiveZigbee device-role catalog Reference archetypes for Zigbee device types: capability class, exposed datapoints, whether the automation engine can actuate it, and suggested roles.
- LiveZigbee device tasks/policies Curated per-role recipes (e.g. floor-flood → alert, runoff-tray → alert, tank-full → appliance cut, lamp-follow-photoperiod, hazard Safety cut-off) bindable to paired devices by capability class.
- LiveTuya (SmartLife) local LAN lane Second local device lane: one worker thread per Tuya device holding a persistent LAN socket (tinytuya, TCP 6668), normalising DPS updates into the same role buckets Zigbee uses — no cloud dependency.
- LiveTuya device archetype catalog Default DPS maps/scales per Tuya hardware profile, with an operator-editable override after a raw "Probe" of the device's DPS.
- LiveBluetooth LE ingest (Theengs Gateway) Compose ble service (theengs/gateway) scans the Pi onboard radio over BlueZ D-Bus, publishes decoded advertisements to Mosquitto; brain keeps sensors 24 h (max 200) with merged readings and gateway health on /health.
- LiveDevice auto-match to KitLib products Recognises a paired Zigbee/Tuya device or a decoded BLE sensor as a DSC-KitLib product from its integration fingerprint (model + manufacturer id / Tuya product id / Theengs model_id), ranked exact > model > model-other-maker. Zigbee prefers a fingerprint that names Zigbee2MQTT's definition model over a raw model_id-only hit (shared OEM ids such as SONOFF TH01). Naming only — never binds a role.
- LiveMaker presets from matched product Once a device is matched to a KitLib product, offers (never silently applies) the maker's nameplate CFM, duct size and wattage into the device record.
- LiveDevice bindings (role → zone → task) Shared binding vocabulary — where a device lives and what it's for — reused by both the Zigbee and Tuya lanes instead of being duplicated per radio.
- LiveDevice calibration store Persists calibration curves for fan CFM and light PAR against a device.
- LiveSensor trust / stuck-sensor detection Flags stuck pot readings, peer-divergent sensors (MAD), and DHT vs. tent-vs-room disagreement, all on soak-tuned thresholds.
- LiveIngest cadence ladder Chooses which poll-rate rung (idle → actively-reading) each device should run at, so a device being watched live polls faster without hammering every device all the time.
- LiveGlobal tuning modifiers / sensor offsets Global multipliers and per-sensor offsets applied across the fleet (e.g. correcting a systematically biased sensor without touching its raw entity).
- LiveHub reconnect failover Temporary override + re-assert TTL that keeps control sane across a hub reconnect blip rather than fighting the hub's own re-assert.
Cameras 15
- LiveUSB / V4L2 webcam source Reads a USB webcam plugged into the brain Pi via ffmpeg -f v4l2 from a stable /dev/v4l/by-id path; nodes are probed with VIDIOC_QUERYCAP so only real capture devices are listed.
- LiveHTTP snapshot source Polls an HTTP(S) URL that answers with a single JPEG (most IP cameras, motion's snapshot URL).
- LiveMJPEG stream source Opens an HTTP multipart MJPEG stream, pulls the first complete JPEG, and hangs up.
- LiveRTSP stream source Grabs one frame from an RTSP/RTSPS stream with ffmpeg -rtsp_transport tcp.
- LivemotionEye satellite source Reads a spare-Pi + motionEye "satellite" camera's per-camera MJPEG stream port (8080+N) as if it were any IP camera, letting old boards double as vision nodes.
- LiveFraming transform (mirror/flip/rotate/zoom) Bakes mirror, vertical flip, quarter-turn rotate and 1–8× digital zoom into the stored frame at capture time (not a browser-side filter), so every downstream consumer (timelapse, journal, regions) agrees.
- LiveUSB camera v4l2 controls Reads and re-applies a USB webcam's own exposure/focus/white-balance/image/PTZ controls via raw v4l2 ioctls before every capture (survives a UVC replug reset).
- LiveCapture cadence & lights-on gating Captures on an operator interval (1–60 min), optionally gated to the zone's photoperiod window, with an honest "window unknown — captured anyway" fallback.
- LiveFrame retention & storage cap Prunes frames hourly (oldest day first) against a keep-days and a storage-cap-in-GB setting; latest frame and assembled timelapses are never pruned; reports per-camera bytes to Settings → Journals & storage.
- LiveRemovable-drive recording storage Media (camera frames, timelapses, journal photos, twin stills) can live on a USB stick mounted at /media, so recordings can be carried off the kit.
- LiveTimelapse assembly Assembles a day/week of frames into an H.264 mp4 via ffmpeg -f concat; on-demand ("Assemble"), Daily (after midnight) and Weekly (Mon–Sun) jobs, each logging a journal entry with frame count and link.
- LiveTimelapse segments (view-change split) Detects when a camera has been bumped/re-aimed (ring-correlation + shift search on consecutive lit frames, or a JPEG-size change) and starts a new timelapse segment rather than splicing two views together.
- LivePlant regions & canopy cover Lets the operator draw polygon regions on a reference frame and computes a foliage "cover" share (excess-green pixel test); adds a real cm² once a scale marker is set; flags the camera moved and withholds the number if the live view no longer matches the reference.
- LiveJournal entries with a camera frame Journal entries can carry a captured camera frame as attached evidence.
- LiveClip export (GIF / WebM / MP4) Exports a short clip (animated GIF, WebM or MP4) from recorded frames/twin capture, sized to stay a few MB.
Journals 11
- LivePlant journal Per-plant journal that follows plant_id for its whole life, independent of which zone the plant currently sits in.
- LiveRoom / space journal + rollup Native journals at the room and space (tent) level, with the room journal rolling up its child tents' entries at read time.
- LiveFacility (DSC-Core) journal Bubbles room-scoped system journal rows up into one facility-wide feed.
- LiveTyped journal actions A catalogue of loggable action types (watering, feeding, IPM scout, sanitation, etc.), each with its own required fields and a per-type "freeze a sensor snapshot?" flag; operators can add custom types.
- LiveJournal snapshot capture Freezes a scope-appropriate set of live sensor readings into a journal entry at save time, so an entry is evidence, not just a note.
- LiveJournal hooks Runs the follow-through a logged entry implies (e.g. a logged watering advances a reminder's due date).
- LiveWatering/feeding reminders Cadence reminders anchored to the journal itself ("every 3 days since the last watering entry"), not a fixed alarm clock — logging the action is what clears it.
- LiveJournal media (photos) Attaches operator photos to journal entries; images live as files under DSC_DATA/media, never inside SQLite.
- LiveProcedures / SOP checklists Named procedures (Sanitation, IPM scout, Quarantine check, etc.) that open on a trigger and tick themselves off either from the matching typed journal entry or an observed condition; only what can't be observed needs a manual tick.
- LiveJournals & storage settings Operator-facing settings for per-journal retention and archival, plus the per-camera/media storage report.
- LiveGrow log (event log) A Pi-native mirror of the old HA logbook — the running chronological grow event feed shown on the Live/Mission page.
3D digital twin 20
- LiveMeasured room shell Operator-entered room measurements (inside width/depth/height, door, windows, exhaust ports, GPOs, ceiling light) replacing a hard-coded placeholder box.
- LiveGuided room-measuring wizard Step-by-step wizard that walks the operator through measuring the room and placing tents against walls.
- LivePlacements (drag-and-drop layout) Every piece of equipment is a placement record (anchor + rotation) the operator can drag in the twin with a gizmo, replacing 36 hand-written offsets in the old scene code.
- LivePlacement undo + clearance warnings Undoes a placement move and warns when a moved object now clears a wall/another object too closely.
- LiveRuns (ducts/cables/lines as data) A duct, cable, drip line or hose is stored as a real polyline (from/to anchors + waypoints) instead of a procedural guess, so the twin draws the actual run.
- LiveLayout drafts + compare + apply Named layout drafts (placement/run overrides) can be edited beside the live rig, compared against it, and only explicitly "applied" to become the live layout.
- LiveMeasurement tools In-scene measuring tools (hang height, tape measure) plus a Measures panel for recorded dimensions.
- LiveCapture grid (hand-reading map) Records a grid of hand-taken meter readings (airflow m/s, PAR, spot temp/RH) over the canopy, drawn as measured markers and used to validate interpolated fields.
- LiveFitted response model per zone For each actuator→zone pair, fits the median response rate (and spread, event count, RMSE) from real on/off edges in history — the "ghost" response curve the twin draws.
- LiveScenario runner Steps a per-zone fitted first-order RH/temp balance model through a "tonight" simulation so the operator can preview a setpoint or schedule change before committing it.
- LiveTwin replay / history scrub Rebuilds the full twin state (zones, fans, relays, lamps, probes, placed sensors) at any point in a time window from one bucketed SQLite query, with honest tracked/recorded/prior flags.
- LiveTwin still (phone-safe snapshot) Since the brain can't render WebGL, the Twin page captures its own canvas and PUTs a PNG the brain serves to phones/reduced-motion viewers, honestly timestamped.
- LiveLenses (Kit / Climate / Air / Light / Root / Power / Plants / Alerts) Eight named overlay "lenses" that switch what the 3D twin annotates — climate response chips, power draw, alert banners, plant milestones, etc.
- LiveDirector (clip recording) One click records a short (≈20 s) tour of the twin scene as it currently is, camera move included, for export.
- LiveKiosk / screensaver mode Full-screen, read-only twin view for a spare display that auto-cycles the lenses with big live readouts; ?lens= pins one, ?every= sets the cycle time; Escape exits.
- LiveDay/night lighting layer Renders the scene's lighting state (lit vs dark window) so the twin visually matches the tent's actual photoperiod phase.
- LiveDesk embeds Embeds a live twin view inside other desk pages (e.g. Tune Fleet) rather than only the dedicated Twin page.
- LiveProvenance grammar A consistent visual language across the twin for "measured" vs "modelled" vs "unknown" data, so a viewer can tell which kind of number they're looking at.
- LiveZone rule panel / proposal overlay Shows the automation-rule and decision-loop proposals affecting a zone directly on the twin.
- PlannedWebXR / VR mode Explored as a Twin v3 design option but explicitly parked, not built.
Alerts and safety 12
- LiveAlert sensitivity presets One operator choice sets the grow tools' whole alert-threshold set together (runoff, dry-room, etc.), each writing the individual threshold keys so nothing downstream has to change; editing one key by hand marks it "custom".
- LivePer-alert preferences + quiet hours Per-alert enable/severity catalogue plus shared quiet hours, stored centrally so every browser sees the same state; quiet hours never silence the emergency failsafe.
- LiveBrain-owned alert acknowledgement Acks are keyed to the hub's estimated boot time (not browser localStorage), so an ack made on one device holds across every other viewer until the hub actually reboots; acks can carry a snooze expiry.
- LiveAutomation rules engine Operator-authored trigger-group → action rules (AND/OR condition groups, per-rule time window, debounce, release, per-condition hysteresis), edge-triggered and fail-closed.
- LiveAutomation rule defaults Sensible debounce/release/hysteresis defaults applied to a newly created rule.
- LiveFloor flood → alert Curated Zigbee device task: a floor leak sensor raises a flood banner.
- LiveSmoke / gas / CO hazard alarms Zigbee or Tuya Wi-Fi (smoke_alarm / gas_alarm / co_alarm) alarms bound to hazard roles raise critical detection alerts with no hold; silent-bound warn after 26 h; grow-log on rising edge.
- LiveSafety cut-off (hazard task) Opt-in hazard_cutoff task parks heater + heat mat and holds plug_light_* off; fans / dehum / hub-dimmed untouched. Settings card can test (no alarm recorded) and release; real alarm during a test takes over; release while alarming → HTTP 409.
- LiveRunoff-tray leak/sitting alerts Per-pot runoff-tray wet and "sitting-in-water-too-long" alerts (see Root zone).
- LiveEmergency over-temp + sensor watchdog failsafes Hub-firmware-level safety independent of the Pi (see Climate control).
- LiveSensor-trust stuck/divergent flags Flags a stuck or peer-divergent sensor as an honesty signal before it can silently drive a bad decision (see Sensors).
- PlannedBrain-overload / request-flood protection A designed-but-not-built server-side fix (compute-once cache, rate limiting, WS-first fan-out) for an open incident where a runaway browser tab floods /fleet/computed until the brain saturates and the hub's own API watchdog reboots it.
Energy and power 6
- LivePer-device wattage Every device (lights, fans, and now heater/heat-mat/humidifier/dehumidifier/AC appliance seats) carries a wattage figure — catalog-sourced (read-only, nameplate) or operator-typed.
- LiveLocal energy estimate + slide suggestions Computes watts × hours × tariff energy estimates per space and suggests (never auto-applies) schedule slides to save energy.
- LiveLocal energy learning Learns the grow's own energy-use norm over time and flags outliers against it, without ever auto-applying a schedule change.
- LiveAU-style tariff bands Placeholder time-of-use tariff bands the operator edits in Settings, feeding the energy estimate.
- LiveSpace energy settings Settings UI for per-space energy configuration (tariff, wattage overrides).
- LiveRuntime-hours history Converts fleet history into per-device runtime-hours, memoized per computed build, as an input to the energy model.
Product libraries 8
- LiveDSC-KitLib (equipment catalog) Local SQLite library of lights (with maker PPFD maps/spectra), fans, filters, ducting, tents, climate appliances, pumps, plugs, sensors, controllers and water testers.
- LiveDSC-NuteLib (nutrient catalog) Local SQLite library of nutrients, additives, feed charts and growing media.
- LiveLibrary updater Pulls DSC-KitLib/NuteLib updates from a public manifest URL and installs the new SQLite files under DSC_DATA/libs.
- LiveLegacy per-domain catalog fallback Reads old per-domain CannaLib catalog SQLite files when no installed library is present yet, so a kit mid-migration keeps working.
- LiveRemote CannaLib API integration Talks to the CannaLib strain API for the cheap strain-list lookup tier, with a local fallback when it's unreachable.
- LiveCurated YAML catalog (pre-8.4 fallback) The original hand-curated strain/product YAML catalog, kept as the last-resort tier.
- LiveCatalog refresh job Periodic (boot / 6 h / roster-change) background refresh of strain profiles and bound-fixture catalog records.
- LiveMaker presets from a matched product See Sensors/Integrations — offers maker CFM/duct-size/wattage once a device is matched to a KitLib product.
Settings and setup 15
- LiveKit commissioning SD-installer-driven setup/commission flow that seeds the kit's identity and initial config.
- LiveSetup profile export/import One JSON of the brain-owned *grow* configuration (modifiers, stage presets, root-steering targets, alert catalogue, automation defaults, journal retention, hub tunables) for cloning to a second device or sharing — deliberately excludes network, inventory, credentials, cameras and media. Import is diff-first (dry-run before apply).
- LiveBackup export/import Zips the Pi appliance's ops data for backup/restore.
- LiveFactory reset Typed-confirm (operator must retype the kit's AP SSID) reset of the brain's own data; writes a backup + raw DB copy first, then drops/recreates every table.
- LiveNetwork AP/DHCP apply Generates the host's AP/DHCP config from brain settings and applies it on the Pi host.
- LiveUSB kit flash Flashes baked firmware binaries to fleet devices over USB via host esptool (distinct from the docker ESPHome OTA path).
- LiveESPHome OTA / compile jobs Operator-initiated OTA flash / recompile job queue against the fleet, run through the host ESPHome venv.
- LiveESPHome toolchain management Reports the Pi's ESPHome venv version vs. PyPI latest vs. the firmware's pinned min_version, and can bump the venv on request — no Home Assistant, no Docker ESPHome container by default.
- LiveBrain + fleet firmware update check Compares the running brain version and each seat's ESP firmware against a published release manifest (hosted on plausible-deniability.net, not GitHub, since the repo went private).
- LiveSettings manifest (self-describing settings) The brain publishes a machine-readable description of every operator-facing setting it owns (default, range, unit, owner tier) so the SPA never hardcodes one.
- LiveSettings-change journal Logs every brain-side setting write as its own journal trail.
- LiveSystem transparency page Read-only host/clock/NTP/failover status page; degrades honestly (unknown, not a guess) when a signal (e.g. timedatectl) isn't available.
- LiveHost diagnostics + power actions Log tails, adjustable log verbosity, and host power actions (reboot/shutdown), demo-guarded and confirmed on the SPA side.
- LiveZones / role management Every space and room is one object whose *role* (grow/dry/cure/empty) flips in place and drives which bands/desk apply.
- LiveIngest cadence settings Operator-facing control of the poll-rate ladder rungs per device.
Local AI 3
- LiveOllama narrative for SoftCal / Climate-mode advice Optional local Ollama call (configurable base URL/model) that turns the SoftCal/Climate-mode advisory into a short narrative; the guardrailed action set behind it is fixed code, never invented by the model.
- LiveSoftCal soft-calibration wizard Advice-only "soft calibration" wizard that recommends setpoint nudges from history, with a full session-history log.
- LiveCannaLib vision extractor (adjacent repo) A separate, LM-Studio-hosted vision model that extracts light-fixture spectra/PPFD data from maker documents; lives in the sibling CannaLib repo, not in DSC-HUB itself.
Public demo / simulator 6
- LiveDemo mode flag Fully isolated software-simulation flag with no LAN/hardware access, gating every hardware-touching code path (cameras, USB flash, power actions, etc.).
- LiveSoftware room simulator Runs a labelled synthetic grow-room day (18/6 lamp, thermostat heater, RH-holding dehumidifier, temperature-following exhaust) with no hardware ingest at all, for the public demo.
- LiveDemo synthetic history backfill Backfills the demo brain's empty recorder with hours of synthetic history so twin replay/response-model/scenario features have something to show.
- LivePublic brain demo deployment A separate dsc-brain-demo Docker stack (Unraid Compose Manager) served at brain-demo.plausible-deniability.net through a Cloudflare tunnel, built from an isolated demo folder so it never touches the live CannaLib mounts.
- LiveDemo mode never captures cameras Explicit rule that demo mode never attempts a camera fetch, since cameras are LAN/USB-only.
- LiveKit-status live site stamps A separate kit-side pusher publishes running brain/firmware versions to the public site every 15 min for live "what's out there" status stamps.
Platform 11
- LiveRaspberry Pi + Docker Compose deployment The product ships as a Docker Compose stack (brain, mosquitto, zigbee2mqtt, optional thin CannaLib API, legacy ESPHome profile) targeting a Raspberry Pi 4/5 arm64 host.
- LivePWA (installable web app) The frontend is installable as a home-screen PWA with its own manifest and icon set.
- LiveUpdate manifest (brain + firmware) Central published manifest the kit checks against for available brain/firmware updates (see Settings and setup).
- LiveHome Assistant removal / Pi-native path The product's control/compute stack was migrated off Home Assistant onto native ESPHome + a Pi-native brain; HA is now optional-only (lab prototypes, soak testing, Companion notify).
- LiveCYD touch control panel firmware A dedicated ESP32 "Cheap Yellow Display" touchscreen panel (DSC-CONTROL) with tabbed UI (Pulse/Clone/Main/Control), night-dim, screensaver/backlight-off idle states, and a physical Manual-Takeover/Full-Auto control surface, talking to the hub over ESP-NOW with an optional HA/API link for OTA and clock backup only.
- LiveSD image bake / kit installer Scripts that bake a complete SD-card image (firmware + brain + compose) for a new kit, reusing the fleet's live secrets so the image OTAs cleanly into the existing fleet.
- LiveSPA-only vs. full deploy paths Two deploy scripts: a frontend-only path that ships without restarting the brain, and a full path for brain/env/compose/firmware changes (each leaving a timestamped rollback snapshot).
- LiveRemovable-media automount udev rule + systemd unit that automounts a USB stick under /media with nosuid,nodev,noexec, feeding the camera/journal media storage feature.
- LiveFleet flash / recovery scripts A family of PowerShell/bash scripts to flash or recover the hub, Sonoff seats and the whole fleet over LAN or a fallback path when normal OTA can't reach a device.
- LiveEthernet + AP network hardening A dedicated hub-eth0 service and net-policy unit that brings up wired networking and enforces the kit's network policy on boot.
- LiveSoak / verify tooling Scripts that run an extended soak test and verify-brain health check against a live Pi before/after a deploy.
Coming next
What we are working on now
None of this is in the list above, because none of it is finished. Each item says how far along it really is. Alpha testers see these first, and the gear they own decides the order.
In the works
Infrared and RF remote control
In the works
The air conditioner, heater or dehumidifier that only ever had a handheld remote becomes something DSC can drive. The code catalogue is already built: 1,025 code sets across 451 brands. Next is wiring it into the brain so a cheap IR blaster is just another actuator.
The brain takes the wheel
In the works
Today the hub's firmware ladder drives the room and the Pi brain proposes moves alongside it in shadow mode, logging what it would have done. When the numbers agree for long enough, the brain owns demand and the hub stays on as the failsafe.
More gear, recognised on pairing
In the works
DSC-KitLib grows with every release, and it grows from what alpha testers actually own. Name a device on the sign-up form and it goes on the list to verify.
DSC-NuteLib feed charts, deeper
In the works
The nutrient library becomes its own catalogue beside DSC-KitLib: more lines, feed charts by stage and week, and the mix maths done for your reservoir size.
Designed, not built yet
Closed-loop irrigation
Designed, not built yet
Crop steering already reads dryback per pot. The next step closes the loop: a calibrated pump doses by the second, shots land in the right phase, and the runoff tray confirms the result.
Exploring
Brand-agnostic accessories
Exploring
Wireless climate sensors, a CO₂ regulator, a PPFD lighting controller, set-and-forget timelapse cameras, canopy air sensors, a local trend box for long-term logging and the Nutrient Nurse kit for head, medium and runoff readings. Every one optional, none of them tied to a brand.
A purpose-built board
Exploring
Same firmware, same brand-agnosticism, less soldering. It sits beside the DIY build and never replaces it.
Walk the room in VR
Exploring
The 3D twin already replays any moment of the grow. A headset view of the same room is parked until the core is on general release.
Not on general release yet
Help us help you.
DSC is in a real-world alpha: fully functional, running on real plants, checked for safety and for results before it goes wider. The next alpha build goes to everyone who signs up, free, the day it is released. That is the whole deal. Questions first? Ask away.
We help you
When the next alpha ships, a download link lands in your inbox. One .img file for a Raspberry Pi 3 or newer: flash it, boot it, and the brain, the dashboard and the kit firmware are already on the card.
Free during the alpha, and there will always be a free version of DSC. No account, no mailing list, no cloud to sign in to. How larger systems are licensed is not decided yet, and alpha testers will hear first.
You help us
A name and an email are all we need. Everything else on the form is optional: what kind of space you run, what your gear talks today, which brands you own, and the one thing you have not found anywhere yet.
Each answer tells us which rooms, gear and growers to build for next. The brands you name are the brands we go and verify.
