{"id":37378794,"url":"https://github.com/epochblue/nanogen","last_synced_at":"2026-01-16T05:05:09.628Z","repository":{"id":21837381,"uuid":"25160450","full_name":"epochblue/nanogen","owner":"epochblue","description":"A very small static site generator written in Python.","archived":false,"fork":false,"pushed_at":"2018-03-26T12:22:29.000Z","size":109,"stargazers_count":13,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-15T08:00:39.512Z","etag":null,"topics":["blog-engine","cli","command-line","python","static-site-generator"],"latest_commit_sha":null,"homepage":null,"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/epochblue.png","metadata":{"files":{"readme":"README.rst","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":"2014-10-13T13:47:57.000Z","updated_at":"2025-12-03T21:21:58.000Z","dependencies_parsed_at":"2022-08-19T23:00:54.525Z","dependency_job_id":null,"html_url":"https://github.com/epochblue/nanogen","commit_stats":null,"previous_names":["epochblue/gin"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/epochblue/nanogen","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/epochblue%2Fnanogen","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/epochblue%2Fnanogen/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/epochblue%2Fnanogen/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/epochblue%2Fnanogen/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/epochblue","download_url":"https://codeload.github.com/epochblue/nanogen/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/epochblue%2Fnanogen/sbom","scorecard":{"id":379174,"data":{"date":"2025-08-11","repo":{"name":"github.com/epochblue/nanogen","commit":"940a40d5ab42d57b45b981c7ced8827aba74718a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"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":"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":"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":"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":"Code-Review","score":0,"reason":"Found 0/19 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":"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":"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":"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: 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"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 17 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-18T14:59:11.405Z","repository_id":21837381,"created_at":"2025-08-18T14:59:11.405Z","updated_at":"2025-08-18T14:59:11.405Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28477210,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T03:13:13.607Z","status":"ssl_error","status_checked_at":"2026-01-16T03:11:47.863Z","response_time":107,"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":["blog-engine","cli","command-line","python","static-site-generator"],"created_at":"2026-01-16T05:05:09.560Z","updated_at":"2026-01-16T05:05:09.620Z","avatar_url":"https://github.com/epochblue.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"nanogen\n#######\n\nA very small static blog generator written in Python.\n\n.. image:: https://img.shields.io/pypi/v/nanogen.svg\n    :target: https://pypi.python.org/pypi/nanogen\n    :alt: Latest PyPI version\n\n.. image:: https://travis-ci.org/epochblue/nanogen.svg?branch=master\n    :target: https://travis-ci.org/epochblue/nanogen\n    :alt: nanogen build status\n\nPurpose\n=======\n\n``nanogen`` exists solely so I can have a blogging platform I call my own.\nThe platform is very intentionally bare bones and simple. The code is\nintentionally utilitarian and realistically less-than-perfect.\n\nIf you have an idea for a way to improve this without significantly increasing\n``nanogen``'s complexity, please open an issue and let me know.\n\nIf you're looking for a more fully-featured static site generator, may I\nrecommend something like `Jekyll`_ or `Pelican`_ ?\n\n\nInstallation\n============\n\nThe best way to install ``nanogen`` is through ``pip``::\n\n    $\u003e pip install nanogen\n\n\nIf you don't want to install it via ``pip``, you can install it\nmanually::\n\n    $\u003e git clone https://github.com/epochblue/nanogen\n    $\u003e cd nanogen\n    $\u003e python setup.py install\n\n\nNote : To avoid possible dependency version issues, I recommend installing\n``nanogen`` into a virtual environment, rather than globally.\n\n\n\nHow To Use\n==========\n\nInitializing\n------------\n\nOnce ``nanogen`` is installed, navigate to the directory you'd like to\nuse as your new blog. Our examples will use a ``blog`` directory in ``$HOME``::\n\n    $\u003e mkdir blog\n    $\u003e cd blog\n\nOnce there, run ``nanogen``'s ``init`` command to get started::\n\n    $\u003e nanogen init\n\nRunning this command will generate the basic directories used by\n``nanogen``. When this command completes, the ``blog`` directory will\nlook like this::\n\n    ~/blog\n    |-- _layout\n    |   `-- blog.cfg\n    `-- _posts\n\n``_posts`` and ``_layout`` are the only two folders required by ``nanogen``, and\ntheir names cannot be changed by the user. Your individual posts will go in the\n``_posts`` directory, and the templates will go in the ``_layouts`` directory.\n\nThe ``blog.cfg`` file will hold metadata about your blog (author's name and\nemail, along with the site's title, description, and URL). A skeleton version of\nthis file is created for your during ``init``. The keys and values contained in\nthis file will be passed to your templates under the ``site`` variable. For\nexample: your site's title will be be available in the ``site.title`` attribute.\n\nAt this time, ``nanogen`` does not come with a built-in theme, so it's up to\nyou to create your own.\n\n\nCreating Posts\n--------------\n\nOne way to create new posts is by creating a new file in the ``_posts``\ndirectory. The filename is important and must match the following rules:\n\n1.  The file can't start with an underscore (they are ignored)\n2.  The file's name must match the pattern ``yyyy-mm-dd-\u003cpost_title_slug\u003e``\n3.  The file's extension must be a valid Markdown extension (``md``, ``mdown``, or ``markdown``).\n\nTo illustrate::\n\n    # valid filename\n    2015-11-01-this-charming-man.md\n\n    # invalid filename\n    15-11-1-bigmouth-strikes-again.txt\n\nIf you don't want to try to remember all that, you can use ``nanogen``'s ``new``\ncommand to do it for you. The only required argument to this command is the title of the\npost being generated::\n\n    $\u003e nanogen new \"Example Post Title\"\n\nRunning this will create a properly-named and formatted file in the ``_posts``\ndirectory.\n\nDraft posts aren't an \"official\" feature of ``nanogen``, however they are\npossible. By default, when ``nanogen`` generates a site it will only look in the\n``_posts`` folder for files to process. If you'd like to maintain drafts of your\nposts before you publish them, you can create a ``_drafts`` folder next to the\n``_posts`` folder and ``nanogen`` will ignore it during site generation.\nAlternatively, you can prepend the filename of a draft post with an underscore,\nand ``nanogen`` will skip over it when searching for files to process.\n\n\nPost Content Format\n~~~~~~~~~~~~~~~~~~~\n\n``nanogen`` posts don't use `YAML`_ front-matter, so the first line of your post\nwill be used for the title of the post. The content of the posts will be\nprocessed as `Markdown`_ (the Github-flavored variety, complete with\nsyntax-highlighted code blocks). A minimal example of a valid ``nanogen`` post\nis this::\n\n    ## This will become the title (with hashes stripped out)\n\n    **This** will become the post's _content_.\n\nThe title will be stripped out of the post's content, though it will be\navailable to your themes via the ``post.title`` attribute.\n\n\nGenerating Your Site\n--------------------\n\nOnce you're ready to generate your site, you can use the ``build``\ncommand::\n\n    $\u003e nanogen build\n\nThis command will walk your ``_posts`` directory, process any valid files it\nfinds, and will write all the generated HTML files into a ``_site`` folder.\nAlthough you will want to preview this on your local development\nsystem (see the following section for how to do this), the ``_site``\nfolder can be uploaded to your web host as-is.\n\n\nPreviewing Your Site\n--------------------\n\nTo see what your site will look like *before* you upload it to a live\nwebserver for the world to see, ``nanogen`` provides a built-in server\nthat allows you to preview your generated site::\n\n    $\u003e nanogen preview\n\nThis command will start a server that listens on ``localhost`` port\n``8080``. Simply open ``http://localhost:8080`` in a web broswer to\nsee how your site looks. If you'd like to use a different hostname or\nport, ``nanogen`` provides an option for each (``-h|--host, and\n-p|--port``, respectively). The following example will start a server\nthat listens on ``local.dev`` port ``8000`` (http://local.dev:8000)::\n\n    $\u003e nanogen preview --host local.dev --port 8000\n\n\nCleaning\n--------\n\nIf your ``_site`` folder somehow gets corrupted, or you'd simply like\nto generate your site from scratch, you can use the ``clean`` command::\n\n    $\u003e nanogen clean\n\nThere is no undo or confirmation when running this command.\n\n\n``nanogen`` Themes\n==================\n\n*Note*: ``nanogen`` doesn't provide any themes out of the box. If you'd like to\ndevelop your own theme for ``nanogen``, this section should explain how.\n\n``nanogen`` uses `Jinja2`_ for its templating. If you need information\nabout Jinja's syntax, please `refer to their documentation\n\u003chttp://jinja.pocoo.org/docs/\u003e`_.\n\n\nTemplate Files\n--------------\n\nThe templates that make up the theme for your ``nanogen`` blog need to be placed\nin the ``_layout`` directory. ``nanogen`` only expects a few files to exist, and\nthose files are:\n\n1. ``index.html``\n2. ``post.html``\n3. ``rss.xml``\n\n``index.html`` will be used as the sites homepage, ``post.html`` will be used to\ngenerate each individual post, and ``rss.xml`` will be be used to generate your\nblog's RSS feed.\n\nAll of your blog's posts will be passed to ``index.html`` and ``rss.xml`` via a\n`Jinja2`_ context variable named ``posts`` (posts will be in reverse\nchronological order). Individual posts will be passed to ``post.html`` via a\ncontext variable named ``post``. Each post will have the following relevant\nattributes available to use in the template:\n\n* ``html_content`` - the HTML version of the post\n* ``markdown_content`` - the Markdown version of the post (minus the title)\n* ``title`` - the title of the post (will not be processed as Markdown)\n* ``pub_date`` - a Python datetime object representing the publish date of the post\n* ``permalink`` - the relative URL to the post\n\nPlease see the ``_layout`` directory in the included example for a basic theme\nyou can use to as a jumping off point for your own theme.\n\n\nStatic Files\n------------\n\nIf you have any files that you'd like to include in the published site\n(JavaScript files, CSS files, images, etc), place them into a folder named\n``static`` inside the ``_layout`` folder. This folder will automatically be\ncopied into the ``_site`` folder during the build process. No processing will\nbe performed on the files within the ``static`` directory.\n\n\nSites Using ``nanogen``\n=======================\n\n* `http://blog.cubicle17.com/`__ (code is `available here`__)\n\n\nLicense\n#######\n\n``nanogen`` is MIT licensed. Please see included ``LICENSE`` file for\nmore information.\n\n\nAuthor\n######\n\n`Bill Israel`_ - `bill.israel@gmail.com`_\n\n\n.. _Jekyll: http://jekyllrb.com\n.. _Pelican: http://blog.getpelican.com\n.. _Markdown: http://daringfireball.net/projects/markdown\n.. _YAML: http://yaml.org/\n.. _Jinja2: http://jinja2.pocoo.org/\n.. _Bill Israel: http://billisrael.info/\n.. _bill.israel@gmail.com: mailto:bill.israel@gmail.com\n\n__ http://blog.cubicle17.com/\n__ https://github.com/epochblue/blog\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fepochblue%2Fnanogen","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fepochblue%2Fnanogen","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fepochblue%2Fnanogen/lists"}