Re-measure tab bar height when tabBarPosition changes from 'top' to 'responsive'. This fixes the issue where bottom padding was incorrect on first load because the CSS variable was measured before the backend loaded the responsive position setting. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Service App
Modern web application for service management. Built with React, FastAPI, and SQLite.
Features
- User management (admin)
- Authentication (JWT) + 2FA (TOTP) + API keys
- Active sessions (view/revoke)
- Audit log + analytics (admin)
- In-app notifications
- Modern, responsive UI with theming
- Fully containerized with Docker
Technology Stack
Frontend
- React 19 + TypeScript
- Vite (build tool)
- React Router
- Axios
Backend
- FastAPI (Python 3.11+)
- SQLAlchemy 2.0 (ORM)
- SQLite (Database)
- Alembic (migrations)
- JWT authentication
Infrastructure
- Docker + Docker Compose
Quick Start
Prerequisites
- Docker and Docker Compose
- Git
Installation
- Clone the repository:
git clone <repository-url>
cd <repository-folder>
- Copy environment variables:
cp .env.example .env
# Edit .env with your configuration
- Generate secret key:
openssl rand -base64 32
# Add to .env as SECRET_KEY
- Start all services:
docker-compose up -d
- Access the application:
- Frontend: http://localhost:5174
- Backend API: http://localhost:5174/api/v1
- API Documentation: http://localhost:5174/docs
Project Structure
.
├── docker-compose.yml
├── backend/ # FastAPI application
│ ├── app/
│ │ ├── api/ # API routes
│ │ ├── models/ # SQLAlchemy models
│ │ ├── schemas/ # Pydantic schemas
│ │ ├── services/ # Business logic
│ │ └── main.py # Entry point
│ └── alembic/ # Database migrations
├── frontend/ # React application
│ └── src/
│ ├── components/ # React components
│ ├── pages/ # Page components
│ ├── api/ # API client
│ └── hooks/ # Custom hooks
└── scripts/ # Utility scripts
Configuration
Environment Variables
See .env.example for all available configuration options.
Key variables:
SECRET_KEY: JWT secret keyALLOWED_HOSTS: CORS configuration
Persistent Data
- SQLite database:
sqlite:////config/config.db(bind-mounted via./config:/config) - Uploads:
/config/uploadsby default (can be overridden withFILE_STORAGE_PATH)
Contributing
Feel free to fork and customize for your needs.
Description
Languages
TypeScript
43.8%
Python
31.5%
CSS
24.1%
Dockerfile
0.3%