2025-08-10 00:51:58 +02:00
|
|
|
# whiskr
|
2025-08-05 04:03:21 +02:00
|
|
|
|
2025-08-10 01:20:03 +02:00
|
|
|

|
|
|
|
|
2025-08-10 01:17:13 +02:00
|
|
|
whiskr is a private, self-hosted web chat interface for interacting with AI models via [OpenRouter](https://openrouter.ai/).
|
2025-08-05 04:03:21 +02:00
|
|
|
|
|
|
|
## Features
|
|
|
|
|
2025-08-10 01:19:23 +02:00
|
|
|
- Private and self-hosted (data stored in localStorage)
|
2025-08-10 01:17:13 +02:00
|
|
|
- Supports any model available on your OpenRouter account
|
|
|
|
- Real-time streaming responses
|
|
|
|
- Edit, delete, or copy any message
|
|
|
|
- Persistent settings for model, temperature, and other parameters
|
|
|
|
- Full conversation control including clearing and modifying messages
|
2025-08-10 18:23:01 +02:00
|
|
|
- Smooth UI updates with [morphdom](https://github.com/patrick-steele-idem/morphdom), selections, images, and other state are preserved during updates
|
|
|
|
- Easy model selection:
|
|
|
|
- Tags indicate if a model supports **tools**, **vision**, or **reasoning**
|
|
|
|
- Search field with fuzzy matching to quickly find models
|
|
|
|
- Models are listed newest -> oldest
|
2025-08-10 22:32:40 +02:00
|
|
|
- Reasoning effort control
|
2025-08-14 17:15:33 +02:00
|
|
|
- Web search tools (set the `EXA_TOKEN` to enable):
|
|
|
|
- `search_web`: search via Exa in auto mode; returns up to 10 results with short summaries
|
|
|
|
- `fetch_contents`: fetch page contents for one or more URLs via Exa /contents
|
2025-08-11 00:15:58 +02:00
|
|
|
- Structured JSON output
|
2025-08-11 15:43:00 +02:00
|
|
|
- Statistics for messages (provider, ttft, tps and token count)
|
2025-08-10 01:17:13 +02:00
|
|
|
|
|
|
|
## TODO
|
|
|
|
|
2025-08-10 18:27:43 +02:00
|
|
|
- Retry button for assistant messages
|
2025-08-10 01:17:13 +02:00
|
|
|
- Import and export of chats
|
2025-08-10 18:27:43 +02:00
|
|
|
- Image and file attachments
|
2025-08-10 01:17:13 +02:00
|
|
|
|
|
|
|
## Built With
|
|
|
|
|
|
|
|
**Frontend**
|
|
|
|
- Vanilla JavaScript and CSS
|
2025-08-10 18:23:01 +02:00
|
|
|
- [morphdom](https://github.com/patrick-steele-idem/morphdom) for DOM diffing without losing state
|
2025-08-10 01:17:13 +02:00
|
|
|
- [marked](https://github.com/markedjs/marked) for Markdown rendering
|
|
|
|
- [highlight.js](https://highlightjs.org/) for syntax highlighting
|
|
|
|
- Fonts: [Inter](https://rsms.me/inter/) (UI), [Comic Code](https://tosche.net/fonts/comic-code) (code)
|
|
|
|
- Icons: [SVGRepo](https://www.svgrepo.com/)
|
|
|
|
- Color palette: [Catppuccin Macchiato](https://catppuccin.com/)
|
|
|
|
|
|
|
|
**Backend**
|
|
|
|
- Go
|
2025-08-10 16:02:03 +02:00
|
|
|
- [OpenRouter](https://openrouter.ai/) for model list and completions
|
2025-08-14 17:15:33 +02:00
|
|
|
- [Exa](https://exa.ai/) for web search and content retrieval (`/search`, `/contents`)
|
2025-08-05 04:03:21 +02:00
|
|
|
|
|
|
|
## Getting Started
|
|
|
|
|
2025-08-10 01:17:13 +02:00
|
|
|
1. Copy `.example.env` to `.env` and set `OPENROUTER_TOKEN`:
|
2025-08-05 04:03:21 +02:00
|
|
|
```bash
|
|
|
|
cp .example.env .env
|
|
|
|
```
|
2025-08-10 01:17:13 +02:00
|
|
|
2. Build and run:
|
2025-08-05 04:03:21 +02:00
|
|
|
```bash
|
2025-08-10 01:17:13 +02:00
|
|
|
go build -o whiskr
|
|
|
|
./whiskr
|
2025-08-05 04:03:21 +02:00
|
|
|
```
|
2025-08-10 01:17:13 +02:00
|
|
|
3. Open `http://localhost:3443` in your browser.
|
2025-08-05 04:03:21 +02:00
|
|
|
|
|
|
|
## Usage
|
|
|
|
|
2025-08-10 01:17:13 +02:00
|
|
|
- Send a message with `Ctrl+Enter` or the send button
|
2025-08-10 16:02:48 +02:00
|
|
|
- Just add a message with the add button
|
2025-08-10 01:17:13 +02:00
|
|
|
- Hover over a message to edit, delete, or copy it
|
|
|
|
- Adjust model, temperature, prompt, or message role from the controls in the bottom-left
|
2025-08-10 18:23:01 +02:00
|
|
|
- Use the model search field to quickly find models (supports fuzzy matching)
|
|
|
|
- Look for tags in the model list to see if a model supports tools, vision, or reasoning
|
2025-08-10 01:17:13 +02:00
|
|
|
|
|
|
|
## License
|
|
|
|
|
|
|
|
GPL-3.0 see [LICENSE](LICENSE) for details.
|