{"id":22789884,"url":"https://github.com/nicholaswmin/nix","last_synced_at":"2025-03-30T16:40:33.968Z","repository":{"id":259312260,"uuid":"875860871","full_name":"nicholaswmin/nix","owner":"nicholaswmin","description":"one file markdown publisher","archived":false,"fork":false,"pushed_at":"2025-02-08T00:42:17.000Z","size":565,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-29T02:47:05.647Z","etag":null,"topics":["framework","jekyll","minimal"],"latest_commit_sha":null,"homepage":"https://nicholaswmin.github.io/nix/","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nicholaswmin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2024-10-21T01:45:41.000Z","updated_at":"2025-02-08T00:42:20.000Z","dependencies_parsed_at":"2024-10-25T12:09:30.702Z","dependency_job_id":"703c2f1f-3b3f-4e00-a2eb-63131c74bc5d","html_url":"https://github.com/nicholaswmin/nix","commit_stats":null,"previous_names":["nicholaswmin/pop","nicholaswmin/nix"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nicholaswmin%2Fnix","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nicholaswmin%2Fnix/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nicholaswmin%2Fnix/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nicholaswmin%2Fnix/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nicholaswmin","download_url":"https://codeload.github.com/nicholaswmin/nix/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246350646,"owners_count":20763221,"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":["framework","jekyll","minimal"],"created_at":"2024-12-12T02:16:15.407Z","updated_at":"2025-03-30T16:40:33.959Z","avatar_url":"https://github.com/nicholaswmin.png","language":"Ruby","readme":"\u003e is a single-file static-site generator in 150 lines of [ruby][ruby]\n\n\u003e although nix is fully-working framework, it was written as a proof-of-concept\n\u003e \n\u003e It's distinguishing characteristic is that it's archicture \u0026 system design philosophy  \n\u003e (over)emphasizes [simplicity][kiss] to an unsual degree;\n\u003e even more that [program correctness][corr]\n\u003e\n\u003e Read more:\n\u003e - [The New Jersey style/Worse is Better][njs] by Richard Gabrielle, MIT\n\u003e - [Locality of Behaviour][lob]: Carson Gross\n\u003e\n\u003e It aims to balance 3 competing requirements:\n\u003e \n\u003e - it must be extemely easy to make sense of\n\u003e - it must actually allow publishing a site\n\u003e - it must be extremely easy to setup\n\u003e - it must be extemely easy to make sense of\n\u003e - it must follow conventions to a certain degree\n\u003e\n\u003e ## todo\n\u003e - [ ] tests\n\u003e - [ ] cleanup\n\u003e - [ ] docs\n\nInstead of installing `X`/`Y`  publishing framework on your system,   \nit inverts the process by embedding the \"framework\" in the site itself.\n\n- create a repo \u0026 drop `nix.rb` into it\n- run `nix.rb --init`\n- add posts \u0026 pages as [markdown][gfm]\n- `git push`\n\n... which publishes automatically on [Github Pages][gh-pages].\n\n### todo \n- [ ] unit tests\n- [ ] data should be pruned outside of this readme\n- [ ] code docs\n\nanyone with repository access can edit/publish the site by simply cloning the repo,  \nadd/edit posts and re-pushing to `main`.\n\n```bash\nUsage: nix [options]\n\nnix  --init            create sample blog\nnix  --build           build static HTML\nnix  --watch           rebuild on file change\n```\n\n## todo\n\n- [ ] docs\n- [ ] unit tests\n\n## Publish a site\n\n1. create a Github repo with enabled pages.\n2. drop the [nix.rb](#get-nix) file in it.\n3. Run `ruby nix.rb --init` to generate a sample site\n5. push to `main` branch\n\n... which publishes a barebones site consistent with the [1kb philosophy](https://1kb.club/) at: `\u003cuser\u003e.github.io/\u003crepo\u003e`\n\n### Publish new content\n\n\n1. write markdown in `posts/` and `pages/`\n2. push to `main` branch\n\n\n## quick start \n\nSay you have a repo with the following structure:\n\n\n`repo`  \n┣━`nix.rb`  \n┗━`README.md`\n\n\n\u003e generate a minimal sample blog:\n\n```bash\nruby nix.rb --init\n```\n\n## write posts\n\n- add [markdown][gfm] posts in `/posts`\n- add [markdown][gfm] pages in `/pages`\n- add images, videos, CSS in `/public`\n\nposts include [syntax highlighting][rouge], \njust wrap them in code fences (\\`\\`\\`) as usual:\n\n```js\nconst hello = 'world'\n```\n\nmoving on..\n\n\u003e build to static HTML, at `/build`\n\n```bash\nruby nix.rb --build\n# build ok!\n```\n\nor even better:\n\n\u003e rebuild automatically on file change\n\n```bash\nruby nix.rb --watch\n```\n\n## publish it\n\nJust push to `main`. \n\nAn autogenerated Github workflow will run `nix --build` to compile   \neverything once-more \u0026 deploy at: https://username.github.io/repo-name.\n\n\u003e `/build` directory is recompiled on `push` so you can safely `.gitignore`\n\u003e it entirely.\n\n## post format\n\njust make sure each page or post has:\n\n- an `h1` title on the 1st line\n- an `empty line` on the 2nd line\n- a `\u003cdate\u003e` on the 3rd, ie. `2024-10-18`\n\nthe rest is up to you.\n\n\u003e example:\n\n```markdown\n# Some pretentious post title\n \n2024-12-20\n\n\u003e A sentence should contain no unnecessary words, a paragraph no unnecessary \n\u003e sentences, for the same reason that a drawing should have no unnecessary lines \n\u003e and a machine no unnecessary parts. This requires not that the writer make all \n\u003e his sentences short, or that he avoid all detail and treat his subjects only \n\u003e in outline, but that every word tell\n\nThe Elements of Style by William Strunk Jr (1918) ...\n``` \n\n### get nix\n\n`nix` is just a single-file; it's max 150 lines of code \u0026 it includes everything \nnecessary to develop and publish a [ridicously minimal][club] yet functional \nblog site. \n\ngrab it from this repo [directly][download], or just `curl` it:\n\n```bash\ncurl -O https://raw.githubusercontent.com/nicholaswmin/nix/main/nix.rb\n```\n\napart from [Ruby 3.3][ruby] there's nothing to install; \nnor any commands to run. You don't need to run `gem install`. \nIt's not available as a `gem` either; \n\nThis is [intentional](#wheres-the-rest-of-it)\n\n## Quirks\n\n### Asset paths\n\nDon't use absolute paths to reference assets.   \n\nGithub Pages has a well-known quirk of serving from a non-root path,\napplicable to all static-site generators.\n\nthis won't work:\n\n```html\n\u003cimg src=\"/public/felix.svg\"\u003e\u003c/img\u003e\n\u003cimg src=\"/felix.svg\"\u003e\u003c/img\u003e\n```\n\nuse relative paths instead:\n\n```html\n\u003cimg src=\"../../felix.svg\"\u003e\u003c/img\u003e\n```\n\neven better, use `{{root_url)}`:\n\n```html\n\u003cimg src=\"{{root_path}}/felix.svg\"\u003e\u003c/img\u003e\n\u003c!-- auto expands to \u003cimg src=\"../../felix.svg\"\u003e\u003c/img\u003e --\u003e\n```\n\nit's rewritten automatically \u0026 resolves to the correct root regardless of the   \npage position, so it's less error-prone than manually writing relative paths.\n\n\u003e same in markdown:\n\n```md\n[1]: {{root_url}}felix.svg\n```\n\n### root resolution in ruby\n\n\u003e in case you're extending `nix`:\n\n`root_url` is also available as a method \nwhich has the same effect:\n\n```ruby\nroot_url('felix.svg')\n# ../../felix.svg\n```\n\nmore context:\n\n```ruby\nclass CustomPage \u003c HTMLPage\n  # omitted ...\n\n  def render(ctx)\n    super + \n      \"\u003clink rel=\\\"stylesheet\\\" href=\\\"#{root_url('highlight.css')}\\\"\u003e\u003clink\u003e\"\n  end\nend\n```\n\n## Wheres the rest of it?\n\n\u003e This project is actually part of a weekly workshop I was invited to do\n\u003e in an SME. It's an actual project that you can use but it's primary purpose\n\u003e was illustrative.\n\nThe idea behind it closely mimics [wruby](https://wruby.passthejoe.net/about/),\na static-site generator that generates [sites that are under 1kb][club].\n\nWhile the whole thing looks more like a code-golfing joke than anything \nsubstantial, it's philosophy is based around serious ideas that emerged \nin MIT and Berkley around the 80s(?), regarding software architecture design. \n\nDespite their similarities, under the hood `wruby` is written entirely\nprocedurally. \n\nThere is a clear *lack* of architecture and you can more or less describe it\nas a cooking recipe.\n\nWhat I've done is take wruby and rewrite it's core ideas in \nan [Object-Oriented paradigm][oop]; in an effort to make the code more \n\"modern\" and \"extensible\"; in effect I've proved the entire point of the \nargument, the tendency to introduce unnecessary complexity on our own.\n\n`nix` is using a lot of ideas supposedly considered \"Best Practices\".\nData is moved around in a functional manner; the API is implemented in a fluent\nprose with clear hierarchical organisation into classes/types. \n\nAdditionally, there's a clear and intentional Separation of Concerns between \npersistence code and logic code; the purpose of this is to make it amerable to \nunit-testing.\n\n`wruby` has **absolutely none** of the above.  \n\nit's really just a bunch of functions glued together.   \nIt's not possible to extend it without pulling out your hair *but* nor is\nthere any indication that it's purpose was to be extensible.\n\nwruby is actually one of the few projects that I sat through \nreading it's entire source-code without getting bored or distracted, \nbecause it is just *that* simple.\n\nBoth projects are written in Ruby.\n\nBoth projects are based on material from the following essays:\n\n- [Worse is Better][worse-is-better], [Richard P. Gabriel][rpg]\n- [Is Worse Really Better?][worse-better], Richard P. Gabriel\n- [Locality of Behavior][loc], Carson Gross\n- [Chesterson's Fence: A lesson in thinking][chest-fence]\n\nFrom the Unix-Haters handbook    \n[Simson Garfinkel](https://en.wikipedia.org/wiki/Simson_Garfinkel)\n\n\u003e [...] Literature that Unix succeeded because of its technical superiority. \n\u003e This is not true. Unix was evolutionarily superior to its competitors, \n\u003e but not technically superior. Unix became a commercial success because \n\u003e it was a virus. \n\u003e Its sole evolutionary advantage was its small size, simple design, and \n\u003e resulting portability.\n\n\u003e ### From [Worse is Better vs The Right Thing][worse-is-better]  \n\u003e\n\u003e The New Jersey style of software architecture design    \n\u003e vs the MIT/Stanford approach   \n\u003e\n\u003e [Richard P. Gabriel][rpg], 1991  \n\u003e\n\u003e [... ] I and just about every designer of Common Lisp and CLOS has\n\u003e had extreme exposure to the MIT/Stanford style of design. \n\u003e The essence of this style can be captured by the phrase *The Right Thing*. \n\u003e To such a designer it is important to get all of the following characteristics \n\u003e right:\n\u003e\n\u003e #### Simplicity\n\u003e the design must be simple, both in implementation and interface. \n\u003e It is more important for the interface to be simple than the implementation.\n\u003e\n\u003e #### Correctness \n\u003e The design must be correct in all observable aspects. Incorrectness is simply \n\u003e not allowed.\n\u003e\n\u003e #### Consistency\n\u003e The design must not be inconsistent. \n\u003e A design is allowed to be slightly less simple and less complete to avoid \n\u003e inconsistency. Consistency is as important as correctness.\n\u003e\n\u003e #### Completeness\n\u003e The design must cover as many important situations as is \n\u003e practical. All reasonably expected cases must be covered. \n\u003e Simplicity is not allowed to overly reduce completeness.\n\u003e\n----\n\u003e \n\u003e [...] The **Worse is Better** philosophy is only slightly different:\n\u003e\n\u003e #### Simplicity\n\u003e The design must be simple, both in implementation and interface.  \n\u003e It is more important for the implementation to be simple than the interface. \n\u003e Simplicity is the most important consideration in a design.\n\u003e\n\u003e #### Correctness \n\u003e The design must be correct in all observable aspects. \n\u003e It is slightly better to be simple than correct.\n\u003e\n\u003e #### Consistency\n\u003e The design must not be overly inconsistent.   \n\u003e Consistency can be sacrificed for simplicity in some cases, \n\u003e but it is better to drop those parts of the design that deal with \n\u003e less common circumstances than to introduce either implementational \n\u003e complexity or inconsistency.nt as correctness.\n\u003e\n\u003e #### Completeness\n\u003e Completeness -- the design must cover as many important situations as is \n\u003e practical. All reasonably expected cases should be covered. Completeness \n\u003e can be sacrificed in favor of any other quality. In fact, compzleteness must \n\u003e be sacrificed whenever implementation simplicity is jeopardized. \n\u003e Consistency can be sacrificed to achieve completeness if simplicity is \n\u003e retained; especially worthless is consistency of interface. \n\u003e\n\u003e I have intentionally caricatured the worse-is-better philosophy to convince \n\u003e you that it is obviously a bad philosophy and that the New Jersey approach \n\u003e is a bad approach.\n\u003e\n\u003e [...] However, I believe that worse-is-better, even in its strawman form, has \n\u003e better survival characteristics than the-right-thing, and that \n\u003e the New Jersey approach when used for software is a better approach \n\u003e than the MIT approach[...]\n\n\n[nix]: https://github/com/nicholaswmin/nix\n[club]: https://1kb.club/\n[ruby]: https://franzejr.github.io/best-ruby/\n[jekyll]: https://jekyllrb.com/\n[gh-pages]: https://pages.github.com/\n[gh-actions]: https://github.com/features/actions\n[gfm]: https://github.github.com/gfm/\n[rouge]: https://github.com/rouge-ruby/rouge\n[pygments]: https://pygments.org/\n[file-rb]: https://github.com/nicholaswmin/nix/blob/main/nix.rb\n[fi-join]: https://ruby-doc.org/3.3.2/File.html#method-c-join\n[ruby]: https://ruby-doc.org/3.3.5/\n[download]: https://github.com/nicholaswmin/nix/blob/main/nix.rb\n[kiss]: https://en.wikipedia.org/wiki/KISS_principle#In_software_development\n[corr]: https://en.wikipedia.org/wiki/Correctness_(computer_science)\n[oop]: https://en.wikipedia.org/wiki/Object-oriented_programming\n[njs]: https://en.wikipedia.org/wiki/Worse_is_better\n[lob]: https://htmx.org/essays/locality-of-behaviour\n[worse-better]: https://dreamsongs.com/Files/IsWorseReallyBetter.pdf\n[worse-is-better]: https://curtsinger.cs.grinnell.edu/teaching/2021S1/CSC213/files/worse_is_better.pdf\n[rpg]: https://en.wikipedia.org/wiki/Richard_P._Gabriel\n[chest-fence]: https://fs.blog/chestertons-fence/\n[polymor]: https://en.wikipedia.org/wiki/Subtyping\n[encapsu]: https://en.wikipedia.org/wiki/Encapsulation_(computer_programming)\n\u003c!---d\n---\n# This YAML embed contains the necessary data \n# to create a sample blog site.\n# \n# When the `--init` flag is passed, it: \n#\n# - searches for this file locally, in the current working directory.\n# - if not found, it attempts to download it from the repo. (raw)\n# - It then iterates through the keys and creates a file for each.\n# - each key is a filename. The file contents are listed under each key.\n\n- _config.yml: |\n    # Site configuration\n    # note: these key/values can also be used as substitutions.\n    # i.e: {{author_name}} in a Post will be replaced with \"John Doe\"\n\n    # required\n    name: 'John Does blog'\n    description: 'a blog about rabbits'\n    favicon: 🧸\n    # must match static.yml workflow value:\n    dest: './build'\n\n    # optional\n\n    author_name: 'John Doe'\n    author_user: 'nicholaswmin'\n    author_city: 'London, W2'\n\n\n- .github/workflows/static.yml: |\n    name: Deploy static HTML to Pages\n    \n    on:\n      push:\n        branches: [$default-branch, 'refactor-b']\n    \n      # allow manual runs from the Actions tab\n      workflow_dispatch:\n    \n    permissions:\n      contents: read\n      pages: write\n      id-token: write\n    \n    concurrency:\n      group: \"pages\"\n      cancel-in-progress: false\n    \n    jobs:\n      deploy:\n        environment:\n          name: github-pages\n          url: ${{ steps.deployment.outputs.page_url }}\n        runs-on: ubuntu-latest\n        steps:\n          - name: Checkout\n            uses: actions/checkout@v4\n    \n          - name: Setup Ruby 3.3.5\n            uses: ruby/setup-ruby@v1\n            with:\n              ruby-version: '3.3.5'\n\n          - name: Setup Pages\n            uses: actions/configure-pages@v5\n    \n          - name: Fetch init site assets\n            run: ruby nix.rb -i\n            \n          - name: Compile Pages\n            run: ruby nix.rb -b\n    \n          - name: Upload artifact\n            uses: actions/upload-pages-artifact@v3\n            with:\n              # must match value of `_config.yml`:`dest`\n              path: './build'\n          - name: Deploy to GitHub Pages\n            id: deployment\n            uses: actions/deploy-pages@v4\n\n- _layouts/header.html: |\n    \u003chead\u003e\n        \u003cmeta charset=\"utf-8\"\u003e\n        \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n        \u003cmeta name=\"description\" content=\"{{description}}\"\u003e\n        \u003clink rel=\"icon\" href=\"data:image/svg+xml,\u003csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'\u003e\u003ctext x='0' y='14'\u003e{{favicon}}\u003c/text\u003e\u003c/svg\u003e\"\u003e\n        \u003clink rel=\"stylesheet\" href=\"{{root_url}}style.css\"\u003e\n        \u003ctitle\u003e{{title}}\u003c/title\u003e\n    \u003c/head\u003e \n\n    \u003cnav\u003e\n        \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"{{root_url}}\"\u003eposts\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"{{root_url}}about\"\u003ecv\u003c/a\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/nav\u003e\n\n- _layouts/footer.html: |\n    \u003cfooter\u003e\n        \u003csmall\u003e \u003e \u003ca href=\"https://1kb.club/\"\u003e{{bytes}} bytes\u003c/a\u003e \u003c/small\u003e\n    \u003c/footer\u003e\n\n- pages/index.md: |\n    hello world\n\n- pages/about.md: |\n    cv\n\n    {{author_name}}\n    [{{author_user}}][author-url]\n    {{author_city}}\n\n    - ACME Industries\n      - 2015 - now  \n      - London, United Kingdom\n\n    - Foo/Bar GmbH\n      - Dec 22' - May 23'\n      - Munich, Germany\n\n    - Ski Instructor\n        - Dec 22' - May 23'\n        - Rhône-Alpes, France\n\n    - Looney Tunes LLC\n      - Dec 16' - Nov 20'\n      - Madrid, Spain\n\n    - The Animaniacs LLC\n      - Jun 14' - Apr 15'\n      - New York, USA  \n\n    #### Schools\n\n    - University of Westminster\n      - BSc Information Systems\n      - London, UK  \n      - 2009 - 2013\n\n    [author-url]: https://github.com/{{author_user}}\n\n- pages/sample.md: |\n    ## sample\n\n    This is a sample `Page`; i.e: not a `Post`.   \n\n    It's is written in `Markdown` but doesn't support    \n    code syntax highlighting nor is it included in any Post lists.   \n\n    You can add as many as you want within this folder.    \n    Just like a `Post`, it requires an `h2` header at the top.\n\n- posts/whats-this.md: |\n    # whats this?\n\n    21-10-2021\n\n    This is a sample post, written in [github-flavored markdown][gfm].\n\n    It's generated using a minimal static-site generator, \n    called [nix][nix], which itself is ~150 lines of [ruby][ruby] code.\n\n    Here's how it renders:\n\n    This is a footnote[^1]\n\n    A horizontal ruler follows:\n\n    ---\n\n    ## This is an h2 header\n\n    ### This is an h3 header\n\n    #### This is an h4 header\n\n    ... and this is a blockquote:\n\n    \u003e A sentence should contain no unnecessary words, a paragraph no unnecessary \n    \u003e sentences, for the same reason that a drawing should have no unnecessary \n    \u003e lines and a machine no unnecessary parts. This requires not that the writer \n    \u003e make all his sentences short, or that he avoid all detail and treat his \n    \u003e subjects only in outline, but that every word tell.\n\n    From [The Elements of Style][eos], [William Strunk][ws]\n\n\n    ## Syntax highlighting\n\n    posts include syntax highlighting, via [pygments][pyg]:\n\n    Javascript\n\n    ```js\n    let fact = 1\n\n    for (i = 1; i \u003c= number; i++)\n      fact *= i\n\n    console.log(`The factorial of ${number} is ${fact}.`)\n    ```\n\n    Ruby\n\n\n    ```ruby\n    a = [:foo, 'bar', 2]\n\n    a.reverse_each do |element| \n    puts \"#{element.class} #{element}\" \n    end\n    ```\n\n    Bash\n\n    ```bash\n    #!/bin/bash\n\n    i=1\n    while [[ $i -le 10 ]] ; do\n    echo \"$i\"\n    (( i += 1 ))\n    done\n    ```\n\n    ## More\n\n    this is a list:\n\n    - Oranges\n    - Apples\n    - Peaches\n\n    ... and this is an SVG image of **Felix The Housecat**:\n\n\n    ![Felix the Housecat, the cartoon]({{root_url}}felix.svg \"Felix the Housecat\")\n\n    This project was inspired by: The [1kb club][1kb].\n\n\n    ### Footnotes\n\n\n    [^1]: Garner, Bryan A. (2009). Garner on Language and Writing: Selected Essays z\n        and Speeches of Bryan A. Garner. Chicago: American Bar Association. p. 295. \n        ISBN 978-1-60442-445-4.\n\n\n    [1kb]: https://1kb.club/\n    [bp]: https://en.wikipedia.org/wiki/Blaise_Pascal\n    [eos]: https://en.wikipedia.org/wiki/The_Elements_of_Style\n    [ws]: https://en.wikipedia.org/wiki/William_Strunk_Jr.\n    [ruby]: https://www.ruby-lang.org/en/\n    [nix]: https://github.com/nicholaswmin/nix\n    [pyg]: https://pygments.org/\n    [gfm]: https://github.github.com/gfm/\n\n- posts/another-post.md: |\n    # just another post\n\n    21-11-2020\n\n    This is another sample post, written in **Markdown**.\n\n    You can add as many as you want in this folder but ensure each post:\n\n    - has an `h1` heading at the very top\n    - has an empty line following it\n    - and a date on the 3rd line\n\n    ... just like this post.\n\n- public/style.css: |\n    :root {\n      --fonts: Menlo, monospace;\n      --font-size: 100%; --font: #555; --font-light: #777; --font-lighter: #aaa;\n      --bg: #fafafa;  --primary: #00695C; --secondary: #3700B3;\n    }\n    \n     *, *:after, *:before { box-sizing: border-box; }\n     body::selection { background: #999; }\n\n    html {\n      font-family: var(--fonts); font-size: var(--font-size);\n      -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: 100%; \n      line-height: 1.15;\n    }\n    \n    body { \n      max-width: 90ex; margin: 0 auto; \n      background: var(--bg-col); color: var(--font-col); overflow-y: scroll; \n    }\n    \n    main { padding: 0;  margin: 0 auto; }\n    nav, footer { ul { display: block; margin: 0; padding-left: 0; }\n      li { display: inline-block; margin-right: 2em; a { color: var(--font-col); } }\n      small,li {  display: inline-block; margin-top: 2em; }\n    }\n\n    /* Typebase.css (avoid changing, they keep vertical rhythm) */\n    p { line-height: 1.5rem;  margin-top: 1.5rem; margin-bottom: 0; }\n    ul, ol { margin-top: 1.5rem; margin-bottom: 1.5rem; }\n    ul li, ol li { line-height: 1.5rem; }\n    ul ul, ol ul, ul ol, ol ol { margin-top: 0;  margin-bottom: 0; }\n    blockquote { line-height: 1.5rem; margin-top: 1.5rem; margin-bottom: 1.5rem; }\n    \n    h1,h2,h3,h4,h5,h6 { margin-top: 1.5rem; margin-bottom: 0; line-height: 1.5rem; }\n    h1 { font-size: 4.2421rem; line-height: 4.5rem; margin-top: 3rem; }\n    h2 { font-size: 2.8281rem; line-height: 3.1rem; margin-top: 3rem; }\n    h3 { font-size: 1.4114rem; } h4 { font-size: 0.7071rem; }\n    h5 { font-size: 0.4713rem; } h6 { font-size: 0.3535rem; }\n    \n    table { margin-top: 1.5rem; border-spacing: 0px; border-collapse: collapse; }\n    table td, table th {  padding: 0; line-height: 33px; }\n    code { vertical-align: bottom; }\n    .lead { font-size: 1.414rem; }\n    .hug { margin-top: 0; }\n    \n    /* @nicholaswmin */\n    img { margin: 0; max-width: 100%; }\n    pre {\n      padding: 2em; border-radius: 6px; word-wrap: break-word;\n      box-shadow: 0 1px 2px rgba(0, 0, 0, 0.24); word-wrap: break-word;\n      code {  white-space: break-spaces; }\n    }\n\n- public/felix.svg: |\n    \u003csvg xmlns=\"http://www.w3.org/2000/svg\" xml:space=\"preserve\" viewBox=\"0 0 595 654\"\u003e\u003cstyle\u003e.st1{fill:#fff}\u003c/style\u003e\u003cpath id=\"Warstwa_2\" d=\"M493 481c-7-3-19-4-36 3l-35-17c99 4 208-177 128-202 0 0-23-7-40 7-26 21 4 123-89 144 0 0 8-24-15-48l55-31s1-37-2-47l-98-9s24-18 33-49c0 0 20-21 35-28 0 0-13-10-21-9l27-34c-30-27-56-75-66-145 0 0-4-5-9-1-5 3-36 44-53 48s-30-5-72 4c0 0-33-25-37-40-9-9-12 3-12 3s-3 52-8 57l-21 21-8-18s7-16 19-18l-17-33s-16 5-29 22c-13-19-26-32-36-34-2-1-7-2-12 0s-8 7-9 9c0 0-10-9-16-4-6 4-13 22-5 34 0 0-30-10-5 66 7 17 21 48 59 51l107 149 7-10c4-5 10-7 13-9 2 1 6 3 10 3h10l4 1 4 3-2 3s-9-6-17-5c-8 0-21 2-27 21 0 0-16 0-28 18-13 17-34 48-17 61s33-4 33-4 6 39 45 33c0 0-9 2 0 17l-19 16s-11-52-59-34-44 160 36 171c62 1 57-41 57-41l60-52s24 3 35-1l62 37s-33 84 56 84c5 0 21-1 33-10 42-28 33-136-8-153zM354 340l-5-14 18 1-13 13z\"/\u003e  \u003cg id=\"Warstwa_3\"\u003e    \u003cpath d=\"M158 224c2 11 7 36 26 57 11 12 23 19 33 25 9 5 14 6 18 7 8 2 15 0 27-2 6-1 98-17 113-74 0-6-1-15-7-21-10-10-32-10-51 6-7 4-18 9-31 10-7 1-27 2-39-11l-4-6-3-2-49 9-8-1s-8 9-25 3zm28-116c-7 5-17 22-24 41-8 25-10 63 4 69 4 2 11 1 20-5 10-4 12-6 20-8 7-2 8-8 8-8s15-56 13-70c-1-15-4-21-9-24-12-8-24-1-32 5z\" class=\"st1\"/\u003e\u003cpath d=\"m221 196 8-41 5-24c4-9 8-21 19-30 9-8 18-11 23-12 4-1 20-4 38 3 26 9 36 40 35 64-2 28-20 46-25 50-4 5-22 21-46 20-10-1-29-4-31-14-3-11-14-1-14-1l-14-5 2-10z\" class=\"st1\"/\u003e  \u003c/g\u003e  \u003cg id=\"Warstwa_4\"\u003e\u003cpath d=\"M188 236c-7-8-6-21-1-29 8-11 23-11 30-11 7 1 15 1 20 7 6 8 4 19 0 26-8 14-26 15-28 15-4 0-14 0-21-8z\"/\u003e\u003cpath d=\"M177 242c6 7 25 26 55 31 51 8 79-22 88-37l-5-1c-6-1-11 1-14 2-2-2 24-14 38 7 0 0-9-7-12-6 0 0-37 50-76 50s-68-32-74-38l5 11c0 1-4 7-5 3s-6-21-2-26c2-1 2 4 2 4z\"/\u003e \u003c/g\u003e \u003cg id=\"Warstwa_5\"\u003e\u003cpath d=\"M212 249s-2 1 1 6 4 8 6 7-5-14-7-13z\"/\u003e\u003cpath fill=\"none\" stroke=\"#000\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"3\" d=\"M344 220 478 82M353 221l139-115M134 227l-49-15m61 32-58-3\"/\u003e\u003c/g\u003e\u003cg id=\"Warstwa_6\"\u003e\u003cellipse cx=\"336\" cy=\"149.3\" rx=\"12\" ry=\"25.4\" transform=\"rotate(12 336 149)\"/\u003e\u003cellipse cx=\"213.3\" cy=\"154.7\" rx=\"12\" ry=\"25.4\" transform=\"rotate(12 213 155)\"/\u003e\u003c/g\u003e\u003c/svg\u003e\n\n- public/highlight.css: |\n    /*\n     * Syntax Highlighting CSS (Pygments)  \n     * Autogenerated by Rouge Gem using: \n     *\n     * puts Rouge::Themes::Github.mode(:light).render(scope: '.highlight') \n     */\n\n    .highlight table td{padding:5px}.highlight table pre{margin:0}.highlight,.highlight .w{color:#24292f;background-color:#f6f8fa}.highlight .k,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt,.highlight .kv{color:#cf222e}.highlight .gr{color:#f6f8fa}.highlight .gd{color:#82071e;background-color:#ffebe9}.highlight .nb,.highlight .nc,.highlight .nn,.highlight .no{color:#953800}.highlight .na,.highlight .nt,.highlight .sr{color:#116329}.highlight .gi{color:#116329;background-color:#dafbe1}.highlight .ges{font-weight:700;font-style:italic}.highlight .bp,.highlight .il,.highlight .kc,.highlight .l,.highlight .ld,.highlight .m,.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo,.highlight .mx,.highlight .ne,.highlight .nl,.highlight .nv,.highlight .o,.highlight .ow,.highlight .py,.highlight .sb,.highlight .vc,.highlight .vg,.highlight .vi,.highlight .vm{color:#0550ae}.highlight .gh,.highlight .gu{color:#0550ae;font-weight:700}.highlight .dl,.highlight .s,.highlight .s1,.highlight .s2,.highlight .sa,.highlight .sc,.highlight .sd,.highlight .se,.highlight .sh,.highlight .ss,.highlight .sx{color:#0a3069}.highlight .fm,.highlight .nd,.highlight .nf{color:#8250df}.highlight .err{color:#f6f8fa;background-color:#82071e}.highlight .c,.highlight .c1,.highlight .cd,.highlight .ch,.highlight .cm,.highlight .cp,.highlight .cpf,.highlight .cs,.highlight .gl,.highlight .gt{color:#6e7781}.highlight .ni,.highlight .si{color:#24292f}.highlight .ge{color:#24292f;font-style:italic}.highlight .gs{color:#24292f;font-weight:700}\n--\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnicholaswmin%2Fnix","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnicholaswmin%2Fnix","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnicholaswmin%2Fnix/lists"}