{"id":13401727,"url":"https://github.com/thumbsup/thumbsup","last_synced_at":"2025-12-14T23:52:05.565Z","repository":{"id":16128568,"uuid":"18873819","full_name":"thumbsup/thumbsup","owner":"thumbsup","description":"Generate static HTML photo / video galleries","archived":false,"fork":false,"pushed_at":"2024-04-25T06:56:27.000Z","size":36674,"stargazers_count":745,"open_issues_count":65,"forks_count":91,"subscribers_count":20,"default_branch":"master","last_synced_at":"2024-04-25T07:47:49.114Z","etag":null,"topics":["gallery","photography","photos","static-site-generator","static-website"],"latest_commit_sha":null,"homepage":"https://thumbsup.github.io","language":"JavaScript","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/thumbsup.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE.md","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":"2014-04-17T09:48:17.000Z","updated_at":"2024-06-12T10:18:22.422Z","dependencies_parsed_at":"2023-12-02T12:31:37.339Z","dependency_job_id":"fd3d7e6e-89f8-46fc-9014-c0e80a528f7c","html_url":"https://github.com/thumbsup/thumbsup","commit_stats":{"total_commits":542,"total_committers":26,"mean_commits":"20.846153846153847","dds":0.6402214022140221,"last_synced_commit":"38fe01ea692b90d788ee524297ef4809ac386359"},"previous_names":[],"tags_count":46,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thumbsup%2Fthumbsup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thumbsup%2Fthumbsup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thumbsup%2Fthumbsup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thumbsup%2Fthumbsup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thumbsup","download_url":"https://codeload.github.com/thumbsup/thumbsup/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243542208,"owners_count":20307844,"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":["gallery","photography","photos","static-site-generator","static-website"],"created_at":"2024-07-30T19:01:06.344Z","updated_at":"2025-12-14T23:52:05.553Z","avatar_url":"https://github.com/thumbsup.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"# thumbsup\n\n\u003c!-- Project info --\u003e\n[![NPM](http://img.shields.io/npm/v/thumbsup.svg?style=flat)](https://npmjs.org/package/thumbsup)\n[![License](http://img.shields.io/npm/l/thumbsup.svg?style=flat)](https://github.com/thumbsup/thumbsup)\n[![Standard - JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](http://standardjs.com/)\n\n\u003c!-- Build status and code analysis --\u003e\n![Linux Tests](https://github.com/thumbsup/thumbsup/actions/workflows/test-linux.yml/badge.svg)\n![Dependencies](https://img.shields.io/librariesio/release/npm/thumbsup)\n\n\u003c!-- Social sharing --\u003e\n[![Twitter](https://img.shields.io/badge/share-Twitter-1CA8F5.svg)](https://twitter.com/intent/tweet?text=Need%20static%20photo%20and%20video%20galleries?%20Check%20out%20Thumbsup%20on%20Github\u0026url=https://github.com/thumbsup/thumbsup\u0026hashtags=selfhosted,static,gallery)\n[![LinkedIn](https://img.shields.io/badge/share-LinkedIn-0077BC.svg)](https://www.linkedin.com/shareArticle?mini=true\u0026url=https://github.com/thumbsup/thumbsup\u0026title=Static%20gallery%20generator\u0026summary=Thumbsup%20is%20a%20command-line%20friendly%20static%20gallery%20generator%20for%20all%20your%20photos%20and%20videos\u0026source=Github)\n[![Facebook](https://img.shields.io/badge/share-Facebook-3F4C9D.svg)](https://www.facebook.com/sharer.php?u=https://github.com/thumbsup/thumbsup)\n\n---\n\n\u003cp align=\"center\"\u003ehttps://thumbsup.github.io\u003c/p\u003e\n\u003cimg align=\"center\" src=\"docs/banner.jpg\" alt=\"Banner\" /\u003e\n\n---\n\nTurn any folder with photos \u0026amp; videos into a web gallery.\n\n- thumbnails \u0026 multiple resolutions for fast previews\n- mobile friendly website with customisable themes\n- only rebuilds changed files: it's fast!\n- uses relative paths so you can deploy the pages anywhere\n- works great with Amazon S3 for static hosting\n\n## Quick start\n\nSimply point `thumbsup` to a folder with photos \u0026amp; videos. All nested folders become separate albums.\n\n```bash\nnpm install -g thumbsup\nthumbsup --input ./photos --output ./gallery\n```\n\n![Screen recording](docs/demo.gif)\n\nThere are many command line arguments to customise the output.\nSee the website for the full documentation: https://thumbsup.github.io.\n\n## Sample gallery\n\nSee a sample gallery online at https://thumbsup.github.io/demos/themes/mosaic/\n\n![sample gallery](docs/screenshot.png)\n\n## Requirements\n\nThumbsup requires the following dependencies:\n- [Node.js](http://nodejs.org/): `brew install node`\n- [exiftool](http://www.sno.phy.queensu.ca/~phil/exiftool/): `brew install exiftool`\n- [GraphicsMagick](http://www.graphicsmagick.org/): `brew install graphicsmagick`\n\nAnd optionally:\n- [FFmpeg](http://www.ffmpeg.org/) to process videos: `brew install ffmpeg`\n- [Gifsicle](http://www.lcdf.org/gifsicle/) to process animated GIFs: `brew install gifsicle`\n- [dcraw](https://www.cybercom.net/~dcoffin/dcraw/) to process RAW photos: `brew install dcraw`\n- [ImageMagick](https://imagemagick.org/) for HEIC support (needs to be compiled with `--with-heic`)\n\nYou can run thumbsup as a Docker container ([ghcr.io/thumbsup/thumbsup](https://github.com/thumbsup/thumbsup/pkgs/container/thumbsup)) which pre-packages all the dependencies above. Read the [thumbsup on Docker](https://thumbsup.github.io/docs/2-installation/docker/) documentation for more detail.\n\n```bash\ndocker run -v `pwd`:/work ghcr.io/thumbsup/thumbsup [...]\n```\n\n## Command line arguments\n\nThis reflects the CLI for the latest code on `master`.\nFor the latest published version please refer to the [docs on the website](https://thumbsup.github.io).\n\n\u003c!--STARTCLI--\u003e\n```\n\nUsages:\n  thumbsup [required] [options]\n  thumbsup --config config.json\n\n\nRequired:\n  --input   Path to the folder with all photos/videos  [string] [required]\n  --output  Output path for the static website  [string] [required]\n\nInput options:\n  --scan-mode           How files are indexed  [choices: \"full\", \"partial\", \"incremental\"] [default: \"full\"]\n  --include-photos      Include photos in the gallery  [boolean] [default: true]\n  --include-videos      Include videos in the gallery  [boolean] [default: true]\n  --include-raw-photos  Include raw photos in the gallery  [boolean] [default: false]\n  --include             Glob pattern of files to include  [array]\n  --exclude             Glob pattern of files to exclude  [array]\n\nOutput options:\n  --thumb-size          Pixel size of the square thumbnails  [number] [default: 120]\n  --small-size          Pixel height of the small photos  [number] [default: 300]\n  --large-size          Pixel height of the fullscreen photos  [number] [default: 1000]\n  --photo-quality       Quality of the resized/converted photos  [number] [default: 90]\n  --video-quality       Quality of the converted video (percent)  [number] [default: 75]\n  --video-bitrate       Bitrate of the converted videos (e.g. 120k)  [string] [default: null]\n  --video-format        Video output format  [choices: \"mp4\", \"webm\"] [default: \"mp4\"]\n  --video-hwaccel       Use hardware acceleration (requires bitrate)  [choices: \"none\", \"vaapi\"] [default: \"none\"]\n  --video-stills        Where the video still frame is taken  [choices: \"seek\", \"middle\"] [default: \"seek\"]\n  --video-stills-seek   Number of seconds where the still frame is taken  [number] [default: 1]\n  --photo-preview       How lightbox photos are generated  [choices: \"resize\", \"copy\", \"symlink\", \"link\"] [default: \"resize\"]\n  --video-preview       How lightbox videos are generated  [choices: \"resize\", \"copy\", \"symlink\", \"link\"] [default: \"resize\"]\n  --photo-download      How downloadable photos are generated  [choices: \"resize\", \"copy\", \"symlink\", \"link\"] [default: \"resize\"]\n  --video-download      How downloadable videos are generated  [choices: \"resize\", \"copy\", \"symlink\", \"link\"] [default: \"resize\"]\n  --link-prefix         Path or URL prefix for \"linked\" photos and videos  [string]\n  --cleanup             Remove any output file that's no longer needed  [boolean] [default: false]\n  --concurrency         Number of parallel parsing/processing operations  [number] [default: 2]\n  --output-structure    File and folder structure for output media  [choices: \"folders\", \"suffix\"] [default: \"folders\"]\n  --gm-args             Custom image processing arguments for GraphicsMagick  [array]\n  --watermark           Path to a transparent PNG to be overlaid on all images  [string]\n  --watermark-position  Position of the watermark  [choices: \"Repeat\", \"Center\", \"NorthWest\", \"North\", \"NorthEast\", \"West\", \"East\", \"SouthWest\", \"South\", \"SouthEast\"]\n\nAlbum options:\n  --albums-from            How files are grouped into albums  [array] [default: [\"%path\"]]\n  --sort-albums-by         How to sort albums  [choices: \"title\", \"start-date\", \"end-date\"] [default: \"start-date\"]\n  --sort-albums-direction  Album sorting direction  [choices: \"asc\", \"desc\"] [default: \"asc\"]\n  --sort-media-by          How to sort photos and videos  [choices: \"filename\", \"date\"] [default: \"date\"]\n  --sort-media-direction   Media sorting direction  [choices: \"asc\", \"desc\"] [default: \"asc\"]\n  --home-album-name        Name of the top-level album  [string] [default: \"Home\"]\n  --album-page-size        Max number of files displayed on a page  [number] [default: null]\n  --album-zip-files        Create a ZIP file per album  [boolean] [default: false]\n  --include-keywords       Keywords to include in %keywords  [array]\n  --exclude-keywords       Keywords to exclude from %keywords  [array]\n  --include-people         Names to include in %people  [array]\n  --exclude-people         Names to exclude from %people  [array]\n  --album-previews         How previews are selected  [choices: \"first\", \"spread\", \"random\"] [default: \"first\"]\n\nWebsite options:\n  --index                 Filename of the home page  [string] [default: \"index.html\"]\n  --albums-output-folder  Output subfolder for HTML albums (default: website root)  [string] [default: \".\"]\n  --theme                 Name of a built-in gallery theme  [choices: \"classic\", \"cards\", \"mosaic\", \"flow\"] [default: \"classic\"]\n  --theme-path            Path to a custom theme  [string]\n  --theme-style           Path to a custom LESS/CSS file for additional styles  [string]\n  --theme-settings        Path to a JSON file with theme settings  [string]\n  --title                 Website title  [string] [default: \"Photo album\"]\n  --footer                Text or HTML footer  [string] [default: null]\n  --google-analytics      Code for Google Analytics tracking  [string]\n  --embed-exif            Embed the exif metadata for each image into the gallery page  [boolean] [default: false]\n  --locale                Locale for regional settings like dates  [string] [default: \"en\"]\n  --seo-location          Location where the site will be hosted. If provided, sitemap.xml and robots.txt will be created.  [string] [default: null]\n\nMisc options:\n  --config         JSON config file (one key per argument)  [string]\n  --database-file  Path to the database file  [string]\n  --log-file       Path to the log file  [string]\n  --log            Print a detailed text log  [choices: \"default\", \"info\", \"debug\", \"trace\"] [default: \"default\"]\n  --dry-run        Update the index, but don't create the media files / website  [boolean] [default: false]\n\nDeprecated:\n  --original-photos       Copy and allow download of full-size photos (use --photo-download=copy)  [boolean]\n  --original-videos       Copy and allow download of full-size videos (use --video-download=copy)  [boolean]\n  --albums-date-format    How albums are named in \u003cdate\u003e mode [moment.js pattern]\n  --css                   Path to a custom provided CSS/LESS file for styling  [string]\n  --download-photos       Target of the photo download links  [choices: \"large\", \"copy\", \"symlink\", \"link\"]\n  --download-videos       Target of the video download links  [choices: \"large\", \"copy\", \"symlink\", \"link\"]\n  --download-link-prefix  Path or URL prefix for linked downloads  [string]\n  --usage-stats           Enable anonymous usage statistics  [boolean]\n\nOptions:\n  --version  Show version number  [boolean]\n  --help     Show help  [boolean]\n\n\n The optional JSON config should contain a single object with one key\n per argument, not including the leading \"--\". For example:\n { \"sort-albums-by\": \"start-date\" }\n```\n\u003c!--ENDCLI--\u003e\n\n## Contributing\n\nWe welcome all [issues](https://github.com/thumbsup/thumbsup/issues)\nand [pull requests](https://github.com/thumbsup/thumbsup/pulls)!\n\nIf you are facing any issues or getting crashes, please try the following options to help troubleshoot:\n\n```bash\nthumbsup [options] --log debug\n# [16:04:56] media/thumbs/photo-1446822622709-e1c7ad6e82d52.jpg [started]\n# [16:04:57] media/thumbs/photo-1446822622709-e1c7ad6e82d52.jpg [completed]\n\nthumbsup [options] --log trace\n# [16:04:56] media/thumbs/photo-1446822622709-e1c7ad6e82d52.jpg [started]\n# gm \"identify\" \"-ping\" \"-format\" \"%[EXIF:Orientation]\" [...]\n# gm \"convert\" \"-quality\" \"90\" \"-resize\" \"x400\u003e\" \"+profile\" [...]\n# [16:04:57] media/thumbs/photo-1446822622709-e1c7ad6e82d52.jpg [completed]\n```\n\nIf you want to contribute some code, please check out the [contributing guidelines](.github/CONTRIBUTING.md)\nfor an overview of the design and a run-through of the different automated/manual tests.\n\n## Disclaimer\n\nWhile a lot of effort is put into testing Thumbsup (over 400 automated tests), the software is provided as-is under the MIT license. The authors cannot be held responsible for any unintended behaviours.\n\nWe recommend running Thumbsup with the least appropriate privilege, such as giving read-only access to the source images.\nThe Docker setup detailed in the documentation follows this advice.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthumbsup%2Fthumbsup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthumbsup%2Fthumbsup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthumbsup%2Fthumbsup/lists"}