{"id":51469982,"url":"https://github.com/pdone/version-monitor","last_synced_at":"2026-07-06T16:00:43.463Z","repository":{"id":358224644,"uuid":"1240555888","full_name":"pdone/version-monitor","owner":"pdone","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-16T09:39:23.000Z","size":172,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-16T11:39:15.635Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pdone.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-16T09:23:19.000Z","updated_at":"2026-05-16T09:38:44.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/pdone/version-monitor","commit_stats":null,"previous_names":["pdone/version-monitor"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/pdone/version-monitor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pdone%2Fversion-monitor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pdone%2Fversion-monitor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pdone%2Fversion-monitor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pdone%2Fversion-monitor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pdone","download_url":"https://codeload.github.com/pdone/version-monitor/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pdone%2Fversion-monitor/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35197534,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-06T02:00:07.184Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-07-06T16:00:42.604Z","updated_at":"2026-07-06T16:00:43.440Z","avatar_url":"https://github.com/pdone.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Version Monitor\n\n[![GHCR](https://img.shields.io/badge/GHCR-ghcr.io/pdone/version--monitor-2496ED?logo=github)](https://ghcr.io/pdone/version-monitor)\n[![Docker Hub](https://img.shields.io/badge/Docker%20Hub-pdone/version--monitor-2496ED?logo=docker)](https://hub.docker.com/r/pdone/version-monitor)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\nA web application to monitor GitHub repository releases. Get notified when new versions are available.\n\n\u003e [中文文档](https://github.com/pdone/version-monitor/blob/master/README.zh.md)\n\n## Features\n\n- Monitor GitHub repositories for new releases\n- Global cron schedule \u0026 per-repo custom cron schedule\n- Dark/Light/System theme support\n- Multi-language support (English, 简体中文)\n- Notifications via Webhook, ntfy, and VoceChat\n- Custom HTTP method \u0026 headers for each notification channel\n- Message template with variable substitution\n- Test notification sending\n- Batch notification for global cron repos\n- SQLite database for local storage\n- Modern UI with shadcn/ui components\n- Optional password protection for web interface\n- About page displaying README documentation\n\n## Screenshots\n\n### Dashboard\n![](https://cdn.awaw.cc/raw/pdone/static/master/img/project/version-monitor/1.png)\n\n### Repositories\n![](https://cdn.awaw.cc/raw/pdone/static/master/img/project/version-monitor/2.png)\n\n### Settings\n![](https://cdn.awaw.cc/raw/pdone/static/master/img/project/version-monitor/3.png)\n\n\u003e The screenshots in this document may not be updated in time, please refer to the actual effect\n\n## Tech Stack\n\n### Backend\n- Node.js + TypeScript\n- Express.js\n- Drizzle ORM + better-sqlite3\n- node-cron\n- @octokit/rest\n- Zod\n\n### Frontend\n- React 18 + TypeScript\n- Vite\n- Tailwind CSS + shadcn/ui\n- Zustand\n- React Router\n\n## Getting Started\n\n### Docker (Recommended)\n\n1. Create a `docker-compose.yml` file:\n\n```yaml\nservices:\n  version-monitor:\n    image: ghcr.io/pdone/version-monitor:latest\n    container_name: version-monitor\n    ports:\n      - \"3000:3000\"\n    volumes:\n      - ./data:/app/data\n    environment:\n      - PORT=3000\n    restart: unless-stopped\n```\n\n2. Start the service:\n\n```bash\ndocker compose up -d\n```\n\n3. Open http://localhost:3000 in your browser\n\n### Docker Build from Source\n\n```bash\ngit clone https://github.com/pdone/version-monitor.git\ncd version-monitor\ndocker compose up -d --build\n```\n\n### Manual Installation\n\n#### Prerequisites\n\n- Node.js 20+\n- npm\n\n#### Steps\n\n1. Install dependencies:\n```bash\nnpm install\ncd server \u0026\u0026 npm install\ncd ../client \u0026\u0026 npm install\n```\n\n2. Start the development server:\n```bash\n# From root directory\nnpm run dev\n```\n\nThis will start:\n- Backend server on http://localhost:3000\n- Frontend dev server on http://localhost:5173\n\n#### Production Build\n\n```bash\nnpm run build\nnpm start\n```\n\nOpen http://localhost:3000 (Express serves both API and frontend static files)\n\n## Usage\n\n1. Open http://localhost:3000 (or http://localhost:5173 in dev mode)\n2. Go to \"Repositories\" page and click \"Add Repository\"\n3. Enter the GitHub owner and repository name\n4. Configure the cron expression (default: use global schedule)\n5. The app will automatically check for new releases\n\n## Configuration\n\n### GitHub Token (Optional)\n\nTo avoid rate limiting, you can add a GitHub Personal Access Token:\n\n1. Go to Settings page\n2. Enter your GitHub token\n3. Click Save\n\n### Authentication (Optional)\n\nYou can protect the web interface with a password:\n\n1. Go to Settings page\n2. Enter your access password\n3. Click Save\n\nWhen enabled, users must enter the password to access the interface. The authentication state is stored in a cookie for 30 days if \"Remember me\" is checked.\n\n### Notifications\n\nConfigure one or more notification channels in Settings:\n\n- **Webhook**: Send HTTP request to a URL when new release is detected\n- **ntfy**: Push notifications via ntfy.sh\n- **VoceChat**: Send notifications to a VoceChat channel or user\n\nEach channel supports:\n- Custom HTTP method (GET/POST)\n- Custom request headers\n- Custom message body template\n\n#### Template Variables\n\n| Variable | Description |\n|----------|-------------|\n| `{owner}` | Repository owner |\n| `{repo}` | Repository name |\n| `{repo_full}` | Full name (owner/repo) |\n| `{latest_ver}` | Latest version |\n| `{local_ver}` | Local (current) version |\n| `{release_url}` | Release URL |\n| `{timestamp}` | ISO timestamp |\n\n### Cron Schedule\n\n- **Global cron**: Applies to all repos that use the global schedule (default: `0 2 * * *`, daily at 2 AM)\n- **Per-repo cron**: Override for individual repos (default: `0 */6 * * *`, every 6 hours)\n\n## Cron Expression Examples\n\n| Expression | Description |\n|------------|-------------|\n| `0 */6 * * *` | Every 6 hours |\n| `0 */12 * * *` | Every 12 hours |\n| `0 0 * * *` | Every day at midnight |\n| `0 2 * * *` | Every day at 2 AM (global default) |\n| `0 9 * * 1` | Every Monday at 9 AM |\n| `*/30 * * * *` | Every 30 minutes |\n\nUse [crontab.guru](https://crontab.guru) for help with cron expressions.\n\n## API Endpoints\n\n### Repositories\n\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /api/repos | List all repositories |\n| GET | /api/repos/:id | Get a repository |\n| POST | /api/repos | Add a repository |\n| PUT | /api/repos/:id | Update repository settings |\n| DELETE | /api/repos/:id | Remove a repository |\n| POST | /api/repos/:id/mark-updated | Mark as updated |\n| POST | /api/repos/:id/check | Trigger manual check |\n\n### Settings\n\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /api/settings | Get all settings |\n| GET | /api/settings/defaults | Get default notification templates |\n| PUT | /api/settings | Update settings |\n| POST | /api/settings/test-notification | Send test notification |\n\n### Authentication\n\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /api/auth/check | Check if authentication is required |\n| POST | /api/auth/verify | Verify password |\n\n### About\n\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /api/about | Get README content (supports `?lang=zh` for Chinese) |\n\n### Status\n\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /api/status | Server status |\n\n## CI/CD\n\nWhen a new tag is pushed (e.g., `v1.0.0`), GitHub Actions will automatically build and publish the Docker image to GitHub Container Registry (ghcr.io).\n\n```bash\ngit tag v1.0.0\ngit push origin v1.0.0\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpdone%2Fversion-monitor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpdone%2Fversion-monitor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpdone%2Fversion-monitor/lists"}