Skip to content

v0.2.0

Choose a tag to compare

@evgenii-engineer evgenii-engineer released this 23 May 11:31
· 11 commits to master since this release

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.yaml next to a Python or Bash
    script and have it appear in /skills without rebuilding the binary

Highlights

  • Single openlight binary, four subcommands. agent, cli,
    doctor, and a new skills (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 in llm.warmup.profiles are 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 via ffmpeg, transcribed with whisper-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) or ocr_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_compare and
    ocr_extract ship 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 by network.enabled.
  • Visual watches. visual_watch_add / _list / _test /
    _remove schedules periodic screenshot diffs with baseline storage,
    threshold, cooldown, and optional keyword detection on OCR / HTML
    text.
  • Durable memory. /remember, /memories, /forget skills
    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 dedicated mcp group, routed exactly like builtins.
  • External skills. Drop a skill.yaml plus 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 pi join docker / system / auto-heal.
  • Mac mini support. Darwin-specific system provider (CPU, memory,
    swap, memory pressure, uptime), launchd plist, deploy-macmini
    scripts, brew-friendly dependency installers.
  • Storage retention. storage.retention_days prunes old
    messages and skill_calls rows 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 | bash

Once 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.go or cmd/cli/main.go now use
    openlight agent / openlight cli. The Dockerfile, systemd unit,
    and launchd plist already point at openlight.
  • nodes: is the canonical key. access.hosts: is still
    accepted and is merged into nodes: at load. The agent and
    openlight doctor log a deprecation note when it's in use.
  • files: replaces filesystem:. Both keys still load; new
    configs should use files:.
  • LLM profiles. The legacy single-model setup keeps working — when
    no llm.profiles.fast is defined, the SMART provider serves both
    roles (logged as FastFallback). To split the workload, add a
    profiles.fast block (qwen 1.5b on Mac mini, gemma 4b on Pi, etc.).
  • Warmup policy. llm.warmup is enabled by default with
    profiles: ["smart"] and keep_alive: -1. Set
    llm.warmup.enabled: false if you don't want background loads at
    startup.
  • Storage retention. storage.retention_days defaults to 0
    (keep everything, same as before). Setting a positive value triggers
    a one-shot prune on startup. New SQLite indexes are applied
    automatically via migration 0005.
  • Memory is enabled by default. memory.enabled defaults to
    true with a 20-row list limit, sharing the main SQLite file. Set
    memory.db_path to split it into its own file. No data is migrated
    out of notes — memories and notes are separate stores.
  • Optional modules stay off. vision, ocr, voice,
    visual_watch, network, mcp, workbench, accounts,
    browser, and external_skills are all gated by their own
    enabled flag (or non-empty servers / roots / providers map).
    Doing nothing keeps the v0.1.0 surface area.
  • Watch packs are idempotent. Re-running /enable docker after
    upgrading updates existing watches in place; it does not duplicate
    them.

Known limitations

  • Metric watches still support notify only. Service-down watches
    are the ones that take ask / auto and 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 the nodes: block.
  • The Telegram UI sessions and inline buttons are Telegram-only. The
    CLI keeps the same skill surface but renders results as text.
  • mac watch pack omits temperature on Darwin (powermetrics /
    SMC requires sudo). The pi pack includes it.
  • The project is still v0.x and intentionally narrow in scope.

Docs