FusionX Command Center
FusionX
FusionX
Command Center

Every alarm arrives
as one thread, not
four loose records.

FusionX is a control-room platform for help points, intercoms, cameras, public address and access control. It answers the call, shows the operator where it came from, opens the camera that sees it, runs the procedure, tells the right people, and keeps one ordered history of what the system actually did — under one login, on one screen.

CALLS CAMERAS RULES PUBLIC ADDRESS INCIDENTS MAPS DETECTION ALARMS FUSIONX ONE THREAD
17Modules
28Rule triggers
16Rule actions
~200Permission-gated routes
6Incident states
60Day free trial on site

The interfaces on this page are rendered replicas of the live console, built from the product's own design tokens and typeface — not photographs. Figures shown in them are illustrative sample data.

The thread · a worked example

One alarm, from the field to the closed report

A fence sensor on Platform 2 at Southgate Depot trips at 21:41. Nobody configures this run — it is what the standing rules already say to do. Elapsed time runs down the left.

00.00s

The exchange raises the alarm

An ICX frame arrives at the agent and becomes an alarm instance and a queue row in the same pass. The receive loop never waits on anything downstream — it writes one event row and moves on.

Alarms · Call queue
00.02s

An incident opens and takes ownership of the story

Policy decides this event is worth an incident and opens one at HIGH. From here every notification, camera grab, announcement and operator action attaches to that single row, in order, append-only.

Incidents · incident policy
00.10s

The map says where, before anyone asks

The alarm point carries its placed position, so Maps zooms to the pin and lights the level. The operator reads a location, not a device ID.

Maps · site levels
00.30s

The camera that sees it opens itself

The alarm point is bound to a camera, so the ACTIVE monitor fills with that view — routed over the site LAN where the operator is local to it, and over the gateway tunnel where they are not.

Surveillance · Gateways
00.4s

Priority puts it at the top of the queue

Call type and tier are configuration, not code. A fence alarm outranks a routine help-point call and sorts above it, in the colour the site chose.

Call queue configuration
01.0s

The announcement plays to the right zone

A stored message goes to the Platform 2 zone. The zone is expanded when the rule runs, so adding a speaker last week takes effect tonight without re-editing a rule.

Public address
01.2s

The people who need to know are told

One notification row per recipient — so each operator dismisses their own copy and "who has actually seen this" stays answerable. Supervisors get theirs by webhook.

Notifications · Webhooks
00:14

An operator acknowledges, and owns it

Acknowledgement is a real desk frame to the exchange, not a local flag. The incident moves to ACKNOWLEDGED with a name on it, and every later step is attributed.

Alarms · Incidents
00:31

Voice, video and words are captured together

The talk leg records on its own channel; the camera records alongside it. The transcript is produced per channel, so caller and operator are separated because they were on separate channels — not guessed from pauses.

Recording · Transcription
04:02

Resolved, closed, and answerable

The rule stands down on the acknowledgement, its notifications close themselves, the strobe it latched switches off. What is left is one incident with a timeline, a reason, an owner and the evidence attached.

Rules · Reporting
Architecture

How the modules connect

Devices produce events. Events go on a durable queue. A worker drains the queue and runs whatever rules match. Nothing in automation can slow down, or break, the path that carries a live call.

event flow · con_icx → action_event → prs_action_worker
FIELD INGEST DECIDE ACT Help points & intercoms Alarm inputs & doors IP cameras PA speakers Remote sites (WireGuard) ICX AGENT calls · alarms · doors SIP observer NEVER BLOCKS EVENT QUEUE durable · claimed atomically SURVIVES RESTART RULES trigger → filter → ordered steps Announcement Camera + recording Operator notification Strobe / relay output Webhook to your system Console tab switch INCIDENT one ordered timeline every box above logs into it: asked, sent, confirmed or failed
Fails safe

Automation degrades to nothing

If the rule engine, the incident layer or a webhook endpoint fails, the alarm still reaches the queue and the operator still sees it. Every automation call is wrapped.

Fails closed

A filter that cannot match, does not

A rule filtered on a field the event does not carry never fires. A rule is rejected at save time if it references a placeholder its trigger cannot supply.

Answerable

Per-step audit, not a log line

Each run records every step: what was asked, what the device answered, how long it took, and whether the next step continued anyway.

Operator console

Dashboard

One screen an operator can work an entire shift from: the queue, the two monitors, the call controls, the reason capture and the day's history.

/operator_cc
fusionx.local/operator_cc
FusionX
DashboardStatistics SurveillanceMaps AlarmsIncidents Announcements Notifications3 Web
21:41:07
Waiting
2
Calls
Total calls
148
Today
Avg response
6.4
Seconds
Answered
141
95%
Alarms
1
Active
Incidents
1
Active
PreviewP2 North
● REC
STN 1042
ActiveFence W
● RECLIVE
STN 2117 · FENCE W
Calls, alarms & events (4)Enter = ack next
NumberDescriptionSiteWaitStatusTypeOperator
DAD5Fence — Platform 2 WestSouthgate Depot 00:14Alarm Fence—
1042Help point — P2 North stairSouthgate Depot 00:06Ringing Help point—
1017Lift car 3 intercomHarbour West 01:52In call LiftK. Osei
3308Gate 4 — vehicle entryNorthline Yard 00:00On hold AccessM. Rowe
Call control
AnswerCancel Door releaseHoldMute
Comment / reason
GenuineNuisanceTestSave

What the operator gets

  • One queue for calls, alarms and events. They compete for the same attention, so they sort in the same list, in the priority the site configured.
  • Two monitors, filled automatically. PREVIEW follows the ringing call; ACTIVE follows the answered one. Audio and video recording state show on the tile itself. When there is no picture — nothing happening, a station without a camera, a camera still connecting — the monitor shows a security-camera symbol rather than a sentence, and the first real frame replaces it. It is the same symbol on every monitor in the product — Dashboard and Maps, the surveillance walls, the incident workspace, the station preview in administration — drawn once and shared, so an empty pane means the same thing wherever the operator meets it.
  • Keyboard-first. Enter acknowledges the row marked NEXT; D releases a door; M opens the map at the caller. The console tells you when a key is refused rather than ignoring it.
  • Reason capture that survives. The comment is written against the event, not the queue row, so an operator-ended call keeps its reason.
  • Calls survive navigation. An invisible shell page holds the voice session, so moving to Maps or Surveillance mid-call does not drop it.
  • The site is a link. A site name in the queue or the history opens that site’s information — levels, plans, rates, apps — in its own window, on alarm rows too. It opens on the press, so a queue that refreshes every second cannot swallow the click.

Live figures on the tiles

  • Waiting · Total today · Average response · Average duration · Answered % · Active · Alarms active · Incidents active · Unacknowledged · Automation failures
  • Scoped per operator: what a desk sees is what its queues and permissions allow.
  • The row folds away on the Dashboard and on Maps, into a single line that still carries every number in its colour — so a folded row never hides a waiting call. The choice is kept per operator, so two people sharing a desk each keep their own.
Operator console

Maps & location

An alarm's first question is always where. Maps answers it before the operator has finished reading the row.

/operator_cc/maps
fusionx.local/operator_cc/maps
PLATFORM 2 DEPOT CONCOURSE FENCE · DAD5 Platform 2 West · L1
Southgate Depot · Level 1
2D3D ◐ Blueprint
SitesLevelsAlarms ●
Active
LIVE
FENCE W · STN 2117
Alarm detail
PointDAD5 · FENCE-P2W
LevelLevel 1 · Platform 2
CameraFence West (2117)
Priority1 · Critical
AcknowledgeOpen incident

Placement is engineering, not code

  • Drag the pin, and it stays. Alarm points, help points and cameras are placed onto the site plan by an engineer in the browser. The position travels with the event from then on.
  • Country → State → Site → Level. One directory shared by Maps, Surveillance and Announcements, so the same tree means the same thing everywhere. Each level carries a code, a name and a description, and an operator sees the description on the level itself.
  • Floor plans and street maps. Indoor levels sit on uploaded plans; sites sit on a real map so a remote depot is a place, not a row.
  • Camera on the pin. An alarm carries the camera bound to its point, so ACTIVE and PREVIEW fill from the map without the operator hunting the tree.
  • Scoped visibility. Operators see the sites they are responsible for; a supervisor sees the estate.
  • A status that means something. An intercom exchange reports a station’s line FAULT and nothing else, so a station is shown red on a fault and, the rest of the time, with the last moment it provably worked — “last heard 2 h ago” — rather than a green dot nothing stands behind.

A plan that belongs on the console

  • Whatever was uploaded, in the console's colours. A floor plan is whatever the site had — a white CAD sheet, a bright render, a photograph — and on a dark control-room screen it was the brightest thing there. By default it is now redrawn in two theme colours: the sheet becomes the console background and the lines are drawn in its blue. Measured on the reference plan, the sheet lands on exactly the stage colour.
  • Four styles, chosen per level. Blueprint for drawings, Tint for photos and renders (one colour, light and dark kept where they were), Dimmed for a plan whose own colours mean something, or the original. With a strength. An administrator sets it; operators see it and cannot change it. The same level looks the same on Maps and on Announcements.
  • Only the picture changes. The style is applied to the plan image alone, so pins, zones and every click sit above it exactly as before. Zone boundaries are white dashes, which read clearly on any of the styles.
  • Flat, or laid back in 3D. The plan can be tilted into a ground plane and walked round, with every pin standing upright on it and still answering a click. An administrator saves the angle a level opens at. Placing devices is always done on the flat plan, because on a tilted one the point you click is not the point that would be saved.

The tab gives way to the plan

  • The plan has a floor. Every pane on this tab used to size itself against the window alone, none aware of the others, and on a 1366×768 screen the plan was what gave — pins still drawn, on a stage a few dozen pixels tall. The plan now keeps a minimum size and the statistics row, queue band, event history, tree and monitors yield around it, each down to its own drag minimum, with the operator's saved sizes returning the moment there is room for them.
  • One job per tab. Zones, stored messages and Broadcast have left Maps — they are the Announcements tab's work, and here they were squeezing the plan and painting over Event History. The two monitors now fill that column and share it on a divider of their own.
  • Answer from the map, and it is a real answer. A call taken on the map picks up in the browser first, exactly as it does on the Dashboard, so the operator has audio and the call is recorded — wherever on the console it was answered.
Operator console

Surveillance wall

A video wall built for a control room on a link it does not own: shared upstreams, one decode per camera, and an honest badge saying how each picture got here.

/operator_cc/surveillance /admin/surveillance
fusionx.local/operator_cc/surveillance
Layout: NIGHT SHIFT 4×2 Southgate Depot Harbour West 8 / 8 streaming
Fence W
LAN
25 fps
P2 North
LAN
25 fps
Gate 4
GW
12 fps
Lift 3
● REC
25 fps
Concourse
LAN
2 detected
Yard N
GW
12 fps
Dock 2
RECONNECT
stalled 6s
Foyer
LAN
25 fps

Built for the link you actually have

  • One upstream per camera, not per viewer. Six operators on the same camera pull one stream; the frame cache serves them all. A wall of thirty-six tiles does not become thirty-six pulls.
  • LAN first, tunnel second. Each tile says how it got here — LAN direct, or GW through the site gateway — so a slow tile has a visible reason instead of a shrug.
  • A stall is not a shrug. A watchdog notices a frozen picture and reconnects with backoff; a stream that 404s is treated as broken, not retried forever.
  • Named layouts assigned to operators. Night shift gets its wall, days get theirs. An operator can remove a tile from their own wall and get it back from the camera tree.
  • Any camera source. ONVIF/RTSP, MJPEG with Digest auth, local USB, an uploaded file, or a YouTube live stream re-resolved on reconnect.
  • Pan, tilt and zoom from the sidebar. An eight-way pad, zoom, speed and presets under the camera tree, naming the camera it drives. Hold to move, release to stop — and the server stops the camera itself after two and a half seconds whatever the browser does, so a dropped link cannot leave a camera turning. Moving a camera is its own permission. Axis, Dahua and Hikvision are built in, with a URL template for anything else.
  • Health you can see. Per-camera FPS badge, credentials and resolution checks, staggered wall start so the box is not hit by all tiles at once.
  • Online means video is arriving. A camera the recorder or a live view is receiving frames from is online, and is not knocked on at all — the extra connection is what made busy cameras look dead. Only without that evidence is the camera asked directly, and one failed answer is a strike, not a verdict: offline takes two in a row.
Video analytics

Human & object detection

An operator watching sixteen tiles cannot watch sixteen tiles. A box drawn around a person is the cheapest possible way to say this one, now — and a box around a bag that was not there a minute ago says something a person cannot.

detection overlay · YOLO inference on the shared frame
Concourse EastDETECTION ON
1.0 fpsLIVE
person 0.94 person 0.88 car 0.81 · NEW knife 0.71
STN 1188 · 2 person · 1 arrival · 1 threat
Detection budget≈ 1 CPU core, held
Cameras under detectionRate eachInference costTotal
11.00 fps244 ms0.24 core
40.25 fps244 ms0.98 core
80.12 fps244 ms0.98 core
+ firearm pass, if enabledsame frame+62 ms+0.06 core
People and objects ride one inference. The firearm model is a second pass that loads only when a site asks for it — and on the reference install, after measurement, it does not.

A person is a presence. An object is an arrival.

  • People are boxed while they are in shot. That is what an operator watching a corridor wants.
  • Objects are boxed when they turn up, and then they stop. A car park holds forty cars all day and a concourse holds a bin, a bench and a bicycle rack — boxing all of them permanently is not an alert, it is wallpaper, and an operator who sees forty boxes every time they look stops seeing any of them. The bag that was not there a minute ago gets a box; the forty cars do not.
  • Which means the server knows what was already there. Each object is followed frame to frame, by overlap where it is still and by where it could plausibly have moved to where it is not — so a bag being carried stays one arrival instead of becoming a fresh one every second.
  • Three colours, so the wall can be read across a room. Green for a person, amber for something that has just arrived, red for a threat.
  • And the colour of the thing itself. “A bag” is not a description anybody can act on; “a red bag” is. Each arrival records the dominant colour of what was boxed, read from the middle of the box so the floor behind it does not count, and the log can be filtered by it.

What counts as worth a box is the site's decision

  • A watch list, per site. Knives, bags, phones, vehicles, and anything else the loaded model can recognise. The list offers only class names the model actually knows — a name it has never heard of matches nothing, silently, which on a watch list is indistinguishable from “none seen today”.
  • Per camera, not per wall. Detection is switched on for the cameras that matter. An unflagged tile is never even asked about.

Firearms: measured, and switched off until a model earns it

  • The everyday model cannot do it. It recognises eighty ordinary things — a knife and a pair of scissors among them, but no gun. No threshold and no longer list produces one; it takes a model trained for firearms, which FusionX can load alongside as a second pass on the same frame.
  • The one tried here did not earn its place. Over 189 consecutive frames of office footage containing no gun, it flagged a gun in 8 of them — one false alarm every twenty-odd seconds while anybody was in shot — at 62–72% confidence, and on live cameras it reached 85%, once on a blank wall. A threshold cannot fix a model that sure of nothing, so firearms are off the watch list on the reference install and the second model does not load at all. A false firearm on a control-room wall is not a cosmetic error.
  • Still the site's decision, now an informed one. The class is offered in the watch list marked unreliable, with that measurement beside it, rather than hidden or quietly left on. A better model can be dropped in and measured the same way.
  • A threat stays boxed while it is there. The one exception to the arrival rule, for a knife today: an operator who looks away for fifteen seconds must not come back to a tile with no box on a threat still in shot. Only the arrival raises the event.

Every box, logged — and judged

  • A detection log. Every object the wall has boxed: when, which camera, what, what colour, how confident, whether it raised an incident. Filter by time, camera, object, threats only, or review state.
  • Half a minute of video on every row, a third of it before. An arrival is the moment something is already there, so the useful seconds are the ones leading up to it. Nothing is cut or copied: the player is handed the recording and an offset, so a clip costs no disk.
  • An administrator says whether it was real. A confidence is what the network believes, not whether anything was there. The false-alarm rate is reported out of the detections actually reviewed, and not at all until something has been — “0% false” on a log nobody has checked would read as a model that works.

Analytics that cannot eat the box

  • It never opens a camera. Detection reads a frame that is already flowing because somebody is watching that tile. An idle wall costs nothing, and analytics can never become the reason a tunnelled site starts paying for bandwidth.
  • One inference per camera, shared. Six operators watching the same view get the same boxes; the model runs once, and people and objects ride the same pass.
  • The CPU is the constant, the rate gives way. Ask for more cameras and each one's rate drops so the total work stays around one core — measured, not guessed.
  • Detection is an event, not just a box. A person arriving where nobody was raises detection.human; an object turning up raises detection.object with the object's name and whether it is a threat. Both fire once per arrival, not once per frame, so a rule can act on them without drowning.
  • The models live in the analytics service, not in the web process, so the console never shares memory with them.
Evidence

Recording, playback & audio-to-text

Voice and video captured against the call, then transcribed per channel — so the caller and the operator are separated because they really were separate, not because a pause was guessed at.

/admin/recording
fusionx.local/admin/recording
Recording 40912 · STN 1042 · 21:41:23 · 3m 08sTranscribed
▶ 0:41 / 3:08
Transcript EN · auto Intent · Medical
CALLER · 00:03
There's someone on the ground by the west fence, he's not moving.
OPERATOR · 00:09
I have your camera. Stay where you are, I'm sending someone now.
CALLER · 00:16
He's breathing but I think he came off the ladder.

Capture

  • Audio and video, per station. Recording is switched on per station and per call type; the console shows a live mic and camera badge so the operator knows what is being captured.
  • Recording starts at ring, not at answer — the seconds before someone picks up are usually the ones that matter.
  • A replay belongs to one call. A recording is matched to the call whose own ring-to-answer moment it started in, not to whatever overlapped it, so two calls on the same station minutes apart cannot borrow each other's audio and a call back plays its own recording rather than the one before it.
  • Storage that stops before the disk does. A configurable cap with automatic purge, measured on the real volume.

Audio to text

  • Speakers are read, not guessed. Transcription runs per audio channel, so "caller" and "operator" are facts. Older recordings whose speakers were inferred can be re-transcribed in place.
  • Language detected automatically, with the confidence and detected language recorded alongside the text.
  • Intent detection. Configurable phrase sets classify what a call was actually about — medical, abuse, trespass, fault — and surface it on the transcript and in reporting.
  • Searchable evidence. The transcript is attached to the call, the incident and the report, so an event is findable by what was said.
Operations

Alarms

Alarm types, points, colours and priorities are configuration. Acknowledgement is a real frame to the exchange — not a flag the console sets and hopes about.

/admin/alarms/ids /operator_cc/alarms
fusionx.local/admin/alarms/ids
Alarm definitionsNew alarm
NameID maskPriorityColourReset eventPoints
FenceDAD*1alarm.acknowledged14
FireF1**1alarm.cleared31
Door forcedDR**2alarm.acknowledged62
TamperTM**2manual reset9
Line faultLF**3alarm.cleared—
Alarm history · today30-day retention shown
RaisedAlarmPointSiteAcknowledgedByCleared
21:41:07FenceDAD5Southgate21:41:21J. Vance—
18:02:44Door forcedDR12Harbour West18:02:59K. Osei18:07:10
14:26:31TamperTM04Northline14:27:12M. Rowe14:41:02

Configured, not compiled

  • Alarm types are rows. Name, ID mask, priority tier, queue colour and reset behaviour are edited in the browser and take effect without a release.
  • Points carry identity. Each physical input is a named point with a site, a level, a map position and a camera — so an alarm arrives as a place, not a code.
  • Acknowledgement is authoritative. FusionX sends the acknowledgement frame that names the alarm being acknowledged, and shows a pending state until the exchange confirms it. It never claims an ack it did not get.
  • Raise and clear cannot cross. Each occurrence carries a key, so a clear that arrives during a raise cannot close the wrong one, and duplicate notifications are impossible by construction.
  • Nothing is left standing. A reaper closes alarms whose clear never arrived, so an old alarm cannot sit lit on the wall for a week.
  • Isolated from call handling. A bad alarm configuration cannot break the code path that carries a live call.
Workflow

Incidents & responsibility

One alarm produces an alarm row, a queue row, an automation run and a notification per recipient. The incident is the object that joins them: one owner, one ordered history, and an honest record of what the system asked for against what came back.

/operator_cc/incidents
fusionx.local/operator_cc/incidents?ref=FX-1823
← All incidents High FX-1823 · Car Break Alarm — DAD1 In progress Darling Harbour · Ground Source active Verified
00:14:12
ELAPSED
Location · Ground
Open in Maps
Live video · OD1030s before
05:41:23
ALARM
▶ 0:18 / 5:00
Incident details
Sourcealarm · DAD1
SeverityHigh
OwnerOperator2
AcknowledgedOperator2 · 14.2s
VerifiedOperator2 · patrol sent
Source stateStill active
AutomationCompleted
What FusionX did
camera.snapshotConfirmed
notify.operator3/3 sent
webhook.postTimeout
Incident timeline · append-only11 entries
06:14:02AlarmAlarm received — Car Break Alarm DAD1
06:14:02SystemPolicy "Security and life-safety" applied — severity HIGH
06:14:02AutomationRule "Perimeter night" ok — 4 sent, 1 failed
06:14:07FaultAutomation step failed — webhook.post: the device did not answer
06:28:03OperatorOperator2 took ownership
06:28:26OperatorVerified by Operator2 — patrol sent
Notify…Announce… Add noteAssign… ResolveClose

The workspace answers one question

  • Where, what, and what was done — side by side. The plan fills its pane and centres on the alarm point, the camera bound to that point is already open, and the details column carries owner, severity and the state of the source. Where there is no camera to show, the pane says so in the incident's own terms — an incident opened by hand has no alarm point to blame.
  • The owner has a face. The incident list carries the owner's photo between the title and the severity — their initials in their own colour if they have no photo, an empty ring while no one has taken it. It is the same face the timeline draws, so one glance down the list says who holds what.
  • Thirty seconds before the alarm. One button replays the recorded video from just before it fired, with the wall-clock time on the picture and a marker at the exact moment of the alarm — because the useful question is what happened in the run-up, and the live view cannot answer it.
  • An append-only timeline carrying device events, policy decisions, automation results and every operator action, in one order, each attributed.

Six states, and only forward

  • OPEN → ACKNOWLEDGED → IN_PROGRESS → RESOLVING → RESOLVED → CLOSED, each stamped with who did it. A closed incident cannot be quietly reopened and edited.
  • Which alarms become incidents is a setting, not a rule of the software. Every alarm type carries a Create an incident switch: fire and duress on, station faults off. An alarm-only type still queues, sounds, acknowledges at the exchange and fires rules — it simply never becomes tracked work.
  • An operator can overrule it. Raise incident on the alarm row promotes the one that turns out to matter. It reuses the engine's own correlation key, so it cannot produce a second incident for a point that already has one, and the timeline records that a person chose it.
  • Or open one by hand. For what no device raised — seen on a camera, phoned in, walked up to the desk — New incident takes a title, a type (security, suspicious activity, fire, medical, access, welfare and more), a severity, the site and level. The reference is assigned in the same sequence as every other incident, the timeline says a person opened it, and a double-click is still one incident.
  • Truthful automation status — requested, sent, confirmed, failed, timed out. "Sent" and "confirmed" are different words on purpose.
  • It owns nothing and executes nothing. If the incident layer fails entirely, the alarm still reaches the operator.
Companion brief
Alarms and incidents are two different things

Why a device state and a unit of work are kept apart, the four gates that decide when an alarm becomes an incident, every case where you get an alarm and no incident, and how PSIM, alarm receiving centres, ISA-18.2 and ITIL each draw the same line.

Read the brief →
The connective tissue

Rules — event → filter → ordered steps

The module that makes the other modules one system. Every id in a rule is picked from a list of what the system actually has, so a rule that looks configured really is.

/admin/rules
fusionx.local/admin/rules/perimeter-night
Rule · Perimeter night ArmedRun in order
WHEN
Alarm raised
ONLY IF
Alarm = Fence, Gate
Site = Southgate Depot
STANDS DOWN ON
Alarm acknowledged
StepsTest runSave
#ActionTargetOn errorLast run
1Take a snapshot{station}Continue1.1s
2Show a tab on the consolemapsContinue0.2s
3Play announcementzone: Platform 2Continue2.4s
4Switch an output onstrobe P2WStop0.3s
5Notify operatorsdesk 1017, 1035, 9099Continue0.1s
6Call a webhookPOST cad.internal/incidentContinuetimeout

Nine things that can fire a rule

  • alarm.raised · alarm.acknowledged · alarm.cleared
  • call.ringing · call.answered · call.ended
  • call.door_opened — the exchange confirming a door moved, not FusionX confirming it asked.
  • call.unwatched — a call ringing or an alarm standing with nobody watching the queue. The one trigger about something that goes on being true.
  • detection.human — a person arriving in a camera's view.
  • detection.object — an object arriving in a camera's view, with its name and whether it is a threat.
  • access.granted · access.denied · door.forced · door.held_open and twelve more door, lockdown, reader and controller events from the access control system — with steps to open a door for a moment or change its mode, confirmed only when the door reports it.

Design decisions worth knowing

  • Nothing arms itself. New rules are created in dry-run. There is a Test run button, and nothing reaches a device until someone deliberately arms it.
  • No branching. A rule engine that can branch is a rule engine somebody has to debug at 3am. Two rules with different filters say the same thing and can be read at a glance.
  • Rules latch and stand down. A rule that switched a strobe on holds it until its reset event arrives — or an admin presses Reset — and its own notifications close themselves at the same moment.
  • Rules can call rules, to a hard depth limit, so a shared procedure is written once.
  • Steps run in order, or all at once — whichever the procedure is.
ActionWhat it does
pa.announcePlay a stored message to a zone; the zone expands when the rule runs, so adding a speaker needs no rule edit.
camera.snapshotCapture a JPEG from the station's camera and attach it to the run and the incident.
video.recordRecord N seconds of a station's camera.
output.pulseStrobe or relay: on, wait, off.
output.setSwitch an output on or off and hold it until the rule is reset.
notify.operatorPut a message on named operators' consoles — one row each, so "who has seen it" is answerable.
notify.closeClose the notifications this rule raised, when it stands down.
console.switch_tabBring the right tab up on the operator's screen — the map, the camera — without them navigating.
webhook.postPOST the event to an external system, with the event's fields substituted in.
icx.sendSend one exchange frame, for the integration nobody anticipated.
rule.run / rule.resetRun another rule, or stand one down.
wait / audit.notePause between steps; write a line into the run log that proves the rule matched.
Operations

Access control

Doors from the site's own access control system appear on the console, on the map and in the rules: who was let in, who was refused, which door is forced or held. FusionX supervises and commands doors. It never decides who may pass and never holds a card.

/admin/access /operator_cc/maps
fusionx.local/admin/access
Access systemsAdd access system
NameKindSiteStatusDoors
Head officeGallagher Command CentreSydneyok48
DepotInner Range InceptionParramattaok12
Plant entrancesONVIF (Profile A/C, any vendor)Port Botanydown 2 min6
DoorsTest connection
DoorStateLockCameraIntercom
Main EntranceclosedlockedLobby PTZ1035
Loading DockforcedlockedDock 21041
Plant Roomheld openunlockedPlant cam—

Supervise and command, never decide

  • The access system stays in charge. Cards, PINs, schedules and access rights live in the access control system. FusionX stores no credential, and an event that carries a card number has it dropped before it is stored.
  • One vocabulary for every brand. Access granted and denied (with the reason: unknown card, expired, out of hours, anti-passback, wrong PIN), door opened, closed, forced, held open, locked, unlocked, mode changes and lockdown, reader and controller health, all arriving as the same events whatever the brand.
  • Doors on the map. A door sits on the floor plan with its live state, its camera and its intercom. Its card shows recent events and the door controls. A door not yet placed is offered by its name, ready to drop onto the plan.
  • The DOOR button knows the door. When the calling intercom is bound to a door, the operator's door release goes to the access control system, and the console shows whether the door actually opened.
  • Confirmed, not assumed. A command is sent, acknowledged by the access system, then confirmed only when the door itself reports the change. A command past its deadline is never sent, and every command is written to a tamper-evident, hash-chained log.
  • Rules and incidents. Door and access events trigger rules: open a camera, page a supervisor, unlock a door for a moment, change a door's mode. A forced or held door raises an incident tied to that door.
  • The customer's off switch. Each access system has a switch that stops all door commands from FusionX while events keep flowing. Operators see only the sites they are assigned.
  • Proved on site. "Test connection" checks the address, the login, the doors and the event feed without sending a single command.
Available

Connects to

Gallagher Command Centre (REST API), Inner Range Inception, Verkada (cloud, Australian region), Axis A1001 / A1210 / A1601 / A1610 door controllers, TANlock electronic rack and cabinet locks, and any ONVIF Profile A / C door controller: the open standard implemented by Axis, Hikvision, Dahua, Suprema, ZKTeco and others.

Built to the vendor's own specification

Checked against the published API

Each connector is tested against the vendor's own published specification, pinned in the product, and fails its build if a field it relies on disappears. On site, the built-in connection test confirms the real system before it goes live.

Roadmap

Next connectors

Inner Range Integriti, Genetec Security Center, LenelS2, Brivo and Avigilon Alta follow through the vendors' partner programmes. Lockdown from FusionX is reserved for a two-person release; until then lockdown is started in the access system and shown in FusionX.

Licence

Its own licence and its own service

Access control is a licensed feature. It runs in its own service beside the console, so a slow or unreachable access system never holds up a call or an alarm.

Operator console

Public address

Zones, stored messages, text-to-speech, a scheduler and live push-to-talk — driven by an operator or by a rule, over the same path either way.

/operator_cc/announcements /admin/pa
fusionx.local/operator_cc/announcements
Zones & speakers
▾ SOUTHGATE DEPOT
Platform 1 6
Platform 2 8 ✓
Concourse 11
Yard 4
▾ HARBOUR WEST
Quayside 9
MessageChime on
Evacuate — proceed to nearest exit0:14Emergency
Area closing in ten minutes0:09Routine
Security to Platform 2 (TTS)0:06Generated
Transmit● On air · Platform 2
Play to zone Hold to talk Stop
LEVEL
Scheduler · next
Weekdays 06:00Depot openingArmed
Daily 22:30Closing noticeArmed
1st of monthAlarm test tonePaused

Announce the way operators think

  • Zones are the unit. "Announce to the East platform", not a list of device numbers. Speakers can still be added individually for the odd case.
  • Stored messages and text-to-speech. Type a line, get an announcement — with a chime prepended and loudness normalised so every message lands at the same level.
  • Live push-to-talk from the browser to the zone, no handset required.
  • A scheduler with real recurrence. Weekday openings, monthly test tones, one-offs — armed, paused, or run now.
  • Import and export. Zones, speakers and messages move by spreadsheet, with a dry run that shows what would change before anything is written.
  • Rules announce over the same path an operator does, so an automated evacuation sounds exactly like a manual one.
  • Only what belongs here. Each stored message can be shown to operators or kept out of their list with one click, so nobody picks from announcements meant for another site. Hidden is not deleted: schedules and presets still use it.
Operator console

Notifications

Telling the right person is a product, not a side effect — and knowing whether they saw it is the point.

/operator_cc/notifications
fusionx.local/operator_cc/notifications
RULE · PERIMETER NIGHT · 21:41:10
Fence alarm — Platform 2 West, camera is open on your ACTIVE monitor
Southgate Depot · point DAD5 · incident INC-4471
OpenDismiss
WhenNotificationSourceRecipientsSeen
21:41:10Fence alarm — Platform 2 Westrule31 of 3
20:12:44Camera Dock 2 unreachable for 5 minhealth22 of 2
19:58:02Queue unwatched for 90srule44 of 4
18:30:00Shift handover — night team on dutyschedule66 of 6

One copy each

  • Per-recipient rows. Dismissing yours does not clear anyone else's, and the system can answer "who has actually seen this".
  • Toast, sound and badge on the console, with a mute control the operator owns — and a visible notice when the browser has not yet allowed sound.
  • They close themselves. When the rule that raised a notification stands down, its notifications close with it. No stale card left on a screen at 4am.
  • Notifications are history. A rule whose only step is a notification still fills Event History — the record does not depend on someone also configuring an audit note.
  • Outward too. The same event can go to an external system by webhook in the same run.
Operations

Call management

Intercom and help-point calls from the exchange or over SIP, answered in the browser, with the queue behaviour set by the site rather than by the software.

/admin/settings/callqueue /admin/stations
fusionx.local/admin/settings/callqueue
Call types & priority tiersAdd type
TypeTierQueue colourEmergencyAuto-recordCamera
Fire1YesAudio + videoBound
Help point2NoAudio + videoBound
Lift2YesAudioBound
Access / gate3NoAudioBound
Service4NoOff—
Operator desks
DeskQueuesPresence
10179009, 9033Online
10359009Online
9099pilotUnmanned
Call source
Exchange (ICX)Connected
SIP registrations6 of 6
Media relay (TURN)Two-way audio
Answer latency85 ms

The queue is yours to shape

  • Call types, tiers and colours are data. A site decides what outranks what, and what colour it wears in the queue, without a software change.
  • Multi-queue operators. A desk subscribes to any number of queues; the pilot queue is derived from live subscriptions rather than hard-coded.
  • Answer in the browser. WebRTC audio with a media relay for the sites that need one — no softphone to install, no handset to maintain.
  • Two call sources, one queue. Exchange calls and SIP-only calls appear side by side, each badged with where it came from.
  • Each operator works the way the site does. User Management sets every operator's type: a FusionX FreeSWITCH user answers SIP calls in the browser with no exchange at all; a VirtuoSIS SIP user answers in the browser through their own SIP line on VirtuoSIS, with call data over ICX; a VirtuoSIS desk answers on the Commend handset, with call data over ICX.
  • Direction is recorded, not assumed. Incoming and operator-initiated call-backs are distinguished, and both reach call history.
  • Controls that mean something. Answer, cancel, hold, mute and door release — and the door release reports whether the door actually moved.
  • A call back that cannot connect says why. An exchange will not deliver a call back to a desk whose line is already ringing, and that used to be a call that simply stayed silent. Now the console names the call ringing the line and offers to clear it and call back in the same moment; it auto-answers only the call back’s own leg, never whatever else happens to ring.
Operations

SIP devices & trunks

Intercoms, speakers and phones register to FusionX itself, with no exchange in between. Queues, operator calls, door release and announcements run on FusionX's own SIP server, beside a VirtuoSIS exchange or without one.

/admin/stations Stations > SIP Devices Stations > SIP Trunks
fusionx.local/admin/stations · SIP Devices
SIP devices · 4 of 5 onlineAdd devices
ExtNameTypeWay inVideoStatus
2001Gate 1 intercomIntercomSite gatewaySIP H.264Registered
2002Car park help pointIntercomSite gatewayCamera 14Registered
2003Lobby speakerSpeakerSite VM—Registered
2004Remote kioskIntercomInternet (TLS)SIP H.264Registered
2005Workshop phonePhoneSite gateway—Offline
SIP queues
NumberModeOverflow
9100Pick9200 after 60 s
9200Distribute—
SIP trunks
Building PBXRegistered
Carrier (IP trunk)Trusted
Inbound 02 9000 1234→ 9100
Outbound prefix0

FusionX's own SIP server

  • Devices register to FusionX directly. Each SIP intercom, speaker or phone has its own extension and a password FusionX generates and stores encrypted. Add one, add a numbered range in one step, or import a spreadsheet with a dry run first.
  • A setup sheet for every device. Everything to enter on the device itself: server, port, extension, password and codecs (Opus, G.722, G.711).
  • The right address for every way in. A device on a site's LAN registers to that site's gateway or site VM. A device with no gateway connects over the internet with TLS and encrypted (SRTP) audio. Several sites and several gateways each get their own address, so calls and audio always find the way back.
  • Live status. The device list shows which devices are registered right now, from which address and which device, whichever way in they use.
  • Queues with two behaviours. Pick: every subscribed operator sees the call and whoever answers takes it. Distribute: FusionX rings the free operators one at a time, longest idle first. The caller hears ringback while waiting; a call waiting too long goes to an overflow queue or extension.
  • Same console, same controls. SIP calls appear in the operator queue beside exchange calls, badged by source. Answer, hold, mute and door release work the same, and an operator can call a device from the console.
  • Video from the device or a camera. A device shows its own SIP video (H.264), or any camera bound to it.
  • SIP trunks to other systems. Connect a PBX, a carrier or another system, registering with a username and password or trusted by address. Incoming numbers route to a queue or extension, each number on its own if needed; operators and devices dial out with a prefix, presenting the caller ID you set.
  • Announcements reach them too. Public address plays to SIP devices, trunk numbers and exchange zones in one announcement.
  • Side by side with VirtuoSIS. A site can run exchange stations and SIP devices together, or SIP alone with no exchange at all. Trunks and devices each have their own port, so neither touches the exchange connection.
Estate

Sites & remote sites

One directory — country, state, site, level — shared by maps, cameras, announcements and reporting, so a site means the same thing in every module.

/admin/sites
fusionx.local/admin/sites
SiteRegionLinkStationsCamerasSpeakersLevelsState
Southgate DepotAU · NSWLAN4218293Healthy
Harbour WestAU · NSWGateway2612142Healthy
Northline YardAU · VICGateway179611 camera down
Kestrel InterchangeAU · QLDGateway3114224Healthy
Old Mill SubstationAU · VICNo handshake6321Offline 4m

An estate, not a list

  • One tree, everywhere. The same Country → State → Site → Level hierarchy drives the camera tree, the PA zone tree, the map and every report filter.
  • Floor plans per level, with devices dragged onto them and remembered.
  • Remote desktop and web tools at the site. Launch a VNC or RDP session to site equipment, or embed a site's own web tool as a console tab — checked at save time so a page that refuses to be embedded is caught then, not at 2am.
  • Import and export. Stations, cameras and speakers move by spreadsheet with a transactional dry run.
Estate

Site gateways

A small appliance at each remote site brings its intercoms, cameras and speakers onto one encrypted network — and tells the truth about whether it is actually up.

/admin/settings/gateways
fusionx.local/admin/settings/gateways
GatewaySiteTunnel IPLAN routesLast handshakeState
gw-harbour-01Harbour West10.100.1.1192.168.10.0/2412s agoOnline
gw-northline-01Northline Yard10.100.2.1192.168.22.0/249s agoOnline
gw-kestrel-01Kestrel Interchange10.100.3.110.42.0.0/2321s agoOnline
gw-oldmill-01Old Mill Substation10.100.4.1192.168.44.0/244m 12s agoNo handshake
Routing change · preview before applyNot applied
+ add10.42.2.0/24 → gw-kestrel-01new camera VLAN
− remove192.168.44.8/32 → gw-oldmill-01decommissioned
DiscardApply with rollback

Honest liveness

  • Up means the tunnel handshook. Gateway state is read from the encrypted link itself, not from a heartbeat the gateway sends about itself — a box that has lost its key cannot report itself healthy.
  • Routes are derived from the site record. The LAN subnets you enter against a site become the tunnel's routes. Nothing is hand-edited on the appliance.
  • Preview, apply, and roll back. Every routing change is shown as a diff, backed up before it is written, and rolled back automatically if the tunnel does not come back.
  • Media, not just management. The gateway carries camera video, intercom audio and remote-desktop sessions for its site, so a remote depot behaves like a local one.
Integration

Webhooks & API — both directions

FusionX is rarely the only system in the room. It tells your dispatch, PSIM, building and security systems what happened, and those systems report back into FusionX, where rules, alarms and incidents handle them like anything else.

integration · your systems ⇄ FusionX
YOUR SYSTEMS CAD & dispatch PSIM / SOC Building management SIEM & audit Ticketing & CRM Access control Fire & evacuation panels FUSIONX RULES ENGINE · 12 TRIGGERS ALARMS INCIDENTS CALLS CAMERAS PA DOORS Every outbound call is recorded on the incident: sent, answered, failed, or timed out. FUSIONX → YOUR SYSTEMS YOUR SYSTEMS → FUSIONX AVAILABLEWebhook from any rule step · POST or GET · Basic / Digest AVAILABLERaw exchange frames to panels that speak it ROADMAPSigned event subscriptions · retries · alarms first AVAILABLEAccess control systems · alarm inputs and help points AVAILABLECamera analytics and camera health events ROADMAPREST API v1 with scoped keys · live event stream
Available · out Available · in Roadmap
rule step · Call a webhook · alarm.raised
POST https://cad.example.com/api/events
Authentication: auto (Basic or Digest)   Verify TLS: yes

{
  "source":  "FusionX",
  "type":    "alarm",
  "alarm":   "{alarm_name}",
  "point":   "{label}",
  "site":    "{site}",
  "station": "{call}"
}

── on the incident timeline ─────────────────────────
21:41:07  ✓ webhook  cad.example.com  200  184 ms

Available today. One step in a rule, written once. The {placeholders} fill from each event, and a rule is refused when it saves if its trigger can't supply them.

roadmap · incoming API v1 · a PSIM raises an alarm
POST /api/v1/alarms
Authorization: Bearer fxk_live_7Q…   scope: alarms:control

{ "point": "Gate 4 forced", "site": "Southgate Depot",
  "severity": "high" }

202 Accepted
{ "action_id": "act_01J…", "state": "pending" }

── the real outcome, not just "sent" ──────────────────
GET /api/v1/actions/act_01J…   → "completed"
or the action.completed event to your endpoint

On the roadmap. Each integration gets its own key, limited to what it needs. Doors, outputs, live PA and alarm reset need an extra life-safety approval. Illustrative request: the final contract publishes with its spec.

Outbound · available

Webhook on any event

Any of the 28 triggers can call your CAD, ticketing, BMS or SIEM as one step in a rule. The result is recorded on the incident, including a timeout.

Outbound · available

Raw exchange frames

Where a third-party panel speaks the exchange's own protocol, a rule can send it a frame directly, with placeholders filled from the event.

Inbound · available

Field systems report through the exchange

Alarm inputs, door contacts and help points wired to the intercom exchange arrive as alarms and calls, and rules can act on them. Cameras report analytics and their own health.

Inbound · available

Access control systems

Gallagher, Inner Range Inception, Verkada, Axis, TANlock rack locks and any ONVIF Profile A / C door controller report access and door events, and take door commands from the console and from rules. See Access control.

Inbound · roadmap

REST API v1 with scoped keys

Read calls, alarms, incidents, cameras, recordings and PA. Raise or acknowledge alarms, open incidents, play stored messages, move cameras. Each key has its own scopes, sites, expiry and audit trail.

Outbound · roadmap

Signed event subscriptions

Subscribe a URL to the events it needs, each delivery signed, retried and logged. Alarm and incident events have their own queue, so a slow endpoint never delays an alarm.

Standards

Devices and video, without an SDK

Station names come from the exchange, not retyped. ONVIF and RTSP cameras, and MJPEG with Basic or Digest authentication: no proprietary recorder required.

Evidence

Statistics & reporting

Live figures for the shift running now, and answerable history for the meeting on Monday.

/admin/statistics /admin/live
fusionx.local/admin/statistics
TodayLast 7 daysMonth All sites ▾All call types ▾ Export CSVExport PDF
Calls
1,043
7 days
Answered
96.2%
Within 15s
Alarms
64
7 days
Avg ack
11s
Alarms
Incidents
38
Closed
Calls by hour · Tuesdaypeak 17:00 · 92
050100 92 00 06 12 17 23
By operator · last 7 days
OperatorAnsweredAvg responseAvg talkAlarms ackedIncidents closed
J. Vance3125.1s1m 44s2214
K. Osei2886.8s2m 02s1811
M. Rowe2417.4s1m 58s159
A. Duarte2026.2s1m 51s94

Ask a real question

  • Filter by anything the estate knows: date range, site, region, level, call type, alarm type, operator, desk, queue.
  • Response and handling times measured from the ring, not from the moment a record happened to be written.
  • Per-operator activity for supervision, with the same scoping rules the console uses — an operator sees their own figures, a supervisor sees the team.
  • Evidence attached. A row in a report leads to the recording, the transcript, the snapshot and the incident timeline behind it.
  • Export to CSV or a branded PDF carrying the site's own logo.
  • Incidents are statistics too — how many, how fast they were acknowledged and resolved, how often a point has done this before — as a band on the incident list and a report you can export.
  • Medians and 90th percentiles, never an average as the headline. On the reference install the mean time to acknowledge a fence alarm was 35 minutes, although most were answered inside one: a handful left over a shift change outweighs everything else. The median says what usually happens; the 90th says how bad the bad ones are.
  • Live view for the shift running right now: who is on which desk, what is waiting, what is standing unacknowledged. It sits beside the reports under the one Statistics tab — Statistics | Live stats — so the figures for now and the figures for Monday are one click apart.
Platform

Administration

The parts that are boring until the day they matter.

Access

Roles & permissions

Around two hundred routes are permission-gated, edited on one grid, with every change written to the audit trail. Five roles ship as a starting point; make your own. A supervisor or manager signs in to an admin panel trimmed to their role, and moves between it and the operator console from the profile menu, both ways.

Access

You cannot lock everyone out

The last administrator standing cannot be disabled, demoted or deleted — enforced at the user level and the role level, on both edit paths.

Access

Two-factor and session control

TOTP enrolment per user or enforced estate-wide, idle timeout with a countdown, and a disabled account's live sessions ended rather than left running.

Onboarding

Operator readiness

A new operator needs a role, a desk, a queue and a voice endpoint. The readiness panel shows all four at once, because three of them used to fail silently.

Continuity

Backup, restore & version history

Scheduled backups, restore from the browser, and a record of what version was running when — plus an off-box copy for the day the box is the problem.

Continuity

Multiple systems, one install

Build, save and switch whole configured systems — a commissioning project, a training system, the live one — with one active at a time and no cross-contamination.

Answerable

Audit & event history

Who changed what, when, and from where; alongside an event history that covers calls, alarms, announcements and notifications in one searchable list.

Answerable

System monitor & logs

CPU, memory and disk on the console itself, service health, and a log viewer — so the first question after an odd night has an answer in the browser.

Identity

Your brand, not ours

Upload a logo and set the accent colour; it carries through the console, the login page and exported reports.

Deploy · hosted

The cloud platform — one tenant per customer

Hosted FusionX is not one shared system with a customer column. Each customer gets a tenant of their own: their own console, database, voice relay, web address, site tunnels and backups, held to their own share of the host so that no neighbour can starve them.

platform · control plane → isolated tenants → your sites
console database relay tunnel OWN MEMORY CEILING CONTROL PLANE HOSTS · ONE TENANT PER CUSTOMER YOUR SITES PORTAL Dashboard & alerts Customers & tenants Hosts & capacity Releases & rings Licences Backups Site VM images & updates EVERY ACTION AUDITED AND HEALTH-GATED HOST 1 Harbour RailKestrel TransitNorthline harbour-rail.…kestrel.…northline.… HOST 2 SouthgateHarbour Rail southgate.…STAGING COPY · CANARY + NEXT CUSTOMER REFUSED IF NO ROOM Harbour Rail · Central GATEWAY · ENCRYPTED Kestrel Interchange GATEWAY · ENCRYPTED Northline Depot GATEWAY · ENCRYPTED Southgate Depot GATEWAY · ENCRYPTED OFF-SITE BACKUP nightly · each sealed with its tenant's own key harbour-rail kestrel northline southgate portal OPERATORS any browser · HTTPS voice through the tenant's own relay
Control · actions, releases, signed licences Site tunnel · into its own tenant only Sealed backup Customer names are illustrative
CANARY2 h RING 124 h RING 272 h RING 37 d+ approval RELEASE RINGS One tenant at a time. Each ring soaks before the next one starts. A failed tenant, or one that turns unhealthy while it soaks, halts the whole release.

Isolated by construction

  • Own share of the host. Each tenant runs inside its own memory and CPU ceiling. The alarm path is weighted above recording, so a busy camera wall never delays an alarm.
  • Own voice relay and address. Each customer reaches their own console at their own web address, and their audio goes through a relay of their own.
  • Own tunnels. A site's gateway connects only to its own customer's tenant.
  • Own backups. Nightly, sealed with the tenant's own key and shipped off-site. The control plane is backed up the same way.

Run by the supplier, visible to you

  • A staging copy first. Any tenant can be cloned to a staging copy that takes each release before the live system does.
  • Support by consent. The supplier opens a customer's console only if that customer allows it, and every action in the portal is audited.
  • Room before it's needed. The portal tracks each host's capacity. A new tenant, or a copy, is refused when the host has no room, rather than squeezing in.
  • Cloud to site. A hosted tenant exports to a single file that runs on a site VM.
Deploy · on your site

The FusionX site VM — from download to first call

For a site that keeps everything in its own building, FusionX ships as a ready virtual machine. The VMware and Hyper-V images carry every part of the platform on the disk, so they install on a network with no internet at all.

01

Download

A private link, valid for 48 hours, with the checksum of every file beside it.

02

Install

Import into VMware, or double-click the Hyper-V installer. It checks the disk and builds the VM.

03

First boot

The VM's console asks four things: network, admin password, site name, first web admin.

04

Operate

Browse to the address it prints and sign in. The 60-day trial is already running.

VMware

.ova · ESXi, Workstation

One file to import. Settings, disk and network adapter come with it.

Hyper-V

.zip · Install-FusionX.cmd

Double-click. It copies and checks the disk, picks the switch and starts the VM, with or without Secure Boot.

Your own Ubuntu server

.zip · install.sh

For any other hypervisor: unzip on a fresh Ubuntu 22.04 or 24.04 VM and run one script. This route fetches Ubuntu's own packages.

VM console · first boot
FusionX first-time setup
========================

== 1/4 Network
  eth0: 192.168.251.251/24
Keep these network settings? [Y/n] n
Static address for this VM. Example: 192.168.1.50/24
Address/prefix: 10.20.4.15/24
Gateway (blank for none): 10.20.4.1
DNS servers, space separated (blank for none): 10.20.4.1

== 2/4 The fusionx admin account (the admin menu, nothing else)
New password for fusionx (10+ characters):
Again:

== 3/4 FusionX
Site or customer name: Southgate Depot

== 4/4 The first web admin
First admin user name: control
First admin email: control@southgate.example
First admin password:

Done. Browse to https://10.20.4.15/
For the admin menu, log in as fusionx. 

Set up from the VM's own console. It starts on a fixed address, 192.168.251.251, with DHCP off, so nothing on the site network is surprised by it.

ssh fusionx@10.20.4.15 · the admin menu
FusionX on fusionx-site   10.20.4.15/24
  Trial: free trial: 47 days left

    1) Status                        9) Image history
    2) Services running             10) Roll back to an earlier version
    3) Network settings             11) Apply an update
    4) Set a static address         12) Licence
    5) Use DHCP                     13) Restart FusionX
    6) Site name                    14) Restart the VM
    7) View logs                    15) Shut the VM down
    8) Back up now / list backups   16) Disk space
                                    17) Change my password
                                     0) Log out

Choose:  

Everything a site needs, nothing it doesn't. The site's own administrator gets this menu, over SSH or on the console. It is not a shell.

01 · NETWORK 02 · LOGIN 03 · MENU 04 · ROOT Fixed address, DHCP off. A network change undoes itself in two minutes unless it is confirmed. The fusionx login opens the menu, on the console or SSH. Never a shell. Each item runs one fixed admin command. Nothing typed is passed through. Held by the supplier, never issued to a site. Stored only as a hash; a site password can't match it.

Secure by default

  • Two accounts, two jobs. The site's fusionx login can look after the host: address, site name, logs, services, backups, updates, licence, restart. It has no root rights. Root stays with the supplier.
  • A network change can't strand the VM. New settings revert on their own unless they are confirmed within two minutes.
  • The disk takes space as it fills. Make the virtual disk bigger and the VM grows into the space. If the disk passes 92% full, recording pauses until it is back under 88%. Calls and alarms carry on.
  • Logs can't fill the disk. Every service's log is capped in size.

Updates without the internet

  • An update is a file. Bring it on a USB stick, or the VM fetches it with its customer's own update token. Apply it from the menu.
  • Every version is kept. Image history lists what ran when. Rolling back to an earlier version is one menu item.
  • Back up now, and prove it. Each backup is test-restored as it is taken.
Licence — a 60-day trial, then activation
LICENSED · to the end date set for the customer 60-DAY FREE TRIAL · EVERY FEATURE ADMIN LOCKED extras pause ACTIVATE ANY DAY menu 12 shows a code → the supplier returns a key → paste it in. Done. DAY 0DAY 30DAY 60DAY 61 ALARMS · CALLS · CONSOLE · MAPS — NEVER STOP
Fails safe

A lapsed licence never silences an alarm

Without activation, from day 61 the administration pages lock and licensed extras pause. Operators keep answering calls and alarms, and keep the console and maps.

Per customer

Terms set for each customer

The supplier sets features, users, cameras and end date per site. The key is made for that one installation, and works offline.

Moved or copied

New hardware is noticed

Moved to different virtual hardware, the VM gives a week's notice, then asks to be activated again. The supplier sees every request.

Deploy

Ports & firewall

What has to be open, and against which source. Anything not listed here does not need a rule.

Out of scope on this page: the encrypted link between the control room and its remote sites. That tunnel carries its own ports and is covered separately — everything below assumes a single site.
Inbound — to the FusionX server
ServicePortProtoAllow fromPurpose
Console — operators & admin443TCPOperator workstationsThe entire web console, including the WebRTC voice leg, which is multiplexed over this one port.
HTTP redirect80TCPOperator workstationsRedirects to HTTPS. Also used by the certificate authority if you auto-renew a public certificate.
Console over plain HTTP8000TCPOperator workstationsNon-TLS access for a closed LAN. Close it if you use 443.
SIP signalling5060UDPIntercom exchange, SIP endpointsCall setup between the exchange and FusionX.
SIP devices5070UDP + TCPSIP intercoms, speakers, phonesDevices that register to FusionX directly. Behind a site gateway, devices use the gateway's address and the gateway forwards to FusionX through its tunnel.
SIP trunks5080UDPPBX, carrier, other SIP systemsCalls in and out over a SIP trunk, on their own port apart from the exchange and the devices.
RTP voice media10000–20000UDPIntercom exchange, SIP endpointsTwo-way audio. The range is configurable; size it to concurrent calls, not to endpoints.
Call recording media6000–6100UDPIntercom exchangeThe recorder's own receive legs, separate from live call media.
STUN / TURN3478TCP + UDPOperator workstationsLets a browser find a media path when the direct one is blocked.
TURN relay media49160–49200UDPOperator workstationsCarries relayed audio when TURN is actually used.
Administration (SSH)22TCPAdmin jump host onlyMaintenance. Should never be reachable from a general user VLAN.
Outbound — from the FusionX server, on your network
TargetPortProtoPurpose
Intercom exchange — event link18000TCPCalls, alarms and door events. The agent holds one session; its send socket binds locally to 19000.
Intercom exchange — SIP / RTP5060 · 10000–20000UDPSignalling and audio to the exchange and its endpoints.
Cameras — RTSP554TCPLive video from ONVIF and RTSP cameras.
Cameras — HTTP / MJPEG / ONVIF80 · 443 · 8000TCPSnapshots, MJPEG streams and ONVIF device queries. Digest authentication is supported.
Site equipment — remote desktop3389 · 5900TCPOnly if you launch RDP or VNC sessions to site equipment from the console.
DNS · NTP53 · 123UDPName resolution and clock. Both can point at internal servers.
Loopback only — no firewall rule needed
ComponentPortNote
Database3306Bound to localhost. Never expose it.
Session store6379Bound to localhost.
Video analytics service8001Detection runs here, in its own process, on the local machine.
Remote-desktop broker & bridge8080 · 6080 · 5901Reached only through the console on 443.
Voice engine — control & secure WebSocket8021 · 7443 · 5065 · 5066Internal interfaces; the browser reaches the voice leg through 443.
Deploy

What needs the internet

These are the only features that reach beyond your network. Everything else — including speech-to-text, announcement voice synthesis and person and vehicle detection — runs entirely on the server, with no external service involved.

FeatureReachesPortWith no internet
Street map backdrop Map tile provider443 TCP out The Maps tab still works: site pins, levels, uploaded floor plans and alarm placement are all local. Only the street basemap behind them is blank.
Live stream as a camera source The streaming platform443 TCP out That one source type is unavailable. Every other camera type is unaffected.
Public TLS certificate renewal Certificate authority443 out · 80 in Issue certificates from your internal CA instead, or run the console on the plain-HTTP LAN port.
Configuration backup off the box Your hosted repository443 TCP out Back up to local disk or a network share on a schedule. Restore from the browser works either way.
Webhooks to an internet-hosted system Whatever you point them at443 TCP out Webhooks to systems on your own network need no internet. Only an off-site target does.
Clock synchronisation Public time servers123 UDP out Point at an internal time source. Accurate time matters here — it timestamps evidence.
Installation and updates Software and model sources443 TCP out Stage the installer and the speech and detection models offline. Once installed, none of it phones home at run time.
A fully disconnected control room is a supported deployment. Calls, alarms, cameras, recording, transcription, announcements, detection, rules, incidents and reporting all run with the internet cable pulled out. What you lose is the street map behind your pins, live streams as a camera source, and automatic certificate renewal.
No AI service, no subscription, no model in someone else's cloud

FusionX makes no call to Claude, ChatGPT or any other hosted AI service — there is no such integration anywhere in the product, and no API key to buy or keep alive. The features people most often assume are cloud-powered are the ones below, and every one of them runs on your own server.

FeatureVerdictHow it actually works
Person & vehicle detectionLocalA YOLO model loaded by the analytics service on the same machine. Nothing leaves the box — not the frame, not the result.
Video analyticsLocalThe same service. In FusionX, "video analytics" is the detection engine — there is no separate cloud tier behind it.
Speech-to-text transcriptionLocalA Whisper model running on the server's CPU, per audio channel. Call audio is never uploaded anywhere.
Intent detection on transcriptsLocalKeyword and phrase sets you configure in the database. Deterministic, editable, and auditable — not a model's opinion.
Announcement voice (text-to-speech)LocalAn on-box neural voice engine in its own worker. Voices are files on disk.
Device & call history, event historyLocalYour own database on the same server. History, search and 30-day lookups never touch the internet.
Incidents, timeline and auditLocalSame database. Nothing is mirrored off-box unless you switch on backup to a repository.
Statistics and reportingLocalQueries against your own data, rendered on the server. Exports are generated on the box.
Deploy

Server & workstation sizing

What to buy for a busy ten-operator control room, and what changes when analytics, detection and video recording are switched on.

How to read these numbers. The per-component costs are measured on the reference system — a 4-core server with 8 GB of RAM running the entire stack. The recommended profiles are engineering guidance built up from those measured costs, not benchmark results at that scale. Size a pilot from the profile, then measure your own load before scaling out.
Where the work actually goes — measured per component
ComponentCPUMemoryBasis
Console, API and database
10 operators, polling and live queue
~1 core~700 MBMeasured resident: web 245 MB, database 206 MB, session store 13 MB, plus working headroom.
Exchange link and voice
10 concurrent calls
~0.5 core~350 MBMeasured: event agent 136 MB, voice engine 61 MB, observers and workers.
Camera hub
16 distinct streams
~0.5–1 core~300 MBRelay and frame cache only — frames are not re-encoded.
Person & vehicle detection~1 core
hard-capped
~400 MBMeasured: 367 MB resident; one frame costs 244 ms. The engine lowers each camera's rate to hold the total near one core, whatever the camera count.
Speech-to-text~1 core
while running
~1 GB
once loaded
Runs on a background queue, not in the call path. The model stays resident after the first transcription.
Continuous video recording
per camera
~0.05 coresmall320×240 at 1 fps, 50 kbps — deliberately cheap, because it runs all day on every camera.
Event video recording
per camera, while active
~0.2 coresmall1280×720 at 15 fps, 2 Mbps — only while an event is being recorded.
Recommended server — 10 active operators, busy system
ProfilevCPURAMSystem diskNotes
Calls, alarms, live camera viewing
no analytics, no video recording
48 GB100 GB The shape the reference system runs today, with the whole stack on it.
+ person & vehicle detection
up to 16 cameras under detection
612 GB100 GB Detection self-caps near one core, so this step is predictable however many cameras you point at it.
+ continuous video recording
32 cameras
816 GB100 GB
+ recording volume
Recording is the variable that grows. Put it on its own volume from day one.
Large site
64+ cameras, detection, recording
12–1624–32 GB100 GB
+ recording volume
At this size, move video recording to its own host and leave the console server to operators.

Add 2 vCPU and 2 GB if you transcribe every call rather than selected ones — the model holds about a gigabyte resident and takes roughly a core while it works through the queue. Use SSD, not spinning disk, for the database and the recording volume alike.

Storage — recording is what fills a disk
WhatRatePer camera, 30 daysNote
Continuous video50 kbps~16 GBRuns all day on every enabled camera. This is the number that sizes your volume.
Event video2 Mbps ≈ 900 MB/hourevent-drivenOnly while an event records. Budget from your alarm and call rate, not from clock time.
Call audio~0.5 MB per minute—Stored in the codec it arrived in, with no re-encoding. 150 calls a day at 3 minutes is about 7 GB a month.
Transcripts, incidents, historykilobytes—Text against the database. Negligible beside video.

Worked example. 32 cameras recording continuously for 30 days is about 510 GB, plus event clips and call audio — so a 1 TB recording volume holds roughly two months. A storage cap and automatic purge are built in, so the disk stops before it fills rather than after.

Network — the shared upstream is what makes this affordable
One camera is one stream, however many operators watch it. Six operators on the same camera pull a single feed from the device; the frame cache serves all six. Size the camera side of the network by distinct cameras being watched, never by operators × tiles.
PathHow to size it16-camera wall, 10 operators
Cameras → serverDistinct cameras being watched × stream bitrate. 720p H.264 is roughly 1–2 Mbps; 1080p 2–4 Mbps; MJPEG considerably more.~32 Mbps
Server → each operatorTiles on screen × the rate each tile is served at.~16 Mbps each
Server → all operatorsThe above × operators. On a switched LAN this is unremarkable; across a WAN it is the whole design question.~160 Mbps
Server ↔ exchangeVoice only. Roughly 80 kbps per concurrent call.< 1 Mbps

Gigabit to the server and gigabit to each operator desk covers this comfortably on-premise. The figure that matters for a cloud deployment is the middle row: every operator's wall crosses the link.

Operator workstation
ItemMinimumRecommendedWhy
CPUDual coreQuad coreDecoding a wall of tiles is client-side work. A 16-tile wall is real load on a thin machine.
RAM4 GB8 GBThe console holds a live voice session and several video tiles in one browser.
BrowserA current Chrome or EdgeWebRTC voice and the camera tiles both depend on it. Keep it updated.
Display1920×1080Two × 1920×1080Queue and call controls on one screen, wall or map on the other — the layout is built for it.
Network100 Mbps1 GbpsSee the middle row above: the wall is the traffic, not the calls.
AudioUSB headset with a microphoneAnswering happens in the browser. There is no softphone to install.
PermissionsMicrophone allowed for the console's addressA blocked microphone lets the operator log in and register, then kills every call the moment it connects. Grant it by policy rather than leaving it to each operator.
Deploy

On-premise or cloud

The same product either way. What changes is where the server sits and, as a result, what has to cross a boundary.

On-premise · site VMCloud-hosted · tenant
Internet required No — a fully disconnected site is supported. Yes — it is the path to the server.
Where the server sits Your rack, on the same network as the exchange and cameras. A hosted instance you reach over the public internet.
Operators connect via LAN, on 443 or the plain-HTTP port. HTTPS on 443 across the internet.
Cameras and intercoms Reached directly on the LAN — the shortest possible media path. Reached through the site link, so video and audio leave and re-enter the site.
Voice media path Stays on the LAN. TURN relay is rarely needed. Crosses the internet. Budget for TURN and open its relay range.
Bandwidth to plan for Effectively none at the perimeter. Every watched camera tile is a stream over the uplink. Size it for the wall, not the camera count.
Perimeter exposure Nothing needs to face the internet. 443 published, ideally behind your own gateway or allow-list. Each customer has its own address and voice relay.
TLS certificate Internal CA, or a public certificate if the box can reach out. Public certificate, renewed automatically.
Street map backdrop Blank without internet. Floor plans and pins still work. Available.
Backups Local, each backup test-restored as it is taken; off-box copy optional. Nightly, sealed with your own key and shipped off-site.
Updates An update file, from a USB stick or fetched with your own update token, applied from the menu. One step to roll back. Rolled out in rings, a staging copy first. A failure halts the release.
Delivered as A ready VM for VMware or Hyper-V, set up from its own console in minutes. A tenant of your own: console, database, voice relay, web address and backups.
Licence 60-day free trial, then an activation key that works offline. Managed by the supplier and pushed to the tenant, signed.
Changing your mind Start here, or arrive from the cloud: a hosted tenant exports to a site VM. Start here and move on-site later with one exported file.
Data residency Recordings, transcripts and incidents never leave your building. Determined by where the instance is hosted.
Survives a WAN outage Yes — the control room keeps working. No — operators lose the console.
At a glance

Specification

Operator consoleDashboard · Statistics · Surveillance · Maps · Alarms · Incidents · Announcements · Notifications · Web — nine tabs, one voice session that survives moving between them.
AdministrationStatistics (reports and live stats), stations, alarms, rules, public address, sites, recording, surveillance, settings — with gateways, SIP, audit, events, projects, roles and users beneath settings. Reachable from the operator console by every role that signs in to it.
VoiceIntercom exchange integration and SIP. FusionX's own SIP server: SIP devices registering directly (site gateway, site VM, or the internet over TLS + SRTP), pick and distribute queues with overflow, SIP trunks with registration or IP trust, inbound number routes and outbound prefixes, SIP video (H.264). Browser-based answering over WebRTC with media relay. Three operator types (FusionX FreeSWITCH user, VirtuoSIS SIP user, VirtuoSIS desk). Multi-queue desks.
VideoONVIF / RTSP / MJPEG (Basic and Digest) / local / file / live stream. Shared upstream per camera, frame cache, stall watchdog, status from the video itself (frames first; two failed checks before a camera is called offline), named wall layouts, one shared empty-monitor symbol across console, walls and administration. Pan-tilt-zoom control (Axis, Dahua, Hikvision, custom URL) with server-side stop and its own permission.
AnalyticsPerson and object detection on the shared frame, CPU-budgeted: people boxed while present, objects when they arrive, threats in red, the colour of each arrival recorded. A per-site watch list, a detection log with a half-minute clip and an administrator verdict, and events the rule engine can act on. Firearm detection available as a second model, off where measured unreliable.
RecordingAudio and video per station and call type, starting at ring. Storage cap with automatic purge. Playback in the browser, each replay matched to the call that owns it.
TranscriptionPer-channel speech to text with true speaker separation, automatic language detection, configurable intent classification, re-transcription in place.
Automation28 triggers · 16 actions · AND/OR filters · ordered or parallel steps · latch and reset · dry run and test · per-step audit · rules calling rules.
Incidents6 states, 5 severities, ownership and escalation, append-only timeline, truthful action status, links to alarms, calls, recordings and runs, export with redaction. Per-alarm-type on/off switch, operator escalation from the queue, incidents opened by hand with type, site, level and severity, owner photos in the list, and replay of the recorded video from before the alarm.
Public addressZones and speakers, stored messages and text-to-speech, chime, loudness normalisation, live push-to-talk, recurrence scheduler, spreadsheet import/export, per-message visibility in the operator list.
EstateCountry → State → Site → Level directory with level descriptions, floor plans with placed devices shown in the console’s colours (four styles, per level) and in 2D or 3D, station status from exchange faults and when each was last heard, WireGuard site gateways with handshake-authoritative liveness and rollback-protected routing.
Access controlGallagher Command Centre, Inner Range Inception, Verkada, Axis door controllers, TANlock rack locks and any ONVIF Profile A / C device. Access granted and denied with reasons, door state, forced and held-open alarms, reader and controller health; door commands confirmed by the door itself, with deadlines, a hash-chained command log and a per-system off switch. Stores no credentials. Licensed, in its own service.
IntegrationOutbound webhooks and raw exchange frames from any rule; permission-gated REST for queue, alarms, incidents, cameras, PA and statistics; station synchronisation from the exchange. Roadmap: a keyed REST API (v1) for third-party systems to read and report in, and signed event subscriptions.
SecurityRole-based access across ~200 routes, TOTP two-factor, session idle timeout, last-administrator guard, full audit trail.
OperationsMultiple isolated systems in one install, scheduled backup and restore, version history, system monitor and log viewer, size-bounded voice-gateway logs, per-tenant branding.
DeliveryA hosted tenant per customer, or a site VM: VMware (.ova), Hyper-V (one-click installer, Secure Boot on or off), or an existing Ubuntu server. Offline install, first-boot setup on the console, a restricted admin menu with no root rights, offline updates with per-customer tokens, image history and roll back, a self-growing disk with a recording guard, and a 60-day trial followed by offline activation.
Cloud platformControl-plane portal. Per tenant: memory and CPU ceilings, voice relay, web address, site tunnels, nightly sealed off-site backups and staging copies. Release rings (canary, 1, 2, 3) with soak periods and automatic halt. Signed licences. Support access only with the customer's consent.