{"id":26011482,"url":"https://github.com/ireddragonicy/booruprompt","last_synced_at":"2026-05-07T19:02:55.840Z","repository":{"id":278365375,"uuid":"935373873","full_name":"IRedDragonICY/booruprompt","owner":"IRedDragonICY","description":"A simple web application built with NextJS to extract tags from booru websites.  Just paste the URL of a booru post, and this tool will fetch and display the associated tags, ready for you to copy.","archived":false,"fork":false,"pushed_at":"2025-03-03T09:15:35.000Z","size":71,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-03T09:33:51.427Z","etag":null,"topics":["booru","cleaning-data","crawler","nextjs","noobai","tags","typescript","web"],"latest_commit_sha":null,"homepage":"https://booruprompt.vercel.app","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/IRedDragonICY.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}},"created_at":"2025-02-19T10:43:55.000Z","updated_at":"2025-03-03T09:15:38.000Z","dependencies_parsed_at":"2025-02-19T12:22:23.144Z","dependency_job_id":"5a18f373-3060-45d6-929a-0859d971e9a6","html_url":"https://github.com/IRedDragonICY/booruprompt","commit_stats":null,"previous_names":["ireddragonicy/booruprompt"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IRedDragonICY%2Fbooruprompt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IRedDragonICY%2Fbooruprompt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IRedDragonICY%2Fbooruprompt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IRedDragonICY%2Fbooruprompt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/IRedDragonICY","download_url":"https://codeload.github.com/IRedDragonICY/booruprompt/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242119463,"owners_count":20074746,"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":["booru","cleaning-data","crawler","nextjs","noobai","tags","typescript","web"],"created_at":"2025-03-05T23:24:11.041Z","updated_at":"2026-05-07T19:02:55.834Z","avatar_url":"https://github.com/IRedDragonICY.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"./public/icon.svg\" alt=\"BooruPrompt App Icon\" width=\"120\" height=\"120\"\u003e\n\n  \u003ch1\u003eBooruPrompt — Booru Tag Extractor \u0026 Image Metadata Toolkit\u003c/h1\u003e\n\n  \u003cp\u003e\n    \u003cb\u003eExtract, categorize, filter, and copy tags from popular booru sites — fast, accurate, and delightful.\u003c/b\u003e\n  \u003c/p\u003e\n\n  \u003cp\u003e\n    \u003ca href=\"https://booruprompt.vercel.app\"\u003e\u003cimg alt=\"Live Demo\" src=\"https://img.shields.io/badge/Live%20Demo-Visit-1f6feb?style=for-the-badge\u0026logo=vercel\u0026logoColor=white\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/IRedDragonICY/booruprompt\"\u003e\u003cimg alt=\"GitHub Repo\" src=\"https://img.shields.io/badge/GitHub-Repository-24292e?style=for-the-badge\u0026logo=github\u0026logoColor=white\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/IRedDragonICY/booruprompt/issues\"\u003e\u003cimg alt=\"Issues\" src=\"https://img.shields.io/badge/Issues-Track-238636?style=for-the-badge\u0026logo=github\u0026logoColor=white\"\u003e\u003c/a\u003e\n  \u003c/p\u003e\n\n  \u003cp\u003e\n    \u003ca href=\"https://github.com/IRedDragonICY/booruprompt/blob/main/LICENSE\"\u003e\u003cimg alt=\"License\" src=\"https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square\"\u003e\u003c/a\u003e\n    \u003cimg alt=\"Status\" src=\"https://img.shields.io/badge/Status-Active-success.svg?style=flat-square\"\u003e\n    \u003cimg alt=\"Platforms\" src=\"https://img.shields.io/badge/Platforms-Web%20·%20Desktop%20(Tauri)%20·%20Android-0ea5e9.svg?style=flat-square\"\u003e\n  \u003c/p\u003e\n\n  \u003cp\u003e\n    \u003cimg alt=\"Next.js\" src=\"https://img.shields.io/badge/Next.js-15-black?style=flat-square\u0026logo=next.js\u0026logoColor=white\"\u003e\n    \u003cimg alt=\"React\" src=\"https://img.shields.io/badge/React-19-149eca?style=flat-square\u0026logo=react\u0026logoColor=white\"\u003e\n    \u003cimg alt=\"TypeScript\" src=\"https://img.shields.io/badge/TypeScript-5-3178c6?style=flat-square\u0026logo=typescript\u0026logoColor=white\"\u003e\n    \u003cimg alt=\"Tailwind CSS\" src=\"https://img.shields.io/badge/Tailwind_CSS-4-06b6d4?style=flat-square\u0026logo=tailwindcss\u0026logoColor=white\"\u003e\n    \u003cimg alt=\"Framer Motion\" src=\"https://img.shields.io/badge/Framer%20Motion-12-0055ff?style=flat-square\u0026logo=framer\u0026logoColor=white\"\u003e\n    \u003cimg alt=\"Tauri\" src=\"https://img.shields.io/badge/Tauri-2-fb923c?style=flat-square\u0026logo=tauri\u0026logoColor=white\"\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/user-attachments/assets/f7680d50-595e-4e4e-9375-21b4f7eced81\" alt=\"BooruPrompt Screenshot\" width=\"78%\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#features\"\u003e\u003cstrong\u003eFeatures\u003c/strong\u003e\u003c/a\u003e ·\n  \u003ca href=\"#supported-sites\"\u003e\u003cstrong\u003eSupported Sites\u003c/strong\u003e\u003c/a\u003e ·\n  \u003ca href=\"#api\"\u003e\u003cstrong\u003eAPI\u003c/strong\u003e\u003c/a\u003e ·\n  \u003ca href=\"#getting-started\"\u003e\u003cstrong\u003eGetting Started\u003c/strong\u003e\u003c/a\u003e ·\n  \u003ca href=\"#desktop--android\"\u003e\u003cstrong\u003eDesktop \u0026 Android\u003c/strong\u003e\u003c/a\u003e ·\n  \u003ca href=\"#faq\"\u003e\u003cstrong\u003eFAQ\u003c/strong\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## Why BooruPrompt?\n\nDesigned for creators, curators, and prompt engineers who need reliable tags quickly. Paste a post URL, get clean, categorized tags and a preview — ready to copy into your workflow.\n\n## Features\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\" width=\"25%\"\u003e\n      \u003cimg src=\"https://cdn.jsdelivr.net/npm/@mdi/svg/svg/auto-fix.svg\" width=\"22\" height=\"22\" alt=\"Auto\" /\u003e\n      \u003cb\u003eAutomatic Extraction\u003c/b\u003e\n      \u003cbr/\u003e\n      Paste a post URL and let the app extract tags instantly (auto/manual modes).\n    \u003c/td\u003e\n    \u003ctd valign=\"top\" width=\"25%\"\u003e\n      \u003cimg src=\"https://cdn.jsdelivr.net/npm/@mdi/svg/svg/tag-multiple-outline.svg\" width=\"22\" height=\"22\" alt=\"Tags\" /\u003e\n      \u003cb\u003eSmart Categorization\u003c/b\u003e\n      \u003cbr/\u003e\n      Organized into Copyright, Character, General, Meta, and Other.\n    \u003c/td\u003e\n    \u003ctd valign=\"top\" width=\"25%\"\u003e\n      \u003cimg src=\"https://cdn.jsdelivr.net/npm/@mdi/svg/svg/filter-variant.svg\" width=\"22\" height=\"22\" alt=\"Filter\" /\u003e\n      \u003cb\u003eIntuitive Filtering\u003c/b\u003e\n      \u003cbr/\u003e\n      Toggle categories and blacklist unwanted keywords.\n    \u003c/td\u003e\n    \u003ctd valign=\"top\" width=\"25%\"\u003e\n      \u003cimg src=\"https://cdn.jsdelivr.net/npm/@mdi/svg/svg/content-copy.svg\" width=\"22\" height=\"22\" alt=\"Copy\" /\u003e\n      \u003cb\u003eOne‑Click Copy\u003c/b\u003e\n      \u003cbr/\u003e\n      Copy clean, comma‑separated tags in one click or via keyboard.\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n      \u003cimg src=\"https://cdn.jsdelivr.net/npm/@mdi/svg/svg/monitor-cellphone.svg\" width=\"22\" height=\"22\" alt=\"Responsive\" /\u003e\n      \u003cb\u003eResponsive UI\u003c/b\u003e\n      \u003cbr/\u003e\n      Optimized for desktop, tablet, and mobile — fluid and fast.\n    \u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n      \u003cimg src=\"https://cdn.jsdelivr.net/npm/@mdi/svg/svg/theme-light-dark.svg\" width=\"22\" height=\"22\" alt=\"Theme\" /\u003e\n      \u003cb\u003eDark Mode \u0026 Themes\u003c/b\u003e\n      \u003cbr/\u003e\n      System/dark mode plus color theme customization.\n    \u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n      \u003cimg src=\"https://cdn.jsdelivr.net/npm/@mdi/svg/svg/file-document-outline.svg\" width=\"22\" height=\"22\" alt=\"Metadata\" /\u003e\n      \u003cb\u003ePNG Metadata\u003c/b\u003e\n      \u003cbr/\u003e\n      Extract Positive/Negative prompts and parameters from PNG files.\n    \u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n      \u003cimg src=\"https://cdn.jsdelivr.net/npm/@mdi/svg/svg/cloud-download-outline.svg\" width=\"22\" height=\"22\" alt=\"Proxy\" /\u003e\n      \u003cb\u003eFlexible Fetching\u003c/b\u003e\n      \u003cbr/\u003e\n      Server proxy by default; optional client proxies (AllOrigins, etc.).\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n### Highlights\n\n- \u003cb\u003eReal‑world resilient\u003c/b\u003e: Handles site quirks, timeouts, referers (Pixiv), and fallback flows.\n- \u003cb\u003eHistory\u003c/b\u003e: Optional local history for extractions and image metadata.\n- \u003cb\u003ePrivacy‑aware\u003c/b\u003e: No analytics; data stays on your device (server proxy only fetches, doesn’t store).\n\n## Supported Sites\n\nThe extractor currently supports these sites and post formats:\n\n| Site | Status |\n|:--|:--|\n| Danbooru | Supported |\n| Safebooru (Donmai) | Supported |\n| Hijiribe (Donmai) | Supported |\n| Safebooru (Org) | Supported |\n| Gelbooru | Supported |\n| Rule34 | Supported |\n| TBIB | Supported |\n| Scatbooru | Supported |\n| Garycbooru | Supported |\n| e621 | Supported |\n| AIBooru | Supported |\n| Yande.re | Supported |\n| Konachan | Supported |\n| Anime‑Pictures | Supported |\n| Zerochan | Supported |\n| E‑Shuushuu | Supported |\n| Pixiv | Supported (JSON/pximg fallbacks) |\n| Fur Affinity | Supported |\n\n\u003e Tip: You can enable a similarity fallback for some unsupported `donmai.us` subdomains in settings.\n\n## Architecture at a Glance\n\n```mermaid\ngraph LR;\n  A[Browser UI] --\u003e|POST extract| B[Next API];\n  B --\u003e|Fetch HTML with UA and Referer| C[Target Site];\n  B --\u003e|Extract tags, image, title| D[JSON Response];\n  A --\u003e|GET image proxy| B;\n  B --\u003e|Stream media with cache| A;\n```\n\n## API\n\nBase URL: `https://booruprompt.vercel.app/api/fetch-booru`\n\n### 1) Extract From Page (POST)\n\n- Endpoint: `/api/fetch-booru`\n- Method: `POST`\n- Headers: `Content-Type: application/json`\n- Body:\n\n```json\n{ \"targetUrl\": \"https://safebooru.org/index.php?page=post\u0026s=view\u0026id=12345\" }\n```\n\n- Success 200:\n\n```json\n{ \"siteName\": \"Gelbooru\", \"tags\": { \"general\": [\"1girl\", \"smile\"], \"character\": [\"...\" ] }, \"imageUrl\": \"https://...jpg\", \"title\": \"...\" }\n```\n\n- Errors: `400 | 422 | 502 | 504` with `{ error, status }` message.\n\n### 2) Proxy Image (GET)\n\n- Endpoint: `/api/fetch-booru?imageUrl=...` (URL‑encode the value)\n- Returns raw image/video with `Content-Type` and `Cache-Control` preserved.\n\nNotes:\n- Uses a mainstream browser User‑Agent and sets `Referer` for `i.pximg.net` (Pixiv).\n- Request timeout: 25s.\n\n#### Curl Examples\n\n```bash\n# POST: extract page\ncurl -X POST \"https://booruprompt.vercel.app/api/fetch-booru\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"targetUrl\":\"https://gelbooru.com/index.php?page=post\u0026s=view\u0026id=123\"}'\n\n# GET: proxy image\ncurl \"https://booruprompt.vercel.app/api/fetch-booru?imageUrl=https%3A%2F%2Fe621.net%2Fdata%2F...jpg\" -o out.jpg\n```\n\n## Getting Started\n\nPrerequisites: Node.js ≥ 18\n\n```bash\ngit clone https://github.com/IRedDragonICY/booruprompt.git\ncd booruprompt\nnpm install\nnpm run dev\n```\n\nOpen `http://localhost:3000`.\n\n### Usage\n\n1. Paste a booru post URL (e.g. `https://danbooru.donmai.us/posts/123456`).\n2. Auto‑extract will run (or click Extract Manually).\n3. Toggle categories and optional blacklist.\n4. Copy tags.\n\nKeyboard: `Ctrl/Cmd + C` copies filtered tags when the extractor view is active.\n\n## Desktop \u0026 Android\n\nThis project ships with a Tauri app configuration and Android tooling.\n\n### Desktop (Tauri)\n\n```bash\n# Dev (opens a desktop window pointing to localhost)\nnpm run tauri:dev\n\n# Production build (bundles app installers)\nnpm run tauri:build\n```\n\nStatic export helper used by Tauri:\n\n```bash\nnpm run tauri:export\n```\n\n### Android (Experimental)\n\n```bash\n# One‑time setup\nnpm run android:init\n\n# Run on device / emulator\nnpm run android:dev\n\n# Build APK/AAB (debug)\nnpm run android:build\n```\n\n## Tech Stack\n\n- Next.js 15 (App Router), React 19, TypeScript 5\n- Tailwind CSS 4, Framer Motion 12\n- Tauri 2 for desktop bundling\n\n## SEO — Keywords\n\nbooru tag extractor, danbooru tags, gelbooru tags, e621 tags, pixiv tags, rule34 tags, booru prompt generator, copy booru tags, booru tag parser, tag categorization, booru proxy api, anime tags extractor, ai prompt tags, image metadata prompt extractor\n\n## FAQ\n\n- \u003cb\u003eWhy do some pages fail?\u003c/b\u003e Some sites require login, use anti‑bot protections (e.g., Cloudflare), or return empty HTML via proxies.\n- \u003cb\u003eIs my data stored?\u003c/b\u003e No server‑side storage. Optional local history is stored in your browser only.\n- \u003cb\u003ePixiv images don’t load?\u003c/b\u003e The proxy sets a Pixiv `Referer` and prefers `i.pximg.net`. See API image proxy notes.\n\n## Contributing\n\nIssues and PRs are welcome. Please follow the linting rules and update documentation where relevant.\n\n1. Fork → 2. Feature branch → 3. Commit → 4. PR\n\n## License\n\nMIT — see `LICENSE`.\n\n## Star History\n\n\u003ca href=\"https://star-history.com/#IRedDragonICY/booruprompt\"\u003e\u003cimg src=\"https://api.star-history.com/svg?repos=IRedDragonICY/booruprompt\u0026type=Date\" alt=\"Star History Chart\" width=\"600\" /\u003e\u003c/a\u003e\n\n---\n\n\u003cp align=\"center\" style=\"opacity:.9\"\u003e\n  Built by \u003ca href=\"https://github.com/IRedDragonICY\"\u003eIRedDragonICY\u003c/a\u003e\n  •\n  Hosted on \u003ca href=\"https://vercel.com\"\u003eVercel\u003c/a\u003e\n  •\n  Desktop by \u003ca href=\"https://tauri.app\"\u003eTauri\u003c/a\u003e\n\u003c/p\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fireddragonicy%2Fbooruprompt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fireddragonicy%2Fbooruprompt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fireddragonicy%2Fbooruprompt/lists"}