உள்ளடக்கத்திற்குச் செல்லவும்
KAMOUniverse

மாற்று பதிவேடு

என்ன புதிது.

அது கப்பல்கள் போல், தளத்தில் ஒவ்வொரு மேம்பாடு.

  1. · KlusterServices

    Receive postmaster@/abuse@stack.loans on k3m1 for the bulk IP's checks

    47.181.8.87's reverse DNS is mail.stack.loans and the router forwards its port 25 to k3m1, but nothing there accepted mail, so a provider verifying who runs the IP (Microsoft SNDS offers only postmaster@/abuse@ of that domain) could not reach anyone. postfix-k3m1-inbound listens on k3m1's host network, takes exactly those addresses to postmaster@kamocrm.com through the main postfix, and refuses everything else. It relays nothing.

  2. · EmailService

    Name the recipient in a header that headers-only complaint reports keep

    Microsoft's feedback-loop reports now carry only the original message's headers, with anything shaped like an address masked. Every campaign message carries X-Kamo-FBL (the recipient's token, the one List-Unsubscribe already has), and the complaint parser reads it first.

  3. · kamo-internal

    Open and click rates, tracking choices, 10,000+ outbox counts, person-asked on leads

    - Campaign card: opened and clicked, as a share of delivered mail (or "Not tracked"). - Deliverability > Campaign rules: open and click tracking, the platform's default or the organization's own choice. - Outbox hero: a capped count reads "10,000+", and what waits beside it "Up to ...". - Lead opt-out panel: lifting an unsubscribe, a spam report or a pause asks the member to confirm the person asked, which the ledger now requires. - Visually hidden styles use '1px' (a bare 1 is 100% in sx); the Opt Out pulse's hidden table sits inside a hidden block, so it can no longer widen a phone screen. - Deliverability activity reads its day through toServerDate.

  4. · EmailService

    Open and click tracking, complaint reports by email, capped outbox counts

    - Tracking: the composer wraps a campaign's web links in a signed redirect (<base>/c/<token>?u=&s=) and adds an open pixel (<base>/o/<token>), as each org chooses (Settings > Email > Deliverability; platform defaults bulk-email.tracking.*). The unsubscribe link, mailto/tel/anchor links and anything already ours are never wrapped, and a link whose signature is not ours goes nowhere. Each recipient's open and click counts once (Redis), shown on the campaign against delivered mail. - Complaints: POST /api/internal/complaints/mail reads feedback-loop reports (ARF) and abuse@ forwards from the mail server's complaints sidecar, finds the recipient by the token the original message carried, and suppresses the address as a spam complaint for that org, counted once. Every campaign message carries a Feedback-ID. - Outbox: due and retrying are counted up to 10,000 (dueCapped/retryingCapped); the host view's due likewise. - Opt Out: toChange passes personAsked to the ledger, which now enforces it for every member change; the local guard is gone.

  5. · SecurityService

    Lead opt-out panel passes personAsked to the ledger

    The lead page's opt-out update takes an optional personAsked flag and hands it to the ledger, which now refuses to lift a person's own unsubscribe, complaint or pause unless the member confirms the person asked. The refusal reaches the client as a 400 with field "personAsked", like the ledger's other refusals.

  6. · kamo-shared-library

    The ledger keeps a person's unsubscribe unless they asked to rejoin

    An unsubscribe, a complaint or a pause is the person's own choice. A member may now lift one only when the change says the person asked to be emailed again (OptOutChange.personAsked); otherwise the ledger refuses it with field "personAsked". The check runs against the state read inside apply, only for MEMBER changes, ahead of the existing note rule, which still applies to an allowed lift. Bounces and a member's own MANUAL block need only the note. OptOutChange gains a seventh component, personAsked, with a six-argument constructor that defaults it to false so existing callers are unchanged.

  7. · KlusterServices

    Route fbl@/abuse@hello.kamocrm.com complaint reports to EmailService

    Spam-complaint feedback-loop reports (ARF, RFC 5965) and abuse reports sent to fbl@ and abuse@hello.kamocrm.com are rewritten to complaints-mail.invalid and handed to a new `complaints` pipe, which reuses the unsubscribe spool script with its own spool directory. abuse@ still sends a human copy to postmaster. A new complaints-mail sidecar, running the same script as unsubscribe-mail, posts each spooled message to EmailService's /api/internal/complaints/mail. With INCLUDE_RAW=1 it adds the whole spooled message (at most 256 KiB), base64-encoded, as `raw`: the machine-readable feedback-report part and the attached original message are MIME parts the existing fields leave out. With the new flags unset, the unsubscribe sidecar behaves exactly as before.

  8. · EmailService

    One eligibility engine decides who a campaign may mail

    Every list add (a member's, an audience's, a copy) and the send itself ask one engine whether an address may receive the campaign, cheapest check first: syntax, then suppression (unsubscribed, complained, bounced, blocked; for the organization or platform-wide), blocked and reserved domains, disposable domains, role and test-looking addresses, cached validation, DNS/MX, and last an optional external validator within its budget. Suppressed and undeliverable addresses are never sent. The judgement calls are settings, and an organization can narrow them. - The final check runs just before a host takes each message, so an address that unsubscribed after it was queued is never sent. A check that cannot be made sends nothing on a guess. - Nothing is dropped: an address that will not be sent stays on the list (SUPPRESSED with a coded note, since the status CHECK constraint has no SKIPPED) and says why. Held rows wait for a member to release them. - Bounces are classified once for the send path and the relay's reports: hard (suppressed; platform-wide from the relay), soft (retried with exponential back-off and jitter, suppressed after a threshold), rate limits and host refusals (retried uncharged, host backed off), and policy blocks (failed, never suppressed). A 5.7.x reputation block no longer suppresses the address. - Relay complaints and unsubscribes suppress the address; counts and notices happen once per report. - A message the host accepted is never re-queued if recording it fails. - An unsubscribe, complaint or pause the person chose can be lifted by a member only when the person asked, and the member must say so. - Detailed reasons ride in the suppression's source; caches, counters and event de-duplication live in Redis; rules live in the provider blobs. No schema change. - New endpoints: /api/email/deliverability (address check, settings, activity), **************** and POST **************** Campaigns carry a deliverability summary. - Settings: bulk-email.deliverability.* (retries, platform rate caps, soft bounce threshold, validator). The validator is optional and off; its key comes from the optional secret email-validation-credentials.

  9. · kamo-internal

    See who a campaign reaches, and why not everyone

    - Campaign preflight card: "1,000 selected · 742 eligible · 258 skipped", with each reason (unsubscribed, bounced before, disposable, role address…) opening the list at those recipients. After sending it shows delivered, deferred, complaints and unsubscribes too. - The recipient list has Skipped and Held chips, shows each row's reason, and releases held rows (one, or all). - Progress is measured against what is meant to go: skipped, held and cancelled recipients are never counted as sent. - Settings → Email → Deliverability: check an address (verdict, checks, suppression, validation, bounce strikes, its campaigns and history), set the organization's rules and blocked domains, and see the last 14 days. - The platform's deliverability panel: global blocked domains, the disposable-list overrides, the validator's allowance and the platform's activity. - Lifting someone's own unsubscribe or spam report asks the member to confirm the person asked.

  10. · kamo-internal

    An organizations-created icon beside every member and team member

    The Members and Team Members tabs on /account get a column beside Name: a filled building in the brand colour with a count for somebody who has created organizations, a faint outline for somebody who has not. The tooltip lists every one by name (an unnamed one as "Unnamed {branch}"), and the header uses the tenant's branch noun. It sorts and filters by the count; the quick search matches an organization's name. The grid is now live: useOrgChanges(['members', 'member-orgs']) refetches silently, and a failed refresh keeps the rows on screen. SecurityService sends member-orgs to every org the owner belongs to. Refresh no longer hands its click event to loadData. Needs the dictionary keys and SecurityService's createdOrgs.

  11. · SecurityService

    The organizations each member created, on the member lists

    GET **************** and /team-members-contractors now carry createdOrgs per person: the names of the organizations they own (orgs.user_id_owner, set once by POST /org and never reassigned), from one findOwnedTitlesByOwnerIds query for the whole list, title falling back to titleShort. Voided organizations are not listed. MemberOrgsChangePublisher sends rt.org.{orgId}.member-orgs to every organization the owner is a member of when one of their organizations is created (after commit), renamed through PUT /org/{id}, deleted, voided or restored. The API proxy's own signal reaches only the caller's session org, and org creation moves that session into the new org.

  12. · SecurityService

    An organization's and a member's own page transition

    The page transition is now chosen at three levels, resolved member, then organization, then platform — for the choice of transition and, one transition at a time, for its properties **************** - PAGE_TRANSITION_OVERRIDES holds the organization and member levels, a row per owner: a catalogue token or null to follow the level above, and properties for only the transitions that level tuned. The entity lives here rather than in the shared library; nothing else reads it. - GET /api/security/page-transition also answers org, member and effective. It never fails on an override: one it cannot read follows the level above. - PUT /org changes the session's own organization's; Configure System. - GET|PUT /member/{memberId}: yourself, an administrator of that member's own organization (Configure System, Manage Members, Manage Member Security), or a god-eligible operator. - Writes are patches, validated strictly before anything is written; a level that follows the one above in everything leaves no row.

  13. · kamo-internal

    An organization's and a member's own page transition

    The page transition is now chosen at three levels. The platform's stays on Platform Administration → Transitions; an organization can choose its own on Behavior & Labeling, and a member their own in My Profile → Appearance. What a tab plays resolves member, then organization, then platform — for the choice of transition, and for each transition's properties one transition at a time, so a member can recolour their organization's transition without taking over the choice of it **************** - Both screens are one editor **************** the same catalogue and detail as the platform tab, with a "Platform default" or "Organization default" card first that plays whatever the level above plays and follows it again when chosen. Properties a level never tuned show the level above's, marked as such, and can be handed back to it. - The platform tab is rebuilt on the same parts; its behaviour is unchanged. - The shell plays the store's effective transition, warm-started from localStorage, and follows this organization's **************** as well as the platform's topic. Writes go through forwardToApi, which publishes it. - New proxy routes: PUT **************** and GET|PUT **************** only those shapes are forwarded. - My Profile registers the card and a palette field, gated to the member, an administrator of their organization, or a god-eligible operator.

  14. · InitializerService

    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 that level tuned. SecurityService resolves member, then organization, then platform. A new table rather than columns on orgs, so no table every service reads is altered. No backfill: no row means following the level above.

  15. · kamo-internal

    Five more page transitions, each with its own properties

    Aperture, Curtain Split, Venetian Blinds, Liquid Wipe and Shatter join Tile Dissolve. Every transition is now an effect in app/lib/transitions/effects, drawn by one engine (transitionEngine / transition.worker / transitionRenderer) from the composed cover image, on the worker when it can and this thread when it cannot. Fixed sizes scale with the cover, so the Transitions tab's miniatures are the real thing, only smaller. - Aperture: a feathered iris from any corner or the centre, with a rim of light. - Curtain Split: the cover parts side to side or top and bottom, shadowed seams. - Venetian Blinds: lit slats turn away in a wave; slat size and orientation. - Liquid Wipe: a rippling front with a glossy crest and a translucent trailing wave, in four directions; waviness. - Shatter: cracks flash, then glass shards burst from the impact point, tumble through the light and fall; piece count and impact point. Each has a colour (the cover wears it), and its properties come from its schema in catalog.ts, which the tab turns into controls: a slider, a toggle, a select, or the Behavior & Labeling swatch picker. The Transitions tab is now a catalogue: six cards resting on a mid-flight frame that play on hover, then the selected transition full size with its properties, drafts per transition, Set as active and Play on this page, which previews the draft on the real cover.

  16. · SecurityService

    Five more page transitions, each with its own properties

  17. · kamo-internal

    Add recipients and Send to latest on a campaign that has gone out

    - A campaign's progress page has Add recipients: the recipients step in a dialog (upload, IDs, the All boxes, addresses), saved in slices as the editor saves them, in any status. - Send to latest sends it to whoever it should reach and hasn't yet. A banner says how many addresses are waiting, and the confirmation says what goes. - Cancel remaining shows only while a campaign is sending: the outbox cancels the mail of campaigns that are going out.

  18. · EmailService

    Running campaign counts, and Send to latest

    Counts: - Every status change moves a campaign's counts by exactly what it changed: a send +1 sent, a later bounce report -1 sent +1 bounced, an add +n, a removal by what its DELETE returned. Nothing counts the list on the way; before, every send recounted every status of the campaign. - Queued is derived from the total. Cancelled is a Redis counter, rebuilt from the rows if it is lost. Each finished run recounts once, which puts right anything a running count missed. - Completion, "can it send" and the audience top-up ask whether a row exists, or count to a cap, instead of counting the list. Send to latest: - Recipients can be added, and the All boxes changed, in any status (PUT /campaigns/{id}/audience). - POST /campaigns/{id}/send-latest sends a campaign that has gone out to whoever it should reach and has not yet. That is the addresses added since, and the records its All boxes reach that were added since: every source is walked again, and addresses already on the list are skipped. - The late suppression and the preference page's pull from a waiting send count only a row that actually moved.

  19. · kamo-internal

    Tile Dissolve's tile size and tile colour, set per transition on the Transitions tab

    Each transition now carries its own properties, stored per transition beside the active one, so switching transitions keeps each one's choices. Tile Dissolve has two: - Tile size, 20 to 160 px (default 50), on a slider. The reveal cuts the cover at that size from the next page change. - Tile colour, from the same token vocabulary as the Behavior & Labeling logo-overlay selects (White, Black, and every primary and secondary shade), drawn the same way: the swatch, then its name. Tokens resolve against each organization's own palette, so one platform choice stays on-brand in every workspace; a shade an organization never set is its primary. The cover wears the tile colour too, because the cover and its tiles are one image. The tab edits a draft that the live preview plays before anything is saved, with Save, Discard and Reset to defaults, and a change arriving from another console never overwrites a draft mid-edit. Open tabs re-read the setting on every /topic/platform/page-transition frame, so a properties save reaches them without a reload. A new tab paints the right colour in its first frame from the last spec its organization used in this browser, kept per organization in localStorage.

  20. · SecurityService

    Tune each page transition, tile size and colour to start

    GET and PUT /api/security/page-transition answer options for every catalogue id, normalised from PAGE_TRANSITION_OPTIONS: a missing, unreadable or out-of-range document reads as the defaults, never a 500. PUT takes an optional options object, validated strictly before anything is saved; a named transition's entry is replaced with its canonical form and every other entry is kept. TILE_DISSOLVE takes tileSize (20-160 px, default 50) and tileColor (a palette token, default PRIMARY).

  21. · InitializerService

    **************** 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 beside it.

  22. · kamo-shared-library

    Each page transition's properties, kept per transition

    **************** maps PAGE_TRANSITION_OPTIONS, a JSON object keyed by transition id, e.g. **************** Keyed by transition so tuning one survives switching to another. Null or unreadable means every transition's defaults.

  23. · kamo-internal

    Shorten admin bar labels to Billing, Stats, Roles, Block, Log

    The panel heading keeps each screen's full name via titleKey, as White Labeling and Apps already do.

  24. · kamo-internal

    The page cover and its Tile Dissolve reveal, in place of the loading screen

    Between pages the main view area (never NavTop or NavPri) is now covered in the organization's primary colour with its full logo centred on it, painted with the Behavior & Labeling "Loading Screen Logo Overlay" when one is set. It drops in the same task as the click that starts a navigation, is painted by the server in the first frame of every document so a reload and a click look the same, and is taken away the moment the new route has rendered. Tile Dissolve is the reveal: the cover, colour and logo as one image, cut into 50 px tiles that lift, turn, round their corners and fade from the top-left corner to the bottom-right on a seeded, jittered diagonal wave, normalised so it takes about 1.2 s on any screen. - Navigation is detected through Next's onRouterTransitionStart (instrumentation-client.ts), which reports every Link, push, replace and back/forward synchronously. A capture-phase listener covers full-document anchors, and a click that turns out not to navigate is undone before it is painted. The rules are pure: every URL change covers, tab switches included; filter, search and selection replaces stay silent; the hash never counts. - The reveal waits for a commit probe rendered after the page, and app/loading.tsx now only holds the cover while a route's Suspense fallback is up. - Tiles are drawn by a Web Worker on an OffscreenCanvas, because the reveal runs while the new page is mounting and a main-thread animation stutters through exactly that. The same engine runs on the main thread when a worker or a CORS-clean logo is unavailable. The worker paints frame 0 before the DOM cover hides and the clock starts only after, so the handoff has no seam. - It cannot stick: a watchdog reveals after 12 s without a commit, a reveal that cannot be drawn fades, a CSS failsafe clears a cover no script took over, and reduced motion gets a 180 ms fade. - The cover spec is validated, kept per tab in sessionStorage, and applied before first paint by a blocking head script, so the shared host never flashes the platform's branding. - The platform's transition is followed live over **************** LoadingContext, LoadingManagerClient, NavigationInterceptor, LoadingStatus and useNavigationLoading are gone; /validate and /logout keep LoadingScreen, having no shell to cover.

  25. · kamo-internal

    A Transitions tab to choose and preview the page transition

    Platform Administration → Configuration → Transitions, gated by the new MANAGE_PLATFORM_TRANSITIONS platform right and registered everywhere a console tab is: the rights catalogue, the tab map, the rights colour and icon, the settings menu and the settings landing card. The catalogue holds one transition, Tile Dissolve, shown full width with a live preview: this organization's own cover, the same markup and engine the shell uses, dissolving off a miniature Kamo page on a loop that pauses off screen and in hidden tabs. "Play on this page" runs the real cover and reveal over the content area. The setting follows **************** and an operator without the right sees a read-only notice rather than a save that 403s.

  26. · kamo-internal

    The campaign recipient list is paginated, with totals

    The recipients grid on a campaign now pages like a list of billions should: First, Previous, Next and Last, rows per page, "101–150 of 3,916" and "Page 3 of 79", with each status chip showing its count. Every step is one request for one page — Next continues after the last address shown, Previous reads back from the first, Last reads backwards from the end — so no page costs more than the first, however long the list. Totals come from the campaign's counters, never from counting rows; a search counts to 10,000 and then says "10,000+". A live refresh re-reads the page on screen where it is.

  27. · EmailService

    A campaign's recipient list pages both ways, with totals, at any size

    The list was already read a page at a time, but only forwards, as an endless scroll with no total — and a status filter found its rows by walking the list in address order, which for a dozen failures among a billion recipients reads the billion. - /recipients/page takes before= and last= as well as after=: previous reads the address index backwards from the first row shown, and the last page reads backwards from the end — one seek either way, never a walk. - Each page carries its total, taken from the campaign's counters rather than by counting rows; a search counts to 10,000 and then says so. - A status with few rows is read through the (campaign, status) index and sorted; a common one along the address order. The same counters decide.

  28. · kamo-shared-library

    The page transition setting, and the right that chooses it

    **************** holds a catalogue token, NULL meaning the shipped default. MANAGE_PLATFORM_TRANSITIONS gates Platform Administration → Configuration → Transitions, appended at the end so no right below it is renumbered in the console.

  29. · InitializerService

    **************** 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 earlier runner loading SystemConfiguration would otherwise fail on a column that does not exist yet.

  30. · SecurityService

    Every tab reads the page transition, and an operator chooses it

    GET /api/security/page-transition answers any signed-in session, since every tab needs it to uncover a page; an unset or unknown value reads as TILE_DISSOLVE. The PUT takes MANAGE_PLATFORM_TRANSITIONS, refuses a token outside the catalogue before saving or sending anything, and publishes **************** so open tabs follow without a reload. Its own controller because /system-config is gated to the VoIP and Document AI rights and answers with KamoPBX credentials.

உங்கள் உலகம் காத்திருக்கிறது.

நிமிடங்களில் இலவசமாகத் தொடங்கவும். நீங்கள் தயாராக இருக்கும் போது பொருட்களை சேர்க்கவும் - எந்த மாற்றமும் இல்லை, புதிய உள்நுழைவுகள் இல்லை.

எப்பொழுதும் இலவசம் — கடன் அட்டை தேவையில்லை