v0.2.0
openLight v0.2.0
v0.2.0 widens the safe surface around the deterministic-first
runtime. The Telegram bot picks up an inline-button home menu and
multi-step skill forms. Voice notes, images, and screenshots become
first-class inputs. The optional layer grows to cover vision, OCR,
network probes, durable memory, visual watches, MCP servers, and
user-defined external skills. Routing splits into FAST + SMART LLM
profiles so a Raspberry Pi or Mac mini can keep classification cheap
while reasoning calls hit a bigger local model only when needed.
Nothing about the project's posture changes. openLight is still a
small, deterministic, local-first infrastructure tool — the LLM is
still optional, still allowlist-bound, and never expands the surface
on its own.
Good fit for
- Raspberry Pi, Mac mini, and homelab operators who want one persistent
Telegram bot for status, logs, and safe restarts - Self-hosters who prefer local Ollama by default and want to layer
vision / OCR / browser as opt-in - Operators who want to drop a
skill.yamlnext to a Python or Bash
script and have it appear in/skillswithout rebuilding the binary
Highlights
- Single
openlightbinary, four subcommands.agent,cli,
doctor, and a newskills(list/validate/reload) for
inspecting builtin + external skills. - Deterministic-first router, now with a generic registry stage.
Slash → explicit text → normalized shortcut → registry alias →
registry generic → semantic rules → optional LLM classifier. The
generic stage lets external skills with arguments resolve without
any LLM call. - FAST + SMART LLM profiles, with always-warm policy. The router
classifier runs on FAST; chat, log explanations, and final answers
run on SMART. Profiles listed inllm.warmup.profilesare loaded in
the background at startup with exponential backoff so users don't
wait on cold model loads. - Telegram UI. Inline home menu, per-group submenus, multi-step
skill input sessions (mutating skills now ask field by field), and a
callback router for action buttons. Watch alerts route through the
same UI layer. - Voice notes. Telegram voice / audio messages are downloaded,
resampled viaffmpeg, transcribed withwhisper-cli, and fed back
into the regular routing pipeline. Optional reply with transcript. - Image inbox. Photos and image documents are dispatched to
vision_analyze(default) orocr_extract(when the caption looks
like an OCR ask), with the result returned through the normal reply
path. - Vision and OCR skills.
vision_analyze/vision_compareand
ocr_extractship as optional groups with configurable providers
(Ollama VLM, OpenAI, Tesseract). - Network skills and watches.
port_check,http_check,
cert_check,dns_check, plus two new watch kinds (port_down,
cert_expiring_soon) gated bynetwork.enabled. - Visual watches.
visual_watch_add/_list/_test/
_removeschedules periodic screenshot diffs with baseline storage,
threshold, cooldown, and optional keyword detection on OCR / HTML
text. - Durable memory.
/remember,/memories,/forgetskills
persist tagged facts in SQLite. Memory can live in its own SQLite
file (memory.db_path) if you want it separated from message
history. - MCP integration. Configured Model Context Protocol servers are
started as stdio JSON-RPC subprocesses; their tools register as
skills in a dedicatedmcpgroup, routed exactly like builtins. - External skills. Drop a
skill.yamlplus an executable into
external_skills.roots; the runtime spawns the process per
invocation, writes one line of JSON to stdin, reads one line back
from stdout. Builtins always win on duplicate names. See
docs/skills/EXTERNAL.md. - More watch packs.
/enable tls,/enable homelab,
/enable mac,/enable pijoindocker/system/auto-heal. - Mac mini support. Darwin-specific system provider (CPU, memory,
swap, memory pressure, uptime),launchdplist,deploy-macmini
scripts, brew-friendly dependency installers. - Storage retention.
storage.retention_daysprunes old
messagesandskill_callsrows on startup; new indexes keep the
prune cheap on Pi-class hardware. - Doctor expanded. New probes for Telegram, Ollama, nodes,
filesystem, watches, voice, browser, vision, OCR, workbench, visual
watch, and a security-warnings pass that flags obvious foot-guns.
Routing pipeline, in one paragraph
router.Router.Route runs slash commands, explicit text (service tailscale), normalized shortcuts (статус → status), registry
aliases (exact name or alias), and registry generic (first word
resolves to a skill, remainder becomes the text argument) before
trying semantic rules. Only after every deterministic stage misses
does it consult the LLM classifier — and that classifier picks first a
group and then a skill inside that group, both from closed
lists. Confidence at or above execute_threshold (default 0.80)
runs; between clarify_threshold (default 0.60) and that, the
router asks the user to confirm; below clarify_threshold is no
match. The LLM never expands the surface.
Try it
export TELEGRAM_BOT_TOKEN=123456:replace-me
export ALLOWED_USER_IDS=111111111
export OPENLIGHT_REF=v0.2.0
curl -fsSL https://raw.githubusercontent.com/evgenii-engineer/openLight/v0.2.0/scripts/install.sh | bashOnce it starts, try:
/start
/enable system
/watch add service tailscale ask for 30s cooldown 10m
/remember Synapse listens on 8008 inside docker
For deterministic-only (no LLM at all), set LLM_ENABLED=false
before running the installer.
Migration notes from v0.1.0
You can stay on a v0.1.0-shaped config and pick up v0.2.0 features
incrementally. Nothing in the existing minimal config has been
removed.
- Single binary command. Older flows that called
cmd/agent/main.goorcmd/cli/main.gonow use
openlight agent/openlight cli. The Dockerfile, systemd unit,
and launchd plist already point atopenlight. nodes:is the canonical key.access.hosts:is still
accepted and is merged intonodes:at load. The agent and
openlight doctorlog a deprecation note when it's in use.files:replacesfilesystem:. Both keys still load; new
configs should usefiles:.- LLM profiles. The legacy single-model setup keeps working — when
nollm.profiles.fastis defined, the SMART provider serves both
roles (logged asFastFallback). To split the workload, add a
profiles.fastblock (qwen 1.5b on Mac mini, gemma 4b on Pi, etc.). - Warmup policy.
llm.warmupis enabled by default with
profiles: ["smart"]andkeep_alive: -1. Set
llm.warmup.enabled: falseif you don't want background loads at
startup. - Storage retention.
storage.retention_daysdefaults to0
(keep everything, same as before). Setting a positive value triggers
a one-shot prune on startup. New SQLite indexes are applied
automatically via migration0005. - Memory is enabled by default.
memory.enableddefaults to
truewith a 20-row list limit, sharing the main SQLite file. Set
memory.db_pathto split it into its own file. No data is migrated
out ofnotes— memories and notes are separate stores. - Optional modules stay off.
vision,ocr,voice,
visual_watch,network,mcp,workbench,accounts,
browser, andexternal_skillsare all gated by their own
enabledflag (or non-empty servers / roots / providers map).
Doing nothing keeps the v0.1.0 surface area. - Watch packs are idempotent. Re-running
/enable dockerafter
upgrading updates existing watches in place; it does not duplicate
them.
Known limitations
- Metric watches still support
notifyonly. Service-down watches
are the ones that takeask/autoand offer action buttons. - Running inside Docker still does not grant host-level file or
service access automatically. Mount what you need, or reach hosts
via thenodes:block. - The Telegram UI sessions and inline buttons are Telegram-only. The
CLI keeps the same skill surface but renders results as text. macwatch pack omits temperature on Darwin (powermetrics/
SMC requires sudo). Thepipack includes it.- The project is still
v0.xand intentionally narrow in scope.
Docs
- README: https://github.com/evgenii-engineer/openLight/blob/v0.2.0/README.md
- CHANGELOG: https://github.com/evgenii-engineer/openLight/blob/v0.2.0/CHANGELOG.md
- ARCHITECTURE: https://github.com/evgenii-engineer/openLight/blob/v0.2.0/docs/ARCHITECTURE.md
- SKILLS: https://github.com/evgenii-engineer/openLight/blob/v0.2.0/docs/SKILLS.md
- WATCHES: https://github.com/evgenii-engineer/openLight/blob/v0.2.0/docs/WATCHES.md
- NODES: https://github.com/evgenii-engineer/openLight/blob/v0.2.0/docs/NODES.md
- EXTERNAL SKILLS: https://github.com/evgenii-engineer/openLight/blob/v0.2.0/docs/skills/EXTERNAL.md