Skip to content
This repository was archived by the owner on Jul 17, 2026. It is now read-only.

Latest commit

 

History

80 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

#+TITLE: stoneChat
#+AUTHOR: WaterRun

[[file:SAMPLE.bmp]]


stoneChat is a small LLM web chat for Windows XP-era machines and IE6.

#+begin_quote
"a caveman peeking at modern technology"
#+end_quote

* Requirements

stoneChat runs on Windows only. It is built for old Windows machines
(Windows XP + Internet Explorer 6) and relies on Windows-specific
helpers such as stunnel and WScript.Shell. PHP 5.4 or newer is
required. The launcher uses PHP's built-in web server:

#+begin_src bat
php -S
#+end_src

For Windows XP, use this PHP 5.4 build:

https://windows.php.net/downloads/releases/archives/php-5.4.45-Win32-VC9-x86.zip

stunnel is also required. It provides the HTTPS layer for old Windows
systems. Install it normally, or extract the package and set
~[paths] stunnel~ in ~CONF.ini~ to its ~bin\stunnel.exe~.

For Windows XP, use this stunnel build:

https://www.stunnel.org/archive/5.x/stunnel-5.26-installer.exe

No proxy, hosts-file edit, or manual stunnel startup is required. On the
first HTTPS request stoneChat starts stunnel in the background and generates
an SNI- and hostname-verifying configuration for the selected API host.

* Configuration

Copy the sample config:

#+begin_src text
CONF_SMP.INI -> CONF.ini
#+end_src

Then edit ~CONF.ini~ with Notepad. The file is heavily commented; the
comments are meant to be read from top to bottom.

Inside stoneChat, the ~Edit config~ button opens the same configuration
page. On Windows it first asks Notepad to open ~CONF.ini~. Save the file
there, return to stoneChat, then click ~Reload config~. If Notepad cannot
be started from PHP, the page still shows a plain web editor fallback.

Important sections:

| Section      | Purpose                                      |
|--------------+----------------------------------------------|
| ~[auth]~     | Brute-force lockout and session cookie name  |
| ~[User NAME]~ | Login user, password, and rights            |
| ~[Model NAME]~ | One complete usable LLM model unit         |
| ~[ui]~       | Page title, fallback language, theme, editor flag |

** Users

Example administrator user:

#+begin_src ini
[User Admin]
password = admin123
active = true
can_edit_config = true
excluded_models =
default_lang = en
send_shortcut = enter
#+end_src

Example guest user:

#+begin_src ini
[User Guest]
password = 123456
active = true
can_edit_config = false
excluded_models =
default_lang = en
send_shortcut = shift_enter
#+end_src

Default login passwords are ~admin123~ for ~Admin~ and ~123456~ for
~Guest~. The name after ~User~ is the display name shown on the page. It does
not decide rights. Rights are read directly from that user's own
configuration items:

| Item           | Meaning                                      |
|----------------+----------------------------------------------|
| ~password~     | The password typed on the login page         |
| ~active~       | ~true~ can log in, ~false~ is disabled       |
| ~can_edit_config~ | May open the ~CONF.ini~ editor from chat  |
| ~excluded_models~ | Empty for all models, or a deny list      |
| ~default_lang~ | Language selected after this user logs in    |
| ~send_shortcut~ | Enter behavior for this user                |

For example:

#+begin_src ini
excluded_models = GPT55
#+end_src

User-bound behavior checklist:

- [X] Password selects the user.
- [X] Rights are read from that user's own section.
- [X] Language is selected from ~default_lang~ after login.
- [X] Enter / Shift+Enter behavior is selected from ~send_shortcut~.

#+begin_example
send_shortcut = enter
  Enter       -> send
  Shift+Enter -> new line

send_shortcut = shift_enter
  Shift+Enter -> send
  Enter       -> new line
#+end_example

** Models

There is no separate Provider section. A model is the whole usable
unit: API URL, API key, upstream model id, dispatch type, streaming
setting, max token limit, and timeout all live in one ~[Model NAME]~
section.

Example:

#+begin_src ini
[Model MiniMaxM3]
active = 1
label = MiniMax M3
type = openai
api_base = https://api.minimaxi.com/v1
api_key = YOUR_MINIMAX_API_KEY_HERE
model = MiniMax-M3
stream = true
max_tokens = 1024
timeout = 60
#+end_src

DeepSeek V4 Pro example:

#+begin_src ini
[Model Deepseek]
active = 1
label = DeepSeek V4 Pro
type = openai
api_base = https://api.deepseek.com
api_key = YOUR_DEEPSEEK_API_KEY_HERE
model = deepseek-v4-pro
stream = false
max_tokens = 1024
timeout = 120
#+end_src

Unused sample models may remain in ~CONF.ini~, but set them inactive:

#+begin_src ini
active = 0
#+end_src

Inactive models are ignored by the loader and do not need real API
keys.

* Running

Double-click:

#+begin_src bat
RUN.cmd
#+end_src

If ~CONF.ini~ does not exist, ~RUN.cmd~ copies it from ~CONF_SMP.INI~.

The launcher checks:

- PHP is available.
- ~CONF.ini~ is valid.
- The port is free or can be killed.
- ~stunnel.exe~ exists.
- ~cacert.pem~ exists.
- ~HISTORY~ is writable.

After startup, open:

#+begin_src text
http://localhost:9999
#+end_src

* License

stoneChat is released under the WTFPL.

Project:

https://github.com/Water-Run/stoneChat

Contributors

Languages