Authenticate RingCentral with a JWT, per phone server
RingCentral was the last provider whose credentials came from a Kamo-wide registration plus two browser consent hops — one for the org, one per member. Both are...
Add the RingCentral JWT and direct-number columns
Order 0, because the shared-library entities map both columns from the moment this build starts: every runner that loads a PhoneExtension or a MemberVoipOAuthTo...
Give a member a RingCentral JWT and an extension its own number
Two columns, both nullable so nothing is backfilled and no existing row changes meaning. **************** holds a member's own RingCentral JWT. RingCentral onl...
Missed-call and voicemail counts for the softphone indicator
Reported as separate lines rather than a total: the icon shows the sum and its dropdown shows the breakdown, so a pre-summed wire value would make the dropdown ...
Unreviewed-response counts and a mark-read
Keyed by session guid, which is what a tool window carries. Not audited as a disclosure: it returns counts and never a word of a transcript, and recording a bad...
An unread snapshot, a mark-read, and a live frame
Its own NATS subject rather than the existing message one: the browser's handler for /topic/voip/message/ plays the arrival sound and opens a tool window for ev...
Availability for presenters only, and a way to understand it
Three things, all about the same layer. WHO SEES IT. The availability toggle was shown to everybody. Declaring hours is only meaningful for somebody a webinar ...
Make a replayed Stripe event a no-op
Adds BillingWebhookEventClaimService on its own bean, with REQUIRES_NEW on every method, and wires it into processEvent ahead of the dispatch switch. A losing c...
GET /api/webinar/presenting
The webinar types the CALLER is a presenter for. The calendar asks this before it offers an availability layer at all: hours declared by a member no type lists ...
Find the types a member presents, and parse-guard the queries
The calendar needs to answer one question before it offers an availability layer: is declaring hours meaningful for this person? Nobody is a presenter by defaul...
Tell a member about a webinar booked on their behalf
Not gated on a webinar right, unlike the ticket counters: the case this exists for is one where the member took no action at all, so requiring the right to requ...
The new organization opens in its own tab
Creating one signed THIS tab into it, so a member who created an organization on someone's behalf was silently moved out of the one they were working in — and h...
Count unreviewed bug reports for platform admins
Zero for an ungated caller rather than a 403: the nav polls this on every page load for every member, and an error they must routinely swallow is how real error...
Route unread snapshots to their own STOMP topic
Everything on voip.> went to one topic, whose browser subscriber plays the SMS arrival sound and opens a tool window for every frame. A badge refresh there woul...
Refresh unread badges when a visitor message lands
persistInbound announces its own message (publishRealtimeEvent=false, so a visitor's reply does not render as the owner's), and in doing so also skipped the unr...
Write, sign and amend a visit note
The composer changes shape once a note is signed, and that is the whole design. Before signature it is a text area that autosaves. After signature the text area...
The visit and its documentation — the loop a practice runs on
Starting a visit is what grants the clinician the chart, and that is the design rather than a side effect. A clinician about to see a patient has no relationshi...
Add the Stripe webhook dedupe table, keyed by account and event
The FHIR R4 endpoint, with the same access rules as the chart
An interoperability endpoint is where a system is most likely to acquire a quiet bypass: it is machine-to-machine, nobody watches it, and "the integration needs...
Convert any logo to vector, and say what the scan found per step
Three things, all reported from the wizard itself. THE COMPACT LOGO NO LONGER DEMANDS AN SVG. The slot can only store a vector -- the backend writes it to a fi...
Render the chart as US Core FHIR R4
The JSON builder is hand-rolled rather than a Jackson ObjectMapper, and that is a scar rather than a preference. This platform ships a global Long->String seria...
Workweek Days, Weekend Days and Every Day in the Day field
Declaring the same hours five times over was the only way to say 'I present on weekdays'. The Day field now offers the three groups above the individual days. ...
A healthcare market's commerce surface is its revenue cycle
The other verticals show orders and agreements because that is where their money is. A medical practice's money is in claims — and specifically in the ones noth...
The revenue cycle worklists, and the one restriction that outranks them
Every list here exists because its failure mode is a MISSING row rather than a wrong one, which is why none of them show up in an ordinary report. A claim a cl...
Count new bug reports under the listing's own visibility rule
The badge and the list it opens are read side by side; a count computed under a different tenancy rule than the list is a bug report waiting to happen.
Count missed calls a member has not been shown
callResult is a free-form provider string, not an enum — the history tab matches the literal 'Missed', and upper() is what stops a provider that reports MISSED ...
Record whether an attendee has been told
The case this exists for is a webinar booked on somebody's behalf by somebody else: registration was recorded and nothing in the app ever told them. status coul...
Count assistant replies the member has not seen
Keyed by session GUID because that is what a tool window carries. ASSISTANT only: a member's own prompt is not news to them.
The healthcare engagement vocabulary
An appointment is the INTENT — a slot someone holds and may not keep — and the ENCOUNTER is the commitment: the visit that actually happened, the thing a note i...
Give bugs and enhancements their own support section
The two report entries were sitting under "Online Support" beside Contact Support and View Active Tickets, which is a different errand: those two are asking a p...
Member-level availability, with sub-tabs and a calendar layer
**************** now has two sub-tabs. "Webinar Types" is what an administrator configures — the offering, its presenters, its reminders. "Scheduled Availabilit...
Seed MANAGE_WEBINAR_SCHEDULES from MANAGE_SUPPORT_SETTINGS
Until availability moved onto the member, MANAGE_SUPPORT_SETTINGS holders were the one group who set it — they authored the dated slots on each webinar type, wh...
Create member_availability_window, retire the dated slot table
Creates member_availability_window, adds **************** and rebuilds webinar_child_org_restriction around the type plus an optional weekday. Drops webinar_ava...
Resolve bookable times from member availability
Availability is now computed rather than stored. MemberAvailabilityService owns the arithmetic: expand each presenter's declared windows over the type's booking...
Move availability from the webinar type onto the member
Availability was webinar_availability_slot: a dated (date, start, end) row owned by a WebinarType. A presenter who ran three kinds of session had to declare the...
The Patient Records surface — day, safety, search and chart
A nav entry, four panels and a chart. The design decisions worth reading are the ones where the screen is a control rather than a view. The chart's allergy ban...
Give an SMS conversation a read pointer
VoipConversation had no notion of read at all, so an SMS could be shown but never recorded as seen. Null means never looked, which counts all inbound — the hone...
Count social conversations as unread
Social sessions were excluded from the unread membership query by a hand-written type list, so a social conversation could never show a count anywhere. They are...
Keep room for the compact mark among a pile of lockups
A straight "best six by score" is the wrong cap for this, and the reason is the shape of real sites: a company's wide lockup appears in the header, in JSON-LD a...
Read pointers for SMS, AI chat, webinars and missed calls
Three of the five conversation surfaces had no server-side notion of read at all. All four columns are nullable with no backfill: null means never looked, which...
Fit the report form in the window without scrolling
The form was about 120px taller than the 460x690 window's content area, so every new report opened on a scrollbar. Six changes, each of which also reads better ...
The Patient Records rights, and the access rights they are not
Twenty-three rights under ServiceType.EHR, and every one of them is a SECOND gate rather than the only one. Holding VIEW_CHART does not let a member open a char...
The clinical API — patients, schedule, chart, and the gate in front
The access rule is the part worth reading. Being logged in is not a reason to see a chart. The overwhelming majority of real HIPAA enforcement is not outside at...
A domain is no longer required to create an org
Requiring it here was the wizard's half of the rule this effort removed: a customer could not finish creating an org without naming a domain, and then could not...
The repository layer, with a harness that proves it boots
Repositories for patients, encounters, scheduling, the chart, notes, questionnaires, coverage and claims. Every query leads with tenantId because on YugabyteDB ...
Insurance, claims, remittance and prior auth (SP14)
Coverage models ORDER, because a patient with two policies has a primary and a secondary and billing the wrong one first is a denial that costs a month and a re...
Questionnaires that produce coded data, not form answers (SP8)
Deliberately not the platform's lead form builder, and the reason is the whole design. A capture form's job is to collect answers. A clinical questionnaire's jo...
Patient identity, and chart documents on the EXISTING doc manager
The EHR gets no second document system and no second signature system. PATIENT_CHART is a new ImageAssocType keyed on the patient's logical id, so a chart is an...
Report form becomes a tool window; filter and status changes
REPORT FORM -> POPUP TOOL WINDOW. A modal was the wrong shape for the job. Reporting a defect means describing something you were just looking at, and a modal i...
Practice scheduling, waitlist and recall (SP6)
Availability stays as RULES. ScheduleBlock describes a provider's day and slots are computed for the window being viewed; pre-materialising five-minute slots fo...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.