The scan says the guard was there.
Who checked?
GuardCore is security guard management software where the server grades the evidence: a checkpoint scan judged against the tag’s own secret and the distance, welfare and duress escalated by a background worker rather than by somebody watching, and every write hash-chained so an edited record shows as one.
Guards, patrols, incidents, access and the back office behind them · Australian data, hosted in AWS Sydney.
Why this exists
Security is sold on trust and renewed on evidence.
Nobody notices a quiet site. They notice the night you cannot account for. Every part of GuardCore exists to answer one of three questions a security contract eventually asks.
Prove the guard was there
Every guard tour product records scans. Almost none of them can tell you whether the scan was real, because the device decided and the server stored what it was told.
Notice when nobody is watching
A welfare check that lapses at 3am, an alarm nobody acknowledges, a licence expiring between reports. Each of those fails in the only situation it exists for if a person has to trigger it.
Answer the question afterwards
When you knew, what you did, who signed it off, and whether the record has been edited since. A register that cannot answer the last one is not evidence.
The proof
Four numbers you can count yourself.
These are properties of the code, not statistics about a customer — each one is countable from the file named below in under a minute, and we would rather publish a number you can check than one you have to believe.
6
checks on every scan
The checkpoint, the guard, the patrol, the tag secret, the distance and the duplicate window — all on the server. The seventh part of the breakdown, a per-checkpoint time window, is not implemented and we say so.
5
escalation levels
Each naming a role, a delay and its channels, advanced by a background sweep when a level goes unacknowledged.
12
sweeps with nobody watching
Welfare, escalation, incident SLA, tour compliance, access correlation, visitor overstay, licence expiry, roster generation and gaps, compliance, signals and policy re-acknowledgement.
57 of 62
capabilities live
Counted from the same registry this page renders. The other 5 are named below, with what they actually are.
Counted from src/server/imss-checkpoint-scan-rules.ts · imss-escalation.ts · src/lib/imss-estimator-security.ts · src/server/imss-jobs/index.ts
Every capability
The full list, grouped by what you came here for.
57 of 62 are in the product today and are written here in the present tense. The rest carry a badge saying what they actually are. Each group has its own page with a worked example.
Patrols & proof
Proof the patrol happened, graded by the serverThe server grades the scan, not the phone
LiveEvery checkpoint scan is judged on the server against the checkpoint, the guard, the tag secret, the distance and the duplicate window — and the result the device claims is ignored.
The device never learns the answer
LiveA checkpoint’s secret, its coordinates and its radius are excluded from every read a phone can reach, and the comparison is constant-time, so the tag cannot be cloned from the app that scans it.
A refused scan is kept, not discarded
LiveA fabricated or out-of-place scan is refused as proof and kept as an attempt, with an alert raised for someone to acknowledge — because the interesting thing about a bad scan is that somebody tried it.
NFC, QR or the printed code
LiveThe phone reads the tag itself — NFC on Android, the camera anywhere, or the printed code typed by hand on iPhone, where the browser has no NFC — and captures a high-accuracy fix with it.
The tour nobody started
LiveA scheduled tour that produced no patrol leaves no row to notice, so a background sweep grades every settled occurrence on time, late or missed and notifies the site’s supervisors and the customer’s own portal users.
Patrol log register
LiveEvery patrol with its site, its guard, its start and finish and the exceptions raised against it, filterable and exportable — the register someone opens when a client asks about last Tuesday.
Geofences that act, not just draw
LiveCircles and polygons per site, typed as boundary, restricted, patrol or parking, each with its own entry and exit action — and an exit set to escalate starts the escalation chain rather than writing a line nobody reads.
Building a tour route on screen
RoadmapSequencing checkpoints into a route with an expected offset and a window per stop. The table exists and only the data importer writes it, so a route can be migrated in and not yet built on screen.
On the roadmap. It is not built, not scheduled, and not something to plan a contract around.
Lone worker safety
Lone worker safety for the guard on their own at 3amWelfare checks with a lapse that is noticed
LiveA check-in interval per guard from five minutes to four hours, and a background sweep that picks up every overdue timer, counts the miss and starts the escalation chain. The timer begins at the first check-in or when operations sets one.
Duress that reaches a person
LiveAn SOS stores the fix, fires the organisation’s duress rules and writes a critical notification that keeps re-sending every five minutes until somebody acknowledges it — and it lands at the top of the command centre, above everything else.
The clip the alarm carries
LiveThe server tells the device how many seconds to record, and the audio or video comes back as evidence filed against the alert itself — so the control room hears what happened rather than reading that something did.
Five escalation levels that advance themselves
LiveEach level names a role, a delay and its channels; level one fires at once and a level left unacknowledged is advanced by a background sweep, so an alarm nobody answers climbs rather than sitting.
Location only while on shift
LiveA guard’s position is accepted only while they have an active shift today, resolved from their session rather than from the request — off duty the fix is refused and nothing is stored.
Escalation by SMS or push
RoadmapThe channel vocabulary carries SMS and push and both default to off, because there is no provider behind either. In-app and email are what actually deliver today.
On the roadmap. It is not built, not scheduled, and not something to plan a contract around.
A native app for the guard
RoadmapThe field runner is a mobile web page today. Native iOS and Android is an accepted architecture decision and not shipped code — which is also why background location and a background welfare prompt are not claimed anywhere on this site.
On the roadmap. It is not built, not scheduled, and not something to plan a contract around.
Incident register
LiveEvery incident with its severity, site, status and the guard who raised it, over quick filters and a saved-view expression — and a client role is served a narrower column list in the query rather than a hidden column in the page.
Incident numbers that cannot collide
LiveINC-0001 upward, sequential per organisation, allocated under the organisation’s own row lock in the same transaction as the incident and its audit event — so two control-room operators cannot mint the same number.
Two SLA clocks, scaled by severity
LiveAn acknowledgement clock and a response clock, each scaled by severity — a critical incident gets half the time, a low one four times — measured against the site’s own response minutes rather than one organisation-wide number.
Acknowledgement by the person it was given to
LiveOnly the assigned investigator, the guard it belongs to, or an administrator may acknowledge — anybody else is refused, a second acknowledgement is harmless, and an incident already resolved cannot be acknowledged at all.
A closed incident stops changing
LiveNine fields of the account of record are refused once an incident is closed, and it cannot be moved back out of closed — only the flag deciding whether the customer sees it stays editable.
Photographs and files, served once
LiveEvidence is uploaded to a server-only directory behind a type allowlist, EXIF stripped, and read back only through one authenticated route scoped to the organisation — never from a public path a link could leak.
The incident report, and the shift’s own
LiveA letterhead PDF per incident and a filtered summary built from the same filters as the register, plus the Daily Activity Report that compiles a whole shift — the patrols, the welfare check-ins, the pass-down and any duress.
Countersigned incident closure
RoadmapA named approver signing off a closed incident. The fields exist and the record page shows them unfilled, because the approval step itself is not built.
On the roadmap. It is not built, not scheduled, and not something to plan a contract around.
One screen for the shift in progress
LiveUnresolved duress first, then who is on duty from the roster, the open incidents, the patrols under way and a counted summary — refreshed on its own rather than when somebody remembers to reload.
Dispatch with a lifecycle, not a status field
LivePending, dispatched, acknowledged, en route, arrived, completed — each transition stamping its own time, each refusal named, and order numbers sequential per organisation per year. The available-guards list excludes anyone already on a live order.
Live map
LiveOn-duty guards on a map, with the latest fix per guard inside a fifteen-minute freshness window, and an on-duty list beside it that works when the map cannot.
Signals: a rule over every write
LiveEvery domain write already lands in an event outbox; a signal rule watches it for a named event and a set of conditions, and raises a reviewable item — dismissed, or turned into an incident, by hand or automatically.
Pass-down the next shift can read
LiveHandovers, occurrences, visitors, alarms, maintenance and instructions entered by the guard on the phone, and compiled into the shift’s Daily Activity Report rather than left in a notebook at the desk.
Outbound webhooks that retry properly
LiveFive attempts on a one, five, thirty, one-hundred-and-twenty, seven-hundred-and-twenty minute ladder, signed, then dead-lettered — with private addresses and the cloud metadata endpoint refused on every attempt, not only the first.
Visitors & access
Visitor management, and the access events behind itVisitor sign-in and sign-out
LiveName, company, purpose, host, vehicle registration and badge on the way in; signed out, no-showed or denied on the way out. Pre-registration requires an expected arrival, so a booked visitor is a row rather than an email.
The visitor still on site
LiveJudged against the expected departure when one was given and against the site’s maximum hours when it was not, by a sweep that notifies once per visit — so the evacuation list is the list of people actually here.
Zones, credentials and an event log
LiveAccess zones with their own rules, credentials issued as card, fob, PIN or mobile to a guard, a contractor worker or a visitor, each suspended or revoked with the time it happened — and an ingested event that matches a rule can raise an incident by itself.
The pattern one event cannot show
LiveRepeated denials on one credential inside a window, and the same credential granted at two zones closer together than anyone could travel — two sequences a single access event cannot reveal, found by a sweep and raised for review.
A live feed from the access-control head end
RoadmapEvents arrive today through an authenticated call carrying the head end’s own event id, which is how a middleware or a scheduled push feeds them. A shipped adapter for a named panel vendor is not built, and every provider starts as not connected.
On the roadmap. It is not built, not scheduled, and not something to plan a contract around.
Rostering & time
Rostering that refuses the guard it ought to refuseRecurring rosters that leave the shift open
LiveA weekly template generates shifts across a horizon you set, overnight shifts included, and generates them unassigned — because deciding who works is a person’s job and generating a name is how a roster stops being trusted.
The roster refuses an unlicensed guard
LiveEligibility is worked out live for the shift date from the licences on file, never from a stored score that could be stale — and where the shift asks for a licence class, the guard must hold that class and not merely a licence.
Double-booking, rest and onboarding, refused at the save
LiveFive configurable rules — double booking, which is always on; minimum rest; expired licence; required licence class; incomplete onboarding — refusing the save, with a warning-level rule overridable only with a reason the audit event then carries.
Open shifts and swaps
LiveAn unfilled shift offered to a group, applied for, and filled — and a swap between two guards written as one transaction where both legs are checked against the gates before either is saved.
Rostered, actual and approved, all kept
LiveThree windows per shift, separately retained, so a correction changes what will be paid without overwriting what happened — and the variance between rostered and actual is typed per direction rather than flagged as "different".
Hours leave once, and are locked behind them
LiveApproved hours export to a nine-column CSV under a lock: the period can only export once, each hour is marked exported in the same transaction, and every line keeps its own snapshot. There is no award interpreter — this records time worked and hands it over.
No clock-on with an unread post order
LiveA guard cannot clock on at a site with an approved post order they have not acknowledged. The refusal names the document, so the fix is reading it rather than finding a supervisor.
Licences & compliance
Licences, SWMS, and an audit trail that shows tamperingSecurity licence register
LiveEvery licence with its number, issuer, class and expiry, and a dashboard that counts what has expired and what expires inside thirty, sixty and ninety days — filterable to the site the guards are rostered at.
Australian licence classes, by jurisdiction
LiveA platform-wide catalogue of security licence classes across eight Australian jurisdictions, named against their actual regulators — and any entry whose code could not be confirmed is marked as a placeholder to correct, not stated as fact.
Ninety, sixty, thirty, seven days out
LiveFour exclusive bands swept in the background, one notification per item per band, idempotent — so a licence expiring is noticed four times before it lapses rather than once after.
Nine kinds of evidence, one evaluator
LiveLicences, qualifications, training, police checks, working-with-children checks, right to work, vehicle registration, contractor insurance and site certificates all satisfy a requirement through one evaluator — and a requirement marked blocking is the one the roster enforces.
Induction register that covers everybody
LiveOrganisation, site, client, role, contractor, refresher and return-to-work inductions in one register covering employees, contractor workers and office staff alike, each with its coverage state rather than a tick.
SWMS sign-on, and the honest distinction
LiveA safe work method statement and a safe work procedure are carried apart, because most security work is not construction work — and a new version moves the pointer, so yesterday’s sign-on stops satisfying today’s requirement.
Controlled documents and what was actually shown
LivePolicies, procedures and post orders versioned, issued, acknowledged — and the receipt records a hash of the object the person was shown rather than the label they signed, so "I signed a different version" is answerable.
Pre-start checks a driver cannot pass
LiveA patrol vehicle’s walk-around filed from the phone, where the pass or fail is derived on the server from the answers rather than sent by the client — and a failed safety-critical line raises a work order in the same transaction.
Hash-chained audit trail
LiveEvery write sequenced and chained per organisation under a uniqueness constraint that makes a forked chain impossible, with the actor and the credential inside the hash — so an attribution cannot be rewritten afterwards either.
Reading an employment file is itself recorded
LiveNineteen tables holding employment, pay, recruitment and background-check records log who read them, enforced in the data layer rather than per screen — so a privacy question has an answer that is not "probably nobody".
Security client portal
A security client portal your customer opens themselvesA portal the customer opens themselves
LiveWho is on site, the patrols and tours, their incidents, their visitors — and the service line is enforced at the door rather than in the menu, so a customer who buys only cleaning cannot reach a security screen by typing its address.
The customer books their own visitors
LiveA visitor pre-registered by the customer in their own portal lands in the same register the gate works from, so reception is not transcribing an email at eight in the morning.
Reports that know who is reading them
LiveSix datasets, each fixing its own field allowlist and its own client profile: incidents are filtered to the client-visible ones with the narrative and the guard removed, and timesheets and licences are not client-readable at all.
Reports that arrive without being asked for
LiveDaily, weekly, fortnightly, monthly or quarterly, at a time you set, rendered by the background worker — and the run row survives the retention window even after its output is deleted, so the history of what was sent stays.
Quoting & billing
Price the guarding, then bill the hours it actually tookGuardCore Estimator
LiveNine security calculators over one build-up — guard hours by day type, a static post, a mobile patrol run allocated across its sites, alarm response, event crowd control, control-room monitoring, equipment, mobilisation and a licence-class premium.
A security estimate is not a cleaning one
LiveOne engine, two domains, and an estimate must declare which — the line types differ, and an accepted security estimate writes a static-guard contract on the security service line rather than something a person retypes.
Rates that know a static post from a patrol
LiveContract rates typed by service — static guard, mobile patrol, alarm response, event — and by rate type, effective-dated and overridable per site, so a rate rise is a new row rather than an edit to history.
Invoices built from approved hours
LiveApproved hours priced by rate type, one line per rate, with the rate resolved site, then contract, then organisation — and an unresolvable rate producing a named refusal rather than a line that quietly costs nothing.
An hour bills once
LiveEach invoice line keeps the hours it was built from, and an attempt to bill them again is refused with the instruction to raise a credit note against the earlier invoice — which is the difference between a billing system and a spreadsheet.
Recurring billing on the contract
LiveOne schedule per contract, in the same cadence vocabulary the report schedules use, drafted by the background worker — so a monthly invoice is not a recurring diary entry for a person.
Export to Xero, MYOB or plain CSV
LiveThe import layouts those two products actually accept, column for column, with the account and tax codes resolved from your own mapping — a file you upload, not a connection we do not have credentials for.
What backs every claim on this page
Each capability names the decision record, module, route or table it is built on. Ask us for any of them in an evaluation and we will walk you through the code.
- The server grades the scan, not the phone
- src/server/imss-checkpoint-scan-rules.ts validateScan · src/server/api/imss/checkpoints/scans.ts createScan · POST /api/imss/checkpoints/scans
- The device never learns the answer
- ADR 0012 · src/server/api/imss/mobile/GET.ts CHECKPOINT_COLUMNS · src/server/imss-checkpoint-scan-rules.ts tokensMatch
- A refused scan is kept, not discarded
- src/server/api/imss/checkpoints/scans.ts listMissedAlerts · GET /api/imss/checkpoints/missed-alerts · imss_checkpoint_scans
- NFC, QR or the printed code
- src/lib/checkpoint-scan.ts readNfcTag readBarcodeFromVideo capturePosition · ADR 0038
- The tour nobody started
- ADR 0050 · src/server/imss-tour-compliance.ts gradeTour · src/server/imss-jobs/tour-compliance.ts sweepTourCompliance · GET /api/imss/tour-compliance
- Patrol log register
- GET /api/imss/patrol-logs · /imss/patrol · OpsPatrol.tsx · imss_patrol_logs
- Geofences that act, not just draw
- src/server/imss-guard-safety.ts containsPoint · src/server/api/imss/v3/safety-cases.ts geofenceEventCreate · /imss/geofencing · imss_geofences
- Building a tour route on screen
- imss_tour_checkpoints · src/scripts/imss-maintenance/migration-import.ts
- Welfare checks with a lapse that is noticed
- src/server/imss-guard-safety.ts welfareOverdue parseInterval · src/server/imss-jobs/welfare.ts sweepWelfareTimers · imss_welfare_timers · /imss/mobile-app
- Duress that reaches a person
- ADR 0046 · src/server/imss-duress.ts notifyDuress · imss_sos_alerts · /imss/command-centre
- The clip the alarm carries
- ADR 0046 · POST /api/imss/sos-recording · src/lib/duress-recording.ts · src/server/imss-duress.ts fileDuressRecording
- Five escalation levels that advance themselves
- src/server/imss-escalation.ts escalate MAX_LEVELS · src/server/imss-jobs/escalation.ts sweepEscalationLevels · POST /api/imss/escalation-events · /imss/escalation · imss_escalation_rules
- Location only while on shift
- ADR 0022 · src/server/api/imss/guard-locations/POST.ts · imss_guard_locations
- Escalation by SMS or push
- src/server/imss-notification-resend.ts · src/server/imss-channel-settings.ts
- A native app for the guard
- ADR 0038 · docs/adr/0038-react-native-field-app.md · imss_mobile_offline_actions · v3 mobile_device · v3 offline_action
- Incident register
- GET /api/imss/incidents · /imss/incidents · OpsIncidents.tsx · imss_incidents
- Incident numbers that cannot collide
- src/server/imss-incidents.ts allocateIncidentNumber · POST /api/imss/incidents
- Two SLA clocks, scaled by severity
- ADR 0047 · src/lib/incident-sla.ts slaDeadlines breachedLevel · src/server/imss-jobs/incident-sla.ts sweepIncidentSla
- Acknowledgement by the person it was given to
- ADR 0047 · src/server/imss-incident-acknowledge.ts isAssignee · POST /api/imss/incidents/:id/acknowledge
- A closed incident stops changing
- src/server/imss-incident-closure.ts LOCKED_AFTER_CLOSURE incidentMutationGuard
- Photographs and files, served once
- ADR 0009 · ADR 0016 · ADR 0023 · src/server/imss-incident-evidence.ts · imss_incident_evidence
- The incident report, and the shift’s own
- src/server/imss-incident-pdf.ts · src/server/imss-dar.ts · GET /api/imss/dar/:shiftId
- Countersigned incident closure
- src/server/imss-incident-closure.ts LOCKED_AFTER_CLOSURE
- One screen for the shift in progress
- GET /api/imss/command-centre · /imss/command-centre · OpsCommandCentre.tsx
- Dispatch with a lifecycle, not a status field
- src/server/imss-dispatch.ts refuseAction nextOrderNumber · POST /api/imss/dispatch · imss_dispatch_orders · /imss/dispatch
- Live map
- ADR 0022 · src/pages/imss/ops/OpsLiveMap.tsx · GET /api/imss/guard-locations/live · /imss/map
- Signals: a rule over every write
- ADR 0031 · src/server/imss-signals.ts matchesConditions convertToIncident · POST /api/imss/signal-rules · imss_signals · /imss/signals
- Pass-down the next shift can read
- src/server/imss-passdown.ts PASSDOWN_ENTRY_TYPES · src/server/imss-dar.ts · imss_passdown_entries
- Outbound webhooks that retry properly
- src/server/imss-automation.ts RETRY_LADDER_MINUTES · src/server/imss-jobs/deliveries.ts · imss_deliveries
- Visitor sign-in and sign-out
- POST /api/imss/visitors · /imss/visitors · OpsVisitors.tsx · imss_visitors
- The visitor still on site
- ADR 0040 · src/server/imss-jobs/visitor-overstay.ts
- Zones, credentials and an event log
- src/server/imss-access-control.ts ruleMatches severityFor · src/server/api/imss/v3/access-cases.ts credentialRevoke · imss_access_zones · imss_credentials · v3 access_credential · /imss/access-control
- The pattern one event cannot show
- ADR 0040 · src/server/imss-jobs/access-correlation.ts correlateAccessEvents · imss_access_events
- A live feed from the access-control head end
- imss_access_providers · src/server/api/imss/v3/access-cases.ts
- Recurring rosters that leave the shift open
- ADR 0021 · src/server/imss-roster-recurrence.ts plannedDates · src/server/imss-jobs/roster-generation.ts · POST /api/imss/roster-templates · imss_roster_shifts
- The roster refuses an unlicensed guard
- ADR 0004 · src/server/imss-roster-rules.ts evaluateRosterability assertGuardRosterable · src/server/imss-licence-classes.ts resolveRequiredLicenceClass
- Double-booking, rest and onboarding, refused at the save
- src/server/imss-roster-conflict-rules.ts · imss_conflict_rules · /imss/roster
- Open shifts and swaps
- GET /api/imss/open-shifts · POST /api/imss/shift-swaps · POST /api/imss/mobile/shift-swaps · imss_open_shifts · /imss/shift-swaps
- Rostered, actual and approved, all kept
- src/server/imss-timesheet-entry.ts payableHours · src/server/imss-timesheet-variance.ts · imss_timesheets · /imss/timesheets
- Hours leave once, and are locked behind them
- ADR 0018 · src/server/imss-payroll-export.ts lockApprovedTimesheets · imss_timesheet_exports · /imss/payroll-export
- No clock-on with an unread post order
- src/server/imss-post-order.ts outstandingAtSite · src/server/api/imss/mobile/POST.ts · POST /api/imss/mobile/post-orders
- Security licence register
- src/lib/imss-lookups-licences.ts · imss_licences · /imss/licences · GET /api/imss/licences/expiry-dashboard
- Australian licence classes, by jurisdiction
- src/server/imss-licence-classes.ts seedLicenceClasses licenceClassSeedRows · imss_licence_classes
- Ninety, sixty, thirty, seven days out
- ADR 0040 · src/server/imss-jobs/expiry.ts EXPIRY_WINDOWS
- Nine kinds of evidence, one evaluator
- src/server/imss-compliance-evaluator.ts EVIDENCE_SOURCES evaluateRequirements · imss_compliance_requirements · imss_work_rights
- Induction register that covers everybody
- ADR 0053 · src/server/imss-inductions.ts · GET /api/imss/inductions · POST /api/imss/mobile/onboarding · /imss/inductions
- SWMS sign-on, and the honest distinction
- ADR 0053 · src/server/imss-swms.ts signOnState · /imss/swms · POST /api/imss/mobile/swms
- Controlled documents and what was actually shown
- ADR 0053 · src/server/imss-controlled-documents.ts assertVersionStored · POST /api/imss/mobile/policies · imss_controlled_documents
- Pre-start checks a driver cannot pass
- ADR 0050 · src/server/imss-vehicle-checks.ts deriveOutcome workOrderFor · POST /api/imss/vehicle-checks · POST /api/imss/mobile/vehicle-check · imss_vehicle_checks · /imss/vehicle-checks
- Hash-chained audit trail
- src/server/imss-audit.ts verifyChain appendAuditEvent · uq_imss_audit_events_org_sequence · /imss/audit-trail
- Reading an employment file is itself recorded
- src/server/imss-data-scope.ts HR_SENSITIVE_TABLES logHrSensitiveReads · imss_permission_access_logs
- A portal the customer opens themselves
- ADR 0064 · src/server/imss-client-portal.ts requireServiceLine · client-portal/on-site · client-portal/patrols · client-portal/incident
- The customer books their own visitors
- client-portal/visitors · src/pages/imss/client/guardcore/ClientVisitors.tsx · src/server/api/imss/client-portal/POST.ts
- Reports that know who is reading them
- src/server/imss-report-executor.ts · GET /api/imss/reports · /imss/reports
- Reports that arrive without being asked for
- src/server/imss-report-schedule.ts nextRunAt · src/server/imss-jobs/report-schedules.ts
- GuardCore Estimator
- ADR 0051 · src/lib/imss-estimator-security.ts priceGuardHours priceMobilePatrolRun · /imss/guardcore-estimator · imss_estimates
- A security estimate is not a cleaning one
- ADR 0051 · src/server/imss-estimating.ts ESTIMATE_DOMAINS · src/lib/imss-estimator-core.ts computeEstimate
- Rates that know a static post from a patrol
- imss_contract_rates · /imss/contracts · GET /api/imss/contracts
- Invoices built from approved hours
- src/server/imss-invoice.ts buildInvoice resolveRate · POST /api/imss/invoices/generate · imss_invoice_lines
- An hour bills once
- ADR 0027 · ADR 0029 · src/server/imss-invoice-payments.ts · src/server/imss-invoice-credit-notes.ts
- Recurring billing on the contract
- ADR 0019 · src/server/imss-billing-schedule.ts · imss_billing_schedules
- Export to Xero, MYOB or plain CSV
- ADR 0028 · src/server/imss-invoice-export.ts xeroRow myobRow · /imss/accounting-export
Not built yet
What GuardCore does not do, said before you ask.
A feature page that reads as complete is the easiest way to lose an evaluation later. These are the gaps, in the same words we use in a tender response.
Building a tour route on screen
RoadmapSequencing checkpoints into a route with an expected offset and a window per stop. The table exists and only the data importer writes it, so a route can be migrated in and not yet built on screen.
On the roadmap. It is not built, not scheduled, and not something to plan a contract around.
Escalation by SMS or push
RoadmapThe channel vocabulary carries SMS and push and both default to off, because there is no provider behind either. In-app and email are what actually deliver today.
On the roadmap. It is not built, not scheduled, and not something to plan a contract around.
A native app for the guard
RoadmapThe field runner is a mobile web page today. Native iOS and Android is an accepted architecture decision and not shipped code — which is also why background location and a background welfare prompt are not claimed anywhere on this site.
On the roadmap. It is not built, not scheduled, and not something to plan a contract around.
Countersigned incident closure
RoadmapA named approver signing off a closed incident. The fields exist and the record page shows them unfilled, because the approval step itself is not built.
On the roadmap. It is not built, not scheduled, and not something to plan a contract around.
A live feed from the access-control head end
RoadmapEvents arrive today through an authenticated call carrying the head end’s own event id, which is how a middleware or a scheduled push feeds them. A shipped adapter for a named panel vendor is not built, and every provider starts as not connected.
On the roadmap. It is not built, not scheduled, and not something to plan a contract around.
And plainly, what is absent
- There is no man-down or no-motion detection. Not built, not modelled, not on the roadmap — a phone in a browser cannot do it, and the native app that could is a decision rather than shipped code.
- Patrol compliance scoring exists in the API and nothing in the console closes a patrol, so no patrol is scored today. The tour sweep is what actually catches a walk that did not happen.
- There is no award interpreter and no pay run. GuardCore records hours worked — rostered, actual and approved — and exports them; what anyone is owed is computed by your payroll system, not this one.
- The competency matrix is a register and not a roster gate. Licences and blocking compliance requirements are what the roster enforces; a competency gap on its own does not stop a shift being saved.
- Watchlist screening is an operator’s assertion at sign-in, not an automated check against a list.
What it costs
We have not published a GuardCore price.
CleanCore is sold per site per month because a site is already the unit it is switched on by. Security is not: a contract might be one static post or forty mobile patrol runs a night, and a per-site figure would be wrong in both directions. Rather than put a number on this page that nobody has decided, we would rather you told us the shape of the work.
Where it runs
Hosted in AWS Sydney, with every organisation’s data separated in the database itself rather than only in the application. Yarning Crescent is Indigenous-owned and Supply Nation registered, so what you already spend on guarding counts as Indigenous procurement. How the whole platform fits together.
See it refuse a scan it should refuse.
The parts worth twenty minutes: a fabricated scan turned away, a welfare lapse escalating on its own, the command centre with duress at the top, and the roster refusing a guard whose licence expired yesterday.