KamoCameras settings — Site Setup (enroll a connector in three steps, site cards), Cameras (grid with on/off and audio, drag-and-drop groups organiser), site detail (overview, discover, cameras, camera systems, advanced go2rtc settings with history, diagnostics), camera and group pages with a shared Security tab, menu and landing entries
Pure rules in app/lib/cameraSettings.ts with tests: enrollment code formatting and validation (SiteKeys alphabet), connector download pick per OS/arch, install ...
The camera viewer — Cameras nav menu, the live cameras tool window and its maximized navigator
- Nav tool 'cameras' (app + VIEW_CAMERAS): saved layouts, groups (each expanding to its cameras), ungrouped cameras with a status dot, Open viewer, Manage cam...
Guided onboarding tours for every app, offered at sign-in and retakeable from the App Shelf
One tour per app security group — 31, from Customer Relationships to E-Signatures — each gated on the app being on, the member being able to open it, and the ap...
Display on Intake now saves
The form editor built each field for the save request without isDisplayOnIntake, so the server stored false for every field that was not required. The toggle re...
Remember guided-tour steps per person across organizations, and seed every Show Tour right
GET /api/security/guided-tours answers which tour steps the signed-in PERSON has been shown or skipped, as the union over every membership of the same user — a ...
A Show Tour right for every app security group (338-368)
SHOW_TOUR_<APP>, one per app group — thirty-one, E-Signatures included — each a standalone root filed under its app, labelled "Show Tour", and GRANTED by defaul...
The connector relay never sends a reserved close code
When KamoCameraService rolled, the backend socket closed without a close frame (1006) and the relay passed 1006 to the connector; 1005, 1006 and 1015 only descr...
Connector download sizes arrive as strings; the checksums file is not offered as a build
CamerasApi turns KamoCameraService's string longs (config versions) into numbers
An SI's HIGH chat card is raised even while an unread-chat card stands
A person with an undismissed CHAT_MESSAGE card was never told of an SI's NOTIFY (KamoCollab CP12 D14): the announce-once rule dropped the HIGH card too, while t...
A market save rejects a missing or unknown custom form
Both association loops skipped a null form id, or one the organization does not own, and the save still returned success. That is how every market lost its form...
The connector socket's client address is the right-most public X-Forwarded-For hop
CameraAgentWebSocketHandler took the FIRST X-Forwarded-For hop — the one a client can write itself — and that address is what KamoCameraService rate-limits unau...
A person's consult route order moves to collab/ConsultChannels — their stated order, then the SI's CHANNEL_ORDER for the relationship, then CHAT, EMAIL, ASYNC, each route once; CollabPack, which also plans collab_position, now names no personality type; behaviour unchanged (KamoCollab CP13 Task 22, D19, ruling CP13-T22-1)
Drop the event dialog's Cancel event button, which could never show
It was gated on an attendee row marked as organiser for the member's own address, and the calendar's guest sync never writes one (production holds none). It als...
Foundation — KAMO_CAMERAS (39) and rights 334-337 mirrored, isKamoCameras, BFF proxies, camerasApi, openCameraWindow
A meeting's updates and cancellations come from the address that invited its guests
The composer files a meeting under whatever its From said, an alias or a shared mailbox, and that address is the ORGANIZER in every ics. But updates, cancellati...
A deleted meeting's guests get the organisation's cancellation letter
The invitation and the update were branded letters; the cancellation was a one-line "has been cancelled". Add calendar.meeting_canceled beside them: the same le...
Tasks_list_comments shows a comment's kind and stance when it is not a plain comment — a POSITION, HANDOFF or ESCALATION row adds kind (and stance when it has one) for the disagreement protocol and the runtime; a COMMENT row, or one KBService gives no kind, is byte-identical to before (KamoCollab CP13 Task 9, D30)
Attaching a custom form to a market now saves
The market dialog sent each form as Number(uuid). That is NaN, which JSON sends as null, and the service skips a null form id, so every save reported success wi...
Saving a form no longer rejects its own field IDs
updateForm replaces every stack and field, but the field-ID check compared the request against the rows already stored. The editor sends no field id, so each ke...
Land KamoCameras — app 39, rights 334-337, entities in com.kamo.z.shared.cameras
Merges feat/kamo-cameras (16f184ad, 6fd4e3fd, 1dfeb3b4). Main took 333 for RELEASE_TO_ORGANIZATION (a3630977) after the branch was cut, so the four camera right...
Scan com.kamo.z.shared.cameras (merge feat/kamo-cameras)
The KamoCameras entities' package joins KamoInitializerApp's @EnableJpaRepositories list. The run that created schema camera (9 tables) was made from this on 20...
/api/security/cameras/** — the KamoCameras relay (merge feat/kamo-cameras)
CameraController is the trust boundary for KamoCameraService: it resolves the session, checks VIEW_CAMERAS / MANAGE_CAMERAS / MANAGE_CAMERA_SITES (now 334-336; ...
Svc_camera, KamoCameraService's own login
Publishes rt.org.> (the Cameras screens' live refresh) and cameras.site.> (a site RPC routed to the pod holding that site's connector socket), subscribes camera...
CP10 verified in sp00verify — PROGRESS section, rulings CP10-T21-1..7 (KamoCollab CP10 Task 21)
CP09 verified in sp00verify — PROGRESS section, rulings CP09-T26-1..4 (KamoCollab CP09 Task 26)
Like what you see shipping?
All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.
