First commit

This commit is contained in:
wboughattas
2025-12-27 18:35:15 -05:00
commit 9d6e7a2695
24 changed files with 1361 additions and 0 deletions

32
.gitignore vendored Normal file
View File

@@ -0,0 +1,32 @@
# node
node_modules/
npm-debug.log*
yarn*.log*
pnpm-debug.log*
# builds / caches / coverage
dist/
build/
.cache/
.tmp/
coverage/
# env / local config
.env
.env.*
.DS_Store
Thumbs.db
.idea/
.vscode/
*.swp
# Jekyll
_site
.sass-cache
.jekyll-cache
.jekyll-metadata
vendor
.bundle/
# Misc
*.log

1
.husky/pre-commit Normal file
View File

@@ -0,0 +1 @@
pnpm exec lint-staged

27
.prettierrc Normal file
View File

@@ -0,0 +1,27 @@
{
"tabWidth": 2,
"useTabs": false,
"singleQuote": true,
"printWidth": 100,
"plugins": ["@shopify/prettier-plugin-liquid", "prettier-plugin-nginx"],
"overrides": [
{
"files": "*.html",
"options": {
"parser": "liquid-html"
}
},
{
"files": "*.md",
"options": {
"parser": "markdown"
}
},
{
"files": ["nginx.conf", "*.conf"],
"options": {
"parser": "nginx"
}
}
]
}

24
404.html Normal file
View File

@@ -0,0 +1,24 @@
---
permalink: /404.html
layout: page
---
<style type='text/css' media='screen'>
.container {
margin: 10px auto;
max-width: 600px;
text-align: center;
}
h1 {
margin: 30px 0;
font-size: 4em;
line-height: 1;
letter-spacing: -1px;
}
</style>
<div class='container'>
<h1>404</h1>
<p><strong>Page not found :(</strong></p>
<p>The requested page could not be found.</p>
</div>

22
Gemfile Normal file
View File

@@ -0,0 +1,22 @@
source "https://rubygems.org"
gem "jekyll", "~> 4.4.1"
gem "minima", "~> 2.5"
group :jekyll_plugins do
gem "jekyll-feed", "~> 0.12"
gem 'jekyll-archives'
end
# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem
# and associated library.
platforms :mingw, :x64_mingw, :mswin, :jruby do
gem "tzinfo", ">= 1", "< 3"
gem "tzinfo-data"
end
# performance-booster for watching directories on Windows
gem "wdm", "~> 0.1", :platforms => [:mingw, :x64_mingw, :mswin]
# Lock `http_parser.rb` gem to `v0.6.x` on JRuby builds since newer versions of the gem
# do not have a Java counterpart.
gem "http_parser.rb", "~> 0.6.0", :platforms => [:jruby]

178
Gemfile.lock Normal file
View File

@@ -0,0 +1,178 @@
GEM
remote: https://rubygems.org/
specs:
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
base64 (0.3.0)
bigdecimal (3.3.1)
colorator (1.1.0)
concurrent-ruby (1.3.5)
csv (3.3.5)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0)
eventmachine (1.2.7)
ffi (1.17.2)
ffi (1.17.2-aarch64-linux-gnu)
ffi (1.17.2-aarch64-linux-musl)
ffi (1.17.2-arm-linux-gnu)
ffi (1.17.2-arm-linux-musl)
ffi (1.17.2-arm64-darwin)
ffi (1.17.2-x86-linux-gnu)
ffi (1.17.2-x86-linux-musl)
ffi (1.17.2-x86_64-darwin)
ffi (1.17.2-x86_64-linux-gnu)
ffi (1.17.2-x86_64-linux-musl)
forwardable-extended (2.6.0)
google-protobuf (4.33.0)
bigdecimal
rake (>= 13)
google-protobuf (4.33.0-aarch64-linux-gnu)
bigdecimal
rake (>= 13)
google-protobuf (4.33.0-aarch64-linux-musl)
bigdecimal
rake (>= 13)
google-protobuf (4.33.0-arm64-darwin)
bigdecimal
rake (>= 13)
google-protobuf (4.33.0-x86-linux-gnu)
bigdecimal
rake (>= 13)
google-protobuf (4.33.0-x86-linux-musl)
bigdecimal
rake (>= 13)
google-protobuf (4.33.0-x86_64-darwin)
bigdecimal
rake (>= 13)
google-protobuf (4.33.0-x86_64-linux-gnu)
bigdecimal
rake (>= 13)
google-protobuf (4.33.0-x86_64-linux-musl)
bigdecimal
rake (>= 13)
http_parser.rb (0.8.0)
i18n (1.14.7)
concurrent-ruby (~> 1.0)
jekyll (4.4.1)
addressable (~> 2.4)
base64 (~> 0.2)
colorator (~> 1.0)
csv (~> 3.0)
em-websocket (~> 0.5)
i18n (~> 1.0)
jekyll-sass-converter (>= 2.0, < 4.0)
jekyll-watch (~> 2.0)
json (~> 2.6)
kramdown (~> 2.3, >= 2.3.1)
kramdown-parser-gfm (~> 1.0)
liquid (~> 4.0)
mercenary (~> 0.3, >= 0.3.6)
pathutil (~> 0.9)
rouge (>= 3.0, < 5.0)
safe_yaml (~> 1.0)
terminal-table (>= 1.8, < 4.0)
webrick (~> 1.7)
jekyll-archives (2.3.0)
jekyll (>= 3.6, < 5.0)
jekyll-feed (0.17.0)
jekyll (>= 3.7, < 5.0)
jekyll-sass-converter (3.1.0)
sass-embedded (~> 1.75)
jekyll-seo-tag (2.8.0)
jekyll (>= 3.8, < 5.0)
jekyll-watch (2.2.1)
listen (~> 3.0)
json (2.15.1)
kramdown (2.5.1)
rexml (>= 3.3.9)
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
liquid (4.0.4)
listen (3.9.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.4.0)
minima (2.5.2)
jekyll (>= 3.5, < 5.0)
jekyll-feed (~> 0.9)
jekyll-seo-tag (~> 2.1)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (6.0.2)
rake (13.3.0)
rb-fsevent (0.11.2)
rb-inotify (0.11.1)
ffi (~> 1.0)
rexml (3.4.4)
rouge (4.6.1)
safe_yaml (1.0.5)
sass-embedded (1.93.2)
google-protobuf (~> 4.31)
rake (>= 13)
sass-embedded (1.93.2-aarch64-linux-android)
google-protobuf (~> 4.31)
sass-embedded (1.93.2-aarch64-linux-gnu)
google-protobuf (~> 4.31)
sass-embedded (1.93.2-aarch64-linux-musl)
google-protobuf (~> 4.31)
sass-embedded (1.93.2-arm-linux-androideabi)
google-protobuf (~> 4.31)
sass-embedded (1.93.2-arm-linux-gnueabihf)
google-protobuf (~> 4.31)
sass-embedded (1.93.2-arm-linux-musleabihf)
google-protobuf (~> 4.31)
sass-embedded (1.93.2-arm64-darwin)
google-protobuf (~> 4.31)
sass-embedded (1.93.2-riscv64-linux-android)
google-protobuf (~> 4.31)
sass-embedded (1.93.2-riscv64-linux-gnu)
google-protobuf (~> 4.31)
sass-embedded (1.93.2-riscv64-linux-musl)
google-protobuf (~> 4.31)
sass-embedded (1.93.2-x86_64-darwin)
google-protobuf (~> 4.31)
sass-embedded (1.93.2-x86_64-linux-android)
google-protobuf (~> 4.31)
sass-embedded (1.93.2-x86_64-linux-gnu)
google-protobuf (~> 4.31)
sass-embedded (1.93.2-x86_64-linux-musl)
google-protobuf (~> 4.31)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
unicode-display_width (2.6.0)
webrick (1.9.1)
PLATFORMS
aarch64-linux-android
aarch64-linux-gnu
aarch64-linux-musl
arm-linux-androideabi
arm-linux-gnu
arm-linux-gnueabihf
arm-linux-musl
arm-linux-musleabihf
arm64-darwin
riscv64-linux-android
riscv64-linux-gnu
riscv64-linux-musl
ruby
x86-linux-gnu
x86-linux-musl
x86_64-darwin
x86_64-linux-android
x86_64-linux-gnu
x86_64-linux-musl
DEPENDENCIES
http_parser.rb (~> 0.6.0)
jekyll (~> 4.4.1)
jekyll-archives
jekyll-feed (~> 0.12)
minima (~> 2.5)
tzinfo (>= 1, < 3)
tzinfo-data
wdm (~> 0.1)
BUNDLED WITH
2.7.2

31
README.md Normal file
View File

@@ -0,0 +1,31 @@
# Severed blog (Jekyll app)
## Development
**Install Dependencies (Ruby & Node):**
```bash
bundle install && pnpm install
```
**Start Local Server:**
```bash
pnpm dev
```
**Build for Production:**
```bash
pnpm build
```
## Code Quality
**Format Code Manually:**
```bash
pnpm format
```
_(Formatting also runs automatically on commit via Husky)_

66
_config.yml Normal file
View File

@@ -0,0 +1,66 @@
# Site settings
title: Severed
email: wboughattas@proton.me
description: >-
Architectural revisions and engineering logs from the Severed platform.
Transitioning from managed cloud to self-hosted OSS infrastructure.
# Deployment
baseurl: ''
url: 'https://blog.severed.ink'
#twitter_username: jekyllrb
github_username: Severed
# Shorter URLs
permalink: /:categories/:title/
# Theme settings
theme: minima
minima:
skin: dark
plugins:
- jekyll-feed
- jekyll-archives
# Exclude from processing.
# The following items will not be processed, by default.
# Any item listed under the `exclude:` key here will be automatically added to
# the internal "default list".
#
# Excluded items can be processed by explicitly listing the directories or
# their entries' file path in the `include:` list.
#
exclude:
- .sass-cache/
- .jekyll-cache/
- gemfiles/
- Gemfile
- Gemfile.lock
- node_modules/
- vendor/bundle/
- vendor/cache/
- vendor/gems/
- vendor/ruby/
# custom fields
#
module_order:
- releases
- architectures
jekyll-archives:
enabled:
- categories
layout: category_index
permalinks:
category: '/:name/'
sass:
style: compressed
quiet_deps: true
silence_deprecations:
- import
- color-functions
- global-builtin
- mixed-decls

View File

@@ -0,0 +1,30 @@
<div class='architecture-tree'>
<h3 class='post-list-heading'>System Architectures</h3>
<details open style='margin-bottom: 20px;'>
<summary style='cursor: pointer; list-style: none; font-family: monospace; font-size: 1.1em; outline: none;'>
<svg
style='width: 16px; height: 16px; vertical-align: middle; margin-right: 5px;'
viewBox='0 0 24 24'
fill='none'
stroke='currentColor'
stroke-width='2'
stroke-linecap='round'
stroke-linejoin='round'
>
<path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"></path>
</svg>
<strong>Architectures/</strong>
</summary>
<ul style='list-style: none; padding-left: 12px; margin-top: 10px;'>
{% for doc in site.architectures %}
<li style='margin-bottom: 5px;'>
<a href='{{ doc.url | relative_url }}' style='text-decoration: none; color: #2a7ae2;'>
{{ doc.title | default: doc.name }}
</a>
</li>
{% endfor %}
</ul>
</details>
</div>

View File

@@ -0,0 +1,99 @@
<div
class='tree-card'
style='margin-bottom: 16px; border: 1px solid #e1e4e8; border-radius: 6px; overflow: hidden; box-shadow: 0 1px 2px rgba(0,0,0,0.03);'
>
<details style='background: #ffffff;'>
<summary
style='cursor: pointer; padding: 10px 16px; background: #f6f8fa; border-bottom: 1px solid transparent; outline: none; list-style: none; display: flex; align-items: center; transition: background 0.2s ease;'
>
<svg
class='chevron'
width='16'
height='16'
viewBox='0 0 24 24'
fill='none'
stroke='#586069'
stroke-width='2'
stroke-linecap='round'
stroke-linejoin='round'
style='margin-right: 8px;'
>
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
<span style="font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace; font-size: 13px; font-weight: 600; color: #24292e;">
_{{ include.name }}
</span>
</summary>
<div style='padding: 8px 0; border-top: 1px solid #e1e4e8;'>
{% for post in include.posts %}
<a
href='{{ post.url | relative_url }}'
class='tree-item'
style="display: flex; align-items: center; justify-content: space-between; padding: 6px 16px 6px 36px; text-decoration: none; color: #586069; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif; font-size: 14px; transition: all 0.2s ease;"
>
<div style='display: flex; align-items: center; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;'>
{% if post.highlight == true %}
<svg
width='12'
height='12'
viewBox='0 0 24 24'
fill='#f1c40f'
stroke='#f1c40f'
stroke-width='2'
stroke-linecap='round'
stroke-linejoin='round'
style='margin-right: 9px; flex-shrink: 0;'
>
<polygon
points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"></polygon>
</svg>
{% else %}
<span
style='width: 6px; height: 6px; border-radius: 50%; background: #e1e4e8; margin-right: 12px; margin-left: 3px; flex-shrink: 0;'
></span>
{% endif %}
<span style='white-space: nowrap; overflow: hidden; text-overflow: ellipsis;'>
{{- post.title | escape -}}
</span>
</div>
<span style='font-size: 12px; color: #959da5; margin-left: 10px; flex-shrink: 0; font-variant-numeric: tabular-nums;'>
{{ post.date | date: '%b %d' }}
</span>
</a>
{% endfor %}
</div>
</details>
</div>
<style>
details[open] summary .chevron {
transform: rotate(90deg);
transition: transform 0.2s;
}
details:not([open]) summary .chevron {
transition: transform 0.2s;
}
details summary:hover {
background: #f0f3f6 !important;
}
details[open] summary {
border-bottom-color: #e1e4e8 !important;
}
a.tree-item:hover {
background-color: #f1f8ff;
color: #0366d6 !important;
}
a.tree-item:hover span:first-child {
background: #0366d6 !important;
}
/* Color the dot on hover */
</style>

20
_includes/head.html Normal file
View File

@@ -0,0 +1,20 @@
<head>
<meta charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
<meta name='viewport' content='width=device-width, initial-scale=1'>
{%- seo -%}
<link rel='preconnect' href='https://fonts.googleapis.com'>
<link rel='preconnect' href='https://fonts.gstatic.com' crossorigin>
<link
href='https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&family=Plus+Jakarta+Sans:wght@400;500;600;700&display=swap'
rel='stylesheet'
>
<link
rel='stylesheet'
href='{{ '/assets/main.css' | relative_url }}?v={{ site.time | date: '%s' }}'
>
{%- feed_meta -%}
</head>

15
_includes/header.html Normal file
View File

@@ -0,0 +1,15 @@
<header class='site-header' role='banner'>
<div class='wrapper'>
<a class='site-title' rel='author' href='{{ "/" | relative_url }}'>
{{ site.title | escape }}
</a>
<nav class='site-nav'>
<div class='trigger'>
<a class='page-link' href='https://severed.ink' style='font-weight: bold; color: #24292e;'>
severed.ink ↗
</a>
</div>
</nav>
</div>
</header>

12
_includes/social.html Normal file
View File

@@ -0,0 +1,12 @@
<ul class='social-media-list'>
{%- if site.github_username -%}
<li>
<a href='https://git.severed.ink/{{ site.github_username | cgi_escape | escape }}'>
<svg class='svg-icon'>
<use xlink:href="{{ '/assets/minima-social-icons.svg#github' | relative_url }}"></use>
</svg>
<span class='username'>{{ site.github_username | escape }}</span>
</a>
</li>
{%- endif -%}
</ul>

View File

@@ -0,0 +1,33 @@
---
layout: forge
---
<div style='margin-bottom: 20px;'>
<a
href='/'
style="text-decoration: none; color: #586069; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif; font-size: 14px; display: flex; align-items: center; font-weight: 500;"
>
<svg
width='16'
height='16'
viewBox='0 0 24 24'
fill='none'
stroke='currentColor'
stroke-width='2'
stroke-linecap='round'
stroke-linejoin='round'
style='margin-right: 6px;'
>
<line x1="19" y1="12" x2="5" y2="12"></line>
<polyline points="12 19 5 12 12 5"></polyline>
</svg>
Back to Forge
</a>
</div>
<h1 class='post-list-heading' style='margin-bottom: 30px; text-transform: capitalize;'>
{{ page.title }} Module
</h1>
<div class='modules-wrapper'>
{% include folder_tree.html name=page.title posts=page.posts %}
</div>

6
_layouts/forge.html Normal file
View File

@@ -0,0 +1,6 @@
---
layout: default
---
<div class='home'>
{{ content }}
</div>

29
_layouts/home.html Normal file
View File

@@ -0,0 +1,29 @@
---
layout: default
---
<div class='home'>
{%- if page.title -%}
<h1 class='page-heading'>{{ page.title }}</h1>
{%- endif -%}
{{ content }}
{%- if site.posts.size > 0 -%}
<h2 class='post-list-heading'>{{ page.list_title | default: 'Posts' }}</h2>
<ul class='post-list'>
{%- for post in site.posts -%}
<li>
<span class='post-meta'>{{ post.date | date: '%b %-d, %Y' }}</span>
<h3>
<a class='post-link' href='{{ post.url | relative_url }}'>
{{ post.title | escape }}
</a>
</h3>
{%- if site.show_excerpts -%}
{{ post.excerpt }}
{%- endif -%}
</li>
{%- endfor -%}
</ul>
{%- endif -%}
</div>

View File

@@ -0,0 +1,17 @@
---
layout: post
title: Architecture V1 (WIP)
date: 2025-12-27 02:00:00 -0400
categories:
- architectures
---
## Monitoring
```bash
.
└── alloy
├── config
│ └── config.alloy
└── docker-compose.yml
```

View File

@@ -0,0 +1,54 @@
---
layout: post
title: 'Release 0.1: The Severed Ecosystem'
date: 2025-12-27 02:00:00 -0400
categories:
- releases
highlight: true
---
This blog serves as the public documentation for **Severed**. While the main site provides the high-level vision,
this space is dedicated to the technical source-of-truth for the experiments, infrastructure-as-code, and proprietary
tooling that are used within the cluster.
### Ecosystem
The following services are currently active within the `severed.ink` network:
- **[ChronoFlow Quant](https://refinement.severed.ink)**: Proprietary Trading Pipeline `(Auth Required)`
- **[Flow Admin](https://refinement.severed.ink)**: Dagster Orchestration Engine `(Auth Required)`
- **[Optics](https://optics.severed.ink)**: Centralized Grafana Observability `(Auth Required)`
- **[Gitea](https://git.severed.ink)**: Version Control & Git Ops `(Public)`
- **[Blog](https://blog.severed.ink)**: Public Engineering Documentation `(Public)`
### Core Infrastructure
The ecosystem is powered by a **Home Server Cluster** managed via a **Kubernetes (k3s)** distribution. This setup
prioritizes local sovereignty and GitOps principles.
- **CI Pipeline:** Automated build and test suites are orchestrated by a private Jenkins server utilizing self-hosted
runners.
- **GitOps & Deployment:** Automated synchronization and state enforcement via **ArgoCD**.
- **Data Layer:** Persistent storage managed by **PostgreSQL**.
- **Telemetry:** Full-stack observability provided by **Prometheus** (metrics) and **Loki** (logs) via **Grafana**.
- **Security Layer:** Push/Pull GitOps operations require an active connection to a **WireGuard (VPN)** for remote
access.
### Roadmap
Engineering efforts are currently focused on the following milestones:
1. **OSS Strategy:** Transitioning from a hybrid of AWS managed services toward a ~100% Open Source Software (OSS) stack.
2. **High Availability (HA):** Implementing a "Cloud RAID-1" failover mechanism. In the event of home cluster
instability, traffic automatically routes to a secondary cloud-instantiated Kubernetes cluster as a temporary
failover.
3. **Data Resilience:** Automating PostgreSQL backup strategies to ensure parity between the primary cluster and the
cloud-based failover.
4. **Storage Infrastructure:** Integrating a dedicated **TrueNAS** node to move from local SATA/NVMe reliance to a
centralized, redundant storage architecture.
### Terminal Redirect
For the full technical portfolio and expertise highlights, visit the main site:
## [→ severed.ink](https://severed.ink/)

37
assets/main.scss Normal file
View File

@@ -0,0 +1,37 @@
---
---
@import 'minima';
/* Minimal Tweaks for the Tree Component */
details > summary {
list-style: none; /* Hides default triangle in some browsers */
}
details > summary::-webkit-details-marker {
display: none;
}
.site-header {
border-top: none; /* Removes the top grey line (your previous request) */
/* Sticky Logic */
position: sticky; /* Stick to the viewport */
top: 0; /* Stick exactly at the top */
z-index: 1000; /* Ensure it sits above all other content */
background-color: #fff; /* White background to hide scrolling content */
/* Optional: Adds a subtle shadow when scrolling for better separation */
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
}
body {
caret-color: transparent;
}
/* 2. Restore the cursor for actual input fields so users can type */
input,
textarea,
[contenteditable] {
caret-color: auto;
}

10
docker-compose.yml Normal file
View File

@@ -0,0 +1,10 @@
services:
web:
image: nginx:alpine
container_name: jekyll_blog
ports:
- '8080:80'
volumes:
- ./_site:/usr/share/nginx/html:ro
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
restart: unless-stopped

41
index.markdown Normal file
View File

@@ -0,0 +1,41 @@
---
layout: forge
---
<h2 class="post-list-heading">Highlighted articles</h2>
<ul class="post-list">
{% for post in site.posts %}
{% if post.highlight == true %}
<li>
<span class="post-meta">{{ post.date | date: "%b %-d, %Y" }}</span>
<h3>
<a class="post-link" href="{{ post.url | relative_url }}">
{{ post.title | escape }}
</a>
</h3>
</li>
{% endif %}
{% endfor %}
</ul>
<h2 class="post-list-heading" style="margin-top: 40px;">Documentation Modules</h2>
<div class="modules-wrapper">
{% for folder_name in site.module_order %}
{% assign cat_posts = site.categories[folder_name] %}
{% if cat_posts %}
{% include folder_tree.html name=folder_name posts=cat_posts %}
{% endif %}
{% endfor %}
{% assign sorted_cats = site.categories | sort %}
{% for category in sorted_cats %}
{% assign cat_name = category[0] %}
{% assign cat_posts = category[1] %}
{% unless site.module_order contains cat_name %}
{% include folder_tree.html name=cat_name posts=cat_posts %}
{% endunless %}
{% endfor %}
</div>

42
nginx.conf Normal file
View File

@@ -0,0 +1,42 @@
server {
listen 80;
server_name localhost;
# define root globally so all location blocks (images, css, etc) inherit it
root /usr/share/nginx/html;
index index.html index.htm;
# gzip compression
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml appl>
gzip_vary on;
gzip_min_length 1000;
# assets (images, fonts, favicons) - cache for 1 Year
location ~* \.(jpg|jpeg|gif|png|ico|svg|woff|woff2|ttf|eot)$ {
expires 365d;
add_header Cache-Control "public, no-transform";
try_files $uri =404;
}
# code (css, js) - cache for 1 month
location ~* \.(css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
try_files $uri =404;
}
# standard routing - short cache
location / {
try_files $uri $uri/ $uri.html =404;
}
# error page
error_page 404 /404.html;
location = /404.html {
internal ;
}
# logging / lb config
real_ip_header X-Forwarded-For;
set_real_ip_from 10.0.0.0/8;
}

35
package.json Normal file
View File

@@ -0,0 +1,35 @@
{
"name": "cntest",
"version": "1.0.0",
"description": "In dev: ```bash bundle exec jekyll serve ```",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"prepare": "husky",
"format": "prettier --write .",
"dev": "bundle exec jekyll serve",
"build": "bundle exec jekyll build"
},
"lint-staged": {
"*.{html,md,js,css,scss,json,yaml,yml,conf}": "prettier --write"
},
"repository": {
"type": "git",
"url": "git+https://github.com/wboughattas/cntest.git"
},
"keywords": [],
"author": "",
"license": "ISC",
"type": "commonjs",
"bugs": {
"url": "https://github.com/wboughattas/cntest/issues"
},
"homepage": "https://github.com/wboughattas/cntest#readme",
"devDependencies": {
"@shopify/prettier-plugin-liquid": "^1.10.0",
"prettier-plugin-nginx": "^1.0.3",
"husky": "^9.1.7",
"lint-staged": "^16.2.7",
"prettier": "^3.7.4"
}
}

500
pnpm-lock.yaml generated Normal file
View File

@@ -0,0 +1,500 @@
lockfileVersion: '9.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
.:
devDependencies:
'@shopify/prettier-plugin-liquid':
specifier: ^1.10.0
version: 1.10.0(prettier@3.7.4)
husky:
specifier: ^9.1.7
version: 9.1.7
lint-staged:
specifier: ^16.2.7
version: 16.2.7
prettier:
specifier: ^3.7.4
version: 3.7.4
prettier-plugin-nginx:
specifier: ^1.0.3
version: 1.0.3
packages:
'@shopify/liquid-html-parser@2.9.0':
resolution:
{
integrity: sha512-bkI4tLbU47YUxpgbMa9fgeJjFEMvRNEFL644Yk0ZKo5H1IRzU4pPyCQ6PkGvb0JJnt7OZ+RDGvb6ZLCnAR2Z/A==,
}
'@shopify/prettier-plugin-liquid@1.10.0':
resolution:
{
integrity: sha512-csHYjwuT34o8ja6EY0dUBYQS5UVwsKwRYxGiuG816Ov0B8lVd8FUjOwWUk2SnrNx3cGgL0no7z+Byapp7sC1Uw==,
}
peerDependencies:
prettier: ^2.0.0 || ^3.0.0
ansi-escapes@7.2.0:
resolution:
{
integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==,
}
engines: { node: '>=18' }
ansi-regex@6.2.2:
resolution:
{
integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==,
}
engines: { node: '>=12' }
ansi-styles@6.2.3:
resolution:
{
integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==,
}
engines: { node: '>=12' }
braces@3.0.3:
resolution:
{
integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==,
}
engines: { node: '>=8' }
cli-cursor@5.0.0:
resolution:
{
integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==,
}
engines: { node: '>=18' }
cli-truncate@5.1.1:
resolution:
{
integrity: sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==,
}
engines: { node: '>=20' }
colorette@2.0.20:
resolution:
{
integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==,
}
commander@14.0.2:
resolution:
{
integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==,
}
engines: { node: '>=20' }
emoji-regex@10.6.0:
resolution:
{
integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==,
}
environment@1.1.0:
resolution:
{
integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==,
}
engines: { node: '>=18' }
eventemitter3@5.0.1:
resolution:
{
integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==,
}
fill-range@7.1.1:
resolution:
{
integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==,
}
engines: { node: '>=8' }
get-east-asian-width@1.4.0:
resolution:
{
integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==,
}
engines: { node: '>=18' }
html-styles@1.0.0:
resolution:
{
integrity: sha512-cDl5dcj73oI4Hy0DSUNh54CAwslNLJRCCoO+RNkVo+sBrjA/0+7E/xzvj3zH/GxbbBLGJhE0hBe1eg+0FINC6w==,
}
husky@9.1.7:
resolution:
{
integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==,
}
engines: { node: '>=18' }
hasBin: true
is-fullwidth-code-point@5.1.0:
resolution:
{
integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==,
}
engines: { node: '>=18' }
is-number@7.0.0:
resolution:
{
integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==,
}
engines: { node: '>=0.12.0' }
isarray@1.0.0:
resolution:
{
integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==,
}
isobject@2.1.0:
resolution:
{
integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==,
}
engines: { node: '>=0.10.0' }
line-column@1.0.2:
resolution:
{
integrity: sha512-Ktrjk5noGYlHsVnYWh62FLVs4hTb8A3e+vucNZMgPeAOITdshMSgv4cCZQeRDjm7+goqmo6+liZwTXo+U3sVww==,
}
lint-staged@16.2.7:
resolution:
{
integrity: sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==,
}
engines: { node: '>=20.17' }
hasBin: true
listr2@9.0.5:
resolution:
{
integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==,
}
engines: { node: '>=20.0.0' }
log-update@6.1.0:
resolution:
{
integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==,
}
engines: { node: '>=18' }
micromatch@4.0.8:
resolution:
{
integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==,
}
engines: { node: '>=8.6' }
mimic-function@5.0.1:
resolution:
{
integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==,
}
engines: { node: '>=18' }
nano-spawn@2.0.0:
resolution:
{
integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==,
}
engines: { node: '>=20.17' }
ohm-js@17.3.0:
resolution:
{
integrity: sha512-LySMdjweN1hKBMMV8lM44+1wiewkndDNNJxtgVAscs7y683MXCdQZLsIaw64/p8NuqYbKOWZoHIOA5DU/xchoA==,
}
engines: { node: '>=0.12.1' }
onetime@7.0.0:
resolution:
{
integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==,
}
engines: { node: '>=18' }
picomatch@2.3.1:
resolution:
{
integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==,
}
engines: { node: '>=8.6' }
pidtree@0.6.0:
resolution:
{
integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==,
}
engines: { node: '>=0.10' }
hasBin: true
prettier-plugin-nginx@1.0.3:
resolution:
{
integrity: sha512-vV5q85s8XnV6NEgvz1gVLfZhmxAxY03MyOYj2ApBpjFkbs00lRsRkTmqO9L39ADuD18z1RRCcfZ3eVxKhI/nqg==,
}
prettier@3.7.4:
resolution:
{
integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==,
}
engines: { node: '>=14' }
hasBin: true
restore-cursor@5.1.0:
resolution:
{
integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==,
}
engines: { node: '>=18' }
rfdc@1.4.1:
resolution:
{
integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==,
}
signal-exit@4.1.0:
resolution:
{
integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==,
}
engines: { node: '>=14' }
slice-ansi@7.1.2:
resolution:
{
integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==,
}
engines: { node: '>=18' }
string-argv@0.3.2:
resolution:
{
integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==,
}
engines: { node: '>=0.6.19' }
string-width@7.2.0:
resolution:
{
integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==,
}
engines: { node: '>=18' }
string-width@8.1.0:
resolution:
{
integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==,
}
engines: { node: '>=20' }
strip-ansi@7.1.2:
resolution:
{
integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==,
}
engines: { node: '>=12' }
to-regex-range@5.0.1:
resolution:
{
integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==,
}
engines: { node: '>=8.0' }
wrap-ansi@9.0.2:
resolution:
{
integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==,
}
engines: { node: '>=18' }
yaml@2.8.2:
resolution:
{
integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==,
}
engines: { node: '>= 14.6' }
hasBin: true
snapshots:
'@shopify/liquid-html-parser@2.9.0':
dependencies:
line-column: 1.0.2
ohm-js: 17.3.0
'@shopify/prettier-plugin-liquid@1.10.0(prettier@3.7.4)':
dependencies:
'@shopify/liquid-html-parser': 2.9.0
html-styles: 1.0.0
prettier: 3.7.4
ansi-escapes@7.2.0:
dependencies:
environment: 1.1.0
ansi-regex@6.2.2: {}
ansi-styles@6.2.3: {}
braces@3.0.3:
dependencies:
fill-range: 7.1.1
cli-cursor@5.0.0:
dependencies:
restore-cursor: 5.1.0
cli-truncate@5.1.1:
dependencies:
slice-ansi: 7.1.2
string-width: 8.1.0
colorette@2.0.20: {}
commander@14.0.2: {}
emoji-regex@10.6.0: {}
environment@1.1.0: {}
eventemitter3@5.0.1: {}
fill-range@7.1.1:
dependencies:
to-regex-range: 5.0.1
get-east-asian-width@1.4.0: {}
html-styles@1.0.0: {}
husky@9.1.7: {}
is-fullwidth-code-point@5.1.0:
dependencies:
get-east-asian-width: 1.4.0
is-number@7.0.0: {}
isarray@1.0.0: {}
isobject@2.1.0:
dependencies:
isarray: 1.0.0
line-column@1.0.2:
dependencies:
isarray: 1.0.0
isobject: 2.1.0
lint-staged@16.2.7:
dependencies:
commander: 14.0.2
listr2: 9.0.5
micromatch: 4.0.8
nano-spawn: 2.0.0
pidtree: 0.6.0
string-argv: 0.3.2
yaml: 2.8.2
listr2@9.0.5:
dependencies:
cli-truncate: 5.1.1
colorette: 2.0.20
eventemitter3: 5.0.1
log-update: 6.1.0
rfdc: 1.4.1
wrap-ansi: 9.0.2
log-update@6.1.0:
dependencies:
ansi-escapes: 7.2.0
cli-cursor: 5.0.0
slice-ansi: 7.1.2
strip-ansi: 7.1.2
wrap-ansi: 9.0.2
micromatch@4.0.8:
dependencies:
braces: 3.0.3
picomatch: 2.3.1
mimic-function@5.0.1: {}
nano-spawn@2.0.0: {}
ohm-js@17.3.0: {}
onetime@7.0.0:
dependencies:
mimic-function: 5.0.1
picomatch@2.3.1: {}
pidtree@0.6.0: {}
prettier-plugin-nginx@1.0.3: {}
prettier@3.7.4: {}
restore-cursor@5.1.0:
dependencies:
onetime: 7.0.0
signal-exit: 4.1.0
rfdc@1.4.1: {}
signal-exit@4.1.0: {}
slice-ansi@7.1.2:
dependencies:
ansi-styles: 6.2.3
is-fullwidth-code-point: 5.1.0
string-argv@0.3.2: {}
string-width@7.2.0:
dependencies:
emoji-regex: 10.6.0
get-east-asian-width: 1.4.0
strip-ansi: 7.1.2
string-width@8.1.0:
dependencies:
get-east-asian-width: 1.4.0
strip-ansi: 7.1.2
strip-ansi@7.1.2:
dependencies:
ansi-regex: 6.2.2
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
wrap-ansi@9.0.2:
dependencies:
ansi-styles: 6.2.3
string-width: 7.2.0
strip-ansi: 7.1.2
yaml@2.8.2: {}