A non-linear chat application that visualizes conversations as branching "Rivers." Explore different conversational paths simultaneously, manage multiple AI models, and interact with chat history in an intuitive, graph-based interface.
roadmap
- fix model selection
- add auth + storage
- add a credits system for people who dont want to enter their own api keys
- they can just pay for credits
- stripe integration
- resizeable nodes
- fix keyboard shortcuts
- clean up vibe coded code
- add a way to export and import
- multiplayer??? (can firebase realtime db do this?)
- summaries and other ai shit
- fix design to look less ai sloppy
- chat history modal sucks
- font sucks
- too many emojis
- new logo
- Branching Dialogue: Create multiple conversation paths from any point
- Graph Visualization: See your entire conversation tree at a glance using Vue Flow
- Context-Aware: Each branch maintains its own conversation history
- OpenAI: GPT-4o, GPT-4 Turbo, GPT-4o Mini
- Anthropic: Claude 3.5 Sonnet, Claude 3.5 Haiku, Claude 3 Opus
- Google: Gemini 2.0 Flash, Gemini Exp 1206, Gemini 1.5 Pro
- Streaming Responses: Real-time token streaming for all providers
- Glassmorphism Design: Frosted glass overlays with backdrop blur
- Dark/Light Themes: Seamlessly switch between themes
- Responsive Layout: Works on desktop and tablet devices
- Smooth Animations: Polished transitions and interactions
- Local-First Architecture: All data stored in browser localStorage
- No Server Required: API keys never leave your browser
- Client-Side Only: Direct communication with LLM providers
- Keyboard Shortcuts: Quick access to common actions
- Context Menus: Right-click nodes for quick actions
- River Management: Create, rename, and organize multiple conversations
- Search: Find messages across your conversation tree
- Copy Messages: Easy clipboard integration
- Node.js 18+
- npm or yarn
- API keys from at least one provider (OpenAI, Anthropic, or Google)
-
Clone the repository
git clone https://github.com/yourusername/riverchat.git cd riverchat -
Install dependencies
npm install
-
Start development server
npm run dev
-
Open in browser
http://localhost:5173
npm run build
npm run preview- On first launch, you'll see the Welcome modal
- Enter at least one API key for OpenAI, Anthropic, or Google
- Your keys are stored securely in browser localStorage
- Click "Get Started" to begin
- Click the "๐ Rivers" button in the top navigation
- Enter a name for your conversation
- Click "+ New River"
- Start chatting!
- Left-Click Node: Select and view conversation path
- Double-Click Node: View full message content
- Right-Click Node: Open context menu with actions:
- ๐ฟ Branch From Here
- ๐ Regenerate Response (AI nodes)
- โ๏ธ Edit & Resubmit (User nodes)
- ๐ Copy Message
- ๐๏ธ View Full Message
- ๐๏ธ Delete Branch
Ctrl+K/Cmd+K: Open Rivers dashboardCtrl+,/Cmd+,: Open SettingsCtrl+F/Cmd+F: Search (coming soon)Ctrl+Enter/Cmd+Enter: Send messageEscape: Close modals
riverchat/
โโโ src/
โ โโโ assets/
โ โ โโโ glassmorphism.css # Theme styles
โ โโโ components/
โ โ โโโ ChatHistory.vue # Linear chat view
โ โ โโโ ConfirmationModal.vue # Confirmation dialogs
โ โ โโโ CustomNode.vue # Graph node component
โ โ โโโ GraphCanvas.vue # Vue Flow canvas
โ โ โโโ MessageViewerModal.vue # Full message viewer
โ โ โโโ RiverDashboard.vue # River management
โ โ โโโ SettingsModal.vue # Settings interface
โ โ โโโ WelcomeModal.vue # First-time setup
โ โโโ composables/
โ โ โโโ useRiverChat.ts # Main state management
โ โโโ services/
โ โ โโโ llm-api.ts # LLM provider integration
โ โ โโโ storage.ts # localStorage manager
โ โโโ types/
โ โ โโโ index.ts # TypeScript types
โ โโโ App.vue # Main app component
โ โโโ main.ts # Entry point
โ โโโ style.css # Global styles
โโโ package.json
โโโ vite.config.ts
- Vue 3: Composition API with
<script setup> - TypeScript: Full type safety
- Vue Flow: Graph visualization
- Vite: Build tool and dev server
- localStorage: Client-side persistence
interface River {
id: string;
name: string;
createdAt: string;
lastModified: string;
nodes: Record<string, MessageNode>;
rootNodeId: string | null;
}
interface MessageNode {
id: string;
type: 'user' | 'ai';
content: string;
timestamp: number;
parentId: string | null;
state: 'complete' | 'generating' | 'error';
model?: LLMModel;
error?: string;
}- Advanced search with filters
- Export conversations (JSON, Markdown)
- Import conversations
- Custom node colors and tags
- Conversation statistics
- More keyboard shortcuts
- User authentication (OAuth)
- Cloud storage sync (Firestore/MongoDB)
- Multi-device access
- Conversation sharing
- Collaboration features
- Framework: Vue 3.5+ with Composition API
- Language: TypeScript 5.9+
- Build Tool: Vite 7.1+
- Graph Library: Vue Flow
- Styling: Custom CSS with glassmorphism theme
- Functional and declarative patterns
- TypeScript strict mode
- Modular component architecture
- Descriptive variable names
- Comprehensive type definitions
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is open source and available under the MIT License.
- Vue Flow for the excellent graph visualization library
- Vue.js for the reactive framework
- OpenAI, Anthropic, and Google for their LLM APIs
If you have any questions or run into issues, please open an issue on GitHub.
Built with โค๏ธ using Vue and TypeScript