eneskaraosman/swiftychat
---
Why SwiftyChat?
- 11 built-in message types — text, image, video, location, carousel, quick replies, link previews, contacts, loading indicators, and more
- 8 pre-built themes with full style customization via SwiftUI environment
- Cross-platform — iOS 17+ and macOS 14+ from a single codebase
- High performance — O(n) complexity, cached formatters, async image loading
- Chatbot-ready — carousels, quick replies, and loading states designed for AI/bot interfaces
- Lightweight — just 2 dependencies (Kingfisher + SwiftUIEKtensions)
- Custom message cells for any type you need
- Landscape orientation support with auto-scaling cells
- User avatars with configurable positioning
- Keyboard dismiss on tap and scroll
- Scroll to bottom or to a specific message
- Picture-in-Picture video playback
- Per-corner rounding on text bubbles
- Multiline input bar (BasicInputView)
- Attributed string / markdown support
Preview
| Light | Dark | Theme Showcase | |:---:|:---:|:---:| | <img src="Sources/SwiftyChat/Demo/Preview/basic-1.png" width="220" alt="Light mode chat demo"/> | <img src="Sources/SwiftyChat/Demo/Preview/basic-2.png" width="220" alt="Dark mode chat demo"/> | <img src="Sources/SwiftyChat/Demo/Preview/theme-showcase.png" width="220" alt="Theme showcase with carousel and map"/> |
<details> <summary>More screenshots</summary>
| Advanced Features | Theme (Dark) | Chatbot Demo | |:---:|:---:|:---:| | <img src="Sources/SwiftyChat/Demo/Preview/advanced-features.png" width="220" alt="Advanced features with link preview"/> | <img src="Sources/SwiftyChat/Demo/Preview/theme-showcase-dark.png" width="220" alt="Theme showcase in dark mode"/> | <img src="Sources/SwiftyChat/Demo/Preview/chatbot-demo.png" width="220" alt="Chatbot demo with quick replies"/> |
</details>
Installation
Swift Package Manager
Add SwiftyChat in Xcode via File → Add Package Dependencies:
https://github.com/EnesKaraosman/SwiftyChat.gitOr add it to your Package.swift:
dependencies: [
.package(url: "https://github.com/EnesKaraosman/SwiftyChat.git", from: "4.1.1")
]Quick Start
import SwiftyChat
struct ContentView: View {
@State private var messages: [YourMessage] = []
@State private var message = ""
@State private var scrollToBottom = false
var body: some View {
ChatView(messages: $messages, scrollToBottom: $scrollToBottom) {
BasicInputView(
message: $message,
placeholder: "Type something",
onCommit: { messageKind in
messages.append(/* your message */)
}
)
}
.environment(\.chatStyle, ChatMessageCellStyle())
}
}
YourMessagemust conform to theChatMessageprotocol (which has an associatedChatUsertype). See the SwiftyChatDemo app for a complete implementation.
Message Kinds
public enum ChatMessageKind: CustomStringConvertible {
case text(String) // Auto-scales for emoji-only messages
case image(ImageLoadingKind) // Local (UIImage/NSImage) or remote (URL)
case imageText(ImageLoadingKind, String) // Image with caption
case location(LocationItem) // MapKit pin
case contact(ContactItem) // Shareable contact card
case quickReply([QuickReplyItem]) // Tappable options, auto-disables after selection
case carousel([CarouselItem]) // Scrollable cards with buttons
case video(VideoItem) // Video with PiP support
case linkPreview(LinkPreviewItem) // Rich URL preview with Open Graph metadata
case loading // Animated loading indicator
case custom(Any) // Your own message type
}Customization
Input View
A built-in BasicInputView is included. Use it as-is, or build your own — ChatView accepts any view via its inputView closure.
Styling
Every visual aspect is customizable through ChatMessageCellStyle — text styles, edge insets, avatar styles, and cell styles for every message type. Inject via .environment(\.chatStyle, yourStyle). All properties have sensible defaults.
See Styles.md for the full style reference and CustomMessage.md for custom cell types.
Pre-built Themes
| Theme | Description | |-------|-------------| | Modern | Clean blue, minimal design | | Classic | Traditional green messaging | | Dark Neon | Cyberpunk with neon pink accents | | Minimal | Subtle gray tones | | Ocean | Calming teal, sea-inspired | | Sunset | Warm orange gradients | | Nature | Fresh green, eco-friendly | | Lavender | Soft purple, relaxing |
See ThemeShowcaseView in the SwiftyChatDemo app for live demos.
AI & Chatbot Use Case
SwiftyChat is especially well-suited for AI and chatbot interfaces. Built-in support for carousels, quick reply buttons, loading indicators, and link previews means you can build a rich conversational UI without custom cells:
// Show a loading indicator while the AI responds
messages.append(Message(user: bot, messageKind: .loading))
// Replace with the actual response
messages[messages.count - 1] = Message(
user: bot,
messageKind: .text("Here's what I found...")
)
// Offer follow-up options as quick replies
messages.append(Message(
user: bot,
messageKind: .quickReply([
QuickReplyItem(title: "Tell me more"),
QuickReplyItem(title: "Something else"),
])
))Building a ChatGPT-style app, a customer support bot, or an in-app assistant? SwiftyChat gives you the UI layer so you can focus on the AI logic.
Contributing
Contributions are welcome! Whether it's a bug fix, new feature, documentation improvement, or a new theme — we'd love your help.
See CONTRIBUTING.md for guidelines.
Acknowledgments
Inspired by MessageKit (UIKit) and Nio (SwiftUI).
License
SwiftyChat is available under the Apache 2.0 license. See the LICENSE file for details.
Package Metadata
Repository: eneskaraosman/swiftychat
Default branch: master
README: README.md