Compare commits

...

54 Commits

Author SHA1 Message Date
75c7f6052c Merge pull request 'Automatic flake update - 2024-07-15T00:00+00:00' (#88) from flake-update-2024-07-15 into main
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-07-15 00:00:55 +00:00
Clan Merge Bot
2834c998f2 update flake lock - 2024-07-15T00:00+00:00
All checks were successful
check / test (pull_request) Successful in 14s
buildbot/nix-eval Build done.
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/9f4128e00b0ae8ec65918efeba59db998750ead6' (2024-07-03)
  → 'github:NixOS/nixpkgs/7e7c39ea35c5cdd002cd4588b03a3fb9ece6fad9' (2024-07-12)
2024-07-15 00:00:17 +00:00
42a4bd5068 add clan svg files
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-07-09 11:50:57 +02:00
c225dc56b1 add colon after bold text
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 15s
deploy / test (push) Successful in 16s
2024-07-08 21:12:51 +02:00
7910e332be cherry picked changes from Valentin Gagarin part 3
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-07-08 21:11:57 +02:00
d72a88cd3a cherry picked changes from Valentin Gagarin part 2
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-07-08 21:07:46 +02:00
46b4c704ac cherry picked changes from Valentin Gagarin
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 13s
deploy / test (push) Successful in 16s
2024-07-08 15:35:33 +02:00
3461ee83e0 Merge pull request 'make hacker effect accessible' (#82) from fricklerhandwerk/clan-homepage:accessibility into main
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
Reviewed-on: #82
2024-07-08 13:30:40 +00:00
6591d73f7c make hacker effect accessible
the plain word doesn't make any sense if JavaScript is disabled. the
additional effect still works even if the original word is what it's
supposed to be.
2024-07-08 13:30:40 +00:00
345216fcb4 Merge pull request 'update capitalisation in logo' (#79) from fricklerhandwerk/clan-homepage:main into main
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
Reviewed-on: #79
2024-07-08 13:14:15 +00:00
b410b826f4 update capitalisation in logo 2024-07-08 13:14:15 +00:00
0c3192e3cc Merge pull request 'Automatic flake update - 2024-07-08T00:00+00:00' (#85) from flake-update-2024-07-08 into main
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 14s
2024-07-08 00:01:19 +00:00
Clan Merge Bot
7bc0506669 update flake lock - 2024-07-08T00:00+00:00
All checks were successful
buildbot/nix-eval Build done.
check / test (pull_request) Successful in 52s
Flake lock file updates:

• Updated input 'flake-parts':
    'github:hercules-ci/flake-parts/c3c5ecc05edc7dafba779c6c1a61cd08ac6583e9' (2024-06-30)
  → 'github:hercules-ci/flake-parts/9227223f6d922fee3c7b190b2cc238a99527bbb7' (2024-07-03)
• Updated input 'flake-parts/nixpkgs-lib':
    'eb9ceca17d.tar.gz?narHash=sha256-lIbdfCsf8LMFloheeE6N31%2BBMIeixqyQWbSr2vk79EQ%3D' (2024-06-01)
  → '5daf051448.tar.gz?narHash=sha256-Fm2rDDs86sHy0/1jxTOKB1118Q0O3Uc7EC0iXvXKpbI%3D' (2024-07-01)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/b2852eb9365c6de48ffb0dc2c9562591f652242a' (2024-06-27)
  → 'github:NixOS/nixpkgs/9f4128e00b0ae8ec65918efeba59db998750ead6' (2024-07-03)
2024-07-08 00:00:19 +00:00
320090825e Merge pull request 'Automatic flake update - 2024-07-01T00:00+00:00' (#78) from flake-update-2024-07-01 into main
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-07-01 00:00:40 +00:00
Clan Merge Bot
4f8ac7b388 update flake lock - 2024-07-01T00:00+00:00
All checks were successful
buildbot/nix-eval Build done.
check / test (pull_request) Successful in 14s
Flake lock file updates:

• Updated input 'flake-parts':
    'github:hercules-ci/flake-parts/2a55567fcf15b1b1c7ed712a2c6fadaec7412ea8' (2024-06-01)
  → 'github:hercules-ci/flake-parts/c3c5ecc05edc7dafba779c6c1a61cd08ac6583e9' (2024-06-30)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/a71e967ef3694799d0c418c98332f7ff4cc5f6af' (2024-06-22)
  → 'github:NixOS/nixpkgs/b2852eb9365c6de48ffb0dc2c9562591f652242a' (2024-06-27)
2024-07-01 00:00:16 +00:00
e1f2de68e7 Rephrase automatic backups
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-06-24 19:37:45 +02:00
1d63446790 Merge pull request 'Automatic flake update - 2024-06-24T00:00+00:00' (#77) from flake-update-2024-06-24 into main
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-06-24 00:00:44 +00:00
Clan Merge Bot
a07ddfbf2f update flake lock - 2024-06-24T00:00+00:00
All checks were successful
buildbot/nix-eval Build done.
check / test (pull_request) Successful in 15s
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/e9ee548d90ff586a6471b4ae80ae9cfcbceb3420' (2024-06-13)
  → 'github:NixOS/nixpkgs/a71e967ef3694799d0c418c98332f7ff4cc5f6af' (2024-06-22)
2024-06-24 00:00:16 +00:00
16bdafca40 Merge pull request 'Automatic flake update - 2024-06-17T00:00+00:00' (#76) from flake-update-2024-06-17 into main
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 13s
deploy / test (push) Successful in 15s
2024-06-17 00:01:15 +00:00
Clan Merge Bot
3697903c34 update flake lock - 2024-06-17T00:00+00:00
All checks were successful
check / test (pull_request) Successful in 14s
buildbot/nix-eval Build done.
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/051f920625ab5aabe37c920346e3e69d7d34400e' (2024-06-07)
  → 'github:NixOS/nixpkgs/e9ee548d90ff586a6471b4ae80ae9cfcbceb3420' (2024-06-13)
2024-06-17 00:00:20 +00:00
2a698087f6 Improve visuals
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-06-13 17:17:21 +02:00
4e1b44f747 Add Automated Backups point
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-06-13 17:00:02 +02:00
632f20ac4e Add what is clan subpage
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 21s
deploy / test (push) Successful in 23s
2024-06-13 14:10:17 +02:00
9a6bfc5d22 Merge pull request 'Automatic flake update - 2024-06-10T00:00+00:00' (#75) from flake-update-2024-06-10 into main
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 14s
2024-06-10 00:00:42 +00:00
Clan Merge Bot
f3c172be99 update flake lock - 2024-06-10T00:00+00:00
All checks were successful
buildbot/nix-eval Build done.
check / test (pull_request) Successful in 14s
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/ad57eef4ef0659193044870c731987a6df5cf56b' (2024-05-29)
  → 'github:NixOS/nixpkgs/051f920625ab5aabe37c920346e3e69d7d34400e' (2024-06-07)
2024-06-10 00:00:18 +00:00
344e9113a3 Merge pull request 'Automatic flake update - 2024-06-03T00:00+00:00' (#74) from flake-update-2024-06-03 into main
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-06-03 00:00:49 +00:00
Clan Merge Bot
b3eec10902 update flake lock - 2024-06-03T00:00+00:00
All checks were successful
check / test (pull_request) Successful in 16s
buildbot/nix-eval Build done.
Flake lock file updates:

• Updated input 'flake-parts':
    'github:hercules-ci/flake-parts/8dc45382d5206bd292f9c2768b8058a8fd8311d9' (2024-05-16)
  → 'github:hercules-ci/flake-parts/2a55567fcf15b1b1c7ed712a2c6fadaec7412ea8' (2024-06-01)
• Updated input 'flake-parts/nixpkgs-lib':
    '50eb7ecf4c.tar.gz?narHash=sha256-QBx10%2Bk6JWz6u7VsohfSw8g8hjdBZEf8CFzXH1/1Z94%3D' (2024-05-02)
  → 'eb9ceca17d.tar.gz?narHash=sha256-lIbdfCsf8LMFloheeE6N31%2BBMIeixqyQWbSr2vk79EQ%3D' (2024-06-01)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/bfb7a882678e518398ce9a31a881538679f6f092' (2024-05-24)
  → 'github:NixOS/nixpkgs/ad57eef4ef0659193044870c731987a6df5cf56b' (2024-05-29)
2024-06-03 00:00:20 +00:00
1c99e0a7c5 Fix text 'darknet' jittering on small devices
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-05-31 15:40:46 +02:00
0ca52e8adc Incorporate feedback from catsnacks.
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-05-31 15:16:51 +02:00
ef130a6754 Merge pull request 'Automatic flake update - 2024-05-27T00:00+00:00' (#73) from flake-update-2024-05-27 into main
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 13s
deploy / test (push) Successful in 15s
2024-05-27 00:00:38 +00:00
Clan Merge Bot
8b42e462de update flake lock - 2024-05-27T00:00+00:00
All checks were successful
buildbot/nix-eval Build done.
check / test (pull_request) Successful in 14s
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/4a6b83b05df1a8bd7d99095ec4b4d271f2956b64' (2024-05-17)
  → 'github:NixOS/nixpkgs/bfb7a882678e518398ce9a31a881538679f6f092' (2024-05-24)
2024-05-27 00:00:16 +00:00
56f8bcefbd Readd green color to DARKENT
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-05-25 14:26:32 +02:00
DavHau
28a205c5d4 add davhau.jpg
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-05-24 18:25:46 +02:00
e23455d0e2 update qubasa.png
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-05-24 18:11:52 +02:00
DavHau
7d84d58da6 add nginx-gui.jpg
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-05-24 18:11:19 +02:00
49b000d6f5 font size in header changed
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-05-24 17:42:05 +02:00
4b756455f4 Improve header font size
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-05-24 17:28:58 +02:00
e4e80462c4 Add profile pictures
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-05-24 14:57:33 +02:00
c383344de9 Fix missing import
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-05-23 15:49:41 +02:00
59c43cb228 Add js animation
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 15s
deploy / test (push) Successful in 16s
2024-05-23 15:48:33 +02:00
a27a032351 Add header bar. Minimize page size by 60%
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-05-23 14:43:41 +02:00
533ef06eba Add favicon. Replace mesh_vpn image
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-05-22 23:24:00 +02:00
0c302009b6 Fix incorrect static path
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 14s
2024-05-22 23:05:54 +02:00
f9f540e90b Merge pull request 'redesign' (#72) from redesign into main
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
Reviewed-on: #72
2024-05-22 21:01:05 +00:00
0a294e5be4 Finished first draft 2024-05-22 21:01:05 +00:00
01668704ad Added second bullet point 2024-05-22 21:01:05 +00:00
9330c4cfca Added first bullet point 2024-05-22 21:01:05 +00:00
f457cabdc9 Replace zola with plain html5 2024-05-22 21:01:05 +00:00
04a734cf00 Merge pull request 'Automatic flake update - 2024-05-20T00:00+00:00' (#71) from flake-update-2024-05-20 into main
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 15s
deploy / test (push) Successful in 16s
2024-05-20 00:00:48 +00:00
Clan Merge Bot
6fbd1efc2b update flake lock - 2024-05-20T00:00+00:00
All checks were successful
buildbot/nix-eval Build done.
check / test (pull_request) Successful in 14s
Flake lock file updates:

• Updated input 'flake-parts':
    'github:hercules-ci/flake-parts/e5d10a24b66c3ea8f150e47dfdb0416ab7c3390e' (2024-05-02)
  → 'github:hercules-ci/flake-parts/8dc45382d5206bd292f9c2768b8058a8fd8311d9' (2024-05-16)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/062ca2a9370a27a35c524dc82d540e6e9824b652' (2024-05-11)
  → 'github:NixOS/nixpkgs/4a6b83b05df1a8bd7d99095ec4b4d271f2956b64' (2024-05-17)
2024-05-20 00:00:17 +00:00
16c9f65476 Removed old content. Fix matrix link
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-05-15 23:15:40 +02:00
a1def4000c Merge pull request 'Automatic flake update - 2024-05-13T00:00+00:00' (#70) from flake-update-2024-05-13 into main
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 15s
2024-05-13 00:01:41 +00:00
Clan Merge Bot
65c2cb4099 update flake lock - 2024-05-13T00:00+00:00
All checks were successful
check / test (pull_request) Successful in 14s
buildbot/nix-eval Build done.
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/25865a40d14b3f9cf19f19b924e2ab4069b09588' (2024-05-05)
  → 'github:NixOS/nixpkgs/062ca2a9370a27a35c524dc82d540e6e9824b652' (2024-05-11)
2024-05-13 00:00:20 +00:00
2124515ebb Merge pull request 'Automatic flake update - 2024-05-06T00:00+00:00' (#69) from flake-update-2024-05-06 into main
All checks were successful
buildbot/nix-eval Build done.
check / test (push) Successful in 14s
deploy / test (push) Successful in 16s
2024-05-06 00:00:46 +00:00
379 changed files with 19084 additions and 86081 deletions

1
.gitignore vendored
View File

@ -1,4 +1,5 @@
/public
.vscode
.direnv
result*
.pre-commit-config.yaml

View File

@ -1,27 +1,13 @@
# Getting start with the repo
This is the source for the homepage.
We use [zola](https://www.getzola.org/) for building a static website.
## Build the homepage
This will build the website including pages defined in the clan-core repo under `/docs`:
```command
$ nix build
```
This is the source for the Clan homepage.
## Start a local webserver
This server will include all the pages from clan-core, but doesn't automatically refresh. Also make sure to wipe your browsers cache after each change.
```command
$ nix run .#serve
```
## zola build & serve
Alternatively `zola build` and `zola serve` can be used for development but the result will be missing the pages defined in the clan-core repo.
## Contributing
Send changes to https://git.clan.lol/clan/clan-homepage
@ -31,10 +17,3 @@ Send changes to https://git.clan.lol/clan/clan-homepage
```
$ nix run .#deploy
```
## Create a new post
```
$ nix run .#new-post "September Changelog"
```

View File

@ -1,55 +0,0 @@
+++
title = "Build your own"
# The homepage contents
[extra]
lead = '<img src="/logo/clan-dark.png" class="clogo" width="100px" height="100px" alt="Clan logo"></img> <br><b>Clan</b> envisions a new model for a decentralized network, designed to provide families, smaller groups, and small businesses a private, secure, and user-friendly computing platform. '
url = "/docs/thevision/"
url_button = "Learn more"
repo_version = "Clan v0.0.0-alpha"
repo_license = "Open-source MIT License."
repo_url = "https://git.clan.lol/clan/"
# Menu items
[[extra.menu.main]]
name = "Vision"
section = "vision"
url = "/vision"
weight = 10
[[extra.menu.main]]
name = "Architecture"
section = "srchitecture"
url = "/architecture"
weight = 10
[[extra.menu.main]]
name = "Documentation"
section = "docs"
url = "/docs"
weight = 10
[[extra.menu.main]]
name = "Contributing"
section = "contributing"
url = "/contributing"
weight = 10
[[extra.menu.main]]
name = "Blog"
section = "blog"
url = "/blog"
weight = 20
[[extra.list]]
title = "Easy to use"
content = 'Clan provides a user-friendly interface that allows you to establish your own private network, complete with services.'
[[extra.list]]
title = "Open-source"
content = 'All code for Clan is freely available and open-source.'
[[extra.list]]
title = "Decentralized"
content = "The design of Clan enables the distribution of your applications/services across several machines. This increases the resilience of the network, ensuring continued operation even if some computers become unavailable."
+++

View File

@ -1,274 +0,0 @@
+++
title = "Architecture"
description = "Overview of Clan's architecture, components and security"
date = 2021-05-01T18:10:00+00:00
updated = 2021-07-13T18:10:00+00:00
draft = false
weight = 410
sort_by = "weight"
template = "section.html"
[extra]
lead = "Overview of Clan's architecture, components and security"
toc = true
section = "architecture"
+++
### Clan
Clan envisions a new model for a decentralized network, designed to provide families, smaller groups, and small businesses a private, secure, and user-friendly computing platform. The system transcends the conventional reliance on centralized services, allowing for direct, end-to-end encrypted communication among users. Rooted in open-source software, Clan ensures no vendor lock-in, and introduces robust features including:
- Remote management
- Backup functionality
- A user-friendly app store
- Fleet management for small businesses.
### Decentralized Network Model
Clan incorporates a decentralized network model to tackle the challenges posed by restrictive firewalls, NAT, and the scarcity of the IPv4 address space. By leveraging end-to-end encryption, the model ensures that all peers within the network are fully connected, allowing direct communication.
This is achieved by setting up decentralized virtual private network (VPN). A decentralized VPN is a system that uses multiple servers spread across different locations to create a secure, private network within an organization, enabling secure communication and data transfer without relying on a central server. The VPN serves as an added layer of security, shielding internal services from exposure to the open internet.
This network model uses a decentralized method, similar to a phonebook, to translate website names into addresses that computers understand (i.e. using mDNS), which helps improve how users interact with the network. Looking forward, for businesses, we plan to include rules for determining who can access which parts of the network, depending on their role.
<!--
We will not add this to the initial prototype...
### On-boarding and communication
* Motivation: To help on-boarding new people to a group or to communicate within the group, the network needs some form of a communication channel.
* Members of the group have different roles (admins, moderators)
* Chat-ops: Bots help administrating the network, i.e. allow new peers, deploy to new applications to nodes, query health status of services, alerting/monitoring
* For new users we also need a way to expose the chat outside of network to help them joining the network
* For now we plan to use the Matrix protocol which gives us the following advantages:
* End-to-end decryption and authentication
* Decentralized rooms (multiple servers)
* Good client support for many platforms
* Installation
-->
### NixOS as the Operating System
Maintaining and configuring a decentralized system like Clan with heterogeneous services on heterogeneous platforms is a challenging task. In professional setups this is usually solved with configuration management systems. These systems require years of experience and are therefore not approchable by non-expert users. The solution to this problem so far is to instead provide end-users with appliances that are massivly locked-down in terms of the functionality or platforms they support. To overcome these limitations, we Clan is based on NixOS.
NixOS is an operating system that uses a single declarative and consistent configuration to describe the whole system, using a purpose-built programming language called the Nix language. While the Nix language itself is not necessarily more accessible to non-experts, we believe it's still the best fit for the task. The underlying data structures used by NixOS are simple enough to be managed from a graphical user interface.
NixOS offers many advantages over more traditional operating system distributions:
* NixOS allows for full customization and control over of any system it is applied to, regardless of complexity and size. The Nix language allows defining the configuration of software services running on those machines in small, human-readable small called "NixOS modules". On NixOS, once set up the right way. software appears as if out of thin air, correctly configured the way you intended, each and every time, on any compatible device.
* Because NixOS declarative, unlike other many configuration management systems, different modules can be shared, composed arbitrarily, and applied in any order.
* NixOS provides atomic updates and rollbacks in case an update fails. This is especially important in distributed setup, where the adminstrator does not necessarily has physical access to the computers that require updates. We would like to extend these capabilities with automatic rollbacks to make it easier to recover from a misconfiguration.
* A user can join one or multiple networks. We use virtual machines (VMs) or containers to keep these networks separate. A virtual machine is a software-based imitation of a physical computer. It runs its own operating system, independent of the host machine's, allowing multiple virtual machines with different configurations to run simultaneously on one physical device. Virtual machines are often used for software testing, running outdated applications, and isolating potential security threats. Applications inside of virtual machines for users are preconfigured for services offered by the network
- NixOS encodes the past 50 years of operating system development and best practices, collected by legions of contributors. Sharing of esoteric system administration knowledge, previously inaccessible and fragmented across industry experts, has been made easy due to this work.
NixOS is based on Nixpkgs, a collection of recipes for reliably building and sharing a large portion of the free and open source software in existence. These programs are compiled from source, which means they can be locally modified as needed. These build instructions are written in the Nix language.
From the perspective of the user, software and systems that once required years of experience to provision, can now be boiled down to a single, short Nix expression. In many cases, this amounts to a single line of code.
### Self-hosted backup and restore
Clan enables users to easily self-host and backup their data, since one of the perils of self-hosting is data loss. Users can build pre-configured servers from the same interface where they also would be notified about devices not being backed up. They can also view information about the storage device, such as available storage and state of arrays.
It is possible for users to back up devices in their global network, regardless of how they are connected. Services installed provided by Clan also need to be aware of the backup process i.e. some applications, such as databases, have custom backup and restore procedures that needs to be integrated in the backup procedure.
## Components
<!-- source: https://cgit.lassul.us/project-x-docs/ -->
<figure>
<img width="100%" src="design-overview.drawio.png" alt="Design">
<figcaption>Figure 1: An example VPN mesh network</figcaption>
</figure>
### Base Operating System
Initially, we will utilize NixOS as the foundational operating system for hosting network-specific virtual machines. Presently, the installation process of NixOS involves advanced technical expertise, including a degree of proficiency in its unique programming language. However, our solution Clan aims to simplify this process, enabling even non-technical users to successfully install the system.
Several approaches can be considered to simplify the Base OS installation process:
* Quick-to-implement solutions:
* Develop an installer that establishes a connection to a Virtual Private Network (VPN). This would enable a more proficient user or administrator to provide assistance or even conduct the installation process on behalf of the user.
* Design an installer capable of autonomously installing the operating system when initiated, for instance, via PXE (Preboot eXecution Environment) or USB.
* More effort-intensive approach:
* Enhance the existing graphical installer to minimize the degree of technical knowledge (such as understanding of Nix) required by the user.
#### Declarative configuration manager
<!-- TODO: network -->
Our aim is to empower users to create a template for a virtual machine. This means allowing them to define a `flake.nix` file from an collection of templates we offer as high-level NixOS modules through a graphical user-interface. The user-defined configuration will contain several essential elements:
* Documentation: We will provide detailed guides on how to join and communicate within the network, as well as an overview of what the network has to offer. These guides will help users navigate the network and utilize its features to their fullest potential.
* Network access: To facilitate seamless connectivity, the configuration file will include settings for the Virtual Private Network (VPN), Domain Name System (DNS), and possibly bootstrap hosts. These settings will ensure that users can easily join the network and maintain a stable connection.
* Default NixOS configuration: Upon spawning a virtual machine, a default NixOS configuration will be included, and preloaded with various apps. This feature enables users to kickstart their virtual machine experience with ready-to-use applications, eliminating the need for manual installation and configuration.
Users will be able to establish their own networks and incorporate various features into it, such as a Git server, a shared Nextcloud instance, or automatic directory synchronization via Syncthing (see also the [Marketplace](#marketplace) section below).
Ideally, we envision this functionality in the form of a web application, an Android app, and possibly a text-based application for power users. These platforms will cater to different user preferences, promoting a more inclusive and user-friendly experience.
An example flake.nix for a virtual machine network:
```nix
{
inputs.Clan.url = "git+https://git.Clan.com/Clan";
outputs = { self, Clan, ... }:
{
nixosModules = {
default = inputs.Clan.nixosSystem {
imports = [
Clan.nixosModules.default
];
Clan = {
adminMode = "local";
networkLayer= "yggdrasil";
applications = {
syncthing = {
enable = true;
sharedFolders = [ "/shared/docs" ];
};
mumbleClient.server = "mumble.Clan";
};
};
};
};
};
}
```
Tehese modules would be build by the VM controller into a system with the following `flake.nix`:
```nix
{
inputs.myNetworkFlake = "git+https://somurl-where-I-can-get-flake.nix-from-above";
outputs = inputs:
{
nixosConfigurations.me = inputs.myNetworkFlake.inputs.nixpkgs.lib.nixosSystem {
imports = [
inputs.myNetworkFlake.nixosModules.default
./local-overrides.nix
];
};
};
}
```
The above `flake.nix` can also be split into a boilerplate `flake.nix` and a JSON sidecar file, which can be generated by a graphical interface:
```nix
{
inputs.Clan.url = "git+https://git.Clan.com/Clan";
outputs = { self, Clan, ... }:
{
nixosModules = Clan.lib.generateNixosModules (builtins.fromJSON (import ./configs.json));
};
}
```
```json
{
"default": {
"system": "x86_64-linux",
"adminMode": "local",
"networkLayer": "yggdrasil",
"applications": {
"syncthing": {
"enable": true,
"sharedFolders": [ "/shared/docs" ]
},
"mumbleClient": {
"server": "mumble.Clan"
}
}
}
}
```
<!-- A crude example of how this interface would look like
<img width="100%" src="flake_controller_new.png" alt="VM Manager New Network">
-->
### Virtual Machine Manager
The Base OS runs the VM Manager for monitoring and managing installed virtual machines. The VM Manager is a graphical interface that allows for various settings adjustments, such as enabling automatic updates, and the addition of new virtual machines.
Virtual machines are tied to a specific VPN of a particular group, and their configurations are obtained from a remotely accessible configuration file. Such a configuration file is a collection of Nix code that fully determines the virtual machine's configuration. Virtual machines can be built and updated based on this file. Networks can advertise their configuration via a Uniform Resource Identifier (URI) such as `nix://https-github.com/someorg/somerepo`, `nix://ipfs-$someIpfsHash`, or `nix://ygg-$someYggAddr`. These URIs can be automatically opened in the virtual manager graphical interface on a user's system when clicked, making the process of joining a network straightforward and efficient.
If a user intends to join only a single network and their hardware capabilities are limited, an alternative to consider would be to forego the use of a virtual machine. Instead, the network configuration could be integrated directly into the Base OS to optimize performance and enhance the user experience.
The interface to the VM-manager for network admins is very similiar to the proxmox interface used for managing multiple VM nodes. Information and Interaction with the target system is provided by the [Virtual Machine Controller](#virtual-machine-controller) described in the next section.
<figure>
<img width="100%" src="proxmox.png" alt="Proxmox">
<figcaption>
Figure 2: A list of networks and corresponding VMs on the left with a detail view and monitoring/log stats in the middle.
</figcaption>
</figure>
### Virtual Machine Controller
<figure>
<img width="100%" src="vm-controller.drawio.png" alt="Controller">
<figcaption>
Figure 3: Architecture diagram of the Virtual Machine Controller
</figcaption>
</figure>
The VM Manager operates on the Base OS, while the VM Controller functions within the virtual machine itself. The latter's role is to regulate the operating system within the VM, and can be managed by either the network administrator or the local user in control of the Base OS. Here are the different modes of control:
* Remote Control: The network administrator can remotely access the machine using SSH. There's also a user-friendly interface for adjusting configuration settings, viewing computer statistics, or initiating a rebuild.
* Local Control: The network administrator sets up a flake which outlines the default services, like VPN and default applications. The local administrator, with root access, can then deploy their services, such as nginx, Nextcloud etc., which are integrated with the defaults provided by the flake.
* Shared Control: Both the network and local administrators have complete access. While the local user can modify options defined by the flake.nix, either administrator can revoke these changes.
In order to appeal to a wider audience beyond those already familiar with NixOS, we're suggesting the development of an easy-to-understand graphical interface. This interface will simplify the use of NixOS modules, provide vital monitoring and debugging information, and enable users to manage their individual virtual machines and NixOS installations more effectively.
### Marketplace
* There is some kind of store or marketplace where people can publish their system and network configurations.
* Their source code will reside in their own repo, but we might want some mirror (e.g. via IPFS) in case their infrastructure goes down.
* Ther may be donation or paid subscription model for community members maintaining and creating flakes.
### Private network
Adding a VPN should be the default for every `flake.nix` created by the wizard. Then people can easily communicate with each other and not care about extensive firewalling, ACLs, port forwarding etc. We can support different technologies like Wireguard, tinc, Yggdrasil, ZeroTier etc. Different higher-level modules have to be created for that.
### Integration into baseOS window manager
We want an integration with the i3/sway window manager where every workspace is it's own VM. At a later point we also want integration for a more common stacking window manager (like GNOME).
## Security
The `flake.nix` describes a system which runs inside a virtual machine. It is evaluated on the system which then builds a virtual machine from that, via Nix. This way there is no interaction with the root operating system, except through the Nix daemon.
At a later point we can also build containers with the same system and have shared memory, GPU access and generally less computational overhead. Although additional safety measures have to be implemented for that.
In this section we discuss security threats and how we design the system to mitigate those.
### Threat-model and mitigations
Our threat model is based on the potential risks from various adversaries, each of which are outlined below:
* Malicious configurations or administrators: This includes individuals or entities with administrative privileges who intentionally act against the interests of the network users. They could manipulate configurations, grant unauthorized access, or misuse sensitive information.
Our safeguards will include virtual machine isolation to mitigate the damage an malicious actor can do to the target system. Malicious admins or configurations can only affect the virtual machine but not the Base OS or other virtual machines from other networks. Since the configuration is based on Nix, more experienced users can review it prior to building. This makes the system more auditable compared to a binary distribution, where only ready built packages are downloaded.
* Malicious network participants: These are network participants who may attempt to disrupt services, steal sensitive data, or exploit vulnerabilities. To counter this, we will implement methods for administrators to block or remove malicious actors from the network. As a long-term goal, business-oriented setups will include access control measures to regulate network access based on user roles.
* Attackers from outside the network: These are external entities trying to infiltrate the network to gain unauthorized access or disrupt the network's operations. These are locked outside access to the system by the VPN technology we use. Since there is no way for outside attackers to even reach a virtual machine, they are considered safe for all intents and purposes from outside attackers.
* For attempts at lateral movement (i.e., the process of progressing through a network, system by system, in search of valuable data or to cause disruption), we will provide a default configuration for software we ship which we consider safe or hardened, to make it more difficult for an attacker to gain access to multiple systems.
* Misconfiguration: This refers to inadvertent errors in the client or network setup that expose it to risks. To address this, we only offer a limited set of options in our high-level modules, which either restrict or issue warnings for configurations deemed to be unsafe. For instance, services are exposed exclusively to the internal network and not to the wider internet, thereby offering an extra layer of security.
### Trusted Compute Base
The Trusted Compute Base (TCB) refers to the core set of security-critical elements in a computing system, such as the operating system kernel, hardware, and certain crucial applications. The integrity and reliability of the TCB are vital to the security of the whole system.
In our case, the TCB encompasses the following key components:
* The underlying VPN: This crucial part of our TCB provides a secure communication channel between different peers within the network. By encrypting all data that passes through it, the VPN ensures confidentiality and integrity of communications, thus safeguarding against eavesdropping or data tampering attempts.
* The Hypervisor: Acting as the foundation for our virtual machines, the hypervisor manages and separates different networks, isolating them from one another. This prevents any potential cross-contamination or attacks between virtual machines, preserving the integrity and security of each separate network.
* Nix sandbox isolation: This provides a safe way to build virtual machines, binaries, etc. in an isolated environment from the operating system. With this we can utilize the native speed of the Base OS for building the OS that runs inside the virtual machines.

View File

@ -1,122 +0,0 @@
<mxfile host="app.diagrams.net" modified="2024-01-04T14:37:14.987Z" agent="Mozilla/5.0 (X11; Linux x86_64; rv:107.0) Gecko/20100101 Firefox/107.0" etag="hDO36PXgKwa7GlXmf0pK" version="21.5.0" type="device">
<diagram name="Page-1" id="Page-1">
<mxGraphModel dx="3034" dy="1872" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" value="Connector" parent="0" />
<mxCell id="L0__EUAIFv-v6VTxFZ8R-24" value="" style="verticalLabelPosition=bottom;html=1;verticalAlign=top;align=center;strokeColor=none;fillColor=#00BEF2;shape=mxgraph.azure.laptop;pointerEvents=1;" vertex="1" parent="1">
<mxGeometry x="250" y="280" width="290" height="240" as="geometry" />
</mxCell>
<mxCell id="r0mgfz6IdKgSaTeHQ_le-60" value="&lt;div&gt;&lt;font style=&quot;font-size: 24px;&quot;&gt;Different &lt;br&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 24px;&quot;&gt;VPN Mesh network&lt;/font&gt;&lt;/div&gt;" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="890" y="950.0000000000001" width="320" height="240" as="geometry" />
</mxCell>
<mxCell id="r0mgfz6IdKgSaTeHQ_le-33" value="&lt;div&gt;&lt;font style=&quot;font-size: 24px;&quot;&gt;VPN Mesh network&lt;/font&gt;&lt;/div&gt;" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="430" y="560" width="320" height="240" as="geometry" />
</mxCell>
<mxCell id="r0mgfz6IdKgSaTeHQ_le-67" value="" style="endArrow=classic;html=1;rounded=0;strokeWidth=3;startArrow=classic;startFill=1;entryX=0.25;entryY=0.25;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" target="r0mgfz6IdKgSaTeHQ_le-33" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="380" y="530" as="sourcePoint" />
<mxPoint x="590" y="645" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="22" value="&lt;font data-darkreader-inline-color=&quot;&quot; style=&quot;font-size: 28px; font-family: &amp;quot;calibri&amp;quot;; color: rgb(0, 0, 0); direction: ltr; letter-spacing: 0px; line-height: 120%; opacity: 1; --darkreader-inline-color: #e8e6e3;&quot;&gt;Computer connected through VM&lt;br&gt;&lt;/font&gt;" style="verticalAlign=middle;align=center;vsdxID=28;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="857.5" y="400" width="265" height="130" as="geometry" />
</mxCell>
<mxCell id="r0mgfz6IdKgSaTeHQ_le-66" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.875;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;strokeWidth=3;startArrow=classic;startFill=1;" parent="1" target="r0mgfz6IdKgSaTeHQ_le-33" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="860" y="628.7096774193546" as="sourcePoint" />
<mxPoint x="566" y="717" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="ZT00lVDF8hyaAqTCrx0f-22" value="NixOS" style="vsdxID=12;fillColor=#0050ef;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=#001DBC;strokeWidth=3;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;fontColor=#ffffff;fontSize=28;" parent="1" vertex="1">
<mxGeometry x="300" y="400" width="200" height="36.25" as="geometry" />
</mxCell>
<mxCell id="eZtIASL5zvcn_9goES__-32" value="&lt;font data-darkreader-inline-color=&quot;&quot; style=&quot;font-size: 28px; font-family: &amp;quot;calibri&amp;quot;; color: rgb(0, 0, 0); direction: ltr; letter-spacing: 0px; line-height: 120%; opacity: 1; --darkreader-inline-color: #e8e6e3;&quot;&gt;Computer directly connected&lt;br&gt;&lt;/font&gt;" style="verticalAlign=middle;align=left;vsdxID=28;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="522.5" y="319.9950996015936" width="135" height="102.54980079681275" as="geometry" />
</mxCell>
<mxCell id="ZT00lVDF8hyaAqTCrx0f-23" value="" style="group" parent="1" vertex="1" connectable="0">
<mxGeometry x="300" y="320" width="200" height="60" as="geometry" />
</mxCell>
<mxCell id="eZtIASL5zvcn_9goES__-42" style="vsdxID=12;fillColor=#0050ef;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=#001DBC;strokeWidth=3;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;fontColor=#ffffff;" parent="ZT00lVDF8hyaAqTCrx0f-23" vertex="1">
<mxGeometry width="200" height="60" as="geometry" />
</mxCell>
<mxCell id="eZtIASL5zvcn_9goES__-43" value="&lt;font data-darkreader-inline-color=&quot;&quot; style=&quot;font-size: 28px; font-family: &amp;quot;calibri&amp;quot;; color: rgb(255, 255, 255); direction: ltr; letter-spacing: 0px; line-height: 120%; opacity: 1; --darkreader-inline-color: #e8e6e3;&quot;&gt;Mumble Client&lt;br&gt;&lt;/font&gt;" style="verticalAlign=middle;align=center;vsdxID=25;fillColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="ZT00lVDF8hyaAqTCrx0f-23" vertex="1">
<mxGeometry x="9.807692307692303" y="13.714285714285712" width="180.3846153846154" height="31.71428571428571" as="geometry" />
</mxCell>
<mxCell id="L0__EUAIFv-v6VTxFZ8R-32" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="840" y="520" width="300" height="250" as="geometry" />
</mxCell>
<mxCell id="L0__EUAIFv-v6VTxFZ8R-25" value="" style="verticalLabelPosition=bottom;html=1;verticalAlign=top;align=center;strokeColor=none;fillColor=#00BEF2;shape=mxgraph.azure.laptop;pointerEvents=1;" vertex="1" parent="L0__EUAIFv-v6VTxFZ8R-32">
<mxGeometry width="300" height="250" as="geometry" />
</mxCell>
<mxCell id="L0__EUAIFv-v6VTxFZ8R-30" value="&lt;font style=&quot;font-size: 20px;&quot;&gt;VM with NixOS &lt;/font&gt;" style="swimlane;whiteSpace=wrap;html=1;" vertex="1" parent="L0__EUAIFv-v6VTxFZ8R-32">
<mxGeometry x="45" y="20" width="200" height="150" as="geometry" />
</mxCell>
<mxCell id="L0__EUAIFv-v6VTxFZ8R-31" value="" style="group" vertex="1" connectable="0" parent="L0__EUAIFv-v6VTxFZ8R-30">
<mxGeometry x="10" y="40" width="180" height="90" as="geometry" />
</mxCell>
<mxCell id="eZtIASL5zvcn_9goES__-39" style="vsdxID=12;fillColor=#0050ef;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=#001DBC;strokeWidth=3;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;fontColor=#ffffff;" parent="L0__EUAIFv-v6VTxFZ8R-31" vertex="1">
<mxGeometry width="180" height="90" as="geometry" />
</mxCell>
<mxCell id="eZtIASL5zvcn_9goES__-40" value="&lt;font data-darkreader-inline-color=&quot;&quot; style=&quot;font-size: 28px; font-family: &amp;quot;calibri&amp;quot;; color: rgb(255, 255, 255); direction: ltr; letter-spacing: 0px; line-height: 120%; opacity: 1; --darkreader-inline-color: #e8e6e3;&quot;&gt;Mumble Client&lt;br&gt;&lt;/font&gt;" style="verticalAlign=middle;align=center;vsdxID=25;fillColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="L0__EUAIFv-v6VTxFZ8R-31" vertex="1">
<mxGeometry x="8.826923076923094" y="27.64285714285714" width="162.34615384615387" height="47.57142857142858" as="geometry" />
</mxCell>
<mxCell id="ZT00lVDF8hyaAqTCrx0f-24" value="&lt;div&gt;Linux or MacOS&lt;/div&gt;" style="vsdxID=12;fillColor=#0050ef;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=#001DBC;strokeWidth=3;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;fontColor=#ffffff;fontSize=28;" parent="L0__EUAIFv-v6VTxFZ8R-32" vertex="1">
<mxGeometry x="30" y="205" width="240" height="35" as="geometry" />
</mxCell>
<mxCell id="L0__EUAIFv-v6VTxFZ8R-45" value="" style="image;points=[];aspect=fixed;html=1;align=center;shadow=0;dashed=0;image=img/lib/allied_telesis/computer_and_terminals/Personal_Computer_with_Server.svg;imageBackground=#FFFFFF;fillStyle=solid;" vertex="1" parent="1">
<mxGeometry x="340" y="810" width="457.6" height="457.6" as="geometry" />
</mxCell>
<mxCell id="L0__EUAIFv-v6VTxFZ8R-40" value="&lt;font style=&quot;font-size: 20px;&quot;&gt;VM with NixOS &lt;/font&gt;" style="swimlane;whiteSpace=wrap;html=1;startSize=23;fillColor=#FFFFFF;gradientColor=none;" vertex="1" parent="1">
<mxGeometry x="440" y="1070" width="282.25" height="160" as="geometry">
<mxRectangle x="1180" y="730" width="180" height="40" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="L0__EUAIFv-v6VTxFZ8R-50" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="L0__EUAIFv-v6VTxFZ8R-40">
<mxGeometry y="30" width="282.25" height="130" as="geometry" />
</mxCell>
<mxCell id="L0__EUAIFv-v6VTxFZ8R-41" value="" style="group;align=left;" vertex="1" connectable="0" parent="L0__EUAIFv-v6VTxFZ8R-40">
<mxGeometry x="52.25" y="50" width="180" height="90" as="geometry" />
</mxCell>
<mxCell id="L0__EUAIFv-v6VTxFZ8R-42" style="vsdxID=12;fillColor=#0050ef;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=#001DBC;strokeWidth=3;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;fontColor=#ffffff;" vertex="1" parent="L0__EUAIFv-v6VTxFZ8R-41">
<mxGeometry width="180" height="90" as="geometry" />
</mxCell>
<mxCell id="L0__EUAIFv-v6VTxFZ8R-43" value="&lt;font data-darkreader-inline-color=&quot;&quot; style=&quot;font-size: 28px; font-family: &amp;quot;calibri&amp;quot;; color: rgb(255, 255, 255); direction: ltr; letter-spacing: 0px; line-height: 120%; opacity: 1; --darkreader-inline-color: #e8e6e3;&quot;&gt;Nextcloud&lt;/font&gt;&lt;font data-darkreader-inline-color=&quot;&quot; style=&quot;font-size: 28px; font-family: &amp;quot;calibri&amp;quot;; color: rgb(255, 255, 255); direction: ltr; letter-spacing: 0px; line-height: 120%; opacity: 1; --darkreader-inline-color: #e8e6e3;&quot;&gt;&lt;/font&gt;" style="verticalAlign=middle;align=center;vsdxID=25;fillColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="L0__EUAIFv-v6VTxFZ8R-41">
<mxGeometry x="8.826923076923094" y="27.64285714285714" width="162.34615384615387" height="47.57142857142858" as="geometry" />
</mxCell>
<mxCell id="r0mgfz6IdKgSaTeHQ_le-63" value="" style="endArrow=classic;html=1;rounded=0;strokeWidth=3;startArrow=classic;startFill=1;entryX=0.16;entryY=0.55;entryDx=0;entryDy=0;entryPerimeter=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="L0__EUAIFv-v6VTxFZ8R-50" target="r0mgfz6IdKgSaTeHQ_le-60" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="1658.8" y="1118" as="sourcePoint" />
<mxPoint x="1149.9999999999998" y="1229.9999999999995" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="r0mgfz6IdKgSaTeHQ_le-65" value="" style="endArrow=classic;html=1;rounded=0;strokeWidth=3;startArrow=classic;startFill=1;entryX=0.55;entryY=0.95;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="L0__EUAIFv-v6VTxFZ8R-51" target="r0mgfz6IdKgSaTeHQ_le-33" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="566.125" y="880" as="sourcePoint" />
<mxPoint x="660" y="840" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="L0__EUAIFv-v6VTxFZ8R-46" value="&lt;div&gt;&lt;font data-darkreader-inline-color=&quot;&quot; style=&quot;font-size: 28px; font-family: &amp;quot;calibri&amp;quot;; color: rgb(0, 0, 0); direction: ltr; letter-spacing: 0px; line-height: 120%; opacity: 1; --darkreader-inline-color: #e8e6e3;&quot;&gt;Computer joined multiple cLANs&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font data-darkreader-inline-color=&quot;&quot; style=&quot;font-size: 28px; font-family: &amp;quot;calibri&amp;quot;; color: rgb(0, 0, 0); direction: ltr; letter-spacing: 0px; line-height: 120%; opacity: 1; --darkreader-inline-color: #e8e6e3;&quot;&gt;&amp;nbsp;through VMs&lt;/font&gt;&lt;/div&gt;" style="verticalAlign=middle;align=right;vsdxID=28;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="1">
<mxGeometry x="70" y="940" width="265" height="130" as="geometry" />
</mxCell>
<mxCell id="L0__EUAIFv-v6VTxFZ8R-51" value="&lt;font style=&quot;font-size: 20px;&quot;&gt;VM with NixOS &lt;/font&gt;" style="swimlane;whiteSpace=wrap;html=1;startSize=23;fillColor=#FFFFFF;gradientColor=none;" vertex="1" parent="1">
<mxGeometry x="420" y="880" width="282.25" height="160" as="geometry">
<mxRectangle x="1180" y="730" width="180" height="40" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="L0__EUAIFv-v6VTxFZ8R-52" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="L0__EUAIFv-v6VTxFZ8R-51">
<mxGeometry y="30" width="282.25" height="130" as="geometry" />
</mxCell>
<mxCell id="L0__EUAIFv-v6VTxFZ8R-53" value="" style="group;align=left;" vertex="1" connectable="0" parent="L0__EUAIFv-v6VTxFZ8R-51">
<mxGeometry x="52.25" y="50" width="180" height="90" as="geometry" />
</mxCell>
<mxCell id="L0__EUAIFv-v6VTxFZ8R-54" style="vsdxID=12;fillColor=#0050ef;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=#001DBC;strokeWidth=3;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;fontColor=#ffffff;" vertex="1" parent="L0__EUAIFv-v6VTxFZ8R-53">
<mxGeometry width="180" height="90" as="geometry" />
</mxCell>
<mxCell id="L0__EUAIFv-v6VTxFZ8R-55" value="&lt;font data-darkreader-inline-color=&quot;&quot; style=&quot;font-size: 28px; font-family: &amp;quot;calibri&amp;quot;; color: rgb(255, 255, 255); direction: ltr; letter-spacing: 0px; line-height: 120%; opacity: 1; --darkreader-inline-color: #e8e6e3;&quot;&gt;Mumble Server&lt;/font&gt;" style="verticalAlign=middle;align=center;vsdxID=25;fillColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="L0__EUAIFv-v6VTxFZ8R-53">
<mxGeometry x="8.826923076923094" y="27.64285714285714" width="162.34615384615387" height="47.57142857142858" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

View File

@ -1,70 +0,0 @@
<mxfile host="app.diagrams.net" modified="2024-01-05T12:59:03.492Z" agent="Mozilla/5.0 (X11; Linux x86_64; rv:107.0) Gecko/20100101 Firefox/107.0" etag="nRfnfGWJctDRxy5wXqNq" version="22.1.16" type="device">
<diagram name="Page-1" id="GEtNjjdXVUXUiFOQShyp">
<mxGraphModel dx="1818" dy="1012" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="ilsiUmANOehLyqSuM1yz-1" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="185" y="10" width="430" height="430" as="geometry" />
</mxCell>
<mxCell id="ilsiUmANOehLyqSuM1yz-7" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="40" y="30" width="130" height="130" as="geometry" />
</mxCell>
<mxCell id="ilsiUmANOehLyqSuM1yz-6" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="ilsiUmANOehLyqSuM1yz-7">
<mxGeometry width="130" height="130" as="geometry" />
</mxCell>
<mxCell id="ilsiUmANOehLyqSuM1yz-2" value="" style="fontColor=#0066CC;verticalAlign=top;verticalLabelPosition=bottom;labelPosition=center;align=center;html=1;outlineConnect=0;fillColor=#CCCCCC;strokeColor=#6881B3;gradientColor=none;gradientDirection=north;strokeWidth=2;shape=mxgraph.networks.security_camera;" vertex="1" parent="ilsiUmANOehLyqSuM1yz-7">
<mxGeometry x="15" y="25" width="100" height="80" as="geometry" />
</mxCell>
<mxCell id="ilsiUmANOehLyqSuM1yz-3" value="" style="endArrow=none;html=1;rounded=0;strokeWidth=6;fillColor=#f8cecc;strokeColor=#e01b24;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="ilsiUmANOehLyqSuM1yz-7" source="ilsiUmANOehLyqSuM1yz-6" target="ilsiUmANOehLyqSuM1yz-6">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-270" y="120" as="sourcePoint" />
<mxPoint x="-150" y="30" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="ilsiUmANOehLyqSuM1yz-9" value="" style="verticalLabelPosition=bottom;html=1;verticalAlign=top;align=center;strokeColor=none;fillColor=#00BEF2;shape=mxgraph.azure.computer;pointerEvents=1;" vertex="1" parent="1">
<mxGeometry x="270" y="120" width="88.89" height="80" as="geometry" />
</mxCell>
<mxCell id="ilsiUmANOehLyqSuM1yz-10" value="" style="verticalLabelPosition=bottom;html=1;verticalAlign=top;align=center;strokeColor=none;fillColor=#00BEF2;shape=mxgraph.azure.computer;pointerEvents=1;" vertex="1" parent="1">
<mxGeometry x="355.55" y="290" width="88.89" height="80" as="geometry" />
</mxCell>
<mxCell id="ilsiUmANOehLyqSuM1yz-11" value="" style="verticalLabelPosition=bottom;html=1;verticalAlign=top;align=center;strokeColor=none;fillColor=#00BEF2;shape=mxgraph.azure.computer;pointerEvents=1;" vertex="1" parent="1">
<mxGeometry x="440" y="120" width="88.89" height="80" as="geometry" />
</mxCell>
<mxCell id="ilsiUmANOehLyqSuM1yz-12" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.281;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="ilsiUmANOehLyqSuM1yz-10" target="ilsiUmANOehLyqSuM1yz-9">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="280" y="320" as="sourcePoint" />
<mxPoint x="330" y="270" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="ilsiUmANOehLyqSuM1yz-13" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.686;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="ilsiUmANOehLyqSuM1yz-10" target="ilsiUmANOehLyqSuM1yz-11">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="421" y="354" as="sourcePoint" />
<mxPoint x="344" y="210" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="ilsiUmANOehLyqSuM1yz-14" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="ilsiUmANOehLyqSuM1yz-11" target="ilsiUmANOehLyqSuM1yz-9">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="395" y="350" as="sourcePoint" />
<mxPoint x="344" y="210" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="ilsiUmANOehLyqSuM1yz-15" value="&lt;div&gt;&lt;font style=&quot;font-size: 19px;&quot;&gt;cLAN&lt;br&gt;&lt;/font&gt;&lt;/div&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=19;fontStyle=1" vertex="1" parent="1">
<mxGeometry x="370" y="60" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="ilsiUmANOehLyqSuM1yz-16" value="&lt;font style=&quot;font-size: 19px;&quot;&gt;Mesh-VPN&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="270" y="200" width="260" height="30" as="geometry" />
</mxCell>
<mxCell id="ilsiUmANOehLyqSuM1yz-18" value="&lt;font style=&quot;font-size: 18px;&quot;&gt;Machine&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="284.45" y="140" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="ilsiUmANOehLyqSuM1yz-19" value="&lt;font style=&quot;font-size: 18px;&quot;&gt;Machine&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="454.45000000000005" y="140" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="ilsiUmANOehLyqSuM1yz-20" value="&lt;font style=&quot;font-size: 18px;&quot;&gt;Machine&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="370" y="310" width="60" height="30" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

View File

@ -1,34 +0,0 @@
<mxfile host="app.diagrams.net" modified="2024-01-05T13:13:17.175Z" agent="Mozilla/5.0 (X11; Linux x86_64; rv:107.0) Gecko/20100101 Firefox/107.0" etag="3DFXX_tJUOXZw0FaTeN-" version="22.1.16" type="device">
<diagram name="Page-1" id="tz5SLeF9hT5f3y39BwH8">
<mxGraphModel dx="1434" dy="842" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="trWwFmtepQNAlSAXFZ74-7" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="850" y="110" width="540" height="380.00000000000006" as="geometry" />
</mxCell>
<mxCell id="trWwFmtepQNAlSAXFZ74-8" value="" style="verticalLabelPosition=bottom;html=1;verticalAlign=top;align=center;strokeColor=none;fillColor=#00BEF2;shape=mxgraph.azure.laptop;pointerEvents=1;" vertex="1" parent="trWwFmtepQNAlSAXFZ74-7">
<mxGeometry x="-4" width="540" height="380.00000000000006" as="geometry" />
</mxCell>
<mxCell id="trWwFmtepQNAlSAXFZ74-9" value="&lt;div&gt;&lt;font style=&quot;font-size: 20px;&quot;&gt;Virtual machine&lt;/font&gt;&lt;/div&gt;" style="swimlane;whiteSpace=wrap;html=1;" vertex="1" parent="trWwFmtepQNAlSAXFZ74-7">
<mxGeometry x="86" y="30.4" width="360" height="129.6" as="geometry" />
</mxCell>
<mxCell id="trWwFmtepQNAlSAXFZ74-13" value="&lt;div&gt;Linux or MacOS&lt;/div&gt;" style="vsdxID=12;fillColor=#0050ef;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=#001DBC;strokeWidth=3;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;fontColor=#ffffff;fontSize=28;" vertex="1" parent="trWwFmtepQNAlSAXFZ74-7">
<mxGeometry x="86" y="230" width="360" height="46.2" as="geometry" />
</mxCell>
<mxCell id="trWwFmtepQNAlSAXFZ74-10" value="" style="group" vertex="1" connectable="0" parent="trWwFmtepQNAlSAXFZ74-7">
<mxGeometry x="101" y="60" width="330" height="36.2" as="geometry" />
</mxCell>
<mxCell id="trWwFmtepQNAlSAXFZ74-11" value="&lt;font style=&quot;font-size: 20px;&quot;&gt;&lt;b&gt;App&lt;/b&gt;&lt;/font&gt;" style="vsdxID=12;fillColor=#0050ef;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=#001DBC;strokeWidth=3;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;fontColor=#ffffff;" vertex="1" parent="trWwFmtepQNAlSAXFZ74-10">
<mxGeometry width="330" height="36.199999999999996" as="geometry" />
</mxCell>
<mxCell id="trWwFmtepQNAlSAXFZ74-14" value="&lt;div&gt;QEMU&lt;/div&gt;" style="vsdxID=12;fillColor=#0050ef;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=#001DBC;strokeWidth=3;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;fontColor=#ffffff;fontSize=28;" vertex="1" parent="trWwFmtepQNAlSAXFZ74-7">
<mxGeometry x="86" y="170" width="360" height="46.2" as="geometry" />
</mxCell>
<mxCell id="trWwFmtepQNAlSAXFZ74-15" value="&lt;div&gt;NixOS&lt;/div&gt;" style="vsdxID=12;fillColor=#0050ef;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=#001DBC;strokeWidth=3;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;fontColor=#ffffff;fontSize=28;" vertex="1" parent="trWwFmtepQNAlSAXFZ74-7">
<mxGeometry x="101" y="110" width="330" height="36.2" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

View File

@ -1,82 +0,0 @@
<mxfile host="app.diagrams.net" modified="2023-06-25T10:07:27.291Z" agent="Mozilla/5.0 (X11; Linux x86_64; rv:107.0) Gecko/20100101 Firefox/107.0" etag="0R5u8sYTEL2zQsEBPwp4" version="21.5.0" type="device">
<diagram name="Page-1" id="Page-1">
<mxGraphModel dx="774" dy="506" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" value="Connector" parent="0" />
<mxCell id="r0mgfz6IdKgSaTeHQ_le-42" value="" style="group" parent="1" vertex="1" connectable="0">
<mxGeometry x="578" y="810" width="709" height="251" as="geometry" />
</mxCell>
<mxCell id="b6oYJSDJwjR9OZKanJwb-46" value="" style="rounded=1;whiteSpace=wrap;html=1;hachureGap=4;pointerEvents=0;strokeWidth=2;" parent="r0mgfz6IdKgSaTeHQ_le-42" vertex="1">
<mxGeometry x="119" y="-30" width="590" height="281" as="geometry" />
</mxCell>
<mxCell id="eZtIASL5zvcn_9goES__-36" value="&lt;h2&gt;VM Manager&lt;br&gt;&lt;/h2&gt;" style="vsdxID=14;fillColor=#0050ef;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=#001DBC;strokeWidth=3;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;fontColor=#ffffff;" parent="r0mgfz6IdKgSaTeHQ_le-42" vertex="1">
<mxGeometry x="514" y="85.53000000000011" width="181" height="49.95" as="geometry" />
</mxCell>
<mxCell id="eZtIASL5zvcn_9goES__-38" style="vsdxID=48;edgeStyle=none;startArrow=none;endArrow=classic;startSize=5;endSize=5;strokeWidth=3;strokeColor=#000000;spacingTop=0;spacingBottom=0;spacingLeft=0;spacingRight=0;verticalAlign=middle;html=1;labelBackgroundColor=#ffffff;rounded=0;entryX=0.996;entryY=0.504;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.005;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;startFill=0;endFill=1;" parent="r0mgfz6IdKgSaTeHQ_le-42" edge="1" target="5" source="eZtIASL5zvcn_9goES__-36">
<mxGeometry relative="1" as="geometry">
<mxPoint x="499" y="50.60557768924302" as="sourcePoint" />
<mxPoint x="520" y="-180" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="mQ3fhrx0b4LYlkQwnVk3-25" value="" style="group" vertex="1" connectable="0" parent="r0mgfz6IdKgSaTeHQ_le-42">
<mxGeometry x="153" y="-0.754999999999896" width="321" height="222.51999999999998" as="geometry" />
</mxCell>
<mxCell id="5" value="" style="verticalAlign=middle;align=center;vsdxID=5;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeWidth=2;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="mQ3fhrx0b4LYlkQwnVk3-25" vertex="1">
<mxGeometry width="320" height="222.52" as="geometry" />
</mxCell>
<mxCell id="14" value="&lt;font data-darkreader-inline-color=&quot;&quot; style=&quot;font-size: 22px; font-family: &amp;quot;calibri&amp;quot;; color: rgb(0, 0, 0); direction: ltr; letter-spacing: 0px; line-height: 120%; opacity: 1; --darkreader-inline-color: #e8e6e3;&quot;&gt;&lt;font style=&quot;font-size: 28px&quot;&gt;VM&lt;br&gt;&lt;/font&gt;&lt;/font&gt;" style="verticalAlign=middle;align=center;vsdxID=19;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="mQ3fhrx0b4LYlkQwnVk3-25" vertex="1">
<mxGeometry x="1" y="140.9223306772907" width="320" height="59.33466135458167" as="geometry" />
</mxCell>
<mxCell id="eZtIASL5zvcn_9goES__-33" value="&lt;h2&gt;Controller Daemon&lt;/h2&gt;" style="vsdxID=12;fillColor=#0050ef;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=#001DBC;strokeWidth=3;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;fontColor=#ffffff;" parent="mQ3fhrx0b4LYlkQwnVk3-25" vertex="1">
<mxGeometry x="30" y="92.02499999999989" width="260" height="48.9" as="geometry" />
</mxCell>
<mxCell id="mQ3fhrx0b4LYlkQwnVk3-18" value="&lt;h2&gt;Controller Frontend&lt;br&gt;&lt;/h2&gt;" style="vsdxID=12;fillColor=#0050ef;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=#001DBC;strokeWidth=3;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;fontColor=#ffffff;" vertex="1" parent="mQ3fhrx0b4LYlkQwnVk3-25">
<mxGeometry x="150" y="33.1" width="140" height="49.95" as="geometry" />
</mxCell>
<mxCell id="mQ3fhrx0b4LYlkQwnVk3-31" value="&lt;font style=&quot;font-size: 28px;&quot; face=&quot;calibri&quot;&gt;(optional)&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="r0mgfz6IdKgSaTeHQ_le-42">
<mxGeometry x="562" y="20" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="mQ3fhrx0b4LYlkQwnVk3-16" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.525;entryY=0.02;entryDx=0;entryDy=0;entryPerimeter=0;strokeWidth=3;" edge="1" parent="1" source="mQ3fhrx0b4LYlkQwnVk3-21" target="mQ3fhrx0b4LYlkQwnVk3-18">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="891.4057853270601" y="471.9920318725103" as="sourcePoint" />
<mxPoint x="650" y="530" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="mQ3fhrx0b4LYlkQwnVk3-21" value="&lt;font style=&quot;font-size: 28px;&quot; face=&quot;calibri&quot;&gt;Admin&lt;/font&gt;" style="ellipse;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="896" y="420" width="120" height="80" as="geometry" />
</mxCell>
<mxCell id="15" value="&lt;font data-darkreader-inline-color=&quot;&quot; style=&quot;font-size: 28px; font-family: Calibri; color: rgb(0, 0, 0); direction: ltr; letter-spacing: 0px; line-height: 120%; opacity: 1; --darkreader-inline-color: #e8e6e3;&quot;&gt;Server&lt;br&gt;&lt;/font&gt;" style="verticalAlign=middle;align=center;vsdxID=20;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="1300" y="919.9973306772908" width="125" height="59.33466135458167" as="geometry" />
</mxCell>
<mxCell id="mQ3fhrx0b4LYlkQwnVk3-24" value="&lt;font style=&quot;font-size: 28px;&quot; face=&quot;calibri&quot; color=&quot;#000000&quot;&gt;User&lt;/font&gt;" style="ellipse;whiteSpace=wrap;html=1;fillColor=default;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="1305" y="831" width="120" height="80" as="geometry" />
</mxCell>
<mxCell id="mQ3fhrx0b4LYlkQwnVk3-26" value="" style="endArrow=classic;html=1;rounded=0;entryX=1.008;entryY=0.557;entryDx=0;entryDy=0;entryPerimeter=0;strokeWidth=3;exitX=0;exitY=0.5;exitDx=0;exitDy=0;fillColor=#f5f5f5;strokeColor=#666666;" edge="1" parent="1" source="mQ3fhrx0b4LYlkQwnVk3-24" target="mQ3fhrx0b4LYlkQwnVk3-18">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="910" y="530" as="sourcePoint" />
<mxPoint x="907" y="853" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="mQ3fhrx0b4LYlkQwnVk3-27" value="&lt;h2&gt;Controller cli&lt;br&gt;&lt;/h2&gt;" style="vsdxID=12;fillColor=#0050ef;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=#001DBC;strokeWidth=3;labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;fontColor=#ffffff;" vertex="1" parent="1">
<mxGeometry x="744" y="509.9950000000001" width="140" height="49.95" as="geometry" />
</mxCell>
<mxCell id="mQ3fhrx0b4LYlkQwnVk3-28" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.203;entryY=0.071;entryDx=0;entryDy=0;entryPerimeter=0;strokeWidth=3;" edge="1" parent="1" source="mQ3fhrx0b4LYlkQwnVk3-27" target="eZtIASL5zvcn_9goES__-33">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="961" y="530" as="sourcePoint" />
<mxPoint x="965" y="853" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="r0mgfz6IdKgSaTeHQ_le-33" value="&lt;font style=&quot;font-size: 24px;&quot;&gt;VPN Mesh network&lt;/font&gt;" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="720" y="550" width="320" height="240" as="geometry" />
</mxCell>
<mxCell id="mQ3fhrx0b4LYlkQwnVk3-30" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.992;entryY=0.492;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;strokeWidth=3;" edge="1" parent="1" source="mQ3fhrx0b4LYlkQwnVk3-21" target="mQ3fhrx0b4LYlkQwnVk3-27">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="950" y="520" as="sourcePoint" />
<mxPoint x="970" y="540" as="targetPoint" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

View File

@ -1,11 +0,0 @@
+++
title = "Lassulus"
description = "Contributor to Clan."
date = 2021-04-01T08:50:45+00:00
updated = 2021-04-01T08:50:45+00:00
draft = false
+++
Contributor to **clan**.
[@lassulus](https://http://lassul.us/)

View File

@ -1,11 +0,0 @@
+++
title = "Mic92"
description = "Contributor to Clan."
date = 2021-04-01T08:50:45+00:00
updated = 2021-04-01T08:50:45+00:00
draft = false
+++
Contributor to **clan**.
[@thalheim](https://thalheim.io)

View File

@ -1,7 +0,0 @@
+++
title = "Qubasa"
description = "Contributor to Clan."
+++
Contributor to **clan**.
[@Luis-Hebendanz](https://github.com/Luis-Hebendanz)

View File

@ -1,6 +0,0 @@
+++
title = "W"
description = "Founder of Clan"
+++
Project founder and visionary of **clan**.

View File

@ -1,20 +0,0 @@
+++
title = "Authors"
description = "The authors of the blog articles."
date = 2021-04-01T08:00:00+00:00
updated = 2024-03-01T08:00:00+00:00
draft = false
# If add a new author page in this section, please add a new item,
# and the format is as follows:
#
# "author-name-in-url" = "the-full-path-of-the-author-page"
#
# Note: We use quoted keys here.
[extra.author_pages]
"Mic92" = "authors/Mic92.md"
"Qubasa" = "authors/Qubasa.md"
"W" = "authors/W.md"
+++
The authors of the blog articles.

View File

@ -1,75 +0,0 @@
+++
title = "Introducing Clan: Full-Stack Computing Redefined"
description = "Introducing Clan, a new model for a decentralized network, designed to provide families, smaller groups, and small businesses a platform thats private, secure, and user-friendly."
date = 2024-03-19T09:19:42+00:00
updated = 2024-03-19T09:19:42+00:00
draft = false
template = "blog/page.html"
[taxonomies]
authors = ["W", "Qubasa"]
+++
In a digital age where users are guided increasingly toward submission and dependence, Clan reclaims computing and networking from the ground up.
Clan enables users to build any system from a git repository, automate secret handling, and join devices in a secure darknet. This control extends beyond applications to communication protocols and the operating system itself, putting you fully in charge of your own digital environment.
## Why We're Building Clan
Our mission is simple: to restore fun, freedom, and functionality to computing as an open source project. We believe in building tools that empower users, foster innovation, and challenge the limitations imposed by outdated paradigms. Clan, in its essence, is an open source endeavor; it's our contribution to a future where technology serves humanity, not the other way around.
## How Clan Changes the Game
Clan embodies a new philosophy in system, application, and network design. It enables seamless, secure communication across devices, simplifies software distribution and updates, and offers both public and private network configurations. Here are some of the ways it accomplishes this:
- **Nix as a Foundation:** Imagine a safety net for your computer's operating system, one that lets you make changes or updates without the fear of causing a crash or losing data. Nix simplifies the complexities of system design, ensuring that updates are safe and systems are more reliable.
- **Simplified System Deployment:** Building and managing a computer system, from the operating system to the software you use, often feels like putting together a complex puzzle. With Clan, the puzzle pieces are replaced by a set of building blocks. Leveraging the power of Nix and Clan's innovative toolkit, anyone from tech-savvy administrators to everyday users can create and maintain what we call "full-stack systems" (everything your computer needs to run smoothly).
- **A Leap in Connectivity:** Imagine if you could create private, secure pathways between your devices, bypassing the noisy and often insecure internet. Clan makes this possible through something called "overlay networks." These networks are like private tunnels, allowing your devices to talk to each other securely and directly. With Clan's built-in overlay networks and automatically configured services, connecting your devices becomes seamless, secure, and hassle-free.
- **Security Through Separation:** Clan employs sandboxing and virtual machines, a technology that runs code in isolated environments - so even if you explore new Clans, your system remains protected from potential threats.
- **Reliable:** With Clan, your data and services are preserved for the long haul. We focus on self-hosted backups and integration with the [Fediverse](https://de.wikipedia.org/wiki/Fediverse), a network of interconnected, independent online communities, so your digital life remains uninterrupted and under your control.
## A Glimpse at Clan's Features
- **Social Scaling:** Choose between creating a private sanctuary for your closest contacts, a dynamic space for a self-contained community, or embracing the open web with public Clans anyone can join.
{{ video(name="show_join.webm")}}
- **Seamless VM Integration:** Applications running in virtual machines can appear and behave as if they're part of your main operating system — a blend of power and simplicity.
{{ video(name="show_run.webm")}}
- **Robust Backup Management:** Keep your data safe _forever_ - never worry about cloud services disappearing in 10 years.
{{ asciinema(name="backups.cast") }}
- **Intuitive Secret Management:** Clan simplifies digital security by automating the creation and management of encryption keys and passwords for your services.
{{ asciinema(name="secrets.cast") }}
- **Remote Install:** Set up and manage Clan systems anywhere in the world with just a QR scan or SSH access, making remote installations as easy as snapping a photo or sharing a link.
{{ asciinema(name="nixos-install.cast") }}
## Who Stands to Benefit?
Clan is for anyone and everyone who believes in the power of open source technology to connect, empower, and protect. From system administrators to less tech-savvy individuals, small business owners to privacy-conscious users, Clan offers something for everyone — a way to reclaim control and redefine how we interact with technology.
## Join the Revolution
Ready to control your digital world? Clan is more than a tool—it's a movement. Secure your data, manage your systems easily, or connect with others how you like. Start with Clan for a better digital future.
Connect with us on our [Matrix channel at clan.lol](https://matrix.to/#/!djzOHBBBHnwQkgNgdV:matrix.org?via=blog.clan.lol) or through our IRC bridges (coming soon).
Want to see the code? Check it out [on our Gitea](https://git.clan.lol/clan/clan-core) or [on GitHub](https://github.com/clan-lol/clan-core).
Or follow our RSS feed by clicking in the top right corner!
Join us and be part of changing technology for the better, together.

View File

@ -1,15 +0,0 @@
+++
title = "New documentation site and weekly new meetup"
date = 2024-04-16T14:36:16+02:00
draft = false
template = "blog/page.html"
[taxonomies]
authors = ["Lassulus", "Mic92"]
+++
Last week, we added a new documentation hub for clan at [docs.clan.lol](https://docs.clan.lol).
We are still working on improving the installation procedures, so stay tuned.
We now have weekly office hours where people are invited to hangout and ask questions.
They are every Wednesday 15:30 UTC (17:30 CEST) in our [jitsi](https://jitsi.lassul.us/clan.lol).
Otherwise drop by in our [matrix channel](https://matrix.to/#/#clan:lassul.us).

View File

@ -1,7 +0,0 @@
+++
title = "Blog"
description = "Blog"
sort_by = "date"
paginate_by = 2
template = "blog/section.html"
+++

View File

@ -1,21 +0,0 @@
+++
title = "Contributing"
description = "Contribute to Clan, improve documentation, or submit to showcase."
date = 2025-05-01T18:00:00+00:00
updated = 2021-05-01T18:00:00+00:00
template = "section.html"
sort_by = "weight"
weight = 18
section = "contributing"
+++
👉 Explore the source code at [git.clan.lol/clan](https://git.clan.lol/clan)
👉 [Browse issues](https://git.clan.lol/clan/clan-core/issues)
👉 [Create a new issue](https://git.clan.lol/clan/clan-core/issues/new)
👉 Source code for this site: [git.clan.lol/clan/clan-homepage](https://git.clan.lol/clan/clan-homepage/src/branch/main/content/docs)
👉 Join [Clan on Matrix](https://matrix.to/#/#clan:lassul.us) to contact maintainers

View File

@ -1,9 +0,0 @@
+++
title = "Documentation"
description = "Clan Documentation"
date = 2025-05-01T08:00:00+00:00
updated = 2021-05-01T08:00:00+00:00
sort_by = "weight"
weight = 1
template = "docs/section.html"
+++

View File

@ -1,25 +0,0 @@
+++
title = "Privacy Policy"
description = "We do not use cookies and we do not collect any personal data."
date = 2021-05-01T08:00:00+00:00
updated = 2020-05-01T08:00:00+00:00
draft = false
[extra]
class = "page single"
+++
__TL;DR__: We do not use cookies and we do not collect any personal data.
## Website visitors
- No personal information is collected.
- No information is stored in the browser.
- No information is shared with, sent to or sold to third-parties.
- No information is shared with advertising companies.
- No information is mined and harvested for personal and behavioral trends.
- No information is monetized.
## Contact us
[Contact us on Matrix](https://matrix.to/#/#clan:lassul.us) if you have any questions.

View File

@ -1,42 +0,0 @@
+++
title = "The Vision"
description = "The General Vision of this Project"
date = 2021-05-01T19:30:00+00:00
updated = 2021-05-01T19:30:00+00:00
draft = false
weight = 30
sort_by = "weight"
template = "section.html"
[extra]
section = "vision"
+++
Clan aims to offer a compelling alternative to the ever-increasing centralization of the internet.
### Decentralized Networking
Instead of relying on a centralized cloud accessible via the clearnet, our objective is to establish an encrypted network of interconnected computers, essentially creating a decentralized darknet, which we affectionately call a Clan.
### Seamless Access
Our vision includes providing users with a seamless experience when they join one or multiple Clans through invitation links. Clicking the link will trigger a popup that seeks confirmation to connect to the network.
### Effortless Integration
During the joining process, the user's computer (referred to as the client hereafter) will download a file containing information about a virtual machine (VM). The client will then automatically set up the VM, and once complete, this VM will become part of the Clan.
Users can also choose to seamlessly integrate the Clan configuration into their base system, effectively allowing the Clan admin(s) to remotely manage their system.
### Dashboard for Services
Once connected, users will have access to a dashboard displaying all the services offered within this specific Clan. Within this dashboard, users can easily add applications or decide to host services for fellow Clan members, such as a Nextcloud instance or backup endpoints.
### Decentralization and Redundancy
The core idea is to ensure service decentralization without a single point of failure. If one service fails, another machine within the Clan network can spin up a replacement service. VMs are designed to be lightweight, minimizing resource consumption.
### Administrative Control
Within a Clan, administrators define the configuration file and have control over who becomes part of the network.

View File

@ -8,9 +8,10 @@
}: {
devShells.default = pkgs.mkShell {
packages = [
pkgs.bashInteractive
pkgs.zola
];
shellHook = ''
ln -snf "$PWD"/static "$PWD"/website/static
'';
};
};
}

View File

@ -1,41 +0,0 @@
{
perSystem = {
lib,
pkgs,
self',
...
}: {
apps.new-post.program = builtins.toString (pkgs.writeShellScript "new-post.sh" ''
export PATH="${lib.makeBinPath [
pkgs.coreutils pkgs.gitMinimal
]}"
if [ -z "$1" ]; then
echo "Usage: new-post.sh <title>"
exit 1
fi
title=$(echo "$1" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')
root=$(git rev-parse --show-toplevel)
fname="$root/content/blog/$(date +%Y-%m-%d)-$title.md"
if [ -f "$fname" ]; then
echo "File already exists: $fname"
exit 1
fi
cat <<EOF > "$fname"
+++
title = "$1"
date = "$(date --iso-8601=seconds)"
draft = true
template = "blog/page.html"
[taxonomies]
authors = [] # TODO
[extra]
lead = "Some lead"
+++
Some text
EOF
echo "Created $fname"
git add "$fname"
'');
};
}

View File

@ -11,33 +11,14 @@
let
build =
baseUrl:
pkgs.runCommand "website" { buildInputs = [ pkgs.zola ]; } ''
pkgs.runCommand "website" { buildInputs = [ ]; } ''
mkdir -p $out
cp -r ${self}/* .
chmod -R u+w .
substituteInPlace config.toml --replace \
'base_url = "https://clan.lol"' \
'base_url = "${baseUrl}"' \
# generates a zola compatible .md from a clan-core/docs/**/*.md
generatePage() {
local sourceFile="$1"
local targetFile="$2"
# generate title by reading first non-empty line of $file and stripping all '#' symbols
title=$(sed -n '/./{p;q}' "$sourceFile" | sed 's/#*//g')
echo "generating page from clan-core: $title"
# generate header with title, template, weight to make zola happy
echo -e "+++\ntitle = \"$title\"\ntemplate = \"docs/page.html\"\nweight = 0\n+++" > "$targetFile"
# append everything from the file but remove header line starting with '#' and all preceding non-empty lines
tail -n +2 "$sourceFile" >> "$targetFile"
}
zola build
cp -r public/* public/.* $out
cp -r website/* website/.* $out
rm $out/static
cp -r static/ $out/static
'';
in
{
@ -47,7 +28,7 @@
packages.serve = pkgs.writeShellScriptBin "serve-local" ''
echo "serving: ${self'.packages.website-localhost}"
${pkgs.python3}/bin/python -m http.server 1111 \
-d ${self'.packages.website-localhost}
-d website
'';
};
}

View File

@ -5,11 +5,11 @@
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
"lastModified": 1714641030,
"narHash": "sha256-yzcRNDoyVP7+SCNX0wmuDju1NUCt8Dz9+lyUXEI0dbI=",
"lastModified": 1719994518,
"narHash": "sha256-pQMhCCHyQGRzdfAkdJ4cIWiw+JNuWsTX7f0ZYSyz0VY=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "e5d10a24b66c3ea8f150e47dfdb0416ab7c3390e",
"rev": "9227223f6d922fee3c7b190b2cc238a99527bbb7",
"type": "github"
},
"original": {
@ -20,11 +20,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1714906307,
"narHash": "sha256-UlRZtrCnhPFSJlDQE7M0eyhgvuuHBTe1eJ9N9AQlJQ0=",
"lastModified": 1720768451,
"narHash": "sha256-EYekUHJE2gxeo2pM/zM9Wlqw1Uw2XTJXOSAO79ksc4Y=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "25865a40d14b3f9cf19f19b924e2ab4069b09588",
"rev": "7e7c39ea35c5cdd002cd4588b03a3fb9ece6fad9",
"type": "github"
},
"original": {
@ -36,14 +36,14 @@
},
"nixpkgs-lib": {
"locked": {
"lastModified": 1714640452,
"narHash": "sha256-QBx10+k6JWz6u7VsohfSw8g8hjdBZEf8CFzXH1/1Z94=",
"lastModified": 1719876945,
"narHash": "sha256-Fm2rDDs86sHy0/1jxTOKB1118Q0O3Uc7EC0iXvXKpbI=",
"type": "tarball",
"url": "https://github.com/NixOS/nixpkgs/archive/50eb7ecf4cd0a5756d7275c8ba36790e5bd53e33.tar.gz"
"url": "https://github.com/NixOS/nixpkgs/archive/5daf0514482af3f97abaefc78a6606365c9108e2.tar.gz"
},
"original": {
"type": "tarball",
"url": "https://github.com/NixOS/nixpkgs/archive/50eb7ecf4cd0a5756d7275c8ba36790e5bd53e33.tar.gz"
"url": "https://github.com/NixOS/nixpkgs/archive/5daf0514482af3f97abaefc78a6606365c9108e2.tar.gz"
}
},
"root": {

View File

@ -12,7 +12,6 @@
imports = [
./flake-parts/deploy.nix
./flake-parts/devShells
./flake-parts/new-post.nix
./flake-parts/website.nix
];
perSystem = {pkgs, ...}: {

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
static/cLAN/cLAN--black.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 KiB

BIN
static/cLAN/cLAN--black.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

BIN
static/cLAN/cLAN--white.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

7823
static/cLAN/cLAN.ai Normal file

File diff suppressed because one or more lines are too long

BIN
static/cLAN/cLAN.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

7121
static/cLAN/cLAN.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 682 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 555 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 815 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 375 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 717 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
static/logo/128x128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 276 KiB

After

Width:  |  Height:  |  Size: 70 KiB

BIN
static/profiles/davhau.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
static/profiles/mic92.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 384 KiB

After

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

View File

@ -1,262 +0,0 @@
{% macro resource() %}
<link rel="preload" as="font" href="{{ get_url(path="fonts/vendor/jost/jost-v4-latin-regular.woff2") | safe }}" type="font/woff2" crossorigin>
<link rel="preload" as="font" href="{{ get_url(path="fonts/vendor/jost/jost-v4-latin-700.woff2") | safe }}" type="font/woff2" crossorigin>
{% endmacro %}
{% macro stylesheet() %}
<link rel="stylesheet" href="{{ get_url(path="main.css") | safe }}">
{% endmacro %}
{% macro favicons() %}
<meta name="theme-color" content="{{ config.extra.theme_color | default(value="#fff") }}">
<link class="favicon" rel="apple-touch-icon" sizes="180x180" href="{{ get_url(path="dark-favicon/128x128.png") | safe }}">
<link class="favicon" rel="icon" type="image/png" sizes="32x32" href="{{ get_url(path="dark-favicon/32x32.png") | safe }}">
<link class="favicon" rel="icon" type="image/png" sizes="16x16" href="{{ get_url(path="dark-favicon/16x16.png") | safe }}">
{% if not config.extra.is_netlify %}
<link rel="manifest" href="{{ get_url(path="site.webmanifest") | safe }}" crossorigin>
{% endif %}
{% endmacro %}
{# type: website or article, generally setting article for blog articles #}
{# page_images: using for the blog single template page #}
{# page_section: the blog single template page have to pass the parameter #}
{# is_404: using for the 404.html template #}
{% macro seo(
title="",
title_addition="",
description="",
type="website",
is_home=false,
is_404=false,
is_page=false,
page_images="",
page_section="",
created_time="2021-05-01T08:08:00+08:00",
updated_time="2021-05-01T08:08:08+08:00"
)
%}
{% if is_404 %}
<meta name="robots" content="noindex, follow">
{% else %}
<meta name="robots" content="index, follow">
<meta name="googlebot" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1">
<meta name="bingbot" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1">
{% endif %}
{% if current_url %}
{% set page_url = current_url %}
{% else %}
{% set page_url = get_url(path="404.html") %}
{% endif %}
{% if current_path %}
{% set page_path = current_path %}
{% else %}
{% set page_path = "/404.html" %}
{% endif %}
<title>{{ title ~ title_addition }}</title>
<meta name="description" content="{{ description }}">
<link rel="canonical" href="{{ page_url | safe }}">
{% if config.extra.open.enable %}
<meta name="twitter:card" content="summary_large_image">
{% if page.extra.images %}
{% for image in page.extra.images %}
<meta property="twitter:image" content="{{ get_url(path=image) | safe }}">
{% endfor %}
{% elif section.extra.images %}
{% for image in section.extra.images %}
<meta property="twitter:image" content="{{ get_url(path=image) | safe }}">
{% endfor %}
{% elif config.extra.open.image %}
<meta name="twitter:image" content="{{ config.base_url | safe }}/{{ config.extra.open.image }}">
{% endif %}
<meta name="twitter:title" content="{{ title }}">
<meta name="twitter:description" content="{{ description }}">
<meta name="twitter:site" content="@{{ config.extra.open.twitter_site }}">
<meta name="twitter:creator" content="@{{ config.extra.open.twitter_creator }}">
<meta property="og:title" content="{{ title }}">
<meta property="og:description" content="{{ description }}">
<meta property="og:type" content="{{ type }}">
<meta property="og:url" content="{{ page_url | safe }}">
{% if page.extra.images %}
{% for image in page.extra.images %}
<meta property="og:image" content="{{ get_url(path=image) | safe }}">
{% endfor %}
{% elif section.extra.images %}
{% for image in section.extra.images %}
<meta property="og:image" content="{{ get_url(path=image) | safe }}">
{% endfor %}
{% elif config.extra.open.image %}
<meta property="og:image" content="{{ config.base_url | safe }}/{{ config.extra.open.image }}">
{% endif %}
<meta property="og:updated_time" content="{{ updated_time }}">
<meta property="og:site_name" content="{{ title }}">
{% if config.extra.open.audio %}
<meta property="og:audio" content="{{ config.extra.open.audio }}">
{% endif %}
{% if config.extra.open.locale %}
<meta property="og:locale" content="{{ config.extra.open.locale }}">
{% endif %}
{% if config.extra.open.videos %}
{% for video in config.extra.open.videos %}
<meta property="og:video" content="{{ get_url(path=video) }}">
{% endfor %}
{% endif %}
<meta property="og:locale" content="{{ config.extra.open.og_locale }}">
{% endif %}
{% if is_home and config.extra.schema %}
{% if config.extra.schema.type == "Organization" %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"url": "{{ page_path | safe }}",
"name": "{{ title }}",
"logo": "{{ page_path | safe }}{{ config.extra.schema.logo }}",
"sameAs": [
{% if config.extra.schema.twitter %}"{{ config.extra.schema.twitter | safe }}",{% endif %}
{% if config.extra.schema.linked_in %}"{{ config.extra.schema.linked_in | safe }}",{% endif %}
{% if config.extra.schema.github %}"{{ config.extra.schema.github | safe }}"{% endif %}
]
}
</script>
{% endif %}
{% if config.extra.schema.type == "Person" %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"url": "{{ page_path | safe }}",
"name": "{{ title }}",
"sameAs": [
{% if config.extra.schema.twitter %}"{{ config.extra.schema.twitter | safe }}",{% endif %}
{% if config.extra.schema.linked_in %}"{{ config.extra.schema.linked_in | safe }}",{% endif %}
{% if config.extra.schema.github %}"{{ config.extra.schema.github | safe }}"{% endif %}
]
}
</script>
{% endif %}
{% if config.extra.schema.site_links_search_box %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"url": "{{ page_path | safe }}",
"potentialAction": {
"@type": "SearchAction",
"target": "{{ page_path | safe }}?q={search_term_string}",
"query-input": "required name=search_term_string"
}
}
</script>
{% endif %}
{% endif %}
{% if is_page and config.extra.schema.section %}
{% if config.extra.schema.section == page_section %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "{{ page_path | safe }}"
},
"headline": "{{ title }}",
"image": {{ page_images }},
"datePublished": "{{ created_time }}",
"dateModified": "{{ updated_time }}",
"author": {
"@type": "{{ config.extra.schema.type }}",
"name": "{{ title }}"
},
"publisher": {
"@type": "{{ config.extra.schema.type }}",
"name": "{{ title }}",
{% if config.extra.schema.type == "Organization" %}
"logo": {
"@type": "ImageObject",
"url": "{{ get_url(path=config.extra.schema.logo) | replace(from=config.base_url, to="") | safe }}"
}
{% endif %}
},
"description": "{{ description }}"
}
</script>
{% endif %}
{% endif %}
{% set url_prefix = get_url(path="/") | split(pat="://") | first %}
{% set url_main = get_url(path="/") | split(pat="://") | last %}
{% set url_item = url_prefix ~ "://" ~ url_main ~ "/" %}
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "BreadcrumbList",
{% if page_path == "/" %}
{
"@type": "ListItem",
"position": 1 ,
"name": "Home",
"item": "{{ url_item | safe }}"
},
{% else %}
{% set paths = page_path | trim_start_matches(pat="/") | trim_end_matches(pat="/") | split(pat="/") %}
{% for val in paths %}
{% set name_array = val | split(pat="-") %}
{% set_global str = "" %}
{% for val in name_array %}
{% set cap_val = val | capitalize %}
{% set_global str = str ~ cap_val ~ " " %}
{% endfor %}
{% set name = str | trim_end_matches(pat=" ") | title %}
{% if not index %}
{
"@type": "ListItem",
"position": 1 ,
"name": "Home",
"item": "{{ url_item | safe }}"
},
{% set_global index = 2 %}
{% set_global url_item = url_item ~ val ~ "/" %}
{
"@type": "ListItem",
"position": {{ index }} ,
"name": "{{ name }}",
"item": "{{ url_item | safe }}"
},
{% else %}
{% set_global index = index + 1 %}
{% set_global url_item = url_item ~ val ~ "/" %}
{
"@type": "ListItem",
"position": {{ index }} ,
"name": "{{ name }}",
"item": "{{ url_item | safe }}"
},
{% endif %}
{% endfor %}
{% endif %}
}
</script>
{% if config.extra.ganalytics %}
<script async src="https://www.googletagmanager.com/gtag/js?id={{config.extra.ganalytics}}"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '{{config.extra.ganalytics}}');
</script>
{% endif %}
{% endmacro %}

View File

@ -1,15 +0,0 @@
<div id="{{name}}" {% if class %}class="{{ class }}"{% endif %}>
<script src="{{ get_url(path='asciinema-player/asciinema-player.min.js') }}"></script>
<script>
AsciinemaPlayer.create('{{ get_url(path="videos/" ~ name) }}',
document.getElementById("{{name}}"), {
loop: true,
autoPlay: true,
controls: false,
speed: 1.5,
theme: "alabaster-auto"
});
</script>
</div>

View File

@ -1,6 +0,0 @@
<div {% if class %}class="{{ class }}"{% endif %}>
<video loop muted autoplay id="{{name}}">
<source src={{ get_url(path="videos/" ~ name) }} type="video/webm">
Your browser does not support the video tag.
</video>
</div>

View File

@ -1,3 +0,0 @@
public
.vs
.vscode

View File

@ -1,133 +0,0 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
<aaranxu@outlook.com>.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0].
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available
at [https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations

View File

@ -1,28 +0,0 @@
# Contributing
We'd love your help! Thanks for caring about the theme of Zola.
## Licensing
This repository is under the MIT license. You can find the full text of the [license](./LICENSE) in this repository.
## Code of Conduct
The AdiDoks theme has a [code of conduct](./CODE_OF_CONDUCT.md) that governs all sub-projects, including this one. Please respect it!
## Contribute to Doks
- Follow the [GitHub flow](https://guides.github.com/introduction/flow/).
- Follow the [Conventional Commits Specification](https://www.conventionalcommits.org/en/v1.0.0/)
## Create an issue
- [Bug report](https://github.com/aaranxu/adidoks/issues/new?template=bug-report---.md)
- [Feature request](https://github.com/aaranxu/adidoks/issues/new?template=feature-request---.md)
## Improve documentation
👉 The documentation lives in [`./content/docs/`](https://github.com/aaranxu/adidoks/tree/master/content/docs) of the [`adidoks` repository](https://github.com/h-enk/getdoks.org).
- Follow the [GitHub flow](https://guides.github.com/introduction/flow/).
- Follow the [Conventional Commits Specification](https://www.conventionalcommits.org/en/v1.0.0/)

View File

@ -1,20 +0,0 @@
The MIT License (MIT)
Copyright (c) 2021 Aaran Xu
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -1,177 +0,0 @@
# Zola Theme AdiDoks
AdiDoks is a modern documentation theme, which is a port of the Hugo
theme [Doks](https://github.com/h-enk/doks) for Zola.
## Demo
[Live Preview](https://adidoks.netlify.app/).
## Requirements
Before using the theme, you need to install the [Zola](https://www.getzola.org/documentation/getting-started/installation/) ≥ 0.15.0.
## Quick Start
```bash
git clone https://github.com/aaranxu/adidoks.git
cd adidoks
zola serve
# open http://127.0.0.1:1111/ in the browser
```
Read more from [the document of the AdiDoks](https://adidoks.org/docs/getting-started/introduction/).
## Installation
Just earlier we showed you how to run the theme directly. Now we start to
install the theme in an existing site step by step.
### Step 1: Create a new zola site
```bash
zola init mysite
```
### Step 2: Install AdiDoks
Download this theme to your themes directory:
```bash
cd mysite/themes
git clone https://github.com/aaranxu/adidoks.git
```
Or install as a submodule:
```bash
cd mysite
git init # if your project is a git repository already, ignore this command
git submodule add https://github.com/aaranxu/adidoks.git themes/adidoks
```
### Step 3: Configuration
Enable the theme in your `config.toml` in the site directory:
```toml
theme = "adidoks"
```
Or copy the `config.toml.example` from the theme directory to your project's
root directory:
```bash
cp themes/adidoks/config.toml.example config.toml
```
### Step 4: Add new content
You can copy the content from the theme directory to your project:
```bash
cp -r themes/adidoks/content .
```
You can modify or add new posts in the `content/blog`, `content/docs` or other
content directories as needed.
### Step 5: Run the project
Just run `zola serve` in the root path of the project:
```bash
zola serve
```
AdiDoks will start the Zola development web server accessible by default at
`http://127.0.0.1:1111`. Saved changes will live reload in the browser.
## Customisation
You can customize your configurations, templates and content for yourself. Look
at the `config.toml`, `theme.toml`, `content` files and templates files in this
repo for an idea.
### Global Configuration
There are some configuration options that you can customize in `config.toml`.
#### Configuration options before `extra` options
Set the authors's taxonomies for the site.
```toml
taxonomies = [
{name = "authors"},
]
```
Use search function for the content.
```toml
build_search_index = true
```
#### Configuration options under the `extra`
The following options should be under the `[extra]` in `config.toml`
- `language_code` - set HTML file language (default to `en-US`)
- `theme_color` - your site's HTML color (default to `#fff`)
- `title_separator` - the separator to your site title, like `|` and `-` (defaults to `|`)
- `title_addition` - the additon content for the title of the homepage
- `timeformat` - the timeformat for the blog article published date
- `timezone` - the timezone for the blog article published date
- `edit_page` (and `docs_repo`, `repo_branch`) - whether to show the edit page in the github repo for your docs
- `math` (and `library`) - set KaTeX or MathJax library
- `[extra.open]` - Open Graph + Twitter Cards for the site
- `[extra.schema]` - set JSON-LD for the site
- `[[extra.menu.main]]` - the header navigations for the site
- `[[extra.menu.social]]` - the social links on the header of the page
- `[extra.footer]` - the footer content on the left
- `[[extra.footer.nav]]` - the footer navigations on the right
### Templates
All pages are extend to the `base.html`, and you can customize them as need.
### Content
#### Homepage
Go to the *content/_index.md* file to add your own homepage content.
- `[extra]` - the main content of the homepage
- `[[extra.ist]]` - the lists' content of the homepage
#### Sections
Each section includes a `_index.md`, and you can customize it or add your new
section under the `content` folder.
#### Pages
There are mainly three types of pages in the site.
- `blog` - blog article
- `docs` - documentation article
- `authors` - authors page if you need to add some information for a new author
## Reporting Issues
We use GitHub Issues as the official bug tracker for the **AdiDoks**. Please
search [existing issues](https://github.com/aaranxu/adidoks/issues). Its
possible someone has already reported the same problem.
If your problem or idea is not addressed yet, [open a new issue](https://github.com/aaranxu/adidoks/issues/new).
## Contributing
We'd love your help! Please see [CONTRIBUTING.md](./CONTRIBUTING.md) to learn
about the kinds of contributions we're looking for.
## License
**AdiDoks** is distributed under the terms of the
[MIT license](https://github.com/aaranxu/adidoks/blob/main/LICENSE).

View File

@ -1,132 +0,0 @@
# The URL the site will be built for
base_url = "https://adidoks.netlify.com"
title = "AdiDoks"
description = "AdiDoks is a Zola theme helping you build modern documentation websites, which is a port of the Hugo theme Doks for Zola."
# The default language; used in feeds and search index
# Note: the search index doesn't support Chinese/Japanese/Korean Languages
default_language = "en"
# Whether to automatically compile all Sass files in the sass directory
compile_sass = true
# Whether to generate a feed file for the site
generate_feed = true
# When set to "true", the generated HTML files are minified.
minify_html = false
# The taxonomies to be rendered for the site and their configuration.
taxonomies = [
{name = "authors"}, # Basic definition: no feed or pagination
]
# Whether to build a search index to be used later on by a JavaScript library
# When set to "true", a search index is built from the pages and section
# content for `default_language`.
build_search_index = true
[languages.fi]
title="AdiDoks"
[search]
# Whether to include the title of the page/section in the index
include_title = true
# Whether to include the description of the page/section in the index
include_description = false
# Whether to include the rendered content of the page/section in the index
include_content = true
[markdown]
# Whether to do syntax highlighting.
# Theme can be customised by setting the `highlight_theme`
# variable to a theme supported by Zola
highlight_code = true
[extra]
# Put all your custom variables here
author = "Aaran Xu"
github = "https://github.com/aaranxu"
twitter = "https://twitter.com/aaranxu"
email = "aaranxu@outlook.com"
ganalytics = "" # Google Analytics code
# If running on netlify.app site, set to true
is_netlify = true
# Set HTML file language
language_code = "en-US"
# Set theme-color meta tag for Chrome browser
theme_color = "#fff"
# More about site's title
title_separator = "|" # set as |, -, _, etc
title_addition = "Modern Documentation Theme"
# Set date format in blog publish metadata
timeformat = "%Y-%m-%d %H:%M:%S" # e.g. 2021-05-01 09:19:42
timezone = "UTC"
# Edit page on reposity or not
edit_page = false
docs_repo = "https://github.com/aaranxu/adidoks"
repo_branch = "main"
## Math settings
# options: true, false. Enable math support globally,
# default: false. You can always enable math on a per page.
math = false
library = "katex" # options: "katex", "mathjax". default is "katex".
## Open Graph + Twitter Cards
[extra.open]
enable = true
# this image will be used as fallback if a page has no image of its own
image = "doks.png"
twitter_site = "aaranxu"
twitter_creator = "aaranxu"
facebook_author = "ichunyun"
facebook_publisher = "ichunyun"
og_locale = "en_US"
## JSON-LD
[extra.schema]
type = "Organization"
logo = "logo-doks.png"
twitter = "https://twitter.com/aaranxu"
linked_in = ""
github = "https://github.com/aaranxu"
section = "blog" # see config.extra.main~url
## Sitelinks Search Box
site_links_search_box = false
[[extra.menu.social]]
name = "Twitter"
pre = '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-twitter"><path d="M23 3a10.9 10.9 0 0 1-3.14 1.53 4.48 4.48 0 0 0-7.86 3v1A10.66 10.66 0 0 1 3 4s-4 9 5 13a11.64 11.64 0 0 1-7 2c9 5 20 0 20-11.5a4.5 4.5 0 0 0-.08-.83A7.72 7.72 0 0 0 23 3z"></path></svg>'
url = "https://twitter.com/aaranxu"
weight = 10
[[extra.menu.social]]
name = "GitHub"
pre = '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-github"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"></path></svg>'
url = "https://github.com/aaranxu/adidoks"
post = "v0.1.0"
weight = 20
# Footer contents
[extra.footer]
info = 'Powered by <a href="https://www.netlify.com/">Netlify</a>, <a href="https://www.getzola.org/">Zola</a>, and <a href="https://github.com/aaranxu/adidoks">AdiDoks</a>'
[[extra.footer.nav]]
name = "Privacy"
url = "/privacy-policy/"
weight = 10
[[extra.footer.nav]]
name = "Code of Conduct"
url = "/docs/contributing/code-of-conduct/"
weight = 20

View File

@ -1,143 +0,0 @@
# The URL the site will be built for
base_url = "https://adidoks.netlify.com"
title = "AdiDoks"
description = "AdiDoks is a Zola theme helping you build modern documentation websites, which is a port of the Hugo theme Doks for Zola."
# The site theme to use.
theme = "adidoks"
# The default language; used in feeds and search index
# Note: the search index doesn't support Chinese/Japanese/Korean Languages
default_language = "en"
# Whether to automatically compile all Sass files in the sass directory
compile_sass = true
# Whether to generate a feed file for the site
generate_feed = true
# When set to "true", the generated HTML files are minified.
minify_html = false
# The taxonomies to be rendered for the site and their configuration.
taxonomies = [
{name = "authors"}, # Basic definition: no feed or pagination
]
# Whether to build a search index to be used later on by a JavaScript library
# When set to "true", a search index is built from the pages and section
# content for `default_language`.
build_search_index = true
[search]
# Whether to include the title of the page/section in the index
include_title = true
# Whether to include the description of the page/section in the index
include_description = false
# Whether to include the rendered content of the page/section in the index
include_content = true
[markdown]
# Whether to do syntax highlighting.
# Theme can be customised by setting the `highlight_theme`
# variable to a theme supported by Zola
highlight_code = true
[extra]
# Put all your custom variables here
author = "Aaran Xu"
github = "https://github.com/aaranxu"
twitter = "https://twitter.com/aaranxu"
email = "aaranxu@outlook.com"
# If running on netlify.app site, set to true
is_netlify = true
# Set HTML file language
language_code = "en-US"
# Set theme-color meta tag for Chrome browser
theme_color = "#fff"
# More about site's title
title_separator = "|" # set as |, -, _, etc
title_addition = "Modern Documentation Theme"
# Set date format in blog publish metadata
timeformat = "%B %e, %Y" # e.g. June 14, 2021
timezone = "America/New_York"
# Edit page on reposity or not
edit_page = false
docs_repo = "https://github.com/aaranxu/adidoks"
repo_branch = "main"
## Math settings
# options: true, false. Enable math support globally,
# default: false. You can always enable math on a per page.
math = false
library = "katex" # options: "katex", "mathjax". default is "katex".
## Open Graph + Twitter Cards
[extra.open]
enable = true
# this image will be used as fallback if a page has no image of its own
image = "doks.png"
twitter_site = "aaranxu"
twitter_creator = "aaranxu"
facebook_author = "ichunyun"
facebook_publisher = "ichunyun"
og_locale = "en_US"
## JSON-LD
[extra.schema]
type = "Organization"
logo = "logo-doks.png"
twitter = "https://twitter.com/aaranxu"
linked_in = ""
github = "https://github.com/aaranxu"
section = "blog" # see config.extra.main~url
## Sitelinks Search Box
site_links_search_box = false
# Menu items
[[extra.menu.main]]
name = "Docs"
section = "docs"
url = "/docs/getting-started/introduction/"
weight = 10
[[extra.menu.main]]
name = "Blog"
section = "blog"
url = "/blog/"
weight = 20
[[extra.menu.social]]
name = "Twitter"
pre = '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-twitter"><path d="M23 3a10.9 10.9 0 0 1-3.14 1.53 4.48 4.48 0 0 0-7.86 3v1A10.66 10.66 0 0 1 3 4s-4 9 5 13a11.64 11.64 0 0 1-7 2c9 5 20 0 20-11.5a4.5 4.5 0 0 0-.08-.83A7.72 7.72 0 0 0 23 3z"></path></svg>'
url = "https://twitter.com/aaranxu"
weight = 10
[[extra.menu.social]]
name = "GitHub"
pre = '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-github"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"></path></svg>'
url = "https://github.com/aaranxu/adidoks"
post = "v0.1.0"
weight = 20
# Footer contents
[extra.footer]
info = 'Powered by <a href="https://www.netlify.com/">Netlify</a>, <a href="https://www.getzola.org/">Zola</a>, and <a href="https://github.com/aaranxu/adidoks">AdiDoks</a>'
[[extra.footer.nav]]
name = "Privacy"
url = "/privacy-policy/"
weight = 10
[[extra.footer.nav]]
name = "Code of Conduct"
url = "/docs/contributing/code-of-conduct/"
weight = 20

View File

@ -1,51 +0,0 @@
+++
title = "Nykyaikainen teema dokumentaatiolle"
# The homepage contents
[extra]
lead = '<b>AdiDoks</b> on nykyaikainen teema dokumentaatiosivustoille. Se on portattu Zolalle Hugo-teemasta nimeltä <a href="https://github.com/h-enk/">Doks</a>.'
url = "/docs/getting-started/introduction/"
url_button = "Aloita"
repo_version = "GitHub v0.1.0"
repo_license = "Open-source MIT License."
repo_url = "https://github.com/aaranxu/adidoks"
# Menu items
[[extra.menu.main]]
name = "Dokumentaatio"
section = "docs"
url = "/docs/getting-started/introduction/"
weight = 10
[[extra.menu.main]]
name = "Blogi"
section = "blog"
url = "/blog/"
weight = 20
[[extra.list]]
title = "Turvallisuustietoinen"
content = 'Saat A+-arvosanoja <a href="https://observatory.mozilla.org/analyze/adidoks.org">Mozilla Observatoryssä</a> suoraan. Voit vaihtaa turvallisuusheadereita tarpeidesi mukaan.'
[[extra.list]]
title = "Salamannopea ⚡️"
content = 'Saat hyvät pisteet <a href="https://googlechrome.github.io/lighthouse/viewer/?gist=7731347bb8ce999eff7428a8e763b637">Google Lighthousessa</a> defaultina. Doks poistaa tarpeettomat css:t, esinoutaa linkit, ja lataa kuvat laiskasti.'
[[extra.list]]
title = "SEO-valmis"
content = "Käytä järkeviä oletusarvoja rakenteiselle datalle, open graphille ja Twitter-korteille. Tai muunna SEO-asetukset mieleisiksesi helposti."
[[extra.list]]
title = "Fulltext-haku"
content = "Tee hakuja sivuillesi FlexSearchilla. Muuntele indeksointiasetuksia mieleisiksesi helposti."
[[extra.list]]
title = "Sivujen layoutit"
content = "Rakenna sivuja laskeutumisivun, blogisivun tai dokumentaatiolayoutin mukaan. Lisää osioita ja komponentteja tarpeen mukaan."
[[extra.list]]
title = "Dark mode"
content = "Vaihda hämärässä käytettävään käyttöliittymäteemaan nappia painamalla. Muuta värit muuttujilla vastaamaan brändiäsi."
+++

View File

@ -1,51 +0,0 @@
+++
title = "Modern Documentation Theme"
# The homepage contents
[extra]
lead = '<b>AdiDoks</b> is a modern documentation theme, which is a port of the Hugo theme <a href="https://github.com/h-enk/">Doks</a> for Zola.'
url = "/docs/getting-started/introduction/"
url_button = "Get started"
repo_version = "GitHub v0.1.0"
repo_license = "Open-source MIT License."
repo_url = "https://github.com/aaranxu/adidoks"
# Menu items
[[extra.menu.main]]
name = "Docs"
section = "docs"
url = "/docs/getting-started/introduction/"
weight = 10
[[extra.menu.main]]
name = "Blog"
section = "blog"
url = "/blog/"
weight = 20
[[extra.list]]
title = "Security aware"
content = 'Get A+ scores on <a href="https://observatory.mozilla.org/analyze/adidoks.org">Mozilla Observatory</a> out of the box. Easily change the default Security Headers to suit your needs.'
[[extra.list]]
title = "Fast by default ⚡️"
content = 'Get 100 scores on <a href="https://googlechrome.github.io/lighthouse/viewer/?gist=7731347bb8ce999eff7428a8e763b637">Google Lighthouse</a> by default. Doks removes unused css, prefetches links, and lazy loads images.'
[[extra.list]]
title = "SEO-ready"
content = "Use sensible defaults for structured data, open graph, and Twitter cards. Or easily change the SEO settings to your liking."
[[extra.list]]
title = "Full text search"
content = "Search your Doks site with FlexSearch. Easily customize index settings and search options to your liking."
[[extra.list]]
title = "Page layouts"
content = "Build pages with a landing page, blog, or documentation layout. Add custom sections and components to suit your needs."
[[extra.list]]
title = "Dark mode"
content = "Switch to a low-light UI with the click of a button. Change colors with variables to match your branding."
+++

View File

@ -1,18 +0,0 @@
+++
title = "Authors"
description = "The authurs of the blog articles."
date = 2021-04-01T08:00:00+00:00
updated = 2021-04-01T08:00:00+00:00
draft = false
# If add a new author page in this section, please add a new item,
# and the format is as follows:
#
# "author-name-in-url" = "the-full-path-of-the-author-page"
#
# Note: We use quoted keys here.
[extra.author_pages]
"aaran-xu" = "authors/aaran-xu.md"
+++
The authors of the blog articles.

View File

@ -1,11 +0,0 @@
+++
title = "Aaran Xu"
description = "Creator of AdiDoks."
date = 2021-04-01T08:50:45+00:00
updated = 2021-04-01T08:50:45+00:00
draft = false
+++
Creator of **AdiDoks**.
[@aaranxu](https://github.com/aaranxu)

View File

@ -1,7 +0,0 @@
+++
title = "Blog"
description = "Blog"
sort_by = "date"
paginate_by = 2
template = "blog/section.html"
+++

View File

@ -1,41 +0,0 @@
+++
title = "Hello World"
description = "Introducing Doks, a Hugo theme helping you build modern documentation websites that are secure, fast, and SEO-ready — by default."
date = 2021-05-01T09:19:42+00:00
updated = 2021-05-01T09:19:42+00:00
draft = false
template = "blog/page.html"
[taxonomies]
authors = ["Rustaceans"]
[extra]
lead = "This is the source code of the traditional <b>Hello World</b> program."
+++
```rust
// This is a comment, and is ignored by the compiler
// This is the main function
fn main() {
// Statements here are executed when the compiled binary is called
// Print text to the console
println!("Hello World!");
}
```
`println!` is a macro that prints text to the console.
A binary can be generated using the Rust compiler: `rustc`.
```bash
$ rustc hello.rs
```
`rustc` will produce a `hello` binary that can be executed.
```bash
$ ./hello
Hello World!
```

View File

@ -1,152 +0,0 @@
+++
title = "Markdown Syntax Guide"
description = "Sample article showcasing basic Markdown syntax and formatting for HTML elements."
date = 2021-04-20T09:19:42+00:00
updated = 2021-04-20T09:19:42+00:00
draft = false
template = "blog/page.html"
[taxonomies]
authors = ["Public"]
[extra]
lead = "This article offers a sample of basic Markdown syntax that can be used in Zola content files, also it shows whether basic HTML elements are decorated with CSS in a Zola theme."
+++
## Headings
The following HTML `<h1>`—`<h6>` elements represent six levels of section
headings. `<h1>` is the highest section level while `<h6>` is the lowest.
# H1
## H2
### H3
#### H4
##### H5
###### H6
## Paragraph
Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum,
voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma
dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as
cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin
porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur?
Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit
ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda
veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore
eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata
tiustia prat.
Itatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne
sapicia is sinveli squiatum, core et que aut hariosam ex eat.
## Blockquotes
The blockquote element represents content that is quoted from another source,
optionally with a citation which must be within a `footer` or `cite` element,
and optionally with in-line changes such as annotations and abbreviations.
#### Blockquote without attribution
> Tiam, ad mint andaepu dandae nostion secatur sequo quae.
> **Note** that you can use *Markdown syntax* within a blockquote.
#### Blockquote with attribution
> Don't communicate by sharing memory, share memory by communicating.<br>
> — <cite>Rob Pike[^1]</cite>
> All men by nature desire to know.<br>
> ― <cite>Aristotle[^2]</cite>
## Tables
Tables aren't part of the core Markdown spec, but Zola supports them
out-of-the-box.
Name | Age
--------|------
Bob | 27
Alice | 23
#### Inline Markdown within tables
| Italics | Bold | Code |
| -------- | -------- | ------ |
| *italics* | **bold** | `code` |
## Code Blocks
#### Code block with backticks
```html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Example HTML5 Document</title>
</head>
<body>
<p>Test</p>
</body>
</html>
```
#### Code block indented with four spaces
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Example HTML5 Document</title>
</head>
<body>
<p>Test</p>
</body>
</html>
## List Types
#### Ordered List
1. First item
2. Second item
3. Third item
#### Unordered List
- List item
- Another item
- And another item
#### Nested list
- Fruit
- Apple
- Orange
- Banana
- Dairy
- Milk
- Cheese
## Other Elements — abbr, sub, sup, kbd, mark
<abbr title="Graphics Interchange Format">GIF</abbr> is a bitmap image format.
H<sub>2</sub>O
X<sup>n</sup> + Y<sup>n</sup> = Z<sup>n</sup>
Press <kbd><kbd>CTRL</kbd>+<kbd>ALT</kbd>+<kbd>Delete</kbd></kbd> to end the
session.
Most <mark>salamanders</mark> are nocturnal, and hunt for insects, worms, and
other small creatures.
---
<!-- Note: There must be a blank line between every two lines of the footnote difinition. -->
[^1]: The above quote is excerpted from Rob Pike's [talk](https://www.youtube.com/watch?v=PAAkCSZUG1c)
during Gopherfest, November 18, 2015.
[^2]: The quote is the first sentence of Aristotle's [Metaphysics](http://classics.mit.edu/Aristotle/metaphysics.html).

View File

@ -1,48 +0,0 @@
+++
title = "Math Typesetting"
description = "Introducing Doks, a Hugo theme helping you build modern documentation websites that are secure, fast, and SEO-ready — by default."
date = 2021-04-08T09:19:42+00:00
updated = 2021-04-08T09:19:42+00:00
draft = false
template = "blog/page.html"
[taxonomies]
authors = ["Public"]
[extra]
lead = "Mathematical notation in a project can be enabled by using third party JavaScript libraries."
math = true
+++
In this example we will be using [KaTeX](https://katex.org/)
- Create a macro under `/template/macros/math.html` with a macro named `math`.
- Within this macro reference the [Auto-render Extension](https://katex.org/docs/autorender.html) or host these scripts locally.
- Import the macro in your templates like so:
```bash
{% import 'macros/math.html' as macros %}
{% if page.extra.math or section.extra.math or config.extra.math %}
{{ macros::math() }}
{% endif %}
```
- To enable KaTex globally set the parameter `extra.math` to `true` in a project's configuration
- To enable KaTex on a per page basis include the parameter `extra.math = true` in content files
**Note:**
1. The MathJax library is the other optional choice, and you can set the parameter `extra.library` to `mathjax` in a project's configuration
2. Use the online reference of [Supported TeX Functions](https://katex.org/docs/supported.html)
### Examples
<p>
Inline math: \(\varphi = \dfrac{1+\sqrt5}{2}= 1.6180339887…\)
</p>
Block math:
$$
\varphi = 1+\frac{1} {1+\frac{1} {1+\frac{1} {1+\cdots} } }
$$

View File

@ -1,62 +0,0 @@
+++
title = "Placeholder Text"
description = "Lorem Ipsum Dolor Si Amet"
date = 2021-04-10T09:19:42+00:00
updated = 2021-04-10T09:19:42+00:00
draft = false
template = "blog/page.html"
[taxonomies]
authors = ["Public"]
+++
Lorem est tota propiore conpellat pectoribus de pectora summo. <!--more-->Redit
teque digerit hominumque toris verebor lumina non cervice subde tollit usus
habet Arctonque, furores quas nec ferunt. Quoque montibus nunc caluere tempus
inhospita parcite confusaque translucet patri vestro qui optatis lumine
cognoscere flos nubis! Fronde ipsamque patulos Dryopen deorum.
1. Exierant elisi ambit vivere dedere
2. Duce pollice
3. Eris modo
4. Spargitque ferrea quos palude
Rursus nulli murmur; hastile inridet ut ab gravi sententia! Nomine potitus
silentia flumen, sustinet placuit petis in dilapsa erat sunt. Atria tractus malis.
1. Comas hunc haec pietate fetum procerum dixit
2. Post torum vates letum Tiresia
3. Flumen querellas
4. Arcanaque montibus omnes
5. Quidem et
# Vagus elidunt
<svg class="canon" xmlns="http://www.w3.org/2000/svg" overflow="visible" viewBox="0 0 496 373" height="373" width="496"><g fill="none"><path stroke="#000" stroke-width=".75" d="M.599 372.348L495.263 1.206M.312.633l494.95 370.853M.312 372.633L247.643.92M248.502.92l246.76 370.566M330.828 123.869V1.134M330.396 1.134L165.104 124.515"></path><path stroke="#ED1C24" stroke-width=".75" d="M275.73 41.616h166.224v249.05H275.73zM54.478 41.616h166.225v249.052H54.478z"></path><path stroke="#000" stroke-width=".75" d="M.479.375h495v372h-495zM247.979.875v372"></path><ellipse cx="498.729" cy="177.625" rx=".75" ry="1.25"></ellipse><ellipse cx="247.229" cy="377.375" rx=".75" ry="1.25"></ellipse></g></svg>
[The Van de Graaf Canon](https://en.wikipedia.org/wiki/Canons_of_page_construction#Van_de_Graaf_canon)
## Mane refeci capiebant unda mulcebat
Victa caducifer, malo vulnere contra dicere aurato, ludit regale, voca! Retorsit
colit est profanae esse virescere furit nec; iaculi matertera et visa est,
viribus. Divesque creatis, tecta novat collumque vulnus est, parvas.
**Faces illo pepulere** tempus adest. Tendit flamma, ab opes virum sustinet,
sidus sequendo urbis.
Iubar proles corpore raptos vero auctor imperium; sed et huic: manus caeli
Lelegas tu lux. Verbis obstitit intus oblectamina fixis linguisque ausus sperare
Echionides cornuaque tenent clausit possit. Omnia putatur. Praeteritae refert
ausus; ferebant e primus lora nutat, vici quae mea ipse. Et iter nil spectatae
vulnus haerentia iuste et exercebat, sui et.
Eurytus Hector, materna ipsumque ut Politen, nec, nate, ignari, vernum cohaesit
sequitur. Vel **mitis temploque** vocatus, inque alis, *oculos nomen* non silvis
corpore coniunx ne displicet illa. Crescunt non unus, vidit visa quantum inmiti
flumina mortis facto sic: undique a alios vincula sunt iactata abdita!
Suspenderat ego fuit tendit: luna, ante urbem Propoetides **parte**.
<style>
.canon { background: white; width: 100%; height: auto; }
</style>

View File

@ -1,15 +0,0 @@
+++
title = "Say hello to AdiDoks 👋"
description = "Introducing AdiDoks, a Zola theme helping you build modern documentation websites, which is a port of the Hugo theme Doks for Zola."
date = 2021-04-03T07:00:00+00:00
updated = 2021-04-03T07:00:00+00:00
template = "blog/page.html"
draft = false
[taxonomies]
authors = ["Aaran Xu"]
[extra]
lead = 'Introducing AdiDoks, a Zola theme helping you build modern documentation websites, which is a port of the Hugo theme <a href="https://github.com/h-enk/doks">Doks</a> for Zola.'
images = []
+++

View File

@ -1,9 +0,0 @@
+++
title = "Docs"
description = "The documents of the AdiDoks theme."
date = 2025-05-01T08:00:00+00:00
updated = 2021-05-01T08:00:00+00:00
sort_by = "weight"
weight = 1
template = "docs/section.html"
+++

View File

@ -1,10 +0,0 @@
+++
title = "Contributing"
description = "Find out how to contribute to AdiDoks."
date = 2025-05-01T18:00:00+00:00
updated = 2021-05-01T18:00:00+00:00
template = "docs/section.html"
sort_by = "weight"
weight = 4
draft = false
+++

View File

@ -1,146 +0,0 @@
+++
title = "Code of Conduct"
description = "Contributor Covenant Code of Conduct."
date = 2021-05-01T18:20:00+00:00
updated = 2021-05-01T18:20:00+00:00
draft = false
weight = 420
sort_by = "weight"
template = "docs/page.html"
[extra]
lead = "Contributor Covenant Code of Conduct."
toc = true
top = false
+++
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
<aaranxu@outlook.com>.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0].
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available
at [https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations

View File

@ -1,37 +0,0 @@
+++
title = "How to Contribute"
description = "Contribute to AdiDoks, improve documentation, or submit to showcase."
date = 2021-05-01T18:10:00+00:00
updated = 2021-05-01T18:10:00+00:00
draft = false
weight = 410
sort_by = "weight"
template = "docs/page.html"
[extra]
lead = "Contribute to AdiDoks, improve documentation, or submit to showcase."
toc = true
top = false
+++
👉 Make sure to read the [Code of Conduct](../code-of-conduct/).
## Contribute to Doks
👉 The AdiDoks code lives in the [`adidoks` repository](https://github.com/aaranxu/adidoks)
- Follow the [GitHub flow](https://guides.github.com/introduction/flow/).
- Follow the [Conventional Commits Specification](https://www.conventionalcommits.org/en/v1.0.0/)
### Create an issue
- [Bug report](https://github.com/aaranxu/adidoks/issues/new?template=bug-report---.md)
- [Feature request](https://github.com/aaranxu/adidoks/issues/new?template=feature-request---.md)
## Improve documentation
👉 The documentation lives in [`./content/docs/`](https://github.com/aaranxu/adidoks/tree/master/content/docs)
of the [`adidoks` repository](https://github.com/h-enk/getdoks.org).
- Follow the [GitHub flow](https://guides.github.com/introduction/flow/).
- Follow the [Conventional Commits Specification](https://www.conventionalcommits.org/en/v1.0.0/)

View File

@ -1,10 +0,0 @@
+++
title = "Getting Started"
description = "Quick start and guides for installing the AdiDoks theme on your preferred operating system."
date = 2025-05-01T08:00:00+00:00
updated = 2021-05-01T08:00:00+00:00
template = "docs/section.html"
sort_by = "weight"
weight = 1
draft = false
+++

View File

@ -1,31 +0,0 @@
+++
title = "Introduction"
description = "AdiDoks is a Zola theme helping you build modern documentation websites, which is a port of the Hugo theme Doks for Zola."
date = 2021-05-01T08:00:00+00:00
updated = 2021-05-01T08:00:00+00:00
draft = false
weight = 10
sort_by = "weight"
template = "docs/page.html"
[extra]
lead = 'AdiDoks is a Zola theme helping you build modern documentation websites, which is a port of the Hugo theme <a href="https://github.com/h-enk/doks">Doks</a> for Zola.'
toc = true
top = false
+++
## Quick Start
One page summary of how to start a new AdiDoks project. [Quick Start →](../quick-start/)
## Go further
Contributing and Help.
## Contributing
Find out how to contribute to Doks. [Contributing →](../../contributing/how-to-contribute/)
## Help
Get help on Doks. [Help →](../../help/faq/)

View File

@ -1,94 +0,0 @@
+++
title = "Quick Start"
description = "One page summary of how to start a new AdiDoks project."
date = 2021-05-01T08:20:00+00:00
updated = 2021-05-01T08:20:00+00:00
draft = false
weight = 20
sort_by = "weight"
template = "docs/page.html"
[extra]
lead = "One page summary of how to start a new AdiDoks project."
toc = true
top = false
+++
## Requirements
Before using the theme, you need to install the [Zola](https://www.getzola.org/documentation/getting-started/installation/) ≥ 0.15.0.
## Run the Theme Directly
```bash
git clone https://github.com/aaranxu/adidoks.git
cd adidoks
zola serve
```
Visit `http://127.0.0.1:1111/` in the browser.
## Installation
Just earlier we showed you how to run the theme directly. Now we start to
install the theme in an existing site step by step.
### Step 1: Create a new zola site
```bash
zola init mysite
```
### Step 2: Install AdiDoks
Download this theme to your themes directory:
```bash
cd mysite/themes
git clone https://github.com/aaranxu/adidoks.git
```
Or install as a submodule:
```bash
cd mysite
git init # if your project is a git repository already, ignore this command
git submodule add https://github.com/aaranxu/adidoks.git themes/adidoks
```
### Step 3: Configuration
Enable the theme in your `config.toml` in the site derectory:
```toml
theme = "adidoks"
```
Or copy the `config.toml.example` from the theme directory to your project's
root directory:
```bash
cp themes/adidoks/config.toml.example config.toml
```
### Step 4: Add new content
You can copy the content from the theme directory to your project:
```bash
cp -r themes/adidoks/content .
```
You can modify or add new posts in the `content/blog`, `content/docs` or other
content directories as needed.
### Step 5: Run the project
Just run `zola serve` in the root path of the project:
```bash
zola serve
```
AdiDoks will start the Zola development web server accessible by default at
`http://127.0.0.1:1111`. Saved changes will live reload in the browser.

View File

@ -1,10 +0,0 @@
+++
title = "Help"
description = "Get help on AdiDoks."
date = 2025-05-01T19:00:00+00:00
updated = 2021-05-01T19:00:00+00:00
template = "docs/section.html"
sort_by = "weight"
weight = 5
draft = false
+++

View File

@ -1,39 +0,0 @@
+++
title = "FAQ"
description = "Answers to frequently asked questions."
date = 2021-05-01T19:30:00+00:00
updated = 2021-05-01T19:30:00+00:00
draft = false
weight = 30
sort_by = "weight"
template = "docs/page.html"
[extra]
lead = "Answers to frequently asked questions."
toc = true
top = false
+++
## What is the AdiDoks?
AdiDoks is a Zola theme for Documentation's sites, ported by the Hugo Theme
[Doks](https://getdoks.org), which is a pretty nice theme. Thanks a lot to
[*h-enk*](https://github.com/h-enk), the creator of the [Doks](https://getdoks.org).
## Keyboard shortcuts for search?
- focus: `/`
- select: `↓` and `↑`
- open: `Enter`
- close: `Esc`
## Other documentation?
- [Netlify](https://docs.netlify.com/)
- [Zola](https://www.getzola.org/documentation/getting-started/overview/)
## Contact the creator?
Send *Aaran Xu* an E-mail:
- <aaranxu@outlook.com>

View File

@ -1,27 +0,0 @@
+++
title = "Privacy Policy"
description = "We do not use cookies and we do not collect any personal data."
date = 2021-05-01T08:00:00+00:00
updated = 2020-05-01T08:00:00+00:00
draft = false
[extra]
class = "page single"
+++
__TLDR__: We do not use cookies and we do not collect any personal data.
## Website visitors
- No personal information is collected.
- No information is stored in the browser.
- No information is shared with, sent to or sold to third-parties.
- No information is shared with advertising companies.
- No information is mined and harvested for personal and behavioral trends.
- No information is monetized.
## Contact us
[Contact us](https://github.com/aaranxu/adidoks) if you have any questions.
Effective Date: _1st May 2021_

View File

@ -1,9 +0,0 @@
[build]
publish = "public"
command = "zola build"
[build.environment]
ZOLA_VERSION = "0.15.0"
[context.deploy-preview]
command = "zola build --base-url $DEPLOY_PRIME_URL"

View File

@ -1,22 +0,0 @@
The MIT License (MIT)
Copyright (c) 2011-2021 Twitter, Inc.
Copyright (c) 2011-2021 The Bootstrap Authors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -1,239 +0,0 @@
<p align="center">
<a href="https://getbootstrap.com/">
<img src="https://getbootstrap.com/docs/5.0/assets/brand/bootstrap-logo-shadow.png" alt="Bootstrap logo" width="200" height="165">
</a>
</p>
<h3 align="center">Bootstrap</h3>
<p align="center">
Sleek, intuitive, and powerful front-end framework for faster and easier web development.
<br>
<a href="https://getbootstrap.com/docs/5.0/"><strong>Explore Bootstrap docs »</strong></a>
<br>
<br>
<a href="https://github.com/twbs/bootstrap/issues/new?template=bug_report.md">Report bug</a>
·
<a href="https://github.com/twbs/bootstrap/issues/new?template=feature_request.md">Request feature</a>
·
<a href="https://themes.getbootstrap.com/">Themes</a>
·
<a href="https://blog.getbootstrap.com/">Blog</a>
</p>
## Bootstrap 4
Our default branch is for development of our upcoming Bootstrap 5 release. Head to the [`v4-dev` branch](https://github.com/twbs/bootstrap/tree/v4-dev) to view the readme, documentation, and source code for Bootstrap 4.
## Table of contents
- [Quick start](#quick-start)
- [Status](#status)
- [What's included](#whats-included)
- [Bugs and feature requests](#bugs-and-feature-requests)
- [Documentation](#documentation)
- [Contributing](#contributing)
- [Community](#community)
- [Versioning](#versioning)
- [Creators](#creators)
- [Thanks](#thanks)
- [Copyright and license](#copyright-and-license)
## Quick start
Several quick start options are available:
- [Download the latest release](https://github.com/twbs/bootstrap/archive/v5.0.0-beta3.zip)
- Clone the repo: `git clone https://github.com/twbs/bootstrap.git`
- Install with [npm](https://www.npmjs.com/): `npm install bootstrap@next`
- Install with [yarn](https://yarnpkg.com/): `yarn add bootstrap@next`
- Install with [Composer](https://getcomposer.org/): `composer require twbs/bootstrap:5.0.0-beta3`
- Install with [NuGet](https://www.nuget.org/): CSS: `Install-Package bootstrap` Sass: `Install-Package bootstrap.sass`
Read the [Getting started page](https://getbootstrap.com/docs/5.0/getting-started/introduction/) for information on the framework contents, templates and examples, and more.
## Status
[![Slack](https://bootstrap-slack.herokuapp.com/badge.svg)](https://bootstrap-slack.herokuapp.com/)
[![Build Status](https://img.shields.io/github/workflow/status/twbs/bootstrap/JS%20Tests/main?label=JS%20Tests&logo=github)](https://github.com/twbs/bootstrap/actions?query=workflow%3AJS+Tests+branch%3Amain)
[![npm version](https://img.shields.io/npm/v/bootstrap)](https://www.npmjs.com/package/bootstrap)
[![Gem version](https://img.shields.io/gem/v/bootstrap)](https://rubygems.org/gems/bootstrap)
[![Meteor Atmosphere](https://img.shields.io/badge/meteor-twbs%3Abootstrap-blue)](https://atmospherejs.com/twbs/bootstrap)
[![Packagist Prerelease](https://img.shields.io/packagist/vpre/twbs/bootstrap)](https://packagist.org/packages/twbs/bootstrap)
[![NuGet](https://img.shields.io/nuget/vpre/bootstrap)](https://www.nuget.org/packages/bootstrap/absoluteLatest)
[![peerDependencies Status](https://img.shields.io/david/peer/twbs/bootstrap)](https://david-dm.org/twbs/bootstrap?type=peer)
[![devDependency Status](https://img.shields.io/david/dev/twbs/bootstrap)](https://david-dm.org/twbs/bootstrap?type=dev)
[![Coverage Status](https://img.shields.io/coveralls/github/twbs/bootstrap/main)](https://coveralls.io/github/twbs/bootstrap?branch=main)
[![CSS gzip size](https://img.badgesize.io/twbs/bootstrap/main/dist/css/bootstrap.min.css?compression=gzip&label=CSS%20gzip%20size)](https://github.com/twbs/bootstrap/blob/main/dist/css/bootstrap.min.css)
[![CSS Brotli size](https://img.badgesize.io/twbs/bootstrap/main/dist/css/bootstrap.min.css?compression=brotli&label=CSS%20Brotli%20size)](https://github.com/twbs/bootstrap/blob/main/dist/css/bootstrap.min.css)
[![JS gzip size](https://img.badgesize.io/twbs/bootstrap/main/dist/js/bootstrap.min.js?compression=gzip&label=JS%20gzip%20size)](https://github.com/twbs/bootstrap/blob/main/dist/js/bootstrap.min.js)
[![JS Brotli size](https://img.badgesize.io/twbs/bootstrap/main/dist/js/bootstrap.min.js?compression=brotli&label=JS%20Brotli%20size)](https://github.com/twbs/bootstrap/blob/main/dist/js/bootstrap.min.js)
[![BrowserStack Status](https://www.browserstack.com/automate/badge.svg?badge_key=SkxZcStBeExEdVJqQ2hWYnlWckpkNmNEY213SFp6WHFETWk2bGFuY3pCbz0tLXhqbHJsVlZhQnRBdEpod3NLSDMzaHc9PQ==--3d0b75245708616eb93113221beece33e680b229)](https://www.browserstack.com/automate/public-build/SkxZcStBeExEdVJqQ2hWYnlWckpkNmNEY213SFp6WHFETWk2bGFuY3pCbz0tLXhqbHJsVlZhQnRBdEpod3NLSDMzaHc9PQ==--3d0b75245708616eb93113221beece33e680b229)
[![Backers on Open Collective](https://img.shields.io/opencollective/backers/bootstrap)](#backers)
[![Sponsors on Open Collective](https://img.shields.io/opencollective/sponsors/bootstrap)](#sponsors)
## What's included
Within the download you'll find the following directories and files, logically grouping common assets and providing both compiled and minified variations. You'll see something like this:
```text
bootstrap/
├── css/
│ ├── bootstrap-grid.css
│ ├── bootstrap-grid.css.map
│ ├── bootstrap-grid.min.css
│ ├── bootstrap-grid.min.css.map
│ ├── bootstrap-grid.rtl.css
│ ├── bootstrap-grid.rtl.css.map
│ ├── bootstrap-grid.rtl.min.css
│ ├── bootstrap-grid.rtl.min.css.map
│ ├── bootstrap-reboot.css
│ ├── bootstrap-reboot.css.map
│ ├── bootstrap-reboot.min.css
│ ├── bootstrap-reboot.min.css.map
│ ├── bootstrap-reboot.rtl.css
│ ├── bootstrap-reboot.rtl.css.map
│ ├── bootstrap-reboot.rtl.min.css
│ ├── bootstrap-reboot.rtl.min.css.map
│ ├── bootstrap-utilities.css
│ ├── bootstrap-utilities.css.map
│ ├── bootstrap-utilities.min.css
│ ├── bootstrap-utilities.min.css.map
│ ├── bootstrap-utilities.rtl.css
│ ├── bootstrap-utilities.rtl.css.map
│ ├── bootstrap-utilities.rtl.min.css
│ ├── bootstrap-utilities.rtl.min.css.map
│ ├── bootstrap.css
│ ├── bootstrap.css.map
│ ├── bootstrap.min.css
│ ├── bootstrap.min.css.map
│ ├── bootstrap.rtl.css
│ ├── bootstrap.rtl.css.map
│ ├── bootstrap.rtl.min.css
│ └── bootstrap.rtl.min.css.map
└── js/
├── bootstrap.bundle.js
├── bootstrap.bundle.js.map
├── bootstrap.bundle.min.js
├── bootstrap.bundle.min.js.map
├── bootstrap.esm.js
├── bootstrap.esm.js.map
├── bootstrap.esm.min.js
├── bootstrap.esm.min.js.map
├── bootstrap.js
├── bootstrap.js.map
├── bootstrap.min.js
└── bootstrap.min.js.map
```
We provide compiled CSS and JS (`bootstrap.*`), as well as compiled and minified CSS and JS (`bootstrap.min.*`). [source maps](https://developers.google.com/web/tools/chrome-devtools/javascript/source-maps) (`bootstrap.*.map`) are available for use with certain browsers' developer tools. Bundled JS files (`bootstrap.bundle.js` and minified `bootstrap.bundle.min.js`) include [Popper](https://popper.js.org/).
## Bugs and feature requests
Have a bug or a feature request? Please first read the [issue guidelines](https://github.com/twbs/bootstrap/blob/main/.github/CONTRIBUTING.md#using-the-issue-tracker) and search for existing and closed issues. If your problem or idea is not addressed yet, [please open a new issue](https://github.com/twbs/bootstrap/issues/new).
## Documentation
Bootstrap's documentation, included in this repo in the root directory, is built with [Hugo](https://gohugo.io/) and publicly hosted on GitHub Pages at <https://getbootstrap.com/>. The docs may also be run locally.
Documentation search is powered by [Algolia's DocSearch](https://community.algolia.com/docsearch/). Working on our search? Be sure to set `debug: true` in `site/assets/js/search.js`.
### Running documentation locally
1. Run `npm install` to install the Node.js dependencies, including Hugo (the site builder).
2. Run `npm run test` (or a specific npm script) to rebuild distributed CSS and JavaScript files, as well as our docs assets.
3. From the root `/bootstrap` directory, run `npm run docs-serve` in the command line.
4. Open `http://localhost:9001/` in your browser, and voilà.
Learn more about using Hugo by reading its [documentation](https://gohugo.io/documentation/).
### Documentation for previous releases
You can find all our previous releases docs on <https://getbootstrap.com/docs/versions/>.
[Previous releases](https://github.com/twbs/bootstrap/releases) and their documentation are also available for download.
## Contributing
Please read through our [contributing guidelines](https://github.com/twbs/bootstrap/blob/main/.github/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development.
Moreover, if your pull request contains JavaScript patches or features, you must include [relevant unit tests](https://github.com/twbs/bootstrap/tree/main/js/tests). All HTML and CSS should conform to the [Code Guide](https://github.com/mdo/code-guide), maintained by [Mark Otto](https://github.com/mdo).
Editor preferences are available in the [editor config](https://github.com/twbs/bootstrap/blob/main/.editorconfig) for easy use in common text editors. Read more and download plugins at <https://editorconfig.org/>.
## Community
Get updates on Bootstrap's development and chat with the project maintainers and community members.
- Follow [@getbootstrap on Twitter](https://twitter.com/getbootstrap).
- Read and subscribe to [The Official Bootstrap Blog](https://blog.getbootstrap.com/).
- Join [the official Slack room](https://bootstrap-slack.herokuapp.com/).
- Chat with fellow Bootstrappers in IRC. On the `irc.freenode.net` server, in the `##bootstrap` channel.
- Implementation help may be found at Stack Overflow (tagged [`bootstrap-5`](https://stackoverflow.com/questions/tagged/bootstrap-5)).
- Developers should use the keyword `bootstrap` on packages which modify or add to the functionality of Bootstrap when distributing through [npm](https://www.npmjs.com/browse/keyword/bootstrap) or similar delivery mechanisms for maximum discoverability.
## Versioning
For transparency into our release cycle and in striving to maintain backward compatibility, Bootstrap is maintained under [the Semantic Versioning guidelines](https://semver.org/). Sometimes we screw up, but we adhere to those rules whenever possible.
See [the Releases section of our GitHub project](https://github.com/twbs/bootstrap/releases) for changelogs for each release version of Bootstrap. Release announcement posts on [the official Bootstrap blog](https://blog.getbootstrap.com/) contain summaries of the most noteworthy changes made in each release.
## Creators
**Mark Otto**
- <https://twitter.com/mdo>
- <https://github.com/mdo>
**Jacob Thornton**
- <https://twitter.com/fat>
- <https://github.com/fat>
## Thanks
<a href="https://www.browserstack.com/">
<img src="https://live.browserstack.com/images/opensource/browserstack-logo.svg" alt="BrowserStack Logo" width="192" height="42">
</a>
Thanks to [BrowserStack](https://www.browserstack.com/) for providing the infrastructure that allows us to test in real browsers!
## Sponsors
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/bootstrap#sponsor)]
[![OC sponsor 0](https://opencollective.com/bootstrap/sponsor/0/avatar.svg)](https://opencollective.com/bootstrap/sponsor/0/website)
[![OC sponsor 1](https://opencollective.com/bootstrap/sponsor/1/avatar.svg)](https://opencollective.com/bootstrap/sponsor/1/website)
[![OC sponsor 2](https://opencollective.com/bootstrap/sponsor/2/avatar.svg)](https://opencollective.com/bootstrap/sponsor/2/website)
[![OC sponsor 3](https://opencollective.com/bootstrap/sponsor/3/avatar.svg)](https://opencollective.com/bootstrap/sponsor/3/website)
[![OC sponsor 4](https://opencollective.com/bootstrap/sponsor/4/avatar.svg)](https://opencollective.com/bootstrap/sponsor/4/website)
[![OC sponsor 5](https://opencollective.com/bootstrap/sponsor/5/avatar.svg)](https://opencollective.com/bootstrap/sponsor/5/website)
[![OC sponsor 6](https://opencollective.com/bootstrap/sponsor/6/avatar.svg)](https://opencollective.com/bootstrap/sponsor/6/website)
[![OC sponsor 7](https://opencollective.com/bootstrap/sponsor/7/avatar.svg)](https://opencollective.com/bootstrap/sponsor/7/website)
[![OC sponsor 8](https://opencollective.com/bootstrap/sponsor/8/avatar.svg)](https://opencollective.com/bootstrap/sponsor/8/website)
[![OC sponsor 9](https://opencollective.com/bootstrap/sponsor/9/avatar.svg)](https://opencollective.com/bootstrap/sponsor/9/website)
## Backers
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/bootstrap#backer)]
[![Backers](https://opencollective.com/bootstrap/backers.svg?width=890)](https://opencollective.com/bootstrap#backers)
## Copyright and license
Code and documentation copyright 20112021 the [Bootstrap Authors](https://github.com/twbs/bootstrap/graphs/contributors) and [Twitter, Inc.](https://twitter.com) Code released under the [MIT License](https://github.com/twbs/bootstrap/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/).

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More