Seed the Marketing Websites market and plan; attach agreements to their market
Market **************** (display order 14, after KamoCRM), plan MARKETING_WEBSITE: $50/mo flat, one seat, $4,950 FLAT setup, no trial, not public, no app bindin...
Record the Org Marketing Websites schema and seed its topic and first site
MarketingSitesMigration (@Order(0), idempotent): the WEB-<n> sequence, the NONCONCURRENT indexes and support_topic.god_only exactly as hand-applied 2026-11-10; ...
Record the held-legal-upload and conversation Antivirus columns
Same DDL hand-applied as owner kamo on 2026-11-08: **************** **************** and **************** (nullable, idempotent ADD COLUMN IF NOT EXISTS).
Record the antivirus_baseline_state table
Hand-applied to production as kamo on 2026-11-08; this runner carries the same DDL so a fresh database gets it from code.
Record the Compliance Requirements tables (hand-applied 2026-11-07)
hr_compliance_requirement / _record / _record_event / _gate_override, hr_platform_library_item and **************** / library_edition - the exact IF NOT EXISTS ...
Record the six Antivirus tables (hand-applied 2026-11-07)
content_scan_verdicts, antivirus_detections, antivirus_false_alarm_reports, antivirus_allowlist, antivirus_org_settings, antivirus_daily_stats - the exact IF NO...
Attestation uniqueness is per (assignment, round)
HR review lets a returned package be finished again, and each Finish writes its own attestation linked to the previous round. Ensure the (assignment_uid, round)...
The platform owner's seed password is no longer a literal in source
The value here was also a cluster and Forgejo password. The seed now reads KAMO_SEED_OWNER_PASSWORD, or uses a random one that is never logged. History still ho...
Reports and Gamification are included in Business and up
Owner, 2026-11-01. They were on Enterprise alone.
A rebuilt database gets what entities can't declare
Expression indexes on borrowers, the borrower pairs index, and each restricted table's privileges as they stand in production: 16 tables, dial_ledger among them...
Fill the loan officer into the role store on a rebuild
Idempotent, and a row already there wins. KI ships nothing on its own and was not run on production, which was backfilled by hand.
Drop the full status range check on loan_files
0-19 was exactly full, and the next LoanFileStatus is ordinal 20. Applied by hand on 2026-10-31; listed here so a rebuilt database loses it too.
KamoCameras is included in Business and up, and on every universe's Premium rung and above
Owner, 2026-10-20 (IoT close-out F11): Business, Enterprise and their equivalents in the other universes. - PlatformTierMatrixMigration: Business gains KAMO_CAM...
Stop forcing a phone server onto every text conversation (SITP CARRIERSMS)
MultiInstancePhoneMigration runs on every KamoInitializer start. Its conversation step deleted each voip_conversations row without an instance (and that thread'...
KamoCameras in the entitlement catalog, on the platform's own plan only (totality test green)
KamoCameras (ServiceType 39, shipped 2026-10-13, TESTING) shipped without an AppEntitlementCatalogMigration entry, so **************** two totality checks have ...
IoT Devices on every paid KamoUniverse rung and no free one (IoT SP14 D3)
Pin com.kamo.z.shared.iot in KamoInitializer's repository list
IoT SP01 Task 6. SP00 already added the entry; only the pin is new.
IoT Devices in every paid plan, never Free; scan com.kamo.z.shared.iot (IoT SP00)
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...
Scan com.kamo.z.shared.cameras so the KamoCameras tables are created
Say that the platform org holds every app whatever its plan rows say
Completes the corrected comment over the platform-only catalog entries: the rows it describes decide nothing for the platform org itself, which ****************...
The platform-only catalog comment says what the ladder did to each app
The comment over REPORTS, GAMIFICATION, KAMO_UNIVERSE, CHESS and HOLDEM said all five were placed where their live entitlement already was, on OWNER_UNLIMITED. ...
The platform-pricing loaders find the platform org as the top-level org, not by its short title
KamoCRMMarketBackfillLoader and KamoCRMPricingLoader looked the platform org up by titleShort = "KamoCRM". That stopped matching when the brand moved to KamoUni...
Delete the org-domain ownership backfill; it finished, and it verified second claims
**************** was a one-off (2026-08-28) that marked live org_domains roots ownership_verified when host routing started to require it. It ran again on every...
The Family, Community and Personal catalogs beside KamoCRM's business ladder
KamoUniverse sells four catalogs out of the platform org's one plan table. This lands the schema and the data for the three new ones. - UniverseColumnsMigratio...
Delete the lead contact-point backfill; it finished and no code scans every lead
The KamoInitializer run that ended at 18:51 PDT today logged LeadContactPointSeedRunner: complete β 795983 leads scanned, 1552381 contact points opened, 0 faile...
No shared provider key in the seed; every app, AI Workforce included, has a catalog row
Pin kamo-shared-library 1.6.1, the version the library stays at
1bb9801 pinned 1.6.2 together with the library bump in db737a54. That bump is reverted, because about thirty services pin 1.6.1 and each build can only resolve ...
Migration for org_alias_domains, seeding the platform org's two
Creates **************** and seeds the platform org (is_top_level) with kamouniverse.com (default, carrying forward the old hardcoded platform.mail.domain) and ...
The columns and activity log the Arive integration maps
**************** (unique), the Arive link fields on lead_los_links (kind, GUID, deep link, stage, pending-since, last error) and los_sync_events. All nullable, ...
The Notes plan feature is "Notes & Checklists"
The Notes app holds checklists as well since 2026-09-23 and is called "Notes & Checklists" everywhere it is named. The pricing page's comparison chart takes its...
Scrub copies of live credentials from config and dumps
A sweep of every repo for the values of the cluster's live Secrets (2026-09-23) found copies here: the JWT signing secret as a `${JWT_SECRET:<literal>}` default...
No live credentials in application.yml defaults
The local-development defaults carried the database OWNER's password (${DB_PASSWORD:<literal>}), and apiservice/securityservice also the live changelog webhook ...
Put the app in the entitlement catalog, add-on only
**************** asserts every sold app is categorised and sits somewhere on the tier ladder, because an app the catalog does not describe lands nowhere on the ...
Leave unique keys to the entities instead of duplicating them
Eight migration statements created unique indexes on exactly the columns their entities already declare unique (BillingGroupMember, BillingGroup, MailboxBilling...
Stop creating a plain index shadowed by the unique one
member_notification_preferences (member_id) got both a plain and a unique index from the same statement list; the unique index serves every lookup. The plain on...
Webinar_notify_member, the team members copied on presenter emails
One row per (organization, team member): the Additionally Notified list on the Scheduled Webinars settings tab. MediaService blind-copies these addresses on eve...
Page_transition_overrides, an organization's and a member's own page transition
One row per owner (ORG with the org id, MEMBER with the member id): a catalogue token or NULL to follow the level above, and properties for only the transitions...
**************** beside the transition
A TEXT column holding each transition's properties as JSON keyed by transition id. No backfill: null means every transition's defaults, like page_transition bes...
**************** ahead of every reader
A catalogue token, NULL meaning the shipped TILE_DISSOLVE, so nothing is backfilled. Order 0 because the entity maps the column from this build on, and an earli...
The unique (campaign, address) index, for a fresh environment
EmailService used to create **************** on every startup; DDL on this cluster belongs here instead. Idempotent, auto-committed (YugabyteDB builds indexes o...
The repeat-sound columns, for a fresh environment
EmailService runs ddl-auto: none, so neither column can appear on its own β the entity declares them and Hibernate reads the table happily without them, then fa...
Drop the frozen type_id CHECK that blocked every bug thread
`media_sessions` is created by Hibernate's ddl-auto, not by a migration, so it carries the constraint ddl-auto writes for an `@Enumerated(ORDINAL)` column β fro...
System_bug.media_session_guid, and its lookup index
The column behind a report's comment thread, matching **************** β VARCHAR(36), because MEDIA_SESSIONS.GUID is itself a 36-character string column and a t...
Add denial_reason, and sweep the three retired status names
status_name holds a NAME read back through @Enumerated(STRING), so a row still saying TRIAGED after the constant is gone does not read as a default β it throws ...
Stop the operator seed re-granting revoked platform rights
Rights taken away from a platform administrator on Platform Admins came back on their own days later, which read from the console as a save that would not stick...
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.
