diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 00000000..6a641f4c
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,8 @@
+# ignore hidden files
+.*
+
+!.well-known/
+
+third-party/beautiful-jekyll/_posts/
+
+_site/
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..1ccee08a
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,3 @@
+# ensure dockerfiles are checked out with LF line endings
+Dockerfile text eol=lf
+*.dockerfile text eol=lf
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
deleted file mode 100644
index 15d6ccb7..00000000
--- a/.github/workflows/build.yml
+++ /dev/null
@@ -1,69 +0,0 @@
----
-name: Build
-
-on:
- pull_request:
- branches: [master]
- types: [opened, synchronize, reopened]
- push:
- branches: [master]
- workflow_dispatch:
-
-jobs:
- update:
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout
- uses: actions/checkout@v4
-
- - name: Checkout gh-pages
- uses: actions/checkout@v4
- with:
- ref: gh-pages
- path: gh-pages
- persist-credentials: false # otherwise, the token used is the GITHUB_TOKEN, instead of the personal token
- fetch-depth: 0 # otherwise, will fail to push refs to dest repo
-
- - name: Get current date
- id: date
- run: echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
-
- - name: Build website
- run: |
- # install npm dependencies
- npm install
-
- # empty contents of gh-pages
- rm -f -r ./gh-pages/*
-
- # move contents of dist to gh-pages
- # https://stackoverflow.com/a/20192079/11214013
- cp -r ./dist/. ./gh-pages/
-
- # move node_modules directory to gh-pages
- mv -f ./node_modules/ ./gh-pages/
-
- - name: Upload Artifacts
- if: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }}
- uses: actions/upload-artifact@v4
- with:
- name: gh-pages
- if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn`
- path: |
- ${{ github.workspace }}/gh-pages
- !**/*.git
-
- - name: Deploy to gh-pages
- if: >-
- (github.event_name == 'push' && github.ref == 'refs/heads/master') ||
- (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch')
- uses: actions-js/push@v1.5
- with:
- github_token: ${{ secrets.GH_BOT_TOKEN }}
- author_email: ${{ secrets.GH_BOT_EMAIL }}
- author_name: ${{ secrets.GH_BOT_NAME }}
- directory: gh-pages
- branch: gh-pages
- force: false
- message: automatic-update-${{ steps.date.outputs.date }}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 00000000..8dfee72b
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,52 @@
+---
+name: Jekyll CI
+
+on:
+ pull_request:
+ branches:
+ - master
+ types:
+ - opened
+ - synchronize
+ - reopened
+ push:
+ branches:
+ - master
+
+concurrency:
+ group: "${{ github.workflow }}-${{ github.ref }}"
+ cancel-in-progress: true
+
+jobs:
+ call-jekyll-build:
+ uses: ./.github/workflows/jekyll-build.yml
+ with:
+ target_branch: gh-pages
+ clean_gh_pages: true
+ secrets:
+ GH_BOT_EMAIL: ${{ secrets.GH_BOT_EMAIL }}
+ GH_BOT_NAME: ${{ secrets.GH_BOT_NAME }}
+ GH_BOT_TOKEN: ${{ secrets.GH_BOT_TOKEN }}
+
+ release:
+ if: github.event_name == 'push' && github.ref == 'refs/heads/master'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Setup Release
+ id: setup-release
+ uses: LizardByte/setup-release-action@v2024.919.143601
+ with:
+ github_token: ${{ secrets.GH_BOT_TOKEN }}
+
+ - name: Create Release
+ id: action
+ uses: LizardByte/create-release-action@v2024.919.143026
+ with:
+ allowUpdates: false
+ artifacts: ''
+ body: ${{ steps.setup-release.outputs.release_body }}
+ generateReleaseNotes: ${{ steps.setup-release.outputs.release_generate_release_notes }}
+ name: ${{ steps.setup-release.outputs.release_tag }}
+ prerelease: true
+ tag: ${{ steps.setup-release.outputs.release_tag }}
+ token: ${{ secrets.GH_BOT_TOKEN }}
diff --git a/.github/workflows/jekyll-build.yml b/.github/workflows/jekyll-build.yml
new file mode 100644
index 00000000..709db11f
--- /dev/null
+++ b/.github/workflows/jekyll-build.yml
@@ -0,0 +1,241 @@
+---
+name: Build Jekyll
+
+on:
+ workflow_call:
+ inputs:
+ site_artifact:
+ description: 'Artifact name to download'
+ required: false
+ default: ''
+ type: string
+ extract_archive:
+ description: |
+ Name of nested archive to extract. In some cases you may want to upload a zip of files to reduce
+ upload size and time. If you do this, you must specify the name of the archive to extract.
+ required: false
+ default: ''
+ type: string
+ config_file:
+ description: 'Configuration file to use, relative to the site source directory'
+ required: false
+ default: '_config.yml'
+ type: string
+ target_branch:
+ description: 'Branch to deploy to. Branch must already exist.'
+ required: false
+ default: 'gh-pages'
+ type: string
+ clean_gh_pages:
+ description: 'Clean gh-pages before deploying'
+ required: false
+ default: true
+ type: boolean
+ theme_ref:
+ description: 'Branch, tag, or commit SHA of the theme repository to use'
+ required: false
+ default: 'master'
+ type: string
+ secrets:
+ GH_BOT_EMAIL:
+ description: 'Email address of the bot account'
+ required: true
+ GH_BOT_NAME:
+ description: 'Name of the bot account'
+ required: true
+ GH_BOT_TOKEN:
+ description: 'Personal access token of the bot account'
+ required: true
+
+jobs:
+ build:
+ name: Build Jekyll
+ runs-on: ubuntu-latest
+ steps:
+ - name: Input validation
+ run: |
+ error=false
+ if [ "${{ inputs.site_artifact }}" == 'site' ]; then
+ echo "Artifact name cannot be 'site'"
+ error=true
+ fi
+
+ if [ "$error" = true ]; then
+ exit 1
+ fi
+
+ - name: Checkout theme
+ uses: actions/checkout@v4
+ with:
+ repository: LizardByte/LizardByte.github.io
+ ref: ${{ github.repository == 'LizardByte/LizardByte.github.io' && github.ref || inputs.theme_ref }}
+ submodules: recursive
+ path: theme
+
+ - name: Download input artifact
+ if: ${{ inputs.site_artifact != '' }}
+ uses: actions/download-artifact@v4
+ with:
+ name: ${{ inputs.site_artifact }}
+ path: project
+
+ - name: Extract archive
+ if: ${{ inputs.site_artifact != '' && inputs.extract_archive != '' }}
+ working-directory: project
+ run: |
+ case "${{ inputs.extract_archive }}" in
+ *.tar.gz|*.tgz)
+ tar -xzf ${{ inputs.extract_archive }} -C .
+ ;;
+ *.tar)
+ tar -xf ${{ inputs.extract_archive }} -C .
+ ;;
+ *.zip)
+ unzip ${{ inputs.extract_archive }} -d .
+ ;;
+ *)
+ echo "Unsupported archive format"
+ exit 1
+ ;;
+ esac
+ rm -f ${{ inputs.extract_archive }}
+
+ - name: Setup project
+ if: ${{ github.repository == 'LizardByte/LizardByte.github.io' }}
+ run: |
+ mkdir -p ./project
+ cp -RT ./theme/ ./project/
+ rm -rf ./project/third-party
+
+ - name: Create site
+ env:
+ TMPDIR: /home/runner/work/tmp
+ run: |
+ mkdir -p ${TMPDIR}
+
+ base_dirs=(
+ ./theme/third-party/beautiful-jekyll
+ ./theme
+ )
+
+ targets=(
+ *.gemspec
+ _data
+ _includes
+ _layouts
+ _sass
+ assets
+ 404.html
+ _config_theme.yml
+ favicon.ico
+ feed.xml
+ Gemfile
+ staticman.yml
+ tags.html
+ )
+
+ for base_dir in "${base_dirs[@]}"; do
+ for target in "${targets[@]}"; do
+ if [ -e "$base_dir/$target" ]; then
+ cp -rf "$base_dir/$target" ${TMPDIR}/
+ fi
+ done
+ done
+
+ # copy project directory, they should only come from the project repo
+ cp -RTf ./project/ ${TMPDIR}/
+
+ # remove the workspace
+ cd ..
+ rm -rf ${GITHUB_WORKSPACE}
+
+ # move the temporary directory to the workspace
+ mv ${TMPDIR} ${GITHUB_WORKSPACE}
+ cd ${GITHUB_WORKSPACE}
+
+ # debug contents recursively
+ ls -Ra
+
+ - name: Setup Ruby
+ uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: '3.3'
+
+ - name: Install dependencies
+ run: |
+ bundle install
+
+ - name: Setup Pages
+ id: configure-pages
+ uses: actions/configure-pages@v5
+
+ - name: Setup CI config
+ run: |
+ echo "---" > _config_ci.yml
+ echo "baseurl: ${{ steps.configure-pages.outputs.base_path }}" >> _config_ci.yml
+
+ - name: Build site
+ env:
+ JEKYLL_ENV: production
+ PAGES_REPO_NWO: ${{ github.repository }}
+ run: |
+ # if inputs.config_file exists
+ config_files="_config_ci.yml,_config_theme.yml"
+ if [ -e "${{ inputs.config_file }}" ]; then
+ config_files="${config_files},${{ inputs.config_file }}"
+ fi
+
+ bundle exec jekyll build --future --config ${config_files}
+
+ - name: Upload artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: site
+ path: _site
+ if-no-files-found: error
+ include-hidden-files: true
+ retention-days: 1
+
+ deploy:
+ name: Deploy to Pages
+ if: >-
+ (github.event_name == 'push' && github.ref == 'refs/heads/master') ||
+ (github.event_name == 'schedule') ||
+ (github.event_name == 'workflow_dispatch')
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - name: Checkout gh-pages
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ inputs.target_branch }}
+ path: gh-pages
+ persist-credentials: false # otherwise, the token used is the GITHUB_TOKEN, instead of the personal token
+ fetch-depth: 0 # otherwise, will fail to push refs to dest repo
+
+ - name: Clean
+ if: ${{ inputs.clean_gh_pages }}
+ run: |
+ # empty contents of gh-pages
+ rm -f -r ./gh-pages/*
+
+ - name: Download artifact
+ uses: actions/download-artifact@v4
+ with:
+ name: site
+ path: gh-pages
+
+ - name: no-jekyll
+ run: |
+ touch gh-pages/.nojekyll
+
+ - name: Deploy to gh-pages
+ uses: actions-js/push@v1.5
+ with:
+ github_token: ${{ secrets.GH_BOT_TOKEN }}
+ author_email: ${{ secrets.GH_BOT_EMAIL }}
+ author_name: ${{ secrets.GH_BOT_NAME }}
+ directory: gh-pages
+ branch: ${{ inputs.target_branch }}
+ force: false
+ message: "Deploy site from ${{ github.sha }}"
diff --git a/.gitignore b/.gitignore
index d0b384d7..13d96668 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,4 @@
# ignore JetBrains project
.idea/
-# ignore node modules
-node_modules/
-package-lock.json
-
-# ignore duplicated dist folder for localization
-dist/en
-dist/es-ES
+_site/
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 00000000..0c0b227e
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,4 @@
+[submodule "third-party/beautiful-jekyll"]
+ path = third-party/beautiful-jekyll
+ url = https://github.com/ReenigneArcher/beautiful-jekyll.git
+ branch = master
diff --git a/.run/Dockerfile.run.xml b/.run/Dockerfile.run.xml
new file mode 100644
index 00000000..13619107
--- /dev/null
+++ b/.run/Dockerfile.run.xml
@@ -0,0 +1,20 @@
+
There's nothing here.
++ The one who knows all the answers has not been asked all the questions. + – Confucius. +
+All of our projects are open source.
-Free to use software.
-- We are community oriented and our projects are driven by the community.
-We are committed to improving our products.
-Check out our most popular projects!
-- The one who knows all the answers has not been asked all the questions. - – Confucius. -
-It is LizardByte's policy to respect your privacy regarding any information we may collect while - operating our website. This Privacy Policy applies to - https://app.lizardbyte.dev - (hereinafter, "us", "we", or "https://app.lizardbyte.dev"). We respect your privacy and are - committed to protecting personally identifiable information you may provide us through the - Website. We have adopted this privacy policy ("Privacy Policy") to explain what information may - be collected on our Website, how we use this information, and under what circumstances we may - disclose the information to third parties. This Privacy Policy applies only to information we - collect through the Website and does not apply to our collection of information from other - sources.
-This Privacy Policy, together with the Terms of service posted on our Website, set forth the - general rules and policies governing your use of our Website. Depending on your activities when - visiting our Website, you may be required to agree to additional terms of service.
-Like most website operators, LizardByte collects non-personally-identifying information of the - sort that web browsers and servers typically make available, such as the browser type, language - , referring site, and the date and time of each visitor request. LizardByte's purpose in - collecting non-personally identifying information is to better understand how LizardByte's - visitors use its website. From time to time, LizardByte may release non-personally-identifying - information in the aggregate, e.g., by publishing a report on trends in the usage of its - website.
-LizardByte also collects potentially personally-identifying information like Internet Protocol - (IP) addresses for logged in users and for users leaving comments on https://app.lizardbyte.dev - blog posts. LizardByte only discloses logged in user and commenter IP addresses under the same - circumstances that it uses and discloses personally-identifying information as described - below.
-The security of your Personal Information is important to us, but remember that no method of - transmission over the Internet, or method of electronic storage is 100% secure. While we strive - to use commercially acceptable means to protect your Personal Information, we cannot guarantee - its absolute security.
-Ads appearing on our website may be delivered to users by advertising partners, who may set - cookies. These cookies allow the ad server to recognize your computer each time they send you - an online advertisement to compile information about you or others who use your computer. This - information allows ad networks to, among other things, deliver targeted advertisements that - they believe will be of most interest to you. This Privacy Policy covers the use of cookies by - LizardByte and does not cover the use of cookies by any advertisers.
-Our Service may contain links to external sites that are not operated by us. If you click on a - third party link, you will be directed to that third party's site. We strongly advise you to - review the Privacy Policy and terms of service of every site you visit.
-We have no control over, and assume no responsibility for the content, privacy policies or - practices of any third party sites, products or services.
-LizardByte may collect statistics about the behavior of visitors to its website. LizardByte may - display this information publicly or provide it to others. However, LizardByte does not - disclose your personally-identifying information.
-To enrich and perfect your online experience, LizardByte uses "Cookies", similar technologies - and services provided by others to display personalized content, appropriate advertising and - store your preferences on your computer.
-A cookie is a string of information that a website stores on a visitor's computer, and that the - visitor's browser provides to the website each time the visitor returns. LizardByte uses - cookies to help LizardByte identify and track visitors, their usage of - https://app.lizardbyte.dev, and their website access preferences. LizardByte visitors who do - not wish to have cookies placed on their computers should set their browsers to refuse cookies - before using LizardByte's websites, with the drawback that certain features of LizardByte's - websites may not function properly without the aid of cookies.
-By continuing to navigate our website without changing your cookie settings, you hereby - acknowledge and agree to LizardByte's use of cookies.
-Although most changes are likely to be minor, LizardByte may change its Privacy Policy from time - to time, and in LizardByte's sole discretion. LizardByte encourages visitors to frequently - check this page for any changes to its Privacy Policy. Your continued use of this site after - any change in this Privacy Policy will constitute your acceptance of such change.
-First, read the documentation!
-- Select projects have the documentation hosted on Read the Docs. - Look for the icon paper on the project cards at our home page. -
-- - Type: Documentation - -
-Ask questions
-- This is our preferred method of providing support! - Please read the rules, be courteous, and use the appropriate channel - when posting. -
-- - Type: Primary Support - -
-- GitHub Discussions are available for support, feature requests, and general discourse. - Please DO NOT use GitHub issues to ask for support! -
-- - Type: Primary Support - -
-- For aliens only! Please read the rules, be courteous, and use the appropriate - flair when posting. Provide your logs when asking for help. -
-- - Type: Community Support - -
-These terms of service outline the rules and regulations for the use of LizardByte's Website.
-By accessing this website we assume you accept these terms of service in full. Do not continue to - use LizardByte's website if you do not accept all the terms of service stated on this page.
-The following terminology applies to these Terms of Service, Privacy Statement and Disclaimer Notice - and any or all Agreements: "Client", "You" and "Your" refers to you, the person accessing this - website and accepting the Company's terms of service. "The Company", "Ourselves", "We", "Our" and - "Us", refers to our Company. "Party", "Parties", or "Us", refers to both the Client and ourselves, - or either the Client or ourselves. All terms refer to the offer, acceptance and consideration of - payment necessary to undertake the process of our assistance to the Client in the most appropriate - manner, whether by formal meetings of a fixed duration, or any other means, for the express purpose - of meeting the Client's needs in respect of provision of the Company's stated services/products, in - accordance with and subject to, prevailing law of . Any use of the above terminology or other words - in the singular, plural, capitalisation and/or he/she or they, are taken as interchangeable and - therefore as referring to same.
-We employ the use of cookies. By using LizardByte's website you consent to the use of cookies - in accordance with LizardByte's privacy policy.
-Most of the modern day interactive websites use cookies to enable us to retrieve user details for - each visit. Cookies are used in some areas of our site to enable the functionality of this area and - ease of use for those people visiting. Some of our affiliate / advertising partners may also use - cookies.
-Unless otherwise stated, LizardByte and/or it's licensors own the intellectual property rights for - all material on LizardByte. All intellectual property rights are reserved. You may view and/or print - pages from https://app.lizardbyte.dev for your own personal use subject to restrictions set in these - terms of service.
-You must not:
-Redistribute content from LizardByte (unless content is specifically made for redistribution).
-Without prior approval and express written permission, you may not create frames around our Web - pages or use other techniques that alter in any way the visual presentation or appearance of our - Website.
-We reserve the right at any time and in its sole discretion to request that you remove all links or - any particular link to our Website. You agree to immediately remove all links to our Website upon - such request. We also reserve the right to amend these terms of service and its linking policy at - any time. By continuing to link to our Website, you agree to be bound to and abide by these - linking terms of service.
-If you find any link on our Website or any linked website objectionable for any reason, you may - contact us about this. We will consider requests to remove links but will have no obligation to do - so or to respond directly to you.
-Whilst we endeavour to ensure that the information on this website is correct, we do not warrant its - completeness or accuracy; nor do we commit to ensuring that the website remains available or that - the material on the website is kept up to date.
-We shall have no responsibility or liability for any content appearing on your Website. You agree - to indemnify and defend us against all claims arising out of or based upon your Website. No link(s) - may appear on any page on your Website or within any context containing content or materials that - may be interpreted as libelous, obscene or criminal, or which infringes, otherwise violates, or - advocates the infringement or other violation of, any third party rights.
-To the maximum extent permitted by applicable law, we exclude all representations, warranties and - conditions relating to our website and the use of this website (including, without limitation, any - warranties implied by law in respect of satisfactory quality, fitness for purpose and/or the use of - reasonable care and skill). Nothing in this disclaimer will:
-The limitations and exclusions of liability set out in this Section and elsewhere in this - disclaimer: (a) are subject to the preceding paragraph; and (b) govern all liabilities arising - under the disclaimer or in relation to the subject matter of this disclaimer, including liabilities - arising in contract, in tort (including negligence) and for breach of statutory duty.
-To the extent that the website and the information and services on the website are provided free of - charge, we will not be liable for any loss or damage of any nature.
-All of our projects are open source.
+Free to use software.
++ We are community oriented and our projects are driven by the community.
+We are committed to improving our products.
+Check out our most popular projects!
+First, read the documentation!
++ Select projects have the documentation hosted on Read the Docs. + Look for the paper icon on the project cards at our home page. +
++ + Type: Documentation + +
+Ask questions
++ This is our preferred method of providing support! + Please read the rules, be courteous, and use the appropriate channel + when posting. +
++ + Type: Primary Support + +
++ GitHub Discussions are available for support, feature requests, and general discourse. + Please DO NOT use GitHub issues to ask for support! +
++ + Type: Primary Support + +
++ For aliens only! Please read the rules, be courteous, and use the appropriate + flair when posting. Provide your logs when asking for help. +
++ + Type: Community Support + +
+