UMBRA/README.md
2026-02-15 16:19:55 +08:00

195 lines
6.4 KiB
Markdown

# UMBRA
A self-hosted personal life administration app with a dark-themed UI. Manage your todos, calendar events, projects, reminders, contacts, and locations from a single dashboard.
## Features
- **Dashboard** - At-a-glance overview with today's events, upcoming todos, active reminders, and project stats
- **Todos** - Task management with priorities, due dates, and completion tracking
- **Calendar** - Full interactive calendar (month/week/day views) with drag-and-drop event rescheduling
- **Projects** - Project boards with nested task lists, status tracking, and progress indicators
- **Reminders** - Time-based reminders with dismiss functionality
- **People** - Contact directory with relationship tracking and task assignment
- **Locations** - Location management with categories
- **Settings** - Customizable accent color, upcoming days range, and PIN management
## Screenshots
*Coming soon*
## Tech Stack
| Layer | Technology |
|--------------|------------|
| Frontend | React 18, TypeScript, Vite, Tailwind CSS |
| UI Components | Custom shadcn/ui-style components, FullCalendar, Lucide icons |
| State | TanStack Query v5, React Router v6 |
| Backend | FastAPI, Python 3.12, Pydantic v2 |
| Database | PostgreSQL 16, SQLAlchemy 2.0 (async), Alembic |
| Auth | PIN-based with bcrypt + signed cookies |
| Deployment | Docker Compose (3 services), Nginx reverse proxy |
## Quick Start
### Prerequisites
- [Docker](https://docs.docker.com/get-docker/) and [Docker Compose](https://docs.docker.com/compose/install/)
### Setup
1. **Clone the repository**
```bash
git clone https://your-gitea-instance/youruser/umbra.git
cd lifemanager
```
2. **Configure environment variables**
```bash
cp .env.example .env
```
Edit `.env` and set secure values:
```env
POSTGRES_USER=lifemanager
POSTGRES_PASSWORD=your-secure-password
POSTGRES_DB=lifemanager
DATABASE_URL=postgresql+asyncpg://lifemanager:your-secure-password@db:5432/lifemanager
SECRET_KEY=your-random-secret-key
```
3. **Build and run**
```bash
docker-compose up --build
```
4. **Open the app**
Navigate to `http://localhost` in your browser. On first launch you'll be prompted to create a PIN.
## Architecture
```
+-----------+
| Browser |
+-----+-----+
|
port 80 (HTTP)
|
+-------+-------+
| Nginx |
| (frontend) |
+---+-------+---+
| |
static | | /api/*
files | |
v v
+---+-------+---+
| FastAPI |
| (backend) |
| port 8000 |
+-------+-------+
|
+-------+-------+
| PostgreSQL |
| (db) |
| port 5432 |
+---------------+
```
- **Frontend** is built as static files and served by Nginx. Nginx also reverse-proxies API requests to the backend.
- **Backend** runs Alembic migrations on startup, then serves the FastAPI application.
- **Database** uses a named Docker volume (`postgres_data`) for persistence.
## API Overview
All endpoints require authentication (signed session cookie) except auth routes and the health check.
| Endpoint | Description |
|--------------------|-------------|
| `GET /health` | Health check |
| `/api/auth/*` | PIN setup, login, logout, status |
| `/api/todos/*` | Todos CRUD + toggle completion |
| `/api/events/*` | Calendar events CRUD |
| `/api/reminders/*` | Reminders CRUD + dismiss |
| `/api/projects/*` | Projects + nested tasks CRUD |
| `/api/people/*` | People CRUD |
| `/api/locations/*` | Locations CRUD |
| `/api/settings/*` | App settings + PIN change |
| `/api/dashboard` | Dashboard aggregation |
| `/api/upcoming` | Unified upcoming items feed |
Full API documentation is available at `http://localhost:8000/docs` (Swagger UI) when the backend is running.
## Development
### Rebuild a single service
```bash
docker-compose up --build backend # Backend only
docker-compose up --build frontend # Frontend only
```
### View logs
```bash
docker-compose logs -f # All services
docker-compose logs -f backend # Backend only
```
### Reset database
```bash
docker-compose down -v && docker-compose up --build
```
### Stop all services
```bash
docker-compose down
```
## Project Structure
```
lifemanager/
├── docker-compose.yaml
├── .env / .env.example
├── backend/
│ ├── Dockerfile
│ ├── requirements.txt
│ ├── start.sh
│ ├── alembic.ini
│ ├── alembic/ # Database migrations
│ └── app/
│ ├── main.py # FastAPI app entry point
│ ├── config.py # Environment settings
│ ├── database.py # Async SQLAlchemy setup
│ ├── models/ # SQLAlchemy ORM models
│ ├── schemas/ # Pydantic request/response schemas
│ └── routers/ # API route handlers
└── frontend/
├── Dockerfile
├── nginx.conf
├── package.json
└── src/
├── App.tsx # Routes and auth guard
├── lib/api.ts # Axios client
├── hooks/ # Auth, settings, theme hooks
├── types/ # TypeScript interfaces
└── components/
├── ui/ # Base UI components
├── layout/ # App shell and sidebar
├── auth/ # PIN login screen
├── dashboard/ # Dashboard and widgets
├── calendar/ # Calendar and event form
├── todos/ # Todo management
├── reminders/ # Reminder management
├── projects/ # Project boards and tasks
├── people/ # Contact directory
├── locations/ # Location management
└── settings/ # App settings
```
## License
This project is for personal use. Feel free to fork and adapt for your own needs.