| --- |
| title: Tiny Trigger |
| emoji: "🔌" |
| colorFrom: red |
| colorTo: gray |
| sdk: gradio |
| sdk_version: 6.17.3 |
| python_version: '3.13' |
| app_file: server.py |
| pinned: false |
| license: other |
| short_description: 'Open-vocabulary video automations with YOLOE' |
| tags: |
| - track:backyard |
| - achievement:offbrand |
| --- |
| |
| # Tiny Trigger |
|
|
| Tiny Trigger is a local-first hackathon prototype for open-vocabulary video |
| automations. It uses YOLOE to detect user-supplied classes plus every label |
| referenced by enabled rules in a video, then evaluates small structured rules |
| that can trigger simulated actions or optional webhook POSTs. |
|
|
| The LLM path is intentionally constrained: Replicate, OpenAI, or Claude compile |
| natural language into JSON/YAML automation rules. The app validates those rules |
| before evaluating them, and the LLM never emits executable code. |
|
|
| DEMO video: https://youtu.be/BfXir6fonR0 |
|
|
| For a quick operator checklist, see [`DEMO.md`](DEMO.md). |
|
|
| ## Development Attribution |
|
|
| Tiny Trigger was developed by Javier Montalvo with assistance from AI coding |
| tools, including Anthropic Claude and OpenAI Codex. Some earlier assisted work |
| may not consistently include co-author trailers in the commit history; future |
| assisted commits should include explicit attribution where applicable. |
|
|
| ## Run Locally |
|
|
| ```bash |
| pip install -r requirements.txt |
| python server.py |
| ``` |
|
|
| Or with Poetry: |
|
|
| ```bash |
| poetry install |
| poetry run python server.py |
| ``` |
|
|
| The detector defaults to the Small YOLOE model (`yoloe-26s-seg.pt`) at 640px, |
| which Ultralytics downloads on first use if it is not already cached. Model |
| weights are not checked into the repo. |
|
|
| For small or background objects, use a larger model such as `yoloe-26l-seg.pt`, |
| set device to `cuda:0`, lower confidence to `0.05`-`0.15`, and raise image size |
| to `960` or `1280`. |
|
|
| Run tests with: |
|
|
| ```bash |
| pip install -r requirements-dev.txt |
| python -m pytest |
| ``` |
|
|
| Or: |
|
|
| ```bash |
| poetry run pytest |
| ``` |
|
|
| ## Cloud Rule Compiler |
|
|
| Choose Replicate, OpenAI, or Claude in Settings and paste the matching API key. |
| Keys entered in the UI are sent only with compile requests. Hugging Face Space |
| owners can also set `REPLICATE_API_TOKEN`, `OPENAI_API_KEY`, or |
| `ANTHROPIC_API_KEY` as Space secrets. |
|
|
| ## Rule Shape |
|
|
| Rules can be written directly as YAML or compiled from natural language: |
|
|
| ```yaml |
| rules: |
| - name: person-near-steering-wheel |
| when: |
| all: |
| - present: {label: person, min_count: 1} |
| - near: {a: person, b: steering wheel, max_gap_percent: 16} |
| gate: |
| enabled: true |
| cooldown: {key: turn-on-pc, minutes: 5} |
| then: |
| - type: webhook |
| name: turn on pc |
| ``` |
|
|
| Initial video conditions include presence, count, near, far, and moving. Near/far |
| use the minimum horizontal/vertical gap between detection boxes in normalized |
| frame percent. Moving uses detector-provided track IDs across sampled frames; |
| YOLOE enables Ultralytics ByteTrack only when active rules include a moving |
| condition, so presence/near/count rules keep the higher-recall prediction path. |
| Moving tolerates one missed sampled frame by default to avoid repeat alerts from |
| detector flicker. Gates include enabled state and cooldown. Triggers can fire |
| while a condition is true, when it becomes true, when it becomes false, or on |
| either change. Tiny Trigger does not yet support speed, direction, long-gap |
| re-identification, or trajectory path rules. |
|
|
| ```yaml |
| rules: |
| - name: monitor-presence-lights |
| when: |
| all: |
| - near: {a: person, b: monitor, max_gap_percent: 16} |
| trigger: |
| on: change |
| gate: |
| enabled: true |
| then: |
| enter: |
| - type: webhook |
| name: turn on lights |
| exit: |
| - type: webhook |
| name: turn off lights |
| ``` |
|
|
| Home Assistant, live RTSP/webcam monitoring, and trajectory logic are planned |
| later increments. |
|
|
| ## Local State |
|
|
| Private local settings and runtime memory live under `.local/`, which is ignored |
| by git: |
|
|
| ```text |
| .local/config.yaml private defaults such as camera/webhook URLs |
| .local/automations.json saved editable automation rules |
| .local/state.json cooldown memory and last-fired timestamps |
| .local/events.jsonl append-only fired action history |
| ``` |
|
|
| Example `.local/config.yaml`: |
|
|
| ```yaml |
| webhook_url: "http://127.0.0.1:8123/api/webhook/example" |
| default_detector_model: "yoloe-26x-seg.pt" |
| default_device: "cuda:0" |
| default_image_size: 640 |
| default_max_detections: 300 |
| llm_provider: "anthropic" |
| replicate_model: "openai/gpt-5.2" |
| openai_model: "gpt-5.5" |
| anthropic_model: "claude-sonnet-4-6" |
| ``` |
|
|
| ## License |
|
|
| This repository is provided under a temporary all-rights-reserved hackathon |
| prototype license. See `LICENSE`. |
|
|