1
0
mirror of https://github.com/coalaura/whiskr.git synced 2025-09-08 00:29:54 +00:00
2025-08-30 14:13:24 +02:00
2025-08-26 00:22:32 +02:00
2025-08-26 00:22:32 +02:00
2025-08-28 20:17:21 +02:00
2025-08-30 14:13:24 +02:00
2025-08-25 22:45:03 +02:00
2025-08-16 17:18:48 +02:00
2025-08-30 00:25:48 +02:00
2025-08-26 03:04:54 +02:00
2025-08-29 22:55:41 +02:00
2025-08-29 22:55:41 +02:00
2025-08-28 14:46:28 +02:00
2025-08-25 22:45:03 +02:00
2025-08-29 22:55:41 +02:00
2025-08-29 22:55:41 +02:00
2025-08-29 22:55:41 +02:00
2025-08-05 03:56:23 +02:00
2025-08-05 03:58:57 +02:00
2025-08-29 22:55:41 +02:00
2025-08-29 22:55:41 +02:00
2025-08-25 22:45:03 +02:00
2025-08-29 22:55:41 +02:00
2025-08-28 16:37:48 +02:00
2025-08-28 14:46:28 +02:00
2025-08-11 15:43:00 +02:00
2025-08-29 19:26:55 +02:00
2025-08-25 22:45:03 +02:00
2025-08-16 17:38:35 +02:00

whiskr

screenshot

whiskr is a private, self-hosted web chat interface for interacting with AI models via OpenRouter.

Features

  • Private and self-hosted (data stored in localStorage)
  • 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
  • Title generation (and refresh)
  • Smooth UI updates with 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
  • Web search tools (set the tokens.exa 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
    • github_repository: get a quick overview of a GitHub repository (repo info, up to 20 branches, top-level files/dirs, and the README) without cloning (optionally set tokens.github for higher rate limits and private repos)
  • Images attachments for vision models using simple markdown image tags
  • Text/Code file attachments
  • Reasoning effort control
  • Structured JSON output
  • Statistics for messages (provider, ttft, tps, token count and cost)
  • Import and export of chats as JSON files
  • Authentication (optional)

TODO

  • improved custom prompts
  • settings
    • auto-retry on edit
    • ctrl+enter vs enter for sending
  • multiple chats

Built With

Frontend

Backend

  • Go
  • chi/v5 for the http routing/server
  • OpenRouter for model list and completions
  • Exa for web search and content retrieval (/search, /contents)

Getting Started

  1. Copy example.config.yml to config.yml and set tokens.openrouter:
cp example.config.yml config.yml
  1. Build and run:
go build -o whiskr
./whiskr
  1. Open http://localhost:3443 in your browser.

Authentication (optional)

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.

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.

Nginx (optional)

When running behind a reverse proxy like nginx, you can have the proxy serve static files.

server {
    listen 443 ssl;
    server_name chat.example.com;
    http2 on;

    root /path/to/whiskr/static;

    location / {
        index index.html index.htm;

        etag on;
        add_header Cache-Control "public, max-age=2592000, must-revalidate";
        expires 30d;
    }

    location ~ ^/- {
        proxy_pass       http://127.0.0.1:3443;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host            $host;
    }

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
}

Usage

  • Send a message with Ctrl+Enter or the send button
  • Just add a message with the add button
  • Hover over a message to edit, delete, or copy it
  • Adjust model, temperature, prompt, or message role from the controls in the bottom-left
  • 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
  • Use ![alt](url) 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.

License

GPL-3.0 see LICENSE for details.

Description
Minimal LLM chat UI using OpenRouter giving you control over your context.
Readme GPL-3.0 2.9 MiB
Languages
JavaScript 41%
Go 35.9%
CSS 19.5%
HTML 3.6%