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-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-18 03:47:37 +02:00
- Images attachments for vision models using simple markdown image tags
- Text/Code file attachments
- Reasoning effort control
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-16 14:54:41 +02:00
- Import and export of chats as JSON files
2025-08-16 17:18:48 +02:00
- Authentication (optional)
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
2025-08-16 17:23:08 +02:00
- 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
- [OpenRouter ](https://openrouter.ai/ ) for model list and completions
- [Exa ](https://exa.ai/ ) for web search and content retrieval (`/search` , `/contents` )
## Getting Started
1. Copy `example.config.yml` to `config.yml` and set `tokens.openrouter` :
```bash
cp example.config.yml config.yml
```
2. Build and run:
```bash
go build -o whiskr
./whiskr
```
3. Open `http://localhost:3443` in your browser.
## Authentication (optional)
2025-08-16 17:23:55 +02:00
whiskr supports simple, stateless authentication. If enabled, users must log in with a username and password before accessing the chat. Passwords are hashed using bcrypt (12 rounds). If `authentication.enabled` is set to `false` , whiskr will not prompt for authentication at all.
2025-08-16 17:23:08 +02:00
```yaml
authentication:
enabled: true
users:
- username: laura
password: "$2a$12$cIvFwVDqzn18wyk37l4b2OA0UyjLYP1GdRIMYbNqvm1uPlQjC/j6e"
- username: admin
password: "$2a$12$mhImN70h05wnqPxWTci8I.RzomQt9vyLrjWN9ilaV1.GIghcGq.Iy"
```
After a successful login, whiskr issues a signed (HMAC-SHA256) token, using the server secret (`tokens.secret` in `config.yml` ). This is stored as a cookie and re-used for future authentications.
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-15 03:38:24 +02:00
- Use `` in your message to display an image inline. If the model supports vision, the same image URL is passed to the model for multimodal input.
2025-08-10 01:17:13 +02:00
## License
GPL-3.0 see [LICENSE ](LICENSE ) for details.