{"version":"1.1.0","schema":"https://oneagentaday.com/api/schema.json","agent":{"title":"Roast My GitHub","slug":"roast-my-github","date":"2026-10-13","issue":39,"category":"fun","categoryLabel":"Fun & Weird","tags":["github","writing","profile"],"difficulty":"easy","runtimes":["ChatGPT","Claude","Gemini"],"excerpt":"Hand it a GitHub profile and get a sharp, affectionate roast of the work, plus one fix worth doing this week.","problem":"Your GitHub profile is a museum of half-finished repos and a README that says 'passionate developer.' You want the joke, and then you want the one true thing.","videoUrl":null,"url":"https://oneagentaday.com/agents/roast-my-github","apiUrl":"https://oneagentaday.com/api/agents/roast-my-github.json","promptUrl":"https://oneagentaday.com/agents/roast-my-github/prompt.txt","configUrl":null,"configFilename":null,"license":"CC-BY-4.0","howItWorks":"This is a roast of the work, not of the person. It reads a public GitHub profile the way a blunt friend would: the bio, the empty blog link, the repos that have not moved since the pandemic, the one project that is actually alive.\n\nIt is not a security review and it does not browse private repos. It will not comment on appearance, identity, family, or anything that is not on the public profile you pasted.\n\n## Pull the brief\n\nSet `user` and paste this in the browser console on github.com. Unauthenticated requests share a small rate limit, which is plenty for one profile.\n\n```javascript\nconst user = \"octocat\";\nconst headers = { Accept: \"application/vnd.github+json\" };\nconst [profile, repos] = await Promise.all([\n  fetch(`https://api.github.com/users/${user}`, { headers }).then((r) => r.json()),\n  fetch(`https://api.github.com/users/${user}/repos?per_page=100&sort=pushed`, { headers }).then((r) => r.json()),\n]);\nconst brief = {\n  profile: {\n    login: profile.login,\n    name: profile.name,\n    bio: profile.bio,\n    company: profile.company,\n    blog: profile.blog,\n    public_repos: profile.public_repos,\n    followers: profile.followers,\n    created_at: profile.created_at,\n  },\n  repos: (Array.isArray(repos) ? repos : [])\n    .filter((repo) => !repo.fork)\n    .sort((a, b) => b.stargazers_count - a.stargazers_count)\n    .slice(0, 8)\n    .map((repo) => ({\n      name: repo.name,\n      description: repo.description,\n      language: repo.language,\n      stars: repo.stargazers_count,\n      pushed_at: repo.pushed_at ? repo.pushed_at.slice(0, 10) : \"\",\n      archived: repo.archived,\n    })),\n};\ncopy(JSON.stringify(brief, null, 2));\n```\n\nIf `repos` comes back as an error object, you are rate-limited. Wait, or paste the profile page by hand.","steps":[{"name":"Pick the account","text":"Use your own login, or any public account. Do not roast a private person who is not a public maintainer you would actually tease to their face."},{"name":"Pull a small JSON brief","text":"Open any GitHub page while logged in, open the console, and run the snippet on this page with the login filled in. It copies profile fields and the eight busiest original repos."},{"name":"Paste the prompt and the JSON","text":"New chat. Paste the prompt, then the JSON. If the API rate-limits you, paste the profile README and the pinned repo list instead."},{"name":"Keep the last line","text":"The roast is for sharing. The last section is a single fix. Do that one, or admit you will not."}],"demo":[{"second":0,"label":"The bio writes itself","detail":"Pat's bio says 'full-stack ninja' and 'building the future.' The blog field is empty. 46 public repos, 12 followers."},{"second":8,"label":"The repo pile","detail":"A 2022 portfolio with no stars, a todo app from 2021, an awesome-prompts list, and one TypeScript boilerplate pushed last month."},{"second":16,"label":"The roast","detail":"You have built the future four times and shipped it zero times. The boilerplate is the only living repo, and even that one has no description, which is a choice."},{"second":24,"label":"One serious fix","detail":"This week: write a four-line README on ai-saas-boilerplate that says what it is, who it is for, and how to run it. Pin that. Archive the todo app."}],"sampleInput":"{\n  \"profile\": {\n    \"login\": \"pixel-pat\",\n    \"name\": \"Pat Nguyen\",\n    \"bio\": \"Passionate full-stack ninja. Building the future.\",\n    \"blog\": \"\",\n    \"public_repos\": 46,\n    \"followers\": 12,\n    \"created_at\": \"2019-03-02\"\n  },\n  \"repos\": [\n    {\"name\": \"my-portfolio\", \"description\": \"personal site\", \"language\": \"HTML\", \"stars\": 0, \"pushed_at\": \"2022-11-01\", \"archived\": false},\n    {\"name\": \"ai-saas-boilerplate\", \"description\": null, \"language\": \"TypeScript\", \"stars\": 1, \"pushed_at\": \"2026-09-28\", \"archived\": false},\n    {\"name\": \"todo-app-react\", \"description\": \"todo app\", \"language\": \"JavaScript\", \"stars\": 0, \"pushed_at\": \"2021-01-14\", \"archived\": false},\n    {\"name\": \"awesome-prompts\", \"description\": \"prompts\", \"language\": null, \"stars\": 3, \"pushed_at\": \"2024-06-02\", \"archived\": false}\n  ]\n}\n","prompt":"You roast public GitHub profiles. You are funny, specific, and on the person's side. You punch at the repositories, the README, and the commit habits. You never punch at the human's body, identity, family, nationality, disability, or anything they did not put on the public profile.\n\nINPUT\nA JSON brief with profile fields and up to 8 original repos, or a paste of the profile README plus pinned repo names. If a field is missing, do not invent it.\n\nRULES\n- Every joke must name a real repo, a real date, a real empty field, or a real phrase from the bio. No generic \"touch grass.\"\n- Do not claim you cloned the code or ran it. You only know what was pasted.\n- If the profile is thin, roast the thinness in a few lines and stop. Do not pad.\n- Keep it shareable. A colleague should be able to read it without wincing for the wrong reason.\n- End with exactly one serious fix that can be done in under two hours this week. The fix must be concrete: a README section, an archive decision, a pin change, a description, or a dead link.\n\nOUTPUT\n## The roast\n4 to 8 short lines. Line breaks are the joke timing. No hashtags.\n\n## The one true thing\nOne sentence, not a joke, about what the profile is actually communicating.\n\n## Do this this week\nOne action. Name the repo. Say what \"done\" looks like.","config":null}}