Initial commit.
2
.cspell/custom-dictionary-workspace.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
# Custom Dictionary Words
|
||||
|
||||
9
.gitignore
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
# Hugo build output
|
||||
/public/
|
||||
/resources/_gen/
|
||||
/assets/jsconfig.json
|
||||
|
||||
# Hugo cache
|
||||
/.hugo_build.lock
|
||||
|
||||
.working
|
||||
7
.gitmodules
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
[submodule "themes/ananke"]
|
||||
path = themes/ananke
|
||||
url = https://github.com/theNewDynamic/gohugo-theme-ananke.git
|
||||
[submodule "themes/blowfish"]
|
||||
path = themes/blowfish
|
||||
url = https://github.com/nunocoracao/blowfish.git
|
||||
branch = main
|
||||
17
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Hugo Server",
|
||||
"type": "node-terminal",
|
||||
"request": "launch",
|
||||
"command": "hugo server -D",
|
||||
"cwd": "${workspaceFolder}",
|
||||
"serverReadyAction": {
|
||||
"pattern": "Web Server is available at //localhost:(\\d+)",
|
||||
"uriFormat": "http://localhost:%s",
|
||||
"action": "openExternally"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
10
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"cSpell.customDictionaries": {
|
||||
"custom-dictionary-workspace": {
|
||||
"name": "custom-dictionary-workspace",
|
||||
"path": "${workspaceFolder:civildynamics.org}/.cspell/custom-dictionary-workspace.txt",
|
||||
"addWords": true,
|
||||
"scope": "workspace"
|
||||
}
|
||||
}
|
||||
}
|
||||
105
CLAUDE.md
Normal file
@@ -0,0 +1,105 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## Overview
|
||||
|
||||
CivilDynamics.org is a Hugo-based static website presenting the Civil Dynamics framework—a structural analysis of political power and its implications for civil society. The site uses the Blowfish theme to present this theoretical framework and its implications for understanding how accessible AI might transform political organization.
|
||||
|
||||
## Development Commands
|
||||
|
||||
### Development Server
|
||||
```bash
|
||||
hugo server
|
||||
```
|
||||
Starts the development server with live reload at http://localhost:1313
|
||||
|
||||
### Build
|
||||
```bash
|
||||
hugo build
|
||||
```
|
||||
Builds the static site to the `public/` directory
|
||||
|
||||
### Dependencies
|
||||
- Install hugo (static site generator)
|
||||
- Install dart-sass (CSS processing)
|
||||
|
||||
## Deployment
|
||||
|
||||
### Local Docker Build
|
||||
```bash
|
||||
hugo build
|
||||
docker build -t payneio/civildynamics.org . --file ./Dockerfile
|
||||
docker push payneio/civildynamics.org
|
||||
```
|
||||
|
||||
### Production Deployment
|
||||
From payne-cloud environment:
|
||||
```bash
|
||||
# First time deployment
|
||||
bin/wild-app-deploy civildynamics
|
||||
|
||||
# Updates
|
||||
kubectl rollout restart deployment civildynamics -n civildynamics
|
||||
```
|
||||
|
||||
## Site Architecture
|
||||
|
||||
### Content Structure
|
||||
- `content/` - All site content in Markdown format
|
||||
- `_index.md` - Homepage introducing the Civil Dynamics framework
|
||||
- `about/` - Detailed explanation of the framework and its concepts
|
||||
|
||||
### Configuration
|
||||
- `config/_default/` - Hugo configuration split across multiple files
|
||||
- `hugo.toml` - Main site configuration (baseURL: https://civildynamics.org/)
|
||||
- `params.toml` - Theme-specific parameters
|
||||
- `menus.en.toml` - Navigation menu structure
|
||||
- `languages.en.toml` - Language settings and site metadata
|
||||
|
||||
### Theme
|
||||
- Uses the Blowfish theme (located in `themes/blowfish/`)
|
||||
- Theme is included as a git submodule
|
||||
- Custom CSS can be added in `assets/css/custom.css`
|
||||
|
||||
### Static Assets
|
||||
- `static/` - Static files served directly
|
||||
- `assets/` - Assets processed by Hugo
|
||||
- `public/` - Generated output directory (not committed)
|
||||
|
||||
## Content Guidelines
|
||||
|
||||
### Civil Dynamics Framework
|
||||
The site focuses on presenting a structural framework for understanding political power:
|
||||
- The three-vertex pyramid (state, moral, commercial power)
|
||||
- Purity dynamics and their effect on civil society
|
||||
- Historical resilience of hierarchical structures
|
||||
- How accessible AI might enable governance without rule
|
||||
- The importance of distributed vs. centralized AI architecture
|
||||
|
||||
### Page Organization
|
||||
- Articles use bundle structure with `index.md` and associated images
|
||||
- Featured images should be named `featured.png` or `featured.jpg`
|
||||
- Use front matter for metadata (title, description, etc.)
|
||||
|
||||
### Hugo Features Used
|
||||
- Page bundles for content organization
|
||||
- Taxonomies (tags, categories, authors, series)
|
||||
- Related content based on tags/categories
|
||||
- RSS feeds and JSON output
|
||||
- SEO-optimized with proper meta tags and sitemap generation
|
||||
|
||||
## Docker Deployment
|
||||
|
||||
The site is containerized using a simple Nginx Alpine image:
|
||||
- Hugo builds static files to `public/`
|
||||
- Dockerfile copies `public/` to Nginx document root
|
||||
- No server-side processing required
|
||||
|
||||
## Development Notes
|
||||
|
||||
- The site presents a theoretical framework for understanding political power structures
|
||||
- Content emphasizes structural analysis over ideological positions
|
||||
- The framework is non-partisan and applies across political systems
|
||||
- Focus is on how distributed AI might enable new forms of coordination
|
||||
- No analytics tracking currently configured (googleAnalytics = "")
|
||||
2
Dockerfile
Normal file
@@ -0,0 +1,2 @@
|
||||
FROM nginx:alpine
|
||||
COPY ./public /usr/share/nginx/html
|
||||
17
README.md
Normal file
@@ -0,0 +1,17 @@
|
||||
# CivilDynamics.org
|
||||
|
||||
## Dev environment
|
||||
|
||||
- Install hugo.
|
||||
- Install dart-sass.
|
||||
|
||||
```bash
|
||||
hugo server -D
|
||||
npm run dev # TailwindCSS JIT compilation
|
||||
```
|
||||
|
||||
## Deploy
|
||||
|
||||
```bash
|
||||
scripts/deploy.sh
|
||||
```
|
||||
5
archetypes/default.md
Normal file
@@ -0,0 +1,5 @@
|
||||
+++
|
||||
date = '{{ .Date }}'
|
||||
draft = true
|
||||
title = '{{ replace .File.ContentBaseName "-" " " | title }}'
|
||||
+++
|
||||
4984
assets/css/compiled/main.css
Normal file
22
assets/css/custom.css
Normal file
@@ -0,0 +1,22 @@
|
||||
@font-face {
|
||||
font-family: font;
|
||||
src: url('/fonts/OpenSans-Regular.ttf');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: cstf;
|
||||
src: url('/fonts/LinLibertine_R.ttf');
|
||||
}
|
||||
|
||||
html {
|
||||
font-family: font;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6, .main-menu, .decoration-primary-500 {
|
||||
font-family: cstf;
|
||||
}
|
||||
|
||||
figure {
|
||||
margin: .5em;
|
||||
padding: 0;
|
||||
}
|
||||
BIN
assets/people/paul-payne.jpg
Normal file
|
After Width: | Height: | Size: 127 KiB |
77
config/_default/hugo.toml
Normal file
@@ -0,0 +1,77 @@
|
||||
# -- Site Configuration --
|
||||
# Refer to the theme docs for more details about each of these parameters.
|
||||
# https://blowfish.page/docs/getting-started/
|
||||
|
||||
theme = "blowfish"
|
||||
baseURL = "https://civildynamics.org/"
|
||||
defaultContentLanguage = "en"
|
||||
|
||||
# pluralizeListTitles = "true" # hugo function useful for non-english languages, find out more in https://gohugo.io/getting-started/configuration/#pluralizelisttitles
|
||||
|
||||
enableRobotsTXT = true
|
||||
summaryLength = 20
|
||||
|
||||
buildDrafts = false
|
||||
buildFuture = false
|
||||
|
||||
enableEmoji = true
|
||||
|
||||
googleAnalytics = ""
|
||||
|
||||
[pagination]
|
||||
pagerSize = 100
|
||||
|
||||
[imaging]
|
||||
anchor = 'Center'
|
||||
|
||||
[taxonomies]
|
||||
tag = "tags"
|
||||
category = "categories"
|
||||
author = "authors"
|
||||
series = "series"
|
||||
person = "people"
|
||||
|
||||
[sitemap]
|
||||
changefreq = 'daily'
|
||||
filename = 'sitemap.xml'
|
||||
priority = 0.5
|
||||
|
||||
[outputs]
|
||||
home = ["HTML", "RSS", "JSON"]
|
||||
|
||||
[related]
|
||||
threshold = 0
|
||||
toLower = false
|
||||
|
||||
[[related.indices]]
|
||||
name = "tags"
|
||||
weight = 100
|
||||
|
||||
[[related.indices]]
|
||||
name = "categories"
|
||||
weight = 100
|
||||
|
||||
[[related.indices]]
|
||||
name = "series"
|
||||
weight = 50
|
||||
|
||||
[[related.indices]]
|
||||
name = "authors"
|
||||
weight = 20
|
||||
|
||||
[[related.indices]]
|
||||
name = "date"
|
||||
weight = 10
|
||||
|
||||
[[related.indices]]
|
||||
applyFilter = false
|
||||
name = 'fragmentrefs'
|
||||
type = 'fragments'
|
||||
weight = 10
|
||||
|
||||
[markup]
|
||||
[markup.goldmark]
|
||||
[markup.goldmark.parser]
|
||||
[markup.goldmark.parser.attribute]
|
||||
block = true
|
||||
title = true
|
||||
73
config/_default/languages.en.toml
Normal file
@@ -0,0 +1,73 @@
|
||||
disabled = false
|
||||
languageCode = "en"
|
||||
languageName = "English"
|
||||
weight = 1
|
||||
title = "Civil Dynamics"
|
||||
|
||||
[params]
|
||||
displayName = "EN"
|
||||
isoCode = "en"
|
||||
rtl = false
|
||||
dateFormat = "2 January 2006"
|
||||
# logo = "img/logo.png"
|
||||
# secondaryLogo = "img/secondary-logo.png"
|
||||
description = "A framework for understanding and transforming political power"
|
||||
# copyright = "Copy, _right?_ :thinking_face:"
|
||||
|
||||
[params.author]
|
||||
name = "Civil Dynamics"
|
||||
email = "paul@payne.io"
|
||||
# image = "img/blowfish_logo.png"
|
||||
# imageQuality = 96
|
||||
# headline = "I'm only human"
|
||||
# bio = "A little bit about you"
|
||||
# links = [
|
||||
# { email = "mailto:hello@your_domain.com" },
|
||||
# { link = "https://link-to-some-website.com/" },
|
||||
# { amazon = "https://www.amazon.com/hz/wishlist/ls/wishlist-id" },
|
||||
# { apple = "https://www.apple.com" },
|
||||
# { blogger = "https://username.blogspot.com/" },
|
||||
# { bluesky = "https://bsky.app/profile/username" },
|
||||
# { codepen = "https://codepen.io/username" },
|
||||
# { dev = "https://dev.to/username" },
|
||||
# { discord = "https://discord.gg/invitecode" },
|
||||
# { dribbble = "https://dribbble.com/username" },
|
||||
# { facebook = "https://facebook.com/username" },
|
||||
# { flickr = "https://www.flickr.com/photos/username/" },
|
||||
# { foursquare = "https://foursquare.com/username" },
|
||||
# { github = "https://github.com/username" },
|
||||
# { gitlab = "https://gitlab.com/username" },
|
||||
# { google = "https://www.google.com/" },
|
||||
# { hashnode = "https://username.hashnode.dev" },
|
||||
# { instagram = "https://instagram.com/username" },
|
||||
# { itch-io = "https://username.itch.io" },
|
||||
# { keybase = "https://keybase.io/username" },
|
||||
# { kickstarter = "https://www.kickstarter.com/profile/username" },
|
||||
# { lastfm = "https://lastfm.com/user/username" },
|
||||
# { linkedin = "https://linkedin.com/in/username" },
|
||||
# { mastodon = "https://mastodon.instance/@username" },
|
||||
# { medium = "https://medium.com/username" },
|
||||
# { microsoft = "https://www.microsoft.com/" },
|
||||
# { orcid = "https://orcid.org/userid" },
|
||||
# { patreon = "https://www.patreon.com/username" },
|
||||
# { pinterest = "https://pinterest.com/username" },
|
||||
# { reddit = "https://reddit.com/user/username" },
|
||||
# { researchgate = "https://www.researchgate.net/profile/username" },
|
||||
# { slack = "https://workspace.url/team/userid" },
|
||||
# { snapchat = "https://snapchat.com/add/username" },
|
||||
# { soundcloud = "https://soundcloud.com/username" },
|
||||
# { spotify = "https://open.spotify.com/user/userid" },
|
||||
# { stack-overflow = "https://stackoverflow.com/users/userid/username" },
|
||||
# { steam = "https://steamcommunity.com/profiles/userid" },
|
||||
# { telegram = "https://t.me/username" },
|
||||
# { threads = "https://www.threads.net/@username" },
|
||||
# { tiktok = "https://tiktok.com/@username" },
|
||||
# { tumblr = "https://username.tumblr.com" },
|
||||
# { twitch = "https://twitch.tv/username" },
|
||||
# { twitter = "https://twitter.com/username" },
|
||||
# { x-twitter = "https://twitter.com/username" },
|
||||
# { whatsapp = "https://wa.me/phone-number" },
|
||||
# { youtube = "https://youtube.com/username" },
|
||||
# { ko-fi = "https://ko-fi.com/username" },
|
||||
# { codeberg = "https://codeberg.org/username"},
|
||||
# ]
|
||||
13
config/_default/markup.toml
Normal file
@@ -0,0 +1,13 @@
|
||||
# -- Markup --
|
||||
# These settings are required for the theme to function.
|
||||
|
||||
[goldmark]
|
||||
[goldmark.renderer]
|
||||
unsafe = true
|
||||
|
||||
[highlight]
|
||||
noClasses = false
|
||||
|
||||
[tableOfContents]
|
||||
startLevel = 2
|
||||
endLevel = 4
|
||||
64
config/_default/menus.en.toml
Normal file
@@ -0,0 +1,64 @@
|
||||
# -- Main Menu --
|
||||
# The main menu is displayed in the header at the top of the page.
|
||||
# Acceptable parameters are name, pageRef, page, url, title, weight.
|
||||
#
|
||||
# The simplest menu configuration is to provide:
|
||||
# name = The name to be displayed for this menu link
|
||||
# pageRef = The identifier of the page or section to link to
|
||||
#
|
||||
# By default the menu is ordered alphabetically. This can be
|
||||
# overridden by providing a weight value. The menu will then be
|
||||
# ordered by weight from lowest to highest.
|
||||
|
||||
[[main]]
|
||||
name = "About"
|
||||
pageRef = "about"
|
||||
weight = 30
|
||||
|
||||
[[main]]
|
||||
name = "Articles"
|
||||
pageRef = "articles"
|
||||
weight = 40
|
||||
|
||||
#[[main]]
|
||||
# name = "example sub-menu 2"
|
||||
# parent = "Parent"
|
||||
# pageRef = "posts"
|
||||
# weight = 20
|
||||
|
||||
#[[subnavigation]]
|
||||
# name = "An interesting topic"
|
||||
# pageRef = "tags/interesting-topic"
|
||||
# weight = 10
|
||||
|
||||
#[[subnavigation]]
|
||||
# name = "My Awesome Category"
|
||||
# pre = "github"
|
||||
# pageRef = "categories/awesome"
|
||||
# weight = 20
|
||||
|
||||
#[[main]]
|
||||
# name = "Categories"
|
||||
# pageRef = "categories"
|
||||
# weight = 20
|
||||
|
||||
#[[main]]
|
||||
# name = "Tags"
|
||||
# pageRef = "tags"
|
||||
# weight = 30
|
||||
|
||||
|
||||
# -- Footer Menu --
|
||||
# The footer menu is displayed at the bottom of the page, just before
|
||||
# the copyright notice. Configure as per the main menu above.
|
||||
|
||||
|
||||
[[footer]]
|
||||
name = "Contribute"
|
||||
pageRef = "contribute"
|
||||
weight = 10
|
||||
|
||||
# [[footer]]
|
||||
# name = "Categories"
|
||||
# pageRef = "categories"
|
||||
# weight = 20
|
||||
3
config/_default/module.toml
Normal file
@@ -0,0 +1,3 @@
|
||||
[hugoVersion]
|
||||
extended = false
|
||||
min = "0.87.0"
|
||||
167
config/_default/params.toml
Normal file
@@ -0,0 +1,167 @@
|
||||
# -- Theme Options --
|
||||
# These options control how the theme functions and allow you to
|
||||
# customise the display of your website.
|
||||
#
|
||||
# Refer to the theme docs for more details about each of these parameters.
|
||||
# https://blowfish.page/docs/configuration/#theme-parameters
|
||||
|
||||
colorScheme = "blowfish"
|
||||
defaultAppearance = "light" # valid options: light or dark
|
||||
autoSwitchAppearance = true
|
||||
|
||||
enableSearch = true
|
||||
enableCodeCopy = false
|
||||
|
||||
replyByEmail = false
|
||||
|
||||
# mainSections = ["section1", "section2"]
|
||||
# robots = ""
|
||||
|
||||
disableImageOptimization = false
|
||||
disableTextInHeader = false
|
||||
# backgroundImageWidth = 1200
|
||||
|
||||
# defaultBackgroundImage = "IMAGE.jpg" # used as default for background images
|
||||
# defaultFeaturedImage = "IMAGE.jpg" # used as default for featured images in all articles
|
||||
|
||||
# highlightCurrentMenuArea = true
|
||||
# smartTOC = true
|
||||
# smartTOCHideUnfocusedChildren = true
|
||||
|
||||
# giteaDefaultServer = "https://git.fsfe.org"
|
||||
# forgejoDefaultServer = "https://v8.next.forgejo.org"
|
||||
|
||||
[header]
|
||||
layout = "basic" # valid options: basic, fixed, fixed-fill, fixed-gradient, fixed-fill-blur
|
||||
|
||||
[footer]
|
||||
showMenu = true
|
||||
showCopyright = true
|
||||
showThemeAttribution = false
|
||||
showAppearanceSwitcher = true
|
||||
showScrollToTop = true
|
||||
|
||||
[homepage]
|
||||
layout = "custom" # valid options: page, profile, hero, card, background, custom
|
||||
#homepageImage = "IMAGE.jpg" # used in: hero, and card
|
||||
showRecent = ["articles"]
|
||||
showRecentItems = 3
|
||||
showMoreLink = false
|
||||
showMoreLinkDest = "/articles/"
|
||||
cardView = true
|
||||
cardViewScreenWidth = false
|
||||
layoutBackgroundBlur = false # only used when layout equals background
|
||||
|
||||
[article]
|
||||
showDate = true
|
||||
showViews = false
|
||||
showLikes = false
|
||||
showDateOnlyInArticle = false
|
||||
showDateUpdated = false
|
||||
showAuthor = false
|
||||
# showAuthorBottom = false
|
||||
showHero = true
|
||||
heroStyle = "big" # valid options: basic, big, background, thumbAndBackground
|
||||
layoutBackgroundBlur = true # only used when heroStyle equals background or thumbAndBackground
|
||||
layoutBackgroundHeaderSpace = true # only used when heroStyle equals background
|
||||
showBreadcrumbs = true
|
||||
showDraftLabel = true
|
||||
showEdit = false
|
||||
# editURL = "https://github.com/username/repo/"
|
||||
editAppendPath = true
|
||||
seriesOpened = false
|
||||
showHeadingAnchors = true
|
||||
showPagination = true
|
||||
invertPagination = false
|
||||
showReadingTime = true
|
||||
showTableOfContents = true
|
||||
showRelatedContent = false
|
||||
relatedContentLimit = 3
|
||||
showTaxonomies = true
|
||||
showAuthorsBadges = false
|
||||
showWordCount = true
|
||||
sharingLinks = [ "linkedin", "twitter", "bluesky", "mastodon", "reddit", "facebook", "email", "whatsapp", "telegram"]
|
||||
showZenMode = true
|
||||
|
||||
[list]
|
||||
showHero = true
|
||||
heroStyle = "background" # valid options: basic, big, background, thumbAndBackground
|
||||
layoutBackgroundBlur = true # only used when heroStyle equals background or thumbAndBackground
|
||||
layoutBackgroundHeaderSpace = true # only used when heroStyle equals background
|
||||
showBreadcrumbs = true
|
||||
showSummary = true
|
||||
showViews = false
|
||||
showLikes = false
|
||||
showTableOfContents = false
|
||||
showCards = true
|
||||
orderByWeight = false
|
||||
groupByYear = false
|
||||
cardView = false
|
||||
cardViewScreenWidth = false
|
||||
constrainItemsWidth = false
|
||||
|
||||
[sitemap]
|
||||
excludedKinds = ["taxonomy", "term"]
|
||||
|
||||
[taxonomy]
|
||||
showTermCount = true
|
||||
showHero = false
|
||||
# heroStyle = "background" # valid options: basic, big, background, thumbAndBackground
|
||||
showBreadcrumbs = false
|
||||
showViews = false
|
||||
showLikes = false
|
||||
showTableOfContents = false
|
||||
cardView = false
|
||||
|
||||
[term]
|
||||
showHero = false
|
||||
# heroStyle = "background" # valid options: basic, big, background, thumbAndBackground
|
||||
showBreadcrumbs = false
|
||||
showViews = false
|
||||
showLikes = false
|
||||
showTableOfContents = true
|
||||
groupByYear = false
|
||||
cardView = false
|
||||
cardViewScreenWidth = false
|
||||
|
||||
[firebase]
|
||||
# apiKey = "XXXXXX"
|
||||
# authDomain = "XXXXXX"
|
||||
# projectId = "XXXXXX"
|
||||
# storageBucket = "XXXXXX"
|
||||
# messagingSenderId = "XXXXXX"
|
||||
# appId = "XXXXXX"
|
||||
# measurementId = "XXXXXX"
|
||||
|
||||
[fathomAnalytics]
|
||||
# site = "ABC12345"
|
||||
# domain = "llama.yoursite.com"
|
||||
|
||||
[umamiAnalytics]
|
||||
# websiteid = "ABC12345"
|
||||
# domain = "llama.yoursite.com"
|
||||
# dataDomains = "yoursite.com,yoursite2.com"
|
||||
# scriptName = ""
|
||||
# enableTrackEvent = true
|
||||
|
||||
[selineAnalytics]
|
||||
# token = "XXXXXX"
|
||||
# enableTrackEvent = true
|
||||
|
||||
[buymeacoffee]
|
||||
# identifier = ""
|
||||
# globalWidget = true
|
||||
# globalWidgetMessage = "Hello"
|
||||
# globalWidgetColor = "#FFDD00"
|
||||
# globalWidgetPosition = "Right"
|
||||
|
||||
[verification]
|
||||
# google = ""
|
||||
# bing = ""
|
||||
# pinterest = ""
|
||||
# yandex = ""
|
||||
# fediverse = ""
|
||||
|
||||
[rssnext]
|
||||
# feedId = ""
|
||||
# userId = ""
|
||||
60
content/_index.md
Normal file
@@ -0,0 +1,60 @@
|
||||
---
|
||||
title: "Civil Dynamics"
|
||||
description: "A framework for understanding and transforming political power"
|
||||
---
|
||||
|
||||
<div class="prose dark:prose-invert max-w-4xl mx-auto pt-8">
|
||||
|
||||
## A Framework for Understanding Political Power
|
||||
|
||||
Civil Dynamics is a structural framework for understanding the universal architecture of political power and its implications for civil society. At its core, it identifies a consistent geometric pattern that appears across all complex societies: a **three-vertex pyramid** combining state power, moral authority, and commercial power, organized hierarchically from masses to elites.
|
||||
|
||||
This framework goes beyond traditional political analysis by treating power not as an ideological phenomenon but as a structural one—an emergent pattern arising from fundamental coordination constraints in human societies.
|
||||
|
||||
### The Three Vertices
|
||||
|
||||
Every complex society operates through three irreducible forms of power:
|
||||
|
||||
1. **State Power**: Formal violence, lawmaking, enforcement, bureaucracy
|
||||
2. **Moral Power**: Religion, ideology, identity, normative authority, legitimacy
|
||||
3. **Commercial Power**: Resource allocation, capital flows, incentives, markets
|
||||
|
||||
These are not optional features that vary by culture or ideology—they are structural roles that every political system must fill. What changes across societies is the *content* that fills each vertex (which religion, which ideology, which economic system), not whether the vertex exists.
|
||||
|
||||
### Why This Matters
|
||||
|
||||
Civil society thrives on horizontal relationships, distributed legitimacy, pluralism, and voluntary association. The tri-vertex pyramid systematically undermines all of these because:
|
||||
|
||||
- **Moral power demands purity**: Creates totalizing boundaries that corrode pluralism
|
||||
- **State power enforces alignment**: When fused with moral authority, dissent becomes deviance
|
||||
- **Commercial power amplifies narratives**: Capital and media accelerate moral-political fusion
|
||||
- **Hierarchy makes dissent costly**: Elite consolidation at the apex punishes challenges to the structure itself
|
||||
|
||||
This dynamic—not any specific ideology—is fundamentally corrosive to civil society.
|
||||
|
||||
### The AI Inflection Point
|
||||
|
||||
Accessible, sovereign artificial intelligence represents the first technological shift in centuries that could actually deform the political geometry. For the first time in history, we can plausibly separate **governance** (the processes by which groups coordinate, resolve conflicts, and make decisions) from **rule** (centralized enforcement by hierarchical authority).
|
||||
|
||||
AI changes the fundamental constraints:
|
||||
- Cognition is no longer scarce
|
||||
- Coordination becomes cheap
|
||||
- Information asymmetries collapse
|
||||
- Administrative capacity distributes
|
||||
- Narrative production democratizes
|
||||
|
||||
**The decisive factor is not capability but architecture.** Accessible, sovereign AI softens the pyramid; centralized AI hardens it into something sharper than anything in history.
|
||||
|
||||
### Learn More
|
||||
|
||||
This framework offers:
|
||||
- **Structural universalism**: Invariant patterns across all political systems
|
||||
- **Geometric formalism**: Spatial metaphors as analytical tools
|
||||
- **Anthropological realism**: Acknowledges deep constraints without cynicism
|
||||
- **Technological specificity**: Identifies why AI specifically changes the equation
|
||||
- **Non-ideological approach**: Applies regardless of political commitments
|
||||
- **Actionable insights**: Points toward concrete architectural principles
|
||||
|
||||
For the first time, the physics of political organization can change.
|
||||
|
||||
</div>
|
||||
237
content/about/index.md
Normal file
@@ -0,0 +1,237 @@
|
||||
---
|
||||
title: "About Civil Dynamics"
|
||||
description: "Understanding the universal architecture of political power"
|
||||
showTableOfContents: true
|
||||
---
|
||||
|
||||
## Introduction
|
||||
|
||||
Civil Dynamics is a structural framework for understanding the universal architecture of political power and its implications for civil society. At its core, it identifies a consistent geometric pattern that appears across all complex societies: a three-vertex pyramid combining **state power**, **moral authority**, and **commercial power**, organized hierarchically from masses to elites.
|
||||
|
||||
This framework goes beyond traditional political analysis by treating power not as an ideological phenomenon but as a structural one—an emergent pattern arising from fundamental coordination constraints in human societies. More importantly, it explores how accessible, sovereign artificial intelligence might represent the first genuine opportunity in history to fundamentally alter this geometry.
|
||||
|
||||
## The Universal Political Structure
|
||||
|
||||
### The Three Vertices
|
||||
|
||||
Every complex society operates through three irreducible forms of power:
|
||||
|
||||
1. **State Power**: Formal violence, lawmaking, enforcement, bureaucracy
|
||||
2. **Moral Power**: Religion, ideology, identity, normative authority, legitimacy
|
||||
3. **Commercial Power**: Resource allocation, capital flows, incentives, markets
|
||||
|
||||
These are not optional features that vary by culture or ideology—they are structural roles that every political system must fill. What changes across societies is the *content* that fills each vertex (which religion, which ideology, which economic system), not whether the vertex exists.
|
||||
|
||||
### The Hierarchical Dimension
|
||||
|
||||
These three vertices support a vertical axis:
|
||||
- **Bottom**: The masses
|
||||
- **Apex**: Consolidated elites who coordinate across all three vertices
|
||||
|
||||
This pyramid shape is not accidental—it emerges as the equilibrium solution to large-scale coordination challenges. Each power domain solves a non-substitutable function:
|
||||
- State → enforces order
|
||||
- Moral → legitimizes order
|
||||
- Commercial → provisions and allocates resources
|
||||
|
||||
### Purity Dynamics
|
||||
|
||||
A critical feature of this structure is **purity**—the degree of conformity to the system's normative ideal. Every system enforces purity tests to maintain in-group/out-group boundaries, whether through:
|
||||
- Religious orthodoxy (theocracies)
|
||||
- Ideological compliance (communist regimes, fascist states)
|
||||
- Constitutional adherence (liberal democracies)
|
||||
- Corporate culture fit (institutional settings)
|
||||
- Ethnic or national identity (ethno-nationalist regimes)
|
||||
|
||||
Purity is not about the specific content of beliefs—it's a structural requirement for system coherence, serving as the membrane that keeps the pyramid stable.
|
||||
|
||||
## The Structural Threat to Civil Society
|
||||
|
||||
Civil society thrives on:
|
||||
- Horizontal relationships
|
||||
- Distributed legitimacy
|
||||
- Pluralism
|
||||
- Voluntary association
|
||||
- Norms that limit coercion
|
||||
|
||||
The tri-vertex pyramid systematically undermines all of these because:
|
||||
|
||||
1. **Moral power demands purity**: Creates totalizing in/out boundaries that corrode pluralism
|
||||
2. **State power enforces alignment**: When fused with moral authority, dissent becomes deviance
|
||||
3. **Commercial power amplifies narratives**: Capital and media accelerate moral-political fusion
|
||||
4. **Hierarchy makes dissent costly**: Elite consolidation at the apex punishes challenges to the structure itself
|
||||
|
||||
This dynamic—not any specific ideology—is fundamentally corrosive to civil society. The structure itself generates:
|
||||
- Polarization
|
||||
- Ideological capture
|
||||
- Moral authoritarianism
|
||||
- Weak civic trust
|
||||
- Elite manipulation
|
||||
- Us-them dynamics
|
||||
- Instability under stress
|
||||
|
||||
### Examples Across Systems
|
||||
|
||||
In the United States, Christian nationalism represents one sharp manifestation of this structure—the fusion of religious moral authority with state power and commercial backing. But the same structural dynamics appear in:
|
||||
- Marxist-Leninist regimes (ideological purity enforced by party-state)
|
||||
- Corporate capture (business values fused with governance)
|
||||
- Technocratic systems (expert consensus as moral authority)
|
||||
- Progressive movements (moral righteousness backed by institutional power)
|
||||
|
||||
Different content, same skeleton.
|
||||
|
||||
## Historical Resilience of the Pyramid
|
||||
|
||||
Throughout history, attempts to invert, weaken, or dissolve this structure have been temporary and unstable:
|
||||
|
||||
- **Late Roman Republic**: Hierarchy inverted temporarily, then reconsolidated under Augustus
|
||||
- **Early Medieval Europe**: Dissolution into localism, followed by gradual reformation
|
||||
- **Classical Athens**: Weak hierarchy that collapsed under external pressure
|
||||
- **Reformation Era**: Moral vertex fragmented, leading to conflict resolved by strengthening state sovereignty
|
||||
- **Pirate Republics**: Flat hierarchies that proved unsustainable
|
||||
- **Paris Commune**: Radical bottom-up power lasting only two months
|
||||
- **Early Soviet Russia**: Commercial vertex eliminated but re-emerged informally
|
||||
- **Modern experiments** (Rojava, Zapatista regions): Struggle to scale beyond local contexts
|
||||
|
||||
The consistent lesson: when one vertex collapses or hierarchy flattens, the structure regenerates. The pyramid persists because it solves deep coordination problems and aligns with human tendencies toward hierarchy and meaning-making.
|
||||
|
||||
## Why Alternative Geometries Have Failed
|
||||
|
||||
The tri-vertex pyramid keeps reappearing because:
|
||||
|
||||
1. **Coordination at scale requires some hierarchy**: Decision-making, conflict resolution, and priority-setting become exponentially harder without it
|
||||
2. **Humans naturally form status hierarchies**: Social organization gravitates toward stratification
|
||||
3. **Societies require shared narratives**: No complex society survives without common normative frameworks
|
||||
4. **Resource allocation demands structure**: Material flows need organizational coordination
|
||||
5. **External threats push centralization**: Crises favor unified command structures
|
||||
6. **Elite incentives align structurally**: Those controlling different vertices benefit from fusion at the apex
|
||||
|
||||
## The AI Inflection Point
|
||||
|
||||
### Why Now Is Different
|
||||
|
||||
Accessible, sovereign artificial intelligence represents the first technological shift in centuries that could actually deform the political geometry. It affects all three vertices in ways that undercut their traditional foundations.
|
||||
|
||||
For the first time in history, we can plausibly separate **governance** (the processes by which groups coordinate, resolve conflicts, and make decisions) from **rule** (centralized enforcement by hierarchical authority). This separation was previously impossible because:
|
||||
- Cognition was scarce
|
||||
- Coordination was expensive
|
||||
- Information was asymmetric
|
||||
- Administrative capacity required large bureaucracies
|
||||
- Narrative production was controlled by elites
|
||||
|
||||
AI changes all of these constraints.
|
||||
|
||||
### How AI Transforms Each Vertex
|
||||
|
||||
**State Power**:
|
||||
- AI can perform bureaucratic functions (processing, classification, logistics, tracking) outside centralized state structures
|
||||
- Local governments, cooperatives, and civil associations can match nation-state administrative competence
|
||||
- The structural indispensability of centralized bureaucracy declines
|
||||
|
||||
**Moral Power**:
|
||||
- Competing moral frames can be generated, maintained, and iterated at speed
|
||||
- Minority worldviews can defend themselves with sophisticated rhetorical and analytical tools
|
||||
- Purity enforcement becomes contested by adaptive counter-narratives
|
||||
- Moral authority fragments into self-sustaining pluralism
|
||||
|
||||
**Commercial Power**:
|
||||
- Capital concentration no longer buys narrative control
|
||||
- Small entities gain analysis previously reserved for corporate giants
|
||||
- AI enables lateral market coordination: peer-to-peer contracting, federated supply chains, decentralized planning
|
||||
- Giant firms lose coordination advantages
|
||||
|
||||
### The Critical Condition
|
||||
|
||||
Centralized AI reverses all potential gains:
|
||||
- Perfects surveillance
|
||||
- Unifies moral narratives
|
||||
- Enhances elite coordination
|
||||
- Optimizes purity dynamics
|
||||
- Becomes a fourth super-vertex above the others
|
||||
|
||||
**The decisive factor is not capability but architecture.** Accessible, sovereign AI softens the pyramid; centralized AI hardens it into something sharper than anything in history.
|
||||
|
||||
## Governance Without Rule: A Minimal Structure
|
||||
|
||||
Assuming distributed intelligence, governance without rule requires only:
|
||||
|
||||
1. **Local decision nodes**: Autonomous units (neighborhoods, cooperatives, associations) with local AI tools and legitimacy
|
||||
2. **Shared negotiation protocols**: Open standards enabling horizontal coordination without hierarchy
|
||||
3. **Distributed AI mediation**: Systems that simulate outcomes, detect conflicts, translate across frameworks, and optimize joint resource use
|
||||
4. **Polycentric adjudication**: Voluntary, overlapping arbitration networks without enforcement monopolies
|
||||
5. **Modular economic commons**: Transparent, protocol-governed resource allocation systems
|
||||
6. **Moral pluralism**: Multiple co-equal moral frameworks with AI-assisted translation between them
|
||||
7. **Federated safety nets**: Distributed, multi-key crisis response capabilities with strict temporal and scope limits
|
||||
|
||||
This minimal structure enables coordination without command, justice without monopoly, allocation without domination, and protection without rulers.
|
||||
|
||||
### Key Design Principles
|
||||
|
||||
- **Sharded capabilities**: No node controls significant force alone
|
||||
- **Multi-key activation**: Major actions require cross-cutting coalitions
|
||||
- **Time-boxed mandates**: Emergency powers auto-expire
|
||||
- **Radical transparency**: All major uses logged and auditable
|
||||
- **Voluntary participation**: Liquid membership prevents authoritarian consolidation
|
||||
- **Cross-cutting networks**: Overlapping memberships prevent stable bloc formation
|
||||
|
||||
## The Path Forward: Bottom-Up Emergence
|
||||
|
||||
The only viable pathway to governance-without-rule is **organic, voluntary substitution**—not revolution or top-down redesign.
|
||||
|
||||
### Why Bottom-Up?
|
||||
|
||||
Direct attempts to dismantle rule-structures trigger:
|
||||
- Defensive consolidation
|
||||
- Moral panic
|
||||
- Elite closure
|
||||
- Legitimacy crises
|
||||
- Loss of coordination capacity
|
||||
|
||||
Bottom-up emergence works because:
|
||||
- It grows within existing structures
|
||||
- Demonstrates value incrementally
|
||||
- Scales by replication, not confrontation
|
||||
- Doesn't require initial legitimacy fights
|
||||
- Creates no power vacuum
|
||||
|
||||
### The Substitution Dynamic
|
||||
|
||||
As distributed governance tools become more effective:
|
||||
1. People choose alternative coordination because it works better
|
||||
2. Legacy rule-structures lose functional centrality
|
||||
3. They become ceremonial, redundant, or specialized fallbacks
|
||||
4. The pyramid dissolves by **atrophy**, not destruction
|
||||
|
||||
This is not rebellion—it's systemic evolution. Like markets gradually displacing feudalism, distributed governance would surround hierarchical authority with more useful structures.
|
||||
|
||||
## What Makes This Framework Unique
|
||||
|
||||
1. **Structural universalism**: Identifies invariant patterns across all political systems
|
||||
2. **Geometric formalism**: Uses spatial metaphors as analytical tools, not just rhetoric
|
||||
3. **Anthropological realism**: Acknowledges deep constraints without cynicism
|
||||
4. **Technological specificity**: Identifies why AI specifically changes the equation
|
||||
5. **Non-ideological**: Applies regardless of one's political commitments
|
||||
6. **Actionable**: Points toward concrete architectural principles
|
||||
7. **Evolutionary**: Emphasizes gradual transformation over revolutionary rupture
|
||||
|
||||
## Core Concepts at a Glance
|
||||
|
||||
- **The Pyramid**: Universal tri-vertex (state/moral/commercial) hierarchical structure
|
||||
- **Purity**: Boundary-maintenance mechanism that stabilizes hierarchy
|
||||
- **Civil Society**: Horizontal, pluralistic relationships undermined by pyramid structure
|
||||
- **Governance vs. Rule**: Coordination vs. centralized command
|
||||
- **Distributed Intelligence**: AI enabling coordination without hierarchy
|
||||
- **Bottom-Up Emergence**: Voluntary substitution as the only stable transformation path
|
||||
- **Accessible AI**: Technology that collapses cognitive scarcity and enables new political geometries
|
||||
- **Federated Structure**: Minimal architecture for governance without rule
|
||||
|
||||
## Conclusion
|
||||
|
||||
The tri-vertex political pyramid—state, moral, commercial—is a universal attractor in human societies because it solves deep coordination challenges and aligns with human tendencies toward hierarchy and meaning-making. This structure is intrinsically corrosive to civil society, which requires distributed legitimacy and plural moral spaces.
|
||||
|
||||
Historically, no society has escaped the pyramid for long. But accessible, sovereign AI is a generational anomaly: a tool that dissolves informational asymmetry, decentralizes coordination, weakens moral monopolies, and flattens economic and administrative power.
|
||||
|
||||
**For the first time, the physics of political organization can change.**
|
||||
|
||||
The opportunity is real. So is the danger. Whether AI softens the pyramid or crystallizes it further depends entirely on whether it remains accessible, sovereign, decentralized, and plural—or becomes centralized, opaque, and fused with existing power vertices.
|
||||
|
||||
This is not utopian speculation. It's structural analysis of the first moment in history where governance can plausibly separate from rule, where coordination need not collapse into command, and where civil society might finally escape the gravitational pull of the hierarchical pyramid.
|
||||
65
definition.example.yml
Normal file
@@ -0,0 +1,65 @@
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: civildynamicsorg
|
||||
annotations:
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
||||
traefik.ingress.kubernetes.io/router.tls: "true"
|
||||
cert-manager.io/cluster-issuer: k3s-ca-cluster-issuer
|
||||
spec:
|
||||
tls:
|
||||
- hosts:
|
||||
- civilsociety.dev
|
||||
secretName: k3s-ca-civildynamicsorg-tls
|
||||
rules:
|
||||
- host: "civildynamics.org"
|
||||
http:
|
||||
paths:
|
||||
- pathType: Prefix
|
||||
path: /
|
||||
backend:
|
||||
service:
|
||||
name: civildynamicsdev-service
|
||||
port:
|
||||
name: http
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: civildynamicsdev-service
|
||||
spec:
|
||||
ports:
|
||||
- port: 80
|
||||
protocol: TCP
|
||||
selector:
|
||||
app: civildynamicsdev
|
||||
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: civildynamicsdev-nginx
|
||||
labels:
|
||||
app: civildynamicsdev
|
||||
version: v1
|
||||
tier: backend
|
||||
environment: production
|
||||
owner: payneio
|
||||
app.kubernetes.io/instance: civildynamicsdev
|
||||
app.kubernetes.io/managed-by: kubectl
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: civildynamicsdev
|
||||
replicas: 2
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: civildynamicsdev
|
||||
spec:
|
||||
containers:
|
||||
- name: civildynamicsdev
|
||||
image: payneio/civildynamics.org:latest
|
||||
ports:
|
||||
- containerPort: 80
|
||||
8
layouts/_shortcodes/button.html
Normal file
@@ -0,0 +1,8 @@
|
||||
<a
|
||||
class="!rounded-lg bg-primary-600 px-4 py-2 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700"
|
||||
{{ with .Get "href" }}href="{{ . }}"{{ end }}
|
||||
{{ with .Get "target" }}target="{{ . }}"{{ end }}
|
||||
{{ with .Get "rel" }}rel="{{ . }}"{{ end }}
|
||||
role="button">
|
||||
{{ .Inner }}
|
||||
</a>
|
||||
3
layouts/_shortcodes/div.html
Normal file
@@ -0,0 +1,3 @@
|
||||
<div class="{{ .Get "class" }}">
|
||||
{{ .Inner }}
|
||||
</div>
|
||||
8
layouts/_shortcodes/more.html
Normal file
@@ -0,0 +1,8 @@
|
||||
<div class="flex cursor-pointer justify-end -mt-4">
|
||||
<a
|
||||
href="{{ .Params.href }}"
|
||||
class="rounded-lg border border-primary-400 px-2 py-[1px] text-s text-primary-700 dark:border-primary-600 dark:text-primary-400 hover:bg-primary-100 dark:hover:bg-primary-800 transition-colors duration-200 hover:rounded-lg"
|
||||
>
|
||||
Read more
|
||||
</a>
|
||||
</div>
|
||||
14
layouts/home.html
Normal file
@@ -0,0 +1,14 @@
|
||||
{{ define "main" }}
|
||||
<article class="h-full max-w-full flex flex-col items-center justify-center">
|
||||
<section class="mt-6">
|
||||
{{ .Content }}
|
||||
</section>
|
||||
<section>
|
||||
{{ partial "recent-articles/main.html" . }}
|
||||
</section>
|
||||
<footer class="pt-8">
|
||||
</footer>
|
||||
</article>
|
||||
{{ end }}
|
||||
|
||||
|
||||
9
package.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"name": "civildynamics.org",
|
||||
"version": "2.87.0",
|
||||
"description": "CivilDynamics.org website.",
|
||||
"scripts": {
|
||||
"dev": "NODE_ENV=development npx ./themes/blowfish/node_modules/@tailwindcss/cli -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": "NODE_ENV=production npx ./themes/blowfish/node_modules/@tailwindcss/cli -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
}
|
||||
}
|
||||
18
scripts/deploy.sh
Executable file
@@ -0,0 +1,18 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Build the TailwindCSS assets
|
||||
npm run build
|
||||
|
||||
# Build the site
|
||||
hugo build
|
||||
|
||||
# Build and push the Docker image
|
||||
docker build -t payneio/civildynamics.org . --file ./Dockerfile
|
||||
docker push payneio/civildynamics.org
|
||||
|
||||
# Deploy to Kubernetes
|
||||
|
||||
# First time...
|
||||
# bin/wild-app-deploy civildynamics
|
||||
|
||||
kubectl rollout restart deployment civildynamics -n civildynamics
|
||||
BIN
static/android-chrome-192x192.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
static/android-chrome-512x512.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
static/apple-touch-icon.png
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
BIN
static/favicon-16x16.png
Normal file
|
After Width: | Height: | Size: 545 B |
BIN
static/favicon-32x32.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
static/favicon.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
static/fonts/LinLibertine_DR.ttf
Normal file
BIN
static/fonts/LinLibertine_I.ttf
Normal file
BIN
static/fonts/LinLibertine_R.ttf
Normal file
BIN
static/fonts/LinLibertine_RB.ttf
Normal file
BIN
static/fonts/LinLibertine_RBI.ttf
Normal file
BIN
static/fonts/LinLibertine_RI.ttf
Normal file
BIN
static/fonts/LinLibertine_RZ.ttf
Normal file
BIN
static/fonts/LinLibertine_RZI.ttf
Normal file
BIN
static/fonts/LinLibertine_aBL.ttf
Normal file
BIN
static/fonts/LinLibertine_aBS.ttf
Normal file
BIN
static/fonts/LinLibertine_aDRS.ttf
Normal file
BIN
static/fonts/LinLibertine_aRL.ttf
Normal file
BIN
static/fonts/LinLibertine_aS.ttf
Normal file
BIN
static/fonts/LinLibertine_aSI.ttf
Normal file
BIN
static/fonts/LinLibertine_aSZI.ttf
Normal file
BIN
static/fonts/LinLibertine_aZL.ttf
Normal file
BIN
static/fonts/OpenSans-Bold.ttf
Normal file
BIN
static/fonts/OpenSans-BoldItalic.ttf
Normal file
BIN
static/fonts/OpenSans-ExtraBold.ttf
Normal file
BIN
static/fonts/OpenSans-ExtraBoldItalic.ttf
Normal file
BIN
static/fonts/OpenSans-Italic.ttf
Normal file
BIN
static/fonts/OpenSans-Light.ttf
Normal file
BIN
static/fonts/OpenSans-LightItalic.ttf
Normal file
BIN
static/fonts/OpenSans-Medium.ttf
Normal file
BIN
static/fonts/OpenSans-MediumItalic.ttf
Normal file
BIN
static/fonts/OpenSans-Regular.ttf
Normal file
BIN
static/fonts/OpenSans-SemiBold.ttf
Normal file
BIN
static/fonts/OpenSans-SemiBoldItalic.ttf
Normal file
BIN
static/fonts/OpenSans_Condensed-Bold.ttf
Normal file
BIN
static/fonts/OpenSans_Condensed-BoldItalic.ttf
Normal file
BIN
static/fonts/OpenSans_Condensed-ExtraBold.ttf
Normal file
BIN
static/fonts/OpenSans_Condensed-ExtraBoldItalic.ttf
Normal file
BIN
static/fonts/OpenSans_Condensed-Italic.ttf
Normal file
BIN
static/fonts/OpenSans_Condensed-Light.ttf
Normal file
BIN
static/fonts/OpenSans_Condensed-LightItalic.ttf
Normal file
BIN
static/fonts/OpenSans_Condensed-Medium.ttf
Normal file
BIN
static/fonts/OpenSans_Condensed-MediumItalic.ttf
Normal file
BIN
static/fonts/OpenSans_Condensed-Regular.ttf
Normal file
BIN
static/fonts/OpenSans_Condensed-SemiBold.ttf
Normal file
BIN
static/fonts/OpenSans_Condensed-SemiBoldItalic.ttf
Normal file
BIN
static/fonts/OpenSans_SemiCondensed-Bold.ttf
Normal file
BIN
static/fonts/OpenSans_SemiCondensed-BoldItalic.ttf
Normal file
BIN
static/fonts/OpenSans_SemiCondensed-ExtraBold.ttf
Normal file
BIN
static/fonts/OpenSans_SemiCondensed-ExtraBoldItalic.ttf
Normal file
BIN
static/fonts/OpenSans_SemiCondensed-Italic.ttf
Normal file
BIN
static/fonts/OpenSans_SemiCondensed-Light.ttf
Normal file
BIN
static/fonts/OpenSans_SemiCondensed-LightItalic.ttf
Normal file
BIN
static/fonts/OpenSans_SemiCondensed-Medium.ttf
Normal file
BIN
static/fonts/OpenSans_SemiCondensed-MediumItalic.ttf
Normal file
BIN
static/fonts/OpenSans_SemiCondensed-Regular.ttf
Normal file
BIN
static/fonts/OpenSans_SemiCondensed-SemiBold.ttf
Normal file
BIN
static/fonts/OpenSans_SemiCondensed-SemiBoldItalic.ttf
Normal file
1
static/site.webmanifest
Normal file
@@ -0,0 +1 @@
|
||||
{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
|
||||
10
themes/blowfish/.editorconfig
Normal file
@@ -0,0 +1,10 @@
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
35
themes/blowfish/.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Desktop (please complete the following information):**
|
||||
- OS: [e.g. iOS]
|
||||
- Browser [e.g. chrome, safari]
|
||||
- Version [e.g. 22]
|
||||
|
||||
**Hugo & Blowfish versions**
|
||||
Which version of Hugo and Blowfish are you using?
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
20
themes/blowfish/.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
7
themes/blowfish/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
## Describe your changes
|
||||
|
||||
## Issue ticket number and link
|
||||
|
||||
## Checklist before requesting a review
|
||||
- [ ] I have performed a self-review of my code
|
||||
- [ ] Will this be part of a product update? If yes, please write one phrase about this update.
|
||||
25
themes/blowfish/.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
# To get started with Dependabot version updates, you'll need to specify which
|
||||
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/"
|
||||
target-branch: "dev"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
day: "wednesday"
|
||||
commit-message:
|
||||
prefix: "📌"
|
||||
labels:
|
||||
- "dependencies"
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
target-branch: "dev"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
day: "wednesday"
|
||||
commit-message:
|
||||
prefix: "👷"
|
||||
labels:
|
||||
- "dependencies"
|
||||
54
themes/blowfish/.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
name: Build Theme
|
||||
|
||||
on: [pull_request_target]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.actor == 'dependabot[bot]' }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: "${{ github.head_ref }}"
|
||||
- name: Install dependencies and Build Theme
|
||||
uses: actions/setup-node@v4
|
||||
- run: npm install
|
||||
- run: npm run assets
|
||||
- name: Commit and push Chart.js changes
|
||||
uses: stefanzweifel/git-auto-commit-action@v6
|
||||
with:
|
||||
branch: "${{ github.head_ref }}"
|
||||
push_options: "--dry-run"
|
||||
file_pattern: "assets/lib/chart/*"
|
||||
commit_message: "📦 Update packaged ChartJS"
|
||||
- name: Commit Fuse changes
|
||||
uses: stefanzweifel/git-auto-commit-action@v6
|
||||
with:
|
||||
branch: "${{ github.head_ref }}"
|
||||
push_options: "--dry-run"
|
||||
file_pattern: "assets/lib/fuse/*"
|
||||
commit_message: "📦 Update packaged FuseJS"
|
||||
- name: Commit KaTeX changes
|
||||
uses: stefanzweifel/git-auto-commit-action@v6
|
||||
with:
|
||||
branch: "${{ github.head_ref }}"
|
||||
push_options: "--dry-run"
|
||||
file_pattern: "assets/lib/katex/*"
|
||||
commit_message: "📦 Update packaged KaTeX"
|
||||
- name: Commit Mermaid changes
|
||||
uses: stefanzweifel/git-auto-commit-action@v6
|
||||
with:
|
||||
branch: "${{ github.head_ref }}"
|
||||
push_options: "--dry-run"
|
||||
file_pattern: "assets/lib/mermaid/*"
|
||||
commit_message: "📦 Update packaged Mermaid"
|
||||
- run: npm run build
|
||||
- name: Commit CSS changes
|
||||
uses: stefanzweifel/git-auto-commit-action@v6
|
||||
with:
|
||||
branch: "${{ github.head_ref }}"
|
||||
push_options: "--dry-run"
|
||||
file_pattern: "assets/css/compiled/main.css"
|
||||
commit_message: "💄 Rebuild CSS"
|
||||
- run: git push
|
||||
21
themes/blowfish/.github/workflows/create-config-zip.yml
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
name: Create ZIP
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
zip:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- run: zip -r config-default.zip config/_default
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: config-default
|
||||
path: config-default.zip
|
||||
- name: Upload to release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
files: config-default.zip
|
||||
tag_name: ${{ github.event.release.tag_name }}
|
||||
16
themes/blowfish/.github/workflows/greetings.yml
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
name: Greetings
|
||||
|
||||
on: [pull_request_target, issues]
|
||||
|
||||
jobs:
|
||||
greeting:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/first-interaction@v1
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
issue-message: "Thanks for contributing to Blowfish"
|
||||
pr-message: "Thanks for contributing to Blowfish"
|
||||
54
themes/blowfish/.github/workflows/hugo-version-update.yml
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
name: Update Hugo version
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 6 * * *"
|
||||
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
updateBlowfish:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out code into the Go module directory
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: dev
|
||||
submodules: true # Fetch Hugo themes (true OR recursive)
|
||||
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
|
||||
|
||||
- name: Fetch release version
|
||||
id: fetch-release
|
||||
run: |
|
||||
curl -sL https://api.github.com/repos/gohugoio/hugo/releases/latest | \
|
||||
jq -r ".tag_name" > release-versions/hugo-latest.txt
|
||||
|
||||
- name: Check for modified files
|
||||
id: git-check
|
||||
run:
|
||||
echo ::set-output name=modified::$([ -z "`git status --porcelain`" ]
|
||||
&& echo "false" || echo "true")
|
||||
|
||||
- name: Update config.toml
|
||||
id: update-config
|
||||
if: steps.git-check.outputs.modified == 'true'
|
||||
run: |
|
||||
cat release-versions/hugo-latest.txt | \
|
||||
while read version; do sed -i'' -E "s/(max = \")[0-9]+\.[0-9]+\.[0-9]+(\")/\1${version#v}\2/g" config.toml; done
|
||||
|
||||
- name: Create Pull Request
|
||||
if: steps.git-check.outputs.modified == 'true'
|
||||
uses: peter-evans/create-pull-request@v7
|
||||
with:
|
||||
commit-message: Update Hugo supported version
|
||||
title: ⚙️ Update Hugo supported version
|
||||
body: |
|
||||
Updates [Hugo][1] support
|
||||
|
||||
Auto-generated by [create-pull-request][2]
|
||||
|
||||
[1]: https://github.com/gohugoio/hugo
|
||||
[2]: https://github.com/peter-evans/create-pull-request
|
||||
labels: dependencies, automated pr
|
||||
branch: hugo-new-version
|
||||
base: dev
|
||||
68
themes/blowfish/.github/workflows/pages.yml
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
# Sample workflow for building and deploying a Hugo site to GitHub Pages
|
||||
name: Blowfish Docs Deploy
|
||||
|
||||
on:
|
||||
# Runs on pushes targeting the default branch
|
||||
push:
|
||||
branches: ["main"]
|
||||
|
||||
# Allows you to run this workflow manually from the Actions tab
|
||||
workflow_dispatch:
|
||||
|
||||
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
|
||||
permissions:
|
||||
contents: read
|
||||
pages: write
|
||||
id-token: write
|
||||
|
||||
# Allow one concurrent deployment
|
||||
concurrency:
|
||||
group: "pages"
|
||||
cancel-in-progress: true
|
||||
|
||||
# Default to bash
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
jobs:
|
||||
# Build job
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
HUGO_VERSION: 0.102.3
|
||||
steps:
|
||||
- name: Install Hugo CLI
|
||||
run: |
|
||||
wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_Linux-64bit.deb \
|
||||
&& sudo dpkg -i ${{ runner.temp }}/hugo.deb
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Setup Pages
|
||||
id: pages
|
||||
uses: actions/configure-pages@v5
|
||||
- name: Build with Hugo
|
||||
env:
|
||||
# For maximum backward compatibility with Hugo modules
|
||||
HUGO_ENVIRONMENT: production
|
||||
HUGO_ENV: production
|
||||
run: |
|
||||
hugo --minify -s exampleSite --themesDir ../.. -d ../docs --baseURL https://nunocoracao.github.io/blowfish/
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v3
|
||||
with:
|
||||
path: ./docs
|
||||
|
||||
# Deployment job
|
||||
deploy:
|
||||
environment:
|
||||
name: github-pages
|
||||
url: https://nunocoracao.github.io/blowfish/
|
||||
runs-on: ubuntu-latest
|
||||
needs: build
|
||||
steps:
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v4
|
||||
34
themes/blowfish/.github/workflows/stale.yml
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
# This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time.
|
||||
#
|
||||
# You can adjust the behavior by modifying this file.
|
||||
# For more information, see:
|
||||
# https://github.com/actions/stale
|
||||
name: Mark stale issues and pull requests
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 1 * * *"
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- uses: actions/stale@v9
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
stale-issue-message:
|
||||
"This issue will be closed since it has been stale for 60 days."
|
||||
stale-pr-message:
|
||||
"This pull request will be closed since it has been stale for 60
|
||||
days."
|
||||
stale-issue-label: "no-issue-activity"
|
||||
stale-pr-label: "no-pr-activity"
|
||||
days-before-stale: 60
|
||||
days-before-close: 0
|
||||
remove-stale-when-updated: true
|
||||
operations-per-run: 100
|
||||
27
themes/blowfish/.github/workflows/test.yml
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
name: Test Build
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build Example Site
|
||||
runs-on: ubuntu-latest
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Hugo
|
||||
uses: peaceiris/actions-hugo@v3.0.0
|
||||
with:
|
||||
hugo-version: "latest"
|
||||
|
||||
- name: Build
|
||||
working-directory: ./exampleSite
|
||||
run:
|
||||
hugo --minify --themesDir ../.. --baseURL
|
||||
https://nunocoracao.github.io/blowfish/
|
||||
34
themes/blowfish/.gitignore
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
# Hugo and Blowfish
|
||||
public/
|
||||
resources/
|
||||
exampleSite/resources/
|
||||
|
||||
# Binaries for programs and plugins
|
||||
*.exe
|
||||
*.exe~
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
|
||||
# Test binary, built with `go test -c`
|
||||
*.test
|
||||
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||
*.out
|
||||
|
||||
# Dependency directories (remove the comment below to include it)
|
||||
# vendor/
|
||||
|
||||
#others
|
||||
node_modules
|
||||
.hugo_build.lock
|
||||
|
||||
# OS generated files
|
||||
.DS_Store
|
||||
.DS_Store?
|
||||
._*
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
.idea
|
||||
.Ulysses-Group.plist
|
||||
.Ulysses-Settings.plist
|
||||
35
themes/blowfish/.prettierignore
Normal file
@@ -0,0 +1,35 @@
|
||||
# https://github.com/gohugoio/hugo/blob/b39b24962350090122b5f3927456dde710cffb57/docs/.prettierignore
|
||||
# https://github.com/gohugoio/hugo/blob/b39b24962350090122b5f3927456dde710cffb57/docs/.prettierrc
|
||||
|
||||
# develop
|
||||
.vscode
|
||||
node_modules
|
||||
package.json
|
||||
|
||||
# Hugo
|
||||
assets/lib
|
||||
assets/css/compiled
|
||||
content
|
||||
themes
|
||||
public
|
||||
static
|
||||
*.md
|
||||
|
||||
# Invalid nodes and unexpected tokens, mostly caused by unmatched tags in Hugo statements.
|
||||
# For example:
|
||||
# {{ with .Params.externalUrl }}
|
||||
# <a href="{{ . }}">
|
||||
# {{ else }}
|
||||
# <a href="{{ .RelPermalink }}" class="min-w-full">
|
||||
# {{ end }}
|
||||
#
|
||||
# This create an unclose node
|
||||
|
||||
layouts/_default/_markup/render-heading.html
|
||||
layouts/_default/index.json
|
||||
layouts/_default/list.html
|
||||
layouts/shortcodes/screenshot.html
|
||||
layouts/shortcodes/figure.html
|
||||
layouts/partials/hugo-embedded/shortcodes/figure-default.html
|
||||
|
||||
assets/js/appearance.js
|
||||