Skip to content

Astro33s/BurnChat.io

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

3 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ”₯ BurnChat

Disposable chat rooms. Zero logs. No database. Gone.

BurnChat is a self-hostable, ephemeral chat room service where messages exist only in server RAM. No database, no log files, no user accounts, no analytics. Create a room, share the link, chat, and hit the burn button β€” every message is wiped from memory in under 10 milliseconds.

Live demo: burnchat.io


Why?

Every major chat platform stores your messages permanently β€” even after you "delete" them:

  • Slack keeps compliance exports your employer can download anytime
  • Teams stores copies in a hidden Exchange folder called SubstrateHolds
  • Discord files persist on their CDN after account deletion
  • WhatsApp backups retain "deleted" messages; Meta keeps metadata forever

BurnChat takes the opposite approach: we eliminated storage entirely.

The most secure data is data that doesn't exist.


Features

  • πŸ”₯ Instant burn β€” any participant can destroy the room in milliseconds
  • πŸ”’ Room passwords β€” lock and unlock rooms on the fly
  • πŸ”— Custom URLs β€” burnchat.io/your-room-name
  • πŸ“· Image sharing β€” compressed in browser, stored in RAM only
  • ⚑ Auto-burn β€” room self-destructs when everyone leaves
  • πŸŒ“ Day/night mode β€” auto-detects by time of day
  • πŸ“Š Admin panel β€” aggregate stats only, zero PII

Quick Start

git clone https://github.com/Astro33s/BurnChat.io
cd burnchat
npm install
node server.js

Open http://localhost:3000 in your browser. That's it.

With a custom admin password and port:

ADMIN_PASS='your-secret' PORT=3001 node server.js

With PM2 (production):

npm install -g pm2
ADMIN_PASS='your-secret' PORT=3001 pm2 start server.js --name burnchat
pm2 save

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  Client                      β”‚
β”‚         Vanilla HTML/CSS/JS                  β”‚
β”‚         Socket.IO (polling)                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                   β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚               server.js                      β”‚
β”‚                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚     const rooms = new Map()          β”‚   β”‚
β”‚  β”‚                                      β”‚   β”‚
β”‚  β”‚  Room {                              β”‚   β”‚
β”‚  β”‚    id, messages[], users Map,        β”‚   β”‚
β”‚  β”‚    password, autoburn, createdAt     β”‚   β”‚
β”‚  β”‚  }                                   β”‚   β”‚
β”‚  β”‚                                      β”‚   β”‚
β”‚  β”‚  ← Lives entirely in RAM             β”‚   β”‚
β”‚  β”‚  ← No disk writes                    β”‚   β”‚
β”‚  β”‚  ← No database driver installed      β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                              β”‚
β”‚  Express + Socket.IO v4.5                    β”‚
β”‚  Node.js (v12+ compatible)                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

What happens when you hit burn:

  1. Server sends room-burned signal to all connected users
  2. Every socket connection is forcefully disconnected
  3. All background timers (cleanup, expiry) are cancelled
  4. Message array length set to zero β€” every reference removed
  5. User map cleared β€” no record of who was in the room
  6. Room deleted from the server registry
  7. Garbage collector reclaims the freed memory

Total time: under 10 milliseconds.


Configuration

Variable Default Description
PORT 3000 Server port
ADMIN_PASS changeme123 Admin panel password

Internal limits (edit in server.js):

Setting Value
Max messages per room 100
Max message length 2,000 chars
Max image size 500 KB
Max username length 24 chars
Max users per room 50
Room cleanup delay 30 seconds
Room max age 24 hours

Project Structure

burnchat/
β”œβ”€β”€ server.js              # Entire backend (single file)
β”œβ”€β”€ package.json
β”œβ”€β”€ public/
β”‚   β”œβ”€β”€ index.html         # Full SPA frontend
β”‚   β”œβ”€β”€ admin.html         # Admin panel
β”‚   β”œβ”€β”€ favicon.svg
β”‚   β”œβ”€β”€ og-image.svg
β”‚   β”œβ”€β”€ sitemap.xml
β”‚   β”œβ”€β”€ robots.txt
β”‚   └── blog/
β”‚       β”œβ”€β”€ index.html
β”‚       └── *.html         # Blog articles
└── deploy/
    β”œβ”€β”€ nginx-burnchat.conf
    └── burnchat.service

Deployment

Requirements

  • Node.js 12+ (tested on 18 and 20)
  • That's it. No database. No Redis. No build step.

Docker

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
ENV PORT=3000
EXPOSE 3000
CMD ["node", "server.js"]
docker build -t burnchat .
docker run -p 3000:3000 -e ADMIN_PASS='your-secret' burnchat

Reverse Proxy

See deploy/nginx-burnchat.conf for a ready-to-use Nginx configuration with WebSocket/polling support.


API

Public

Endpoint Method Description
/api/burn-count GET Total rooms burned

Admin (requires ?pw=ADMIN_PASS)

Endpoint Method Description
/admin-burnchat/api/stats GET Full server statistics
/admin-burnchat/api/reset POST Reset all statistics

What BurnChat Doesn't Do

  • No E2E encryption (yet) β€” messages pass through the server. We're zero-storage, not zero-knowledge.
  • Can't prevent screenshots β€” we guarantee we don't keep data, not that every participant is trustworthy.
  • Not a Signal replacement β€” BurnChat is for one-time conversations that should disappear.
  • Server operator trust β€” self-host to eliminate the trust question entirely.

Security

Found a security issue? See SECURITY.md for responsible disclosure.


Contributing

Contributions are welcome! See CONTRIBUTING.md.


License

MIT


Links


The most secure data is data that doesn't exist.