[![License](https://img.shields.io/badge/License-BSD%202--Clause-blue.svg)](https://opensource.org/licenses/BSD-2-Clause) [![NPM version](https://img.shields.io/npm/v/quikchat.svg?style=flat-square)](https://www.npmjs.com/package/quikchat) ![CI](https://github.com/deftio/quikchat/actions/workflows/ci.yml/badge.svg)

# QuikChat

> Zero-dependency JavaScript chat widget for modern web applications

QuikChat is a lightweight, highly customizable chat interface that integrates seamlessly with any web project. Built with vanilla JavaScript, it provides powerful features for LLM applications, real-time chat, and interactive messaging experiences.

**🚀 [Live Demo](https://deftio.github.io/quikchat/examples/example_umd.html) | 📚 [API Reference](docs/API-REFERENCE.md) | 🛠 [Developer Guide](docs/DEVELOPER-GUIDE.md)**



## ✨ Key Features

- **🚫 Zero Dependencies** - Pure vanilla JavaScript, no frameworks required
- **🎨 Fully Customizable** - Complete CSS theming system with multi-instance support
- **🤖 LLM Ready** - Built-in support for OpenAI, Anthropic, Ollama, and streaming responses
- **📱 Responsive Design** - Adapts to any screen size and container dimensions
- **⚡ High Performance** - Virtual scrolling for large message volumes
- **👁 Advanced Visibility** - Individual and group-based message control (v1.1.13+)
- **🏷 Tagged Messages** - Powerful tagging system for message organization (v1.1.14+)
- **💾 Full History Control** - Save, load, and restore complete chat sessions
- **🔧 Developer Friendly** - TypeScript-ready with comprehensive API



## 🚀 Quick Start

Get a working chat interface in under 60 seconds:

### Via CDN
```html
<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="https://unpkg.com/quikchat/dist/quikchat.css">
</head>
<body>
    <div id="chat" style="width: 100%; height: 400px;"></div>
    
    <script src="https://unpkg.com/quikchat"></script>
    <script>
        const chat = new quikchat('#chat', (instance, message) => {
            // Echo user message
            instance.messageAddNew(message, 'You', 'right');
            
            // Add bot response
            setTimeout(() => {
                instance.messageAddNew('Thanks for your message!', 'Bot', 'left');
            }, 1000);
        });
        
        // Add welcome message
        chat.messageAddNew('Hello! How can I help you today?', 'Bot', 'left');
    </script>
</body>
</html>
```

### Via NPM
```bash
npm install quikchat
```

```javascript
import quikchat from 'quikchat';
import 'quikchat/dist/quikchat.css';

const chat = new quikchat('#chat-container', (instance, message) => {
    // Your message handling logic
    console.log('User said:', message);
});
```



## 📦 Installation Options

### NPM Package
```bash
npm install quikchat
```

### CDN (Latest Version)
```html
<!-- CSS -->
<link rel="stylesheet" href="https://unpkg.com/quikchat/dist/quikchat.css">

<!-- JavaScript -->
<script src="https://unpkg.com/quikchat"></script>
```

### Direct Download
Download the latest release from [GitHub Releases](https://github.com/deftio/quikchat/releases)



**[📖 View Full Release Notes](docs/release-notes.md)**

### 🔔 Enhanced Message Callbacks
Track message modifications for streaming and real-time updates:

```javascript
// Track streaming content as it arrives
chat.setCallbackonMessageAppend((instance, msgId, content) => {
  console.log(`Streaming: ${content} added to message ${msgId}`);
});

// Monitor message edits
chat.setCallbackonMessageReplace((instance, msgId, newContent) => {
  console.log(`Message ${msgId} updated`);
});

// Track deletions
chat.setCallbackonMessageDelete((instance, msgId) => {
  console.log(`Message ${msgId} deleted`);
});
```

### 📚 Powerful History Management
Efficiently handle large chat histories with pagination and search:

```javascript
// Paginated history retrieval
const page = chat.historyGetPage(1, 20, 'desc'); // Get newest 20 messages
console.log(page.messages);
console.log(page.pagination.hasNext); // Check if more pages exist

// Search through history
const results = chat.historySearch({ 
  text: 'error',
  userString: 'Support',
  limit: 50 
});

// Get history metadata
const info = chat.historyGetInfo();
console.log(`Total messages: ${info.totalMessages}`);
console.log(`Memory used: ${info.memoryUsage.estimatedSize} bytes`);
```




## 🎨 Theming & Customization

QuikChat includes beautiful built-in themes and supports complete customization:

```javascript
// Use built-in themes
const chat = new quikchat('#chat', handler, {
    theme: 'quikchat-theme-dark' // or 'quikchat-theme-light'
});

// Switch themes dynamically
chat.changeTheme('quikchat-theme-light');
```

### Custom Themes
Create your own themes with CSS:

```css
.my-custom-theme {
    border: 2px solid #3b82f6;
    border-radius: 12px;
    font-family: 'SF Pro Display', sans-serif;
}

.my-custom-theme .quikchat-message-content {
    border-radius: 18px;
    padding: 12px 16px;
}

/* Apply to chat */
const chat = new quikchat('#chat', handler, {
    theme: 'my-custom-theme'
});
```

**📖 [Complete Theming Guide](docs/DEVELOPER-GUIDE.md#theming-guide)**



## 🤖 LLM Integration Examples

### OpenAI Integration
```javascript
async function handleMessage(chat, message) {
    chat.messageAddNew(message, 'You', 'right');
    
    const response = await fetch('https://api.openai.com/v1/chat/completions', {
        method: 'POST',
        headers: {
            'Authorization': `Bearer ${API_KEY}`,
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
            model: 'gpt-4',
            messages: formatChatHistory(chat.historyGetAllCopy(), message)
        })
    });
    
    const data = await response.json();
    chat.messageAddNew(data.choices[0].message.content, 'Assistant', 'left');
}
```

### Streaming Responses
```javascript
// Create message for streaming
const botMsgId = chat.messageAddNew('', 'Bot', 'left');

// Append content as it arrives
streamingAPI.onChunk(chunk => {
    chat.messageAppendContent(botMsgId, chunk);
});
```

**🛠 [Complete LLM Integration Guide](docs/DEVELOPER-GUIDE.md#llm-integration-best-practices)**



## 🏗 Framework Integration

### React
```jsx
function ChatComponent() {
    const chatRef = useRef(null);
    const instanceRef = useRef(null);
    
    useEffect(() => {
        instanceRef.current = new quikchat(chatRef.current, handleMessage);
    }, []);
    
    return <div ref={chatRef} style={{ height: '400px' }} />;
}
```

### Vue
```vue
<template>
    <div ref="chatContainer" class="chat-container"></div>
</template>

<script>
import quikchat from 'quikchat';

export default {
    mounted() {
        this.chat = new quikchat(this.$refs.chatContainer, this.handleMessage);
    }
}
</script>
```

**⚛️ [Framework Integration Examples](docs/DEVELOPER-GUIDE.md#frontend-framework-integration)**



## 📖 Documentation

| Document | Description |
|-|-|
| **[API Reference](docs/API-REFERENCE.md)** | Complete technical reference for all methods and options |
| **[Developer Guide](docs/DEVELOPER-GUIDE.md)** | Practical recipes and advanced patterns |
| **[Examples](examples/)** | Working code examples and demos |
| **[Live Demo](https://deftio.github.io/quikchat/examples/)** | Interactive examples and showcase |



## 🌟 Examples & Demos

- **[Basic Chat](https://deftio.github.io/quikchat/examples/example_umd.html)** - Simple chat interface
- **[LLM Integration](examples/openai.html)** - OpenAI GPT integration
- **[Multi-Instance](examples/dual-chatrooms.html)** - Multiple chats on one page
- **[Visibility Controls](examples/hidden_message.html)** - Message visibility features
- **[Theme Showcase](https://deftio.github.io/quikchat/examples/)** - Light and dark themes
- **[React Integration](examples/quikchat-react.html)** - React component example
- **[Backend Examples](examples/)** - FastAPI and Node.js backends

**📂 [Browse All Examples](examples/index.html)**



## 🚀 Performance

QuikChat is built for production use:

- **Lightweight**: ~25KB minified + gzipped
- **Fast**: Sub-millisecond message rendering
- **Scalable**: Tested with 10,000 messages rendering in 38ms with virtual scrolling
- **Memory Efficient**: Only renders visible messages in viewport

**📊 [Virtual Scrolling Technical Details](docs/virtual_scrolling.md) | [Performance Guide](docs/DEVELOPER-GUIDE.md#performance-optimization)**



## 🛠 Building from Source

```bash
# Clone repository
git clone https://github.com/deftio/quikchat.git
cd quikchat

# Install dependencies
npm install

# Build for production
npm run build

# Run tests
npm test

# Start development server
npm run dev
```

**Requirements**: Node.js 14+ and npm 6+



## 🤝 Contributing

We welcome contributions! Here's how you can help:

1. **🐛 Report Issues** - Found a bug? [Open an issue](https://github.com/deftio/quikchat/issues)
2. **💡 Feature Requests** - Have an idea? We'd love to hear it
3. **🔧 Code Contributions** - Submit pull requests for bug fixes or new features
4. **📖 Documentation** - Help improve our guides and examples
5. **🌟 Share Examples** - Show us what you've built with QuikChat

### Development Setup
```bash
git clone https://github.com/deftio/quikchat.git
cd quikchat
npm install
npm run dev
```

**📋 [Contributing Guidelines](CONTRIBUTING.md)**



## 📄 License

QuikChat is licensed under the [BSD-2-Clause License](LICENSE.txt).



## 🔗 Links

- **📦 [NPM Package](https://www.npmjs.com/package/quikchat)**
- **🐙 [GitHub Repository](https://github.com/deftio/quikchat)**
- **🚀 [Live Examples](https://deftio.github.io/quikchat/examples/)**
- **📖 [Medium Article](https://medium.com/gitconnected/quikchat-4be8d4a849e5)**
- **💬 [Issues & Support](https://github.com/deftio/quikchat/issues)**

