From e6387065ad3e96913d0cb5922c4f65e38ee250ba Mon Sep 17 00:00:00 2001 From: Kyle Pope Date: Sun, 15 Feb 2026 20:21:55 +0800 Subject: [PATCH] updated name from lifemanager to umbra, --- .env.example | 6 ++-- CLAUDE.md | 2 +- README.md | 10 +++---- backend/.env.example | 2 +- backend/README.md | 12 ++++---- backend/app/config.py | 2 +- backend/app/main.py | 6 ++-- frontend/README.md | 6 ++-- frontend/index.html | 2 +- frontend/package.json | 2 +- frontend/src/components/auth/LockScreen.tsx | 2 +- frontend/src/components/layout/AppLayout.tsx | 2 +- frontend/src/components/layout/Sidebar.tsx | 2 +- .../src/components/projects/ProjectDetail.tsx | 30 +++++++++++++++---- .../src/components/reminders/ReminderList.tsx | 9 ++++-- frontend/src/components/todos/TodoList.tsx | 10 +++++-- progress.md | 13 ++++---- 17 files changed, 74 insertions(+), 44 deletions(-) diff --git a/.env.example b/.env.example index ad94979..dc3537f 100644 --- a/.env.example +++ b/.env.example @@ -1,8 +1,8 @@ # Database -POSTGRES_USER=lifemanager +POSTGRES_USER=umbra POSTGRES_PASSWORD=changeme_in_production -POSTGRES_DB=lifemanager +POSTGRES_DB=umbra # Backend -DATABASE_URL=postgresql+asyncpg://lifemanager:changeme_in_production@db:5432/lifemanager +DATABASE_URL=postgresql+asyncpg://umbra:changeme_in_production@db:5432/umbra SECRET_KEY=change-this-to-a-random-secret-key-in-production diff --git a/CLAUDE.md b/CLAUDE.md index 91c93a7..f5d8107 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,4 +1,4 @@ -# CLAUDE.md - LifeManager +# CLAUDE.md - UMBRA ## Hard Rules diff --git a/README.md b/README.md index c553ff7..1f7ccd5 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ A self-hosted personal life administration app with a dark-themed UI. Manage you 1. **Clone the repository** ```bash git clone https://your-gitea-instance/youruser/umbra.git - cd lifemanager + cd umbra ``` 2. **Configure environment variables** @@ -49,10 +49,10 @@ A self-hosted personal life administration app with a dark-themed UI. Manage you ``` Edit `.env` and set secure values: ```env - POSTGRES_USER=lifemanager + POSTGRES_USER=umbra POSTGRES_PASSWORD=your-secure-password - POSTGRES_DB=lifemanager - DATABASE_URL=postgresql+asyncpg://lifemanager:your-secure-password@db:5432/lifemanager + POSTGRES_DB=umbra + DATABASE_URL=postgresql+asyncpg://umbra:your-secure-password@db:5432/umbra SECRET_KEY=your-random-secret-key ``` @@ -150,7 +150,7 @@ docker-compose down ## Project Structure ``` -lifemanager/ +umbra/ ├── docker-compose.yaml ├── .env / .env.example ├── backend/ diff --git a/backend/.env.example b/backend/.env.example index 85881df..0f23dea 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -1,2 +1,2 @@ -DATABASE_URL=postgresql+asyncpg://postgres:postgres@localhost:5432/lifemanager +DATABASE_URL=postgresql+asyncpg://postgres:postgres@localhost:5432/umbra SECRET_KEY=your-secret-key-change-in-production-use-a-long-random-string diff --git a/backend/README.md b/backend/README.md index 814decf..99cce58 100644 --- a/backend/README.md +++ b/backend/README.md @@ -1,6 +1,6 @@ -# LifeManager Backend +# UMBRA Backend -A complete FastAPI backend for the LifeManager application with async SQLAlchemy, PostgreSQL, authentication, and comprehensive CRUD operations. +A complete FastAPI backend for the UMBRA application with async SQLAlchemy, PostgreSQL, authentication, and comprehensive CRUD operations. ## Features @@ -50,14 +50,14 @@ pip install -r requirements.txt Create a `.env` file: ```bash -DATABASE_URL=postgresql+asyncpg://postgres:postgres@localhost:5432/lifemanager +DATABASE_URL=postgresql+asyncpg://postgres:postgres@localhost:5432/umbra SECRET_KEY=your-secret-key-change-in-production ``` ### 3. Create Database ```bash -createdb lifemanager +createdb umbra ``` ### 4. Run Migrations @@ -167,8 +167,8 @@ The application uses the following tables: Build and run with Docker: ```bash -docker build -t lifemanager-backend . -docker run -p 8000:8000 -e DATABASE_URL=... -e SECRET_KEY=... lifemanager-backend +docker build -t umbra-backend . +docker run -p 8000:8000 -e DATABASE_URL=... -e SECRET_KEY=... umbra-backend ``` ## Development diff --git a/backend/app/config.py b/backend/app/config.py index 245591d..d23307f 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -2,7 +2,7 @@ from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): - DATABASE_URL: str = "postgresql+asyncpg://postgres:postgres@localhost:5432/lifemanager" + DATABASE_URL: str = "postgresql+asyncpg://postgres:postgres@localhost:5432/umbra" SECRET_KEY: str = "your-secret-key-change-in-production" model_config = SettingsConfigDict( diff --git a/backend/app/main.py b/backend/app/main.py index 0be808a..3117867 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -17,8 +17,8 @@ async def lifespan(app: FastAPI): app = FastAPI( - title="LifeManager API", - description="Backend API for LifeManager application", + title="UMBRA API", + description="Backend API for UMBRA application", version="1.0.0", lifespan=lifespan ) @@ -46,7 +46,7 @@ app.include_router(dashboard.router, prefix="/api", tags=["Dashboard"]) @app.get("/") async def root(): - return {"message": "LifeManager API is running"} + return {"message": "UMBRA API is running"} @app.get("/health") diff --git a/frontend/README.md b/frontend/README.md index 7af3319..6b501d3 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -1,4 +1,4 @@ -# LifeManager Frontend +# UMBRA Frontend A modern, dark-themed React application for managing your life - todos, calendar events, reminders, projects, people, and locations. @@ -90,10 +90,10 @@ Build and run with Docker: ```bash # Build image -docker build -t lifemanager-frontend . +docker build -t umbra-frontend . # Run container -docker run -p 80:80 lifemanager-frontend +docker run -p 80:80 umbra-frontend ``` ## Environment Variables diff --git a/frontend/index.html b/frontend/index.html index 0762d1e..68b043b 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -3,7 +3,7 @@ - LifeManager + UMBRA
diff --git a/frontend/package.json b/frontend/package.json index 13830e5..75b1948 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,5 +1,5 @@ { - "name": "lifemanager", + "name": "umbra", "private": true, "version": "1.0.0", "type": "module", diff --git a/frontend/src/components/auth/LockScreen.tsx b/frontend/src/components/auth/LockScreen.tsx index 8d740e8..c052942 100644 --- a/frontend/src/components/auth/LockScreen.tsx +++ b/frontend/src/components/auth/LockScreen.tsx @@ -54,7 +54,7 @@ export default function LockScreen() { - {isSetup ? 'Welcome to LifeManager' : 'Enter PIN'} + {isSetup ? 'Welcome to UMBRA' : 'Enter PIN'} {isSetup diff --git a/frontend/src/components/layout/AppLayout.tsx b/frontend/src/components/layout/AppLayout.tsx index 045e837..bd00f90 100644 --- a/frontend/src/components/layout/AppLayout.tsx +++ b/frontend/src/components/layout/AppLayout.tsx @@ -24,7 +24,7 @@ export default function AppLayout() { -

LifeManager

+

UMBRA

diff --git a/frontend/src/components/layout/Sidebar.tsx b/frontend/src/components/layout/Sidebar.tsx index 1140f58..5c968f7 100644 --- a/frontend/src/components/layout/Sidebar.tsx +++ b/frontend/src/components/layout/Sidebar.tsx @@ -44,7 +44,7 @@ export default function Sidebar({ collapsed, onToggle, mobileOpen, onMobileClose const sidebarContent = ( <>
- {!collapsed &&

LifeManager

} + {!collapsed &&

UMBRA

}
; + return ( +
+
+
+ +

Loading...

+
+
+
+ +
+
+ ); } if (!project) { @@ -120,9 +136,13 @@ export default function ProjectDetail() {
{!project.tasks || project.tasks.length === 0 ? ( -
-

No tasks yet. Add one to get started!

-
+ setShowTaskForm(true)} + /> ) : (
{project.tasks.map((task) => ( diff --git a/frontend/src/components/reminders/ReminderList.tsx b/frontend/src/components/reminders/ReminderList.tsx index d94097d..b20cd74 100644 --- a/frontend/src/components/reminders/ReminderList.tsx +++ b/frontend/src/components/reminders/ReminderList.tsx @@ -7,6 +7,7 @@ import type { Reminder } from '@/types'; import { cn } from '@/lib/utils'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { EmptyState } from '@/components/ui/empty-state'; interface ReminderListProps { reminders: Reminder[]; @@ -45,9 +46,11 @@ export default function ReminderList({ reminders, onEdit }: ReminderListProps) { if (reminders.length === 0) { return ( -
-

No reminders found.

-
+ ); } diff --git a/frontend/src/components/todos/TodoList.tsx b/frontend/src/components/todos/TodoList.tsx index 9c3ddfe..2bf374d 100644 --- a/frontend/src/components/todos/TodoList.tsx +++ b/frontend/src/components/todos/TodoList.tsx @@ -1,4 +1,6 @@ +import { CheckSquare } from 'lucide-react'; import type { Todo } from '@/types'; +import { EmptyState } from '@/components/ui/empty-state'; import TodoItem from './TodoItem'; interface TodoListProps { @@ -9,9 +11,11 @@ interface TodoListProps { export default function TodoList({ todos, onEdit }: TodoListProps) { if (todos.length === 0) { return ( -
-

No todos found. Create one to get started!

-
+ ); } diff --git a/progress.md b/progress.md index 91ff8ed..273aa71 100644 --- a/progress.md +++ b/progress.md @@ -1,4 +1,4 @@ -# LifeManager - Project Progress +# UMBRA - Project Progress ## Overview Personal life administration web app with dark theme, accent color customization, and Docker deployment. @@ -71,7 +71,7 @@ Personal life administration web app with dark theme, accent color customization - [x] Integration fixes: HTTP methods (PUT for updates, PATCH for toggle/dismiss) - [x] Integration fixes: Type definitions match backend response schemas - [ ] Integration testing (end-to-end CRUD verification) <-- POST-BUILD -- [ ] Final styling pass <-- POST-BUILD +- [x] Final styling pass (responsive sidebar, empty states, loading skeletons) --- @@ -110,6 +110,9 @@ These were found during first Docker build and integration testing: | All-day event dates empty when editing (datetime vs date format mismatch) | Added `formatForInput()` to normalize values for `date` vs `datetime-local` inputs | | Project create/update `MissingGreenlet` error (lazy load in async context) | Re-fetch with `selectinload(Project.tasks)` after commit in `projects.py` | | Generic error toasts gave no useful information | Added `getErrorMessage()` helper to `api.ts`, updated all 8 form components | +| Sidebar not responsive on mobile | Split into desktop sidebar + mobile overlay with hamburger menu in `AppLayout` | +| Plain "Loading..." text on all pages | Created `Skeleton`, `ListSkeleton`, `GridSkeleton`, `DashboardSkeleton` components | +| Basic empty states with no visual cue | Created `EmptyState` component with icon, message, and action button across all pages | --- @@ -125,10 +128,10 @@ These were found during first Docker build and integration testing: 5. **End-to-end CRUD test** - Partially verified: Calendar (create/edit/drag/delete), Projects (create), Dashboard (today's events). Remaining: Todos, Reminders, People, Locations, Settings ### Nice to have (polish): -6. **Responsive sidebar** - Collapse behavior on mobile +6. ~~**Responsive sidebar**~~ - DONE: Mobile hamburger menu with overlay, desktop collapse/expand 7. ~~**Toast notifications**~~ - DONE: All forms now show meaningful error messages via `getErrorMessage()` -8. **Empty states** - Good UX for pages with no data yet -9. **Loading skeletons** - Better loading states than plain text +8. ~~**Empty states**~~ - DONE: All pages show icon + message + action button when empty +9. ~~**Loading skeletons**~~ - DONE: Animated skeleton placeholders replace plain "Loading..." text ---