{"id":43657212,"url":"https://github.com/johnsyweb/eventuate","last_synced_at":"2026-04-11T14:10:03.528Z","repository":{"id":239409347,"uuid":"799453205","full_name":"johnsyweb/eventuate","owner":"johnsyweb","description":"Extracts information from parkrun event result pages for inclusion in reports. It's not a run report generator as such, but will help you write a weekly report for an event.","archived":false,"fork":false,"pushed_at":"2026-03-23T22:27:35.000Z","size":38951,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-24T21:19:43.175Z","etag":null,"topics":["bookmarklet","chrome-extension","firefox-extension","parkrun","userscript","webextension"],"latest_commit_sha":null,"homepage":"https://www.johnsy.com/eventuate/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/johnsyweb.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","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":"2024-05-12T07:29:23.000Z","updated_at":"2026-03-23T22:27:38.000Z","dependencies_parsed_at":null,"dependency_job_id":"8d13a800-041c-4b1b-8a9b-8a56c5415ec2","html_url":"https://github.com/johnsyweb/eventuate","commit_stats":null,"previous_names":["johnsyweb/eventuate"],"tags_count":48,"template":false,"template_full_name":null,"purl":"pkg:github/johnsyweb/eventuate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johnsyweb%2Feventuate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johnsyweb%2Feventuate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johnsyweb%2Feventuate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johnsyweb%2Feventuate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/johnsyweb","download_url":"https://codeload.github.com/johnsyweb/eventuate/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johnsyweb%2Feventuate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31683103,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-11T13:07:20.380Z","status":"ssl_error","status_checked_at":"2026-04-11T13:06:47.903Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["bookmarklet","chrome-extension","firefox-extension","parkrun","userscript","webextension"],"created_at":"2026-02-04T21:04:38.777Z","updated_at":"2026-04-11T14:10:03.515Z","avatar_url":"https://github.com/johnsyweb.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Eventuate [![Mozilla / Firefox][mozilla-image]][Mozilla] [![Google Chrome / Chromium][chromewebstore-image]][Google Chrome]\n\nExtracts information from parkrun event result pages for inclusion in reports.\nIt's not a run report generator, but will help you write a weekly report for an\nevent.\n\n## Introduction\n\nI wrote this while volunteering as a Run Director at the beautiful [Brimbank\nparkrun][brimbank], to make it easy to celebrate our community's achievements on\nthe [Brimbank parkrun Facebook page][facebook]. I am sharing it so that you get\nto enjoy it too.\n\nI initially wrote this as a Firefox Add-On, as the developer tooling is pretty\ngood in this space and Firefox Browser Add-Ons are pretty easy to distribute.\nHowever, once I worked out I could generate a userscript as part of the\nautomated release process and run it in any browser with a userscript manager,\nincluding iOS and iPadOS devices, I switched to using that!\n\n## Description\n\nIf you volunteer at [parkrun] and produce an event report to celebrate\nachievements, this addon will make your life easier!\n\nAs soon as the latest results page loads for an event, you'll see a bunch of\nuseful text before the results table is displayed, including:\n\n- Weekly event summary\n- New milestone club members\n- Kudos for new parkrunners\n- Welcome for first-time visitors\n- Celebrating personal bests\n- Acknowledgement of walking and running groups\n- Link to the full results\n- Gratitude to volunteers\n- Invitation to volunteer with a link to the roster\n- Reminder to bring a barcode\n- Reminder about junior supervision policy for 5km events\n- Overall event summary facts and figures\n\n![Eventuate extension output displaying Brimbank parkrun event #332 summary with yellow background. Shows participant statistics including 112 parkrunners, 8 volunteers, 3 milestone achievers, 8 first-timers, 17 personal bests, and various community statistics. Contains red notification banner indicating this is extracted data for report writing assistance.][eventuate-results-summary-image]\n\n## Internationalisation\n\nEventuate automatically detects your browser's language and displays reports in\nthe appropriate language. Currently supported languages:\n\n- **English** 🇬🇧 (default)\n- **German** 🇩🇪 (Deutsch)\n\nYou can easily switch between languages using the flag buttons that appear at\nthe top of the Eventuate output. Your language preference is saved and will be\nremembered across browser sessions.\n\n### Adding a New Language\n\nWe welcome contributions to add support for additional languages! Here's how to\nadd a new language:\n\n1. **Create a new translation file**:\n\n   ```sh\n   # Copy the English template\n   cp src/translations/en.ts src/translations/[language-code].ts\n   ```\n\n2. **Translate all strings** in the new file. Each translation file contains:\n   - Language metadata (flag emoji and language name)\n   - Event summaries and introductions\n   - Milestone celebration messages\n   - Volunteer acknowledgments\n   - Personal best celebrations\n   - Loading messages and fallback text\n   - Milestone club names (e.g., \"10 club\", \"25 club\", etc.)\n\n3. **Register the new language** in `src/translations/index.ts`:\n\n   ```typescript\n   import { [language-code] } from './[language-code]';\n\n   export const translations: Record\u003cstring, TranslationKeys\u003e = {\n     en,\n     de,\n     [language-code], // Add your new language here\n   };\n   ```\n\n4. **Test your translation**:\n\n   ```sh\n   pnpm test\n   pnpm build\n   ```\n\n5. **Submit a pull request** with your translation.\n\n### Translation Guidelines\n\n- Use British English spelling conventions (e.g., \"colour\" not \"color\")\n- Maintain the friendly, celebratory tone of parkrun reports\n- Keep milestone club names consistent with parkrun terminology\n- Test with real parkrun data to ensure translations work correctly\n- Consider cultural differences in how achievements are celebrated\n\n### Supported parkrun Countries\n\nEventuate works with parkrun results pages from all countries. Adding\ntranslations helps make the tool more accessible to parkrun communities\nworldwide.\n\n## Development status [![Node.js CI][ci-badge]][Node.js CI]\n\nI wrote this for myself in an afternoon to see if I could do it and figured it\nmay be useful to others. I then spent a while over-engineering it in TypeScript\nand adding some unit tests using `jest`.\n\n## Building locally\n\n### Prerequisites\n\nThis project uses [mise](https://mise.jdx.dev/) to manage tool versions from\n`.tool-versions`.\n\n```sh\n# Install mise (if you haven't already)\ncurl https://mise.run | sh\n\n# Add mise to your shell (if not already done)\necho 'eval \"$(~/.local/bin/mise activate zsh)\"' \u003e\u003e ~/.zshrc\n# or for bash:\necho 'eval \"$(~/.local/bin/mise activate bash)\"' \u003e\u003e ~/.bashrc\n\n# Install all tools\nmise install\n\n# Enable corepack for pnpm (if available)\ncorepack enable\n\n# Verify installations\nnode --version \u0026\u0026 pnpm --version \u0026\u0026 ruby --version\n```\n\n**Requirements**:\n\n- Node.js 24.10.0\n- pnpm 10.5.2 (via mise and corepack)\n- Ruby 3.4.7 (for Jekyll documentation builds)\n\n### Building the Extension\n\nOnce the tools are installed:\n\n```sh\npnpm i        # Install the development dependencies\npnpm t        # Run unit tests\npnpm package  # Package up all the things for Firefox and Chromium browsers\npnpm web-ext:lint  # Verify package for Firefox\n```\n\nOr if Docker's more your thing:\n\n```sh\ndocker buildx build . -o target\n```\n\n### Building the Userscript and Bookmarklet\n\nThe userscript and bookmarklet are built automatically as part of the\n`pnpm package` command. They will be generated in:\n\n- Userscript: `target/eventuate.user.js`\n- Bookmarklet: `docs/bookmarklet/index.md`\n\nTo build them individually:\n\n```sh\npnpm webpack --config webpack.userscript.config.js\npnpm webpack --config webpack.bookmarklet.config.js\n```\n\nThe userscript can be installed in browsers that support userscript managers\nlike [Tampermonkey][tampermonkey], [Userscripts][userscripts], or\n[Greasemonkey][greasemonkey]. The bookmarklet can be used in any browser,\nincluding Safari on iOS devices, by creating a bookmark with the generated\nJavaScript code.\n\n### Building the Documentation\n\nThe project includes Jekyll-based documentation that can be built locally:\n\n```sh\n# Install Jekyll dependencies\ncd docs\nbundle install\n\n# Build the documentation site\nbundle exec jekyll build --baseurl /eventuate\n\n# Serve the documentation locally\nbundle exec jekyll serve --baseurl /eventuate --port 4000\n```\n\nThe documentation will be available at `http://localhost:4000/eventuate/` and\nincludes:\n\n- Project overview and features\n- Installation instructions\n- Internationalization support\n- Development guidelines\n\n### Troubleshooting\n\n#### pnpm command not found\n\nUse mise to provide pnpm:\n\n1. **Install tools**: `mise install` (uses `.mise.toml` to install Node and\n   enable pnpm via corepack)\n2. **Run via mise**: `mise exec -- pnpm \u003ccommand\u003e` if your shell doesn’t\n   auto-activate mise\n\n## Running locally\n\nFirst, let's turn the TypeScript files into a single JavaScript file to be\nconsumed by `web-ext`...\n\n```sh\npnpm build:watch\n```\n\n...`:watch` means we can edit the `.ts` files and have our change reflected in\nan instant.\n\nSecond, in another terminal, let's start up Firefox and see our code in\naction...\n\n```sh\npnpm start\n```\n\n## Installing in a browser from source\n\n1. Download this repository to a suitable location on your computer.\n1. In Firefox, navigate to \"about:debugging#/runtime/this-firefox\"\n1. Use the \"Load Temporary Add-on...\" button.\n1. Browse to and open the file `manifest.json` from the location where it was\n   saved.\n1. The add-on will now appear in the add-on manager’s list of installed add-ons\n   and be ready to use\n1. Navigate to a results page such as:\n   - **English**: \u003chttps://www.parkrun.com.au/timboon/results/latestresults/\u003e\n   - **German**:\n     \u003chttps://www.parkrun.com.de/priessnitzgrund/results/latestresults/\u003e\n\nObserve the additional details between the title and the event table.\n\n## Requirements\n\nThis was built with [Firefox][firefox] in mind but also works in Chromium-based\nbrowsers, using the `chromium` artefacts. Enjoy!\n\n## Contributing\n\nBug reports and pull requests are welcome on [GitHub]. Everyone interacting in\nthe eventuate project's codebases, issue trackers, _etcetera_ is expected to\nfollow the [code of conduct].\n\nWe use semantic commits in this project. Please see our [contibution\nguidelines][contributing] for more information about the preferred commit\nmessage format.\n\n## Releasing\n\nThis project uses [semantic-release][semantic-release] to automate version\nmanagement and package releases. The release process is triggered automatically\nwhen changes are pushed to the `main` branch.\n\nThe process will:\n\n1. Analyze commits to determine the next version number\n2. Update the CHANGELOG.md\n3. Create a new GitHub release\n4. Build and attach extension packages:\n   - Firefox extension (`.zip`)\n   - Chrome extension (`.zip`)\n   - Userscript (`.user.js`)\n   - Bookmarklet installation page (`.html`)\n\nTo test the release process locally:\n\n```sh\nGITHUB_TOKEN=your-token pnpm semantic-release --dry-run\n```\n\nThe version number will be automatically incremented based on your commits:\n\n- `fix:` → patch (0.0.x)\n- `feat:` → minor (0.x.0)\n- `BREAKING CHANGE:` → major (x.0.0)\n\n## License [![license][license-image]][licence]\n\nThe addon is available as open source under the terms of the [MIT License].\n\n\u003c!-- Links --\u003e\n\n[chromewebstore-image]:\n  https://img.shields.io/chrome-web-store/v/dgkpaaeifngfeelldljpdlnmacdpceba?logo=chromewebstore\n[ci-badge]:\n  https://github.com/johnsyweb/eventuate/actions/workflows/node.js.yml/badge.svg\n[code of conduct]:\n  https://github.com/johnsyweb/eventuate/blob/main/CODE_OF_CONDUCT.md\n[GitHub]: https://github.com/johnsyweb/eventuate/\n[Google Chrome]:\n  https://chromewebstore.google.com/detail/eventuate/dgkpaaeifngfeelldljpdlnmacdpceba\n[licence]: https://github.com/johnsyweb/eventuate/blob/HEAD/LICENSE.txt\n[license-image]:\n  https://img.shields.io/github/license/mashape/apistatus.svg?style=flat-square\n[MIT License]: https://opensource.org/licenses/MIT\n[mozilla-image]: https://img.shields.io/amo/v/eventuate?logo=mozilla\n[Mozilla]:\n  https://addons.mozilla.org/firefox/addon/eventuate/\n  'Mozilla / Firefox'\n[Node.js CI]:\n  https://github.com/johnsyweb/eventuate/actions/workflows/node.js.yml\n[parkrun]: https://www.parkrun.com/\n[brimbank]: https://www.parkrun.com.au/brimbank/\n[facebook]: https://www.facebook.com/brimbankparkrun\n[firefox]: https://mozilla.org/firefox\n[contributing]: docs/CONTRIBUTING.md\n[semantic-release]: https://github.com/semantic-release/semantic-release\n[tampermonkey]: https://www.tampermonkey.net/\n[userscripts]: https://github.com/quoid/userscripts\n[greasemonkey]: https://www.greasespot.net/\n\n\u003c!-- Images --\u003e\n\n[eventuate-results-summary-image]: ./docs/images/eventuate-results-summary.png\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjohnsyweb%2Feventuate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjohnsyweb%2Feventuate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjohnsyweb%2Feventuate/lists"}