diff --git a/changelog.md b/changelog.md
index 79b58b4..3e8aa45 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,40 +1,12 @@
# Changelog
-## 2025-12-22 - 0.2.0 - feat(docs)
-add in-app documentation pages and Fair Usage Policy
+## 2025-12-23 - 0.0.1 - feat(site)
+Initial about.uptime.link website
-- Add FairUsagePolicy page and route (/fair-usage) with full policy content and a sticky header/footer
-- Introduce a docs section with a DocsLayout and nested routes: Introduction, Quick Start, Docker, Configuration, SDK, OIDC, Organizations, Users
-- Update App.tsx to register docs routes and the Fair Usage route
-- Update UI components (Navbar, Footer, Hero, HowItWorks) to use internal docs routes and add a Fair Usage link
-- Refactor DocsLayout to provide independent scrolling for the sidebar and main content and tweak header/sidebar layout
-- Include code examples and navigation between docs pages to improve developer onboarding
-
-## 2025-12-22 - 0.1.0 - feat(site)
-revamp landing pages and add documentation layout
-
-- Add new DocsLayout component with sidebar navigation, header, sign-in CTA and documentation links
-- Revise Hero, Features, HowItWorks, Navbar and Footer copy to emphasize organization management, OIDC provider, RBAC, 2FA, deploy/self-host options and TypeScript SDK
-- Introduce new feature cards and icons; restructure feature list and feature preview UI
-- Update CTAs and links to point to docs, repository, community and sign-in endpoints; wrap buttons with asChild anchors for proper navigation
-- Minor UI tweak: reduce feature card animation delay from 150ms to 100ms
-
-## 2025-04-03 - 0.0.0 - Site UI, theming, content and infra updates
-Large update adding dark theme support, UI refactors, content/footer updates, and initial site creation.
-
-- Add dark theme support across the app (complete dark theme implementation).
-- Add a dark theme toggle (using next-themes) and enable dark mode support for UI components.
-- Fix dark mode styling specifically for the HowItWorks section.
-- Refactor UI for an improved modern look and feel; improve Hero preview to resemble a passport.
-- Remove the CTA component and restructure the CTA section for improved layout.
-- Add sample passport data (John Doe) and fix the hero passport link to the correct URL.
-- Add identity URL mapping: map idp://user.global/identity to https://passport.idp.global/john.doe.
-- Add legal and company links to the footer (note: one revert related to this change was recorded and then re-applied).
-- Fix a syntax error in HowItWorks.tsx (missing comma).
-- Create the about.idp.global website (initial implementation).
-- Standardize project tech stack setup: use vite_react_shadcn_ts.
-
-## 2025-11-30 - 0.0.0 - Miscellaneous housekeeping
-Several small/undocumented updates and housekeeping commits were made on this date; no detailed changelog messages were provided.
-
-- Multiple minor updates / maintenance changes (details not specified in commit messages).
\ No newline at end of file
+- Create uptime.link landing page with uptime monitoring focus
+- Add Hero section with port detection, local network scanning, status widgets features
+- Add Features section: Port Detection, Network Scanning, Status Widgets, Alerts, Service Discovery, Self-Host, SDK, Open Source
+- Add HowItWorks section: Install CLI, Scan Network, Configure Monitors, Track & Alert
+- Add documentation pages: Introduction, Quick Start, CLI, Configuration, SDK, Widgets, Detector
+- Configure JetBrains Mono as the primary font
+- Use emerald green color scheme for uptime monitoring branding
diff --git a/index.html b/index.html
index 9f41e86..ab0a1d6 100644
--- a/index.html
+++ b/index.html
@@ -3,16 +3,21 @@
- Enterprise Identity, Open Source Freedom
+ Complete Uptime Visibility
- Everything you need to manage authentication, users, and organizations for your applications.
+ Everything you need to monitor your infrastructure and keep your services running.
-
-
+
+
- Open Source Identity Provider
+ Open Source Uptime Monitoring
- Your Digital Identity, Forever Free
+ Monitor Everything, Miss Nothing
- Get your free digital passport on idp.global. An Open Source Identity Provider with OIDC, organization management, and RBAC. Self-host or use our free SaaS.*
-
-
- * Fair Usage Policy applies
+ Open Source uptime monitoring with local network detection, automatic service discovery, and embeddable status widgets. Self-host or use our free platform.
diff --git a/src/components/HowItWorks.tsx b/src/components/HowItWorks.tsx
index f003551..ef4d750 100644
--- a/src/components/HowItWorks.tsx
+++ b/src/components/HowItWorks.tsx
@@ -1,7 +1,7 @@
import React from 'react';
import { Link } from 'react-router-dom';
-import { ArrowRight, Container, Building2, Key, Rocket } from 'lucide-react';
+import { ArrowRight, Download, Wifi, Settings, BarChart3 } from 'lucide-react';
import { Card, CardContent } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { cn } from '@/lib/utils';
@@ -9,27 +9,27 @@ import { cn } from '@/lib/utils';
const steps = [
{
number: '01',
- title: 'Deploy Your Instance',
- description: "Pull our Docker image and deploy in minutes. Configure with environment variables for MongoDB and your domain.",
- icon: Container
+ title: 'Install the CLI',
+ description: "Install the uptime.link CLI via npm or run our Docker container. Get up and running in under a minute.",
+ icon: Download
},
{
number: '02',
- title: 'Set Up Organizations',
- description: "Create organizations for your teams or clients. Invite members and assign roles with granular permissions.",
- icon: Building2
+ title: 'Scan Your Network',
+ description: "Run the detector to scan your local network. Automatically discover running services and open ports.",
+ icon: Wifi
},
{
number: '03',
- title: 'Register Your Apps',
- description: 'Add your applications as OIDC clients. Get client IDs and secrets for secure OAuth 2.0 authentication.',
- icon: Key
+ title: 'Configure Monitors',
+ description: 'Set up monitoring for your endpoints. Define check intervals, timeout thresholds, and alert rules.',
+ icon: Settings
},
{
number: '04',
- title: 'Integrate & Launch',
- description: 'Use our TypeScript SDK or standard OIDC endpoints. Your users can now authenticate across all your services.',
- icon: Rocket
+ title: 'Track & Alert',
+ description: 'View real-time status dashboards. Embed status widgets on your site and get instant downtime alerts.',
+ icon: BarChart3
}
];
@@ -41,10 +41,10 @@ const HowItWorks = () => {
Getting Started
- From Zero to SSO in Minutes
+ Start Monitoring in Minutes
- Deploy your own identity provider and integrate with your applications seamlessly
+ From installation to full uptime visibility in four simple steps
@@ -64,8 +64,8 @@ const HowItWorks = () => {
{/* Header with icon and step number */}
diff --git a/src/pages/FairUsagePolicy.tsx b/src/pages/FairUsagePolicy.tsx
deleted file mode 100644
index 19e9622..0000000
--- a/src/pages/FairUsagePolicy.tsx
+++ /dev/null
@@ -1,231 +0,0 @@
-import React from 'react';
-import { Link } from 'react-router-dom';
-import { Globe, ArrowLeft } from 'lucide-react';
-import { Button } from '@/components/ui/button';
-import { ThemeToggle } from '@/components/ThemeToggle';
-
-const FairUsagePolicy = () => {
- return (
-
- {/* Header */}
-
-
-
-
- idp.global
-
-
-
-
-
-
-
-
- {/* Content */}
-
-
-
-
-
- Fair Usage Policy
-
-
- Last updated: December 2024
-
-
-
-
-
Overview
-
- idp.global provides a free, Open Source Identity Provider platform for individuals,
- developers, and organizations. To ensure the service remains available, performant,
- and secure for all users, we have established this Fair Usage Policy. By using
- idp.global, you agree to comply with these guidelines.
-
-
-
-
-
Acceptable Use
-
- You may use idp.global for:
-
-
-
Personal digital identity management
-
Authentication for your applications and services
-
Organization and team management
-
Development, testing, and production workloads
-
Integration via our OIDC/OAuth 2.0 endpoints
-
-
-
-
-
Prohibited Activities
-
- The following activities are strictly prohibited:
-
-
-
Illegal Activities
-
-
Using the service for any unlawful purpose or in violation of any applicable laws
-
Identity theft, fraud, or impersonation of others
-
Distribution of malware, phishing, or other malicious content
-
Money laundering or financing of illegal activities
-
Violation of intellectual property rights
-
-
-
Service Abuse
-
-
Denial of Service (DoS) or Distributed Denial of Service (DDoS) attacks
-
Excessive API requests designed to overload or disrupt the service
-
Automated account creation (bot registrations), other than explicitly designed for by the platform
-
Circumventing rate limits or security measures
-
Scraping, crawling, or harvesting user data
-
Attempting to gain unauthorized access to other users' accounts or data
-
-
-
Harmful Content & Behavior
-
-
Harassment, abuse, or threats against other users
-
Spam or unsolicited bulk communications
-
Distribution of harmful, offensive, or illegal content
-
Creating accounts for the purpose of abusing invitations or referrals
-
-
-
-
-
Rate Limits
-
- To ensure fair access for all users, the following rate limits apply:
-
-
-
API requests are subject to reasonable rate limiting
-
Authentication attempts are limited to prevent brute-force attacks
-
Bulk operations (invitations, exports) may be throttled
-
-
- If you require higher limits for legitimate use cases, please contact us to discuss
- enterprise options or self-hosting.
-
-
-
-
-
Resource Limits
-
- Free accounts on the hosted platform are subject to reasonable resource limits:
-
-
-
Organizations per user: Fair use, no hard limit for legitimate purposes
-
Members per organization: Fair use, contact us for large teams
-
API tokens per user: Reasonable limits apply
-
Storage: Profile data and authentication records only
-
-
-
-
-
Our Commitment
-
- We believe that digital identity is a fundamental right. We will always try, to the best
- of our conscience, to not lock anyone out of the platform. We strive to tolerate different
- viewpoints and will not discriminate based on personal beliefs, political opinions, or
- other lawful expressions.
-
-
- That said, in the end, all decisions regarding this platform come down to our own judgment.
- We are human, and while we aim to be fair and consistent, we cannot guarantee that our
- decisions will align with everyone's expectations.
-
-
- If you have any concerns about relying on our judgment, or if you simply prefer complete
- autonomy over your identity infrastructure, we strongly encourage you to{' '}
-
- self-host your own instance
- .
- The software is fully Open Source under the MIT License, and self-hosted instances
- operate entirely under your own control with no dependency on our decisions.
-
-
-
-
-
Enforcement
-
- Violations of this Fair Usage Policy may result in:
-
-
-
Warning notifications
-
Temporary rate limiting or service restrictions
-
Suspension of account access
-
Permanent termination of accounts
-
Reporting to appropriate authorities for illegal activities
-
-
- We reserve the right to take action at our discretion to protect the service and its users.
-
-
-
-
-
Self-Hosting Alternative
-
- idp.global is Open Source (MIT License). If your use case exceeds the fair usage
- guidelines of our hosted platform, you are welcome to{' '}
-
- self-host your own instance
- {' '}
- without any restrictions. Self-hosted instances are not subject to this policy.
-
- We may update this Fair Usage Policy from time to time. Continued use of the service
- after changes constitutes acceptance of the updated policy. Significant changes will
- be announced through our usual communication channels.
-
-
-
-
-
Contact
-
- For questions about this policy or to discuss your specific use case, please contact
- us at{' '}
-
- hello@task.vc
- .
-
- );
-};
-
-export default FairUsagePolicy;
diff --git a/src/pages/docs/CLI.tsx b/src/pages/docs/CLI.tsx
new file mode 100644
index 0000000..e10a172
--- /dev/null
+++ b/src/pages/docs/CLI.tsx
@@ -0,0 +1,160 @@
+import React from 'react';
+import { Link } from 'react-router-dom';
+import { Button } from '@/components/ui/button';
+import { ArrowRight } from 'lucide-react';
+
+const CLI = () => {
+ return (
+
+
+
CLI
+
+ The uptime.link command-line interface for managing monitors and scanning networks.
+
+
+
+ {/* Installation */}
+
+
Installation
+
+ Install the CLI globally:
+
+
+ npm install -g @uptime.link/cli
+
+
+ Verify the installation:
+
+
+ uptime --version
+
+
+
+ {/* Commands */}
+
+
Commands
+
+
+ {/* scan */}
+
+
uptime scan
+
+ Scan the local network to discover running services.
+
+
+
{`uptime scan [options]
+
+Options:
+ --range IP range to scan (default: local subnet)
+ --ports Comma-separated list of ports to check
+ --timeout Connection timeout in milliseconds
+ --json Output results as JSON`}
+
+
+
+ {/* add */}
+
+
uptime add
+
+ Add an endpoint to monitor.
+
+
+
{`uptime add [options]
+
+Options:
+ --interval Check interval in seconds (default: 60)
+ --timeout Request timeout in milliseconds
+ --name Friendly name for the endpoint
+ --alert Webhook URL for alerts`}
+
+
+
+ {/* remove */}
+
+
uptime remove
+
+ Remove an endpoint from monitoring.
+
+
+
{`uptime remove `}
+
+
+
+ {/* status */}
+
+
uptime status
+
+ Show status of all monitored endpoints.
+
+
+
{`uptime status [options]
+
+Options:
+ --json Output results as JSON
+ --watch Continuously update status`}
+
+
+
+ {/* check */}
+
+
uptime check
+
+ Perform a one-time check on an endpoint.
+
+
+
{`uptime check [options]
+
+Options:
+ --timeout Request timeout in milliseconds
+ --verbose Show detailed response info`}
+
+
+
+
+
+ {/* Configuration */}
+
+
Configuration File
+
+ The CLI stores configuration in ~/.uptime.link/config.json:
+
-
-{`# Public URL of your instance (required for OAuth redirects)
-IDP_BASEURL=https://idp.yourdomain.com
-
-# Instance name shown in UI
-INSTANCE_NAME=My Company IDP`}
-
-
-
- {/* JWT Configuration */}
-
-
JWT & Security
-
- idp.global uses RS256 (RSA) for JWT signing. Keys are automatically generated and rotated.
-
-
-
Key Management
-
-
RSA key pairs are auto-generated on first startup
-
Public keys are available at /.well-known/jwks.json
-
Keys are stored in MongoDB for persistence across restarts
-
Automatic key rotation can be configured
-
-
-
-
- {/* OIDC Configuration */}
-
-
OIDC Endpoints
-
- The following OIDC endpoints are automatically configured based on your IDP_BASEURL:
+ Configure the CLI and SDK using environment variables:
-
Endpoint
-
Path
+
Variable
+
Description
+
Default
-
Discovery
-
/.well-known/openid-configuration
+
UPTIME_API_URL
+
API server URL
+
https://api.uptime.link
-
JWKS
-
/.well-known/jwks.json
+
UPTIME_API_KEY
+
API authentication key
+
-
-
Authorization
-
/oauth/authorize
+
UPTIME_CHECK_INTERVAL
+
Default check interval (seconds)
+
60
-
Token
-
/oauth/token
+
UPTIME_TIMEOUT
+
Request timeout (ms)
+
5000
-
UserInfo
-
/oauth/userinfo
-
-
-
Revocation
-
/oauth/revoke
+
UPTIME_ALERT_WEBHOOK
+
Webhook URL for alerts
+
-
- {/* Supported Scopes */}
+ {/* Config File */}
-
Supported OAuth Scopes
+
Configuration File
+
+ Create a uptime.config.json file in your project root:
+
+ Configure how you receive downtime notifications:
+
+
+
{`{
+ "alerts": {
+ // Webhook URL (Slack, Discord, etc.)
+ "webhook": "https://hooks.slack.com/services/...",
+
+ // Email notifications
+ "email": "ops@example.com",
+
+ // Number of failures before alerting
+ "threshold": 3,
+
+ // Minimum time between alerts (seconds)
+ "cooldown": 300
+ }
+}`}
+
+
+
+ {/* Next steps */}
+
+
Next Steps
+
+
+
+
);
diff --git a/src/pages/docs/Detector.tsx b/src/pages/docs/Detector.tsx
new file mode 100644
index 0000000..47c7ea8
--- /dev/null
+++ b/src/pages/docs/Detector.tsx
@@ -0,0 +1,198 @@
+import React from 'react';
+import { Link } from 'react-router-dom';
+import { Button } from '@/components/ui/button';
+import { ArrowRight } from 'lucide-react';
+
+const Detector = () => {
+ return (
+
+
+
Network Detector
+
+ Scan your local network to discover services and open ports automatically.
+
+
+
+ {/* Overview */}
+
+
Overview
+
+ The detector module scans network ranges and identifies running services based on open ports
+ and protocol responses. It supports automatic identification of common service types.
+
+
+
+ {/* Supported Services */}
+
+
Supported Services
+
+ The detector can automatically identify these service types:
+
+
+
+
+
+
Service
+
Default Port
+
Detection Method
+
+
+
+
+
HTTP
+
80
+
HTTP response headers
+
+
+
HTTPS
+
443
+
TLS handshake + HTTP
+
+
+
SSH
+
22
+
SSH banner
+
+
+
FTP
+
21
+
FTP banner
+
+
+
SMTP
+
25, 587
+
SMTP greeting
+
+
+
MySQL
+
3306
+
MySQL handshake packet
+
+
+
PostgreSQL
+
5432
+
PostgreSQL protocol
+
+
+
MongoDB
+
27017
+
MongoDB wire protocol
+
+
+
Redis
+
6379
+
Redis PING response
+
+
+
+
+
+
+ {/* CLI Usage */}
+
+
CLI Usage
+
+
{`# Scan local network
+uptime scan
+
+# Scan specific IP range
+uptime scan --range 192.168.1.0/24
+
+# Scan specific ports
+uptime scan --ports 80,443,22,3306,5432
+
+# Output as JSON
+uptime scan --json
+
+# With custom timeout
+uptime scan --timeout 3000`}
+
+
+
+ {/* SDK Usage */}
+
+
SDK Usage
+
+
{`import { Detector } from '@uptime.link/sdk';
+
+const detector = new Detector();
+
+// Scan network
+const services = await detector.scan({
+ range: '192.168.1.0/24',
+ ports: [80, 443, 22, 3306, 5432, 27017, 6379],
+ timeout: 2000,
+ concurrent: 100 // Max concurrent connections
+});
+
+// Process results
+for (const service of services) {
+ console.log(\`Found \${service.type} at \${service.host}:\${service.port}\`);
+}
+
+// Check a single port
+const isOpen = await detector.checkPort('192.168.1.1', 22);
+
+// Identify service type
+const type = await detector.identifyService('192.168.1.1', 22);
+// Returns: 'ssh' | 'http' | 'mysql' | etc.`}
+
+
+
+ {/* Service Detection */}
+
+
Service Detection Logic
+
+ The detector uses multiple methods to identify services:
+
+
+
Port matching: Common ports are checked first (e.g., 22 = SSH, 80 = HTTP)
+
Banner grabbing: Reads the initial response from the service
+
Protocol probing: Sends protocol-specific requests to confirm service type
+
TLS detection: Attempts TLS handshake for encrypted services
-
-{`# Check if the server is responding
-curl https://idp.yourdomain.com
-
-# Check OIDC discovery endpoint
-curl https://idp.yourdomain.com/.well-known/openid-configuration`}
-
-
- A modern, Open Source Identity Provider (IdP) for managing user authentication,
- organizations, and role-based access control. Built with TypeScript for SMEs and enterprises.
+ Open Source uptime monitoring with local network detection, automatic service discovery,
+ and embeddable status widgets. Built with TypeScript.
{/* Quick links */}
-
+
Quick Start
- Get up and running with idp.global in under 5 minutes.
+ Get up and running with uptime.link in under 5 minutes.
-
-
+
+
-
Docker Deployment
+
CLI Installation
- Deploy your own instance with Docker in minutes.
+ Install the command-line tool for local monitoring.
@@ -50,40 +50,40 @@ const Introduction = () => {
{[
{
- icon: Users,
- title: 'User Management',
- description: 'Email/password, magic links, API tokens, password reset, and device management.'
+ icon: Activity,
+ title: 'Port Detection',
+ description: 'Detect and monitor open ports for HTTP, SSH, databases, and more.'
},
{
- icon: Building2,
- title: 'Organizations',
- description: 'Multi-tenant architecture with member invitations and ownership transfer.'
+ icon: Wifi,
+ title: 'Network Scanning',
+ description: 'Scan local networks to discover running services automatically.'
},
{
- icon: Shield,
- title: 'Role-Based Access',
- description: 'Fine-grained RBAC with admin, member, and custom roles.'
+ icon: Globe,
+ title: 'Status Widgets',
+ description: 'Embeddable web components for real-time status display.'
},
{
- icon: Key,
- title: 'OIDC Provider',
- description: 'Full OpenID Connect compliance for third-party app SSO.'
+ icon: Bell,
+ title: 'Instant Alerts',
+ description: 'Get notified immediately when services go down.'
},
{
- icon: Container,
- title: 'Self-Hostable',
- description: 'Deploy anywhere with Docker or use our free hosted platform.'
+ icon: Server,
+ title: 'Service Discovery',
+ description: 'Automatic identification of service types (HTTP, DB, SSH).'
},
{
icon: Code2,
title: 'TypeScript SDK',
- description: 'Type-safe client libraries for browser and Node.js.'
+ description: 'Type-safe client library for programmatic access.'
},
].map((feature) => {
const Icon = feature.icon;
return (
-
+
{feature.title}
{feature.description}
@@ -96,63 +96,42 @@ const Introduction = () => {
Architecture
- idp.global is built as a modular TypeScript monorepo with the following structure:
+ uptime.link is built as a modular TypeScript monorepo with the following packages:
- Your idp.global instance is now running on port 2999. Configure your reverse proxy
- (nginx, traefik, etc.) to handle HTTPS and route traffic to the container.
-
-
-
-
- Full Docker Guide
-
-
-
- {/* Integrate with your app */}
+ {/* Step 1 */}
-
Integrate with Your Application
+
1. Install the CLI
- Once you have access to an idp.global instance, install the TypeScript client:
+ Install the uptime.link CLI globally using npm or pnpm:
-
-
-{`npm install @idp.global/idpclient`}
-
-
-
Basic Usage
-
-{`import { IdpClient } from '@idp.global/idpclient';
-
-// Initialize the client
-const idpClient = new IdpClient('https://idp.global');
-
-// Enable WebSocket connection for real-time updates
-await idpClient.enableTypedSocket();
-
-// Check if user is logged in
-const isLoggedIn = await idpClient.determineLoginStatus();
-
-if (isLoggedIn) {
- // Get current user info
- const userInfo = await idpClient.whoIs();
- console.log('User:', userInfo.user);
-
- // Get user's organizations
- const orgs = await idpClient.getRolesAndOrganizations();
- console.log('Organizations:', orgs.organizations);
-}`}
-
-
-
-
- Full SDK Documentation
-
-
-
+
- The official TypeScript client library for idp.global. Works in both browser and Node.js
- environments with full type safety.
+
TypeScript SDK
+
+ Programmatic access to uptime.link monitoring features with full TypeScript support.
{/* Installation */}
Installation
-
-{`npm install @idp.global/idpclient
-
-# or with pnpm
-pnpm add @idp.global/idpclient
-
-# or with yarn
-yarn add @idp.global/idpclient`}
-
+
+ npm install @uptime.link/sdk
+
- {/* Initialization */}
+ {/* Basic Usage */}
-
Initialization
-
-{`import { IdpClient } from '@idp.global/idpclient';
+
Basic Usage
+
+
{`import { UptimeClient } from '@uptime.link/sdk';
-// Connect to the hosted platform
-const idpClient = new IdpClient('https://idp.global');
-
-// Or connect to your self-hosted instance
-const idpClient = new IdpClient('https://idp.yourdomain.com');
-
-// Enable WebSocket for real-time updates
-await idpClient.enableTypedSocket();`}
-
-
-
- {/* Authentication */}
-
-
Authentication
-
-
Check Login Status
-
-{`// Check if user is currently logged in
-const isLoggedIn = await idpClient.determineLoginStatus();
-
-if (isLoggedIn) {
- console.log('User is authenticated');
-}`}
-
-
-
Login with Email & Password
-
-{`const response = await idpClient.requests.loginWithUserNameAndPassword.fire({
- username: 'user@example.com',
- password: 'securepassword'
+// Initialize the client
+const client = new UptimeClient({
+ apiKey: process.env.UPTIME_API_KEY, // Optional for cloud sync
});
-if (response.refreshToken) {
- // Store the refresh token securely
- await idpClient.refreshJwt(response.refreshToken);
- console.log('Login successful!');
-} else if (response.error) {
- console.error('Login failed:', response.error);
-}`}
-
+// Check an endpoint
+const result = await client.check('https://api.example.com');
-