{"id":19481002,"url":"https://github.com/textbook/bulrush","last_synced_at":"2025-10-08T22:14:45.160Z","repository":{"id":49837220,"uuid":"75224016","full_name":"textbook/bulrush","owner":"textbook","description":"A Bulma-based Pelican blog theme; clean, flexible and responsive.","archived":false,"fork":false,"pushed_at":"2024-09-05T14:54:03.000Z","size":1300,"stargazers_count":65,"open_issues_count":3,"forks_count":22,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-09-13T18:28:13.098Z","etag":null,"topics":["blog-theme","bulma","flexbox","pelican","python"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/bulrush/","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/textbook.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":"2016-11-30T20:24:02.000Z","updated_at":"2025-01-28T07:11:03.000Z","dependencies_parsed_at":"2024-06-21T13:04:49.452Z","dependency_job_id":"c47ae718-6afa-4e21-8202-b5d9e9266f8e","html_url":"https://github.com/textbook/bulrush","commit_stats":{"total_commits":108,"total_committers":9,"mean_commits":12.0,"dds":"0.12962962962962965","last_synced_commit":"6945e13e85c204538913eb03f9c690a0c1b0bb99"},"previous_names":[],"tags_count":25,"template":false,"template_full_name":null,"purl":"pkg:github/textbook/bulrush","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/textbook%2Fbulrush","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/textbook%2Fbulrush/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/textbook%2Fbulrush/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/textbook%2Fbulrush/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/textbook","download_url":"https://codeload.github.com/textbook/bulrush/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/textbook%2Fbulrush/sbom","scorecard":{"id":875575,"data":{"date":"2025-08-11","repo":{"name":"github.com/textbook/bulrush","commit":"6945e13e85c204538913eb03f9c690a0c1b0bb99"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.6,"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":"Code-Review","score":1,"reason":"Found 4/29 approved changesets -- score normalized to 1","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":"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/push.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":"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/push.yml:60: update your workflow using https://app.stepsecurity.io/secureworkflow/textbook/bulrush/push.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/push.yml:61: update your workflow using https://app.stepsecurity.io/secureworkflow/textbook/bulrush/push.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/push.yml:65: update your workflow using https://app.stepsecurity.io/secureworkflow/textbook/bulrush/push.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/push.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/textbook/bulrush/push.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/push.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/textbook/bulrush/push.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/push.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/textbook/bulrush/push.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/push.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/textbook/bulrush/push.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/push.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/textbook/bulrush/push.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/push.yml:24","Warn: npmCommand not pinned by hash: .github/workflows/push.yml:27","Info:   0 out of   7 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   1 pipCommand dependencies pinned","Info:   0 out of   1 npmCommand 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":"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":"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: ISC 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":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/push.yml:51"],"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":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.6.3 not signed: https://api.github.com/repos/textbook/bulrush/releases/101379306","Warn: release artifact v0.6.2 not signed: https://api.github.com/repos/textbook/bulrush/releases/101376389","Warn: release artifact v0.6.3 does not have provenance: https://api.github.com/repos/textbook/bulrush/releases/101379306","Warn: release artifact v0.6.2 does not have provenance: https://api.github.com/repos/textbook/bulrush/releases/101376389"],"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 'main'"],"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 5 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"}}]},"last_synced_at":"2025-08-24T05:50:35.933Z","repository_id":49837220,"created_at":"2025-08-24T05:50:35.933Z","updated_at":"2025-08-24T05:50:35.933Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279000781,"owners_count":26082851,"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","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["blog-theme","bulma","flexbox","pelican","python"],"created_at":"2024-11-10T20:01:08.916Z","updated_at":"2025-10-08T22:14:45.130Z","avatar_url":"https://github.com/textbook.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"Bulrush\n=======\n\nA [Bulma][1]-based [Pelican][2] blog theme; clean, flexible and responsive.\n\n ![Screenshot - Bulrush at 1440px][13]\n\nThe icons are from [Font Awesome][3] by Dave Gandy. The pure HTML/CSS \"Fork me\non GitHub\" ribbon is based on [`github-fork-ribbon-css`][4] by Simon Whitaker; I\nmodified it to be flatter.\n\nFeatures\n--------\n\n - [x] **Responsive design** - four column layout on desktop (≥980px), three column\non tablet (≥769px), single column on mobile. Tabbed navigation bar collapses\ninto drop-down \"burger menu\" on mobile.\n\n - [x] **Meta tagging functionality** - support for [Open Graph][5] and [Twitter\nCards][6] meta tags, giving enhanced display when sharing articles on social\nmedia sites (**note**: *currently only available for [articles and pages][7]*).\n\n - [x] **Printable layouts** - the navigation is hidden when printed, avoiding\nwasted space.\n\n - [x] **Custom styling** - additional CSS files can be included to customise\nthe default styling.\n\n - [x] **Service integrations** - including Disqus, GitHub, Google Analytics\nand MailChimp.\n\n - [x] **PyPI package available** - so it can be `pip install`-ed.\n\n - [x] **[Mermaid][25] integration** - so you can include generated diagrams.\n\nInstallation\n------------\n\nBulrush is available via the [Python Package Index][22], so you can install it\nwith:\n\n```bash\npip install bulrush\n```\n\nThe main exports from the module are:\n\n - `PATH`: the path to the theme;\n - `FILTERS`: the additional Jinja filters used by the theme; and\n - `ENVIRONMENT`: the Jinja environment required by the theme.\n\nYou can use them in your `pelicanconf.py` as follows:\n\n```python\nimport bulrush\n\nTHEME = bulrush.PATH\nJINJA_ENVIRONMENT = bulrush.ENVIRONMENT\nJINJA_FILTERS = bulrush.FILTERS\n```\n\n### Other Requirements\n\nYou need to make the appropriate Pelican plugin, [`assets`][15], available. One\nway of achieving this is to make the `pelican-plugin` repository a submodule of\nyour site, then you can add to your `pelicanconf.py`:\n\n```python\nPLUGIN_PATHS = ['pelican-plugins']\nPLUGINS = ['assets']\n```\n\n**Note**: referencing the Pelican plugins in this way may have implications for\nthe license of your project. See https://github.com/textbook/bulrush/issues/17.\n\n### Alternative\n\nIf you don't want to install the theme from PyPI you can simply give Pelican a\nrelative path to the inner `bulrush/` directory. For example, add `bulrush` as\na submodule and set:\n\n```python\nTHEME = 'bulrush/bulrush'\n```\n\nIn this case you will need to configure the environment and filters yourself\nand ensure that `webassets` *is* installed from PyPI.\n\nAdditional Screenshots\n----------------------\n\n - 480 x 480px (mobile):\n\n     ![Screenshot - Bulrush at 480px][11]\n\n - 840 x 480px (tablet):\n\n     ![Screenshot - Bulrush at 840px][12]\n\n - 980 x 480px (desktop):\n\n     ![Screenshot - Bulrush at 980px][10]\n\nSettings\n--------\n\nAs well as the [basic settings][14], Bulrush supports the following options in\nyour `pelicanconf.py`:\n\n| Setting name           | What does it do?                                                                                                     |\n|------------------------|----------------------------------------------------------------------------------------------------------------------|\n| `BULRUSH_SHOW_SUMMARY` | A boolean, whether to show a summary rather than full article on index, category and tag pages. Defaults to `False`. |\n| `DISQUS_SITENAME`      | Enables Disqus comments. Note that you should set up the full Comment Count Link, as no additional text is applied.  |\n| `GITHUB_URL`           | Enables the \"Fork me on GitHub\" ribbon.                                                                              |\n| `GOOGLE_ANALYTICS`     | Set to `'UA-XXXX-YYYY'` to activate Google Analytics.                                                                |\n| `LICENSE`              | A string or dictionary describing the license for the site; see details below.                                       |\n| `LINKS`                | A list of tuples `('Title', 'URL')` for links to appear in the \"blogroll\" section of the sidebar.                    |\n| `MAILCHIMP`            | Configure to activate a [MailChimp][20] sign-up form; see details below.                                             |\n| `MERMAID`              | Activate [Mermaid][25] diagram support; see details below.                                                           |\n| `MENUITEMS`            | A list of tuples `('Title', 'URL')` for items to appear in the tabbed navigation.                                    |\n| `SITESUBTITLE`         | A subtitle to appear in the header.                                                                                  |\n| `SOCIAL`               | A list of tuples `('Title', 'URL')` to appear in the \"social\" section of the sidebar.                                |\n| `TWITTER_USERNAME`     | Enables Twitter meta-tags in the article and page headers.                                                           |\n\nIf `DISPLAY_CATEGORIES_ON_MENU` is omitted or set explicitly to `True`, the\ncategories are shown in the tabbed navigation with any `MENUITEMS`. If\n`DISPLAY_PAGES_ON_MENU` is omitted or set explicitly to `True`, they are listed\nin the sidebar with any `SOCIAL` or other `LINKS`.\n\n### Social Links\n\nAppropriate icons are provided in the sidebar for a range of sites in the\n`SOCIAL` link list. Have a look in [`social.html`][17] to see which titles this\napplies to. If none of the sites are a match, then:\n\n - if the second, URL element in the tuple starts with `'mailto:'`, an envelope\n   icon is used; otherwise\n - a globe icon is used.\n\n ![Screenshot - Social icons in sidebar][24]\n\n### MailChimp Configuration\n\nIf you're using [MailChimp][20] to handle a mailing list for your blog, you\ncan configure a subscription form in the sidebar. You need to set three values\nto enable this, which you can get from [the signup form creator][21]. Simply\nlook for the form action:\n\n```html\n\u003cform action=\"//user.region.list-manage.com/subscribe/post?u=abc123\u0026amp;id=def456\" ...\n```\n\nand extract the relevant sections:\n\n```python\nMAILCHIMP = dict(\n    domain='user.region.list-manage.com',\n    user_id='abc123',\n    list_id='def456',\n    validation=True,  # enable jQuery validation\n)\n```\n\nIf you set `validation=False` (or leave it out entirely) you will reduce the\npage load (as it won't need 140KB of JavaScript) but won't get inline form\nsubmission or email validation.\n\nYou can also add `rewards_url`, providing your unique [MonkeyRewards][19] URL,\nto enable a *\"Powered by MailChimp\"* link.\n\n### License Settings\n\nYou can provide one of two options to specify the license for your content:\n\n - License name (`str`): The name of the license to display. Unless otherwise\n   specified, a default icon ([`file-text-o`][23]) will be used and the entry\n   will link to the current page.\n\n   Creative Commons license names (e.g. `'CC BY-SA 4.0'`) are automatically\n   recognised and an appropriate icon and link are generated.\n\n - License definition (`dict`): A dictionary specifying the `name`, `url` and\n   optional `icon` (must be a Font Awesome icon name, default is\n   [`file-text-o`][23]).\n\nThe license details will be displayed at the bottom of the sidebar on every\npage.\n\n### Mermaid Configuration\n\nEnables [Mermaid][25] diagram generation on your site, allowing diagrams to be\nwritten in a Markdown-ish syntax. Simply wrap the code in a `pre` element\nwith the `mermaid` class:\n\n```html\n\u003cpre class=\"mermaid\"\u003e\ngraph TD;\n    A--\u003eB;\n    A--\u003eC;\n    B--\u003eD;\n    C--\u003eD;\n\u003c/pre\u003e\n```\n\nIf you set `MERMAID = True`, this will simply enable Mermaid with some default\nsettings:\n\n```javascript\n  const defaults = {\n    securityLevel: \"loose\",\n    theme: \"default\",\n    themeVariables: {\n      fontFamily: 'BlinkMacSystemFont, -apple-system, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif',\n    },\n  };\n```\n\nTo override these settings, or any of Mermaid's own [default configuration][26]\nyou can pass a _dictionary_ instead. This will be shallowly merged into the\ndefaults:\n\n```python\nMERMAID = dict(\n    securityLevel=\"strict\",\n    theme=\"forest\",  # disables fontFamily override\n)\n```\n\nCustom Styling\n--------------\n\nIf any of the entries in `EXTRA_PATH_METADATA` have `'path'`s ending with\n`'.css'` they will be included in the base template, allowing the site style\nto be overridden as required. For example, in your `pelicanconf.py`:\n\n```python\n# Static files\nSTATIC_PATHS = [\n    'extra',\n    ...\n]\nEXTRA_PATH_METADATA = {\n    'extra/custom.css': {'path': 'custom.css'},\n    ...\n}\n```\n\nIn use\n------\n\nHere are few current users of Bulrush (or modified versions of it):\n\n - [textbook](http://blog.jonrshar.pe/)\n - [Simon Says](https://simonsays.neocities.org/)\n - [CodeRobot](http://coderobot.downley.net/)\n\nIf you'd like to be featured here (or are and would prefer not to be), feel\nfree to submit a [pull request][18].\n\n  [1]: http://bulma.io/\n  [2]: http://docs.getpelican.com/en/stable/\n  [3]: http://fontawesome.io/\n  [4]: https://github.com/simonwhitaker/github-fork-ribbon-css\n  [5]: http://ogp.me/\n  [6]: https://dev.twitter.com/cards/overview\n  [7]: http://docs.getpelican.com/en/3.6.3/content.html#articles-and-pages\n  [8]: http://jinja.pocoo.org/docs/dev/extensions/#with-statement\n  [9]: https://github.com/miracle2k/webassets/\n  [10]: ./screenshot-980px.png\n  [11]: ./screenshot-480px.png\n  [12]: ./screenshot-840px.png\n  [13]: ./screenshot-1440px.png\n  [14]: http://docs.getpelican.com/en/3.6.3/settings.html#basic-settings\n  [15]: https://github.com/getpelican/pelican-plugins/tree/master/assets\n  [17]: https://github.com/textbook/bulrush/blob/main/templates/social.html\n  [18]: https://help.github.com/articles/about-pull-requests/\n  [19]: http://kb.mailchimp.com/accounts/billing/add-or-remove-monkeyrewards\n  [20]: http://eepurl.com/cNv6Rb\n  [21]: http://kb.mailchimp.com/lists/signup-forms/add-a-signup-form-to-your-website\n  [22]: https://pypi.python.org/pypi/bulrush\n  [23]: http://fontawesome.io/icon/file-text-o/\n  [24]: ./screenshot-social.png\n  [25]: https://mermaid.js.org/\n  [26]: https://mermaid.js.org/config/setup/modules/mermaidAPI.html#mermaidapi-configuration-defaults\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftextbook%2Fbulrush","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftextbook%2Fbulrush","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftextbook%2Fbulrush/lists"}