Skip to main content

CI

Endpoint Pulse

Project URL: https://github.com/zopyx/zopyx-url-checker-dashboard

Note: This repository is a vibe coding experiment.

A small FastAPI + Bootstrap application to organize and monitor website URLs. You can group URLs in folders (categories), toggle whether a URL is active, and probe availability with HTTP status and response time. The left sidebar shows a collapsible tree of folders/URLs; the right pane shows context forms. Everything is server-rendered with Bootstrap forms.

Purpose

This project provides a lightweight, self-hosted dashboard to:

  • Keep URLs organized by category (folders)
  • Quickly test the availability of a single URL or all URLs in a folder
  • Track basic metadata (name, comment, active flag)
  • Use a clean UI without writing any custom JavaScript

Typical use cases include health checking public endpoints, QA/staging links, and simple uptime spot checks.

Tech Stack

  • Python 3.12
  • FastAPI (server + JSON API)
  • Jinja2 templates (server-rendered UI)
  • Bootstrap 5 (styling) + Bootstrap Icons
  • httpx (HTTP client)
  • Pydantic v2 (validation)

Installation

  1. Ensure Python 3.12 is installed.
  2. Recommended: Use uv for faster and more reliable dependency management. Install uv (see uv installation docs for more options):
    curl -LsSf https://astral.sh/uv/install.sh | sh
    
    Then, create and activate a virtual environment, and install dependencies:
    python -m venv .venv
    source .venv/bin/activate
    uv sync
    
    Alternatively, using pip:
    python -m venv .venv
    source .venv/bin/activate
    pip install -r requirements.txt
    

Installing the package from TestPyPI

When installing from TestPyPI, most third-party dependencies are not available on TestPyPI. Use the main PyPI as an extra index so pip can resolve dependencies like FastAPI and setuptools from PyPI while fetching this package from TestPyPI:

pip install --index-url https://test.pypi.org/simple/ \
            --extra-index-url https://pypi.org/simple \
            endpoint-pulse

Note: We constrain FastAPI to < 1.0 to avoid a known problematic fastapi==1.0 build on TestPyPI which requires setuptools from TestPyPI (not available). The extra-index-url ensures dependencies are pulled from the official PyPI.

Running the App

Start the development server with auto-reload:

uvicorn endpoint_pulse.app:app --reload

Or use the packaged console script (after installing the package):

endpoint-pulse --host 0.0.0.0 --port 8000 --reload

Environment variables are also supported when flags are omitted:

  • ENDPOINT_PULSE_HOST (default: 127.0.0.1)
  • ENDPOINT_PULSE_PORT (default: 8000)
  • ENDPOINT_PULSE_RELOAD (set to 1/true/on to enable)

Open your browser at:

Testing

Unit/Integration tests with coverage

pip install -r requirements.txt
make tests

This runs pytest (excluding Playwright/browser tests) with coverage and prints a term-missing coverage report for main.py. Tests run against a temporary, isolated database by overriding environment variables in fixtures, so your production data is not modified.

Alternatively, without make:

python -m pytest -m "not playwright" --cov=main --cov-report=term-missing

End-to-end (Playwright) tests

Install browsers once:

python -m playwright install

Run E2E tests:

python -m pytest -m playwright tests_e2e

The E2E harness launches uvicorn on a random local port with an isolated data store.

Data Persistence

Data and configuration are stored in a local SQLite database at data.sqlite3 in the project root (override with DB_FILE). The schema has folders, nodes, and a small meta table for ID counters.

Architecture Notes

  • Startup initialization: The database schema is initialized once at app startup via FastAPI's lifespan. This avoids redundant schema checks per request and improves efficiency.
  • Modularity: The current codebase is intentionally compact. Future work may extract database access and request handlers into separate modules (e.g., db.py, services.py, api_routes.py) and adopt an ORM like SQLAlchemy for more maintainable data access.

UI Overview (Server-rendered)

  • Left: collapsible tree of folders and their URLs.
  • Right: context forms for adding/renaming/deleting folders, adding/editing/deleting/testing URLs.
  • Test results show below the forms in a compact table.
  • Preferences modal with a dark mode toggle (stored in a cookie).

Notes

  • Authentication/authorization: none (intended for local/network use). Place behind a reverse proxy with auth if needed.
  • Timeouts: Configurable via Preferences (default 10 seconds) per request when probing URLs.
  • Redirects: HTTP redirects are followed during probes.
  • Dark mode preference is stored in a cookie (theme = light/dark).

Visualization

  • After running tests, the page shows a compact response time chart (inline SVG) beneath the results table, including number of requests (measured/total) and average response time.

Author

Andreas Jung info@zopyx.com

This experiment was conducted using PyCharm, Junie, and GPT-5.

Release files for endpoint-pulse 0.2.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for endpoint-pulse 0.2.3
File Size Uploaded
endpoint_pulse-0.2.3.tar.gz 40.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for endpoint-pulse 0.2.3
File Interpreter ABI Platform
endpoint_pulse-0.2.3-py3-none-any.whl Python 3 none any Details

Total release size: 73.4 kB

Release files / endpoint_pulse-0.2.3.tar.gz

Download URL endpoint_pulse-0.2.3.tar.gz
Size 40.4 kB
Tags Source
SHA-256 checksum
How to use checksums
bdbc13d066db96ee15c8d80a46f23329de104ca4a2b0dfd5e2827b135f0efae1
BLAKE2b-256 checksum
How to use checksums
9882dbbcfdbc680f67856a8f82a51b7aa64eb0027ecd16b45f8436eda3b06c1e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.0

Release files / endpoint_pulse-0.2.3-py3-none-any.whl

Download URL endpoint_pulse-0.2.3-py3-none-any.whl
Size 33.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ff21833dd6d1056c4322f6c5523522fd74d4a6f9442194ad6900f529efe677eb
BLAKE2b-256 checksum
How to use checksums
05e56e9023c20f1aedbe5e4bfac69c378e439b5f0e9d3457d52598da2835d7ab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.0

Release history Release notifications | RSS feed

This release

0.2.3 This release

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page