Skip to content

Mo7medRef3t/memory-chat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

26 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🧠 Memory Chat – Offline-First Collaborative Note-Taking Platform

A production-grade offline-first mobile application built with Flutter, featuring real-time synchronization across devices, hierarchical knowledge organization, and a Slack-inspired responsive UI.

Built with Clean Architecture, PowerSync, Supabase, Drift, and BLoC (Cubit) state management.


πŸ“Έ Screenshots


✨ Features

πŸ”„ Offline-First Architecture

  • Local-first data storage – All operations work instantly without internet
  • Automatic synchronization – Changes sync to Supabase when online
  • Zero data loss – Local queue ensures no operation is ever lost
  • Conflict resolution – PowerSync handles concurrent edits gracefully
  • Seamless offline experience – Full CRUD operations work offline

πŸ“ Hierarchical Organization

  • Workspaces – Top-level containers for different projects/contexts
  • Sections – Organize content within workspaces (like Slack channels)
  • Memory Boxes – Group related notes together
  • Notes – Rich text notes with title and content
  • Flexible navigation – Move items between sections/workspaces

🎨 Slack-Inspired Responsive UI

  • Desktop/Tablet – Persistent sidebar with workspaces and sections
  • Mobile – Collapsible drawer navigation
  • Adaptive layout – Automatically switches based on screen size
  • Light/Dark Theme – System-aware with manual override
  • Real-time updates – UI reflects changes instantly via Streams

πŸ‘₯ Multi-User Collaboration

  • Supabase Authentication – Secure email/password login
  • Row Level Security (RLS) – Data isolation between users
  • Workspace sharing – Invite members to collaborate
  • Role-based access – Owner/Member permissions

πŸ” Security & Privacy

  • JWT-based authentication with Supabase
  • Row Level Security (RLS) policies on all tables
  • Environment variables for sensitive configuration
  • Secure local storage for credentials

πŸ“± Smart Features

  • Real-time sync status – Visual indicators for sync state
  • Pull-to-refresh – Manual refresh on all lists
  • Empty states – Beautiful placeholders with CTAs
  • Loading indicators – Smooth UX during operations
  • Error handling – User-friendly error messages
  • Confirmation dialogs – Prevent accidental deletions

πŸ—οΈ Architecture

Clean Architecture + Feature-Based Structure + Offline-First
lib/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ di/                      # Dependency Injection (GetIt)
β”‚   β”œβ”€β”€ router/                  # GoRouter configuration
β”‚   └── theme/                   # AppTheme + AppColors (Light/Dark)
β”‚
β”œβ”€β”€ core/
β”‚   β”œβ”€β”€ constants/               # Env keys, DB constants
β”‚   β”œβ”€β”€ database/                # Drift database + DAOs + Tables
β”‚   β”‚   β”œβ”€β”€ daos/               # Data Access Objects
β”‚   β”‚   β”œβ”€β”€ tables/             # Table definitions
β”‚   β”‚   └── mappers/            # Entity ↔ Row mappers
β”‚   β”œβ”€β”€ services/               # Supabase service
β”‚   β”œβ”€β”€ sync/                   # PowerSync service + connector
β”‚   └── utils/                  # ID generator, validators
β”‚
β”œβ”€β”€ features/
β”‚   β”œβ”€β”€ auth/                   # Authentication (Login/Signup)
β”‚   β”‚   β”œβ”€β”€ data/              # Remote data source + repository
β”‚   β”‚   β”œβ”€β”€ domain/            # Entities + Use cases
β”‚   β”‚   └── presentation/      # Cubits + Pages
β”‚   β”‚
β”‚   β”œβ”€β”€ workspaces/            # Workspace management
β”‚   β”‚   β”œβ”€β”€ data/
β”‚   β”‚   β”œβ”€β”€ domain/
β”‚   β”‚   └── presentation/
β”‚   β”‚
β”‚   β”œβ”€β”€ sections/              # Section management
β”‚   β”œβ”€β”€ memory_boxes/          # Memory Box management
β”‚   └── notes/                 # Note CRUD + Editor
β”‚
β”œβ”€β”€ shared/
β”‚   β”œβ”€β”€ dialogs/               # Reusable dialogs
β”‚   └── widgets/               # Shared UI components
β”‚       β”œβ”€β”€ app_layout.dart    # Responsive layout (Sidebar/Drawer)
β”‚       └── app_sidebar.dart   # Slack-style sidebar
β”‚
└── main.dart                  # App entry + initialization

πŸ› οΈ Tech Stack

Technology Usage
Flutter Cross-platform UI framework
Dart Programming language
PowerSync Offline-first sync engine
Supabase Backend (Auth + Database + RLS)
Drift Type-safe SQLite ORM
Bloc / Cubit State management
GoRouter Declarative navigation
GetIt Dependency injection
flutter_dotenv Environment variables
Equatable Value equality
UUID Unique ID generation
Path Provider File system access

πŸš€ Getting Started

Prerequisites

  • Flutter SDK (3.11.5+)
  • Supabase account
  • PowerSync account
  • Android Studio / VS Code

Installation

# Clone the repository
git clone https://github.com/Mo7medRef3t/memory-chat.git

# Navigate to project
cd memory-chat

# Install dependencies
flutter pub get

# Generate Drift files
dart run build_runner build --delete-conflicting-outputs

# Create .env file
cp .env.example .env
# Add your Supabase and PowerSync credentials

# Run the app
flutter run

Environment Setup

Create a .env file in the root directory:

SUPABASE_URL=your_supabase_url
SUPABASE_ANON_KEY=your_supabase_anon_key
POWERSYNC_URL=your_powersync_url

πŸ—„οΈ Backend Setup

Supabase Configuration

  1. Create a Supabase project at supabase.com

  2. Create tables in SQL Editor:

-- Profiles table
CREATE TABLE profiles (
  id UUID PRIMARY KEY REFERENCES auth.users(id),
  email TEXT,
  full_name TEXT,
  avatar_url TEXT,
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

-- Workspaces table
CREATE TABLE workspaces (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  name TEXT NOT NULL,
  description TEXT,
  owner_id UUID REFERENCES profiles(id),
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

-- Workspace members table
CREATE TABLE workspace_members (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  workspace_id UUID REFERENCES workspaces(id) ON DELETE CASCADE,
  user_id UUID REFERENCES profiles(id),
  role TEXT DEFAULT 'member',
  joined_at TIMESTAMP DEFAULT NOW(),
  UNIQUE(workspace_id, user_id)
);

-- Sections table
CREATE TABLE sections (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  workspace_id UUID REFERENCES workspaces(id) ON DELETE CASCADE,
  title TEXT NOT NULL,
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

-- Memory boxes table
CREATE TABLE memory_boxes (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  workspace_id UUID REFERENCES workspaces(id) ON DELETE CASCADE,
  section_id UUID REFERENCES sections(id) ON DELETE SET NULL,
  title TEXT NOT NULL,
  description TEXT,
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

-- Notes table
CREATE TABLE notes (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  memory_box_id UUID REFERENCES memory_boxes(id) ON DELETE CASCADE,
  author_id UUID REFERENCES profiles(id),
  title TEXT NOT NULL,
  content TEXT,
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);
  1. Enable Row Level Security (RLS) and create policies:
-- Enable RLS on all tables
ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;
ALTER TABLE workspaces ENABLE ROW LEVEL SECURITY;
ALTER TABLE workspace_members ENABLE ROW LEVEL SECURITY;
ALTER TABLE sections ENABLE ROW LEVEL SECURITY;
ALTER TABLE memory_boxes ENABLE ROW LEVEL SECURITY;
ALTER TABLE notes ENABLE ROW LEVEL SECURITY;

-- Example policies for notes
CREATE POLICY "Users can view notes in their workspaces"
ON notes FOR SELECT
USING (
  memory_box_id IN (
    SELECT mb.id FROM memory_boxes mb
    WHERE mb.workspace_id IN (
      SELECT workspace_id FROM workspace_members
      WHERE user_id = auth.uid()
    )
  )
);

CREATE POLICY "Users can create notes in their workspaces"
ON notes FOR INSERT
WITH CHECK (
  memory_box_id IN (
    SELECT mb.id FROM memory_boxes mb
    WHERE mb.workspace_id IN (
      SELECT workspace_id FROM workspace_members
      WHERE user_id = auth.uid()
    )
  )
);

-- Add similar policies for UPDATE and DELETE

PowerSync Configuration

  1. Create a PowerSync instance at powersync.com

  2. Connect to Supabase in PowerSync dashboard

  3. Configure Sync Rules:

config:
  edition: 3

streams:
  user_data:
    auto_subscribe: true
    queries:
      - SELECT * FROM profiles
      - SELECT * FROM workspace_members
      - SELECT * FROM workspaces
      - SELECT * FROM sections
      - SELECT * FROM memory_boxes
      - SELECT * FROM notes
  1. Deploy sync rules

πŸ”„ Offline-First Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   UI Layer  β”‚
β”‚  (Flutter)  β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Cubits    β”‚
β”‚  (BLoC)     β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Repository  β”‚
β”‚   Layer     β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚      PowerSync Local Database       β”‚
β”‚      (SQLite via Drift ORM)         β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚                      β”‚
       β–Ό                      β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Upload    β”‚        β”‚  Download   β”‚
β”‚   Queue     β”‚        β”‚   Stream    β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜
       β”‚                      β”‚
       β–Ό                      β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚      Supabase Backend               β”‚
β”‚   (PostgreSQL + Auth + RLS)         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

How It Works:

  1. Write Operation: User creates/updates/deletes data
  2. Local Save: Data saved to PowerSync local SQLite instantly
  3. UI Update: UI reflects change immediately via Streams
  4. Upload Queue: Change added to upload queue
  5. Background Sync: PowerSync uploads to Supabase when online
  6. Download Stream: Changes from other devices sync down
  7. Conflict Resolution: PowerSync handles conflicts automatically

🎯 Key Technical Highlights

Offline-First Architecture

  • Local-first writes – All operations save locally first
  • Automatic sync – Background synchronization when online
  • Upload queue – Pending operations persist across app restarts
  • Conflict resolution – Automatic handling of concurrent edits
  • Zero data loss – Guaranteed delivery with retry logic

Real-time Synchronization

  • PowerSync integration – Bidirectional sync engine
  • Supabase Realtime – Instant updates across devices
  • Stream-based UI – Reactive updates via Dart Streams
  • Checkpoint management – Efficient delta sync

Type-Safe Database

  • Drift ORM – Compile-time SQL validation
  • Code generation – Type-safe queries and migrations
  • DAO pattern – Clean separation of data access logic
  • Entity mappers – Clean domain model separation

Responsive Design

  • Adaptive layout – Sidebar on desktop, drawer on mobile
  • Breakpoint-based – 600px threshold for mobile/desktop
  • Consistent UX – Same features across all screen sizes
  • Slack-inspired – Familiar navigation pattern

Security

  • Row Level Security – Database-level data isolation
  • JWT authentication – Secure token-based auth
  • Environment variables – No hardcoded secrets
  • RLS policies – Granular access control

Clean Architecture

  • Feature-based structure – Organized by business domain
  • Dependency injection – GetIt for loose coupling
  • Repository pattern – Abstract data sources
  • Use cases – Business logic separation
  • Testable code – Easy to unit test each layer

πŸ§ͺ Testing

Unit Tests

  • Repository layer tests
  • Use case tests
  • Entity mapper tests

Integration Tests

  • PowerSync sync tests
  • Supabase integration tests
  • Offline/online transition tests

Manual Testing Scenarios

  • βœ… Create workspace offline β†’ sync when online
  • βœ… Edit note on device A β†’ appears on device B
  • βœ… Delete section β†’ cascades to memory boxes and notes
  • βœ… Move memory box between sections
  • βœ… Multi-user collaboration with RLS

πŸ“Š Database Schema

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   profiles   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ id (PK)      β”‚
β”‚ email        β”‚
β”‚ full_name    β”‚
β”‚ avatar_url   β”‚
β”‚ created_at   β”‚
β”‚ updated_at   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β”‚ owner_id
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  workspaces  │◄──────│ workspace_members  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€       β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ id (PK)      β”‚       β”‚ id (PK)            β”‚
β”‚ name         β”‚       β”‚ workspace_id (FK)  β”‚
β”‚ description  β”‚       β”‚ user_id (FK)       β”‚
β”‚ owner_id(FK) β”‚       β”‚ role               β”‚
β”‚ created_at   β”‚       β”‚ joined_at          β”‚
β”‚ updated_at   β”‚       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β”‚ workspace_id
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   sections   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ id (PK)      β”‚
β”‚ workspace_id β”‚
β”‚ title        β”‚
β”‚ created_at   β”‚
β”‚ updated_at   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β”‚ section_id (nullable)
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ memory_boxes   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ id (PK)        β”‚
β”‚ workspace_id   β”‚
β”‚ section_id     β”‚
β”‚ title          β”‚
β”‚ description    β”‚
β”‚ created_at     β”‚
β”‚ updated_at     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β”‚ memory_box_id
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚    notes     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ id (PK)      β”‚
β”‚ memory_box_idβ”‚
β”‚ author_id    β”‚
β”‚ title        β”‚
β”‚ content      β”‚
β”‚ created_at   β”‚
β”‚ updated_at   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ”§ Development Commands

# Install dependencies
flutter pub get

# Generate Drift files
dart run build_runner build --delete-conflicting-outputs

# Watch mode for development
dart run build_runner watch --delete-conflicting-outputs

# Run tests
flutter test

# Build APK
flutter build apk --release

# Build iOS
flutter build ios --release

# Clean build
flutter clean
flutter pub get
dart run build_runner build --delete-conflicting-outputs

πŸ“± App Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Login  β”‚
β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜
     β”‚
     β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Workspaces   │◄───────┐
β”‚   List       β”‚        β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜        β”‚
       β”‚                β”‚
       β–Ό                β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”‚
β”‚  Workspace   β”‚        β”‚
β”‚   Details    β”‚        β”‚
β”‚ (Sections +  β”‚        β”‚
β”‚ Root Boxes)  β”‚        β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜        β”‚
       β”‚                β”‚
       β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
       β”‚                β”‚
       β–Ό                β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Section    β”‚  β”‚ Memory Box   β”‚
β”‚   Details    β”‚  β”‚   Details    β”‚
β”‚ (Boxes)      β”‚  β”‚  (Notes)     β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚                 β”‚
       β–Ό                 β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Memory Box   β”‚  β”‚    Notes     β”‚
β”‚   Details    β”‚  β”‚     List     β”‚
β”‚  (Notes)     β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜         β”‚
       β”‚                 β”‚
       β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                β”‚
                β–Ό
         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
         β”‚ Note Editor  β”‚
         β”‚ (Create/Edit)β”‚
         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

🎨 UI Components

Shared Widgets

  • AppLayout – Responsive layout (Sidebar/Drawer)
  • AppSidebar – Slack-style navigation sidebar
  • AppTextField – Styled text input
  • PrimaryButton – Reusable button component
  • LoadingIndicator – Loading spinner
  • EmptyStateCard – Empty state placeholder

Dialogs

  • CreateWorkspaceDialog
  • CreateSectionDialog
  • CreateMemoryBoxDialog
  • DeleteConfirmationDialog
  • EditMemoryBoxDialog
  • MoveMemoryBoxDialog

πŸš€ Future Enhancements

  • Rich text editor for notes (Markdown support)
  • File attachments in notes
  • Real-time collaboration (multi-user editing)
  • Search functionality across all content
  • Tags and labels for organization
  • Export notes to PDF/Markdown
  • Mobile widgets (iOS/Android)
  • Push notifications for mentions
  • Workspace templates
  • Import from Notion/Evernote

πŸ“„ License

This project is open source and available under the MIT License.


🀝 Contributing

Contributions, issues, and feature requests are welcome!

  1. Fork the project
  2. Create your feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

πŸ“§ Contact

Mohamed Refaat – @Mo7medRef3t

Project Link: https://github.com/Mo7medRef3t/memory-chat


Built with ❀️ using Flutter, PowerSync & Supabase

```

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors