A public status page built with Next.js to monitor and analyze the status of all meeting bots across multiple platforms.
Meeting BaaS Status is a public-facing status page that provides real-time insights into the performance of all meeting bots across the platform. This project is a fork of the Meeting BaaS Analytics dashboard, modified to provide a public view of all bots rather than just user-specific analytics. The platform offers:
- Public Status Monitoring: Track the status of all meeting bots across Zoom, Google Meet, and Microsoft Teams
- Real-time Performance Tracking: Monitor bot success rates, error rates, and performance metrics
- Interactive Visualizations: Beautiful and responsive charts for data visualization
- Customizable Filters: Filter data by date range, platform, error type, and more
- Error Analysis: Comprehensive insights into error patterns and trends
- Duration Analytics: Analysis of meeting durations and patterns
- Issue Reports: Track and monitor reported issues across all bots
This project is a fork of the Meeting BaaS Analytics dashboard, with the following key differences:
- Public Access: Unlike the analytics dashboard which shows user-specific data, this status page displays information for all bots
- Simplified Interface: Focused on public-facing status information rather than detailed analytics
- Framework: Next.js 15.3.2
- Language: TypeScript
- Styling: Tailwind CSS 4
- UI Components: Shadcn (Radix UI)
- Charts: Recharts with D3
- Authentication: Centralised Auth app integration
- Package Manager: pnpm
- Node.js (LTS version)
- pnpm 10.6.5 or later
-
Clone the repository:
git clone https://github.com/Meeting-Baas/status cd status -
Install dependencies:
pnpm install
-
Set up environment variables:
cp .env.example .env
Fill in the required environment variables in
.env. Details about the expected values for each key is documented in .env.example
Start the development server:
pnpm devThe application will be available at http://localhost:3000
This project is pre-configured to integrate with the authentication app. While the app itself doesn't need authentication, certain UI features like the header make use of authentication services. Ensure the authentication service is running and properly configured. Update the .env file with the required environment variables for authentication.
We use ShadCN UI components throughout the application:
// Core components we use frequently
import {
Card,
CardHeader,
CardContent,
CardDescription,
Tabs,
TabsList,
TabsTrigger,
TabsContent,
RadioGroup,
RadioGroupItem,
Badge,
Label,
AlertDialog,
} from "@/components/ui";- Header with title and description
- Tabbed interface for different analytics views
- Content sections with clear visual hierarchy
- Analytics cards with consistent styling
- Interactive charts with tooltips
- Filter controls for data manipulation
// Tab styling with animated underline
<TabsTrigger
className="flex-1 flex items-center justify-center gap-2 relative group"
style={{ minHeight: "40px" }}
>
<div className={`w-2 h-2 ${colorVariable} rounded-full`}></div>
<span>{label}</span>
<div className="absolute bottom-0 left-0 w-full h-0.5 scale-x-0 group-data-[state=active]:scale-x-100 transition-transform duration-300 ease-in-out"
style={{ backgroundColor: colorVariable }}></div>
</TabsTrigger>
// Analytics cards
<div className="p-6 bg-gradient-to-r from-muted/30 to-background rounded-lg border border-border/70 shadow-sm">
{/* Content */}
</div>const [loading, setLoading] = useState(true);
const [data, setData] = useState<DataType>({});
useEffect(() => {
const fetchData = async () => {
try {
setLoading(true);
const apiData = await apiFunction();
setData(apiData);
} catch (error) {
console.error("Error:", error);
toast.error("Failed to load data");
} finally {
setLoading(false);
}
};
fetchData();
}, []);We use Sonner toast for notifications:
// Success notification
toast.success("Action completed successfully");
// Error notification
toast.error("Failed to complete action");The status API provides comprehensive data for public status visualization:
// Example API function in your status-api.ts
export async function getBotStats(
params: BotStatsParams
): Promise<BotStatsData> {
try {
return await axios({
method: "GET",
url: `/api/bot-stats`,
params,
}).data;
} catch (error) {
console.error("[API] Error:", error);
throw error;
}
}