The alpha testing program is now open to the public! We’d love to hear your feedback.Join!
Back to Blog
Product UpdatesFeatured

Geiger Chat now lives inside Geiger Flow

The full Geiger Chat workspace — messages, channels, calls, files and inbox — now runs inside a Flow project's Grounding tab, scoped to the project instead of the organization.

Geiger Team6 min read

Flow has always had a Grounding tab. Until now it was a modest thing: a list of channels, a list of messages, and not much else. If a conversation needed a call, a file, a thread, or anyone outside the room, it left Flow and continued somewhere else — which is exactly where project context goes to die.

So we stopped maintaining two answers to the same question. Geiger Chat now runs inside Geiger Flow, in full, as the Grounding tab of every project.

The whole workspace, not a widget

This is not a chat panel bolted onto a project screen. It is the entire Geiger Chat product, rehosted, with its own navigation rail:

  • Messages — direct messages, with threaded replies, quoted replies, emoji reactions, attachments and read receipts.
  • Channels — topic-scoped rooms with their own member list, pinning and details sheet.
  • Contacts — everyone in the project, plus the people you have reached outside it.
  • Calls — call history, scheduled calls, and the meeting stage itself.
  • Files — every file shared in the project, in one place, alongside a per-conversation files panel.
  • Inbox — what happened while you were away, with a live unread badge on the rail.
  • Settings — presence, notification preferences and your chat identity.

The rail is styled to the same tokens as the project sidebar, at the same row height, so the two read as one navigation system rather than a product inside a product.

Scoped to a project, not an organization

The interesting part of the port was not the UI — it was the scope. In Geiger Chat, "who belongs here" came from the organization roster. In Flow, the unit of work is the project, and a project has its own members.

So conversations now carry a project_id, and every other record reaches a project through its parent conversation. Row-level security is expressed with the same ability checks the rest of Grounding already used, which means chat access follows project access automatically — no second permission model to keep in sync.

The roster does one more job. When you start a conversation with someone who is not a member of the project, they are flagged as external and you are asked to confirm before the thread opens. Reaching outside the project is allowed; doing it by accident is not.

Calls that actually connect

Voice and video run peer-to-peer over WebRTC in a mesh — one connection per participant, so a one-to-one DM and a small channel call use the same engine. Signalling rides Supabase broadcast on two surfaces: a per-user ring channel, so an incoming call reaches you even with no conversation open, and a per-conversation channel carrying the offer, answer and ICE traffic once the call is live.

The meeting stage has the controls you expect — mic, camera, screen share, participants, raise hand — and every call posts an event card back into the conversation it came from, so the thread keeps the record. Calls can also be scheduled ahead of time, with reminders that fire when they are due.

Files and the inbox

Shared files land in a dedicated storage bucket and are indexed per project, so the Files screen answers "where is that spec" without anyone scrolling a thread. Attachments are typed by extension, so images, PDFs, sheets, slides and archives all render with the right affordance.

The Inbox tracks what arrived while you were elsewhere. Messages you wrote, and messages in conversations you are not a member of, are ignored. If you opt in, anything that arrives while the tab is in the background also raises a desktop notification.

Pop it out when you need the room

A chat tab inside a project shell is the right default and the wrong shape for a long conversation. The pop-out button hands the same workspace the full window at /chat/<projectId> — same screens, same data, the rail as the only navigation.

What happened to the old Grounding data

Nothing was thrown away. Existing Grounding channels became conversations and existing Grounding messages became chat messages, migrated in place. The legacy tables are still there, untouched, and will stay for one release before we retire them.

Where this goes next

Merging Chat into Flow is the first of these consolidations, not the last. The pattern — take a product, rescope it from the organization to the project, and host it where the work already is — applies to more of the suite than chat. Grounding is where we proved it.

It is live now in every Flow project. Open a project, click Grounding, and start talking.

Keep reading

Related articles

GEIGER STUDIO