Files
claude-code-monitor/backend/app/main.py
felix.zoesch f6ef7ff5d3 Initial commit: Claude Code Monitor v1.0.0
Complete real-time monitoring dashboard for Claude Code

Features:
- FastAPI backend with REST API and WebSocket
- React + TypeScript frontend with dark theme
- SQLite database for event storage
- 6 hook scripts for Claude Code events
- Docker deployment setup
- Real-time event tracking and statistics
- Event filtering (ALL, TOOLS, AGENTS, PROMPTS, SESSIONS)
- Connection status indicator
- Reset stats functionality

Tech Stack:
- Backend: Python 3.11, FastAPI, SQLAlchemy, WebSockets
- Frontend: React 18, TypeScript, Vite
- Database: SQLite
- Deployment: Docker, Docker Compose

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-15 09:49:06 +01:00

91 lines
2.2 KiB
Python

"""Main FastAPI application for Claude Code Monitor."""
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
import logging
import time
from app.database import init_db
from app.api import events, statistics, websocket_endpoint
from app.schemas import HealthResponse
# Configure logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
)
logger = logging.getLogger(__name__)
@asynccontextmanager
async def lifespan(app: FastAPI):
"""Application lifespan handler for startup and shutdown events."""
# Startup
logger.info("Starting Claude Code Monitor backend...")
init_db()
logger.info("Database initialized successfully")
logger.info("Backend ready to receive events")
yield
# Shutdown
logger.info("Shutting down Claude Code Monitor backend...")
# Create FastAPI app
app = FastAPI(
title="Claude Code Monitor API",
description="Real-time monitoring dashboard for Claude Code activity",
version="1.0.0",
lifespan=lifespan,
)
# Configure CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # In production, specify exact origins
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Include routers
app.include_router(events.router)
app.include_router(statistics.router)
app.include_router(websocket_endpoint.router)
# Health check endpoint
@app.get("/health", response_model=HealthResponse, tags=["health"])
async def health_check():
"""
Health check endpoint.
Returns the service status and current timestamp.
"""
return HealthResponse(status="healthy", timestamp=time.time())
# Root endpoint
@app.get("/", tags=["info"])
async def root():
"""Root endpoint with API information."""
return {
"name": "Claude Code Monitor API",
"version": "1.0.0",
"status": "running",
"docs": "/docs",
"websocket": "/ws",
}
if __name__ == "__main__":
import uvicorn
uvicorn.run(
"app.main:app",
host="0.0.0.0",
port=8000,
reload=True,
log_level="info",
)