···11# Ermine
2233-Ermine is a Discord-inspired web client for **stoat.chat** with custom branding and a cleaner layout. It is currently **experimental**, known to be **buggy**, and still missing many expected features.
33+```{=html}
44+<p align="center">
55+```
66+`<img src="https://github.com/FascinatingPistachio/ermine/blob/main/assets/android-chrome-192x192.png?raw=true" width="96" />`{=html}
77+```{=html}
88+</p>
99+```
1010+Ermine is a refined, Discord-inspired web client for **stoat.chat**.
1111+1212+It prioritizes clarity, hierarchy, and composure while preserving core
1313+Stoat/Revolt functionality.
1414+1515+This project is **experimental** and under active development.
1616+1717+------------------------------------------------------------------------
1818+1919+## Interface
2020+2121+- Structured three-column layout
2222+ - Space rail\
2323+ - Channel sidebar\
2424+ - Timeline + composer\
2525+ - Member panel
2626+- Focused interaction model
2727+ - Reduced visual noise\
2828+ - Sharper spacing and hierarchy\
2929+ - Controlled color system
3030+- Composed system copy
3131+ - "Preferences" instead of "User Settings"\
3232+ - "Direct" instead of "Friends"\
3333+ - "Live" instead of "Active Now"
3434+3535+Familiar structure. Cleaner execution.
43655-## Highlights
3737+------------------------------------------------------------------------
63877-- **Discord-like shell layout**
88- - Server rail on the left
99- - Channel list sidebar
1010- - Main chat timeline + composer
1111- - Member list on the right
1212-- **Ermine branding**
1313- - Updated login screen branding and copy
1414- - Ermine references in app chrome
1515-- **Better UX defaults**
1616- - Improved spacing, hierarchy, and color consistency
1717- - Friend list landing experience for `@me`
1818- - Profile popout modal for users/members
1919-- **Core Stoat/Revolt functionality preserved**
2020- - Session login (credentials or token)
2121- - Config discovery from API root
2222- - Realtime events over websocket
2323- - Message sending and timeline updates
3939+## Functionality
4040+4141+Core Stoat/Revolt capabilities are preserved:
4242+4343+- Session login (credentials or token)
4444+- API root configuration discovery
4545+- Realtime events over WebSocket
4646+- Message sending and timeline updates
4747+- Profile popout modal
4848+- `@me` landing experience
4949+5050+------------------------------------------------------------------------
24512552## Configuration
26532727-The client defaults to:
5454+Default endpoints:
5555+5656+- API: `https://api.stoat.chat`
5757+- WebSocket: `wss://stoat.chat/events`
5858+- CDN: `https://autumn.revolt.chat`
5959+6060+Connection overrides are available under:
6161+6262+**Advanced connection configuration**
28632929-- API: `https://api.stoat.chat`
3030-- WebSocket: `wss://stoat.chat/events`
3131-- CDN: `https://autumn.revolt.chat`
6464+No restart required.
6565+6666+------------------------------------------------------------------------
6767+6868+## Local Development
6969+7070+Main application entry:
32713333-You can override these in **Advanced connection settings** on the login screen.
7272+- `src/App.jsx`
34733535-## Local development
7474+Run using your existing React + Tailwind setup.
36753737-This repository currently contains the main app component at:
7676+------------------------------------------------------------------------
38773939-- `src/App.jsx`
7878+## Deployment (Vercel)
40794141-Use your existing React/Tailwind host setup to run it locally.
8080+Includes `vercel.json` SPA rewrite support so deep links resolve to `/`.
42814343-## Brand direction
8282+Optional environment variables:
44834545-This app is intentionally branded as **Ermine**, designed for the **stoat.chat** ecosystem while keeping a familiar Discord-like interaction model.
8484+- `VITE_STOAT_API_URL`
8585+- `VITE_STOAT_WS_URL`
8686+- `VITE_STOAT_CDN_URL`
46878888+Values are injected at build time. Manual overrides remain available
8989+from the login screen.
47904848-## Deploying on Vercel
9191+------------------------------------------------------------------------
49925050-This project includes a `vercel.json` SPA rewrite so deep links resolve correctly to `/` (framework entrypoint) on Vercel, which avoids hard-coding an `index.html` file.
9393+## Privacy
51945252-For environment-specific endpoints, set these Vercel environment variables:
9595+- Session continuity is maintained using browser cookies:
9696+ - `ermine_session_token`
9797+ - `ermine_user_id`
9898+ - `ermine_api_url`
9999+- Ermine does not store user content outside configured stoat.chat
100100+ endpoints.
101101+- Network communication is limited to selected API, WebSocket, and CDN
102102+ endpoints.
103103+- See `privacy-policy.html` for the user-facing notice.
531045454-- `VITE_STOAT_API_URL`
5555-- `VITE_STOAT_WS_URL`
5656-- `VITE_STOAT_CDN_URL`
105105+------------------------------------------------------------------------
571065858-The app will use those values at build time, while still allowing manual overrides from **Advanced connection settings** on the login screen.
107107+## Direction
591086060-## Privacy and GDPR direction
109109+Ermine is the composed interface layer for the stoat.chat ecosystem.
611106262-- Ermine stores session details in browser cookies (`ermine_session_token`, `ermine_user_id`, `ermine_api_url`) for authentication continuity.
6363-- Ermine does not persist personal user data on Ermine repositories or Ermine-hosted servers.
6464-- Network communication is limited to configured official stoat.chat endpoints.
6565-- See `privacy-policy.html` for the user-facing privacy notice.
111111+Minimal shell. Full control.