Capture anywhere
Route: Tasks toolbar → Captures · Permission: Use AI assist
Module: Task Management · Entry points: Create task → microphone · WhatsApp · mobile app → Capture · /ext/task-intake
What this is. Record work where it happens — a voice note, a photo, a line of text, or an event from another system. What it is for. Capturing the job while you are standing in front of it, instead of remembering it until you reach a laptop. The problem it solves. Work noticed on a site at 11am and typed up at 6pm is work that gets forgotten, or mis-remembered.
1. The rule that shapes all of it
A capture never creates a task.
Everything captured becomes a draft that a person reviews, with the transcript shown beside it. Speech recognition mishears names. A photo of a whiteboard is ambiguous. An alerting system fires twice. None of that should turn into someone's Monday morning unreviewed.
You review the draft in the normal task-review screen, and applying it is the same gated action as any AI work breakdown.
2. The four ways in
| Channel | How | Best for |
|---|---|---|
| Dictate here | The microphone on Create task | Hands on a keyboard, wanting to talk instead of type |
| Send a voice note, photo or message to the organization's number | Walking a site, on a phone you already have open | |
| Mobile app | Tasks → Capture | The same, with the camera, and working without signal |
| Intake API | POST /api/v1/ext/task-intake | A vision QC rig, an IIoT gateway, a monitoring tool |
3. WhatsApp — connect your number first
A message from a number nobody has verified is logged and dropped, with no reply. Answering would confirm to a stranger that the number is an Orbit endpoint, and would let anyone make it send messages. This is deliberate silence, not a failure.
The one-time code expires in ten minutes, is stored only as a hash, and is burned the moment it is used. Five wrong attempts locks that attempt cycle — request a new code.
Set a default project when connecting: a WhatsApp message names no project, so without one there is nowhere for the draft to land.
Your organization needs a working WhatsApp connection. Without one, connecting explains that rather than pretending a code was sent.
4. Mobile — captures survive no signal
The point of capturing on a phone is that you are where the work is, which is exactly where the signal is worst.
The capture is written to a queue on the device first and sent afterwards. On a plant floor or in a basement it waits, and goes when you surface — the queue is flushed whenever the app comes back to the front.
Each queued item carries a key the server recognises, so a retry that already succeeded creates no second draft. Something that can never succeed stops retrying and asks you to delete it, instead of draining the battery.
The message is honest about which happened: "Captured" or "Saved on this device. It will be sent as soon as you have signal."
5. The Captures inbox
Tasks → Captures, with a count of what still needs a person.
| Status | Means |
|---|---|
| Queued / Reading it | Arrived; being transcribed |
| Draft ready | A draft exists. Nothing has been created — open it to decide |
| Tasks created | You reviewed the draft and applied it |
| Discarded | You decided against it. The note is kept for the record |
| Could not read it | Says why — a silent recording, no transcription provider, no project |
The transcript is always shown, so you judge what was actually heard rather than only what the model made of it.
6. Hindi and Hinglish
Site staff dictate in a mix of Hindi and English. A generic English model turns that into confident
nonsense — worse than nothing, because the transcript is what the reviewer trusts. An administrator
sets TASK_CAPTURE_STT_ENGINE_HI (default indic) for those captures.
7. The intake API
POST /api/v1/ext/task-intake
Authorization: Bearer <api key with scope task:intake:write>
{
"project_id": "…",
"source": "vision-qc-line-3",
"external_ref": "defect-88213",
"severity": "high",
"title": "Weld porosity on bracket batch 4471",
"description": "Confidence 0.94 across 6 frames.",
"media_url": "https://…/frame.jpg",
"occurred_at": "2026-09-12T09:14:00Z"
}
Answers 202, not 201: a draft exists, a task does not. Saying "created" would be a lie an integrator builds on.
source + external_ref are the duplicate key, so a retrying integrator produces one draft, not
forty. The same operation is available as an MCP tool.
8. Administrator settings
| Key | Default | What it does |
|---|---|---|
TASK_CAPTURE_DAILY_CAP_PER_ORG | 50 | Captures per organization per day, all channels. A cost guard — each media capture costs a transcription call, and an integration stuck retrying should hit a wall rather than a bill |
TASK_CAPTURE_STT_ENGINE_HI | indic | Speech engine for Hindi / Hinglish |
TASK_INTAKE_AUTO_APPLY_ENABLED | false | Seeded and not connected to any code. Every intake becomes a draft |
Migrations 001178–001180 and 001182. Media limits: 16 MB audio, 5 MB images, 10 MB documents.
9. Downstream
- Captures become task drafts reviewed in the normal AI plan review
- Applying a draft creates tasks through the ordinary permissions
- The intake API is an MCP tool as well as a REST endpoint
10. Don't confuse this with…
| This | That |
|---|---|
| Capture — raw input becoming a draft | Create task — you typing a task directly |
| Captures inbox — things waiting to be reviewed | My work — tasks that exist |
| Draft ready | A task. Nothing is created until you apply the draft |
| Intake API | POST /ext/task/tasks, which does create a task directly |
11. Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| WhatsApp messages do nothing | The number is not verified, or is verified for a different organization | Profile → Capture from WhatsApp |
| "A code cannot be sent" | The organization has no WhatsApp connection | An administrator connects it first |
| "This capture is not linked to a project" | No default project on the connection | Set one when connecting |
| "No transcription provider is configured" | Voice and photo capture need one | Ask an administrator; typing still works |
| "Daily capture limit" | The organization hit its cap | Resets at midnight UTC, or raise TASK_CAPTURE_DAILY_CAP_PER_ORG |
| Mobile captures stay queued | No connectivity, or the server refused them | Reopen the screen to retry; an item showing an error explains itself |
| The integrator sees 202 but no task | Correct — a draft was created | Review it in the Captures inbox |