{"id":13624997,"url":"https://github.com/soatok/dunktags","last_synced_at":"2025-10-07T01:11:08.942Z","repository":{"id":83409198,"uuid":"447099562","full_name":"soatok/dunktags","owner":"soatok","description":"Generate a hashtag for a terrible take so you can dunk on it without boosting engagement","archived":false,"fork":false,"pushed_at":"2024-01-05T20:11:39.000Z","size":1006,"stargazers_count":8,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-05-07T23:43:27.622Z","etag":null,"topics":["social-media","twitter"],"latest_commit_sha":null,"homepage":"https://soatok.blog/2022/01/12/dont-dunk-the-gunk/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/soatok.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2022-01-12T06:16:25.000Z","updated_at":"2022-11-22T05:08:59.000Z","dependencies_parsed_at":"2023-03-12T18:14:27.765Z","dependency_job_id":null,"html_url":"https://github.com/soatok/dunktags","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soatok%2Fdunktags","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soatok%2Fdunktags/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soatok%2Fdunktags/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soatok%2Fdunktags/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/soatok","download_url":"https://codeload.github.com/soatok/dunktags/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252973617,"owners_count":21834105,"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","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":["social-media","twitter"],"created_at":"2024-08-01T21:01:49.432Z","updated_at":"2025-10-07T01:11:03.920Z","avatar_url":"https://github.com/soatok.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"# Dunktags\n  \n[![Linux Build Status](https://travis-ci.org/soatok/dunktags.svg?branch=master)](https://travis-ci.org/soatok/dunktags)\n[![npm version](https://img.shields.io/npm/v/dunktags.svg)](https://npm.im/dunktags)\n\nGenerate hashtags from the URLs of bad tweets, to coordinate dunks on the original tweet\n**without** boosting said tweet's status in the Twitter Algorithm.\n\n\u003e *[**Don't Dunk the Guunk**: How to Avoid Accidentally Amplifying Assholes on Twitter](https://soatok.blog/2022/01/12/dont-dunk-the-gunk/)*\n\n![Just say No to bad opinions.](https://raw.githubusercontent.com/soatok/soatok/master/stickers/SoatokTelegrams2020-04.png)\n\n## The Problem\n\nEvery once in a while, some jerk tweets something extremely stupid, immoral, incorrect, or\notherwise tempting to dunk on. \n\nFor example:\n\n![A bad tweet by a dumb organization](https://raw.githubusercontent.com/soatok/dunktags/master/docs/bad-tweet.jpg)\n\nWhenever something like this happens, a lot of people give into the temptation to dunk on\nthese clowns.\n\nUnfortunately, this means that the bad tweet gets a lot of **Replies** and **Quote Tweets**.\nThis amplifies their bad opinion to a wider audience and tells the Twitter Algorithm that\nthis tweet is hotcakes, and that they should show it to more unrelated people in order to\nfurther \"the conversation\".\n\nNaturally, shitty people are clued into this fact, and will act accordingly.\n\n![Milking outrage for more engagement](https://raw.githubusercontent.com/soatok/dunktags/master/docs/bad-tweet-2.png)\n\n**Why do well-meaning people keep falling for this?**\n\n![We can do beter.](https://raw.githubusercontent.com/soatok/soatok/master/stickers/Soatok_STICKERPACK-FACEPAW.png)\n\n## How Dunktags Help\n\nRather than *totally* refrain from dunking on someone for being bigoted or stupid, let's\njust be smarter about how we dunk.\n\nHere's what you do:\n\n1. Take a screenshot of the offending tweet. (See examples above.)\n2. Archive the original tweet.\n   * This is important, because screenshots can be faked, and you want to keep receipts\n     if possible.\n   * Some archive services you can use:\n     * [The Internet Archive](https://archive.org)\n     * [Archive Today](https://archive.fo)\n3. Use this library to generate a **dunktag** from the original tweet URL.\n4. When you choose to dunk on this clown, instead of replying or quote-tweeting them, \n   simply post your screenshot (and archive URLs) with the hashtag generated by the\n   `dunktag()` function.\n\nNow you can dunk away without accidentally amplifying hate speech.\n\n## Technical Documentation\n\n### Installing this Library\n\nFrom npm:\n\n```terminal\nnpm install dunktags\n```\n\nIf you want to use dunktags globally, make sure you pass the `-g` flag.\n\n```terminal\nnpm install -g dunktags\n```\n\n### Using this Library after Installing\n\n#### Command Line\n\nFirst, make sure you run `tsc` to compile from TypeScript to JavaScript.\n\nNext, launch Node.js like so:\n\n```terminal\nnode\n```\n\nNext, you should have a `\u003e` prompt. Type the following then press enter:\n\n```nodejs\nconst { dunktag } = require('dunktags');\n```\n\nNow you can use the `dunktag()` function at your leisure.\n\n```terminal\n\u003e dunktag('https://twitter.com/SoatokDhole/status/1103407038468681741');\n'#dunk_6ea7143150'\n\u003e \n```\n\n#### TypeScript Applications\n\n```typescript\nimport { dunktag } from \"dunktags\";\n\nconsole.log(dunktag('https://twitter.com/SoatokDhole/status/1481105268138258437'));\n// Outputs #dunk_3e45fd4499\n```\n\n#### JavaScript Applications\n\n```javascript\nconst { dunktag } = require('dunktags');\nconsole.log(dunktag('https://twitter.com/SoatokDhole/status/1481105268138258437'));\n// Outputs #dunk_3e45fd4499\n```\n\n## Algorithm Description\n\nDunktags use BLAKE2b under the hood, with an output length of 5 bytes (10 hex characters),\nand a constant BLAKE2b key of `0x572a7ff65e3969e1d1f43911cc07ff82463e5ae113f248dc9035d5e21aabad85`\n(for domain separation). The key is the BLAKE2b hash of the string,\n`Soatok Dreamseeker's dunktag function`.\n\nFirst, the Twitter user's tweet ID is extracted from the tweet. (Function: `getTweetId()`)\n\nNext, the BLAKE2b hash of this tweet ID is calculated, using the above parameters.\n\nThis hex-encoded hash is returned with a constant prefix (`#dunk_`).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoatok%2Fdunktags","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsoatok%2Fdunktags","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoatok%2Fdunktags/lists"}