{"id":19707823,"url":"https://github.com/fdebijl/nosedits","last_synced_at":"2025-07-22T11:40:35.499Z","repository":{"id":40461420,"uuid":"154520646","full_name":"fdebijl/NOSedits","owner":"fdebijl","description":"Track changes to titles in NOS articles","archived":false,"fork":false,"pushed_at":"2025-07-12T00:33:04.000Z","size":754,"stargazers_count":16,"open_issues_count":11,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-12T03:01:38.927Z","etag":null,"topics":["journalism","nos","nosedits","opentitles"],"latest_commit_sha":null,"homepage":"https://twitter.com/nosedits","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/fdebijl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2018-10-24T15:01:01.000Z","updated_at":"2025-04-09T10:13:31.000Z","dependencies_parsed_at":"2024-04-01T13:28:35.643Z","dependency_job_id":"c3e030f5-e2f8-4278-86bb-f30fa896cfb9","html_url":"https://github.com/fdebijl/NOSedits","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/fdebijl/NOSedits","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fdebijl%2FNOSedits","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fdebijl%2FNOSedits/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fdebijl%2FNOSedits/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fdebijl%2FNOSedits/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fdebijl","download_url":"https://codeload.github.com/fdebijl/NOSedits/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fdebijl%2FNOSedits/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266486736,"owners_count":23937011,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-22T02:00:09.085Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"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":["journalism","nos","nosedits","opentitles"],"created_at":"2024-11-11T21:39:58.489Z","updated_at":"2025-07-22T11:40:35.450Z","avatar_url":"https://github.com/fdebijl.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# [NOSedits](https://twitter.com/nosedits)\nTrack changes to titles in NOS articles\n\u003cbr\u003e\u003cbr\u003e\n### How does it work?\nNOSEdits receives title changes from [OpenTitles](https://github.com/Fdebijl/OpenTitles.Scraper). These are checked for validity, once they pass all the tests a tweet is issued that the title has been changed.\n\u003cbr\u003e\u003cbr\u003e\n### Technical Details\nNOSEdits uses AMQP to listen for title changes dispatched by OpenTitles. Once a message is received it will be checked for validity by `/src/util/validateArticle.ts`. If this method passes, it will be passed on to `/src/twitter/sendTweet.ts` to issue a Tweet for this article. Most checks are self-contained, but to make sure double-posting doesn't happen we also keep track of all Tweets via MongoDB. This database contains all previously issued Tweets with the old title, the new title and the Tweet (formally called a status) as returned by the Twitter API.\n \nThe deprecated WebhookListener uses Express to listen for POST requests on `localhost:7676/notify`, but otherwise uses the same validation methods that the AMQP listener uses.\n\u003cbr\u003e\u003cbr\u003e\n### Building and running\nEither locally with dotenv and Node:\n```sh\nnpm ci\nnpm run compile\nnode -r dotenv/config dist/index.js\n```\n\nOr by using the Dockerfile:\n```sh\ndocker image build -t fdebijl/nosedits .\ndocker container run --publish 7676:7676 --detach --name nosedits fdebijl/nosedits\n```\n\nYou will need a set of API keys from Twitter in order to actually send out a Tweet when a changed title is detected. You can get these from the [Twitter Developer](https://developer.twitter.com/en/apply-for-access) site. These keys are picked up from the following environment variables:\n```\nCONSUMER_KEY\nCONSUMER_SECRET\nACCESS_TOKEN\nACCESS_TOKEN_SECRET\n```\ndotenv is included as a devDependency, it is recommended to use a `.env` file for local testing. See `/src/config.ts` for other relevant environment variables, such as the MongoDB connection string and RabbitMQ exchange URI.\n\u003cbr\u003e\u003cbr\u003e\n### Testing\n```sh\nnpm ci\nnpm run simpletest\n# or 'npm run test' when collecting coverage\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffdebijl%2Fnosedits","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffdebijl%2Fnosedits","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffdebijl%2Fnosedits/lists"}