<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Luke Geenen</title>
    <description>The latest articles on Forem by Luke Geenen (@asatruluke410).</description>
    <link>https://forem.com/asatruluke410</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3477308%2F0539691b-035f-47a9-bdc9-3a74ea715e06.png</url>
      <title>Forem: Luke Geenen</title>
      <link>https://forem.com/asatruluke410</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/asatruluke410"/>
    <language>en</language>
    <item>
      <title>Runi: Architecting a Real-Time, Multi-User AI Session System with Google Gemini</title>
      <dc:creator>Luke Geenen</dc:creator>
      <pubDate>Wed, 04 Mar 2026 14:02:29 +0000</pubDate>
      <link>https://forem.com/asatruluke410/runi-architecting-a-real-time-multi-user-ai-session-system-with-google-gemini-4hom</link>
      <guid>https://forem.com/asatruluke410/runi-architecting-a-real-time-multi-user-ai-session-system-with-google-gemini-4hom</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mlh/built-with-google-gemini-02-25-26"&gt;Built with Google Gemini: Writing&lt;br&gt;
Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Runi: Architecting a Real-Time, Multi-User AI Session System with Google Gemini
&lt;/h2&gt;

&lt;h2&gt;
  
  
  What I Built with Google Gemini
&lt;/h2&gt;

&lt;p&gt;Runi is a real-time, multi-user AI session framework designed to embed a&lt;br&gt;
large language model inside a structured collaborative environment.&lt;/p&gt;

&lt;p&gt;Instead of treating Google Gemini as a conversational interface, I&lt;br&gt;
designed it as a &lt;strong&gt;state-aware reasoning layer&lt;/strong&gt; operating within a&lt;br&gt;
distributed session architecture.&lt;/p&gt;

&lt;p&gt;The system's goal is not simply to generate responses. It is to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Manage structured session state\&lt;/li&gt;
&lt;li&gt;  Enforce permission-aware AI behavior\&lt;/li&gt;
&lt;li&gt;  Coordinate multi-user interactions\&lt;/li&gt;
&lt;li&gt;  Persist and update pinned objects\&lt;/li&gt;
&lt;li&gt;  Operate within deterministic guardrails&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  System Architecture Overview
&lt;/h2&gt;

&lt;p&gt;Runi is built around four primary layers.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Real-Time Session Layer
&lt;/h3&gt;

&lt;p&gt;Each session is a structured document stored in Firestore containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Session ID\&lt;/li&gt;
&lt;li&gt;  Member list with assigned roles\&lt;/li&gt;
&lt;li&gt;  Pinned object references\&lt;/li&gt;
&lt;li&gt;  Active system-layer apps\&lt;/li&gt;
&lt;li&gt;  Permission mappings\&lt;/li&gt;
&lt;li&gt;  Metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sessions are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Multi-user\&lt;/li&gt;
&lt;li&gt;  Real-time synchronized\&lt;/li&gt;
&lt;li&gt;  Permission-scoped\&lt;/li&gt;
&lt;li&gt;  AI-aware&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Firestore listeners maintain live synchronization between clients.&lt;/p&gt;

&lt;p&gt;All state mutations are validated server-side before persistence.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Permission Model
&lt;/h3&gt;

&lt;p&gt;Users are assigned roles at invitation time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Viewer\&lt;/li&gt;
&lt;li&gt;  Editor\&lt;/li&gt;
&lt;li&gt;  Admin&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every Google Gemini invocation includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The current user's role\&lt;/li&gt;
&lt;li&gt;  An explicit list of allowed actions\&lt;/li&gt;
&lt;li&gt;  A structured session state snapshot\&lt;/li&gt;
&lt;li&gt;  Referenced pinned objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This prevents the AI from proposing state mutations the user is not&lt;br&gt;
authorized to perform.&lt;/p&gt;

&lt;p&gt;All AI-generated actions are treated as structured mutation proposals&lt;br&gt;
and must pass validation before execution.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Pinned Object Model
&lt;/h3&gt;

&lt;p&gt;Runi separates conversation from structured state.&lt;/p&gt;

&lt;p&gt;Pinned objects are atomic entities that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Exist independently from chat history\&lt;/li&gt;
&lt;li&gt;  Can be referenced by ID\&lt;/li&gt;
&lt;li&gt;  Are versioned\&lt;/li&gt;
&lt;li&gt;  Are schema-validated\&lt;/li&gt;
&lt;li&gt;  Support controlled updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI never directly mutates Firestore.&lt;/p&gt;

&lt;p&gt;Instead, it returns structured mutation proposals which are validated&lt;br&gt;
for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Schema conformance\&lt;/li&gt;
&lt;li&gt;  Permission compliance\&lt;/li&gt;
&lt;li&gt;  Object existence\&lt;/li&gt;
&lt;li&gt;  Referential integrity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This separation prevents hallucinated writes and corrupted session&lt;br&gt;
state.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. System-Layer Apps
&lt;/h3&gt;

&lt;p&gt;Sessions can instantiate structured applications inside the environment,&lt;br&gt;
including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  File Manager\&lt;/li&gt;
&lt;li&gt;  Image Gallery\&lt;/li&gt;
&lt;li&gt;  Image and Video Generation\&lt;/li&gt;
&lt;li&gt;  Wiki Layer\&lt;/li&gt;
&lt;li&gt;  Space Weather Module&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Defines its own schema\&lt;/li&gt;
&lt;li&gt;  Registers allowed actions\&lt;/li&gt;
&lt;li&gt;  Maintains scoped storage\&lt;/li&gt;
&lt;li&gt;  Exposes controlled interaction boundaries to the AI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example flow for image generation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; A user triggers media generation.\&lt;/li&gt;
&lt;li&gt; The controller sends structured intent to Gemini.\&lt;/li&gt;
&lt;li&gt; Gemini returns refined prompt metadata and structured output.\&lt;/li&gt;
&lt;li&gt; Media is generated and stored in Firebase Storage.\&lt;/li&gt;
&lt;li&gt; A versioned pinned object is created.\&lt;/li&gt;
&lt;li&gt; Firestore propagates the update in real time to all session members.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All writes pass through validation middleware.&lt;/p&gt;




&lt;h2&gt;
  
  
  Technology Stack
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Vite\&lt;/li&gt;
&lt;li&gt;  React\&lt;/li&gt;
&lt;li&gt;  Component-based dashboard architecture\&lt;/li&gt;
&lt;li&gt;  Firestore real-time listeners\&lt;/li&gt;
&lt;li&gt;  Blob-based iframe isolation for project environments&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Node.js controller\&lt;/li&gt;
&lt;li&gt;  Structured task runner\&lt;/li&gt;
&lt;li&gt;  Schema validation layer\&lt;/li&gt;
&lt;li&gt;  Mutation validator\&lt;/li&gt;
&lt;li&gt;  Firestore (real-time state + indexes)\&lt;/li&gt;
&lt;li&gt;  Firebase Storage (files + media assets)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every AI response is treated as untrusted structured input.&lt;/p&gt;




&lt;h2&gt;
  
  
  AI Layer: Google Gemini
&lt;/h2&gt;

&lt;p&gt;Gemini is used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Intent classification\&lt;/li&gt;
&lt;li&gt;  Structured JSON planning\&lt;/li&gt;
&lt;li&gt;  Context-aware reasoning\&lt;/li&gt;
&lt;li&gt;  Media prompt refinement\&lt;/li&gt;
&lt;li&gt;  Wiki summarization\&lt;/li&gt;
&lt;li&gt;  Permission-aware action proposals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prompts are structured and always include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  System role definition\&lt;/li&gt;
&lt;li&gt;  Session state snapshot\&lt;/li&gt;
&lt;li&gt;  User role\&lt;/li&gt;
&lt;li&gt;  Allowed actions\&lt;/li&gt;
&lt;li&gt;  Pinned object references\&lt;/li&gt;
&lt;li&gt;  Expected output schema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gemini functions as a probabilistic planner operating inside a&lt;br&gt;
deterministic execution layer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Engineering Challenges
&lt;/h2&gt;

&lt;h3&gt;
  
  
  AI in a Distributed Real-Time System
&lt;/h3&gt;

&lt;p&gt;LLMs are non-deterministic.&lt;/p&gt;

&lt;p&gt;Real-time collaborative systems are state-sensitive.&lt;/p&gt;

&lt;p&gt;To reconcile this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  All AI outputs are proposals\&lt;/li&gt;
&lt;li&gt;  No direct database writes are allowed\&lt;/li&gt;
&lt;li&gt;  All changes require validation\&lt;/li&gt;
&lt;li&gt;  Session versioning mitigates race conditions&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Context Scaling
&lt;/h3&gt;

&lt;p&gt;Multi-user sessions rapidly expand context size.&lt;/p&gt;

&lt;p&gt;Mitigation strategies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Structured state snapshots instead of replaying full conversation
history\&lt;/li&gt;
&lt;li&gt;  Object referencing instead of full content injection\&lt;/li&gt;
&lt;li&gt;  Metadata summaries in place of raw file bodies&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Role-Aware AI Behavior
&lt;/h3&gt;

&lt;p&gt;Gemini must behave differently for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Viewers\&lt;/li&gt;
&lt;li&gt;  Editors\&lt;/li&gt;
&lt;li&gt;  Admins&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Explicit role and action injection significantly improves compliance and&lt;br&gt;
reduces invalid action proposals.&lt;/p&gt;




&lt;h2&gt;
  
  
  Google Gemini Feedback
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Strengths
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Strong structured JSON generation\&lt;/li&gt;
&lt;li&gt;  Reliable schema adherence when constrained\&lt;/li&gt;
&lt;li&gt;  Effective reasoning over structured session state\&lt;/li&gt;
&lt;li&gt;  High-quality summarization of linked knowledge objects&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Limitations Observed
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Schema drift in very long sessions\&lt;/li&gt;
&lt;li&gt;  Occasional assumption of unavailable system apps\&lt;/li&gt;
&lt;li&gt;  Requires strong validation layers for deterministic workflows\&lt;/li&gt;
&lt;li&gt;  Long context windows require active pruning strategies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gemini performs best when embedded inside a clearly bounded execution&lt;br&gt;
architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Cross-session shared memory graphs\&lt;/li&gt;
&lt;li&gt;  Version-controlled session file systems\&lt;/li&gt;
&lt;li&gt;  More granular permission hierarchies\&lt;/li&gt;
&lt;li&gt;  Domain-specific session templates\&lt;/li&gt;
&lt;li&gt;  Bounded autonomous planning loops&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Closing Reflection
&lt;/h2&gt;

&lt;p&gt;Embedding an LLM inside a real-time collaborative system is not&lt;br&gt;
primarily a prompt engineering challenge.&lt;/p&gt;

&lt;p&gt;It is a distributed systems design challenge.&lt;/p&gt;

&lt;p&gt;Google Gemini becomes most powerful when treated as a reasoning engine&lt;br&gt;
inside a controlled, validated execution architecture.&lt;/p&gt;

&lt;p&gt;That shift --- from chatbot to state-aware planner --- defines Runi.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>geminireflections</category>
      <category>gemini</category>
    </item>
  </channel>
</rss>
