A visual monitor you write in English. Point a camera at something, say what to watch for, say what should happen when it happens. Aura does the rest, in a browser tab, with whatever AI you want behind it.
Try it → · no install, no account, no backend.
Aura is a webcam monitor whose rules are prompts instead of code. You give it two sentences:
Then it watches. Every scan cycle it sends one camera frame to a vision model with the mission prompt. If the model says the thing is happening — and is confident enough — Aura runs the action prompt and delivers the result: spoken aloud, a buzz, a screen flash, a line in the log, an HTTP call to anything you like.
That's the whole idea. Everything else is a knob on top of it.
flowchart LR
C["camera frame"] --> D["detection call<br/>your mission prompt"]
D --> Q{"happening?<br/>and confident enough?"}
Q -- "no" --> W["keep watching"]
W --> C
Q -- "yes" --> A["action call<br/>your action prompt"]
A --> O["speak · vibrate · flash<br/>log · webhook"]
O --> C
Most cycles stop at "keep watching" — the second call only happens on a real alert.
The same loop, different sentences. A few that work today:
| You want | Mission prompt | Action prompt |
|---|---|---|
| A security camera that understands | "a person approaching the front door who is not carrying a delivery parcel" | "say who is at the door and what they appear to be doing" |
| Off-grid intrusion detection | "any person or vehicle in this field" | "state what entered the frame and from which direction" |
| A delivery watcher | "a parcel left on the doorstep" | "announce that a package arrived" |
| A process monitor | "the pot is boiling over / the print has detached / the plant is wilting" | "warn me about what went wrong" |
| A pet or baby monitor | "the cat is on the kitchen counter" | "tell the cat off, by name" |
| A toy that heckles | "a person is standing in front of the camera" | "make one short affectionate joke about what they're wearing" |
| An attendance chime | "someone new has entered the room" | "greet them in a different way each time" |
Nothing in the app is specialised for any of these. A "security system" and a robot that insults your hoodie are the same program with different prompts — which is the point, and the reason the mission box is a free-text field and not a dropdown of object classes.
The webhook is where it stops being a toy: any alert can POST a JSON body you
define to any URL, so Aura becomes a sensor for whatever you already run —
Home Assistant, n8n, ntfy, a Kubernetes job, your own API.
No extra hardware. No Raspberry Pi, no NVR box, no hub, no dongle, no second device to keep charged. Aura is a web page: open it on the phone, point the phone at the thing, press ARM.
No extra accounts either. Nothing to sign up for, no Aura login, no cloud tenancy — there is no Aura server to have an account on. Pick the in-browser engine and you never enter a key at all; the phone does the thinking.
It uses the cameras the phone already has — front or back, switchable while armed, at whatever capture size you pick. On a laptop it will equally take a USB webcam or a screen share instead. Install it to the home screen and it behaves like an app, offline shell included.
That is the whole setup: a device with a camera, a browser, and a sentence describing what you care about.
Aura has no model of its own and no opinion about whose you use. Three sources, switchable in Setup, all feeding the exact same loop:
| Source | What it is | Good for |
|---|---|---|
| Any OpenAI-compatible provider | Cerebras, OpenAI, Groq, Together, Fireworks, OpenRouter, your own gateway — anything that speaks POST /v1/chat/completions with vision | the strongest models, at a per-scan cost you can cap |
| A local server | Ollama, llama.cpp, LM Studio, vLLM on your own machine or homelab — same API, no key needed | free, private, works on your LAN |
| In-browser | a small vision-language model on WebGPU in the page (Transformers.js), or Chrome's built-in Gemini Nano where offered | no key, no server, no network at all — the frame never leaves the device |
The in-browser source picks its own brain: Qwen3.5 0.8B by default — an ONNX conversion downloaded once (~875 MB, then cached), with smaller models as fallbacks for modest devices. On desktop Chrome 148+ there is a second runtime, Chrome's built-in Gemini Nano, which Setup can prefer explicitly; AUTO only chooses it when it is already downloaded and image-capable, and it doesn't exist on Chrome for Android — phones always get the Transformers.js model.
It has to be a vision model. Aura sends a picture on every scan, so a
text-only LLM — however clever, however new — cannot do this job at all: it has
nowhere to put the image. Look for vision, VL, multimodal or image input
in the model's name or docs (qwen3-vl, gemma-4-vision, llama-4-scout,
gpt-5-mini, claude-sonnet-5…). A model that can't see will fail the first
scan with an error rather than quietly guessing.
A stronger model is genuinely better, and the difference is not subtle. The in-browser models are small enough to fit in a phone's memory, and they behave like it: they reliably answer "is there a person" and get vaguer the more judgement a question needs ("is that person struggling with the door?", "is the parcel the one that was already there?"). A frontier cloud model reads the same frame with far more nuance, and follows a picky mission prompt instead of approximating it. Start local to prove the idea costs nothing; move to a bigger model when the mission gets subtle — the mission and action prompts carry over unchanged, because every engine gets the same two prompts.
The provider is three fields: base URL, model, and an API key that is allowed to be
blank. Your key lives in your browser's localStorage and goes straight to the
provider you named; there is no Aura server in the middle, because there is no Aura
server at all. It's a static page.
Because all three sources return the same shape, you can compare them: the Evaluate screen runs your own labelled frames through several models and prompts and scores them, so "is the tiny local model good enough for this camera?" is a measurement rather than a guess. The Lab's Examples tab goes further and rewrites your prompt against your own examples.
Cloud and local-server engines need nothing but a browser and a network — all the work happens elsewhere, so a five-year-old phone is fine. The requirements below are for running a model on the device, and they are per model. Every one of these is built in and picked in Setup; Aura probes the GPU adapter's real buffer limits and the reported memory on arrival and selects the largest one the device can actually run, falling back rather than failing.
| Model | Download (cached once) | Needs | Notes |
|---|---|---|---|
| Object gate (YOLO26n) | 3–5 MB | any modern browser; WebGPU optional | not a VLM — it only spots objects, to save the one below |
| SmolVLM2 256M | 208 MB | no WebGPU required — falls back to WASM | the floor; 10–30 s per scan without WebGPU, and coarse |
| SmolVLM2 500M (default) | 395 MB | WebGPU, ~4 GB RAM | the current default pick on a capable device |
| LFM2.5-VL 450M | 810 MB | WebGPU, ~4 GB RAM | follows an instruction more closely than SmolVLM |
| Qwen3.5 0.8B | 875 MB | WebGPU, ~4 GB RAM | strongest of the small rows, but hung on a Pixel 7a — opt-in |
| nanoLLaVA 1.5 | 875 MB | WebGPU, ~4 GB RAM | opt-in alternative |
| FastVLM 0.5B | 1.1 GB | WebGPU, ~6 GB RAM | built for time-to-first-token on live video; opt-in |
Plus the browser itself, for every row above the first two:
| Browser | WebGPU from |
|---|---|
| Chrome / Edge on Android | 121 |
| Chrome / Edge on desktop | 113 |
| Safari (macOS and iOS) | 26 |
| Firefox | 141 (partial) |
Storage is the quiet requirement: weights live in the browser's cache, so a
1.1 GB model wants that much free space, once. RAM figures are what the browser
reports (navigator.deviceMemory, which caps at 8), not what the phone has.
Two things worth knowing before picking the biggest model your phone will take: sustained in-browser inference makes a phone hot, and a hot phone throttles. The object gate exists for exactly this — a 3 MB detector watches for changes and only wakes the big model when the set of objects in frame actually changes, which takes the GPU from busy most of the time to busy almost never. Turn it on in Setup → Advanced → Object gate.
Aura points a camera at people and reacts automatically. Use it only where you're allowed to record, tell people they're being watched, and remember that a best-effort judgement from a single frame is not evidence of anything.
Aura can be previewed without changing the GitHub Pages deployment.
npm run preview:local, then open
http://localhost:8787. For a phone on the same Wi-Fi network, run
npm run dev -- --listen tcp://0.0.0.0:3000 and open
http://<development-machine-lan-ip>:3000.npx wrangler login, optionally
change the globally-unique name in wrangler.jsonc, then run
npm run preview:deploy. Wrangler prints the resulting
https://<worker-name>.<account-subdomain>.workers.dev URL. This deploys only
the static public/ folder; Aura still sends API keys and camera frames only
from the browser directly to the provider configured by the operator.Wrangler runs Aura's build automatically before both preview commands, so it
never uploads a stale public/ directory. The workers.dev worker is deliberately an opt-in preview target. It adds no
backend, stores no monitoring data, and does not proxy provider or webhook calls.
After a preview deploy, close any existing Aura tabs before reopening the URL so
the new service worker can activate; the app will otherwise deliberately keep a
running monitor on its already-cached version.
GPL-3.0 — see LICENSE.
A visual monitor you write in English. Point a camera at something, say what to watch for, say what should happen when it happens. Aura does the rest, in a browser tab, with whatever AI you want behind it.
Try it → · no install, no account, no backend.
Aura is a webcam monitor whose rules are prompts instead of code. You give it two sentences:
Then it watches. Every scan cycle it sends one camera frame to a vision model with the mission prompt. If the model says the thing is happening — and is confident enough — Aura runs the action prompt and delivers the result: spoken aloud, a buzz, a screen flash, a line in the log, an HTTP call to anything you like.
That's the whole idea. Everything else is a knob on top of it.
flowchart LR
C["camera frame"] --> D["detection call<br/>your mission prompt"]
D --> Q{"happening?<br/>and confident enough?"}
Q -- "no" --> W["keep watching"]
W --> C
Q -- "yes" --> A["action call<br/>your action prompt"]
A --> O["speak · vibrate · flash<br/>log · webhook"]
O --> C
Most cycles stop at "keep watching" — the second call only happens on a real alert.
The same loop, different sentences. A few that work today:
| You want | Mission prompt | Action prompt |
|---|---|---|
| A security camera that understands | "a person approaching the front door who is not carrying a delivery parcel" | "say who is at the door and what they appear to be doing" |
| Off-grid intrusion detection | "any person or vehicle in this field" | "state what entered the frame and from which direction" |
| A delivery watcher | "a parcel left on the doorstep" | "announce that a package arrived" |
| A process monitor | "the pot is boiling over / the print has detached / the plant is wilting" | "warn me about what went wrong" |
| A pet or baby monitor | "the cat is on the kitchen counter" | "tell the cat off, by name" |
| A toy that heckles | "a person is standing in front of the camera" | "make one short affectionate joke about what they're wearing" |
| An attendance chime | "someone new has entered the room" | "greet them in a different way each time" |
Nothing in the app is specialised for any of these. A "security system" and a robot that insults your hoodie are the same program with different prompts — which is the point, and the reason the mission box is a free-text field and not a dropdown of object classes.
The webhook is where it stops being a toy: any alert can POST a JSON body you
define to any URL, so Aura becomes a sensor for whatever you already run —
Home Assistant, n8n, ntfy, a Kubernetes job, your own API.
No extra hardware. No Raspberry Pi, no NVR box, no hub, no dongle, no second device to keep charged. Aura is a web page: open it on the phone, point the phone at the thing, press ARM.
No extra accounts either. Nothing to sign up for, no Aura login, no cloud tenancy — there is no Aura server to have an account on. Pick the in-browser engine and you never enter a key at all; the phone does the thinking.
It uses the cameras the phone already has — front or back, switchable while armed, at whatever capture size you pick. On a laptop it will equally take a USB webcam or a screen share instead. Install it to the home screen and it behaves like an app, offline shell included.
That is the whole setup: a device with a camera, a browser, and a sentence describing what you care about.
Aura has no model of its own and no opinion about whose you use. Three sources, switchable in Setup, all feeding the exact same loop:
| Source | What it is | Good for |
|---|---|---|
| Any OpenAI-compatible provider | Cerebras, OpenAI, Groq, Together, Fireworks, OpenRouter, your own gateway — anything that speaks POST /v1/chat/completions with vision | the strongest models, at a per-scan cost you can cap |
| A local server | Ollama, llama.cpp, LM Studio, vLLM on your own machine or homelab — same API, no key needed | free, private, works on your LAN |
| In-browser | a small vision-language model on WebGPU in the page (Transformers.js), or Chrome's built-in Gemini Nano where offered | no key, no server, no network at all — the frame never leaves the device |
The in-browser source picks its own brain: Qwen3.5 0.8B by default — an ONNX conversion downloaded once (~875 MB, then cached), with smaller models as fallbacks for modest devices. On desktop Chrome 148+ there is a second runtime, Chrome's built-in Gemini Nano, which Setup can prefer explicitly; AUTO only chooses it when it is already downloaded and image-capable, and it doesn't exist on Chrome for Android — phones always get the Transformers.js model.
It has to be a vision model. Aura sends a picture on every scan, so a
text-only LLM — however clever, however new — cannot do this job at all: it has
nowhere to put the image. Look for vision, VL, multimodal or image input
in the model's name or docs (qwen3-vl, gemma-4-vision, llama-4-scout,
gpt-5-mini, claude-sonnet-5…). A model that can't see will fail the first
scan with an error rather than quietly guessing.
A stronger model is genuinely better, and the difference is not subtle. The in-browser models are small enough to fit in a phone's memory, and they behave like it: they reliably answer "is there a person" and get vaguer the more judgement a question needs ("is that person struggling with the door?", "is the parcel the one that was already there?"). A frontier cloud model reads the same frame with far more nuance, and follows a picky mission prompt instead of approximating it. Start local to prove the idea costs nothing; move to a bigger model when the mission gets subtle — the mission and action prompts carry over unchanged, because every engine gets the same two prompts.
The provider is three fields: base URL, model, and an API key that is allowed to be
blank. Your key lives in your browser's localStorage and goes straight to the
provider you named; there is no Aura server in the middle, because there is no Aura
server at all. It's a static page.
Because all three sources return the same shape, you can compare them: the Evaluate screen runs your own labelled frames through several models and prompts and scores them, so "is the tiny local model good enough for this camera?" is a measurement rather than a guess. The Lab's Examples tab goes further and rewrites your prompt against your own examples.
Cloud and local-server engines need nothing but a browser and a network — all the work happens elsewhere, so a five-year-old phone is fine. The requirements below are for running a model on the device, and they are per model. Every one of these is built in and picked in Setup; Aura probes the GPU adapter's real buffer limits and the reported memory on arrival and selects the largest one the device can actually run, falling back rather than failing.
| Model | Download (cached once) | Needs | Notes |
|---|---|---|---|
| Object gate (YOLO26n) | 3–5 MB | any modern browser; WebGPU optional | not a VLM — it only spots objects, to save the one below |
| SmolVLM2 256M | 208 MB | no WebGPU required — falls back to WASM | the floor; 10–30 s per scan without WebGPU, and coarse |
| SmolVLM2 500M (default) | 395 MB | WebGPU, ~4 GB RAM | the current default pick on a capable device |
| LFM2.5-VL 450M | 810 MB | WebGPU, ~4 GB RAM | follows an instruction more closely than SmolVLM |
| Qwen3.5 0.8B | 875 MB | WebGPU, ~4 GB RAM | strongest of the small rows, but hung on a Pixel 7a — opt-in |
| nanoLLaVA 1.5 | 875 MB | WebGPU, ~4 GB RAM | opt-in alternative |
| FastVLM 0.5B | 1.1 GB | WebGPU, ~6 GB RAM | built for time-to-first-token on live video; opt-in |
Plus the browser itself, for every row above the first two:
| Browser | WebGPU from |
|---|---|
| Chrome / Edge on Android | 121 |
| Chrome / Edge on desktop | 113 |
| Safari (macOS and iOS) | 26 |
| Firefox | 141 (partial) |
Storage is the quiet requirement: weights live in the browser's cache, so a
1.1 GB model wants that much free space, once. RAM figures are what the browser
reports (navigator.deviceMemory, which caps at 8), not what the phone has.
Two things worth knowing before picking the biggest model your phone will take: sustained in-browser inference makes a phone hot, and a hot phone throttles. The object gate exists for exactly this — a 3 MB detector watches for changes and only wakes the big model when the set of objects in frame actually changes, which takes the GPU from busy most of the time to busy almost never. Turn it on in Setup → Advanced → Object gate.
Aura points a camera at people and reacts automatically. Use it only where you're allowed to record, tell people they're being watched, and remember that a best-effort judgement from a single frame is not evidence of anything.
Aura can be previewed without changing the GitHub Pages deployment.
npm run preview:local, then open
http://localhost:8787. For a phone on the same Wi-Fi network, run
npm run dev -- --listen tcp://0.0.0.0:3000 and open
http://<development-machine-lan-ip>:3000.npx wrangler login, optionally
change the globally-unique name in wrangler.jsonc, then run
npm run preview:deploy. Wrangler prints the resulting
https://<worker-name>.<account-subdomain>.workers.dev URL. This deploys only
the static public/ folder; Aura still sends API keys and camera frames only
from the browser directly to the provider configured by the operator.Wrangler runs Aura's build automatically before both preview commands, so it
never uploads a stale public/ directory. The workers.dev worker is deliberately an opt-in preview target. It adds no
backend, stores no monitoring data, and does not proxy provider or webhook calls.
After a preview deploy, close any existing Aura tabs before reopening the URL so
the new service worker can activate; the app will otherwise deliberately keep a
running monitor on its already-cached version.
GPL-3.0 — see LICENSE.