The same header and tabs as every other app, and no ribbon on the website
Manage Marketing Site now wears the gradient hero and underline tab bar that Marketing, HR and IoT use, instead of its own compact header with icon tabs. The co...
Mirror MANAGE_MARKETING_SITE (708)
A standalone root under General Permissions, so security models can grant Manage Marketing Site to someone other than the owner.
Full-width pages, and the preview is just the website
Preview drops the intro, the publish card and the being-built notice; the header's status chip and the Publish tab already say all three. Changes, Publish, Doma...
No read-only transaction around multi-read views; retry the edge routing read
YugabyteDB answered the edge's routing read with 'Restart read required' — a restart-read cannot be retried mid-transaction. Each read now runs as its own state...
Org marketing websites — member, platform, edge and webhook APIs
- **************** site, preview pass, change requests (+ pictures), cancel, source.zip (Forgejo archive streamed, audited), get-a-website lead, connect-www (...
SecurityService may consume BILLING_EVENTS (marketing sites follow billing.subscription.*)
Stream a request's pictures through the proxy as bytes
The relay read every success as text, which corrupts an image. GET **************** now passes the upstream body straight through, like source.zip.
PlanDto.flatPrice for a flat plan's per-month label
A flat product (CorePlans.isFlat, e.g. Marketing Website $50/month) now carries its flat monthly charge so the console labels it "per month", not "per seat".
Apply marketing/ from deploy-services like every other folder
A "Deploy Marketing Sites namespace" step runs marketing/apply.sh (namespace kamomarketing, marketing-ci and site-edge RBAC, Middlewares, secrets created-if-mis...
Record the 2026-10-30 public-IP hand patches so a full reconcile keeps them
coturn, MediaMTX, FreePBX (kamo-meet ACL + fail2ban) and KamoPBX were switched to k1m1's eno1 addresses 76.81.227.154/.155 by hand on 2026-10-30, and dovecot-im...
POS grace periods, My Bill core plan + every subscription, bank payments
- GET/PUT **************** (seller's MANAGE_SUBSCRIPTIONS): opt-in grace period, OFF by default; the hourly billing job stops service when a deadline passes...
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...
Core-plan pickers, flat plans, grace periods, bank payments, paid/ended events
- Mailbox/PBX controllers and reconcilers, LicenseUsageService, OrgPlanService: the CORE subscription via CorePlans (never a flat product's Stripe sub); flat ...
A second subscription is safe, grace periods, per-market agreements, paid/ended events
Generic for every org selling through the Subscription line of business: - CorePlans: the core-plan subscription is picked deterministically; a flat product (...
Manage Marketing Site, the Marketing Websites platform console, and grace-period billing controls
Members (the owner, or a holder of MANAGE_MARKETING_SITE): - NavExtra "Manage Marketing Site" beside EZ Setup; an owner without a site sees "Get a Website". - /...
God-only support topics, the website request ticket and its conversation hook
- Tickets under a god-only topic (SupportTopic.godOnly) are excluded from every support list, count, badge, metric, auto-open and claimable queue unless the v...
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; ...
A prepared hand-off can start in a marketing site's checkout, with a WEB-<n> folder
~/Kamo/Marketing/<repo> on first use, through sage's own credential store), cwd (absolute, bounded to the home after resolving links) and workPrefix (BUG defaul...
Only known preview hosts under the wildcard sites.kamouniverse.com zone
*.sites.kamouniverse.com resolves here (wildcard A), and kamouniverse.com is an always-allow apex, so any scanner label or browser-only sibling ****************...
Relay the marketing-site Forgejo push webhook to SecurityService
Sessionless, raw body and every Forgejo/Gitea signature and event header preserved; SecurityService verifies the HMAC against MARKETING_WEBHOOK_SECRET.
Marketing site, request and dispatch entities, rights and the god-only support topic flag
- MarketingSite / MarketingSiteRequest (WEB-<n> from its own sequence) / MarketingSiteDispatch entities and repositories, matching the hand DDL (column defaul...
Namespace kamomarketing for org marketing sites
- marketing/: namespace, SA marketing-ci (Role limited to kamomarketing, long-lived token), SA site-edge (IngressRoutes only), the edge's middleware chain wit...
Svc_site_edge login (subscribe marketing.site.changed); SecurityService may publish it
The marketing sites edge (kamomarketing/site-edge) refreshes its routing table when SecurityService announces a site change. Subscribe-only, publishes nothing; ...
Require Disposition / Require New Note per market, and the nav and /leads indicators follow them
Adds an Accept New Lead section to the market add/edit popup; the nav tooltip, the Why Can't I Accept toggle and the Available blocked page now word the gate fr...
Accept-gate refusal no longer says both a note and a status are needed
The requirement is per market now.
Each market decides whether accepting a lead needs a disposition, a note, or both
Adds requireDispositionToAccept / requireNoteToAccept to LeadMarket (null reads as required, so existing markets behave exactly as before). LeadAcceptEligibilit...
A bankruptcy answer that is not a clear yes or no stays unset
The generic boolean reader treats every word it does not know as false, so a vendor's 'maybe' or 'n/a' became 'no bankruptcy' - a wrong claim about the borrower...
A failed request tells the caller to try again, not what the exception said
25 controllers returned e.getMessage() to the browser, which can name tables, columns and internal hosts. They now answer with a plain 'please try again' and lo...
The retail sync job calls the orchestrator's scheduled entry point again
**************** became syncNow(UUID, trigger) in the shared library (05bd1ad5, Nov 8), which stopped DaemonService compiling - and so deploying - since then.
The Mortgage tab understands what a lead vendor sends
A stated down payment percent becomes the amount when no amount was given, so the tab stops flagging it missing and the loan amount and LTV are right. A credit ...
Townhouse and Planned Unit Development are property types of their own
Appended as ids 5 and 6; the existing ids are untouched. The vendor-word detection now sends townhouse/townhome/row house and PUD there instead of folding them ...
Editing the IP address or TrustedForm link counts as editing contact info
Show and edit the credit, employment, loan and consent details a lead vendor sends
Mortgage details gain Credit Rating (in words, apart from the numeric score), Employment Status, Bankruptcy, Desired Loan Type, Property County, When They Need ...
Hold what a mortgage vendor sends - credit rating words, employment, bankruptcy, desired loan type, county, timeframe, down payment percent, and consent proof; recognise property type by the words vendors use
Credit rating is its own column (CREDIT_RATING_DESC) beside the numeric ESTIMATED_CREDIT_SCORE. IP address, TrustedForm certificate and Jornaya LeadiD live on t...
Share With Kamo — an owner shares an item with Kamo's CDO, sees every look, and Kamo's CDO gets a Kamo Vault tab
Owners get a Share With Kamo switch in the item editor (not for god-eligible members), a Kamo badge and view count on the card, a Kamo Access panel with every l...
The relay stamps who is god and who is Kamo's CDO, and relays the Kamo share paths
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.
