Skip to content
Centriu
Centriu Axis

Cross-Device Message-Hide Synchronization Automation: Deleted on the Phone, Still There on the Desktop

Hiding a chat message inside Centriu Axis "for yourself" — as opposed to deleting it for everyone — previously only ever recorded that choice in the one browser or device where it was made. On a phone, the app runs inside its own separate mobile-app shell with its own independent browser storage; on a desktop browser, that storage is a completely different one. "Hidden on the phone, still visible on the desktop" wasn't an inconsistent sync — it was the genuine absence of any sync mechanism at all, by ownership decision: each device kept its own separate, private record and neither ever knew about the other. The fix moves the record of a hidden message into the database, one row per person and message, visible only to the person who hid it, with the device's own local storage now working purely as a fast, synchronous cache for instant screen updates rather than the only copy of the truth. Any other device belonging to the same person receives the hide the moment it happens, live, through a real-time subscription — and if the network or database is briefly unavailable, hiding the message still works locally immediately, with the server-side record catching up automatically the next time a connection is available.
Hidden here
Hidden there too, live
Small business owner using a phone
Hidden on the phone, hidden everywhere else too.

The absence of a feature and a broken version of it can look identical to the person experiencing it

Someone who hides a message on one device and still sees it on another has exactly one observation available to them: it didn't work everywhere. Whether the underlying cause is a genuine synchronization bug (two devices tried to agree and failed) or the complete absence of any attempt to synchronize at all (two devices were never designed to know about each other) is invisible from that single observation — both produce the identical symptom, and only looking at the actual architecture reveals which one it actually is.

How the underlying problem shows up before you fix it

A per-user preference or action (hiding, muting, marking as read) is recorded only in a device's own local browser storage, with no equivalent record anywhere a different device could read it from.

A mobile version of an application runs inside its own separate browser-like shell, with its own separate local storage from the desktop browser version — a fact easy to overlook if both were tested independently rather than deliberately checked against each other.

A feature appears to work correctly in every individual test performed on a single device, because nothing about a single-device test can reveal the absence of a mechanism that only matters across MULTIPLE devices.

A newly-added feature reads a shared, external resource directly, from code inside a file whose OWN established convention is to defer that same resource behind a lazy-loading wrapper — creating a real risk of using the direct reference by mistake, without necessarily an error surfacing in every code path immediately.

A fix for cross-device or cross-session consistency has no defined behavior for the case where the network or shared resource is briefly unavailable — either the whole action fails, or the fix silently does nothing and nobody notices until much later.

How Centriu Axis turned a single-device preference into a genuinely shared one — safely, in both directions

The starting state is stated plainly in the change's own documentation: hiding a message "for me" lived entirely inside `localStorage`, keyed by that specific browser or app instance, and the mobile app runs as its own separate shell with its OWN independent storage, completely disconnected from the desktop browser's. Before this fix, "I hid it on my phone and it's still showing on my computer" was never a bug in a synchronization mechanism — there had never been one to begin with.

The fix introduces a dedicated database table with one row per person and message, protected so each person can only ever see and create their own hidden-message records — never anyone else's, and there is deliberately no way to un-hide a message once hidden, matching how the feature already worked in the product. The device's own local storage is deliberately kept in the design, but its role changes: it becomes a fast, synchronous CACHE that lets the chat screen filter out a hidden message instantly, without waiting on a network round trip, while the database row is the one shared, cross-device source of truth. The moment a message is hidden, that same device also writes the corresponding row to the database in the background; every OTHER device signed in as that same person receives that write live, through a real-time subscription, and immediately applies the same filter to its own screen — turning what used to be device-local behavior into something that genuinely follows the person, not the device.

The design explicitly plans for the network or database being briefly unavailable: hiding a message always updates the local cache first, so the screen responds instantly and correctly regardless of connectivity, and the corresponding database write is attempted as a best-effort background operation that quietly retries on the next natural sync point rather than failing loudly or blocking the interaction. A companion reconciliation routine merges both directions on each app open — hidden-message records that exist in the database but not yet in this device's local cache (meaning they were hidden somewhere else) get pulled in, and any that exist locally but not yet in the database (hidden while offline, or from before this feature existed) get pushed up — so a device that was closed when a hide happened elsewhere still catches up correctly the next time it's opened.

A same-day regression in the very same file is worth including honestly rather than treated as a separate footnote: the first version of the new live-subscription function referenced the shared database client directly at the top of the file, when every OTHER function in that same file deliberately defers that reference behind a small, documented lazy-loading wrapper — specifically so the file's own pure, easily-testable functions don't have to load the mobile-app framework and real-time connection machinery just to run a unit test. That direct reference would have thrown immediately the first time the function actually ran, crashing the chat screen with an unhandled error rather than degrading gracefully. It was caught and fixed the same day, restoring the same lazy-loading pattern already used consistently everywhere else in the file.

What is actually built today

A dedicated database table recording which messages a specific person has hidden, restricted by row-level security so each person can only ever see or create their own records.

Local device storage retained as a fast, synchronous cache for instant screen filtering, with the database now the one shared, cross-device source of truth.

Live, real-time propagation: hiding a message on one device is reflected on every other device signed in as that same person as it happens, without needing to reopen the app.

A best-effort, non-blocking write to the database on the hiding device, and a bidirectional reconciliation routine that catches up any gap — records hidden elsewhere, or hidden locally while offline — every time the app opens.

The same lazy-loading pattern used by every other function in this file applied consistently to the new live-subscription function as well, following a same-day fix for a version that initially broke this convention.

No way to un-hide a message once hidden, matching the product's existing, unchanged behavior for this feature.

A message that stays hidden everywhere, even offline (illustrative scenario, not a real client)

Someone hides a message on their phone while on a subway with no signal. The message disappears from their screen instantly, from the local cache alone. Once the phone reconnects, the hide is written to the database in the background — and the next time that same person opens the chat on their desktop, the message is already gone there too, without them having to do anything on that second device.

What changes operationally

Hiding a message inside Centriu Axis now genuinely follows the person across every device they use, rather than the specific browser or app instance they happened to be using at the time — closing a gap that was never a synchronization bug to begin with, but the deliberate absence of any synchronization mechanism until this change.

When this is not the right fit

This feature is specifically "hide for me" — a private, per-person preference. It does not change "delete for everyone," which was already synchronized across the conversation for every participant before this fix, through a different, already-working mechanism.

A device-local preference vs. one that follows the person

Storing a personal preference only in a single device's own local storage is simple and fast, right up until someone reasonably expects it to follow them to their next device — an expectation the product's own multi-device support already sets. Centriu Axis's fix keeps the local speed (an instant, synchronous cache) while adding the one thing that was missing: a shared, per-person database record that every device the same person uses can read from and write to.

Related systems

Main system: Centriu Axis.

What it does NOT do

  • Does not provide a way to un-hide a message once hidden — matching the product's existing, unchanged behavior for this specific feature.
  • Does not change how "delete for everyone" works — that was already synchronized for every participant through a separate, already-working mechanism before this fix.
  • Does not block or fail the hide action when the network or database is briefly unavailable — the local cache updates instantly regardless, and the database write catches up automatically.
  • Does not expose one person's hidden-message records to any other person — row-level security restricts each record to the person who created it.
  • Does not require every function in this file to load the mobile-app framework or real-time connection machinery — pure functions remain testable in isolation via the file's own established lazy-loading convention, now applied consistently.
  • Does not treat the local device cache as disposable — it remains a deliberate, functioning part of the design specifically for instant, offline-safe screen updates.

Security and governance

Hidden-message records are restricted by row-level security so each person can only ever see or create their own — never another person's. Any personal or business data referenced in a hidden message remains subject to Brazil's LGPD (Law No. 13,709/2018). Full detail on access control lives at /governanca and /iso.

Pricing and contracting

Included at no extra cost with any Centriu contract. Values and terms come from the official pricing table at /precos (Centriu's central source — never restated here).

Frequently asked questions

Why did hiding a message on the phone not affect the desktop before this fix?

The mobile app runs in its own separate storage shell from the desktop browser — hiding a message was recorded only in that one device's local storage, with no shared record either device could read. There was no synchronization mechanism to fail; there simply wasn't one yet.

Does this feature still work without an internet connection?

Yes — hiding a message always updates the local cache first, so the screen responds instantly regardless of connectivity, and the corresponding database write happens automatically once a connection is available.

Can someone un-hide a message they previously hid?

No — there is deliberately no way to reverse a hide, matching how this feature already worked in the product before this fix.

What was the same-day regression in this same fix?

The first version of the new cross-device subscription function skipped this file's own established lazy-loading pattern and would have thrown an error crashing the chat screen — caught and corrected the same day.

Does this affect "delete for everyone" too?

No — that action was already synchronized across every participant in a conversation through a separate, already-working mechanism; this fix is specifically about the private "hide for me" action.

What does Centriu Axis cost?

It is sold by subscription with a published starting price — exact current values are on the central pricing page.

See how Centriu Axis keeps a private chat preference in sync across devices

Reach our commercial team directly, or leave your details below — we'll follow up with guidance for your case.

Sources

  1. Centriu Axis — public product page — Centriu, 2026-07-20 · link(primária)
  2. Centriu Axis — public factsheet (API, JSON) — Centriu, 2026-07-21 · link
  3. Law No. 13,709/2018 — Brazil’s General Data Protection Law (LGPD) — Presidência da República (Brazil), 2018-08-14 · link

Last material update on .

By · AI-assisted production, with human review