{"id":50938445,"url":"https://github.com/pwnwriter/pingme","last_synced_at":"2026-06-17T11:32:26.011Z","repository":{"id":363256946,"uuid":"1262468677","full_name":"pwnwriter/pingme","owner":"pwnwriter","description":"Discord bot to scan and notify nearby CTF and hackathons.","archived":false,"fork":false,"pushed_at":"2026-06-08T04:55:39.000Z","size":31,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-08T06:27:06.395Z","etag":null,"topics":["ctf","discord-bot","hackathons"],"latest_commit_sha":null,"homepage":"","language":"Python","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/pwnwriter.png","metadata":{"files":{"readme":".github/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":null,"dco":null,"cla":null}},"created_at":"2026-06-08T02:44:18.000Z","updated_at":"2026-06-08T04:55:42.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/pwnwriter/pingme","commit_stats":null,"previous_names":["pwnwriter/pingme"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/pwnwriter/pingme","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pwnwriter%2Fpingme","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pwnwriter%2Fpingme/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pwnwriter%2Fpingme/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pwnwriter%2Fpingme/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pwnwriter","download_url":"https://codeload.github.com/pwnwriter/pingme/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pwnwriter%2Fpingme/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34447264,"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-06-17T02:00:05.408Z","response_time":127,"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":["ctf","discord-bot","hackathons"],"created_at":"2026-06-17T11:32:24.935Z","updated_at":"2026-06-17T11:32:26.005Z","avatar_url":"https://github.com/pwnwriter.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# pingme\n\n***Scans for upcoming hackathons and CTF competitions near you and sends Discord notifications. Runs on GitHub Actions — no server needed***\n\n\u003cimg width=\"368\" height=\"290\" alt=\"Screenshot 2026-06-08 at 12 51 26 AM\" src=\"https://github.com/user-attachments/assets/e0a3467c-087b-4013-b542-3f00a6c31fee\" /\u003e\n\n\n## Why\n\nI missed more than 10 CTF competitions just because I didn't know they were happening nearby. By the time I'd find out, registration was closed or the event was already over. Built this so I'd never miss one again.\n\n## Setup\n\n1. Fork this repo\n2. Edit `config.yaml` with your location\n3. Add `DISCORD_BOT_TOKEN` and `DISCORD_CHANNEL_ID` as GitHub Actions secrets\n4. Run from the Actions tab or wait for the next scheduled scan (Monday \u0026 Thursday, 9am EST)\n\n\u003cdetails\u003e\n\u003csummary\u003eDiscord bot setup\u003c/summary\u003e\n\n\u003e Full reference: [Discord Developer Docs — Getting Started](https://discord.com/developers/docs/getting-started)\n\n**Create the bot:**\n\n1. Go to [discord.com/developers/applications](https://discord.com/developers/applications) → **New Application**\n2. Go to **Bot** → click **Reset Token** → copy the token (you'll only see it once)\n3. Under **Privileged Gateway Intents**, enable **Message Content Intent**\n\n**Invite it to your server:**\n\n4. Go to **OAuth2** → **URL Generator**\n5. Scope: `bot`\n6. Permissions: `Send Messages`, `Manage Messages`, `Read Message History`, `View Channels`\n7. Open the generated URL → select your server → **Authorize**\n\n**Get the channel ID:**\n\n8. In Discord → **User Settings** → **App Settings** → **Advanced** → enable **Developer Mode**\n9. Right-click the channel you want notifications in → **Copy Channel ID**\n\n**Add secrets to GitHub:**\n\n10. In your fork → **Settings** → **Secrets and variables** → **Actions** → add two secrets:\n    - `DISCORD_BOT_TOKEN` — your bot token\n    - `DISCORD_CHANNEL_ID` — the channel ID\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eConfiguration\u003c/summary\u003e\n\n```yaml\nlocation:\n  city: \"Baltimore\"\n  lat: 39.2904\n  lon: -76.6122\n  radius_km: 200\n  include_online: true\n\nsources:\n  ctftime: true\n  mlh: true\n\nnotify:\n  days_ahead: 21\n```\n\n| Field | Description |\n|-------|-------------|\n| `location.lat` / `location.lon` | Coordinates for distance filtering |\n| `location.radius_km` | How far to search (km) |\n| `location.include_online` | Include online/virtual events |\n| `sources.ctftime` | Enable CTFtime scanning |\n| `sources.mlh` | Enable MLH scanning |\n| `notify.days_ahead` | How far ahead to look for events |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eRun locally\u003c/summary\u003e\n\n```bash\nDISCORD_BOT_TOKEN=\"your-token\" DISCORD_CHANNEL_ID=\"123456\" uv run main.py\n```\n\n\u003c/details\u003e\n\n## Sources\n\n- [CTFtime](https://ctftime.org) — CTF competitions\n- [MLH](https://mlh.io) — Hackathons\n\n## Contributing\n\nPRs welcome — especially new event sources. To add one, create a file in `sources/` that exports a `fetch_events(config) -\u003e list[Event]` function and enable it in `config.yaml`.\n\nBug fixes, better parsing, and new notifiers (Slack, Telegram, etc.) are all fair game too.\n\n\n## License\n Licensed under the [**`MIT LICENSE`**](/LICENSE) \n\n \n\u003cp align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/catppuccin/catppuccin/main/assets/footers/gray0_ctp_on_line.svg?sanitize=true\" /\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003eCopyright \u0026copy; 2026 - present \u003ca href=\"https://pwnwriter.me\" target=\"_blank\"\u003e pwnwriter me \u003c/a\u003e ☘️\u003c/p\u003e \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpwnwriter%2Fpingme","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpwnwriter%2Fpingme","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpwnwriter%2Fpingme/lists"}