{"id":40202783,"url":"https://github.com/larsvoigt/epub-full-text-search","last_synced_at":"2026-01-19T20:33:16.024Z","repository":{"id":57226458,"uuid":"38313769","full_name":"larsvoigt/epub-full-text-search","owner":"larsvoigt","description":"Search engine for digital publication based on EPUB 3","archived":false,"fork":false,"pushed_at":"2017-12-04T15:40:36.000Z","size":4556,"stargazers_count":51,"open_issues_count":19,"forks_count":10,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-10-06T20:46:13.213Z","etag":null,"topics":["cloud","epub","epub-reader","epub-search","epub3","epub3-documents","full-text-search","fulltext-search","reader","search-engine"],"latest_commit_sha":null,"homepage":"","language":"HTML","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/larsvoigt.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}},"created_at":"2015-06-30T14:25:54.000Z","updated_at":"2024-11-11T11:54:31.000Z","dependencies_parsed_at":"2022-08-22T12:31:04.751Z","dependency_job_id":null,"html_url":"https://github.com/larsvoigt/epub-full-text-search","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/larsvoigt/epub-full-text-search","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larsvoigt%2Fepub-full-text-search","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larsvoigt%2Fepub-full-text-search/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larsvoigt%2Fepub-full-text-search/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larsvoigt%2Fepub-full-text-search/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/larsvoigt","download_url":"https://codeload.github.com/larsvoigt/epub-full-text-search/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larsvoigt%2Fepub-full-text-search/sbom","scorecard":{"id":579414,"data":{"date":"2025-08-11","repo":{"name":"github.com/larsvoigt/epub-full-text-search","commit":"15f511928149b09f7729cbe14de21e5e7261dbf0"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"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":"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 0/30 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":"Dangerous-Workflow","score":-1,"reason":"no workflows found","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":"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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"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":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"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":"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":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"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":"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"}}]},"last_synced_at":"2025-08-20T18:47:01.858Z","repository_id":57226458,"created_at":"2025-08-20T18:47:01.858Z","updated_at":"2025-08-20T18:47:01.858Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28583857,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-19T19:46:29.903Z","status":"ssl_error","status_checked_at":"2026-01-19T19:45:54.560Z","response_time":67,"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":["cloud","epub","epub-reader","epub-search","epub3","epub3-documents","full-text-search","fulltext-search","reader","search-engine"],"created_at":"2026-01-19T20:33:15.942Z","updated_at":"2026-01-19T20:33:16.014Z","avatar_url":"https://github.com/larsvoigt.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n[travis-url]: https://travis-ci.org/larsvoigt/epub-full-text-search\n[travis-image]: https://travis-ci.org/larsvoigt/epub-full-text-search.svg?branch=master\n[npm-url]: https://npmjs.org/package/epub-full-text-search\n[npm-version-image]: http://img.shields.io/npm/v/epub-full-text-search.svg?style=flat\n# EPUB-Search [![Build Status][travis-image]][travis-url] [![NPM version][npm-version-image]][npm-url] \n## Search engine for digital publication based on EPUB 3\n\nWelcome! EPUB-Search makes your digital publications searchable.\n\nWhat is the use case:\n* Server-side microservice to search for browser-based “cloud” readers within EPUBs\n* For EPUBs that lives online\n* To search within your local EPUB-stock\n\n\n### Online Demo\n[Demo](http://protected-dusk-3051.herokuapp.com/)\n\n### Features included:\n\n* Full text search (get all query matches for one epub-document or for a whole epub collection)  \n* Autocomplete\n* Full javascript\n* Hits including [cfi](http://www.idpf.org/epub/linking/cfi/epub-cfi.html) references\n* Response results in JSON format\n* Pre-indexing\n* Indexing on-the-fly\n\n\n## Installation\n\nFor CLI use\n\n```\n[sudo] npm install epub-full-text-search -g\n```\n\nFor library use\n\n```\n$ npm install epub-full-text-search --save\n```\n\n## Running as a Service \n\n**CLI**\n\n```\n$ epub-search \n\nWelcome to Epub search service\n\nUsage: epub-search [action] [options]\n\nActions:\n        start           Start the service\n        stop            Stop the service\n        logs            Show logs\n        writeToIndex    Epub-book(s) which should be written to index.(Hint: the epub content have to be unzipped)\n\nOptions:\n        -p      Path to epub folder which contains epub-book(s).\n\n```\n\n### Start Service\n\n```\n$ [sudo] epub-search start\n```\n\n### Modus operandi\n\nEPUB search provides two *modus operandi*:\n* The first one is **Indexing On-the-fly**. This means the ebook will be indexed in the background when it gets opened. \nThe assumption for this *mode* is the EPUB3-book which is remote available. \nThe generated search-index will be deleted if the ebook is closed.     \n \n* The second one is **Pre-Indexing**. This means all ebooks on the local machine can be indexed \nand the generated search index will be persistent available during all reading sessions. So it possible the search terms within all indexed\nebooks. \n\n\n#### Indexing On-the-fly\n\n##### Indexing\n\n``` \nhttp://localhost:8085/addToIndex?url=${epub}/\u0026uuid=${uuid}\n```\n\n##### Search\n```\nhttp://localhost:8085/search?q=${term}\u0026uuid=${uuid}\n```\n\n##### Delete index\n```\nhttp://localhost:8085/deleteFromIndex?\u0026uuid=${uuid}\n```\n\n\n#### Pre-Indexing\n\n##### Indexing\n\nLet´s start to index some EPUBs: \n\n```\n$ epub-search writeToIndex -p  \u003cpath\u003e\n```\n\n##### Search \n\nSearch for term:\n\n\u003cpre\u003e\nhttp://localhost:8085/search?q=\u003ci\u003e${term}\u003c/i\u003e\u0026t=\u003ci\u003e${EPUB-title}\u003c/i\u003e;\n\u003c/pre\u003e\n\n##### Suggestions for Autocomplete \n\n\u003cpre\u003e\n$  http://localhost:8085/matcher?beginsWith=\u003ci\u003ebeginning-of-the-text-to-match\u003c/i\u003e\n\u003c/pre\u003e\n\n### Examples:\n\n#### Indexing On-the-fly\n\nTODO\n\n#### Pre-indexing\nAt first, please install epub-search globally: \n\n```\n[sudo] npm install epub-full-text-search -g\n```\n\nStart service: \n\n```\n$ [sudo] epub-search start\n```\n\nAdd sample epubs to index:\n\n```\nepub-search writeToIndex -p {prefix}/node_modules/epub-full-text-search/node_modules/epub3-samples\n```\n\nNow we should get some hits for the term ``epub``:\n\n\u003csub\u003eFor requests you can use *$ curl -XGET \"http://localhost:8085/search?q=math\"* or the *browser*...\u003c/sub\u003e\n\nSearch within the whole ebook-collection:\n\n```\nhttp://localhost:8085/search?q=math\n```\n\nSet the filter for the book-title ```t=\"...\"``` to search only within a specific ebook:\n\n```\nhttp://localhost:8085/search?q=epub\u0026t=Accessible+EPUB+3\n```\n\nOr we can get some suggestions for an autocomplete:\n\n```\nhttp://localhost:8085/matcher?beginsWith=epu\n```\n\n### For library use\nTODO\n\n\u003c!--\n```javascript\nimport epubSearch from 'epub-full-text-search';\nconst options = {'indexPath': 'path_to_index-DB'}; // an own path can be set optional\nepubSearch(options || {})\n    .then(searchInstance =\u003e {\n        \n        // INDEXING (write your **unzipped** EPUB3-Document to index)\n        searchInstance.indexing('your_epub(s)_directory')\n            .then(info =\u003e {\n               winston.log('info', info);\n            })\n            .fail(function(err) {\n                winston.log('error', err);\n            });\n       \n        // SEARCHING\n        // search(query, epubTitle)\n        searchInstance.search('epub', \"Accessible EPUB 3\")\n            .then(results =\u003e {\n                winston.log('info', results);\n            })\n            .fail(function(err) {\n                winston.log('error', err);\n            });\n            \n        // COMPLEX SEARCHING\n        // query(query, epubTitle)\n        const search = 'epub';\n        searchInstance.query({\n            query: [\n                {\n                    AND: [\n                        {'*': [search]},\n                        {filename: ['accessible_epub_3']}\n                    ]\n                }\n            ]\n        }, search)\n            .then(results =\u003e {\n                winston.log('info', results);\n            })\n            .fail(function(err) {\n                winston.log('error', err);\n            });\n     \n        // SEARCH SUGGESTIONS\n        // match(beginsWith, epubTitle)\n        searchInstance.match('matrix', 'A First Course in Linear Algebra')\n            .then(results =\u003e {\n                winston.log('info', results);\n            })\n            .fail(function(err) {\n                winston.log('error', err);\n            });\n    })\n    .fail(function(err) {\n        winston.log('error', err);\n    });\n\n``` \n   \n--\u003e\n### Hit data format \nTODO\n\n### Local testing \n\nInstall all dependent modules: ``` npm install ```.\n\nStart up the demo ```npm run start```. It should run an express server on your local machine.\n\nWhen you are navigating to [http://localhost:8085/](http://localhost:8085/) you can see the demo?.\n\nNote: The pre-indexing process starts automatically and it takes a few seconds until the pre-indexing search is available.    \n\n### Technical Details\n\nEPUB-Search uses [search-index](https://github.com/fergiemcdowall/search-index) \nto indexing book content.\n\n### Contributing\n\nVery welcome ... :-)  \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flarsvoigt%2Fepub-full-text-search","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flarsvoigt%2Fepub-full-text-search","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flarsvoigt%2Fepub-full-text-search/lists"}