{"id":46433671,"url":"https://github.com/funmaker/hybooru","last_synced_at":"2026-03-05T19:02:29.017Z","repository":{"id":38448443,"uuid":"344622499","full_name":"funmaker/Hybooru","owner":"funmaker","description":"Hydrus-based booru-styled imageboard in React","archived":false,"fork":false,"pushed_at":"2026-01-19T22:42:52.000Z","size":1265,"stargazers_count":135,"open_issues_count":3,"forks_count":19,"subscribers_count":4,"default_branch":"master","last_synced_at":"2026-01-20T05:49:13.466Z","etag":null,"topics":["booru","hydrus","imageboard","imageboard-engine","react","webapp"],"latest_commit_sha":null,"homepage":"https://booru.funmaker.moe/","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/funmaker.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-03-04T22:08:29.000Z","updated_at":"2026-01-19T22:42:56.000Z","dependencies_parsed_at":"2024-11-07T00:34:49.651Z","dependency_job_id":"f4901829-cc8e-4b9e-9d13-6a3bc2fb164f","html_url":"https://github.com/funmaker/Hybooru","commit_stats":null,"previous_names":[],"tags_count":26,"template":false,"template_full_name":null,"purl":"pkg:github/funmaker/Hybooru","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funmaker%2FHybooru","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funmaker%2FHybooru/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funmaker%2FHybooru/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funmaker%2FHybooru/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/funmaker","download_url":"https://codeload.github.com/funmaker/Hybooru/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funmaker%2FHybooru/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30144700,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-05T16:58:46.102Z","status":"ssl_error","status_checked_at":"2026-03-05T16:58:45.706Z","response_time":93,"last_error":"SSL_read: 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":["booru","hydrus","imageboard","imageboard-engine","react","webapp"],"created_at":"2026-03-05T19:02:27.443Z","updated_at":"2026-03-05T19:02:29.000Z","avatar_url":"https://github.com/funmaker.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Hybooru\n\n\u003cp align=\"center\"\u003e\n   \u003cimg src=\"static/logo.svg\" width=\"256\"\u003e\u003cbr/\u003e\n   \u003ca href=\"https://github.com/funmaker/Hybooru/releases/latest\"\u003e\u003cimg src=\"https://github.com/funmaker/Hybooru/actions/workflows/release_build.yml/badge.svg\"\u003e\u003c/a\u003e\n   \u003ca href=\"https://github.com/funmaker/Hybooru/pkgs/container/hybooru\"\u003e\u003cimg src=\"https://github.com/funmaker/Hybooru/actions/workflows/docker_build.yml/badge.svg\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n[Hydrus](https://github.com/hydrusnetwork/hydrus)-based booru-styled imageboard in React, inspired by [hyve](https://github.com/imtbl/hyve).\n\nDemo: https://booru.funmaker.moe/\n\n[API Documentation](API.md)\n\n[Changelog](CHANGELOG.md)\n\nHybooru allows you to create an online booru-styled imageboard and REST API on top of Hydrus client,\nallowing you to access your collection from anywhere, without the need for running Hydrus instance.\nIt uses its own PostgreSQL database, populated using metadata from Hydrus' SQLite database.\nFiles are not cloned and instead served directly from Hydrus's database. You need to\nregenerate the Hybooru's database every time you want to update it. Make sure to\nproperly configure `configs.json` file. **Stop Hydrus when you regenerate HyBooru's\ndatabase if you plan to use live Hydrus' database (use hydrus backup instead if\npossible)**\n\n\n## Features\n\n- Searching by tags\n- Negative search\n- Ratings\n- Sorting (date imported, rating, size, etc)\n- Searching tags and autocomplete\n- Notes and translation overlays\n- tag and post relations (parents/siblings, duplicates/alternatives)\n- Colored tags\n- Blurhash\n- REST API\n- Mobile support\n- OpenGraph and OpenSearch\n- Supports browsers without JS\n\nMinimum Hydrus Version: **v586**\n\nKeep in mind this project is not a standalone, fully-fledged booru, but rather a read-only interface to your Hydrus database.\nIt does not provide any way to manage your posts or tags. The only way to add/modify your data is to do these\nchanges in Hydrus and then rebuild Hybooru's database again(can be done from the cog menu on search/post page).\n\nCurrently, only Hydrus Client database is supported. You cannot use Hybooru on top of Hydrus Server.\n\n\n## Setup\n\n1) Install NodeJS, npm and PostgreSQL.\n2) Create new Postgresql database and user.\n3) Allow user to use `pg_trgm` and `intarray` extensions. Either:\n   - Grant the user permission to create trusted extensions: `GRANT CREATE ON DATABASE \u003cdatabase\u003e TO \u003cuser\u003e`.\n   - Create the extensions yourself: `CREATE EXTENSION IF NOT EXISTS pg_trgm; CREATE EXTENSION IF NOT EXISTS intarray;`.\n4) Download latest [Release](https://github.com/funmaker/Hybooru/releases) production build [or build it yourself](#development).\n5) Extract server files.\n6) Edit `configs.json` to specify database credentials, hydrus db location and other options. See [Configuration](#configuration).\n7) (Optional) Configure [reverse proxy](#reverse-proxy).\n8) Run `npm install` to install dependencies.\n9) Run `npm start` to start server.\n\n\n## Searching Query Syntax\n\nSearching tries to imitate classical booru's syntax. All tags are lowercase and use `_` instead of space character.\nYou can also use `?` to match for single character(eg: `?girl`) and `*` to match number of characters(eg: `blue_*`).\nPatterns prefixed with `-` will be excluded from results. Patterns are matched against tag's name, but\nHydrus's `namespace:subtag` syntax is also supported.\n\nAdditionally you can sort results by including `order:*` in query. Supported sorts are: `order:posted`(date),\n`order:id`, `order:rating`, `order:size`. You can also append `_desc` or `_asc` to specify order(eg: `order:posted_asc`).\nIf not specified, post are sorted by date descending.\n\nIf you use a numeric rating service and successfully imported the ratings, you can also filter posts by their ratings\nusing `rating:` namespace. You can search posts with specific rating(`rating:3`), range(`rating:2-4`) or query posts\nthat have not been rated(`rating:none`).\n\n`system:` tags from Hydrus are not real tags and are not fully supported. Hybooru only supports `system:inbox`,\n`system:archive` and a non-standard `system:trash` for filtering posts that are respectively in inbox, are not in inbox\nand are in trash. You can use them in the blacklist/whitelist and you can also negate them using `-` prefix in searches.\n\nEg: `1girl blue_* -outdoors rating:3-5 order:rating_desc`\n\n\n## Configuration\n\nHybooru's config is stored in `configs.json` file in the project's root directory. Restart Hybooru to apply changes.\n\n| Name                         | Type                      | Default                                           | Comment                                                                                                                                                                                                          |\n|------------------------------|---------------------------|---------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| port                         | number                    | `3939`                                            | HTTP server port. You can use `PORT` envvar to override this.                                                                                                                                                    |\n| host                         | string or null            | `null`                                            | HTTP server host. `null` will listen on all interfaces. Set to `\"localhost\"` if you are not going to connect to it directly over network. You can use `HOST` envvar to override this.                            |\n| hydrusDbPath                 | string or null            | `null`                                            | Hydrus db or backup location. If null, default platform-dependent locaton is used: `%appdata%/hydrus/db`(Windows), `~/.local/share/hydrus/db`(Linux), `~/Library/Preferences/hydrus/db`(MacOS)                   |\n| appName                      | string                    | `\"Hybooru\"`                                       | Specify name of your booru (appears as logo).                                                                                                                                                                    |\n| appDescription               | string                    | `\"Hydrus-based booru-styled imageboard in React\"` | Booru's description used in OpenGraph.                                                                                                                                                                           |\n| adminPassword                | string or null            | `null`                                            | Password used to regenerate database (can be accessed from the cog button). Null disables manual database regeneration. You can also use environmental variable `HYDRUS_ADMIN_PASSWORD` to override the password |\n| isTTY                        | boolean or null           | `null`                                            | Overrides colorful/fancy output. `true` forces, `false` disables, `null` automatically determines. Useful when piping output.                                                                                    |\n| importBatchSize              | number                    | `8192`                                            | Base batch size used during importing. Decrease it if hybooru crashes during import.                                                                                                                             |\n| db                           | PoolConfig                | _local database_                                  | node-postgres config object. See https://node-postgres.com/apis/client for more details. By defaults it attempts to connect to `hybooru` database at `localhost` using `hybooru` as password. Can be overridden with `DB_*` environment variables (see below). |\n| posts                        | object                    | _see below_                                       | Options related to posts and files.                                                                                                                                                                              |\n| posts.services               | (string/number)[] or null | `null`                                            | List of names or ids of file services to import. Use `null` to import from all services.                                                                                                                         |\n| posts.filesPathOverride      | string or null            | `null`                                            | Overrides location of post's files. If `null`, `client_files` inside hydrus's db folder is used.                                                                                                                 |\n| posts.thumbnailsPathOverride | string or null            | `null`                                            | Overrides location of post's thumbnails. If `null`, `filesPathOverride` is used.                                                                                                                                 |\n| posts.thumbnailsMode         | `\"fit\"` or `\"fill\"`       | `\"fit\"`                                           | Specifies thumbnail scale mode. Change it to `\"fill\"` if you are using `scale to fill` in hydrus thumbnail options.                                                                                              |\n| posts.pageSize               | number                    | `72`                                              | Number of posts on single page.                                                                                                                                                                                  |\n| posts.cachePages             | number                    | `5`                                               | Number of pages cached in single cache entry.                                                                                                                                                                    |\n| posts.cacheRecords           | number                    | `1024`                                            | Max number of cache entries.                                                                                                                                                                                     |\n| posts.maxPreviewSize         | number                    | `104857600`                                       | Max size in bytes of post that can be previewed in post page/gallery. Default is 100MB.                                                                                                                          |\n| tags                         | object                    | _see below_                                       | Options related to tags. All tags below support wildcards.                                                                                                                                                       |\n| tags.services                | (string/number)[] or null | `null`                                            | List of names or ids of tag services to import. Use `null` to import from all services.                                                                                                                          |\n| tags.motd                    | string or object or null  | `null`                                            | Query used to search for random image displayed on main page. You can also specify object to specify different tags for different themes(use `light`, `dark` and `auto` as keys)                                 |\n| tags.untagged                | string                    | `\"-*\"`                                            | Overrides query used to determine which posts require tagging. Default `\"-*\"` matches all posts with no tags.                                                                                                    |\n| tags.ignore                  | string[]                  | `[]`                                              | List of tags that will not be imported from Hydrus (posts tagged by these tags will still be imported).                                                                                                          |\n| tags.blacklist               | string[] or null          | `null`                                            | All posts and tags matching any of specified tags will not be imported from Hydrus. Use `null` or empty array to ignore blacklist.                                                                               |\n| tags.whitelist               | string[] or null          | `null`                                            | Only posts matching specified tags will be imported from Hydrus. Use `null` or empty array to ignore whitelist.                                                                                                  |\n| tags.resolveRelations        | boolean                   | `true`                                            | Resolve tag siblings and parents. Can be slow in large databases.                                                                                                                                                |\n| tags.reportLoops             | boolean                   | `false`                                           | Print out all loops detected in tag relationships.                                                                                                                                                               |\n| tags.searchSummary           | number                    | `39`                                              | Number of tags that appear on side menu when searching posts.                                                                                                                                                    |\n| rating                       | object or null            | _see below_                                       | Options related to numerical rating. Set null to remove ratings.                                                                                                                                                 |\n| rating.enabled               | boolean                   | `true`                                            | Enables or disables rating import.                                                                                                                                                                               |\n| rating.service               | string or number or null  | `null`                                            | Name or id of the numerical rating service. Set to `null` to pick any service.                                                                                                                                   |\n| rating.stars                 | number                    | `5`                                               | Number of stars used in rating.                                                                                                                                                                                  |\n| versionCheck                 | object or null            | _see below_                                       | Options related to version checking. Set null to disable.                                                                                                                                                        |\n| versionCheck.enabled         | boolean                   | `true`                                            | Enables or disables version checking.                                                                                                                                                                            |\n| versionCheck.owner           | string                    | `\"funmaker\"`                                      | GitHub handle of the repo owner. Do not change unless you know what you are doing.                                                                                                                               |\n| versionCheck.repo            | string                    | `\"hybooru\"`                                       | GitHub handle of the repo name. Do not change unless you know what you are doing.                                                                                                                                |\n| versionCheck.cacheLifeMs     | number                    | `3600000` (1 hour)                                | Lifetime of versions cache. GitHub API is rate-limited, do not change unless you know what you are doing.                                                                                                        |\n\n### Environment Variables\n\nThe following environment variables can be used to override config values:\n\n| Variable               | Overrides         | Description                          |\n|------------------------|-------------------|--------------------------------------|\n| `PORT`                 | `port`            | HTTP server port                     |\n| `HOST`                 | `host`            | HTTP server host                     |\n| `HYDRUS_ADMIN_PASSWORD`| `adminPassword`   | Password for database regeneration   |\n| `DB_HOST`              | `db.host`         | Database hostname                    |\n| `DB_PORT`              | `db.port`         | Database port                        |\n| `DB_USER`              | `db.user`         | Database username                    |\n| `DB_PASSWORD`          | `db.password`     | Database password                    |\n| `DB_NAME`              | `db.database`     | Database name                        |\n\nEnvironment variables take precedence over `configs.json` values.\n\n## Translation/overlay notes\n\n_This feature is meant for advanced users._\n\nHydrus so far does not support overlay notes (https://github.com/hydrusnetwork/hydrus/issues/562). Hybooru implements it\nusing a non-standard extension to the existing Hydrus note system and custom content parser. If you want to display\noverlay notes in Hybooru you will need to modify page parsers in Hydrus to create a note in special format that stores\nnote position and size. I have prepared few content parser for popular boorus:\n\n\u003cimg src=\".github/images/gelbooru.png\" width=\"256\"\u003e \u003cimg src=\".github/images/danbooru.png\" width=\"256\"\u003e\n\nTo import content parsers in Hydrus you need to go to network \u003e downloader components \u003e manage parsers \u003e select target\nfile page parser \u003e edit \u003e content parsers and drag and drop one of the above images into the content parser list.\nHydrus will prevent you from dropping mismatched image into a different kind of list, but it will not prevent you from\nadding a content parser to wrong page parse, so make sure you are adding it to the right page parser for the right\ndomain.\n\nAfter importing content parser, newly imported images should have `translation` containing all the overlays if they have\nany. However, Hydrus by default will not add translations to images that it already recognizes in the database. To\nfetch overlay notes for images recognized by Hydrus, you will have to create a new Url Import tab (download \u003e urls)\nand go to import options \u003e tags \u003e set custom tag import options just for this importer \u003e check both force fetch page\neven if url/hash recognized and file already in db. In this particular importer hydrus will update notes(and other file\nmetadata I guess) even if it recognizes the image. You can also set it as the default, but it's not recommended.\n\n\n### Overlay note format\n\n[Content Parsers in Hydrus Documentation](https://hydrusnetwork.github.io/hydrus/downloader_parsers_content_parsers.html)\n\nIf you want to fetch overlays from different website, you will need to write your own content parser. Overlay notes\nare stored in one or many regular hydrus notes and contain special commands that can be understood by Hybooru. One note\ncan contain any number of overlay sub-notes. The label/title of the note is ignored. The format is as follows:\n\n```\n\u003cnote content\u003e\n#! [\u003cleft\u003e,\u003ctop\u003e,\u003cwidth\u003e,\u003cheight\u003e,\u003csrcWidth\u003e,\u003csrcHeight\u003e]\n\n\u003cnote content\u003e\n#! [\u003cleft\u003e,\u003ctop\u003e,\u003cwidth\u003e,\u003cheight\u003e,\u003csrcWidth\u003e,\u003csrcHeight\u003e]\n\n...\n```\n\nFor example:\n\n```\nNote in upper left corner\n#! [50,50,100,100,500,500]\n\nMulti\n-line\nnote on the bottom\n#! [0,400,500,100,500,500]\n```\n\nSub-notes are divided using lines that begin with `#! `. On these lines Hybooru expects an JSON array with numbers\nrepresenting its position on the image. `\u003csrcWidth\u003e` and `\u003csrcHeight\u003e` represent the size of the original image. They\nare necessary to keep overlays in the right in case an user copies notes to another version of the image, for example\nin case of merge during duplicates processing. You can also set these values to `100` each if you are dealing with\npositions in percents. It is strongly recommended you put all the subnotes into a single Hydrus note as the output\nof your content parser. Hydrus uses note names to handle note update/replacement and outputting multiple notes with\ngenerated names like `translation (###)` will make resolving conflicts much harder.\n\n\n## Development\n\nBuild scripts are written for Linux. Building on Windows is currently not supported.\nHowever, you can still look into `package.json` and change `scripts` to use Window's commands.\nAlternatively you can probably just use Docker or a virtual machine.\n\n\n### Install Dependencies\n\n```bash\nnpm install\n```\n\n\n### Run development\n\n```bash\nnpm run start\n```\n\n\n### Build production\n\n```bash\nnpm run build:prod\n```\n\nOutput is saved to `dist/` folder in project's root directory. These are the files you will want to deploy.\n\n\n### Start production\n\n```bash\ncd dist\nnpm start\n```\n\n\n## Reverse Proxy\n\nIt is recommended to set up a reverse proxy to serve static files and enable HTTPS.\n\nExample Nginx configuration:\n\n```nginx\nserver {\n    listen 80;\n    listen 443 ssl;\n    \n    server_name booru.example.com;\n    \n    # Uncomment to override thumbnails location\n    #location ~ ^\\/files\\/t(..)(.*)$ { \n    #    root /path/to/thumbnails;\n    #    try_files /t$1/$1$2 =404;\n    #}\n    \n    location ~ ^\\/files\\/(.)(..)(.*)$ {\n        root /path/to/files; # hydrus's files location (eg: client_files folder inside hydrus's db folder)\n        try_files /$1$2/$2$3 =404;\n    }\n    \n    location / {\n        proxy_http_version 1.1;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n        \n        proxy_pass http://localhost:3939/;\n    }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffunmaker%2Fhybooru","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffunmaker%2Fhybooru","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffunmaker%2Fhybooru/lists"}