# Todo3 ![Screenshot](screenshot.png) Visually, this is an attempt at replicating lovely TUI aesthetics on the web. It isn't actually rendered in text, but everything is based around the `ch` unit. Functionally, it's a real-time collaborative todo list, exclusively via WebSockets with optimistic updates. No REST here, not even for authentication. Whether or not this is a good idea remains to be seen. Numerically, it's `todo3`. Do not ask about `todo1` and `todo2`. ## Tech Stack - **Frontend**: React, Vite - **Backend**: Elysia, Bun, SQLite - **Real-time**: WebSockets ## Development ```bash cp .env.example .env # fill in your values ``` ### With Docker (recommended) ```bash bun install docker compose -f docker-compose.dev.yml up ``` Frontend: http://localhost:5173 Backend: http://localhost:3000 ## Production ```bash docker compose up --build ``` ## Environment Variables | Variable | Description | | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | | `PUBLIC_WS_URL` | WebSocket URL for frontend | | `PUBLIC_BOX_DRAWING_CHARS` | The 8 characters for box drawing. The default value `─│┌┐└┘├┤` results in boxes that are a bit too nice, you can also try `–\|++++++` for a simpler style | | `HOST` | Allowed host for Vite | | `FE_PORT` | Frontend port (external) | | `BE_PORT` | Backend port (external) | | `JWT_SECRET` | Secret for JWT signing | | `SIGNUP_SECRET` | Required for user registration | | `ADMIN_EMAIL` | Contact email for signup errors | | `DB_PATH` | Path to SQLite database |