111 lines
3.2 KiB
Markdown
111 lines
3.2 KiB
Markdown
|
|
# Transient Chat
|
||
|
|
|
||
|
|
> Everything is ephemeral.
|
||
|
|
|
||
|
|
**Transient.chat** is a lightweight, in-memory chat platform designed for real-time, impermanent conversation.
|
||
|
|
|
||
|
|
There are no profiles. No feeds. No likes.
|
||
|
|
Just temporary rooms, simple handles, message expiration, and live synced watchrooms.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## About
|
||
|
|
|
||
|
|
- All messages automatically disappear after **1 hour**
|
||
|
|
- Empty rooms are purged — nothing is saved
|
||
|
|
- Users are identified by transient handles, released when inactive
|
||
|
|
- No databases, no disk writes, no persistence of any kind
|
||
|
|
- **Watchrooms** allow embedded synced YouTube viewing and conversation
|
||
|
|
- Works without WebSockets using traditional HTTP polling
|
||
|
|
|
||
|
|
This project is a throwback to early internet chatrooms — lightweight, anonymous, and inherently temporary.
|
||
|
|
|
||
|
|
Perfect for those who miss casual chat with no expectations or archives.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Features
|
||
|
|
|
||
|
|
- Regional and topical chatroom lists
|
||
|
|
- Synchronized YouTube playback in "watchparty" mode
|
||
|
|
- Ephemeral message and session design
|
||
|
|
- Audio indicators and user join/leave sounds
|
||
|
|
- Owner moderation (kick users from rooms)
|
||
|
|
- Admin panel for IP/username bans
|
||
|
|
- Admin routes protected by environment-based Basic Auth
|
||
|
|
- No database dependency (runs entirely in volatile memory)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Deployment
|
||
|
|
|
||
|
|
This app is intended to be deployed on **[DigitalOcean App Platform](https://www.digitalocean.com/products/app-platform/)**
|
||
|
|
as a Python Flask application.
|
||
|
|
|
||
|
|
You should:
|
||
|
|
|
||
|
|
- Point DigitalOcean to this repo
|
||
|
|
- Specify Python as the runtime
|
||
|
|
- Set environment variables for your admin login:
|
||
|
|
|
||
|
|
```env
|
||
|
|
ADMIN_USERNAME=your_admin_name
|
||
|
|
ADMIN_PASSWORD=your_secure_password
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Project Structure
|
||
|
|
|
||
|
|
```
|
||
|
|
transient.chat/
|
||
|
|
├── app.py # Flask app factory and launcher
|
||
|
|
├── config.py # Loads environment variables
|
||
|
|
├── models/
|
||
|
|
│ ├── state.py # In-memory shared state
|
||
|
|
│ └── cleanup.py # Background cleanup thread
|
||
|
|
├── blueprints/ # Modular route definitions
|
||
|
|
│ ├── auth.py
|
||
|
|
│ ├── chat.py
|
||
|
|
│ ├── rooms.py
|
||
|
|
│ ├── admin.py
|
||
|
|
│ ├── watchparty.py
|
||
|
|
│ └── static_routes.py
|
||
|
|
├── static/
|
||
|
|
│ ├── index.html
|
||
|
|
│ ├── chat.html
|
||
|
|
│ ├── watchparty_chat.html
|
||
|
|
│ ├── server_list.html
|
||
|
|
│ ├── faq.html
|
||
|
|
│ ├── admin.html
|
||
|
|
│ └── assets/ # Frontend resources
|
||
|
|
│ ├── css/ # Stylesheets
|
||
|
|
│ │ └── styles.css
|
||
|
|
│ ├── js/ # JavaScript files
|
||
|
|
│ │ ├── admin.js
|
||
|
|
│ │ ├── chat.js
|
||
|
|
│ │ ├── faq.js
|
||
|
|
│ │ ├── index.js
|
||
|
|
│ │ ├── server_list.js
|
||
|
|
│ │ └── watchparty_chat.js
|
||
|
|
│ ├── sounds/ # .wav audio clips
|
||
|
|
│ │ ├── user-in.wav
|
||
|
|
│ │ ├── user-out.wav
|
||
|
|
│ │ └── message.wav
|
||
|
|
│ └── favicon.ico
|
||
|
|
└── requirements.txt # Python dependencies
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Contributing
|
||
|
|
|
||
|
|
Pull requests and issues are welcome.
|
||
|
|
|
||
|
|
If you'd like to add features, improve styling, or help build out exportable modules, feel free to fork and contribute to the project.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
Nothing is archived.
|
||
|
|
Nothing is retained.
|
||
|
|
**Everything is ephemeral.**
|