1
0
mirror of https://github.com/coalaura/whiskr.git synced 2025-09-04 23:25:16 +00:00
2025-09-04 17:15:38 +02:00
2025-08-26 00:22:32 +02:00
2025-08-31 23:12:10 +02:00
2025-08-28 20:17:21 +02:00
2025-09-04 17:15:38 +02:00
2025-08-25 22:45:03 +02:00
2025-08-16 17:18:48 +02:00
2025-08-31 23:46:22 +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-31 23:46:22 +02:00
2025-08-25 22:45:03 +02:00
2025-08-31 23:46:22 +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-31 23:46:22 +02:00
2025-08-31 23:14:35 +02:00
2025-08-31 23:46:22 +02:00
2025-08-11 15:43:00 +02:00
2025-08-31 23:46:22 +02:00
2025-08-31 23:46:22 +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

Core Functionality

  • Private & Self-Hosted: All your data is stored in localStorage.
  • Broad Model Support: Use any model available on your OpenRouter account.
  • Real-time Responses: Get streaming responses from models as they are generated.
  • Persistent Settings: Your chosen model, temperature, and other parameters are saved between sessions.
  • Authentication: Optional user/password authentication for added security.

Conversation Control

  • Full Message Control: Edit, delete, or copy any message in the conversation.
  • Collapse/Expand Messages: Collapse large messages to keep your chat history tidy.
  • Retry & Regenerate: Easily retry assistant responses or regenerate from any point in the conversation.
  • Title Generation: Automatically generate (and refresh) a title for your chat.
  • Import & Export: Save and load entire chats as local JSON files.

Rich UI & UX

  • File Attachments: Attach text, code, or images to your messages for vision-enabled models.
  • Reasoning & Transparency:
    • View the model's thought process and tool usage in an expandable "Reasoning" section.
    • See detailed statistics for each message: provider, time-to-first-token, tokens-per-second, token count, and cost.
    • Keep track of the total cost for the entire conversation.
  • Advanced Model Search:
    • Tags indicate if a model supports tools, vision, or reasoning.
    • Fuzzy matching helps you quickly find the exact model you need.
  • Smooth Interface: Built with morphdom to ensure UI updates don't lose your selections, scroll position, or focus.

Powerful Integrated Tools

  • search_web: Search the web via Exa; returns up to 12 results with short summaries.
  • fetch_contents: Fetch and summarize the contents of one or more URLs.
  • github_repository: Get a comprehensive overview of a GitHub repository. The tool returns:
    • Core info (URL, description, stars, forks).
    • A list of top-level files and directories.
    • The full content of the repository's README file.

TODO

  • restrict model list (optionally allow all for authenticated users)
  • make authentication optional (unless no allowed models)
  • 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.
  • Hover over a message to reveal controls to edit, delete, copy, collapse, or retry.
  • Click "Reasoning" on an assistant message to view the model's thought process or tool usage.
  • Adjust model, temperature, prompt, or message role from the controls in the bottom-left.
  • Attach images using markdown syntax (![alt](url)) or upload text/code files with the attachment button.
  • Use the buttons in the top-right to import/export the chat or clear all messages.

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%