{"id":41207702,"url":"https://github.com/hnesk/browse-ocrd","last_synced_at":"2026-01-22T22:21:25.706Z","repository":{"id":37858346,"uuid":"281373887","full_name":"hnesk/browse-ocrd","owner":"hnesk","description":"An extensible viewer for OCR-D mets.xml files","archived":false,"fork":false,"pushed_at":"2024-05-30T09:10:16.000Z","size":16173,"stargazers_count":22,"open_issues_count":12,"forks_count":10,"subscribers_count":5,"default_branch":"master","last_synced_at":"2026-01-04T04:29:43.507Z","etag":null,"topics":["ocr-d"],"latest_commit_sha":null,"homepage":"","language":"Python","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/hnesk.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}},"created_at":"2020-07-21T11:03:41.000Z","updated_at":"2025-10-25T13:40:47.000Z","dependencies_parsed_at":"2023-01-22T12:00:48.714Z","dependency_job_id":"6a04ca67-3e33-4f84-9e87-1361caf0bcd0","html_url":"https://github.com/hnesk/browse-ocrd","commit_stats":{"total_commits":500,"total_committers":8,"mean_commits":62.5,"dds":"0.10799999999999998","last_synced_commit":"35bf12d483a5714938698a7033a4f5e70e8b0ac4"},"previous_names":[],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/hnesk/browse-ocrd","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hnesk%2Fbrowse-ocrd","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hnesk%2Fbrowse-ocrd/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hnesk%2Fbrowse-ocrd/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hnesk%2Fbrowse-ocrd/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hnesk","download_url":"https://codeload.github.com/hnesk/browse-ocrd/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hnesk%2Fbrowse-ocrd/sbom","scorecard":{"id":466940,"data":{"date":"2025-08-11","repo":{"name":"github.com/hnesk/browse-ocrd","commit":"ca119726b95df1b9b5b3ed67cad5bfc0f3159330"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.9,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 2/26 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql.yml:16","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql.yml:17","Warn: no topLevel permission defined: .github/workflows/codeql.yml:1","Warn: no topLevel permission defined: .github/workflows/dockerhub.yml:1","Warn: no topLevel permission defined: .github/workflows/unittest.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/hnesk/browse-ocrd/codeql.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/hnesk/browse-ocrd/codeql.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/hnesk/browse-ocrd/codeql.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/hnesk/browse-ocrd/codeql.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dockerhub.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/hnesk/browse-ocrd/dockerhub.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dockerhub.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/hnesk/browse-ocrd/dockerhub.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dockerhub.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/hnesk/browse-ocrd/dockerhub.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dockerhub.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/hnesk/browse-ocrd/dockerhub.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dockerhub.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/hnesk/browse-ocrd/dockerhub.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unittest.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/hnesk/browse-ocrd/unittest.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unittest.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/hnesk/browse-ocrd/unittest.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unittest.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/hnesk/browse-ocrd/unittest.yml/master?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating python:3.7 to python:3.7@sha256:eedf63967cdb57d8214db38ce21f105003ed4e4d0358f02bedc057341bcf92a0","Warn: pipCommand not pinned by hash: Dockerfile:10-15","Warn: pipCommand not pinned by hash: Dockerfile:10-15","Info:   0 out of   8 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 third-party GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned","Info:   0 out of   2 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":7,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 0 commits out of 6 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"78 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2013-22 / GHSA-27x4-j476-jp5f","Warn: Project is vulnerable to: PYSEC-2025-49 / GHSA-5rjg-fvgr-3xxf","Warn: Project is vulnerable to: GHSA-cx63-2mw6-8hw5","Warn: Project is vulnerable to: PYSEC-2022-43012 / GHSA-r9hx-vwmv-q579","Warn: Project is vulnerable to: PYSEC-2022-43017 / GHSA-qwmp-2cf2-g9g6","Warn: Project is vulnerable to: GHSA-55x5-fj6c-h6m8","Warn: Project is vulnerable to: PYSEC-2014-9 / GHSA-57qw-cc2g-pv5p","Warn: Project is vulnerable to: PYSEC-2021-19 / GHSA-jq4v-f5q6-mjqq","Warn: Project is vulnerable to: GHSA-pgww-xf46-h92r","Warn: Project is vulnerable to: PYSEC-2022-230 / GHSA-wrxv-2j5q-m38w","Warn: Project is vulnerable to: PYSEC-2018-12 / GHSA-xp26-p53h-6h2p","Warn: Project is vulnerable to: GHSA-6p56-wp2h-9hxr","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: GHSA-3448-vrgh-85xr","Warn: Project is vulnerable to: GHSA-8849-5h85-98qw","Warn: Project is vulnerable to: GHSA-fm39-cw8h-3p63","Warn: Project is vulnerable to: GHSA-fw99-f933-rgh8","Warn: Project is vulnerable to: GHSA-hxfw-jm98-v4mq","Warn: Project is vulnerable to: GHSA-jggw-2q6g-c3m6","Warn: Project is vulnerable to: GHSA-jh2j-j4j9-crg3","Warn: Project is vulnerable to: GHSA-m6vm-8g8v-xfjh","Warn: Project is vulnerable to: GHSA-q799-q27x-vp7w","Warn: Project is vulnerable to: GHSA-x3rm-644h-67m8","Warn: Project is vulnerable to: PYSEC-2023-184","Warn: Project is vulnerable to: GHSA-3c5c-7235-994j","Warn: Project is vulnerable to: GHSA-3f63-hfp8-52jq","Warn: Project is vulnerable to: PYSEC-2021-41 / GHSA-3wvg-mj6g-m9cv","Warn: Project is vulnerable to: PYSEC-2020-77 / GHSA-3xv8-3j54-hgrp","Warn: Project is vulnerable to: PYSEC-2020-80 / GHSA-43fq-w8qq-v88h","Warn: Project is vulnerable to: GHSA-44wm-f244-xhp3","Warn: Project is vulnerable to: GHSA-4fx9-vc88-q2xc","Warn: Project is vulnerable to: PYSEC-2021-35 / GHSA-57h3-9rgr-c24m","Warn: Project is vulnerable to: PYSEC-2020-172 / GHSA-5gm3-px64-rw72","Warn: Project is vulnerable to: PYSEC-2021-331 / GHSA-7534-mm45-c74v","Warn: Project is vulnerable to: PYSEC-2021-92 / GHSA-7r7m-5h27-29hp","Warn: Project is vulnerable to: PYSEC-2020-78 / GHSA-8843-m7mw-mxqm","Warn: Project is vulnerable to: PYSEC-2023-227 / GHSA-8ghj-p4vj-mr35","Warn: Project is vulnerable to: PYSEC-2014-87 / GHSA-8m9x-pxwq-j236","Warn: Project is vulnerable to: PYSEC-2022-10 / GHSA-8vj2-vxx3-667w","Warn: Project is vulnerable to: PYSEC-2021-36 / GHSA-8xjq-8fcg-g5hw","Warn: Project is vulnerable to: PYSEC-2016-6 / GHSA-8xjv-v9xq-m5h9","Warn: Project is vulnerable to: PYSEC-2021-42 / GHSA-95q3-8gr9-gm8w","Warn: Project is vulnerable to: PYSEC-2022-168 / GHSA-9j59-75qj-795w","Warn: Project is vulnerable to: PYSEC-2014-10 / GHSA-cfmr-38g9-f2h7","Warn: Project is vulnerable to: PYSEC-2020-76 / GHSA-cqhg-xjhh-p8hf","Warn: Project is vulnerable to: PYSEC-2021-40 / GHSA-f4w8-cv6p-x6r5","Warn: Project is vulnerable to: PYSEC-2021-69 / GHSA-f5g8-5qq7-938w","Warn: Project is vulnerable to: PYSEC-2021-139 / GHSA-g6rj-rv7j-xwp4","Warn: Project is vulnerable to: PYSEC-2015-16 / GHSA-h5rf-vgqx-wjv2","Warn: Project is vulnerable to: PYSEC-2016-5 / GHSA-hggx-3h72-49ww","Warn: Project is vulnerable to: PYSEC-2020-84 / GHSA-hj69-c76v-86wr","Warn: Project is vulnerable to: PYSEC-2016-7 / GHSA-hvr8-466p-75rh","Warn: Project is vulnerable to: PYSEC-2015-15 / GHSA-j6f7-g425-4gmx","Warn: Project is vulnerable to: GHSA-j7hp-h8jx-5ppr","Warn: Project is vulnerable to: PYSEC-2019-110 / GHSA-j7mj-748x-7p78","Warn: Project is vulnerable to: GHSA-jgpv-4h4c-xhw3","Warn: Project is vulnerable to: PYSEC-2022-42979 / GHSA-m2vv-5vj5-2hm7","Warn: Project is vulnerable to: PYSEC-2021-37 / GHSA-mvg9-xffr-p774","Warn: Project is vulnerable to: PYSEC-2020-83 / GHSA-p49h-hjvm-jg3h","Warn: Project is vulnerable to: PYSEC-2022-8 / GHSA-pw3c-h7wp-cvhx","Warn: Project is vulnerable to: PYSEC-2021-93 / GHSA-q5hq-fp76-qmrc","Warn: Project is vulnerable to: PYSEC-2020-82 / GHSA-r7rm-8j6h-r933","Warn: Project is vulnerable to: PYSEC-2014-23 / GHSA-r854-96gq-rfg3","Warn: Project is vulnerable to: PYSEC-2016-8 / GHSA-rwr3-c2q8-gm56","Warn: Project is vulnerable to: PYSEC-2020-81 / GHSA-vcqg-3p29-xw73","Warn: Project is vulnerable to: PYSEC-2020-79 / GHSA-vj42-xq3r-hr3r","Warn: Project is vulnerable to: PYSEC-2021-70 / GHSA-vqcj-wrf2-7v73","Warn: Project is vulnerable to: PYSEC-2016-9 / GHSA-w4vg-rf63-f3j3","Warn: Project is vulnerable to: PYSEC-2014-22 / GHSA-x895-2wrm-hvp7","Warn: Project is vulnerable to: PYSEC-2022-9 / GHSA-xrcv-f9gm-v42c","Warn: Project is vulnerable to: PYSEC-2021-137","Warn: Project is vulnerable to: PYSEC-2021-138","Warn: Project is vulnerable to: PYSEC-2021-317","Warn: Project is vulnerable to: PYSEC-2021-38","Warn: Project is vulnerable to: PYSEC-2021-39","Warn: Project is vulnerable to: PYSEC-2021-94","Warn: Project is vulnerable to: PYSEC-2023-175","Warn: Project is vulnerable to: GHSA-mr82-8j83-vxmv"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-19T12:47:04.340Z","repository_id":37858346,"created_at":"2025-08-19T12:47:04.341Z","updated_at":"2025-08-19T12:47:04.341Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28673200,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-22T20:48:19.482Z","status":"ssl_error","status_checked_at":"2026-01-22T20:48:14.968Z","response_time":144,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["ocr-d"],"created_at":"2026-01-22T22:21:24.889Z","updated_at":"2026-01-22T22:21:25.700Z","avatar_url":"https://github.com/hnesk.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Unit tests](https://github.com/hnesk/browse-ocrd/workflows/Unit%20tests/badge.svg?branch=master)](https://github.com/hnesk/browse-ocrd/actions/workflows/unittest.yml)\n[![Docker build](https://github.com/hnesk/browse-ocrd/actions/workflows/dockerhub.yml/badge.svg)](https://github.com/hnesk/browse-ocrd/actions/workflows/dockerhub.yml)\n[![PyPI version](https://badge.fury.io/py/browse-ocrd.svg)](https://badge.fury.io/py/browse-ocrd)\n# OCR-D Browser\n\nAn extensible viewer for [OCR-D](https://ocr-d.de/) [mets.xml](https://ocr-d.de/en/spec/mets) files\n\n * [Screenshot](#screenshot)\n * [Features](#features)\n * [Installation](#installation)\n    * [Native](#native-tested-on-ubuntu-18042004)\n       * [From source](#from-source)\n       * [Via pip](#via-pip)\n    * [Docker](#docker)\n * [Usage](#usage)\n    * [Native GUI](#native-gui)\n    * [Docker service](#docker-service)\n * [Configuration](#configuration)\n    * [Configuration file locations](#configuration-file-locations)\n    * [Configuration file syntax](#configuration-file-syntax)\n \n## Screenshot\n\n![OCRD Browser with Page and Xml view](docs/screenshot.png)\n\n\n## Features\n\n- Browse fileGrps and pages, arranging views next to each other for comparison\n- PageView: Show original or derived page images with [PAGE-XML](https://ocr-d.de/en/spec/page) annotations overlay, similar to [PageViewer](https://github.com/PRImA-Research-Lab/prima-page-viewer)\n- ImageView: Show original or derived images (`AlternativeImage` on any level of the structural hierarchy)\n- ImageView: Show multiple images at once for different pages (horizontally) or different segments (vertically), zooming freely\n- XmlView: Show raw [PAGE-XML](https://ocr-d.de/en/spec/page) with syntax highlighting, open with [PageViewer](https://github.com/PRImA-Research-Lab/prima-page-viewer)\n- TextView: Show concatenated [PAGE-XML](https://ocr-d.de/en/spec/page) text annotation\n- DiffView: Show a simple diff comparison between text annotations from different fileGrps  \n- HtmlView: Show rendered HTML comparison from [dinglehopper](https://github.com/qurator-spk/dinglehopper) evaluations\n\n## Installation\n\nOCR-D Browser requires Python 3.7 or higher.\n\n### Native (tested on Ubuntu 18.04/20.04) \n\nThe native installation requires [GTK 3](https://www.gtk.org/).\n\nIn any case you need a [virtual environment](https://packaging.python.org/tutorials/installing-packages/#creating-virtual-environments) with a current `pip` version (\u003e=20), preferably your existing OCR-D venv:\n\n\u003cdetails\u003e\n  \u003csummary\u003eCreate a current pip venv:\u003c/summary\u003e\n\n```bash\nsudo apt install python3-pip python3-venv \npython3 -m venv venv\nsource venv/bin/activate\npip install --upgrade pip setuptools wheel\n```\n\u003c/details\u003e\n\n\n#### From source\n```bash\ngit clone https://github.com/hnesk/browse-ocrd.git \ncd browse-ocrd\nsudo make deps-ubuntu\nmake install\n```\n\n#### Via pip\n\n```bash\nsudo apt install libcairo2-dev libgirepository1.0-dev\npip install browse-ocrd\n```\n\n### Docker\n\nIf you have installed [Docker](https://docs.docker.com/get-docker/), you can build OCR-D Browser as a **web service**:\n\n    docker build -t ocrd_browser .\n\nOr use a prebuilt image from Dockerhub:\n\n    docker pull hnesk/ocrd_browser\n\n\n## Usage\n\n### Native GUI\nStart the app with the filesystem path to the METS file of your [OCR-D workspace](https://ocr-d.de/en/spec/glossary#workspace):\n```\nbrowse-ocrd ./path/to/mets.xml\n```\n\nYou can still open another METS file from the UI though.\n\n### Docker service\n\nWhen running the webservice, you need to pass a directory `DATADIR` which (recursively) contains all the workspaces you want to serve.\nThe top entrypoint `http://localhost/` will show an index page with a link `http://localhost/browse/...` for each workspace path.\nEach link will run `browse-ocrd` at that workspace in the background, and then redirect your browser to the internal [Broadway server](https://docs.gtk.org/gtk3/broadway.html), which renders the app in the web browser.\n\nTo start up, just do:\n\n    docker run -it --rm -v DATADIR:/data -p 8085:8085 -p 8080:8080 ocrd_browser\n\n\n## Configuration\n\n### Configuration file locations\n\nAt startup the following directories a searched for a config file named `ocrd-browser.conf` \n\n```python\n# directories and their default values under Ubuntu 20.04\nGLib.get_system_config_dirs()  # '/etc/xdg/xdg-ubuntu/ocrd-browser.conf', '/etc/xdg/ocrd-browser.conf'\nGLib.get_user_config_dir()     # '/home/jk/.config/ocrd-browser.conf'  \nos.getcwd()                    # './ocrd-browser.conf'\n```\n\n### Configuration file syntax\n\nThe `ocrd-browser.conf` file is an ini-file with the following sections and keys:\n```ini\n[FileGroups]\n# Preferred fileGrp names for thumbnail display in the Page Browser \n# Comma separated list of regular expressions\npreferredImages = OCR-D-IMG, OCR-D-IMG.*, ORIGINAL\n\n# Each Tool has a section header [Tool XYZ]\n# At the moment the only defined tool is \"PageViewer\"  \n[Tool PageViewer]\n# shell commandline to execute with placeholders  \ncommandline = /usr/bin/java -jar /home/jk/bin/JPageViewer/JPageViewer.jar --resolve-dir {workspace.directory} {file.path.absolute}\n```\n\n\u003e Note: You can get PRImA's PageViewer at [Github](https://github.com/PRImA-Research-Lab/prima-page-viewer/releases).\n\n\nThe `commandline` string will be used as a python format string with the keyword arguments:\n\n* `workspace` : The current `ocrd.Workspace`, all properties get shell escaped (by `shlex.quote`) automatically.\n* `file` : The current `ocrd_models.OcrdFile`, all properties get shell escaped (by `shlex.quote`) automatically, also there is an additional property `path` with the properties `absolute` and `relative`, so `{file.path.absolute}` will be replaced by the shell quoted absolute path of the file. \n\n### Configuration by environment variables\n\nIt is possible to set or override values of the configuration through environment variables. The environment variables follow this structure :  `BROCRD__{SECTION}__{KEY}`, where `SECTION` and `KEY` are in upper snake case and divided by a double underscore (`__`). If the section title contains spaces, the single words are also divided by `__`.  \n\nSome examples:\n```shell\nBROCRD__FILE_GROUPS__PREFERRED_IMAGES='THUMB'  \nBROCRD__TOOL__PAGEVIEWER__COMMANDLINE='ls {file.path.absolute}'  \n\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhnesk%2Fbrowse-ocrd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhnesk%2Fbrowse-ocrd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhnesk%2Fbrowse-ocrd/lists"}