UMBRA/frontend
Kyle Pope 3d22568b9c Add user connections, notification centre, and people integration
Implements the full User Connections & Notification Centre feature:

Phase 1 - Database: migrations 039-043 adding umbral_name to users,
profile/social fields to settings, notifications table, connection
request/user_connection tables, and linked_user_id to people.

Phase 2 - Notifications: backend CRUD router + service + 90-day purge,
frontend NotificationsPage with All/Unread filter, bell icon in sidebar
with unread badge polling every 60s.

Phase 3 - Settings: profile fields (phone, mobile, address, company,
job_title), social card with accept_connections toggle and per-field
sharing defaults, umbral name display with CopyableField.

Phase 4 - Connections: timing-safe user search, send/accept/reject flow
with atomic status updates, bidirectional UserConnection + Person records,
in-app + ntfy notifications, per-receiver pending cap, nginx rate limiting.

Phase 5 - People integration: batch-loaded shared profiles (N+1 prevention),
Ghost icon for umbral contacts, Umbral filter pill, split Add Person button,
shared field indicators (synced labels + Lock icons), disabled form inputs
for synced fields on umbral contacts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 02:10:16 +08:00
..
2026-02-15 16:13:41 +08:00
2026-02-15 16:13:41 +08:00
2026-02-15 16:13:41 +08:00
2026-02-15 16:13:41 +08:00
2026-02-15 16:13:41 +08:00
2026-02-15 16:13:41 +08:00

UMBRA Frontend

A modern, dark-themed React application for managing your life - todos, calendar events, reminders, projects, people, and locations.

Tech Stack

  • React 18 with TypeScript
  • Vite for fast builds
  • Tailwind CSS v3 for styling
  • shadcn/ui components (manually implemented)
  • React Router v6 for routing
  • TanStack Query v5 for data fetching
  • Axios for HTTP requests
  • FullCalendar for calendar view
  • Lucide React for icons
  • date-fns for date formatting
  • sonner for toast notifications

Features

  • PIN-based authentication with setup wizard
  • Dark theme with customizable accent colors (cyan, blue, purple, orange, green)
  • Dashboard with stats and widgets
  • Todos with priority, category, and recurrence
  • Calendar with event management
  • Reminders with dismiss functionality
  • Projects with tasks and progress tracking
  • People management with relationships
  • Locations categorization
  • Responsive design with collapsible sidebar

Getting Started

Prerequisites

  • Node.js 20 or higher
  • npm or yarn

Installation

# Install dependencies
npm install

# Start development server
npm run dev

# Build for production
npm run build

# Preview production build
npm run preview

Development

The application expects a backend API at /api. During development, Vite proxies /api requests to http://localhost:8000.

Project Structure

frontend/
├── src/
│   ├── components/
│   │   ├── auth/          # Authentication components
│   │   ├── calendar/      # Calendar page and forms
│   │   ├── dashboard/     # Dashboard widgets
│   │   ├── layout/        # Layout components (sidebar, etc)
│   │   ├── locations/     # Locations management
│   │   ├── people/        # People management
│   │   ├── projects/      # Projects and tasks
│   │   ├── reminders/     # Reminders management
│   │   ├── settings/      # Settings page
│   │   ├── todos/         # Todos management
│   │   └── ui/            # shadcn/ui components
│   ├── hooks/             # Custom React hooks
│   ├── lib/               # Utilities (API client, utils)
│   ├── types/             # TypeScript type definitions
│   ├── App.tsx            # Main app with routing
│   ├── main.tsx           # Entry point
│   └── index.css          # Global styles
├── Dockerfile             # Production Docker image
├── nginx.conf             # Nginx configuration
└── package.json

Docker Deployment

Build and run with Docker:

# Build image
docker build -t umbra-frontend .

# Run container
docker run -p 80:80 umbra-frontend

Environment Variables

No environment variables required. API base URL is configured to /api and proxied by nginx in production.

Customization

Accent Colors

Accent colors are defined in src/hooks/useTheme.ts and can be changed in Settings. The application uses CSS custom properties for theming.

Adding New Pages

  1. Create component in src/components/<feature>/
  2. Add route in src/App.tsx
  3. Add navigation item in src/components/layout/Sidebar.tsx

License

Private project - all rights reserved.